Combobox/DropDownList dependiente con permanencia de datos.

Hola a todos. Mucho gusto, soy Vert y… tengo un problema…

El contexto es éste: La página muestra información sobre todos los registros que existen en una tabla de la base de datos y cuenta con un formulario para filtrar la información y se visualicen solo aquellos registros que cumplan con la información que seleccionó el usuario, al aplicar los filtros, el resultado se presenta en la misma página es decir, el GridView se actualiza con la información filtrada y el formulario que también se muestra debe presentar la información seleccionada anteriormente por el usuario.

El problema está en el contenido del formulario. Entre los elementos que se muestra en el formulario, existen dos dropdownlist (combobox) dependientes, uno maestro y otro esclavo. En el flujo de la página, al refrescar la página una vez aplicados los filtros, el dropdownlist esclavo debería mantener dos cosas, uno: la opción elegida por el usuario y dos: la lista completa de elementos según la opción elegida del dropdownlist maestro.

Eso es lo que no logro, toda la página funciona correctamente menos ese elemento. La dependencia de los combos está implementada en ajax. Les presento el código:

Vista:


(!empty($_GET['tipo_usuario']))? $tu=$_GET['tipo_usuario'] : $tu=null; //To get the selected data

echo CHtml::dropDownList('tipo_usuario',$tu, array([cliente] => 'Usuario de Internet', [proveedor_privado] => 'Proveedor Sector Comercial', [proveedor_publico] => 'Proveedor Sector Público y Social'), 

   array(

        'empty'=>'Tipo de usuario...', 

        'ajax' => array(

                   'type'=>'POST',

                   'url'=>CController::createUrl('adminPanel/dynamicList'),

                   'update'=>'#categoria',

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

                ),

        'style'=>'width:30%',

   ));

(!empty($_GET['categoria']))? $cat=$_GET['categoria'] : $cat=array();

echo CHtml::dropDownList('categoria',$cat,array(),array('empty' => 'Categoria...', 'style'=>'width:30%', 'disabled'=>false));



Controlador:




public function actionDynamicList()

{

   if(Yii::app()->request->isAjaxRequest)

   {

        echo CHtml::tag('option',array('value'=>''),CHtml::encode('Categoria...'),true);

        if($_POST['tipo_usuario']=='proveedor_privado')

        {

                echo CHtml::tag('option', array('value'=>1), CHtml::encode('Cat 1'), true);

                echo CHtml::tag('option', array('value'=>1), CHtml::encode('Cat 2'), true);

                echo CHtml::tag('option', array('value'=>1), CHtml::encode('Cat 3'), true);

        }else if($_POST['tipo_usuario']=='proveedor_publico'])

        {

                echo CHtml::tag('option', array('value'=>1), CHtml::encode('Cat 4'), true);

                echo CHtml::tag('option', array('value'=>1), CHtml::encode('Cat 5'), true);

                echo CHtml::tag('option', array('value'=>1), CHtml::encode('Cat 6'), true);

        }

   }

}



Podría alguien ayudarme? Se lo agradeceré mucho!

¡Solucionado!

Lo que se hizo fue llenar el arreglo de elementos desde una función que dependiendo de la información del GET provea uno u otro arreglo.

Vista:




(!empty($_GET['tipo_usuario']))? $tu=$_GET['tipo_usuario'] : $tu=null;

echo CHtml::dropDownList('tipo_usuario',$tu, array([cliente] => 'Usuario de Internet', [proveedor_privado] => 'Proveedor Sector Comercial', [proveedor_publico] => 'Proveedor Sector Público y Social'), 

   array(

        'empty'=>'Tipo de usuario...', 

        'ajax' => array(

                   'type'=>'POST',

                   'url'=>CController::createUrl('adminPanel/dynamicList'),

                   'update'=>'#categoria',

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

                ),

        'style'=>'width:30%',

   ));

(!empty($_GET['categoria']))? $cat=$_GET['categoria'] : $cat=array();

$id=null;

if(!empty($_GET['tipo_usuario'])){

	if($_GET['tipo_usuario']==$keys['2']) $id=1;

	else if($_GET['tipo_usuario']==$keys['3']) $id=2;

	else $id=0;

}

echo CHtml::dropDownList('categoria',$cat,$this->getCategory($id),array('empty' => 'Categoria...', 'style'=>'width:30%', 'disabled'=>false));



Controlador:




public function actionDynamicList()

{

   if(Yii::app()->request->isAjaxRequest)

   {

        echo CHtml::tag('option',array('value'=>''),CHtml::encode('Categoria...'),true);

        if($_POST['tipo_usuario']=='proveedor_privado')

        {

                echo CHtml::tag('option', array('value'=>1), CHtml::encode('Cat 1'), true);

                echo CHtml::tag('option', array('value'=>2), CHtml::encode('Cat 2'), true);

                echo CHtml::tag('option', array('value'=>3), CHtml::encode('Cat 3'), true);

        }else if($_POST['tipo_usuario']=='proveedor_publico'])

        {

                echo CHtml::tag('option', array('value'=>4), CHtml::encode('Cat 4'), true);

                echo CHtml::tag('option', array('value'=>5), CHtml::encode('Cat 5'), true);

                echo CHtml::tag('option', array('value'=>6), CHtml::encode('Cat 6'), true);

        }

   }

}


public function getCategory($id)

{

	$options=null;

	if($id>0)

	{

		if($id==1)$rows = Yii::app()->db->createCommand(array(

		{

			$options[1]='Cat 1';

	                $options[2]='Cat 2';

        	        $options[3]='Cat 3';

		}else if(id=2)'where'=> 'tipo_categoria='.$id,

		{

			$options[4]='Cat 4';

	                $options[5]='Cat 5';

        	        $options[6]='Cat 6';

		}

		return $options;

	}else

		return array();

}



Saludos!