CJUIDialog + button submit + AJAX + refresh di parte della pagina in background

Salve a tutti,

seguendo delle guide trovate sul wiki di yii,

come punto di partenza ho usato questa guida qui:

http://www.yiiframework.com/wiki/145/cjuidialog-for-create-new-model/

Ho realizzato il mio bel bottone JuiButton che apre una JuiDialog e carica una view di una form di update.

La logica torna, e tutto torna… tranne che per una piccola cosa:

Al momento del submit, vorrei che i dati che ho appena aggiornato mi si aggiornassero anche sulla pagina sottostante.

Al momento ho fatto due prove:

  • Visto che utilizzavo json mi son passato la pagina con json e poi riempivo un div… tutto funziona correttamente

ma i widget di quella parte della pagina che ricarico non funzionano… ad esempio l’ui button non apre più la finestra di dialog

-Provare a fare un redirect della pagina nel controller, ma la chiamata avviene via ajax quindi la pagina non refresha.

Ecco un pò di codice:

codice della finestra di dialog:




<? $this->beginWidget('zii.widgets.jui.CJuiDialog', array(

		'id'=>'dialog_ref',

		'themeUrl'=>''.Yii::app()->baseUrl.'/css',

		'theme'=>'btn_custom',


		'htmlOptions'=>array(

				'style'=>'overflow-x:hidden',

		),

		//additional javascript options for the dialog plugin

		'options'=>array(

				'title'=>'Modifica Referente',

				'autoOpen'=>false,

				'modal'=>true,

				'width'=>450,

				'height'=>600,

				'buttons'=>array(

					'Modifica'=>'js:function(){

					$.ajax({

  						type: "POST",

  						url: $("#dialog_ref form").attr("action"),

  						data: $("#dialog_ref form").serialize(),

  						dataType: "json",

            			success: function(data){

                			if (data.status == "failure")

                			{

                    		$("#dialog_ref div.divForForm").html(data.div);

                			}

                			else

                			{

                    		$("#dialog_ref div.divForForm").html(data.div);

							$("#dialog_ref").dialog("close");

							$("#box_referente").html(data.page);

                			}

            			}

					});

					}',

					'Annulla'=>'js:function(){$(this).dialog("close");}',

				),			

		),

));

?>


<div class="divForForm"></div>


<?php

$this->endWidget('zii.widgets.jui.CJuiDialog');

?>



Controller:




public function actionUpdatereferente($id)

	{

		$progetto=ProgettoPresentato::model()->findByPk($id);

		

		$model=User::model()->notsafe()->findbyPk($progetto->referente->id);

		$profile=$model->profile;

		

		if(isset($_POST['User']))

		{

			$model->attributes=$_POST['User'];

			$profile->attributes=$_POST['Profile'];

				

			if($model->validate()&&$profile->validate()) {

				$old_password = User::model()->notsafe()->findByPk($model->id);

				if ($old_password->password!=$model->password) {

					$model->password=Yii::app()->controller->module->encrypting($model->password);

					$model->activkey=Yii::app()->controller->module->encrypting(microtime().$model->password);

				}

				$model->save();

				$profile->save();

				//Aggiorno ruolo di rights all'utente o admin.

				if($model->superuser == 1){

					$authenticatedName = Rights::module()->superuserName;

					$authenticatedName_old = Rights::module()->authenticatedName;

					Rights::revoke($authenticatedName_old, $model->id);

					Rights::assign($authenticatedName, $model->id);

				} else {

					$authenticatedName = Rights::module()->authenticatedName;

					$authenticatedName_old = Rights::module()->superuserName;

					Rights::revoke($authenticatedName_old, $model->id);

					Rights::assign($authenticatedName, $model->id);

				}

							

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

				{

					echo CJSON::encode(array(

							'status'=>'success',

							'div'=>"Referente Modificato con successo.",

							'page'=>$this->renderPartial('viewpresentato_form/_form_referente', array('model'=>ProgettoPresentato::model()->findByPk($id)),true,true)

					));

					$this->redirect(array('viewpresentato','id'=>$progetto->id));

			//		exit;

				}

				else

					$this->redirect(array('viewpresentato','id'=>$progetto->id));

				

				

			} else $profile->validate();

		}

	

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

		{

			echo CJSON::encode(array(

					'status'=>'failure',

					'div'=>$this->renderPartial('update/_referente', array('model'=>$model,

				'profile'=>$profile), true)));

			exit;

		}

		else {

			$this->render('viewpresentato',array('model'=>$progetto,));

		}

	}



che mi dite?

Secondo la documentazione di yii questo codice avrebbe dovuto fare quello che mi serviva:




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

echo CJSON::encode(array(

	'status'=>'success',

	'div'=>"Referente Modificato con successo.",

	'redirect'=>$this->createUrl('admin/viewpresentato/'.$progetto->id.''),

        'page'=>$this->renderPartial('_form_referente', array('model'=>$model),true,true)

       ));

exit;

}



in particolare mi riferisco a:




'page'=>$this->renderPartial('_form_referente', array('model'=>$model),true,true)



con il terzo e quarto parametro settato a true. il terzo per far ritornare la pagina e non stampare

e il quarto per far andare correttamente js… in effetti se setto a false il quarto parametro il mio juibotton viene renderizzato come un bottone normale… senza lo stile e il tema ui… cmq non funziona non apre il dialog.

con il quarto parametro settato a true… tutto viene renderizzato correttamente ma le funzioni js non vanno,

ci sta che possa essere un bug sui widget js di yii… ma in realtà i widget sembrano andare visto che il bottone si vede… quello che sembra non andare sono le funzioni js quella che apre la dialog e carica la form e un’altra funzione che ho su una checkbox.

voi che ne pensate?

per ora ho risolto con un banalissimo




window.location.href=data.redirect; 



passandomi con json l’url per fare il refresh della pagina,

ma non è una soluzione che mi piace.