cerbero
(22cerbero22)
July 25, 2012, 1:56pm
1
Ciao a tutti,
sto mettendo a punto un sistema di valutazione delle offerte presenti nel mio DB tramite la classe CStarRating.
Il problema è che da _view.php non riesco ad eseguire un alert() del valore che gli spedisco tramite un Action.
Vi posto il codice dato che vale più di mille parole:
Questo è l’inserimento del widget nella _view.php (dove risiede l’alert )
$this->widget('CStarRating', array(
'model' => Offers::model(),
'attribute' => 'rating',
'readOnly' => false,
'htmlOptions' => array('id'=>'offer_'.$data->id),
'maxRating' => 5,
'callback' => '
function() {
$.post(
"'.Yii::app()->createUrl('offers/index').'",
"action=rate&stars="+$(this).val()+"&offerID='.$data->id.'",
function(msg) { alert(msg); }
);
}
',
));
Mentre questa è la parte dell’Action più pertinente che invia il valore da stampare tramite echo
if(isset($_POST['action'])) {
if($_POST['action'] == 'rate') {
$stars = filter_input(INPUT_POST, 'stars', FILTER_SANITIZE_NUMBER_INT);
$offerID = filter_input(INPUT_POST, 'offerID', FILTER_SANITIZE_NUMBER_INT);
$offer = Offers::model()->findByPk($offerID);
$rating = $offer->rating;
$reviews = $offer->reviews;
$offer->rating = round(($rating * $reviews + $stars) / ($reviews + 1));
$offer->reviews = $reviews + 1;
$offer->save();
echo $offer->rating;
}
}
Funziona quasi tutto, l’unico problema è che l’alert(), invece di mostrarmi il valore, mi fa vedere il codice sorgente di tutta la pagina!
E’ corretto: quando tu fai quella echo, in verità viene resa tutta la pagina di yii. Quindi vedi il layout e tutto il resto. Prova a mettere un “die();” dopo la echo.
cerbero
(22cerbero22)
July 26, 2012, 1:15pm
3
grazie sensorario per la rapida risposta,
ieri non ho potuto risponderti perchè c’è un limite di 3 messaggi il primo giorno…
Ho provato sia con die() , che con exit() e anche con Yii::app()->end()
ma l’esito è sempre lo stesso: nell’alert viene mostrato tutto il sorgente della pagina
Inoltre da altre parti ho visto usare il comando echo per passare dati via AJAX, senza un seguente comando di interruzione (die e compagnia).
Perciò mi sorge il dubbio che forse potrebbe non essere questo il problema.
mdomba
(Maurizio Domba Cerin)
July 26, 2012, 1:51pm
4
die() non serve se doppo il echo non si fa nesun render().
Se metti die() subito doppo il echo dovrebbe mostrare soltanto quello… se invece ricevi un intera pagina puo essere che hai un errore o una exception ed e quella che viene mostrata nell alert().
Prova a vedere con un utility come firebug che cosa ti ritorna la chiamatta ajax().
emafer
(Emanuele Ferrarini)
July 26, 2012, 1:53pm
5
mmm sicuramente non è così,
ma io una volta ho passato un pomeriggio su dei <?php mancanti di php e scritti come fossero asp.
io per avere un output di testo faccio così:
echo 'ok';exit();
cerbero
(22cerbero22)
July 26, 2012, 2:20pm
6
Eureka! grazie a tutti per le vostre risposte, mi avete portato alla soluzione!
Il problema era il render() che precedeva
if(isset($_POST['action'])) {
e che quindi mi mostrava tutto il sorgente nell’alert.
Ora ho aggiustato mettendo Yii::app()->end() dopo echo() e spostando render() in fondo all’action, così:
if(isset($_POST['action'])) {
if($_POST['action'] == 'rate') {
$stars = filter_input(INPUT_POST, 'stars', FILTER_SANITIZE_NUMBER_INT);
$offerID = filter_input(INPUT_POST, 'offerID', FILTER_SANITIZE_NUMBER_INT);
$offer = Offers::model()->findByPk($offerID);
$rating = $offer->rating;
$reviews = $offer->reviews;
$offer->rating = round(($rating * $reviews + $stars) / ($reviews + 1));
$offer->reviews = $reviews + 1;
$offer->save();
echo $offer->rating;
Yii::app()->end();
}
}
$this->render('index', array(
'dataProvider' => $dataProvider,
));
grazie per il vostro prezioso aiuto