Yii Framework Forum: Problemas con AJAX - Yii Framework Forum

Jump to content

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

Problemas con AJAX Apache/2.2.13 (Win32) DAV/2 PHP/5.3.0 Yii Framework/1.0.10 Rate Topic: -----

#1 User is offline   Sagitta 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 63
  • Joined: 05-November 09

Posted 05 November 2009 - 06:32 AM

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.yiiframew...oc/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.yiiframew...oc/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.
0

#2 User is offline   sebas 

  • Advanced Member
  • Yii
  • Group: Yii Dev Team
  • Posts: 498
  • Joined: 28-October 08
  • Location:Buenos Aires, Argentina

Posted 05 November 2009 - 07:26 AM


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

#3 User is offline   Sagitta 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 63
  • Joined: 05-November 09

Posted 05 November 2009 - 09:37 AM

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?

$municipios=Municipios::model()->findAll('id_paren=:id_parent', array(
':id_parent'=>(int) $_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.
0

#4 User is offline   sebas 

  • Advanced Member
  • Yii
  • Group: Yii Dev Team
  • Posts: 498
  • Joined: 28-October 08
  • Location:Buenos Aires, Argentina

Posted 05 November 2009 - 10:29 AM

View PostSagitta, on 05 November 2009 - 09:37 AM, said:

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?

$municipios=Municipios::model()->findAll('id_paren=:id_parent', array(
':id_parent'=>(int) $_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?
0

#5 User is offline   Sagitta 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 63
  • Joined: 05-November 09

Posted 05 November 2009 - 11:43 AM

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

#6 User is offline   Sagitta 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 63
  • Joined: 05-November 09

Posted 05 November 2009 - 02:53 PM

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.

This post has been edited by Sagitta: 07 November 2009 - 07:42 AM

0

#7 User is offline   serpe 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 2
  • Joined: 16-February 10

Posted 16 February 2010 - 10:29 AM

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'=>'Seleccione...', 'ajax' => array(
'type'=>'POST', //request type
'url'=>'cliente/cargarCantones',
'update'=>'#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
/* $this->render('reportes'); */
$criteria=new CDbCriteria;
$criteria->condition="IDProvincia=".$_POST['IDProvincia'];
$municipios=Canton::model()->findAll($criteria);

$lista_canton=CHtml::listData($municipios,'IDCanton','Nombre');
foreach($lista_canton as $value=>$name)
{
echo CHtml::tag('option', array('value'=>$value) ,CHtml::encode($name), true);
}
}

Modelo de la provincia
public function getProvincias(){
$provincias=Provincia::model()->findAll();
return CHtml::listData($provincias,'IDProvincia','Nombre');
}

Les agradesco cualquier ayuda que me puedan suministrar al respeto
0

#8 User is offline   Sagitta 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 63
  • Joined: 05-November 09

Posted 07 March 2010 - 12:15 PM

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