DropDownLists dependientes mantener valores

Hola a todos…

Tengo dos dropdownlist dependientes definidos de la siguiente forma




<tr>

	<td style="padding: 4px 10px 4px 0px; width: 130px;"><?php echo $form->labelEx($model,'unit_owner'); ?></td>

		<td style="width: 240px;">

			<?php echo $form->dropDownList($model,'unit_owner', CHtml::listData(Unit::model()->findAll(array('order' => 'name ASC')), 'id', 'name'), 				   

									array(

								            	'ajax' => array(

								                'type'=>'POST',

								                'url'=>CController::createUrl('Promotion/dynamicServiceOwner'),

								                'update'=>'#'.CHtml::activeId($model,'service_owner'

									)

							),'prompt' => ''

						)); ?>

		</td>

	<td style="width: 120px;"><?php echo $form->labelEx($model,'service_owner'); ?></td>

	<td><?php echo $form->dropDownList($model,'service_owner',array(), array('style' => 'width:150px')); ?></td>

</tr>



El codigo del controller es el siguiente:




	public function actionDynamicServiceOwner()

	{

		$unit_owner = $_POST['Promotion']['unit_owner'];


	    $data=ServiceOwner::model()->findAll(array('order'=>'name', 'condition'=>'unit=:unit', 'params'=>array(':unit'=>(int) $unit_owner)));

	

	    $data=CHtml::listData($data,'id','name');

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

	    {

	        echo CHtml::tag('option',

	                   array('value'=>$value),CHtml::encode($name),true);

	    }

	}



Todo funciona bien hasta el momento en que envio el formulario a procesar y por cualquier error de validacion se vuelve a renderizar la vista. En ese momento el valor del segundo dropdownlist se pierde. Alguien me puede echar una mano.

Gracias por adelantado.

att.

Fijate si te sirve esto:<br />

<?php

echo $form->dropDownList($model,’tipo_de_cliente’, array(’1′ => ‘Persona Jurídica’, ’2′ => ‘Persona Natural’), array(‘prompt’=>’Seleccione…’, ‘onchange’=>”javascript:cambio_en_TIPO_de_cliente();”, ‘id’=>’tipodecliente_lst’,

‘options’=>array(2=>array(‘selected’=>’selected’))

));

?>

En la parte de ‘options’ podes poner lo que estaba seleccionado, en este ejemplo es el id = 2.

Saludos

Hola

He usado parte de tu codigo para manejar dropDownList dependientes dentro de la vista _form que genera gii.

Me he pasado horas probando otras ideas sin resultado. Con tu cogido logro los dropDownList anidados, casi como los quiero.

El problema es que al ejecutar, con cada cambio se updata la tabla ¿? es decir, hago una eleccion en el primero, se carga el segundo y se graba en la tabla un registro. Hago una eleccion en el segundo y se vuelve a grabar en la tabla… todo esto sin enviar el formulario

¿como solucionaste tu problema?

PD. la vista _form es tanto para editar como para crear un registro

Saludos

Hola, tengo el mismo problema con lo de que al editar se pierde el segundo dropdown,lograste solucionarlo? Gracias!

Hola que tal,

aqui una solucion efectiva para esos problemas del dropdownlist. hecho por mi.

Veanlo completo y no tendran mas problemas con los dropdownlist dependientes.

En la descripion del Video esta el codigo

Hola que tal,

aqui una solucion efectiva para esos problemas del dropdownlist. hecho por mi.

Veanlo completo y no tendran mas problemas con los dropdownlist dependientes.

En la descripion del Video esta el codigo

Adicionalmente te invito a unirte a la comunidad de Yii en español.

http://www.yiiframeworkenespanol.org/foro/

Y unete al grupo en Face, puedes hacer preguntas en el face o foro, responden rapido

Hola que tal, agradezco mucho tu pronta respuesta, pero en mi caso no funciona, tengo multimodel form y ambos dropdown se encuentran en el memberform, he estado intentando implementarlo en el multimodel, pero no logro hacerlo, si pudieras ayudarme, te lo agradeceria mucho. :unsure:

Creo entender que el problema es que al presentar un form lleno, (update), el segundo dropdow no se carga ni posiciona…?si¿

La solución esta en que al generar el form,si el campo del primer desplegable esta lleno, carges el segundo desplegable (no lo dejes vacío)


$niveles=CHtml::listData(TblCniveles::model()->findAll(),'id','cnS_descripcion');

	echo $form->dropDownListRow($model,'ccI_nivel',$niveles,

			array('empty'=>'--Seleccione nivel--',

				'ajax' => array(

						'type'=>'POST',

						'url'=>$this->createUrl('ajaxSubCateco'),

						'update'=>'#'.CHtml::activeId($model,'ccI_nivelSup'),

					)));

 ?>

	<?php //----------------------------------------------------------------------------------- nivel superior


	$niveles2=array();

	if ($model->ccI_nivel>0){

		$disable="";

		$niveles2=TblContenidos::model()->findAll(

				array(

						'condition'=>"ccI_nivel<$model->ccI_nivel",

						'order'=>'ccS_tituloControl ASC',

				));

		$niveles2=CHtml::listData($niveles2,'id','ccS_tituloControl');	

		echo $form->dropDownListRow($model,'ccI_nivelSup',$niveles2,

			array('enpty'=>'---Seleccione registro nivel superior---',

					'class'=>'span5',

					)); 

	} else 

		echo $form->dropDownListRow($model,'ccI_nivelSup',$niveles2,

				array('enpty'=>'---Seleccione registro nivel superior---',

					'class'=>'span5','disabled'=>'true'

				));

SI observas el ejemplo, el dropdow’ccI_nivelSup se genera de dos formas.o vacio, o con los valores correctos según la selección del anterior.

Otra solución, para reaprovechar código es, en cliente, al inicializar el formulario, con, p.ej. jQuery, hacer la llamada de carga y la actualizacion correspondiente

Si estas en lo correcto, en el update es cuando el primer dropdown aparece lleno y el segundo simplemente vacio. Entiendo que todo esto lo coloco en el form. Y si de algo sirve, tengo un codigo con javascript:




<script type="text/javascript">

	$(document).ready(function(){


		$(".parent-model").on("change",".combosWBS",function(){

			var $combo = $(this).parents("td").next().find("select");

			$combo.prop("disabled", true);

			$.post("<?php echo CController::createUrl('Obtienecsi');?>",{id_wbs:$(this).val()},function(ret){

					$combo.html(ret);

					$combo.prop("disabled", false);

				});

		});

	});

	</script> 



Pero la verdad, no se como decirle a ese mismo codigo que luego me renderee el segundo dropdown en el update.

No, en el update, han de aparecer los dos llenos, esa es la gracia.

Todo el problema viene que en un update puede que no tengas que modificar el primero, en cuyo caso no se genera change, y el segundo quedara vacío, si tu ya lo has enviado lleno, desaparece el problema. Pruebalo y cuentanos

Holaaa, aquí pongo un ejemplo de tres combos dependientes que utilizo en un formulario:




// Al seleccionar country_id se desencade por jquery la action del controller Region -> dinmycregions, recupera las regions del country proporcionado, rellena el combo y lanza un trigger, para que cargue el combo dependiente de este


 <div class="row">

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

            <?php

            echo $form->dropDownList($model, 'country_id', Country::model()->getCountries(), array(

                'empty' => 'Select Country',

                'ajax' => array(

                    'type' => 'POST',

                    'url' => CController::createUrl('region/dinamycregions'),

                    'dataType' => 'json',

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

                    'success' => 'function(data) {

                        console.log(data);

                        $("#Property_region_id").html(data);

                        $("#Property_region_id").trigger("change");

                        return false;

                    }',

                    )));

            ?>

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

        </div>

// combo de regiones, si country_id es distinto de vacío, solicita las regiones de ese country, y si está vacío, este combo también, y lanza otro trigger para el siguiente combo dependiente

        <div class="row">

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

            <?php

            if ($model->country_id == 0 || $model->country_id == '') {

                echo $form->dropDownList($model, 'region_id', array(), array(

                    'empty' => 'Select Region',

                    'ajax' => array(

                        'type' => 'POST',

                        'url' => CController::createUrl('area/dinamycareas'),

                        'dataType' => 'json',

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

                        'success' => 'function(data) {

                        $("#Property_area_id").html(data);

                        $("#Property_area_id").trigger("change");

                        return false;

                    }',

                        )));

            } else {

                $list = Region::model()->getRegionsByCountry($model->country_id);

                echo $form->dropDownList($model, 'region_id', $list, array(

                    'empty' => 'Select Region',

                    'ajax' => array(

                        'type' => 'POST',

                        'url' => CController::createUrl('area/dinamycareas'),

                        'dataType' => 'json',

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

                        'success' => 'function(data){

                            $("#Property_area_id").html(data);

                            $("#Property_area_id").trigger("change");

                            return false;

                        }',

                    )

                ));

            }

            ?>

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

        </div>

// combo de areas, dependiente del combo regions

        <div class="row">

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

            <?php

            if ($model->region_id == 0 || $model->region_id == '') {

                echo $form->dropDownList($model, 'area_id', array(), array(

                    'empty' => 'Select Area',

                    'ajax' => array(

                        'type' => 'POST',

                        'url' => CController::createUrl('zone/dynamiczones2'),

                        'dataType' => 'json',

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

                        'success' => 'function(data) {

                        $("#Property_zone1_id").html(data);

                        $("#Property_zone1_id").trigger("change");

                    }',

                        )));

            } else {

                $list = Area::model()->getAreasByRegion($model->region_id);

                echo $form->dropDownList($model, 'area_id', $list, array(

                    'empty' => 'Select Area',

                    'ajax' => array(

                        'type' => 'POST',

                        'url' => CController::createUrl('zone/dynamiczones2'),

                        'dataType' => 'json',

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

                        'success' => 'function(data) {

                        $("#Property_zone1_id").html(data);

                        $("#Property_zone1_id").trigger("change");

                    }',

                    )

                ));

            }

            ?>

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

        </div>

// Así hasta 6 combos dependientes


// Ejemplo del código en los controllers


public function actionDinamycregions() {

        $criteria = new CDbCriteria();

        $criteria->with = 'RegionLang';

        $criteria->condition = 'country_id=:country_id';

        $criteria->params = array(':country_id' => (int) $_POST['country_id']);

        $criteria->order = 'RegionLang.description';


        $data = Region::model()->activo()->findAll($criteria);

        $data = CHtml::listData($data, 'id', 'RegionLang.description');

        $result = CHtml::tag('option', array('value' => ''), 'Select Region', true);

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

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

        }

        

     	echo CJSON::encode($result);

 }



Bueno, parece que no me estoy dando a entender en mi problemita, les explicare de manera mas detallada. Estoy utilizando multimodel form, en la parte del member form, osea los items, tengo dos dropdowns dependientes.




$memberFormConfig = array(

		      'elements'=>array(

		      	'id_wbs'=>array(

		      		'label'=>CHtml::label( Yii::t('app', 'Bid Item'),'',array(

	        		'onmouseover'=>'js:{$(this).popover("show");}',

	        		'style'=>'display:inline; float:none;',

	        		//'class'=>"icon-comment", 

	        		'data-content'=>Yii::t('app', 'The Bid Item to be assigned the commitment.'),

	        		)),

	      		    'type'=>'dropdownlist',

		            'style'=>'width:230px;',

		        	'items'=>CHtml::listData(Wbs::model()->findAll(array('condition'=>'active=1')), 'id', 'Fullwbs'),

		        	'prompt'=>'Select',

					'class'=>'combosWBS'

		        	),

		      	 

		        'id_csi_code'=>array(

		        		'label'=>CHtml::label( Yii::t('app', 'Pay Item'),'',array(

	        					'onmouseover'=>'js:{$(this).popover("show");}',

	        					'style'=>'display:inline; float:none;',

				        		//'class'=>"icon-comment", 

				        		'data-content'=>Yii::t('app', 'The Pay Item code, description and unit of measure.')

				        	)),

				        'type'=>'dropdownlist',

			        	'prompt'=>'Select',

			        ),



Y una funcion en javascript :




<script type="text/javascript">

	$(document).ready(function(){


		$(".parent-model").on("change",".combosWBS",function(){

			var $combo = $(this).parents("td").next().find("select");

			$combo.prop("disabled", true);

			$.post("<?php echo CController::createUrl('Obtienecsi');?>",{id_wbs:$(this).val()},function(ret){

					$combo.html(ret);

					$combo.prop("disabled", false);

				});

		});

	});


	</script> 



todo esto se encuentra dentro del _form.

y a su ves, este script llama a una funcion en el controlador que ejecuta la consulta de los datos que se mostraran en el cmapo id_csi_code




public function actionObtienecsi()

	{	

		$idwbs=$_POST['id_wbs'];

		

		$sql = Yii::app()->db->createCommand()

		->select('csi_codes.id,CONCAT(csi_codes.csi_code," - ",csi_codes.client_code," - ",csi_codes.unit," - ",csi_codes.descr) as csi')

		->from('csi_codes')

		->leftJoin('v_change_ord_and_det', 'csi_codes.id = v_change_ord_and_det.id_csi_code')

		->leftJoin('bill_of_qtys', 'csi_codes.id = bill_of_qtys.id_csi_code')

		->where('(csi_codes.active = 1 AND (bill_of_qtys.active=1 OR v_change_ord_and_det.active=1) AND (v_change_ord_and_det.id_wbs=:idwbs OR bill_of_qtys.id_wbs=:idwbs))', array(':idwbs'=>$idwbs))

		->group('csi_codes.id')

		->queryAll();

		

		

		$datos = CHtml::listData($sql, 'id', 'csi');

		


		echo CHtml::tag('option',array('value'=>''),'Select',true);

		foreach($datos as $csicode=>$code)

		{

	    	echo CHtml::tag('option',array('value'=>$csicode),CHtml::encode($code),true);

		}

	}



Todo aqui funciona bien al crear, se guarda en la base de datos correctamente y todo.

El problema está que al entrar a editar o update, como quieran llamarlo, el dropdown de id_csi_code me aparece vacio, pero si cambio el tipo de dropdownlist a text, ahi aparece el dato. Entonces, el problema es el dropdownlist, la funcion de javascript? He intentado aplicar lo del video que comento el otro chico pero simplemente no funciona para mi puesto que multimodel funciona diferente.

Espero haberme explicado bien. Muchas gracias! Buenavibra ^_^

Que problema tienes en cargar el segundo dropdow ?

Creo que te he entendido, y que la respuesta es valida, cuando sea update haz que el form cargue los dos…

o modifica tu javascript para que cuando sea update, simule un change del primero, para que vaya a cargar el segundo

Hola, llegaste a la solución??

Seguí este paso a paso y no me funciona.
Qué tengo mal? Ahí está mi duda