Cjuiautocomplete Memorizzare Valori Customizzati

Ciao a tutti,

Avete qualche suggerimento su come usare CJuiAutoComplete e memorizzare anche dati che non vengono proposti.

Attualmente, uso il metodo del campo nascosto che viene tramite js valorizzato con l’id della selezione scelta.

<?php echo $form->labelEx($model, ‘legaleRappr’); ?>

         &lt;?php   &#036;this-&gt;widget('zii.widgets.jui.CJuiAutoComplete', array(


                'id' =&gt; 'legaleRappr_customid',


                'name' =&gt; 'legaleRappr_custom',


                'value' =&gt; (&#036;model-&gt;legaleRappr) ? Persona::model()-&gt;find(&quot;idpersone='&quot; . &#036;model-&gt;legaleRappr . &quot;'&quot;)-&gt;cognome.&quot; &quot;.Persona::model()-&gt;find(&quot;idpersone='&quot; . &#036;model-&gt;legaleRappr . &quot;'&quot;)-&gt;nome : '',


                'source' =&gt; &#036;this-&gt;createUrl('persona/autocomplete'),


                'options' =&gt; array(


                    'showAnim' =&gt; 'fold',


                    'select' =&gt; 'js:function(event, ui){ &#036;(&quot;#hidden_legale_rappre_id&quot;).val(ui.item.id).trigger(&quot;change&quot;);}',


                    





                ),


            )); ?&gt;

Grazie mille

Stefano

Lo stai usando semplicemente come campo di autocompletamento o come gestione di tag?

Ciao Fabrizio,

Mi servirebbe per l’autocompletamento (almeno credo :D ). mi spiego meglio, in questo campo andrebbe il legale che se e’ presente viene pescato da una tabella ( quindi suggerito ) altrimenti memorizza quello inserito.

Grazie mille

Ok, perchè io avevo del codice pronto per la gestione di tag con autocompletamento.

Sinceramente non so per quanto riguarda l’autocompletamento semplice.

Ti dispiace postarlo? Cosi’ caso mai mi viene uno spunto.

Grazie mille

Stefano

Certo:




	<?php $arrTagsIniziali = array(); ?>

	<?php $arrTagsDisponibili = array(); ?>

	<?php $arrT = RepositoryTags::model()->CaricaTuttiTipoTags($model->id); ?>

	<?php foreach($arrT as $t) $arrTagsIniziali[] = $t->nome; ?>

	<?php $arrT = RepositoryTags::model()->CaricaTuttiTipoTagsDisponibili($utenteSessione->id_ditta); ?>

	<?php foreach($arrT as $t) $arrTagsDisponibili[] = $t->nome; ?>

	<div class="row">

		<?php echo CHtml::hiddenField('Repository_tags_lista', ''); ?>

		<?php echo CHtml::label('Tags','tags'); ?>

		<?php $this->beginWidget('ext.autoctagit.autoctagit', array('idWidget' => 'Repository_tags', 'arrTagsIniziali' => $arrTagsIniziali, 'arrTagsDisponibili' => $arrTagsDisponibili)); ?>

		<?php $this->endWidget(); ?>

	</div>	



Ho creato un’estensione al plugin JQuery TagIt (http://webspirited.com/tagit/)

ext.autoctagit.autoctagit.php:




<?php

class autoctagit extends CWidget

{

    public $idWidget;

	public $arrTagsIniziali;

	public $arrTagsDisponibili;

    

    public function init()

    {

		$baseUrlCSS=Yii::app()->getAssetManager()->publish( dirname(__FILE__).'/css' ); 

		$baseUrlJS=Yii::app()->getAssetManager()->publish( dirname(__FILE__).'/js' ); 

		

		if ($this->arrTagsIniziali == null) $this->arrTagsIniziali = array(); 

		if ($this->arrTagsDisponibili == null) $this->arrTagsDisponibili = array(); 

		

        // Questo metodo è invocato da CController::beginWidget()

        $this->render('autoctagit_view', array(

        	'baseUrlCSS' => $baseUrlCSS,

        	'baseUrlJS' => $baseUrlJS,

        	'idWidget' => $this->idWidget,

        	'arrTagsIniziali' => $this->arrTagsIniziali,

        	'arrTagsDisponibili' => $this->arrTagsDisponibili,

		));

    }

 

    public function run()

    {

        // Questo metodo è invocato da CController::endWidget()

    }

}

?>



ext.autoctagit.autoctagit.view.autoctagit.php




<?php Yii::app()->clientScript->registerCoreScript('jquery'); ?>

<?php Yii::app()->clientScript->registerCoreScript('jquery.ui'); ?>


<?php Yii::app()->clientScript->registerCssFile($baseUrlCSS.'/tagit-stylish-yellow.css'); ?>

<?php Yii::app()->clientScript->registerScriptFile($baseUrlJS.'/tagit.js'); ?>





<?php

Yii::app()->clientScript->registerScript('widget_autoctagit_start_'.$idWidget,

'

	$(function () {

		

	  $("#'.$idWidget.'").tagit({

	  		tagSource:'.json_encode($arrTagsDisponibili).', 

	  		editable:true, 

	  		triggerKeys:["enter", "comma", "tab"],

	  		initialTags:'.json_encode($arrTagsIniziali).'

		});




	});


'

,CClientScript::POS_HEAD);

?>

  <ul id="<?php echo $idWidget ?>" name="<?php echo $idWidget ?>">

  </ul>



Forse a questo punto pubblico direttamente l’estensione, in modo tale che può essere utile anche a qualcun’altro.

Io ho scritto un piccolo widget che estende CJuiAutoComplete, dal widget imposto il nome del campo usato per l’autocompletamento (es. nome utente) e il nome del campo che voglio memorizzare (es. user id).

Il widget mi crea tutto quello che serve senza dover aggiungere ogni volta un campo nascosto.

Inoltre mi serviva avere la possibilità di "switchare" tra due sorgenti JSON quindi crea anche un bottone per cambiare sorgente (es. anagrafica_donne, anagrafica_uomini)


<?php


/**

 * DaJuiAutoCompleteTarget class file.

 *

 * @author Nicola Tomassoni <nicola@digisin.it>

 * @link http://www.digisin.it/

 */

/**

 * @desc

 * Questo widget serve per creare un campo JuiAutoComplete e relativo campo di riempimento.

 * Un esempio: popolare il campo user_id cercando l'utente per nome.

 * 

 * al classico CJuiAutoComplete sono state aggiunte delle proprietà:

 * 

 * obbligatorie:

 *      'sourceField' => 'user_nome', // Nome del campo autocomplete (va a sostituire la proprietà 'name' di CJuiAutoComplete)

 *      'targetField' => 'user_id', // Nome del campo di destinazione, in genere il nome della proprietà del modello

 * 

 * Opzionali:

 * 'multiSource' => array (

 *       'primary' => array('/utenti_uomini/jsonList'), // Sorgente primaria

 *       'secondary' => array('/utenti_donne/jsonList'), // Sorgente secondaria

 *       'label' => 'Cerca tra le donne', // Label dello switch tra le due sorgenti, indicherà la seconda sorgente

 *       'name' => 'checkbox_switch', // nome del checkbox che fara lo switch

 *   ),

 * 

 * Impostando il parametro multiSource viene creato un checkbox per switchare tra le due sorgenti impostate

 * 

 */

Yii::import('zii.widgets.jui.CJuiAutoComplete');


class DaJuiAutoCompleteTarget extends CJuiAutoComplete {


  var $sourceField = '';

  var $targetField = '';

  var $multiSource = array();


  public function run() {

    $output = '';


    $target = CHtml::activeName($this->model, $this->targetField);

    $source = CHtml::activeName($this->model, $this->sourceField);

    $sourceId = CHtml::getIdByName($source);

    $targetId = CHtml::getIdByName($target);

    // Source elaborata da CJuiAutoComplete

    $this->name = $source;

    // Campo hidden

    $output .= CHtml::activeHiddenField($this->model, $this->targetField);

    // Se impostato processo il multisource

    if (isset($this->multiSource['primary']) && isset($this->multiSource['secondary'])) {

      $sources = array(CHtml::normalizeUrl($this->multiSource['primary']), CHtml::normalizeUrl($this->multiSource['secondary']));

      $this->source = $sources[0];


      $switchName = isset($this->multiSource['name']) ? $this->multiSource['label'] : $sourceId . '_switch';

      $switchLabel = isset($this->multiSource['label']) ? $this->multiSource['label'] : 'Cambia sorgente';

      // Forms fields

      $output .= '<div class="autocomplete-switch">';

      $output .= CHtml::label($switchLabel, $switchName);

      $output .= CHtml::checkBox($switchName);

      $output .= '</div>';

      // Register script

      $this->JsSwitchSource($switchName, $sourceId, $sources);

    }

    // Funzioni per passare l'id del nome trovato al campo hidden

    $this->options['select'] = 'js:function(event, ui){ jQuery("#' . $targetId . '").val(ui.item["id"]); }';

    $this->options['search'] = 'js:function(event, ui) { jQuery("#' . $targetId . '").val(""); }';

    // Register script

    $this->JsAutocompleteSync($sourceId, $targetId);

    // Prima processo e stampo l'autocomplete

    parent::run();

    // Poi il mio output aggiuntivo

    echo $output;

  }


  /**

   * @desc Visualizza o nasconde la stringa di default e simula il blur del campo del modello per attivare la validazione ajax 

   * 

   * @param type $source autocomplete id

   * @param type $destination campo presente nel modello

   */

  private function JsAutocompleteSync($source, $destination) {

    Yii::app()->clientScript->registerScript($source, '

if($("#' . $source . '").val() == "Cerca...")

    $("#' . $source . '").css("color", "silver");

        

$("#' . $source . '").focusin(function() {

    if($(this).val() == "Cerca...") {

        $(this).val("");

        $("#' . $source . '").css("color", "black");

    }

});


$("#' . $source . '").focusout(function() {

    if(jQuery(this).val() == "") {

        $("#' . $destination . '").val("");

    }


    $("#' . $destination . '").blur();

});');

  }


  /**

   * @desc Cambia il source all'oggetto jQuery autocomplete

   * 

   * @param type $obj checkbox id

   * @param type $target autocomplete id

   * @param type $urls url di ricerca primaria e secondaria

   */

  private function JsSwitchSource($obj, $target, $urls) {

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

$("#' . $obj . '").click(function(){

    if($(this).attr("checked")) {

        $("#' . $target . '").autocomplete("option", "source", "' . $urls[1] . '");

    }

    else {

        $("#' . $target . '").autocomplete("option", "source", "' . $urls[0] . '");

    }

});');

  }


}


?>

esempio di utilizzo




<div class="row">

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

        <?php $this->widget('DaJuiAutoCompleteTarget', array(

                'model' => $model,

                'sourceField' => 'user_autocomplete',

                'targetField' => 'user_id',

                'value' => $model->getUserValue(),

                'sourceUrl'=>array('api/1/user/jsonList'),

                'options'=>array(

                    'minLength'=>'3',

                ),

            ));

        ?>

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

    </div>



Boh magari può essere utile :)