X-Editable Select Dinamica

Salve a tutti,

so che probabilmente mi sono perso in un bicchier d’acqua, però vorrei capire come fare questa cosa che stà facendo impazzire, su internet non ho trovato nulla (forse è troppo semplice e mi ci sono incartato solo io come un pollo :( ).

Praticamente è un semplicissimo form in x-editable per poter creare l’anagrafica di un negozio, il problema è che voglio che i select della zona siano “dinamici”, mi spiego meglio:

se seleziono il select della regione lui fa la chiamata all’action che restituisce tutte le regioni, e li tutto ok, poi però se seleziono il select delle province lui mi deve dire solo quelle della regione che ho selezionato nel precedente select, ora, se io inserico (come nel codice che ho postato sotto) un id fisso è tutto ok, mi restituisce esattamente quello che voglio (quindi l’action so che funziona bene), però non so come dirgli di mettere come id il value del select precedente, di modo da “dinamicizzare” il tutto.

Spero di essermi spiegato bene.




                array(

                    'name' => 'regioni_id',

                    'editable' => array(

                        'type' => 'select',

                        'inputclass' => 'input-large',

                        'source' => $this->createUrl('getRegioniValues'),

                    )

                ),

                

                array(

                    'name' => 'province_id',

                    'editable' => array(

                        'type' => 'select',

                        'inputclass' => 'input-large',

                        'source' => $this->createUrl('getProvinceValues', array('id'=>'1')),

                    )

                ),



Come vedete nel secondo select adesso ho in modo bovino messo un ‘1’ giusto per fare un test, però voglio che al posto dell’ ‘1’ ci sia il value del precedente select.

Grazie in anticipo per le eventuali risposte. :)

Potresti postare per favore anche l’ action getRegioniValues?

guarda se questi ti è utile:

http://jsfiddle.net/xBB5x/297/

Certo, eccolo, però dubito che ti serva, semplicemente prende in ingreso un id, esegue le varie query e ritorna il json già compilato, il getRegioniValues funziona per forza, non prendendo parametri in ingresso:




    public function actionGetRegioniValues(){

        $model = new Regioni;

        $data = $model->getData();

        echo json_encode($data);

    }

    public function actionGetProvinceValues($id){

        $model = new Province;

        $data = $model->getData($id);

        echo json_encode($data);

    }

    public function actionGetComuniValues($id){

        $model = new Comuni;

        $data = $model->getData();

        echo json_encode($data);

    }



gli altri due invece funzionano solo se metto staticamente (come nel post sopra) ad esempio un 1, volevo capire come posso inserire un valore.

Deve per forza esistere il modo, non ci credo che x-editable non faccia una cosa così banale come la compilazione dinamica di un menù con regione -> provincia -> comune.

Per dire, se potessi mettere direttamente mano al codice jQuery verrebbe fuori una cosa così (tralasciamo il fatto che sia un’altro progetto e chiedesse indietro i tipi di cutomer di un ticket anzichè una provincia, ma non cambia nulla):





                $('#Tipo').editable({

                pk: 1,

                title: 'Select group',

                dataType: 'json',

                source: function () {

                    var result;

                    $.ajax({

                        url: '/ticket/getType?CustomerID=' + CustomerID,

                        type: 'GET',

                        global: false,

                        async: false,

                        dataType: 'json',

                        success: function (data) {

                            result = data;

                        }

                    });

                    return result;

                },

            });




Come si può vedere la chiamata all’url era dinamica e restituiva solo i valori inerenti quel customerid, voglio fare la stessa cosa ma con l’x-editable di yii … idee??

Ok ragazzi, dopo i gozzovigli del weekend il neurone si è svegliato e oggi ci sono arrivato, un po in maniera “bovina” ma funziona! ;D

Se trovate altri modi ben vengano, postateli pure!

Allora, in fondo alla pagina con la vista aggiungete il codice:





<script type="text/javascript">

    var regioneValue = null;

</script>




per istanziare una variabile in javascript comunitaria per tutta la pagina, di modo da far riferimento sempre a quella, io l’ho settata a null di default apposta così nel caso non sia stata ancora selezionata una regione da automaticamente errore, però potreste anche settare un valore di dafault, vedete voi.

Poi ho modificato il codice in questo modo:





                array(

                    'name' => 'regioni_id',

                    'editable' => array(

                        'type' => 'select',

                        'inputclass' => 'input-large',

                        'source' => $this->createUrl('getRegioniValues'),

                        'onSave' => 'js: function(e, params) {

                                        regioneValue = params.newValue;

                                    }',

                        

                        ),

                ),

                

                array(

                    'name' => 'province_id',

                    'editable' => array(

                        'type' => 'select',

                        'inputclass' => 'input-large',

                        'source' => 'js: function() { return "'.$this->createUrl('azienda/getProvinceValues/').'/"+regioneValue }',

                    )

                ),




Ho aggiunto un ‘onSave’ quando seleziono la regione di modo che vada a modificare la variabile regioneValue, poi nel source creo una funziona js che restituisce la stringa di default con l’url del’indirizzo dell’action da chiamare, ed aggiungo manualmente “/<id>”, dove al posto di <id>, regioneValue va ad inserire il valore dell’id.

E magicamente … FUNZIONA! B) ;) :D

Ovviamente manca la parte dei comuni ancora, però si rifà la stessa procedura e funziona.

grazie per averci postato la soluzione, ti sei meritato un +1

Prego, figurati, a sto punto segnalo anche un’altra possibilità un po meno “bovina” di quella che avevo postato sopra, se al posto di mettere:





<script type="text/javascript">

    var regioneValue = null;

</script>




mettiamo:





        Yii::app()->clientScript->registerScript('geolocalizzazione', '

            var regioneValue = null;

            var provinciaValue = null;

        ');




il risultato è il medesimo ma con il vantaggio che viene inserito a fine pagina insieme a tutto il codice javascript/jquery, quindi nella sezione apposita che il frameowrk delinea per questi scopi e non "a casaccio" come avviene nel primo caso che ho detto, il resto della procedura resta la medesima.

Segnalo anche che





Yii::app()->clientScript->registerScript('<nome dello script>', '<codice dello script>');




non serve solo per questo scopo, ma può essere utilizzato in qualsiasi caso si voglia inseire direttamente codice javascript/jquery/altro all’interno della pagina.

che magari per molti sarà un’ovvietà ma io che l’ho appena scoperto la trovo una figata ;D

Io in certi casi ho dovuto usare lo script "bovino" perché avevo necessità di comporre lo script secondo determinati ragionamenti in php e usando Yii::app()->clientScript->registerScript non mi componeva correttamente la cosa.

Ho dato la colpa al fatto che utilizzando questa funzionalità lo script viene composto da Yii prima dell’elaborazione della pagina e la pagina viene quindi elaborata quando lo script è già composto (anche se viene fisicamente caricato in fondo alla pagina). Per script già definiti, quindi “fissi”, invece funziona benissimo.

Lo script “bovino”, anche se meno elegante, mi ha tratto d’impaccio.