[Resolvido] VRaptor - ManyToMany

19 respostas
d34d_d3v1l

Boa noite,

então eu tenho um formulario, onde tenho um multiselect para selecionar os elementos do relacionamento.
Então, o VRaptor ja vai construir o objeto com a List do relacionamento?

O que preicso fazer para que isto seja feito?

19 Respostas

d34d_d3v1l

alguém?

C

Bom vamos lá…

Se quiser fazer na base do submit mesmo (ou seja, via action da propria pagina e nao via ajax), voce tem que processar cada seleçao.

Por exemplo se estiver montando um objeto casa com 3 paredes cada uma com uma cor…

Teria que montar 3 input hidden com
name=casa.parede[].cor e value=preto
name=casa.parede[].cor e value=amarelo
name=casa.parede[].cor e value=azul

O VRaptor vai montar uma Casa, com um List contendo 3 paredes
parede.cor=preto
parede.cor=amarelo
parede.cor=azul

Deu pra entender?

Abraços!

d34d_d3v1l

Sinceramente não.
Eu tenho um componente multiselect pronto:

<dl>
	    		<dt><label>Serviços:</label></dt>
	    		<dd><ef:combobox name="servicosSelecionados" campoChave="codigo" lista="${tipoServicoList}" id="servicos" clazz="large" multiplos="true" /></dd>
	 </dl>

achei que se eu colocasse no name:

name=entity.servicos

o vraptor iria dar conta do recado ... mas nao deu nao :(

Lucas_Cavalcanti

se tipoServicoList for uma lista de enum, vc pode colocar o nome do select como entity.servicos[], que o VRaptor vai transformar na lista direitinho (desde que exista entity.setServicos(List<…>))

agora se não for uma enum, a lista deveria ser dos ids, então seria algo do tipo:

name=“entity.servicos[].id” e nos valores das options ${tipoServico.id}

C

eh taglib? vc tem o html gerado?

d34d_d3v1l

É uma lista de objetos normal… Na verdade é uma Lista de Interface onde possui três implementações: Professor, Aluno e Admin. Usei o ManyToAny para mapear a classe (outro problema… mas tenho que resolver uma coisa de cada vez)

Quer dizer que ele não pega e monta a lista automaticamente? Ele vai gerar uma lista de int com os ids da entidade?
Mas iai, o que eu faço com isso, sendo que no método eu recebo só o objeto que quero salvar? No caso “Mensagem mensagem” ?

Opa o HTML gerado é:

<select  multiple="multiple" 
	id="destinatarios" name="entity.destinatarios" style=""
	
			data-placeholder="Escolha um item..."
		
		
	class="chosenizer large">
	<option value=""></option>
	
			<option value="1">professor</option>			
				<option value="1">aluno</option>
				<option value="1">admin</option>
				
</select></dd>
	    </dl>

Acabei de ver outro erro… o value está como 1 para todas as entidades.

C

Olha o que eu costumo fazer, e pode ser qua haja um jeito melhor (dai o Lucas te fala),

É o Seguinte, ao clicar no botao submit voce faz uma function javascript que itera sobre o multiselect

E para cada option selected (voce pode fazer isso com jquery, daí nem precisaria de um loop para isso)

voce controi um input hidden com name=“entity.servicos[].id” e o value com o valor dos ids retirados das options (que estao todas iguais)

O que talvez de certo mas teria que testar é por dentro dos options esse input hidden… dai nao teria que fazer script…

Mas nao sei se funciona, pode ser que ele acabe passando a lista toda ou nenhum dos itens…

d34d_d3v1l

ahh…

o código está correto.
É pq cada código 1 representa uma entidade diferente.

C

alias, boa sorte em trabalhar com entidades polimorficas…

já tive altas tretas com isso… principalmente na persistencia…

se voce conseguir fazer algo legal me avisa!! de verdade mesmo…

abraços!

d34d_d3v1l

desculpa, mas acabei de desistir.

vou separar mesmo… eu tenho que fazer isto funcionar HOJE!

C

pouts… kkk pois é tive essa dificuldade tb…

quanto ao multi select conseguiu entender? O script seria algo assim…

function selecionaFuncionario(){
		var rules = $("#granted_rules2 option");
		var numeroRules = rules.length;
		var inputs = '';
		for(var i=0; i<numeroRules;i++){
			inputs += '<input type="hidden" name="funcionario[].id" value="'+rules[i].value+'\"/>';
		}
		$("#inputs7").html(inputs);
}
d34d_d3v1l

Vou tentar fazer,
mas por favor, me explique novamente,

pq q eu preciso desse input hidden ?
O VRaptor vai pegar esses IDs que estão ‘escondidos’ e vai montar a lista?
O.o’

Lucas_Cavalcanti

se está com os colchetes, o vraptor consegue transformar numa lista com o mesmo nome.

C

Ele vai pegar e montar os objetos a partir dos nomes dos inputs… (corrija-me se estiver errado Lucas!)

por exemplo vamos imaginar 3 inputs… (hidden só para nao sujar a pagina mas poderia ser text…)

name=entity.destinatarios[].id=1
name=entity.destinatarios[].id=2
name=entity.destinatarios[].id=3

o VRaptor vai instanciar um new Entity() e vai setar uma List (por isso tem que ter o seter)

e vai instanciar 3 new Destinatarios() e setar o id de cada um…

Lucas se o name do multiselect for entity.destinatarios[].id o vraptor nao faz automaticamente tudo isso que falei acima né?

Lucas_Cavalcanti

se o name do multiselect for entity.destinatarios[].id vai funcionar sim, pq se vc selecionar 3 options, ele vai enviar 3 parametros na requisição com esse nome.

C

ummm bom saber… entao esqueça o script!! kkk

Valeu Lucas!!

d34d_d3v1l

legal…
boa observação…

iai lucas?

d34d_d3v1l

opa, desculpa nao tinha visto que ja tinha respondido…

vou testar e falo pra vcs galera.

abraçoss
vlw

d34d_d3v1l

aeeeeeeeeeeeeeeeee funcionou…

cara que lindo :slight_smile: que fácil adushashduhuasd

vlw demais cckncckn :smiley:
e Lucas Cavalcanti, obrigado também…

showw de bola…
tô feliz d+
asdhuasdhuashud

abraçãoo ae galera.
[RESOLVIDO]

Criado 21 de junho de 2012
Ultima resposta 22 de jun. de 2012
Respostas 19
Participantes 3