Yii Framework Forum: Richiamare Un Metodo Del Controller Attraverso Javascript - Yii Framework Forum

Jump to content

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

Richiamare Un Metodo Del Controller Attraverso Javascript Rate Topic: -----

#1 User is offline   giuseppe.farinella 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 13
  • Joined: 04-November 12
  • Location:Palermo

Posted 14 November 2012 - 06:24 PM

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

#2 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 620
  • Joined: 03-October 12
  • Location:Ferrara

Posted 15 November 2012 - 05:22 AM

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'); 
    		}
        }
");

Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
1

#3 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 620
  • Joined: 03-October 12
  • Location:Ferrara

Posted 15 November 2012 - 05:31 AM

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.
Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
1

#4 User is offline   giuseppe.farinella 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 13
  • Joined: 04-November 12
  • Location:Palermo

Posted 15 November 2012 - 07:14 AM

View Postrealtebo, on 15 November 2012 - 05:31 AM, said:

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
0

#5 User is offline   giuseppe.farinella 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 13
  • Joined: 04-November 12
  • Location:Palermo

Posted 15 November 2012 - 08:04 AM

View Postgiuseppe.farinella, on 15 November 2012 - 07:14 AM, said:

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

#6 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 620
  • Joined: 03-October 12
  • Location:Ferrara

Posted 15 November 2012 - 08:17 AM

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

'data' :'id=13&pippo=14'
Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
1

#7 User is offline   giuseppe.farinella 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 13
  • Joined: 04-November 12
  • Location:Palermo

Posted 15 November 2012 - 08:52 AM

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

#8 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,986
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 15 November 2012 - 09:25 AM

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

#9 User is offline   giuseppe.farinella 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 13
  • Joined: 04-November 12
  • Location:Palermo

Posted 15 November 2012 - 10:57 AM

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

#10 User is offline   markux 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 106
  • Joined: 26-November 10
  • Location:Grosseto

Posted 16 November 2012 - 02:20 AM

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
1

#11 User is offline   giuseppe.farinella 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 13
  • Joined: 04-November 12
  • Location:Palermo

Posted 16 November 2012 - 03:21 AM

Ahahahah speriamo che non lo scopra mai!!! ;-) Cmq grazie mille funziona!!
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