[Yii 1][Risolto]Problema con Autocomplete in un form

Salve a tutti,

sto provando a far si che in un form nel campo “ricerca_cliente” se l’ utente scrive 2 lettere gli si apra la “tendina” nella quale può selezionare il cliente che gli serve.

In questa "tendina" trova tutti i dati del cliente, tra cui indirizzo, comune, provincia etc. Con ciò che ho creato tutti questi campi (presi attraverso una query dal databse) al click sul nome del cliente vanno a riempire un solo campo. Io invece vorrei che a ogni campo si andasse a posizionare il value corretto. Lotto con questa cosa da una settimana, ma nn ne cavo piede.

Allego un screen dove si vede la tendina che compare ma tutti quei dati vanno a finire in un solo textField al click sul nome. Dovrebbero andare a posizionarsi nei vari textField. Qualcuno può darmi una mano perfavore :)

Questo e il codice della mia action nel Controller:




public function actionAutocomplete($term) {


        $criteria = new CDbCriteria;

        $criteria->compare('cliente_nome', $term, true);

        $model = Missiva::model()->findAll($criteria);


    foreach ($model as $value) {

    $array[] = array(

	'value' => $value->cliente_cognome. '   ' .$value->cliente_nome. '   ' .$value->cliente_tipovia . '   ' 

	.$value->cliente_indirizzo. ' n. ' .$value->cliente_civico. ' - ' .$value->cliente_cap. ', ' .$value->cliente_comune.

	' (' .$value->cliente_provincia.')', 


	

	'label' => $value->cliente_cognome. '   ' .$value->cliente_nome. '   ' .$value->cliente_tipovia . '   ' 

	.$value->cliente_indirizzo. ' n. ' .$value->cliente_civico. ' - ' .$value->cliente_cap. ', ' .$value->cliente_comune.

	' (' .$value->cliente_provincia.')',

	);

			

        }

		

        echo CJSON::encode($array);

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

    }



Questo invece è il codice che ho nella vista:




<div class="table_box">


<?php $form=$this->beginWidget('bootstrap.widgets.TbActiveForm', array(

	'id'=>'missiva-form',

	

	// Please note: When you enable ajax validation, make sure the corresponding

	// controller action is handling ajax validation correctly.

	// There is a call to performAjaxValidation() commented in generated controller code.

	// See class documentation of CActiveForm for details on this.

	'enableAjaxValidation'=>true,

	'clientOptions'=>array(

	 'validate OnSubmit'=>true,

))); ?>


	<?php echo $form->errorSummary($model); ?>

        <div class="table_box">

        <table class="tabella_login" style="width: 100%; margin: auto;">

  <tbody>

    <tr>

	  <td colspan=2 class="tabella_info_header tabella_first_form">Destinatario</td>

	</tr>

    

     <tr>

        <td class="tabella_info_campo_data" width="15%">

        Ricerca

        </td>

        <td class="table_info_data" style="padding-top:20px;">

        <?php

        echo CHtml::textField('selectedvalue','');


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

            'name'=>'ricerca_cliente',

            'value'=>'',

            'source'=>CController::createUrl('/missiva/autoComplete'),

            'options'=>array(

            'showAnim'=>'fold',         

            'minLength'=>'2',

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

                        $("#cliente_nome").val( ui.item.label );

                        $("#cliente_nome").val( ui.item.value );


                        return true;

                  }',

            ),

            'htmlOptions'=>array(

            'onfocus' => 'js: this.value = null; $("#ricerca_cliente").val(null); $("#selectedvalue").val(null);',

            //'class' => 'input-xxlarge search-query',

            'placeholder' => "Search...",

            ),

            ));

        ?>

        </td>

        </tr>

       

        <tr>

        <td class="tabella_info_campo_data" width="15%">

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

        </td>

        <td class="table_info_data">

		<?php echo $form->textField($model,'cliente_cognome',array('class'=>'span6','maxlength'=>100)); ?>

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

        </td>

        </tr>

        

        <tr>

        <td class="tabella_info_campo_data">

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

        </td>

        <td class="table_info_data" style="padding-top:20px;">

		<?php echo $form->textField($model,'cliente_nome',array('class'=>'span6','maxlength'=>100)); ?>

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

        </td>

        </tr>

        

        <tr>

        <td class="tabella_info_campo_data" rowspan="3">

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

        </td>

        <td class="table_info_data" style="padding-top:20px;">

		<?php echo $form->dropDownList($model,'cliente_tipovia', CHtml::listData(Ubicazioni::model()->findAll(), "nomeub","nomeub"), array('class'=>'span2'));?>

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

        

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

		<?php echo $form->textField($model,'cliente_indirizzo',array('class'=>'span6','maxlength'=>50)); ?>

         N°

        <?php echo $form->textField($model,'cliente_civico',array('class'=>'span1','maxlength'=>10)); ?>

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

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

        </td>

        </tr>

        

        <tr>

        <td class="table_info_data" style="border-left:1px solid #b11a01; border-right:3px solid #b11a01; padding-top:20px;">

         Cap<?php /*echo $form->labelEx($model,'cap'); */?>

		<?php echo $form->textField($model,'cliente_cap',array('class'=>'span1','maxlength'=>10)); ?>

        

        Comune<?php /*echo $form->labelEx($model,'comune'); */?>

        <?php echo $form->textField($model,'cliente_comune',array('class'=>'span4','maxlength'=>60)); ?>

        

        <?php /*echo $form->labelEx($model,'prov'); */?>

        Provincia <?php echo $form->textField($model,'cliente_provincia',array('class'=>'span1','maxlength'=>60)); ?>

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

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

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

        </td>

        </tr>

.....................ALtri campi che non mi interessa riempire 



Secondo me dovresti operare con javascript. Farti uno split della item scelta e riempire i vari campi di input.





$(document).ready(function () {

    $('#ricerca_cliente').on('autocompletechange change', function () {

        var str = this.value;

        var campi = str.split(" ");

        $('#cognome').html(campi[0]);

    }).change();

});




Grazie della risposta messema. :)

E’ la prima volta che provo a fare una cosa del genere.

Non riesco a farlo funzionare!!!

Quindi alla voce

$(’#cognome’).html(campi[0]); al posto di 0 cosa dovrei mettere per dirgli che nel campo cliente_cognome deve inserire il cognome?

Ho provato a cambiare in quel punti con ui.item."nomecampo" inserendo la lista dei campi…ma niente.

Ho poi provato anche cosi:





<script type="text/javascript">

$(document).ready(function () {

    $('#ricerca_cliente').on('autocompletechange change', function () {

        var str = this.value;

        var campi = str.split(" ");

		$('#ricerca_cliente').html(campi[0]);

		$('#cliente_cognome').html(campi[0]);

		$('#cliente_nome').html(campi[0]);

		$('#cliente_tipovia').html(campi[0]);

		$('#cliente_indirizzo').html(campi[0]);

		$('#cliente_civico').html(campi[0]);

		$('#cliente_cap').html(campi[0]);

		$('#cliente_comune').html(campi[0]);

		$('#cliente_provincia').html(campi[0]);

    }).change();

});

</script>



Non capisco se non riesce a dividere la stringa…o se sto sbagliando tutto quanto io.

Oppure se è sbagliato il codice nel campo "ricerca_cliente" in alto nel codice che ho postato la prima volta.

Ho provato a cambiare anche quello cosi:




        <?php

        echo CHtml::textField('selectedvalue','');


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

            'name'=>'ricerca_cliente',

            'value'=>'',

            'source'=>CController::createUrl('/missiva/autoComplete'),

            'options'=>array(

            'showAnim'=>'fold',         

            'minLength'=>'2',


            ),

            ));

        ?>



…ma niente da fare.

Scusa l’ ignoranza…ma essendo la prima volta ed essendo una settimana che ci dò di matto ti chiedo di capire e di aiutarmi ancora un pochino se puoi :)

Grazie ancora.

Lo split ti crea un array di valori, per ogni campo devi usare un elemento dell’array, quindi devi incrementare l’indice:





<script type="text/javascript">

$(document).ready(function () {

    $('#ricerca_cliente').on('autocompletechange change', function () {

        var str = this.value;

        var campi = str.split(" ");

		$('#ricerca_cliente').html(campi[0]);

		$('#cliente_cognome').html(campi[1]);

		$('#cliente_nome').html(campi[2]);

		$('#cliente_tipovia').html(campi[3]);

		$('#cliente_indirizzo').html(campi[4]);

		$('#cliente_civico').html(campi[5]);

		$('#cliente_cap').html(campi[6]);

		$('#cliente_comune').html(campi[7]);

		$('#cliente_provincia').html(campi[8]);

    }).change();

});

</script>



Questo mi farebbe ‘paura’ :rolleyes: : anche se come divisore hai usato 3 spazi sei sicuro che non ci saranno mai tre spazi in un indirizzo o un cognome scritto male?

Io, una volta selezionato il cliente, farei una richiesta ajax al controller che mi rimanda il model corretto con cui visualizzare i campi.

Devi impostare l’id del CJuiAutoComplete:

‘id’=>‘ricerca_cliente’,

Fare una richiesta ajax è più pulito e comprende vari casi, sicuramente meglio.

Ragazzi vi ringrazio moltissimo delle delucidazioni e della pazienza. Stasera provo ciò che mi avete scritto. Credo che abbiate capito che con Ajax sto iniziando adesso… Visto che fino a poco tempo fa usavo script pronti che poi adattavo alle mie esigenze programmando con php e linguaggio html. Da poco ho iniziato ad usare il framework…che mi entusiasma e a volte mi fa sembrare tutto più facile…ma a volte mi fa impazzire e questo è uno di quei casi. Ovviamente per colpa mia visto che sono io che non conosco Ajax e non lui. Etto lo mi consigli di ridurre gli spazi? Senza farmi ammattire con chiamate o è meglio che mi metto a studiare? Comunque sia vi ringrazio ancora per l aiuto.

Non preoccuparti… non passa mai! ;D

Huahauahauahuuahau ecco tu mi incoraggi grazie :)

Allora, le vostre indicazioni hanno funzionato a dovere.

Ma mi sono accorto che anche senza usare lo javascript, e impostando l’ action del controller in questo modo tutto funziona a dovere. Ovviamente bisognava comunque impostare l’ ida a tutti i campi che mi servivano :slight_smile:

Mistero risolto ;D come dice mariello prappappapo ;D o come cavolo si chiama.

Posto l’ action del controller in caso servisse a qualcuno.

Action del controller:




public function actionAutocomplete($term) {

        $criteria = new CDbCriteria;

		$criteria->compare('cliente_cognome', $term, true);

        //$criteria->compare('cliente_nome', $term, true);

        $model = Missiva::model()->findAll($criteria);


    foreach ($model as $value) {

    $array[] = array(

	'cliente_cognome' => $value->cliente_cognome,

	'cliente_nome'=> $value->cliente_nome,

	'cliente_tipovia'=> $value->cliente_tipovia,

	'cliente_indirizzo'=> $value->cliente_indirizzo,

	'cliente_civico'=> $value->cliente_civico,

	'cliente_cap'=> $value->cliente_cap,

	'cliente_comune'=> $value->cliente_comune,

	'cliente_provincia'=> $value->cliente_provincia,

	'cliente_stato'=> $value->cliente_stato,


	

	'label' => $value->cliente_cognome. '   ' .$value->cliente_nome. '   ' .$value->cliente_tipovia . '   ' 

	.$value->cliente_indirizzo. ' n. ' .$value->cliente_civico. ' - ' .$value->cliente_cap. ', ' .$value->cliente_comune.

	' (' .$value->cliente_provincia.')'. ' - '.$value->cliente_stato,

	);

			

        }

		


        echo CJSON::encode($array);

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

    }



Grazie comunque a ettolo e messema perchè senza le vostre indicazioni starei imprecando alla grande ahauahauhaua ;D