Yii Framework Forum: Cjuiautocomplete Memorizzare Valori Customizzati - Yii Framework Forum

Jump to content

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

Cjuiautocomplete Memorizzare Valori Customizzati Rate Topic: -----

#1 User is offline   vangelis1977 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 37
  • Joined: 09-April 13

Posted 29 April 2013 - 10:57 AM

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'); ?>
<?php $this->widget('zii.widgets.jui.CJuiAutoComplete', array(
'id' => 'legaleRappr_customid',
'name' => 'legaleRappr_custom',
'value' => ($model->legaleRappr) ? Persona::model()->find("idpersone='" . $model->legaleRappr . "'")->cognome." ".Persona::model()->find("idpersone='" . $model->legaleRappr . "'")->nome : '',
'source' => $this->createUrl('persona/autocomplete'),
'options' => array(
'showAnim' => 'fold',
'select' => 'js:function(event, ui){ $("#hidden_legale_rappre_id").val(ui.item.id).trigger("change");}',


),
)); ?>

Grazie mille
Stefano
0

#2 User is offline   Fabrizio Caldarelli 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 989
  • Joined: 21-March 13
  • Location:Rome, Italy

Posted 29 April 2013 - 11:01 AM

Lo stai usando semplicemente come campo di autocompletamento o come gestione di tag?
Yii2 by example: my book about Yii2
https://www.packtpub...nt/yii2-example
0

#3 User is offline   vangelis1977 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 37
  • Joined: 09-April 13

Posted 29 April 2013 - 11:11 AM

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
0

#4 User is offline   Fabrizio Caldarelli 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 989
  • Joined: 21-March 13
  • Location:Rome, Italy

Posted 29 April 2013 - 11:15 AM

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

Sinceramente non so per quanto riguarda l'autocompletamento semplice.
Yii2 by example: my book about Yii2
https://www.packtpub...nt/yii2-example
0

#5 User is offline   vangelis1977 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 37
  • Joined: 09-April 13

Posted 29 April 2013 - 11:17 AM

Ti dispiace postarlo? Cosi' caso mai mi viene uno spunto.
Grazie mille
Stefano
0

#6 User is offline   Fabrizio Caldarelli 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 989
  • Joined: 21-March 13
  • Location:Rome, Italy

Posted 29 April 2013 - 11:28 AM

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.
Yii2 by example: my book about Yii2
https://www.packtpub...nt/yii2-example
1

#7 User is offline   Nicola 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 318
  • Joined: 13-March 11
  • Location:Italy

Posted 30 April 2013 - 03:23 AM

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 :)
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