Ajax Actualizar 2 Dropdownlist

Hola compañeros, antes de empezar, daros las gracias y deciros que apenas conozco Ajax.

Mi problema…

Tengo 2 dropDownList los cuales se actualizan por ajax y la variable que mandan, se debe guardar en base de datos, pero hay algo que tengo mal, por que no se me ejecuta una de las acciones

En la vista




array(

            'name'=>'status',

            'filter'=>false,

            'type'=>'raw',

            'value'=>'CHtml::dropDownList($data->ID, $data->status, 

                                            array("0"=>"Preinscrito", "1"=>"Inscrito", "2"=>"Denegado"),

                                            array(

                                                "data-id" => "$data->ID",

                                                "style"=>"width: 100%;padding: 0.2em! important; margin-bottom: 0;",

                                                "ajax" => array(

                                                            "type"=>"POST", 

                                                            "url"=>Yii::app()->createUrl("inscripcion/changestatus"),

                                                            "data"=>array(

                                                                    "id"=>"js:this.id",

                                                                    "value"=>"js:this.value"

                                                            ),

                                                            "success"=>"js:function(){\$.fn.yiiGridView.update(\"inscripciones\");}"

                                                )

                                            )

                    )',

            'headerHtmlOptions'=>array(

                'style'=>'width:10%;text-align:center !important;',

            ),

            'htmlOptions'=>array(

                'style'=>'width:10%;text-align:center !important;',

            ),

        ),

        

        array(

            'name'=>'avisado',

            'filter'=>false,

            'type'=>'raw',

            'value'=>'CHtml::dropDownList($data->ID, $data->avisado, 

                                            array("0"=>"No","1"=>"Si"),

                                            array(

                                                "data-id" => "$data->ID",

                                                "style"=>"width: 100%;padding: 0.2em! important; margin-bottom: 0;",

                                                "ajax" => array(

                                                            "type"=>"POST", 

                                                            "url"=>Yii::app()->createUrl("inscripcion/changeenable"),

                                                            "data"=>array(

                                                                    "id"=>"js:this.id",

                                                                    "value"=>"js:this.value"

                                                            ),

                                                            "success"=>"js:function(){\$.fn.yiiGridView.update(\"inscripciones\");}"

                                                )

                                            )

                    )',

            'headerHtmlOptions'=>array(

                'style'=>'width:8%;text-align:center !important;',

            ),

            'htmlOptions'=>array(

                'style'=>'width:8%;text-align:center !important;',

            ),

        ),



En el Controlador




	public function actionChangeStatus()

	{	


		$model = AlumnoCurso::model()->findByPK($_POST["id"]);

		

		$model->status = $_POST["value"];

		

		$model->save();

	}


	

	public function actionChangeEnable()

	{	

		$model = AlumnoCurso::model()->findByPK($_POST["id"]);

		

		$model->avisado = $_POST["value"];

		

		$model->save();

	}



El modelo




class AlumnoCurso extends CActiveRecord

{

	/**

	 * Returns the static model of the specified AR class.

	 * @param string $className active record class name.

	 * @return AlumnoCurso the static model class

	 */

	public static function model($className=__CLASS__)

	{

		return parent::model($className);

	}


	/**

	 * @return string the associated database table name

	 */

	public function tableName()

	{

		return 'alumno_curso';

	}


	/**

	 * @return array validation rules for model attributes.

	 */

	public function rules()

	{

		// NOTE: you should only define rules for those attributes that

		// will receive user inputs.

		return array(

			array('alumnoID, cursoID, date', 'required'),

			array('alumnoID, cursoID, status', 'numerical', 'integerOnly'=>true),

			// The following rule is used by search().

			// Please remove those attributes that should not be searched.

			array('ID, alumnoID, cursoID, status', 'safe', 'on'=>'search'),

		);

	}


	/**

	 * @return array relational rules.

	 */

	public function relations()

	{

		// NOTE: you may need to adjust the relation name and the related

		// class name for the relations automatically generated below.

		return array(

			'alumno' => array(self::BELONGS_TO, 'Alumno', 'alumnoID'),

			'curso' => array(self::BELONGS_TO, 'Curso', 'cursoID'),

			'date' => array(self::BELONGS_TO, 'Alumno', 'alumnoID'),


		);

	}


	/**

	 * @return array customized attribute labels (name=>label)

	 */

	public function attributeLabels()

	{

		return array(

			'ID' => 'ID',

			'alumnoID' => 'Alumno',

			'cursoID' => 'Curso',

			'status' => 'Estado',

			'date' => 'Fecha',

			'avisado'=>'Avisado',

		);

	}


	/**

	 * Retrieves a list of models based on the current search/filter conditions.

	 * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.

	 */

	public function search()

	{

		// Warning: Please modify the following code to remove attributes that

		// should not be searched.


		$criteria=new CDbCriteria;


		$criteria->compare('ID',$this->ID);

		$criteria->compare('alumnoID',$this->alumnoID);

		$criteria->compare('cursoID',$this->cursoID);

		$criteria->compare('status',$this->status);

		$criteria->compare('date',$this->date);

		$criteria->compare('avisado',$this->avisado);

		

		if(Yii::app()->user->role == "consultant"):

			$email = Yii::app()->user->username;

			$consultoraID = Consultant::model()->findByAttributes(array("email" => $email))->ID;

			$criteria->join='INNER JOIN curso ON cursoID = curso.ID';                          

			$criteria->condition = "curso.consultoraID = :consultoraID";

			$criteria->params = array(':consultoraID' => $consultoraID);

		endif;


		return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

			'sort' => array(

	            'defaultOrder' => 'status ASC, ID DESC',

	        ),

			'pagination'=>array(

		        'pageSize'=>50,

		    ),

		));

	}



Agradezco cualquier ayuda, si necesitáis más información para poder ayudarme pedirmela, no he pegado todo el código, porque creo que no es necesario.

Es un poco difícil de responder si poder probar el código.

¿Cuál es la función que decís que no llama?

¿No probaste con Firebug, a ver si te tira alguna pista?

En la solapa de RED, podés chequear las consultas que se hacen vía AJAX, y te dice si hay un error o algo.

Por otro lado, veo que estás haciendo un sistema de alumnos/cursos…

Me interesa saber más! :)

¿Es un trabajo para un cliente o un proyecto tuyo?

Saludos!

Gracias por respoder Luciano, como ya te dije apenas conozco Ajax, asi que si me equivoco corrigeme…

Hasta que yo implemente el segundo dropDownList, el primero funcionaba perfectamente.




array(

            'name'=>'status',

            'filter'=>false,

            'type'=>'raw',

            'value'=>'CHtml::dropDownList($data->ID, $data->status, 

                                            array("0"=>"Preinscrito", "1"=>"Inscrito", "2"=>"Denegado"),

                                            array(

                                                "data-id" => "$data->ID",

                                                "style"=>"width: 100%;padding: 0.2em! important; margin-bottom: 0;",

                                                "ajax" => array(

                                                            "type"=>"POST", 

                                                            "url"=>Yii::app()->createUrl("inscripcion/changestatus"),

                                                            "data"=>array(

                                                                    "id"=>"js:this.id",

                                                                    "value"=>"js:this.value"

                                                            ),

                                                            "success"=>"js:function(){\$.fn.yiiGridView.update(\"inscripciones\");}"

                                                )

                                            )

                    )',

            'headerHtmlOptions'=>array(

                'style'=>'width:10%;text-align:center !important;',

            ),

            'htmlOptions'=>array(

                'style'=>'width:10%;text-align:center !important;',

            ),

        ),



lo que hace la linea


"url"=>Yii::app()->createUrl("inscripcion/changestatus"),

Es ejecutar la accion, actionChangeStatus, la cual filtra por "id" y guarda en la base de datos el campo "value"




 public function actionChangeStatus()

        {       


                $model = AlumnoCurso::model()->findByPK($_POST["id"]);

                

                $model->status = $_POST["value"];

                

                $model->save();

        }



Eso es lo que había, yo lo que he echo es lo mismo, pero llamando a otra accion

En la vista




array(

            'name'=>'avisado',

            'filter'=>false,

            'type'=>'raw',

            'value'=>'CHtml::dropDownList($data->ID, $data->avisado, 

                                            array("0"=>"No","1"=>"Si"),

                                            array(

                                                "data-id" => "$data->ID",

                                                "style"=>"width: 100%;padding: 0.2em! important; margin-bottom: 0;",

                                                "ajax" => array(

                                                            "type"=>"POST", 

                                                            "url"=>Yii::app()->createUrl("inscripcion/changeenable"),

                                                            "data"=>array(

                                                                    "id"=>"js:this.id",

                                                                    "value"=>"js:this.value"

                                                            ),

                                                            "success"=>"js:function(){\$.fn.yiiGridView.update(\"inscripciones\");}"

                                                )

                                            )

                    )',

            'headerHtmlOptions'=>array(

                'style'=>'width:8%;text-align:center !important;',

            ),

            'htmlOptions'=>array(

                'style'=>'width:8%;text-align:center !important;',

            ),

        ),



Y en el controlador




public function actionChangeEnable()

        {       

                $model = AlumnoCurso::model()->findByPK($_POST["id"]);

                

                $model->avisado = $_POST["value"];

                

                $model->save();

        }



Lo que he descubierto usando el firebug, es que, por algún motivo, el primer Dropdownlist el de status, no utiliza la acción que yo le digo, está usando la acción "actionChangeEnable"

El cliente al final lo que quieres es que funcione, le da lo mismo como, con esto quiero decir que si conocéis algún otro método, estaré encantado de implementarlo :D

Respondiendo a tu pregunta Luciano es un proyecto de un cliente, pero cuando termine de hacerla, no me importaría colgar el código, para que la gente pueda utilizarlo.

En javascript no puede haber 2 elementos con el mismo id y los 2 dropdowList tienen el mismo id.

Debes diferenciarlos, y entonces deberían funcionar ambos.

Un saludo.

rahif gracias por tu respuesta, le estado dando vueltas, y no se como cambiarle el ID, porque el script esta cogiendo el $data->ID que es el id del usuario, que a su vez esta haciendo de id y name del input.




'value'=>'CHtml::dropDownList($data->ID, $data->avisado, 

                                            array("0"=>"No","1"=>"Si"),

                                            array(

                                                "data-id" => "$data->ID",

                                                "style"=>"width: 100%;padding: 0.2em! important; margin-bottom: 0;",

                                                "ajax" => array(

                                                            "type"=>"POST", 

                                                            "url"=>Yii::app()->createUrl("inscripcion/changeenable"),

                                                            "data"=>array(

                                                                    "id"=>"js:this.id",

                                                                    "value"=>"js:this.value"

                                                            ),

                                                            "success"=>"js:function(){\$.fn.yiiGridView.update(\"inscripciones\");}"

                                                )

                                            )

                    )',



Como puedo cambiar el ID, y pasarle al ajax el ID del usuario y el valor?

Prueba con esto:




'value'=>'CHtml::dropDownList("avisado".$data->ID, $data->avisado, 

	array("0"=>"No","1"=>"Si"),

	array(

		"data-id" => "$data->ID",

		"style"=>"width: 100%;padding: 0.2em! important; margin-bottom: 0;",

		"ajax" => array(

					"type"=>"POST", 

					"url"=>Yii::app()->createUrl("inscripcion/changeenable"),

					"data"=>array(

							"id"=>"$data->ID",

							"value"=>"js:this.value"

					),

					"success"=>"js:function(){\$.fn.yiiGridView.update(\"inscripciones\");}"

		)

	)

)',



Mira a ver si el valor de id lo toma bien js, el value es el mismo si funciona no te dará error pero tampoco cambiará el valor, te falta otra cosa:




public function rules()

{

	// NOTE: you should only define rules for those attributes that

	// will receive user inputs.

	return array(

		array('alumnoID, cursoID, date', 'required'),

		array('alumnoID, cursoID, status', 'numerical', 'integerOnly'=>true),

		array('avisado', 'in', 'range'=>array('0','1')),

		// The following rule is used by search().

		// Please remove those attributes that should not be searched.

		array('ID, avisado,alumnoID, cursoID, status', 'safe', 'on'=>'search'),

	);

}



Mira a ver si te funciona y si no cual es el problema,

Perfecto compañeros, ya no hay ningun problema, no voy a resubir el codigo, porque creo que esta muy clarito arriba, pero si alguien lo quiere, que me lo pida.

Un saludo y muchas gracias rahif y Luciano

Buenísimo!