Autocomplete nativo do Cake (Ajax Helper)
Postado por Carlitos | Tags ajax , autocomplete , cakebook , cakephp , helper ajax | Postado em 11:20
2
Eu já havia mostrado uma implementação de autocomplete no Cake usando o jQuery UI (http://cakenaveia.blogspot.com/2010/06/jqueryui-autocomplete-no-cakephp-agora.html), mas nunca havia usado o autocomplete nativo dele que utiliza o Prototype e o Scriptaculos. Até porque não tenho muita familiaridade com essas outras bibliotecas e gosto muito dos temas prontos do jQuery UI, o que dispensa dores de cabeça com o CSS.
Bom vamos nessa então...
Antes de começarmos veja nos posts anteriores como criar uma tabela de "cidades" (no meu caso, com os campos: id, estado_id, cidade) e crie para ela o model, views e controller usando o bake.
1º) Seguindo o book (http://book.cakephp.org/view/1370/autoComplete) crie a action autoComplete() no controller ...app/controllers/cidades_controller.php.
function autoComplete(){ $this->layout = 'ajax'; $cidades = $this->Cidade->find('all', array( 'conditions' => array('Cidade.cidade LIKE' => $this->data['Cidade']['cidade'] . '%'), 'order' => array('Cidade.cidade'), 'fields' => array('cidade') ) ); $this->set('cidades', $cidades); }Veja que estou listando todas as cidades cujo nome comece com o argumento recebido via POST e ordeno a lista de cidades ascendentemente.
2º) Crio a view ...app/views/cidades/auto_complete.ctp:
<ul> <?php foreach($cidades as $cidade) echo '<li>' . $cidade['Cidade']['cidade'] . '</li>'; ?> </ul>3º) E na view ...app/views/cidades/add.ctp adicionamos o autocomplete em si:
<?php $javascript->link('https://ajax.googleapis.com/ajax/libs/prototype/1.7.0.0/prototype.js', false); $javascript->link('https://ajax.googleapis.com/ajax/libs/scriptaculous/1.8.3/scriptaculous.js', false); echo $this->Html->css('autocomplete'); ?> <div class="cidades form"> <?php echo $this->Form->create('Cidade');?> <fieldset> <legend><?php __('Add Cidade'); ?></legend> <?php echo $this->Form->label('Cidade'); echo $ajax->autoComplete('Cidade.cidade', '/cidades/autoComplete'); ?> </fieldset> <?php echo $this->Form->end(__('Submit', true));?> </div>Veja que o $ajax->autoComplete('Cidade.cidade', '/cidades/autoComplete') cria um input com autocomplete, mas esse input vem sem label =/, portanto temos que gerar um label antes.
Veja também que adicionei um CSS (echo $this->Html->css('autocomplete')) para estilizar a lista com os resultados do autocomplete. O arquivo ...app/webroot/css/autocomplete.css ficou assim:
div.auto_complete { background: #003d4c; color: #ffffff; } div.auto_complete ul { margin:0; padding:0; width: 100%; list-style-type:none; } div.auto_complete ul li.selected { background-color: #62AF56; font-weight: bold; } div.auto_complete ul li { margin:0; padding:5px; cursor:pointer; }
Obs.: Eu dei uma garibada no CSS que achei aqui (http://webdomino.blogspot.com/2006/08/ajax-autocompletion.html). =]
Ao acessar a aplicação em: http://<seu_dominio>/cidades/add e entrar com o prefixo de alguma cidade já cadastrada no banco no campo cidade, após alguns segundos (é bem rápido, acho que não chega nem a isso) a lista é carregada automagicamente* hehe!
Veja o resultado final!