Problemas con AJAX

Hola,

estoy realizando ejemplos de uso de Ajax en Yii pero no se que pasa que ningún ejemplo me funciona, es como si no realizase las llamadas de AJAX, ni errores ni nada de nada, simplemente no pasa nada.

Me estoy basando en: http://www.yiiframework.com/doc/cookbook/24/

Tengo instalado las siguientes versiones:

Apache/2.2.13 (Win32) DAV/2 PHP/5.3.0 Yii Framework/1.0.10 contra MySQL 5.1.38.

Voy a poner ejemplo del código de 2 combos, uno depende del otro (El combo 1 es de provincias y se inicializa con los datos de BBDD y el segundo combo son los municipios según la provincia seleccionada, este es el que no hace nada).

En el controlador tengo estas dos funciones:





	/**

	 * This is the default 'index' action that is invoked

	 * when an action is not explicitly requested by users.

	 */

	public function actionIndex()

	{

            //El primer combo se carga bien de los datos que recojo de BBDD.

            $provincias=Provincias::model()->findAll();

            $lista_provincias=CHtml::listData($provincias,'id','nombre');


            $this->render('infoGeografica', array(

                    'lista_provincias'=>$lista_provincias,

            ));

	}


	public function actionCargarmunicipios()

	{

            //He comentado esta parte ya que no funcionaba y simplemente haga la carga del combo de forma estática con dos elementos.

            /*

	    $municipios=Municipios::model()->findAll('id=:id', array(

	    	':id'=>(int) $_POST['combo_provincias'])

	    );

	    $lista_municipios=CHtml::listData($municipios,'id','nombre');


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

	    {

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

	    }

             */

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

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

	}




La función index es la que se carga por defecto y la segunda es la acción a la que debería llamar Ajax.

Ahora pongo la vista que tengo dentro de la carpeta correspondiente:





<h2>Información Geográfica</h2>


<?php

echo CHtml::dropDownList('combo_provincias','', $lista_provincias, array(

    //'prompt'=>'Seleccione...',

    'ajax' => array(

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

        //'url'=>'/yii/aurora/index.php?r=infoGeografica/cargarmunicipios', //url to call

        'url'=>'cargarmunicipios', //url to call

        'update'=>'#combo_municipios', //selector to update

        //'data'=>'js:javascript statement',

        //leave out the data key to pass all form values through

        )

    )

);

?>


<?php

//empty since it will be filled by the other dropdown

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

?>




También he realizado el ejemplo de Hello World (http://www.yiiframework.com/doc/cookbook/49/) y no pasa nada, no se actualiza la variable $myValue.

¿Sabéis que puede pasar? En el FireBug no veo nada ni en el Xdebug de NetBeans…

Puede que se me haya olvidado alguna cosa básica.

Saludos y gracias por adelantado.





	public function actionCargarmunicipios()

	{

            //He comentado esta parte ya que no funcionaba y simplemente haga la carga del combo de forma estática con dos elementos.

            /*

	    $municipios=Municipios::model()->findAll('id=:id', array(

	    	':id'=>(int) $_POST['combo_provincias'])

	    );

	    $lista_municipios=CHtml::listData($municipios,'id','nombre');


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

	    {

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

	    }

             */

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

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

	}



El problema está ahi arriba, tenés que hacer un echo al chtml tag para que funcione

Saludos,

Vaya tela…

Era eso, muchas gracias Sebas se me había pasado por completo y me he obcecado en otras cosas…

Gracias!!

Ahora voy a introducir valores desde la BD según el id del primer combo. Según he leído yo he puesto lo siguiente:




    public function actionCargarmunicipios()

    {


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

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


        $municipios=Municipios::model()->findAll('id_provincia=:id', array(

            ':id'=>(int) $_POST['combo_provincias'])

        );

        $lista_municipios=CHtml::listData($municipios,'id','nombre');


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

        {

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

        }

        

    }



La pregunta es:

¿Qué tengo mal en los parámetros del findAll?

    &#036;municipios=Municipios::model()-&gt;findAll('id_paren=:id_parent', array(


        ':id_parent'=&gt;(int) &#036;_POST['country_id'])


    );

los parámetros de findAll los construyo así:




findAll('id_provincia=:id', array(':id'=>(int) $_POST['combo_provincias'])



Imagino que está mal el campo de $_POST. ¿qué hay que poner en este campo? Imagino que por POST que es lo que tengo puesto en la llamada de Ajax recojo el id que se ha puesto en el combo 1.

La relación que tengo en BD es:

Tabla provincias:


id

nombre

Table municipios:


id

nombre

id_provincia (es la FK que relaciona con la tabla provincias).

Saludos y gracias por adelantado.

no se porqué pero dice idparen en vez de idparent en el pedido a la base… eso esta ok?

Pues esa línea era la del ejemplo y yo la he cambiado por:




$municipios=Municipios::model()->findAll('id_provincia=:id', array(

':id'=>1));



Y me carga todos los municipios con id_provincia=1.

Lo que me falta es como recoger el valor del id seleccionado en el primer combo (recogido por $_POST). Es usando algo del estilo:




$municipios=Municipios::model()->findAll('id_provincia=:id', array(

':id'=>(int) $_POST['combo_provincias']['id']));



Pero no soy capaz de ver que parámetro exactamente engo que recoger del POST.

El código del primer combo de la vista es:




<?php

echo CHtml::dropDownList('combo_provincias','', $lista_provincias, array(

    'prompt'=>'Seleccione...',

    'ajax' => array(

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

        'url'=>CController::createUrl('infoGeografica/cargarmunicipios'),

        'update'=>'#combo_municipios', //selector to update

        //'data'=>'js:javascript statement',

        //leave out the data key to pass all form values through

        )

    )

);

?>



Saludos.

Bueno,

ya he solucionado el tema.

El problema era que no enviaba nada por POST porque no había puesto los tags de formulario.

Os dejo la solución de como lo he montado:

Controlador:




    public function actionIndex()

    {


        $provincias=Provincias::model()->findAll();

        $lista_provincias=CHtml::listData($provincias,'id','nombre');


        // renders the view file 'protected/views/site/index.php'

        // using the default layout 'protected/views/layouts/main.php'

        $this->render('infoGeografica', array(

                'lista_provincias'=>$lista_provincias,

        ));

    }


    public function actionCargarmunicipios()

    {


        $municipios=Municipios::model()->findAll('id_provincia=:id', array(

            ':id'=>(int) $_POST['combo_provincias'])

        );

        

        $lista_municipios=CHtml::listData($municipios,'id','nombre');


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

        {

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

        }

  

    }



Vista:




<h2>Información Geográfica</h2>


<?php echo CHtml::beginForm(); ?>


<?php

echo CHtml::dropDownList('combo_provincias','', $lista_provincias, array(

    'prompt'=>'Seleccione...',

    'ajax' => array(

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

        'url'=>CController::createUrl('infoGeografica/cargarmunicipios'),

        'update'=>'#combo_municipios', //selector to update

        //'data'=>'js:javascript statement',

        //leave out the data key to pass all form values through

        )

    )

);

?>


<?php

//empty since it will be filled by the other dropdown

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

?>


<?php echo CHtml::endForm(); ?>



Recuerdo que tengo dos tablas que tienen un id cada una y se relacionan por la clave foránea.

La relación que tengo en BD es:

Tabla provincias:


id

nombre

Table municipios:


id

nombre

id_provincia (es la FK que relaciona con la tabla provincias).

Donde he tenido que hacer más pruebas ha sido con esto:




        $municipios=Municipios::model()->findAll('id_provincia=:id', array(

            ':id'=>(int) $_POST['combo_provincias'])

        );



la primera parte del findAll ponemos la relación, es decir, municipios.id_provincia=provincia.id y en la segunda parte ponemos el criterio por el que filtra en la consulta, en este caso provincia.id=valor que viene del elemento seleccionado del combo. Para relacionar la relación y el criterio usamos un nombre temporal de identificador, en este caso le he llamado id (:id).

Es decir que sería algo de este estilo:

Relación: ‘id_provincia=:nombre_temporal_identificador’

Criterio: ‘:nombre_temporal_identificador’=valor_venido_del_1er_combo

Al final lo junta y quedaría internamente en la consulta el WHERE ‘id_provincia=valor_venido_del_1er_combo’

Saludos y gracias.

Buenas, he seguido practicamente al pie de la letra las instrucciones, que pusieron pero por algun motivo no realiza absolutamente nada; ni siquiera ingresa al metodo, a la hora de cambiar la eleccion en el combo . mi codigo es el siguiente:

vista del cliente

//el metodo getProvincia carga los datos del combo desde un metodo que se encuentra en el modelo Provincia

<?php echo CHtml::DropDownList(‘combo_provincias’,’’, Provincia::model()->getProvincias(), array(

  'prompt'=&gt;'Seleccione...', 'ajax' =&gt; array(


      'type'=&gt;'POST', //request type


      'url'=&gt;'cliente/cargarCantones',


      'update'=&gt;'#combo_cantones', //selector to update


      )


  )

);

echo CHtml::dropDownList(‘combo_cantones’,’’, array());

?>

Controlador del cliente

public function actionCargarCantones()

{

//Esto lo puse para comprobar que el error no se encontraba en el metodo, ya q si realiza la redireccion es por q’ entra al metodo

 /* &#036;this-&gt;render('reportes'); */             


 &#036;criteria=new CDbCriteria;


 &#036;criteria-&gt;condition=&quot;IDProvincia=&quot;.&#036;_POST['IDProvincia'];


 &#036;municipios=Canton::model()-&gt;findAll(&#036;criteria);


  


 &#036;lista_canton=CHtml::listData(&#036;municipios,'IDCanton','Nombre');


 foreach(&#036;lista_canton as &#036;value=&gt;&#036;name)


 {


     echo CHtml::tag('option', array('value'=&gt;&#036;value) ,CHtml::encode(&#036;name), true);


 }

}

Modelo de la provincia

public function getProvincias(){

 &#036;provincias=Provincia::model()-&gt;findAll();


 return CHtml::listData(&#036;provincias,'IDProvincia','Nombre');

}

Les agradesco cualquier ayuda que me puedan suministrar al respeto

En la vista tienes puestos los tags de formulario?

Qué es lo que te pasa exactamente?

PD: perdona pero no había visto antes este post.