passaggio variabili Controller /js

ciao a tutti, sto facendo delle prove con js e ajax.

Vorrei che allo scatenare di un Submit delle variabili all’interno del javascript siano popolate da Php (controller o view? )

ho provato a fare delle cose del genere:


Yii::app()->clientScript->registerCoreScript('jquery');

$cls = Yii::app()->getClientScript();

$cls->registerScriptFile(Yii::app()->baseUrl.'/js/prova.js', CClientScript::POS_HEAD);		

$pippo=array('url_salvataggio' => $this->url);

$options = CJavaScript::encode($pippo);

$js = "pippo({$options});";

$cls->registerScript(__CLASS__ . 'pippo', $js, CClientScript::POS_READY);

dove in prova.js c’e la funzione:


function pippo(options) {

	url = options.url_salvataggio;

	//alert (url);

}

e cosi va bene, ma viene chiamato subito, invece io vorrei che il tutto sia fatto al momento del Submit. In particolare devo passare 3 parametri.

spero di essere stato chiaro.

ciao a tutti

Devi capire che php viene interpretato lato server e javascript lato client. Quando una pagina “esiste” tutto il php e tutto il javascript non sono più modificabili. Se vuoi che quel codice venga caricato al submit, devi inserirlo nell’evento onclick del submit, o anche all’onsubmit del form. In questo modo verrà eseguito solo in quel preciso momento.

ciao e grazie per la risposta, pensavo a una cosa tipo set variabile, tipo un metodo chiamato dal controller che mi settasse delle variabili globali del Js. Grazie farò delle prove quanto prima

Io preferisco evitare questi passaggi di parametri.

Se devi passare un url, mettilo un qualche href del form o del link su cui vai a chiamare l’evento.

Quando poi ne hai bisogno, lo prendi con js:




$(this).href();



In questa maniera non stravolgi l’html. Se poi hai voglia di perder tempo, puoi implementare anche l’action relativa all’url in maniera coerente, cosi’ il sito funziona anche senza js

grazie ottimo suggerimento

Dicci se hai risolto. Ho un’altra soluzione, ma è più una questione di stile che altro =). A me piace creare delle Action riciclabili. Questo solo perchè così contestualizzo il codice, che termina con un json_encode. Quindi creo un markup html con un id, che popolo con una chiamata ajax, che registro in fondo alla pagina yii.

Sono quasi sicuro di non essere stato chiaro =). Se mi confermi che mi sono spiegato male, faccio un esempio concreto.

ciao, si ho risolto creando un Widget e impostando le variabili globali del Js, sono molto all’albori, perché stavo creando un widget per un jcrop con ajax ( tutto più che altro per testare le varie cose)

se non è troppo posta l’esempio che sicuramente male non fa :P

  • registro uno script che modifichi il comportamento della pagina

  • creo una action che procuri un json (questo comunicherà con il javascript appena creato)

  • creo una action che salvo in /protected/actions/NomeAction.php

  • Nel controller, o nella classe Controller, aggiungo la action

Registro uno script con il codice javascript che modifica la pagina html. Questo script si aspetta un json, e con quel json comunicherà ad altro js o modificherà il dom html.




        Yii::app()->getClientScript()

        ->registerScript('nomeaction', 'function nomeAction() {

            try {

                $.getJSON("' . $this->createUrl('site/nomeAction') . '", function (json){


                    alert(json.nomeVariabile);


                });

            } catch(e) {

                // ...

            }

        }', CClientScript::POS_HEAD)



Il json verrà richiamato in una action precisa. A me piace crearle isolate perché così ho un file preciso per uno scopo preciso. Questo però mi implica un lavoro in più.




<?php


class NomeAction extends CAction {


    public function run() {

        echo json_encode(array(

            'nomeVariabile' => 33,

        ));

    }


}




Ecco il lavoro in più:




class SiteController extends Controller {


    /**

     * Declares class-based actions.

     */

    public function actions() {

        return array(

            'nomeazione' => array(

                'class' => 'NomeAzione'

            ),

        );

    }




Poi, se serve, registro uno script che richiama la funzione create all’inizio. Mi è anche capitato questo:




        ->registerScript('demone', 'function demone() {

            nomeAction();

            setTimeout("demone();", 5000);

        }', CClientScript::POS_HEAD)



Questo fa si che ogni 5 secondi, la mia funzione viene richiamata. Posso avere un comportamento realtime. Ogni 5 secondi carico la action, che magari interroga il db, quindi la funzione javascript nomeAction aggiorna la pagina. Io adoro questo genere di cose =).

complimenti, sono ancor ani fase di studio la parte ajax e json, appena comincio a metterci le mani, provo subito il tuo script !

quello che non mi è acciaro a me è come faccio a sapere se un operazione è andata a buon fine o meno

ovvero:

mettiamo caso che io ho un’azione nel controller che fa una query e cancella un determinato ID, dopo (cioè avendo avuto esito positivo della cancellazione, fatta ovviamente in ajax) mostra la nuova lista di utenti

quello che mi domando è:

Questa chiamata della cancellazione deve essere fatta tramite $.ajax() ?

come faccio a sapere quando devo fare la chiamate che mi restituisce la nuova lista?

spero di essere stato chiaro altrimenti anche io andrò di Codice :)

Ormai ci sono vi metto la mia soluzione definitiva.

l’obbiettivo era appunto Query, lista utenti, click e cancellazione dell’utente tramite ID.

Controller, la pagina è Cancella




 public function actionCancella() {

        Yii::app()->clientScript->registerCoreScript('jquery');

		$cls = Yii::app()->getClientScript();

		$cls->registerScriptFile(Yii::app()->baseUrl.'/js/script.js', CClientScript::POS_HEAD);

    	$this->render('cancella');

    }



view Cancella


<?php echo CHtml::submitButton("Dammi Lista"); ?>

<div id="lista_utenti"></div>

Al Submit chiamo l’azione js, che si trova dentro script.js


$(document).ready(function(){

	 $(':submit').click(function(){

         mostra_utenti();

    });

});




function mostra_utenti() {

$('#lista_utenti').load('Get_user #container');

}

mostra utenti chiama questa Action


public function actionGet_user() {

       $this->render('utenti', array("utenti" => $this->mostra_utenti()));

	}


public function mostra_utenti() {

    	 $utenti=Test::model() -> findAll();

    	 return $utenti;

    }



a Questo punto quando clicco il pulsante, effettuo una chiamata js load, che mi fa una query che mi tira fuori tutti l’utenti della tabella interessata, a questo punto per ogni utente faccio un link in questa maniera:

view di


<div id="container">

<?


foreach ($utenti as $users) {

	echo CHtml::link($users->id.' '.$users->utenti, 

    "",

    array(

        'style'=>'cursor: pointer; text-decoration: underline;',

        'onclick'=>"{cancella_utente(".$users->id.");}"));

        

     echo "<br/>";

	}


?>

</div>

al click dell’utente fa una chiamata JS cheti passa l’id dell’utente


function cancella_utente(id) {

	alert("hai cliccato "+id)

$.ajax({

  url: "Delete",

  context: document.body,

  data: {id_utente:id},

  success: function(){

    $('<p>Loading...</p>').appendTo('#lista_utenti'); ;

  },complete: function() {

            mostra_utenti();

  }

});	

}

e nel controller ho questa Action , do appunto l’id viene preso con il Get


public function actionDelete() {

		$post=Test::model()->findByPk($_GET["id_utente"]);

		$post->delete();

	}

una volta cancellato mi rimostra la lista aggiornata.

spero di essere stato chiaro, e sono IPERdisposto a migliorie

bravo

anche per me è la parte piu’ difficile ma spero presto di vederci chiaro.

:)

Io uso i log. Con i log puoi scrivere su di un file. Se hai accesso alla console, con il comando "tail -f nome_file.log" puoi vedere in tempo reale se qualche cosa è stata o meno aggiunta al log. Ajax fa chiamate in background. Sono … "trasparenti". Ma se nelle pagine caricate scrivi nel db o su un file, poi te ne accorgi.

trucco di lavoro?

io per trovare i “guasti” con php uso echo e vardump. :lol:

non uso nessuno dei due vostri metodi per vedere se veramente ha cancellato dal Db, ma vado a vedere il Db stesso ( sicuramente non è la soluzione migliore) ma non ho capito entrambi i vostri consigli ;D

i miei dubbi sullo script sono:

il passaggio del parametro id, potevo farlo ( ed è meglio) farlo con Json?

il parametro context: document.body della chiamata Ajax, che io brutalmente ho copiato dalla documentazione che funzione ha?

grazie ancora, vorrei poi aggiungere il pop up, di conferma, dove ho aperto un nuovo Post

echo e var_dump non sono visibili se si tratta di una chiamata ajax.

ancora meglio, al momento dell’aggiunta della pagina (o dell’elemento), faccio un append, evitando così di ricaricare tutto il contenuto.

sto facendo una prova con ajaxSubmitButton su un altro elemento. il mio codice è questo




echo CHtml::ajaxSubmitButton(

            'Salva', $this->createUrl("/ContenutoPagina/salva", array(

                'id' => $_GET['id'])), 

            array(

        'beforeSend' => 'function(){

                         $("#risposta").html("sending...");

                           }',

        'error' => 'function(){

            $("#risposta").html("ERRORE");

                    }',

        'success' => 'function(){

            alert($("#contenuto").val());

            $("#risposta").html("Salvataggio Effettuato");

                //mostra_contenuto("#contenuto_pagina","get_contenuti","#contenuto_pagina");

                    $("#contenuto_pagina").append($("#contenuto").val());

                 

               }',

         

            )

        

    );



funziona, e fa esattamente quello che deve fare, ma la mia domanda è:

ajaxSubmitButton fa la stessa chiamata di $.ajax() ?

cioè potrei impostare json, context ecc?

grazie ragazzi

La tua ajaxSubmitButton farà una post ad una determinata pagina che potrà restituire qualsiasi tipo di pagina. Da “niente”, a “ell’html” ma anche del JSON. Quindi la risposta è si.

e mi confermi anche che $.ajax() è la stessa di ajaxSubmitButton ?

Non lo so =). Lascio fare tutto ad yii. Ma per rispondere meglio a questa domanda. Credo sia meglio sbirciare il codice. Ti do un aiuto. Controlla l’id che yii ha dato al bottone submit, poi cerca nella pagina il codice javascript che fa riferimento a quell’id. Li troverai risposta a tutte le tue domande.