[Risolto] Problema Con Dropdownlist Multiple.

Salve!,

sono nuovo nel forum e un principiante con Yii. Sto provando a fare il mio primo progetto di prova, e mi sono scontrato con un problema per me ostico…

Ho una form con tre dropdownlist dipendenti tra loro. In fase di inserimento la prima dropdownlist è già popolata, mentre le altre due si popolano tramite selezione della precedente.

Tutto ok se vado in sequenza, la prima aggiorna la seconda, la seconda aggiorna la terza.

Il problema è che se dopo avere completatao la selezione nelle tre dropdownlist, una variazione nella prima si riflette solo sulla seconda, mentra la terza resta invariata con la selezione precedente, in pratica vorrei che:

  1. venga popolata con gli elementi che si riferiscono all’opzione della seconda;

  2. oppure venga azzerata, quindi senza elementi, che quindi verranno presi operando una selezione nella seconda.

Spero di non essere stato troppo prolisso e confusionario.

questo è il codice presente nella view:


	<div class="row">

		<?php echo $form->labelEx($model,'id_ufficio_liv2'); ?>

		<?php //echo $form->textField($model,'id_ufficio_liv2'); ?>

                <?php echo $form->dropDownList($model,

                                                'id_ufficio_liv2', 

                                                Ufficio2liv::model()->getElencoUffici2Livello(),

                                                array(

                                                'prompt' => 'Seleziona Ufficio',   

                                                'ajax' => array(

                                                'type'=>'POST', //request type

                                                'url'=>CController::createUrl('utente/popolaUffici3Liv'), //url to call.

                                                //Style: CController::createUrl('currentController/methodToCall')

                                                'update'=>'#'.CHtml::activeId($model,'id_ufficio_liv3'),

                                                //'data'=>'js:javascript statement' 

                                                //leave out the data key to pass all form values through

                                                ))); ?>            

		<?php echo $form->error($model,'id_ufficio_liv2'); ?>

	</div>


	<div class="row">

		<?php echo $form->labelEx($model,'id_ufficio_liv3'); ?>

		<?php //echo $form->textField($model,'id_ufficio_liv3'); ?>

                <?php echo $form->dropDownList($model,

                                                'id_ufficio_liv3', 

                                                $model->isNewRecord ? array() : Ufficio3liv::model()->getElencoUffici3Livello($idUff2Livello),

                                                array(

                                                'prompt' => 'Seleziona Ufficio',   

                                                'ajax' => array(

                                                'type'=>'POST', //request type

                                                'url'=>CController::createUrl('utente/popolaUffici4Liv'), //url to call.

                                                //Style: CController::createUrl('currentController/methodToCall')

                                                'update'=>'#'.CHtml::activeId($model,'id_ufficio_liv4'),

                                                //'data'=>'js:javascript statement' 

                                                //leave out the data key to pass all form values through

                                                ))); ?>            

		<?php echo $form->error($model,'id_ufficio_liv3'); ?>

	</div>        


	<div class="row">

		<?php echo $form->labelEx($model,'id_ufficio_liv4'); ?>

		<?php //echo $form->textField($model,'id_ufficio_liv4'); ?>

                <?php echo $form->dropDownList($model,'id_ufficio_liv4', 

                        $model->isNewRecord ? array() : Ufficio4liv::model()->getElencoUffici4Livello($idUff3Livello),

                        array('prompt' => 'Seleziona Ufficio'));

                ?>

		<?php echo $form->error($model,'id_ufficio_liv4'); ?>

	</div>        

mentre questo è il codice nel controller:


        /**

	 * Carica gli uffici di 3°livello nella dopdownlist.

	 */        

        public function actionPopolaUffici3Liv()

        {

            $criteria = new CDbCriteria;

            $criteria->order = 'nomeufficio ASC';

            $criteria->condition = 'id_ufficio_2liv=:id';

            $criteria->params[':id'] = (int) $_POST['Utente']['id_ufficio_liv2'];

            $data=Ufficio3liv::model()->findAll($criteria);

            $data=CHtml::listData($data,'id','nomeufficio');

            foreach($data as $value=>$nomeufficio)

            {

                echo CHtml::tag('option',

                          array('value'=>$value),CHtml::encode($nomeufficio),true);

            }

          

        }        

        

        /**

	 * Carica gli uffici di 4°livello nella dopdownlist.

	 */        

        public function actionPopolaUffici4Liv()

        {

            $criteria = new CDbCriteria;

            $criteria->order = 'nomeufficio ASC';

            $criteria->condition = 'id_ufficio_3liv=:id';

            $criteria->params[':id'] = (int) $_POST['Utente']['id_ufficio_liv3'];

            $data=Ufficio4liv::model()->findAll($criteria);

            $data=CHtml::listData($data,'id','nomeufficio');

            foreach($data as $value=>$nomeufficio)

            {

                echo CHtml::tag('option',

                          array('value'=>$value),CHtml::encode($nomeufficio),true);

            }

          

        }        

Grazie in anticipo per l’aiuto…

Up!

guardati questo:

devi usare il success nella prima dropdown, per eseguire una funzione js, l’update è comodo ma è una semplificazione e non ti permette di fare quello che desideri.

ti ringrazio per l’intervento.

Darò un’occhiata…

Grazie al consiglio di st4nny ho quasi risolto il mio problema.

Nella prima dropdown ho inserito il seguente codice:


'success'=> 'function(data) {

      $("#dropdown2ID").empty();

      $("#dropdown2ID").append(data);

      $("#dropdown3ID").empty();

} ',



e nella seconda:


'success'=> 'function(data) {

      $("#dropdown3ID").empty();

      $("#dropdown3ID").append(data);

} ',

Così facendo variando il valore della prima dropdownlist, le altre due vengono azzerate, e viene popolata solo la seconda.

Il problema è che azzerando le dropdownlist viene tolto anche il prompt, che io ricreo nella action del controller in fase di popolamento…

Naturalmente questo non vale per la terza dropdownlist in cui il prompt viene ricreato a seguito di aggiornamento della seconda dropdownlist.

Esiste un metodo per ricrearlo con la success della prima dropdownlist?

Grazie.

prova al posto di prompt, empty




array('empty' => 'Seleziona qlcs')); 

invece di

array('prompt' => 'Seleziona qlcs'));



oppure metodo balordo:

array_merge(array(’’=>‘Seleziona qlcs’), CHtml::listData($data,‘id’,‘nomeufficio’));

Già provato…

Il mio problema era evitare che il contenuto del dropdownlist n.3 non non si riferisse più al contenuito del drop n.2.

Quindi per evitare tutto ciò con success nel primo dropdown azzero tutto.

Avrei bisogno di aggiungere il prompt alle altre dropdownlist direttamente dalla prima, e non da controller.

Per questo avevo pensato ad altro codice da inserire nella success della prima dropdownlist.

Comunque è solo un problema estetico, in quanto solo per un momento nella dropdownlist non c’è niente, in quanto selezionando qualcosa nella seconda il prompt si ricrea…

risolvila con jquery:




 $("#dropdown2ID").append("<option value="">Seleziona</option>"+data);



Grazie st4nny,

avevo già visto qualcosa del genere googlando…

aspetto di andare a casa per provare…

Funziona!

Grazie per l’aiuto st4nny.