En este ejemplo cargo las opciones de raza a partir de una selección previa de una especie.
Ingredientes:
1. Función en el controlador para listar las especies (primer select box):
public function add() { if ($this->request->is('post')) { // Código para salvar el anuncio. } else { $especie = new Especie(); $especies = $especie->find('list', array( 'fields' => array('Especie.id', 'Especie.nombre') )); $this->set('especies', $especies); } }
2. Código del formulario:
Form->create('Anuncio'); echo $this->Form->input('especie', array( 'type' => 'select', 'options' => $especies, 'empty' => 'Elija una especie' )); echo $this->Form->input('raza', array( 'type' => 'select', 'empty' => 'Elija una especie' )); echo $this->Form->end('Guardar Anuncio'); ?>
3. Función en el controlador para retornar un JSON con las razas pertenecientes a la especie:
public function getRazasByEspecie() { if ($this->request->is('ajax')) { $idEspecie = $this->params['data']['idEspecie']; $raza = new Raza(); $razas = $raza->find('all',array( 'fields' => array('Raza.id', 'Raza.nombre'), 'conditions'=>array('Raza.id_especie'=>$idEspecie))); $this->RequestHandler->respondAs('json'); $this->autoRender = false; echo json_encode ( $razas ); } }
Preparación:
Agregar el código JavaScript que una (binding) la siguente lógica al evento de modificación del primer select box. La función hace un llamado Ajax al controlador para pedir las razas. Estas son retornadas en formato JSON el cual es procesado para agregar las nuevas opciones del segundo select box.$(document).ready(function(){ $('#AnuncioEspecie').change(function(){ var selected = $(this).val(); $.ajax({ type: "POST", url: '/Anuncios/getRazasByEspecie', data: "idEspecie="+selected, dataType: 'json', success: function(data){ $('#AnuncioRaza option').remove(); var $el = $("#AnuncioRaza"); if (data.length > 1) { $el.append($("") .attr("value", -1).text("Elija una raza")); } $.each(data, function(i,items){ $el.append($("") .attr("value", items.Raza.id).text(items.Raza.nombre)); }); } }); }); });
Consumase al gusto :D!