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!
hola primero te agradezco ya que me ha servido bastante tu blog, sin embargo tengo una duda sobre el lugar en que se debe ubicar eso que llamas preparación, muchas gracias!
ResponderEliminarSaludos!
EliminarMe alegra que te sirva en algo mis pedacillos de código. El último código es JavaScript con JQuery por lo cual deberías ponerlo en un .js aparte e incluirlo en una página.
Excelente ejemplo! gracias!
ResponderEliminarBuenas, me sirvió mucho tu ejemplo. Aunque tengo un pequeño problema, me exige una vista .ctp
ResponderEliminar¿No debería no?
Gracias