formRemote não realiza update no render
28/09/2012 19:54
0
Pesssoal,

Tenho o seguinte formRemote:


<g:formRemote url="[controller:'j_spring_security_check', action:'']"
class="dropdown-menu pull-right" name="loginForm" update="header">


dentro de um template chamado _header.gsp e no gsp chamdo dessa forma:

<div id="header">
<g:render template="/templatesPadrao/header" model="['searchbarAtivo':true]"/>
</div>


O problema é apresentado quando o usuário preenche o form e submete, pois a variavel searchbarAtivo fica vazia, mesmo forçando um valor para mesma.

Alguem sabe como posso pegar essa variavel no retorno do processamento do formRemote?

obrigado,

derytu764
Tags: formRemote, render, model


0
Oi Daniel, está usando alguma versão posterior à 2.0?

Eu já observei este problema também: no Grails 1.3.x e anterior, quando algo dava errado do lado servidor, o erro era renderizado na página: agora não mais. É um ponto bastante negativo nestas versões mais novas, e ainda não encontrei uma solução para o problema.


0
Estou usando a versão 2.1.0, migrando para a 2.1.1

Tenho duas soluções feias para resolver esse problema, sendo a primeira guardar o estado da searchbar na sessão e a segunda submeter um campo hidden com o valor da searchbar, mas vou ter que modificar o plugin pra receber esse cara.

Ja tentei dar refresh na página atravez do onSuccess do formRemote, mas dai ele perde as validações que estão na request.error.

Vou ter que encontrar uma solução para esse problema, isso afeta completamente minha aplicação.

vlw pela informacao kiko



29/09/2012 22:33


0
Kiko, quando eu tento dar um redirect para outra página a partir do controller do formRemote ele sobrepoe a página atual com a do redirect e não muda a URL.

Segue o código:

def authfail = {

def username = session[UsernamePasswordAuthenticationFilter.SPRING_SECURITY_LAST_USERNAME_KEY]
String msg = ''
def exception = session[WebAttributes.AUTHENTICATION_EXCEPTION]
if (exception) {
if (exception instanceof AccountExpiredException) {
msg = g.message(code: "springSecurity.errors.login.expired")
}
else if (exception instanceof CredentialsExpiredException) {
msg = g.message(code: "springSecurity.errors.login.passwordExpired")
}
else if (exception instanceof DisabledException) {
msg = g.message(code: "springSecurity.errors.login.disabled")
}
else if (exception instanceof LockedException) {
msg = g.message(code: "springSecurity.errors.login.locked")
}
else {
msg = g.message(code: "springSecurity.errors.login.fail")
}
}

if (springSecurityService.isAjax(request)) {
redirect action: 'auth', params: params
return
}
else {
flash.message = msg
redirect action: 'auth', params: params
}
}


def auth = {

def config = SpringSecurityUtils.securityConfig

if (springSecurityService.isLoggedIn()) {
redirect uri: config.successHandler.defaultTargetUrl
return
}

String view = 'auth'
String postUrl = "${request.contextPath}${config.apf.filterProcessesUrl}"
render view: view, model: [postUrl: postUrl,
rememberMeParameter: config.rememberMe.parameter]
}


Como posso redirecionar uma página a partir do formRemote?
30/09/2012 14:28


0
Oi Daniel, o formRemote não faz redirecionamento de páginas, pois seu funcionamento consiste em fazer uma requisição assíncrona ao servidor e, em seguida, a partir do valor retornado, renderizar este conteúdo dentro de algum elemento do HTML.

Para redirecionamentos, você tem duas opções então: ou fica com o formulário html convencional (sem ajax) ou pode fazer a gambiarra abaixo que, sinceramente, não sei se recomendaria.

Esta consistiria em incluir um evento onSuccess ou onFailure Javascript que fizesse o redirecionamento para você modificando a URL da janela do navegador. Mas neste caso, eu não sei qual seria a vantagem de fazer o redirecionamento a partir do Ajax, né?


0
Bom saber kiko, isso foi muito util.

O que eu gostaria de fazer é:

Permitir que o usuário log em qualquer página do sistema.

Se ele fornecer os dados corretos, eu dou um refresh na página.

O refresh é necessário, pois todas as páginas do sistema permitem login, porem algumas delas so podem ser acessadas quando o usuário não esta loggado, tais como a página de cadastro. Dessa maneira preciso dar refresh para verificar se @Secured(["hasRole('ROLE_ANONYMOUS')"]).


Caso contrário, eu redireciono o usuário para a página de Login, juntamente com os erros detectados na validação.

O problema de usar o g:form comum mora justamente no retornar para a página atual, pois o spring security plugin obriga você redirecionar o usuário para uma página fixa apos o login. Ja o formRemote retorna para a página de origem, mas durante o refresh, ele perde o
request.error retornado pelo controller de autenticação.

Sem contar uma coisa Kiko, se eu não dou refresh, caso eu use o update do formRemote somente, ele não garante a atualização dos elementos da página em si.

Exemplo:
Eu tenho um botão de "Cadastre grátis" na página inicial do sistema, que deve ser visto quando o usuário esta des-loggado, porem caso estiver loggado, não deve ser apresentado.

Nesse caso eu teriea que dar update na página inteira e não somente no header do sistema, isso poderia gerar uma outra série de complicações... sendo assim, o refresh se torna mais comodo.

Eu ja mandei essa pergunta no mailing list, ja olhei na documentação, ja mandei no Spring Source forums e ninguem responde como fazer.

Agora a pouco mandei um e-mail para o Burt Beck, criador do plugin. Tomara que ele me responda essa dúvida.

30/09/2012 16:21


0
Conseguiu resolver o problema? Estou com um problema parecido


0
O problema seu ai é contexto javascript.

Você está tentando atualizar uma div com dados de dentro dela. Isso não vai ocorrer, no máximo, ocorrerá na primeira vez.

Tente retirar o form de dentro da div que será atualizada.
Lembre-se, sempre que for trabalhar com ajax e precisar atualizar uma div (eu disse precisar porque as vezes o ajax irá apenas enviar dados e receber um ok sem a necessidade de update) você deve separar a chamada ajax da div que será atualizada. Ex.:


<html>
<body>
<g:formRemote url="[controller:'j_spring_security_check', action:'']"
class="dropdown-menu pull-right" name="loginForm" update="header">

</g:formRemote>

<div id="header"></div>
</body>
</html>


Assim executará sem problemas.
Para servir de exemplo, eu tenho um tela específica que está disposta assim:

- list.gsp -> arquivo principal da tela
- _list.gsp -> tabela com resultado do filtro no arquivo acima
- _linha.gsp -> Linha ("<tr>") da tabela acima.

Em list.gsp eu tenho a função ajax padrão que todas as linhas irão chamar, assim a resposta sobrepõe a linha com o resultado. Assim da a impressão de aplicação desktop. O update no registro via popup ou até mesmo um window.open retorna uma chamada para esse método que faz um replace nesta linha.

Espero ter ajudado.
25/11/2013 20:25



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto