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