Yii Framework Forum: Autocomplete Dipendenti Concatenati - - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Autocomplete Dipendenti Concatenati - Aiuto per migliorare il codice Rate Topic: -----

#1 User is offline   roccodelux 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 27
  • Joined: 08-September 12

Posted 09 October 2012 - 05:16 AM

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.
0

#2 User is offline   zaccaria 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 2,232
  • Joined: 04-October 09
  • Location:Moscow

Posted 09 October 2012 - 05:24 AM

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
0

#3 User is offline   roccodelux 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 27
  • Joined: 08-September 12

Posted 11 October 2012 - 01:43 AM

View Postzaccaria, on 09 October 2012 - 05:24 AM, said:

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);
                    
                }',
               
            ),
            
        
        ));

?>



0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users