Yii2 -campi form dipendenti da dropDownList

Salve,

ho una form con diversi campi text e una dropDownList che mi elenca i nome di alcuni studenti.

Nel momento in cui seleziono uno studente dalla dropDownList vorrei far comparire sotto all dropDownList

altri campi text contenenti altre informazioni sullo studente.

Ovviamente le altre informazioni dello studente risiedono su una tabella esterna.

Come potrei fare?

Grazie

Se vuoi evitare un caricamento dinamico del form, potresti comunque

creare il form mettendo come css “display:none” e poi all’evento change del

dropdown cambiare la proprietà in "display:block".

Nella view inserisci prima il codice per gestire l’evento sulla select html e poi il form




<?php


$this->registerJS( <<< EOT_JS


    $('#lista_studenti').on('change', function(ev) {

          $('#dati_studente').css('display','block');

    });


EOT_JS

);


?>






<select id="lista_studenti">

...

...

...

</select>


<form id="dati_studente" style="display:none">

...

...

...

</form>



Ciao Fabrizio,

e invece per estrarre i dati dal database dopo che ho scelto lo studente qual’è la strada da intraprendere?

Grazie!

Se dev’essere tutto contestuale, puoi usare pjax (plugin di yii2) oppure direttamente ajax jquery, come preferisci tu.

Con jquery la strada è di reagire all’evento change della prima select e fare

  • svuotare le options della seconda

  • eseguire una post via ajax che riceva, magari in JSON, l’array di chiavi-valore per la seconda

  • sul .done() o success() della chiamata ajax, usi questi dati per popolare la seconda combo.

Ciao scusate ma forse sono stato poco chiaro. Io vorrei fare una cosa del genere.

Quando scelgo uno studente dalla dropDownList

all’evento onchange devo interrogare in database ricavare alcuni dati inerenti allo studente selezionato

(data_nascita, citta , ecc ecc) e aggiornare i campi della view con i nuovi dati ricavati.

Se ho capito bene potrei usare jquery per interrogare il database. Tipo

‘onchange’=>’

$.get( “’.Url::toRoute(‘operazione/recuperadati’).’”, { id: $(this).val() } )

.done(function( data )

{

});

Il problema principale è che non so come prendere i nuovi valori ricavati dal database e aggiornare gli input box della view

Spero di essere stato chiaro. grazie

Si, questo è un problema di javascript puro, non c’entra con Yii.

Ad ogni modo tutto ruota attorno a questo pezzo di codice che tu stesso hai scrito




.done(function( data ) {


});



in questo snippet, data è quello che viene restituito dal server. Potresti fare si che il server ti dia del json in risposta, così è facile da gestire lato javascript.

Il tuo problema è

  • non sai come fare una l’action che mandi fuori del json

oppure

  • non sai una volta ricevuo il json come aggiornare gli input?

nel primo caso ti posto un brevissimo esempio, spero di aver capito bene: la prima combo seleziona uno studente, giusto?




public function actionChiamataOnChangeDallaPrimaCombo($id_studente) {


    $studente = Studenti::model()->findByPk($id_studente);


    $dati_dello_studente = $studente->dati; // sto usando una immaginaria relation


    // ora ho un array di dati dello studente


    echo json_encode(CHtml::listData($dati_dello_studente, "id", "nome_della_colonna_da_mostrare"));


}



Questo fa si che via ajax ti arrivi dentro alla variabile data un json contenente un array con id in chiave e i valori della colonna da te scelta come valori.

A questo punto devi far si che una select si popoli con questi valori?

Ecco una possibile soluzione




$.each(data, function (chiave, item) {

    $('#mySelect').append($('<option>', { 

        value: chiave,

        text : item

    }));

});



Ovviamente l’ultimo codice dipende da COME ESATTAMENTE arrivano i dati via json.

Per favore, una volta fatta l’action che restituisce i dati, potresti darci un esempio appunto di come appaiono, del json insomma?

[/code]

Ciao Realtebo,

i miei problemi erano appunto

  • non saper fare l’action che mandi fuori del json

  • non saper fare, una volta ricevuo il json, l’aggiornarmento gli input?

Il tuo esempio credo che vada bene devo ancora metterlo in pratica.

L’unica cosa è che quando data viene restituito dal server invece di popolare una select devo aggiornare delle textInput (Datanascita, indirizzo, ecc ecc)

quindi in data dovrei metterci non un array di valori ma i campi (datanascita, indirizzo ecc ecc)

Come faccio?

Grazie ancora

Premessa, stiamo parlando di Yii2, giusto?

Per mandare fuori i dati in JSON da una action è sufficiente impostare:




Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;



all’interno della tua action, una volta impostato il formato response il tuo array viene inviato come JSON.

Per aggiornare gli input è tutto lavoro Javascript, nella guida attuale non c’è molta documentazione, per integrare al meglio uno script con Yii2 ti consiglio di leggere questo e i commenti del sorgente di yii.js.

Per leggere i dati JSON forniti dal tuo controller puoi usare la comoda funzione ajax() di jQuery e val() per impostare il valore ai tuoi campi input.