Consulta Sobre Cjuiautocomplete

Saludos comunidad,

Les cuento, resulta que necesito que un textbox tenga autocompletado, estoy siguiente este tutorial y me está funcionado perfecto, sólo que tengo un problema. Lo que quiero es que en el textbox pueda buscar por el nombre de la persona, pero en el momento de guardar, necesito que guarde el ID no el nombre, esto es debido a que es una llave foránea. Lo que tengo es lo siguiente:

/protected/extension/EAutoCompleteAction.php




<?php

class EAutoCompleteAction extends CAction

{

    public $model;

    public $attribute;

    private $results = array();

 

    public function run()

    {

        if(isset($this->model) && isset($this->attribute)) {

            $criteria = new CDbCriteria();

            $criteria->compare($this->attribute, $_GET['term'], true);

            $model = new $this->model;

            foreach($model->findAll($criteria) as $m)

            {

                $this->results[] = $m->{$this->attribute};

            }

 

        }

        echo CJSON::encode($this->results);

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

    }

}

?>



/protected/controllers/AtencionController.php




public function actions()

    {

        return array(

            'aclist'=>array(

                'class'=>'application.extensions.EAutoCompleteAction',

                'model'=>'Funcionario', //My model's class name

                'attribute'=>'fun_rut', //The attribute of the model i will search

            ),

        );

    }



/protected/views/atencion/_form.php




<div class="control-group">

        <?php echo $form->labelEx($model,'funcionario_fun_id',array('class'=>'control-label','label'=>'Funcionario')); ?>

        <div class="controls">

            <?php 

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

                    'attribute'=>'funcionario_fun_id',

                    'model'=>$model,

                    'value'=>  Funcionario::model()->fun_id,

                    'sourceUrl'=>array('Atencion/aclist'),

                    'name'=>'fun',

                    'options'=>array(

                        'minLength'=>'1',

                    ),

                    'htmlOptions'=>array(

                        'size'=>45,

                        'maxlength'=>45,

                    ),

                )); 

            ?>

        </div>

    </div>



De que forma podría hacer esto?

Saludos

Yo creo un campo oculto con el id para cada autocomplete asi no hay problemas.

Modifica un poco el action para añadir el campo clave:




<?php

class EAutoCompleteAction extends CAction

{

    public $model;

    public $id='id';

    public $attribute;

    private $results = array();

 

    public function run()

    {

        if(isset($this->model) && isset($this->attribute)) {

            $criteria = new CDbCriteria();

            $criteria->compare($this->attribute, $_GET['term'], true);

            $model = new $this->model;

            foreach($model->findAll($criteria) as $m)

            {                

		$this->results[] = array(

		'label'=>$m->{$this->attribute}, // label for dropdown list

		'value'=>$m->{$this->attribute}, // value for input field

		'id'=>$m->{$this->id}, // return values from autocomplete

		);                

            }

        }

        echo CJSON::encode($this->results);

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

    }

}



Por defecto tomara id como campo clave pero si fuese distinto se pasa como parametro en el action:




public function actions()

    {

        return array(

            'aclist'=>array(

                'class'=>'ext.EAutoCompleteAction',

                'model'=>'Funcionario', //My model's class name

                'attribute'=>'fun_rut', //The attribute of the model i will search

                'id'=>'id',             //no es necesario en este caso. Si queremos el valor de otro campo aqui el nombre

            ),

        );

    }



Y en la vista añadir el campo oculto y en el widget que al seleccionar un elemento coloque el id en el campo oculto.




            <?php 

                echo $form->hiddenField($model, 'id');


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

                    'attribute'=>'funcionario_fun_id',

                    'model'=>$model,

                    'value'=>  Funcionario::model()->fun_id,

                    'sourceUrl'=>array('Atencion/aclist'),

                    'name'=>'fun',

                    'options'=>array(

                        'minLength'=>'1',

			'limit'=>'10',

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

				$('#id').val(ui.item.id);  

			}"

                    ),

                    'htmlOptions'=>array(

                        'size'=>45,

                        'maxlength'=>45,

                    ),

                )); 

            ?>



Creo que es todo, si necesitases pasar más variables puedes modificar la clase.

Para querys complejas (más de una tabla) mejor un action específico en el controlador, el método sería una copia del run del action pero con la query que se necesite.

Espero que funcione, saludos

Hola,

[s]Muchas gracias por la ayuda, pero tengo un problema, al principio no me funcionaba el auto-completado, empecé a intentar seguir el código y la que hace que no trabaje el auto-completado es esta línea:


'id'=>$m->{$this->id}, // return values from autocomplete

Que está en la clase EAutoCompleteAction, como lo podría solucionar?

Saludos[/s]

Estimado, ahora me está funcionando el autompletado, teniendo EAutoCompleteAction, de la siguiente forma:


<?php

class EAutoCompleteAction extends CAction

{

    public $model;

    public $id='fun_id';

    public $attribute;

    private $results = array();

 

    public function run()

    {

        if(isset($this->model) && isset($this->attribute)) {

            $criteria = new CDbCriteria();

            $criteria->compare($this->attribute, $_GET['term'], true);

            $model = new $this->model;

            foreach($model->findAll($criteria) as $m)

            {

                //$this->results[] = $m->{$this->attribute};

                $this->results[] = array(

                    'label'=>$m->{$this->attribute}, // label for dropdown list

                    'value'=>$m->{$this->attribute}, // value for input field

                    'id'=>$m->{$this->id}, // return values from autocomplete

                );   

            }

 

        }

        echo CJSON::encode($this->results);

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

    }

}

?>

Cambie


public $id='id';

por


public $id='fun_id'

y me está funcionando, pero a pesar de eso, no me guarda el ID, me está dando un problema, me muestra el siguiente error:

Otra consulta, por lo que veo en el error, estoy guardando los valores :yp0, :yp1, :yp2, :yp3, :yp4, como podría hacer para ver esos valores, y así, saber que es lo que estoy enviando por el formulario?

Saludos

Para ver los parametros de bindin en config/main.php componente db debes tener:




'enableProfiling' => true,     //para poder ver las sql

'enableParamLogging' => true,  //para poder ver los parametros 



Creo que con poner la 2ª te vale.

Pero 1º mira que el valor id del campo oculto varie al seleccionar un registro, porque si el cambio no lo hace te llegaría un id vacio y produciría error.

Crea el campo oculto directamente para que no dependa de nada:




//echo $form->hiddenField($model, 'id'); //comentalo

echo '<input type="hidden" id="id_relacion" name="id_relacion" value="0" />';



y en el widget el select




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

      $('#id_relacion').val(ui.item.id);  // que el id enlace con el campo oculto.

}



El cambio que comentas no deberías necesitarlo, yo simplemente puse el valor más normal para mi en el id:




public $id='id';



pero en este caso en el action se le pasaría el id que indicas:




public function actions()

    {

        return array(

            'aclist'=>array(

                'class'=>'ext.EAutoCompleteAction',

                'model'=>'Funcionario', //My model's class name

                'attribute'=>'fun_rut', //The attribute of the model i will search

                'id'=>'fun_id',         //en este caso si es necesario.

            ),

        );

    }



Si el valor del campo oculto varia en el POST debes recibir el valor pero haz un [echo, var_dump,print_r,…] del $_POST y verifica que es así.

Y a seguir probando, suerte.

Estimado,

Muchas gracias!! el error que tenía es que el nombre/id del input, era el mismo que el del CJuiAutoComplete


echo '<input type="hidden" id="funcionario_fun_id" name="funcionario_fun_id" value="0" />';




<?php 

                echo $form->hiddenField($model, 'id');


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

                    [b]'attribute'=>'funcionario_fun_id'[/b],

                    'model'=>$model,

                    'value'=>  Funcionario::model()->fun_id,

                    'sourceUrl'=>array('Atencion/aclist'),

                    'name'=>'fun',

                    'options'=>array(

                        'minLength'=>'1',

                        'limit'=>'10',

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

                                $('#id').val(ui.item.id);  

                        }"

                    ),

                    'htmlOptions'=>array(

                        'size'=>45,

                        'maxlength'=>45,

                    ),

                )); 

            ?>



ahora me funciona perfecto.

Saludos!