Alert dell'Output di un'Action via AJAX

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! :o

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.

grazie sensorario per la rapida risposta,

ieri non ho potuto risponderti perchè c’è un limite di 3 messaggi il primo giorno… :huh:

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.

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().

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();

Eureka! :D 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 :)