Richiamare Un Metodo Del Controller Attraverso Javascript

Salve ragazzi, vorrei sapere se vi fosse un modo attraverso javascript per richiamare un metodo, come se si trattasse di una action, attraverso una funzione jquery. Ho già visto qualche topic, ma non capisco come implementarlo nel mio progetto. Questo è il codice:




$this->widget('zii.widgets.jui.CJuiButton', array(

		'name'=>'button',

		'caption'=>'Crea Fiche',

		'value'=>'asd',

		'onclick'=>new CJavaScriptExpression(

                        'function()

                            {

                                if (confirm("Sei sicuro di voler creare una fiche per questo cliente?"))

                                {

                                    

                                    //RICHIAMA IL METODO DAL CONTROLLER

                                    

                                }

                                else

                                {

                                    alert("Operazioni annullata!");

                                }    

                                this.blur(); 

                                return false;

                            }'

                        ),

	));



Spero di essere stato abbastanza chiaro. Ciao a tutti…

Io nella CGridView ho personalizzto la colonna dei bottoni




array(

			'class'=>'CButtonColumn',

			'buttons'=> $buttonsArray,

			//'deleteConfirmation' =>  Yii::t('CausalType.CausalType','deletePrompt'),

		    

		),



Dove l’array buttonsArray è definito nella stesso file poche righe più sopra in questo modo:




$buttonsArray = array(

			.... 

			'delete' => array(

					'label'=>Yii::t('general','Cancella'),

					'imageUrl'=> Yii::app()->request->baseUrl.'/css/icons/16/cross.png',

			        'click' => "function() {customDelConfirm(this); return false; }",

			        

			),

                        .... 

		);



Sempre nello stesso file ho inserito lo script css che deve essere richiamato.

Ovviamente la mia situazione è diversa dalla tua, ma il problema di customizzare il delete è identico:




Yii::app()->clientScript->registerScript('customDeleteConfirm', "

   

        function customDelConfirm(deleteUrl) {


            var activeCausals = parseInt($(deleteUrl).parent().prev().text(),10);

            

            var message = 'Desideri davvero cancellare questa tipologia? ';

            if (activeCausals > 0 ) 

                message = 'Desideri davvero cancellare questa tipologia?\\nAttenzione ! Cancellandola, verranno cancellate anche ' + activeCausals + ' causali attive di questa tipologia';

        

            if ( confirm( message ) )

    		{

    			$.post( deleteUrl );

    			$.fn.yiiGridView.update('causal-type-grid'); 

    		}

        }

");



Alternativa ancora più simile alla tua:

dentro al codice javacript hai cosi (ricorda che a questa funzione viene chiamata da click tramite customMenuDelete (this), dove this è l’elemento html A, il link.:





	function customMenuDelete( deleteurl )

	{

		url = deleteurl.toString().replace('admin/menu/delete&id=', 'admin/menu/check&id=');

		var message = '".Yii::t('general','Sei sicuro di voler cancellare questo oggetto?')."'

		var users = getUserForMenu(url);

		if ( users > 0 )

		{

			message = '".Yii::t('Menu.Menu', 'Esistono %d utenti attivi con questo menu di default.' )."\\n' + message;

			message = message.replace('%d', users);

		}

		if ( confirm( message ) )

		{

			$.post( deleteurl );

			$.fn.yiiGridView.update('menu-grid'); 

		}

		

	}



e aggiungi questa funzione, dentro allo stesso registerScript

praticamente in questo modo esegue (via ajaxa, ma in modo sincrono) una chiamata ad una action ‘check’, che è diversa da quella che normalmente verrebbe usata (../delete)




function getUserForMenu( checkurl )

	{

		var res = 0;

		$.ajax({ url: checkurl, async: false, success: 			function(data) { res = data;} });

		return res;

	}




In generale:

  • dentro ‘click’ fai una function che ne chiama un’altra e che fa sempre il return false

  • dentro questa puoi fare una chiamata ajax impostandola come sincrona e gli passi l’url che vuoi, in questo modo esegue l’action che desideri tu.

  • ad ogni modo se preferisci fare tutto ‘in linea’, comunque la tecnica è quella.

Grazie mille per il tuo aiuto! ! Direi che ho risolto il mio problema!! :rolleyes: :D

Ma quando effettuo la chiamata al metodo, come faccio dal metodo stesso a passare un valore alla function di ajax???

beh, quello si tratta di guarda la documentazione di jquery di $.ajax, comunque basta passargli

‘data’ :‘id=13&pippo=14’

No scusa mi sono espresso forse male io. Allora ti spiego meglio con il codice:

Questa è la funzione javascript mediante cui mi richiamo il metodo interessato:




$.ajax({    

           url: "/clienti/creafiche?Id='.$model->Id.'", 

           async: false,

           success: function(data) 

           { 

                res = data;

           }

          });

           return res;     

           }

                                    else

                                    {

                                        alert("Operazioni annullata!");

                                    }    

                                    this.blur(); 

                                    return false;



Quando richiamo il metodo creafiche che ha questo codice:




public function actionCreaFiche($Id)

        {

                $model = $this->loadModel($Id);

                $fiche = new Fiche;

                $fiche->Data = new CDbExpression('NOW()');

                $fiche->IdCliente = $model->Id;

                $fiche->ScontoEstetica = $model->ScontoEstetica;

                $fiche->ScontoRivendita = $model->ScontoRivendita;

                $fiche->insert();

                

		// if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser

		if(!isset($_GET['ajax']))

                {

			$this->redirect(array('/fiche/scheda/'.$fiche->Id));

                }

        }



vorrei che questo metodo mi ritornasse il valore $fiche->Id da poter sfruttare nel mio codice javascript.

Quando lavoro con ajax in genere faccio una chiamata post in questo modo:




$.post('index.php?r=json/getNomeUtente', {"idUtente": "333"}, function (data) {

    alert('Ciao ' + data.nome); // Mostrerà come messaggio "Ciao Simone"

}, "json");



Questo snippet non fa altro che fare un’ipotetica richiesta JsonController::actionGetNomeUtente(); La mia action, deve restituire un json (come ho indicato nell’ultimo parametro della chiamata $.post. Ed ora mostro come potrebbe essere questo json:


class JsonController extends Controller

{

    public function actionGetNomeUtente()

    {

        echo json_encode(

            'nome' => 'Simone'

        );

        die;

    }

}

Devi prestare attenzione al terzo parametro della funzione “$.post”. Questo, infatti, viene richiamato quando la pagina è stata chiamata via javascript ed il risultato viene immesso all’interno della variabile data. La variabile “data” contiene l’output della pagina.

Ti ringrazio per la risposta, ma per il mio codice non funziona… Se vedi il mio codice puoi darmi un suggerimento specifico??




$.ajax({    

           url: "/clienti/creafiche?Id='.$model->Id.'", 

           async: false,

           success: function(data) 

           { 

                //IN QUESTO PUNTO VORREI PRELEVARE UN VALORE CHE MI RESTITUISCE IL METODO CHIAMATO

                res = data;

           }

          });

           return res;     

           }

                                    else

                                    {

                                        alert("Operazioni annullata!");

                                    }    

                                    this.blur(); 

                                    return false;



Questo è il metodo che crea il record e poi mi dovrebbe restituire indietro l’ID




public function actionCreaFiche($Id)

        {

                $model = $this->loadModel($Id);

                $fiche = new Fiche;

                $fiche->Data = new CDbExpression('NOW()');

                $fiche->IdCliente = $model->Id;

                $fiche->ScontoEstetica = $model->ScontoEstetica;

                $fiche->ScontoRivendita = $model->ScontoRivendita;

                $fiche->insert();

                

                // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser

                if(!isset($_GET['ajax']))

                {

                        $this->redirect(array('/fiche/scheda/'.$fiche->Id));

                }

        }



In parole povere, quando inoltro la chiamata del metodo, che a sua volta mi crea il record, vorrei che questo mi restituisse l’ID per effettuare direttamente da javascript un redirect sfruttando l’id del record appena creato.




if(!isset($_GET['ajax']))

 {

     $this->redirect(array('/fiche/scheda/'.$fiche->Id));

} else {

    echo CJSON::encode(array('ficheId' => $fiche->id);

}



nel js per fare il redirect:




    window.location.href = URL + data.ficheId



PS: se Berlusconi scopre il metodo CreaFiche sei del gatto :D

Ahahahah speriamo che non lo scopra mai!!! :wink: Cmq grazie mille funziona!!