Entrada de formulario Cakephp con autocompletar

Estoy usando CakePhp 2.2.1 y estoy teniendo algunos problemas para implementar lo que acabo de preguntar en el título, encontré varios tutoriales pero la mayoría de ellos son para cakephp 1.3 y los otros no son lo que quiero hacer. Tengo una tabla de “eventos” que contiene un “player_id”, por lo que un jugador tiene muchos eventos y un evento pertenece a un jugador.

En mi formulario de agregar evento, procedo como dice el libro de cocina y obtengo una lista desplegable de jugadores para elegir, sin embargo, lo que quiero es simplemente escribir los nombres de los jugadores y seleccionar el que quiero de los resultados de autocompletar. También estos jugadores deben ser del equipo que seleccione antes de eso. ¿Algunas ideas?

Gracias por adelantado.

Un agradecimiento especial a Andrew por señalar este api.jqueryui.com/autocomplete . Sin embargo, no hay una verdadera guía para usar esta. Así que encontré esta publicación , que explica lo que dice el segundo enlace de Abhishek, pero podría entenderlo mejor. Así que aquí está mi solución si alguien está interesado:

1 – Descargue de la página de autocompletar el .js que necesita. Guárdelo en la aplicación / webroot / js

2 – Ya sea en su aplicación / View / Layouts / default.ctp o en la vista en la que desea usar el complemento de autocompletar:

echo $this->Html->script('jquery-1.9.1.js'); echo $this->Html->script('jquery-ui-1.10.3.custom.js'); echo $this->fetch('script'); 

3 – En su vista, agregue (el mío fue add_goal.ctp):

  

4 – En su controlador (mina era EventController.php):

 public function autoComplete($team = null){ Configure::write('debug', 0); $this->autoRender=false; $this->layout = 'ajax'; $query = $_GET['term']; $players = $this->Event->Player->find('all', array( 'conditions' => array('Player.team_id' => $team, 'Player.name LIKE' => '%' . $query . '%'), 'fields' => array('name', 'id'))); $i=0; foreach($players as $player){ $response[$i]['id']=$player['Player']['id']; $response[$i]['label']=$player['Player']['name']; $response[$i]['value']=$player['Player']['name']; $i++; } echo json_encode($response); } 

visite el enlace a continuación, esto podría ayudarlo ya que el ajax helper ya no está en las versiones de cake2.X core todas las funcionalidades relacionadas movidas a la clase JS helper. (aquí el tercer enlace para AJAX helper para contribuido por el usuario puede ayudarlo)

http://bakery.cakephp.org/articles/matt_1/2011/08/07/yet_another_jquery_autocomplete_helper_2

o

http://nuts-and-bolts-of-cakephp.com/2013/08/27/cakephp-and-jquery-auto-complete-revisited/

o

http://bakery.cakephp.org/articles/jozek000/2011/11/23/ajax_helper_with_jquery_for_cakephp_2_x

Necesitas usar ajax porque tus resultados de autocompletar dependen del equipo que hayas seleccionado. Algo así en jquery:

 var team = $('#teamdropdown').find(":selected").text(); $.ajax({ type: "POST", url: 'http://domain.com/playersdata', data: {'team':team}, success: function(data){ console.log(data); //put data in for example in li list for autocomplete or in an array for the autocomplete plugin }, }); 

Y en cake en la página de playersdata (Controller o modelo) algo como esto.

 if( $this->request->is('ajax') ) { $arr_players = $this->Players->find('all', array('conditions'=>array('team'=>$this->request->data('team')))); //pr($this->request->data) to get all the ajax response echo json_encode($arr_players); } 

También establezca encabezados en json respons y $ this-> layout = null; para eliminar el diseño tpl.

Otra solución sería usar json_encode en tu php y pasarlo a js-code como

  

Esta solución solo es interesante para una pequeña cantidad de datos, si tienes una gran base de datos con equipos y jugadores, no recomendaría esto, porque ¿por qué cargar todos estos datos si solo necesitas un poco de eso? No lo hice. Pruebe el código, pero debería ayudarlo a continuar …

¡Buena suerte!