DropDown a partir de otro objeto

Les planteo mi situacion.

Yo tengo 5 (cinco) sectores. En cada sector hay un subsector. Dicho subsector puede tener el mismo nombre en el sector 1 o en el sector 2 o en el sector 3, a simple vista parece una redundancia de datos.

En fin, la cuestion es que yo quiero seleccionar el Sector 2 y que el DropDown de SubSectores automaticamente filtre los subsectores correspondientes a ese sector, y no todos…

Ejemplo:


<?= $form->field($model, 'subsector')->dropDownList(

    		Subsectores::find()->select(['subsector','idSubsector'])->indexBy(

    				'idSubsector')->column(),['prompt'=>'Seleccionar Subsector']) ?>


    <?= $form->field($model, 'sector')->dropDownList(

    		Sectores::find()->select(['sector','idSector'])->indexBy(

    				'idSector')->column(),['prompt'=>'Seleccionar Sector']) ?>

dejo una imagen ejemplo… (no deberian salir consultorios ni caja entre otros)

En el momento que se cambie el primer selector debes lanzar una consulta ajax a tu aplicación y que se encargue de reemplazar los valores del segundo select.

Hola amigo revisa esto que te voy a enviar, para tu problema:

En el controlador has esta funcion y agrega la accion a tus rules del controlador:




public function actionActualizarSector() {

    	$model = Sector::model()->findByPk($_POST['idCodigosector']);


    	//llenar Subsector

    	$data = CHtml::listData($model->subsector, 'idSubsector', 'Campo_nombre_del_subsector_a_mostrar en la tabla subsector');

    	$subsector = "";

    	foreach ($data as $value => $name) {

        	$subsector .= CHtml::tag('option', array('value' => $value), CHtml::encode($name), true);

    	}

    	// return data (JSON formatted)

    	echo CJSON::encode(array(

        	'subsector' => $subsector

    	));

	}	



El la vista has este script:




<script>

	$(function() {  	

    	$.ajax({

        	url: 'index.php?r=Sector/actualizarSector',

        	type: 'POST',

        	dataType: 'json',

        	data: {

            	"idCodigosector": $('#Sector_idSector').val()

        	},

        	success: function(data) {

            	$("#Sector_idSubsector").html(data.subsector);

        	}

    	});   	

	});

	</script>



y luego esto para llenar los drop:




<td title="Selecione Sector">

	<?php echo $form->labelEx($model, 'idSector'); ?>

                    	<?php

                    	echo $form->dropDownList($model, 'idSector', CHtml::listData(Sector::model()->findAll(array('order' => 'Campo_nombre_del_sector_a_mostrar')), 'idSector', 'Campo_nombre_del_sector_a_mostrar'), array(

                        	'ajax' => array(

                            	'type' => 'POST',

                            	'url' => CController::createUrl('Sector/actualizarSector'),

                            	'dataType' => 'json',

                            	'data' => array('idCodigosector' => 'js:this.value'),

                            	'success' => 'function(data) {

		     $("#Sector_idSubsector").html(data.subsector);  

		}')

                            	)

                    	);

                    	?>

                    	<?php echo $form->error($model, 'idSector'); ?>

						</td>

	

	//Con este otro llenas los subsectores

	<td>

	<?php echo $form->labelEx($model, 'idSubsector'); ?><?php echo $form->dropDownList($model, 'idSubsector', array()); ?>

  	<?php echo $form->error($model, 'idSubsector'); ?>

	</td>



Ojala resuelvas con esto, yo siempre utilizo esta via y me da resultados.

Aqui debe haber una relacion entre los sectores y los subsectores donde a un sector le corresponda uno o varios subsectores, al escoger un sector, solo te mostrara en el otro drow los subsectores correspondientes

antes de probarlo, pregunto: esto no es para Yii1 o lo acepta Yii2? Saludos y gracias, lo voy a probar…

Mira yo lo tengo en yii 1.1, pero son funciones que yo hago en el controlador, no se si trabaja para yii 2