Domínio em Tempo de Execução
05/07/2011 12:03
1
Bom dia galera,
Estou tentando fazer o seguinte, criar vários textFields em runtime(clicando em um botão) e enviar os dados desses textFields para meu controlador. Criar os textField eu consegui usando javascript, porém não consegui enviar os dados para meu controlador..

Alguem tem algum norte para que eu possa seguir? realmente estou meio confuso, o que eu estou querendo é criar classes de domínio em tempo de execução usando o plugin Dynamic Domain Properties!

Obrigado!

ps: O Site ficou muito bom!!
Tags: javascript domínio


2
Opa, que bom que está gostando da nova versão do Grails Brasil Handel. Encontrando problemas, me contacte ok?

Com relação ao seu problema, o que exatamente você quer fazer? Criar novos atributos na sua classe de domínio que refletirão em novos campos na tabela relacionada? Se for isto, de cara eu te desrecomendo esta técnica, porque você terá problemas imensos no futuro.

Agora, uma outra alternativa (que também é ruim), consiste em você ter uma estrutura de dados na qual seja implementado um modelo do tipo chave/valor. Nesta situação, há basicamente duas classes de dominio: a que recebe os valores e a que armazena os valores.

Vou chamar a primeira de Entidade, e a segunda de Atributo. A primeira possui todos os atributos que esperamos encontrar, enquanto a segunda representa estes atributos. Implementaria a segunda tal como no exemplo abaixo:


class Atributo {
String chave
String valor
static belongsTo = [entidade:Entidade]
}


No seu formulário, quando estiver incluindo novos campos, lembre-se de incluir também uma tag hidden contendo o nome do atributo chave a ser incluido relativo ao valor. Você pode adicionar um sufixo ao nome do campo que está sendo criado pra facilitar a sua vida. Algo como input_txt_campo_[nome da chave]

Em seguida, no seu controlador, basta que você itere em cima das chaves presentes nos parametros recebidos (o famigerado "params") seguindo as regras de nomenclatura.

É uma solução. Mas a gente pode pensar em outras por aqui também. :)


0
Valeeu pela rapida resposta! =D

É o seguinte, acho que entendi +- o que você quis dizer, porém eu não sei ainda qual é o atributo chave a ser incluido entende.
Eu estou querendo com que o usuário crie categorias, para depois realizar o cadastro usando essas categorias.
Por ex. O usuario quer cadastrar pessoa física, então ele cria uma categoria "Pessoa Fisica" com os atributos, cpf, nome(isso aconteceria com o usuario clicando em criar novo campo)... e na hora de cadastrar a pessoa física, quero gerar todos os textFields da categoria, que nesse caso é cpf e nome.
não sei se fui claro! =/

Abraço!
05/07/2011 12:23


1
Oi Handel.

Você quer basicamente permitir que o seu usuário programe, certo? Nesta situação, eu faria o seguinte. Teria duas classes de dominio: Categoria e Atributo, tal como no exemplo abaixo:


class Categoria {
String nome
static hasMany = [atributos:Atributo]
}

class Atributo {
String chave
String nome
static belongsTo = [categoria:Categoria]
}


Com base nisto, cadastraria todos os atributos que eu espero uma categoria possua. Em seguida, aplicaria isto em uma classe de domínio chamada, digamos... estou bastante "criativo" hoje. Entidade! :)


class Entidade {
static belongsTo = [categoria:Categoria]
}


E também teria uma classe de domínio só pra representar os atributos desta entidade, que seria mais ou menos assim.


class AtributoEntidade {
String valor
static belongsTo = [atributo:Atributo, entidade:Entidade]
}


E a partir dai criaria os formulários populando as propriedades usando o esquema de nomes que propus acima. O problema é: esta solução não vai ser performática a longo prazo. E como estamos lidando com algo cujos campos podem variar demais, eu sugiro que você trabalhe com alguma solução NoSQL, como MongoDB, por exemplo.

Já escrevi sobre ele neste link [link]http://www.itexto.net/devkico/?p=706[/link]


1
Concordo com o Kico.

Não vejo sentido em deixar o usuário "programar" "novos dominios".

noSql seria o melhor para você dar uma olhada agora.

Posso perguntar pra que você quer isso?

Outra coisa: Dominios são classes meio que sabem o que são. Não tem lógica criar "dominios" que não sabem o que são.
05/07/2011 14:05


0
Kico, até que eu entendi o que você falou, só que eu tava querendo um jeito de criar em tempo de execução vários textFields e enviar o que o usuário colocou em cada um criado para o controlador. Não estou conseguindo fazer essa comunicação..

MayogaX, pois eh, eu vi um plugin do CouchDB para grails, só que pela configuração do plugin eu tenho que determinar quais são os atributos do domínio. Eu sei que Dominios não deveriam mudar e a opção de usar um banco NoSQL é ótima, porém eu ainda não sei como eu criaria um "form" com campos variáveis(definido pelo usuário) para poder ser armazenado no banco.
por ex. se o usuario quiser cadastrar uma "prova de colégio", e não existe a categoria "prova de colégio" ainda, ele simplismente criaria uma nova categoria "prova de colégio" e então poderia cadrastrar as provas! não sei se ficou bem claroo!

Abraços!
05/07/2011 14:36


0
Oi Handel,

neste caso, tenho aqui um pseudo-algoritmo que talvez lhe ajude.
Na action que for ser usada para o envio ao formulário, envie também uma lista contendo objetos com no mínimo dois atributos: o id do meta-atributo que você quer preencher e a descrição do mesmo.

Na sua view, você vai incluir um código parecido com este:


<g:each in="${lista_objetos}" var="item">
<label for="${item.id}">${item.nome}</label>
<input type="text" name="${item.id}"/><br/>
</g:each>



0
Hmm.. o problema está como eu vou criar essa 'lista_objetos' já que eu não sei comunicar meus objetos em javascript com grails.. estou tentando dar uma olhada na internet aqui porém não estou achando nada..
Estou criando o formulario todo em javascript em tempo de execução para poder criar uma categoria.

Muito obrigado pela ajuda de vcs 2! =D

05/07/2011 17:32


0
Fácil Handel. Usa Ajax. :)



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