zii.widgets.jui.CJuiAutoComplete

Hola Comunidad

estoy usando zii.widgets.jui.CJuiAutoComplete

y funciona de 10

ahora quiero saber si lo puedo usar para el siguiente caso

el campo a cargar es el nombre de un Producto

pero el listado solo debe incluir los medicamentos de un

determinado Sector

"ese" sector, es un dato que conozco al momento de hacer el render del form

(y hasta podría ponerlo como campo oculto dentro del form)

mi pregunta es

como accedo a ese valor desde el controlador (accion ProductoConStockAjax)

en la vista





echo CHtml::activeHiddenField($model, "idSector");


    	// nombre del producto + lote con stock

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

            	'name'=>"EgresoDetalles_nombre",

            	'value'=>$producto,

            	'sourceUrl'=>array('ProductoConStockAjax'),

            	'options'=>array(

                            	'showAnim'=>'fold',

                        	'select' => 'js:function(event, ui){ jQuery("#EgresoDetalles_'.$i.'_idLote").val(ui.item["id"]); }'

            	),

    	)); ?>







public function actionProductoConStockAjax() {


    	//if (empty($_GET['term'])) $_GET['term']='PE';

    	$criteria = new CDbCriteria;

    	$idSector = // como accedo?

    	$criteria->condition = "nombre like :term or troquel like :term and idSector = ".$idSector;

    	

    	$criteria->params = array(':term'=>$_GET['term'].'%');

....



con $_GET[[color="#008800"][font="monospace"][size="2"]EgresoDetalles[/size][/font][/color]][idSector] no funciona??

Donde EgresoDetalle es el nombre del modelo $model que usas en

[color=#1C2837][size=2][color=#000000]echo [/color][color=#660066]CHtml[/color][color=#666600]::[/color][color=#000000]activeHiddenField[/color][color=#666600]([/color][color=#000000]$model[/color][color=#666600],[/color][color=#000000] [/color][color=#008800]"idSector"[/color][color=#666600]);[/color][/size][/color]

Para pasar el valor al controlador tienes que enviarlo tambien desde el componente juiautocomplete… y para ello hay 2 formas…

La primera y mas facil…


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

  'name'=>"EgresoDetalles_nombre",

  'value'=>$producto,

  'source'=>$this->createUrl('ProductoConStockAjax',array('idSector'=>$model->idSector)),  // con createURL y pasas el parametro

  'options'=>array(

  'showAnim'=>'fold',

  'select' => 'js:function(event, ui){ jQuery("#EgresoDetalles_'.$i.'_idLote").val(ui.item["id"]); }'

));

La segunda, con una pequeña modificacion al script de js…


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

  'name'=>"EgresoDetalles_nombre",

  'value'=>$producto,

  'source'=>'js:function(request, response){ // el truco es reescribir source

     $.getJSON("'.$this->createUrl('ProductoConStockAjax').'",

     {

       term: request.term,

       idSector:$("#idSector").val()

     }, 

     response);

  }',

  'options'=>array(

  'showAnim'=>'fold',

  'select' => 'js:function(event, ui){ jQuery("#EgresoDetalles_'.$i.'_idLote").val(ui.item["id"]); }'

));

Ahora… para acceder a la variable enviada desde el controlador utilizas


$_GET['idSector']

… si utilizas firebug te daras cuenta que al momento de hacer la peticion via ajax aparecen los parametros enviados…

gracias Jack !!!

Use la primera (la mas fácil)

funciona de 10+iva

saludos

Genial… q bueno que era lo que necesitabas… ahora revisa bien que el juiAutocomplete funcione correctamente… ya que lo tengo aplicado en unas de mis formas, pero hay un error que sin mucha importancia no lo he querido revisar bien… uso la version yii-1.1.5.r2654

Sucede que cuando aparece la lista con el resultado de la consulta y navegagas por ellos con las teclas direccionales (arriba - abajo), sobre el input:text aparece el id de la opcion y no el nombre de la misma…

Digo que no tiene mucha importancia porque al seleccionarlo igualmente con las teclas direccionales y luego la tecla ENTER, este muestra en el input:text el nombre y no el id…

El error solo aplica cuando se usa para navegar… Sea cual sea el resultado avisanos para saber que hacer… quizas soy yo quien tengo algo mal por ahi…

Saludos

a mi me funciona bien

te paso mi código para que puedas ver las diferencias

(el que realmente estoy usando, el anterior era solo para el post)





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

                'name'=>"EgresoDetalles[$i]_nombre",

                'value'=>$producto,

                'sourceUrl'=>$this->createUrl('ProductoConStockAjax',array('idPrograma'=>$egreso->idPrograma)),

                'htmlOptions'=>array_merge($disabled,array('size'=>'60','title'=>'Ingrese Producto/Medicamento y su lote')),

                'options'=>array(

                                'showAnim'=>'fold',

                            'select' => 'js:function(event, ui){ jQuery("#EgresoDetalles_'.$i.'_idLote").val(ui.item["id"]); }'


                ),

        )); ?>




en el controlador





public function actionProductoConStockAjax() {


        $criteria = new CDbCriteria;

        $idPrograma = $_GET['idPrograma'];

        $criteria->condition = "(nombre like :term or troquel like :term) and idPrograma = ".$idPrograma. " and cantidad_actual>0 and ingreso.estado='ING'";

        $criteria->order='fecha_vto';

        $criteria->params = array(':term'=>$_GET['term'].'%');


        $criteria->limit = 30;

        $criteria->with = array('producto','ingreso');


        $data = IngresoDetalles::model()->findAll($criteria);


        


        $arr = array();

        foreach ($data as $item) {

            $arr[] = array(

                'id' => $item->idIngresoDetalle,

                'value' => $item->producto->nombre.' lote:'.$item->lote.' vto:'.$item->fecha_vto,

                'label' => $item->producto->nombre.' lote:'.$item->lote.' vto:'.$item->fecha_vto.' Stock:'.$item->cantidad_actual,

            );

        }


        echo CJSON::encode($arr);

        //Yii::app()->end(); no es necesario


    }




[edit]

usa la version 1.1.6

Pues he corregido mi error, gracias a codigo de Horacio pude comparar diferencias… solo que aun no estoy claro del porque pasa lo siguiente…

hice una prueba rapida de la siguiente forma…

Esto siguiente funciona bien… al navegar con las teclas direccionales muestra el nombre de la opcion


'id'=>$model->city_id,

'label'=>$model->city_name,


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

  $('#".CHtml::activeId($address, 'city_id')."').val(ui.item.id); // aqui el indice id

  $('#city_name').val(ui.item.label);

  return false;

}",

Este codigo al navegar con las teclas direccionales no muestra el nombre, sino el ID de la opcion


'value'=>$model->city_id,

'label'=>$model->city_name,


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

  $('#".CHtml::activeId($address, 'city_id')."').val(ui.item.value); // aqui lo cambie por value

  $('#city_name').val(ui.item.label);

  return false;

}",

En ambos la diferencia es que cambie ‘id’ por ‘value’ …

@Jack Fiallos, nunca uses el


$.getJSON("'.$this->createUrl('ProductoConStockAjax').'",

Me ha traido quebraderos de cabeza eso porque de esa forma nunca se activaba el control de Aborto de la petición anterior en caso de teclear varias peticiones seguidas.

La mejor solución, es la de SCOOB.JUNIOR en el post http://www.yiiframework.com/forum/index.php?/topic/17544-cjuiautocomplete-has-no-extraparams/page__view__findpost__p__92359