DropDownLists dependientes

Hola a todos!

Estaba viendo un manual en inglés, "Yii. A brief introduction for greenhorns", y me topé con esto e intenté incorporarlo a mi proyecto.

Supongamos que tengo un modelo Hotel y un modelo Servicios.

En el primer DropDown selecciono el nombre del hotel y en el segundo deberían aparecer los servicios del mismo (tengo una relación HasMany).

Solo puedo lograr que aparezcan los nombres de los hoteles pero no los de los servicios, con lo cual supongo que no está llamando a la acción del controlador.

Les dejo el código del pdf que he estado probando:




echo CHtml::dropDownList('country','',array(1=>'has value I',2=>'has value II'),

  array(

    'ajax' =>

    array(

    'type'=>'POST', //request type

    'url'=>CController::createUrl('myActionName'), //action to call

    'update'=>'#updatedDropDownList', // which HTML element to update

    )

));

echo CHtml::dropDownList('updatedDropDownList','',array(), array());



y




public function actionMyActionName()

{

  $countryID = $_POST[‘country’]; // IMPORTANT .. this is how you access previously entered data

  $listOfCities = getCitiesOfState($countryID);

  foreach ($listOfCities as $city)

  {

    echo CHtml::tag('option', // tagname

    array('value'=>$cityID), // html params of tag

    $cityName, // value from the item selected in the first dropdown is in the POST array

    true // close tag

    );

  }

}



Espero su ayuda!

GRACIAS!

Hola migue… esto no se ve tan difícil como parece… aunque creo que al código que presentas le faltan cosas… mira a lo que me refiero y como lo completaría…


echo CHtml::dropDownList('country','',array(1=>'has value I',2=>'has value II'),

  array(

    'ajax' =>

    array(

    'type'=>'POST', //request type

    'data'=>array('YII_CSRF_TOKEN'=>''.Yii::app()->request->csrfToken, 'country'=>'js:$(this).serialize()'),

    'url'=>CController::createUrl('myActionName'), //action to call

    'update'=>'#updatedDropDownList', // which HTML element to update

    )

));

echo CHtml::dropDownList('updatedDropDownList','',array(), array());

Si te fijas… yo he agregado a los parametros de ajax… la clave data y he puesto un dato muy importante… el CSRF … Ocurre que cuando haces peticiones vía ajax utilizando el método POST … yii automáticamente verifica que la petición sea válida y esto lo hace mediante YII_CSRF_TOKEN …

El resto parece estar bien… de hecho lo he probado con uno de mis modelos y mas o menos quedó así:


public function actionMyActionName()

{

  //$countryID = $_POST[‘country’]; // IMPORTANT .. this is how you access previously entered data

  $listOfUsers = Usuarios::model()->findAll();

  foreach ($listOfUsers as $usuario)

  {

	echo CHtml::tag('option', // tagname

	array('value'=>$usuario->username), // html params of tag

	$usuario->username, // value from the item selected in the first dropdown is in the POST array

	true // close tag

	);

  }

}

Fíjate que se supone que debería de recibirse $_POST[‘country’]; … pero tampoco se ve que se envíe desde el dropdownlist… entonces también por ahí lo agregué… y está en la misma línea de data:{…}

Espero esto te ilumine y tengas una mejor idea de como lo hicieron o como debería de funcionar…

Saludos

Gracias por tu respuesta, Jack!

Como dije, sigo teniendo problemas con el segundo DropDown, en donde quiero mostrar (he cambiado) las habitaciones que tiene cargadas un hotel.

Muestro mi código ya que tal vez lo estoy adaptando muy mal:

(en la vista)




$hoteles=Hotel::model()->findAll();

$lista=array();

foreach($hoteles as $hotel)

	$lista[$hotel->id]=$hotel->nombre;

echo CHtml::dropDownList('hotel','',$lista,

  array(

	'ajax' =>

	array(

	'type'=>'POST', //request type

	'data'=>array('YII_CSRF_TOKEN'=>''.Yii::app()->request->csrfToken, 'hotel'=>'js:$(this).serialize()'),

	'url'=>CController::createUrl('myActionName'), //action to call

	'update'=>'#updatedDropDownList', // which HTML element to update

	)

));

echo '</br></br>';

echo CHtml::dropDownList('updatedDropDownList','',array(), array());



(en el controlador)




public function actionMyActionName()

{

	$habitaciones=Habitacion::model()->findAllByAttributes(array('idHotel'=>$_POST['hotel']));

	foreach ($habitaciones as $habitacion)

	{

		echo CHtml::tag('option', // tagname

		array('value'=>$habitacion->tipo), // html params of tag

		$habitacion->tipo, // value from the item selected in the first dropdown is in the POST array

		true // close tag

		);

	}

}




Pues el código parece estar bien… o al menos a simple vista es lo que creo…!!

Algo que puedes hacer extra es revisar si tu usuario tiene permisos para acceder a la action MyActionName …

verifica que tipo de error ocurre utilizando la consola de errores de chrome o firebug en ffox…

Acabo de realizar el mismo ejercce poco y me basé en éste wiki, que sí funcionó Dependent Drowpdownlist

Recuerda que en tu lista de regas del controlador debes tener enlistado el nombre de la acción ‘myActionName’.

Sigo sin poder ver las opciones de las habitaciones correspondientes a los hoteles en el segundo DropDownList ???

Vert, si tenés tu código funcionando, me podrías pasar por favor el fragmento como para probarlo, o decirme cómo se puede adaptar a esto de los hoteles?

He probado añadiendo


	

'enableAjaxValidation'=>true,

'enableClientValidation'=>true,

y nada…

Otras ideas?

Puedes revisar la consola de errores de javascript, ahi puede estar el motivo por el cual no esta funcionando…

Gracias, aqui encontre algo que me funciona. Saludos