Yii Framework Forum: DropDownLists dependientes mantener valores - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

DropDownLists dependientes mantener valores Rate Topic: -----

#1 User is offline   sgonzalezmo 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 5
  • Joined: 11-June 12

Posted 22 June 2012 - 06:34 AM

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.
0

#2 User is offline   Osiris 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 4
  • Joined: 22-May 12

Posted 01 July 2012 - 07:57 PM

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
0

#3 User is offline   nafta 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 1
  • Joined: 05-October 12

Posted 05 October 2012 - 10:02 PM

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
0

#4 User is offline   Arely 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 21
  • Joined: 15-February 13

Posted 05 March 2013 - 01:15 PM

View Postnafta, on 05 October 2012 - 10:02 PM, said:

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!
0

#5 User is offline   stilomio 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 45
  • Joined: 04-June 12

Posted 05 March 2013 - 01:34 PM

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
0

#6 User is offline   stilomio 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 45
  • Joined: 04-June 12

Posted 05 March 2013 - 01:34 PM

View PostArely, on 05 March 2013 - 01:15 PM, said:

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
0

#7 User is offline   stilomio 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 45
  • Joined: 04-June 12

Posted 05 March 2013 - 01:37 PM

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

http://www.yiiframew...panol.org/foro/

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

#8 User is offline   Arely 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 21
  • Joined: 15-February 13

Posted 05 March 2013 - 03:09 PM

View Poststilomio, on 05 March 2013 - 01:37 PM, said:

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

http://www.yiiframew...panol.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:
0

#9 User is offline   Miguel Garcia 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 28
  • Joined: 06-November 12

Posted 06 March 2013 - 03:00 AM

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
0

#10 User is offline   Arely 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 21
  • Joined: 15-February 13

Posted 06 March 2013 - 10:31 AM

View PostMiguel Garcia, on 06 March 2013 - 03:00 AM, said:

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.
0

#11 User is offline   Miguel Garcia 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 28
  • Joined: 06-November 12

Posted 07 March 2013 - 10:51 AM

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
0

#12 User is offline   safitanet 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 44
  • Joined: 04-August 11

Posted 08 March 2013 - 03:02 AM

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);
 }

0

#13 User is offline   Arely 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 21
  • Joined: 15-February 13

Posted 08 March 2013 - 01:04 PM

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 ^_^
0

#14 User is offline   Miguel Garcia 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 28
  • Joined: 06-November 12

Posted 09 March 2013 - 05:03 AM

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
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users