Problema con CJuiAutoComplete

Hola amigos,

tengo un problema con CJuiAutoComplete.

En la vista tengo un formulario con varios textfield y el primer es mi CJuiAutocomplete que es mi textField de busuqeda.

El CJuiAutocomplete funciona bien por que a insertar 2 lettras de un nombre me salen todos los nombres que estan en la base datos que empiezen con las lettras que el usuario inserte. Si pincho en uno de los nombres que aparecen pero solo se autocompleta el textField del campo de busuqeda.

Lo que quiero es que a insertar las lettras en el campo de busuqeda, en la ventana se puedan veer mas attributos que aparacen a esos nombres, y pinchando en el nombre se me llenen los campos de mi form.

Alguien puede ayudarme por favor por que me estoy volviendo loco hace algunos dias.

Espero me entiendan…ya se que mi espanol tampoco esta perfecto-

Les pido disculpa.

Mi Controlador:




public function actionAutoComplete($term){


    $ricerca_cliente = $_GET['ricerca_cliente'];

$inizio_ricerca = Missiva::model()->findAll(

   'cliente_cognome LIKE :ricerca_cliente',

   array(':ricerca_cliente' => "%$ricerca_cliente%")

);

    $list = array();        

    foreach($inizio_ricerca as $risultati){

        $data['value']= $risultati['cliente_nome'];

		$data['cliente_cognome']= $risultati['cliente_cognome'];

		


        $list[]= $data;

        unset($data);

    }


    echo json_encode($list);

}



Mi vista:




<?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::hiddenField('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_cognome").val( ui.item.cliente_cognome );

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




                  }',

            ),

            '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>

        

        <tr>

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

		Nazione       

		<?php echo $form->dropDownList($model,'cliente_stato', CHtml::listData(Stati::model()->findAll(), "nome","nome"), array('class'=>'span4'));?>

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

        </td>

        </tr>

        <tr class="tabella_info_footer">

	     <td colspan=2 class="tabella_chiusura_form">

        </td>

        </tr>

        </tbody>

        </table>

        </div>



Hola,

he modificado mi funcion en el Controlador:




public function actionAutocomplete($term) {

        //the $term parameter is what the user typed in on the control

        //send back an array of data:

        $criteria = new CDbCriteria;

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

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


    foreach ($model as $value) {

    $array[] = array('value' => trim($value->cliente_cognome .$value->cliente_nome .$value->cliente_tipovia 

	.$value->cliente_indirizzo .$value->cliente_civico .$value->cliente_cap .$value->cliente_comune .$value->cliente_provincia), 

	

	'label' => trim($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();

    }



Ahora me sale bien el listado de todos los campo que apartenecen a el nombre que el usuario inserto en el textField de busqueda.

Lo que no entiendo es como puedo hacer para que al pinchar sobre el nombre que necesita el usuario se le llenen todos los campos de el formulario. De esta manera solo se le llena el campo "ricerca_cliente" con todas las opciones que apartenecen a ese "cliente".

Yo quiero que en el campo "cliente_nome" se visualize el campo que le apartenece y asi en los otros textField.

Les Ago un exemplo:

Esto es un cliente que tengo en la base datos:

Rossi Marco Calle Nacional 12

En la ventana de busuqeda se vee todo bien. Si el usuario pincha sobre ese nombre quiero que en el textField "cliente_cognome" le aparezca Rossi, en el textField "cliente_nome" le aparezca Marco y asi siguendo con los otros campos.

No llego hacer esto :frowning: alguien puede ayudarme por favor!!!

Hola Giannix, yo le he hecho con Jquery y ajax… Lo que puedes hacer es capturar el dato que se carga en el input del autocomplete y con ese dato buscar el resto de campos que necesitas.

te adjunto un codigo que te puede servir


$('#cli').change(function(){


	

		

		

		var id_cliente = jQuery('#cli').val();

		

		var action = 'create?r=cmvtoini/RepresentanteDynamic&id_cliente='+id_cliente;

		


		$.getJSON(action, function(listaJson) {

			// agrego el campo a mi textfield

			$('#representante').val(listaJson);

			

		});	


		var action = 'create?r=cmvtoini/TipoClienteDynamic&id_cliente='+id_cliente;

		

		$.getJSON(action, function(listaJson) {

			// agrego el campo a mi textfield

			$('#tipocliFalse').val(listaJson);

			

		});	


	}

)



basicamente loq ue hace es capturar el input cli y lo envía a un action que devuleve los parametros que necesitas rellenar.

Hola estebanhere30 y gracias por tu respuesta. Este trozo de codigo donde lo tendria que poner? En la vista donde tengo el textfield de busqueda justo?

Giannix, este código es javascript, por lo que puedes registrarlo en la vista, aunque lo recomendable es tenerlo en un archivo aparte y referenciarlo desde la vista…

Ten en cuenta que este script está mandando parámetros a un par de actions que se encargan de hacer discriminar la información que luego se retorna!

Entonces, he puesto el codigo en la vista pero no entiendo tu acciones




 var action = 'create?r=cmvtoini/RepresentanteDynamic&id_cliente='+id_cliente;

Que hacen? Puedes esplicarme un poco mas? Tu #cli es el textField de busqueda o es algo diferente? No entiendo como puedo adaptarlo a mi vista. Desculpa es la primera vez que entento hacer esto y tambien soy nuevo de Yii.

Desculpa he leido ahora tu respuesta :slight_smile:

Con tu script como puedo decirle che me llene los textField del formulario? Yo he creado algo parecido para que si el usuario seleziona algo de un menu se me llene un campo…lo he echo con :select. Pero lo que quiero hacer aun no entiendo como decirle que me llene los textField del formulario. Esto es mi problema.

Hola Giannix, te paso el código de uno de mis action


public function actionRepresentanteDynamic($id_cliente){


		$res = null;

		

		$Cliente = Cliente::model()->findByAttributes(array('idcliente'=>$id_cliente));

		$res = $Cliente->representante;

		header("Content-type: application/json");

		echo CJSON::encode($res);

	}

luego ese action retorna un valor y ese valor es cargado en el input que quieras con la siguiente instrucción espero haberte ayudado

$(’#tipocliFalse’).val(listaJson);

Otra vez muchisimas gracias. Bueno ahora entiendo un poco mas. Tu action te devuelve lo que tu quieras del Model Cliente.

Es una busqueda por id, donde tu puedes preguntar qualquier atributo apartenece a ese id.

Eso ya lo tengo en mi controlado y la ventana que me devuelve los valores ya esta bien como puedes veer en la imagen que he cargado.

Con tu istruccion $(’#tipocliFalse’).val(listaJson); vas a llenar el campo tipocliFalse. Si pero tienes que llenar todos lo campos del formulario con los atributos que apartenecen a ese id haces muchas action de este tipo o puedo crear…no se…ahora digo una tonteria…un array de campos de llenar? Voy buscando en google algo que pueda ayudarme a entender como puedo hacer esto y ya se que va ser una tonteria pero del momento me voy volviendo loco. Del momento te digo gracias por tu ayuda :slight_smile:

Nada, voy abandonar mi idea.!!! Ya esta…hace una p**a semana que ago pruebas y me voy de verdad volviendo loco. Gracias estebanhere30 por tu indicaciones :) Buenas noches

Hola Giannix, no te desanimes, aunque lamento no poder ayudarte más por que no he ido más allá de lo que te mostré. Pero supongo que si se puede hacer algo como lo que comentaste; es más, según hagas tu consulta queda conformado el objeto json, si haces la consulta más general podrás traer todos los datos de una vez y ahora será recorrer ese objeto.

Buenas.

Supongo que llego tarde, pero sería tan simple como que en la propiedad "select" del CJuiAutocomplete hacer una llamada AJAX a una acción que te devuelva los datos necesarios.

Pq supongo que la propiedad select lo que hace es lanzar la función JS que le indiques cada ves que se selecciona algo, no?

Por ejemplo:




public function actionRepresentanteDynamic($id_cliente){


                $res = null;

                

                $Cliente = Cliente::model()->findByAttributes(array('idcliente'=>$id_cliente));


                // ESTO ES LO QUE CAMBIA

                $res = $Cliente->attributes;

                //--------------------------




                header("Content-type: application/json");

                echo CJSON::encode($res);

        }



Con esto devuelves un array que tiene todos los datos del cliente. Entonces en el "success" del evento AJAX lo recoges y rellenas el resto de los datos del cliente.

Tu widget sería algo como esto:




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

                       {

                           $.ajax({

                                url : "controlador/accion",

                                type : "POST",

                                data : {id : ricerca_cliente.val()}, // O el valor que sea

                                success : function(data)

                                          {

                                              // Aquí cambias los ids y el nombre de las

                                              // propiedades por las que tengas tú, yo no 

                                              // me las sé

                                              $("#nombreCliente").val(data.nombre);

                                              $("#apellido1Cliente").val(data.apellido1);

                                              // Y así sucesivamente.

                                          }

                                });

                       }',

            ),

...

...



Puede que me haya comido algún paréntesis o corchete, pero vamos, básicamente sería así.

Un saludo.

a mi el cjuiautocomplete no me funcionó. Usé http://jqueryui.com/autocomplete/#multiple-remote y me funcionó bien