Autocomplete Dipendenti Concatenati -

Vi posto un esempio completamente funzionante di 2 input text dipendenti in autocomplete.

Inserita nella prima text la provincia nella seconda si selezionano solo i comuni di appartenenza.

Questo esempio è stato possibile grazie all’aiuto del post di:

Paskuale

Giuseppe e alla query di Diopralinato

Vi chiedo di contribuire per migliorare il codice che ho scritto.

Come primo step seguite il post di paskuale. Successivamente modificate come di seguito:

— codice view _form ------




<div class="row">

<?php


	

	

	/**

	 * Provicia Residenza

	 */

	

	/** Se si tratta di un nuovo inserimento $provincia è vuoto altrimenti,

	 *   se un update carico il valore testuale del comune nella input

	 *  (assegnandolo come $value a CJuiAutoComplete)

	*/

	 if (!$model->isNewRecord) // in caso di UPDATE carico il comune->nome

	 {

	 $provincia=Provincia::model()->findByPk($model->provincia)->nome;

	 }else{

	 $provincia='';

	 }

	

	 /* questo controllo nascosto riceverà l'id del comune scelto non il nome*/

	

	

	echo $form->hiddenField($model,'Provincia',array('id'=>'hidden_residenza_provincia_id'));

	echo $form->labelEx($model,'Provincia');

	




    

      $this->widget('zii.widgets.jui.CJuiAutoComplete', array(

            'id'=>'pnome',

			'name'=>'pnome',

			'value'=>$provincia,

			//'value'=>'test21',

			'source'=>$this->createUrl('index.php/autocomplete/autocompleteProvincia'),




			//'id'=>'searchBox',

            //'name'=>'searches',

            //'source'=>$this->createUrl('user/complete'),

            // additional javascript options for the autocomplete plugin

            //in the controller


            'options'=>array(

               'showAnim'=>'fold', 

               'delay'=>300, // wait 300ms after user stops typing

               'minLength'=>2, // length of entered characters before completing

               'select'=>'js:function(event, ui) { 

                     $("#pnome").val(ui.item.id); // ui.item.whatYouReturnInController

					 $("#hidden_residenza_provincia_id").val(ui.item.id)

                     alert(ui.item.id+" "+ui.item.label + " "+ui.item.value);

                    

                }',

               

            ),

            

        

        ));


?>

</div>

		

		

		

		

		

		

	

	

	<div class="row">

	<?php


	

	

	/**

	 * Comune di Residenza

	 */

	

	/** Se si tratta di un nuovo inserimento $comune è vuoto altrimenti,

	 *   se un update carico il valore testuale del comune nella input

	 *  (assegnandolo come $value a CJuiAutoComplete)

	*/

	 if (!$model->isNewRecord) // in caso di UPDATE carico il comune->nome

	 {

	 $comune=Comuni::model()->findByPk($model->residenza)->nome;

	 }else{

	 $comune='';

	 }

	

	 /* questo controllo nascosto riceverà l'id del comune scelto non il nome*/

	

	

	echo $form->hiddenField($model,'Citta',array('id'=>'hidden_residenza_comune_id'));

	echo $form->labelEx($model,'Citta');

	

	




    

      $this->widget('zii.widgets.jui.CJuiAutoComplete', array(

			

            'id'=>'cnome',

			'name'=>'cnome',

			'value'=>$comune,

	

            'options'=>array(

				

               'showAnim'=>'fold', 

               'delay'=>30, // wait 300ms after user stops typing

               'minLength'=>2, // length of entered characters before completing

			   'search'=>'js:function(){

				var url ="'.$this->createUrl('index.php/autocomplete/autocompleteTest?newparam=').'"

                url = url+$("#hidden_residenza_provincia_id").val();

				$("#cnome").autocomplete({

				 source : url,

				});

                    

                }',

               

            ),

            

        

        ));


?>

</div>






— codice Controller Autocomplete ------




<?php


class AutocompleteController extends Controller

{


	public $layout='main';

	

	

	

	public function actionIndex()

	{

		// renders the view file 'protected/views/site/index.php'

		// using the default layout 'protected/views/layouts/main.php'

		$this->render('index');

		

		//$newparam = CHttpRequest::getParam('newparam',null);

	}

  

	public function actionAutocompleteProvincia(){

		$res =array();

		if(isset($_GET['term'])){

			$qtxt =" SELECT province.nome AS pnome, province.id AS pid FROM province 

            WHERE province.nome LIKE :provincia";

			$command =Yii::app()->db->createCommand($qtxt);

			$command->bindValue(":provincia", '%'.$_GET['term'].'%', PDO::PARAM_STR);

			//$res =$command->queryColumn();

			$res = $command->queryAll();

			foreach($res as $p)

			{

				$results[] = array(

						'label'=>$p['pnome'],

						'value'=>$p['pnome'],

						'id'=>$p['pid'],

					

				);

					

			}

			

		}

		echo CJSON::encode($results);

		Yii::app()->end();

	}

	

	public function actionAutocompleteTest() {

		$res =array();

	

		

		$provinciaid = CHttpRequest::getParam('newparam',null);

	

		if (isset($_GET['term']) and isset($provinciaid) ) {

			// http://www.yiiframework.com/doc/guide/database.dao

			

			$qtxt ="SELECT comuni.id as cid, comuni.nome AS cnome, province.nome AS pnome, province.id AS pid FROM comuni INNER JOIN province

            ON comuni.id_provincia=province.id

            WHERE comuni.nome LIKE :comune AND province.id = :provinciaid";

			

	

	

			$command =Yii::app()->db->createCommand($qtxt);

			$command->bindValue(":comune", '%'.$_GET['term'].'%', PDO::PARAM_STR);

			$command->bindValue(":provinciaid", $provinciaid, PDO::PARAM_STR);

			$res = $command->queryAll();

			

			foreach($res as $p)

			{

				$results[] = array(

						'label'=>$p['cnome'],

						'value'=>$p['cnome'],

						'id'=>$p['cid'],

						'pv'=>$p['pnome'],

				);

			

			}

			

			

		}

	

		echo CJSON::encode($results);

		Yii::app()->end();

		}

}



Saluti a tutti e grazie al contributo che fornite al forum.

questa parte qua:


        /**

         * Comune di Residenza

         */

        

        /** Se si tratta di un nuovo inserimento $comune è vuoto altrimenti,

         *   se un update carico il valore testuale del comune nella input

         *  (assegnandolo come $value a CJuiAutoComplete)

        */

         if (!$model->isNewRecord) // in caso di UPDATE carico il comune->nome

         {

         $comune=Comuni::model()->findByPk($model->residenza)->nome;

         }else{

         $comune='';

         }

Toglila dalla view, non sta bene fare le query nella view.

Fai piuttosto un metodo nel model getCnome():


if ($this->comune)

   return $this->comune->nome;

else 

   return ''

Nella view ti resta:




        <div class="row">

        <?php echo $form->hiddenField($model,'Citta',array('id'=>'hidden_residenza_comune_id'));?>

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

        

       <?php $this->widget('zii.widgets.jui.CJuiAutoComplete', array(

                        

            'id'=>'cnome',

                        'name'=>'cnome',

                        'value'=>$model->cnome,

                ...

        ));


?>

</div>



Oppure puoi elaborare il widget in modo indipendente, in modo da avere un solo widget che unisce l’hiddenField e la CJuiAutocomplete

Grazie Zaccaria. Ho dovuto apportare ulteriore modifiche al codice per riuscire a prelevare il valore del campo Comune.

Ho fatto una chiamata ajax per passare il valore al source prelevandolo dal campo hidden_residenza_provincia_id .

Di seguito il codice.

P.S Come posso fare ad avere una combobox con autocomplete ?

Esite un modulo tipo zii.widgets.jui.CJuiAutoComplete ?

Usando una combobox eviterei che gli utenti possono scrivere altri caratteri (sporcare il campo text) dopo aver scelto il valore.

Grazie

Codice view _form





<?php


	/**

	 * Provicia Residenza

	 /* questo controllo nascosto riceverà l'id del comune scelto non il nome*/

	

	

	echo $form->hiddenField($model,'Provincia',array('id'=>'hidden_residenza_provincia_id'));

	echo $form->labelEx($model,'Provincia');

	




    

      $this->widget('zii.widgets.jui.CJuiAutoComplete', array(

            'id'=>'pnome',

			'name'=>'pnome',

			'value'=>$model->pnome,

			//'value'=>'test21',

			'source'=>$this->createUrl('index.php/autocomplete/autocompleteProvincia'),




			//'id'=>'searchBox',

            //'name'=>'searches',

            //'source'=>$this->createUrl('user/complete'),

            // additional javascript options for the autocomplete plugin

            //in the controller


            'options'=>array(

               'showAnim'=>'fold', 

               'delay'=>300, // wait 300ms after user stops typing

               'minLength'=>2, // length of entered characters before completing

               'select'=>'js:function(event, ui) { 

                     $("#pnome").val(ui.item.id); // ui.item.whatYouReturnInController

					 $("#hidden_residenza_provincia_id").val(ui.item.id)

                     alert(ui.item.id+" "+ui.item.label + " "+ui.item.value);

                    

                }',

               

            ),

            

        

        ));


?>

</div>





	<div class="row">

	<?php


	

	

	/**

	 * Comune di Residenza

	 */

	


	 /* questo controllo nascosto riceverà l'id del comune scelto non il nome*/

	

	

	echo $form->hiddenField($model,'Citta',array('id'=>'hidden_residenza_comune_id'));

	echo $form->labelEx($model,'Citta');


    

      $this->widget('zii.widgets.jui.CJuiAutoComplete', array(

			

            'id'=>'cnome',

			'name'=>'cnome',

			'value'=>$model->cnome,

			'source'=>'js: function(request, response) {

   					 $.ajax({

       						 url: "'.$this->createUrl('index.php/autocomplete/autocompleteTest').'",

        					 dataType: "json",

       						 data: {

           						 term: request.term,

            					 newparam: $("#hidden_residenza_provincia_id").val(),

  					         },

       					     success: function (data) {

                		     response(data);

        					}

    				})

 			 }',

               'options'=>array(

               'showAnim'=>'fold', 

               'delay'=>300, // wait 300ms after user stops typing

               'minLength'=>2, // length of entered characters before completing

               'select'=>'js:function(event, ui) { 

                     $("#cnome").val(ui.item.id); // ui.item.whatYouReturnInController

					 $("#hidden_residenza_comune_id").val(ui.item.id)

                     alert(ui.item.id+" "+ui.item.label + " "+ui.item.value);

                    

                }',

               

            ),

            

        

        ));


?>