Componentes de Tela (Adicionar Tabelas)
23/09/2015 16:36
0
Galera,

estou começando no Grails e tentando abandonar o JSF. Mas tenho encontrado dificuldade em criar algumas telas no gsp com HTML puro. Vou explicar o que quero fazer, e se alguém tiver um exemplo parecido ou alguma dica eu agradeço:

Dentro de um formulário, permitir a adição de uma ou várias localidades (endereço), e para cada localidade dessas, adicionar um ou vários dados de pessoas.

Existe alguma Tag lib do Grails que execute isso para mim de forma simples? Ou se não tiver, como vocês fariam?

Obrigado!!
Tags: gsp table ajax html componente


2
Oi Victor,
você resolve isto com o uso de command objects. Estes são objetos que usamos com controladores quando os formulários nos quais trabalhamos não possuem uma estrutura de atributos que bata com nossas classes de domínio.
No que diz respeito ao controlador, eles funcionam exatamente como classes de domínio. A diferença é que apenas validam, e não persistem dados no banco de dados.
Para resolver o seu problema, a primeira coisa que você deve fazer é criar um command object que possua um atributo do tipo lista que armazene os objetos que serão editados em seu formulário, tal como no exemplo a seguir:

@grails.validation.Validateable
class CommandEdicao {
    List usuarios
}

O seu controlador deverá, na action, pré-popular este componente tal como no exemplo abaixo:

def actionExemplo() {
        def command = new CommandEdicao()
        command.usuarios = funcaoQueRetornaUsuarios()
       [command:command]
}

E o seu arquivo GSP terá acesso ao mesmo. O único ponto que você deve tomar atenção é no nome dos atributos. Observe o exemplo a seguir:

<g:form action="teste">
<g:each in="${command.usuarios}" var="usuario" status="i">
            Nome: <input type="text" name="command.usuarios[${i}].nome" value="${usuario.nome}"/>
</g:each>
    <input type="submit"/>
</g:form>

Repare que o nome do campo bate com a posição do mesmo dentro do seu command object. Feito isto, quando for submeter o formulário, sua action receptora deverá receber como parâmetro um objeto do mesmo tipo do command object criado e que também possua o mesmo nome definido no seu GSP, tal como no exemplo abaixo:

def teste(CommandEdicao command) {
     for (usuario in command.usuarios) {
            // problema resolvido
     }
}


Se for para criar usuários dinâmicamente pelo GSP, basta manter a padronização dos nomes.


2
Lobo. Não sei como funciona o command objects.
Mas como ele faria para , na tela, adicionar novos elementos html (uma tabela por exemplo) ??
Pelo o que eu entedi da pergunta do Victor , ele quer adicionar mais elementos HTML na tela dele.
Ele tem , sei lá, uma table que tem 3 inputs e ele quer adicionar mais tabelas dessa no form pra poder cadastrar vários endereços de uma so vez!


0
Oi Evandro,

o command object vai ser usado neste caso apenas do lado controlador com o objetivo de fazer o data binding.

Do lado cliente, no GSP, tudo o que é necessário fazer é ir gerando novos elementos na árvore DOM mantendo o mesmo padrão de nomenclatura. Assim, no momento do binding serão criados novos elementos na lista presente no command object.


1
Talvez esse link possa ajudar: http://omarello.com/2010/08/grails-one-to-many-dynamic-forms/?
Em uma empresa que trabalhei, criamos uma solução parecida com essa.
25/09/2015 09:23


0
Valeu galera, essas dicas vão ser úteis. Só falta pensar como que vou organizar isso na tela (tenso rs)


0
Precisando de ajuda já sabe aonde buscar Victor!



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