Problemas com o Autocomplete do Richui
22/09/2009 00:00
0
Prezados(as),

Coloquei o plugin RichUI em uma aplicação mas estou com o seguinte problema.

Antes do plugin, eu usava numa combobox CEP do formulário de inclusão de Contribuinte (/aplicacao/contribuinte/create.gsp) o seguinte:

<tr class=&quot;prop&quot;>
<td valign=&quot;top&quot; class=&quot;name&quot;>
<label for=&quot;cep&quot;>CEP:</label>
</td>
<td valign=&quot;top&quot; class=&quot;value ${hasErrors(bean:contribuinte,field:'cep','errors')}&quot;>
<g:select optionKey=&quot;id&quot; from=&quot;${Cep.list()}&quot; name=&quot;cep.id&quot; value=&quot;${contribuinte?.cep?.id}&quot; </g:select>
</td>
</tr>


Com a instalação do plugin, eu mudei para:

1) No head da minha GSP eu coloquei:

<resource:autoComplete skin=&quot;default&quot; />

2) Troquei a combobox acima por um campo input com AutoComplete (AJAX):

<tr class=&quot;prop&quot;>
<td valign=&quot;top&quot; class=&quot;name&quot;>
<label for=&quot;cep&quot;>CEP:</label>
</td>
<td valign=&quot;top&quot; class=&quot;value ${hasErrors(bean:contribuinte,field:'cep','errors')}&quot;>
<richui:autoComplete name=&quot;cep&quot; action=&quot;${createLinkTo('dir': 'contribuinte/searchAJAX')}&quot; />
</td>
</tr>


3) Inseri no &quot;contribuinte.controller&quot; a action searchAJAX conforme abaixo:

def searchAJAX = {
def ceps = Cep.findAllByCepLike(&quot;%${params.query}%&quot;)

//Create XML response
render(contentType: &quot;text/xml&quot;) {
results() {
ceps.each { cep ->
result(){
name(cep.cep)
//Optional id which will be available in onItemSelect
id(cep.id)
}
}
}
}
}


Tudo funcionou NORMAL, o autocomplete mostra os CEP´s com precisão, entretanto, após a seleção do mesmo e tentativa de gravação dos dados, ocorre o ERRO:

Failed to convert property value of type [java.lang.String] to required type [Cep] for property cep; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [java.lang.String] to required type [Cep] for property cep: no matching editors or conversion strategy found

Ou seja, não estou conseguindo converter o &quot;contribuinte.cep&quot; (selecionado no campo input do form) no &quot;cep.id&quot; que deve ser gravado no BD.

Qualquer ajuda será muito bem vinda!!!
Tags: Ferramentas/Plugins


0
Cara estou com o mesmo problema....

eu consigo fazer a busca e mostrar certinho, mas na hora de gravar ele tenta gravar no campo campo em que clico, ou seja, ele tenta gravar o nome não o id deste nome....

se alguem souber como pegar o id para mandar para o banco vai funcionar direitinho....

se alguem já passou por algo parecido ajuda ai... pois não estou tendo sucesso com minhas tentativasss.....

abraçossss.
07/12/2009 00:00


0
Caro colega,

Cheguei muito próximo da solução, penso que só falta um pequeno detalhe ... assim que eu conseguir, e vou conseguir, lhe aviso!

Abraço,

PS.: Se alguém souber a solução antes, por favor, nos AJUDE!!!!!
08/12/2009 00:00


0
Pois é pelo q continuei testando ele tenta salvar o que aparece no auto-complete...

pois fiz aparecer somente o id no auto-complete e ele conseguiu salvar direitinho, entao precisamos axar uma maneira de mostrar um determinado campo no auto-complete e quando ele for salvar ele pegar o id...

abraços
08/12/2009 00:00


0
Posta o seu codigo aqui que vc fez o autocomplete pegar apenas o ID como vc mencionou por favor?
09/12/2009 00:00


0
No caso eu somente mexi no controler como abaixo:

 def searchAJAX = {
def setores = Setor.findAllBySetorLike(&quot;%${params.query}%&quot;)

//Create XML response
render(contentType&#58; &quot;text/xml&quot;) {
results() {
setores.each { setor ->
result(){
id(setor.id)
//name(setor.setor)

}
}
}
}
}


tirando o name e deixando apenas o id, assim no auto complete no lugar de aparecer o nome irá aparecer o id, sendo que assim salva o id dah maneira que preciso, mais eu não consigo identificar o registro que preciso, sendo que esta solução é inviável de utilizar.
09/12/2009 00:00


0
Ok entendi, achei que vc estava usando &quot;JavaScript&quot; também pois, eu já parti para essa tentativa.

Vou copiar o código que estou testando com os JavaScripts que inseri, quem sabe vc não consegue achar a solução ok?

Mas vou fazer isso só amanhã!
10/12/2009 00:00


0
Ok... posta ai no forum, pois assim todos podem ver e dar uma olhada...

assim fica mais fácil de identificar uma possível solução...

abraços... Evandro
10/12/2009 00:00


0
Então Evandro, em primeiro lugar, desculpa pelo MEGA atraso em postar aqui, eu estava envolvido num projeto muito maior e não tive como parar, mas vamos lá:

Segue abaixo o meu novo trecho de código do controlador com a diretiva &quot;searchAJAX&quot; para a classe Contribuintes:

def searchAJAX = {

def ceps = Cep.findAllByCepLike(&quot;%${params.query}%&quot;)

// Cria XML
render(contentType: 'text/xml') {
results() {
ceps.each { cep ->
result() {
name(&quot;${cep.encodeAsHTML()}&quot;)
id (cep.id)

}
}
}
}

}

Aqui, segue o trecho de código da página &quot;create.gsp&quot; de Contribuintes:

<tr class=&quot;prop&quot;>
<td valign=&quot;top&quot; class=&quot;name&quot;>
<label for=&quot;cep&quot;>CEP:</label>
</td>
<td valign=&quot;top&quot; class=&quot;value ${hasErrors(bean:contribuinte,field:'cep','errors')}&quot;>

<g:javascript>
function updateCEP(id) {
alert(id);
$('cep.id').value = id;
alert($('cep.id').value);

}
</g:javascript>

<richui:autoComplete name=&quot;cep&quot; id=&quot;id&quot; action=&quot;${createLinkTo('dir':'contribuinte/searchAJAX')}&quot;
onItemSelect=&quot;javascript&#058;updateCEP(id);&quot;/>
<g:hiddenField name=&quot;cep.id&quot; value=&quot;&quot; />


</td>
</tr>

IMPORTANTE: Perceba que eu coloquei 2 &quot;alerts&quot; em JavaScript para confirmar se o que eu estou mandando para o BD é o ID.

Portanto, a operação é a seguinte, um usuário ao abrir o formulario para a criação de um novo contrinuinte, no campo CEP deste formulário pode-se digitar um CEP exemplo &quot;134500..&quot; ele retorna os possíveis depois da consulta em AJAX ao meu BD MySQL5.0, por fim, o usuário faz a escolha desejada e, o CEP no formato descrito abaixo aparece dentro da combobox. Lembrando mais uma vez que o que é enviado para gravação está em <g:hiddenField name=&quot;cep.id&quot; value=&quot;&quot; />

Ou seja, está faltando muito pouco para conseguir a gravação do ID e não do CEP que vêm na forma:

String toString(){
&quot;\t${this.cep}\t:\t${this.logradouro}\t:\t${this.bairro}\t:\t${this.cidade}\t&quot;
}

Enfim, se alguém puder nos AJUDAR, ficarei muito grato.

Forte abraço,
22/01/2010 00:00


0
Opa.

não conheço o plugin richui, sendo assim, vou aprensentar uma solução mais genérica usando o jQuery ok? Sendo assim, instale o plugin na sua aplicação pela linha de comando: &quot;grails install-plugin jquery&quot;

É um plugin muito fácil de usar. Na sua página, tudo o que você precisará fazer consiste em incluir o seguinte código na seção head do html


<g&#58;javascript library=&quot;jquery&quot;/>


Pelo que pude entender, você precisa atualizar um combobox a partir da edição de um componente textual, certo? Bom: se não for, algumas pequenas adaptações no que vou fazer aqui resolverão o seu problema <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->

Bem: vamos supor que na sua página, quando o usuário digita o nome da cidade, a lista de CEPs apareça no combobox.

1. Na sua página, envolva o combobox em uma div, tal como no código abaixo:


<div id=&quot;minha_combo_favorita&quot;>
<select name=&quot;seuCombo&quot;>
// o conteudo do seu combo. pode usar a tag g&#58;select também se quiser. usei a tag padrão html só por questões didáticas mesmo
</select>
</div>


2. Incluida a tag g:javascript na tag head, crie uma função javascript que intercepte a mudança no seu input textual. Algo como a função abaixo:

function atualizarCombo() {
var conteudoTextual = document.getElementById(&quot;idDoSeuCampoTextual&quot;).value
// e aqui entra o jquery
$(&quot;#minha_combo_favorita&quot;).load(&quot;/suaAplicacao/seuControlador/suaAction?valor=&quot; + conteudoTextual)
}


No seu input do tipo textual, chame o método tal como no exemplo abaixo:

<input type=&quot;text&quot; name=&quot;inputQuente&quot; id=&quot;idDoSeuCampoTextual&quot; onchange=&quot;atualizarCombo()&quot;/>


3. Brincando com o seu controlador. Na action que deverá retornar o html contendo seu combo, execute um código similar ao abaixo:


def actionQuente = {
// bla bla bla do processamento acima
render(template&#58;&quot;templateQuente&quot;, model&#58;[listaCEPS&#58;listaCEPS])
}


aonde templateQuente será o arquivo de template _templateQuente.gsp presente no mesmo diretório de visualização do seu controlador. Neste arquivo de template você coloca a tag select com o seu conteúdo, que será então renderizado no seu formulário.

Qualquer coisa, to ai!


0
Olá,

Também estava procurando uma forma de utilizar o autocomplete no meu primeiro projeto com Grails e a melhor alternativa que encontrei, após alguns testes, foi utilizar o autocomplete do jquery. Achei o jquery mais flexível e com uma documentação mais abrangente. Se houver interesse dos senhores posso postar aqui algum exemplo de código fonte pra ajudar na utilização do autocomplete.


[]'s

André R Gomes
27/06/2010 00:00


0
[quote=&quot;andrergomes&quot;]Olá,

Também estava procurando uma forma de utilizar o autocomplete no meu primeiro projeto com Grails e a melhor alternativa que encontrei, após alguns testes, foi utilizar o autocomplete do jquery. Achei o jquery mais flexível e com uma documentação mais abrangente. Se houver interesse dos senhores posso postar aqui algum exemplo de código fonte pra ajudar na utilização do autocomplete.


[]'s

André R Gomes[/quote]

Também acho jquery muito mais leve e frexivel. Tantas pessoas estão reclamando do RichUi... eu memso já tive dores de cabeça, por isso abandonei. Há muitos códigos prontos na web usando jquery, e bem leves XD
06/07/2010 00:00


0
pois e, baseado nessas coisas do richui muito pesado que eu to tentando criar um plugin com taglibs utilizando o jquery e o jqueryui, realmente e muito facil mexer com jquery, quando eu conseguir terminar e disponibilizar la no grails eu do um toque pra galera testar e apontar os pontos fracos =D.
06/07/2010 00:00



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