Yii Framework Forum: zii.widgets.jui.CJuiAutoComplete - Yii Framework Forum

Jump to content

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

zii.widgets.jui.CJuiAutoComplete como acceder a otro parametro distinto a term Rate Topic: -----

#1 User is offline   gallego123 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 535
  • Joined: 11-August 09
  • Location:Argentina

Posted 21 February 2011 - 08:50 AM

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'].'%');
....

KISS - Keep It Simple Stupid
ASAP-As Soon As Possible
http://www.yiiframew...oc/cookbook/71/
0

#2 User is offline   PoL 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 506
  • Joined: 05-November 08
  • Location:Buenos Aires, Argentina

Posted 21 February 2011 - 09:14 AM

con $_GET[EgresoDetalles][idSector] no funciona??

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

echo CHtml::activeHiddenField($model, "idSector");
Don't say what you think, think what you say
The problem is communication! Excess of communication!
0

#3 User is offline   Jack Fiallos 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 256
  • Joined: 15-October 09
  • Location:Mexico

Posted 21 February 2011 - 09:30 AM

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..
Celestic Dev Team
Yii Open Source Project Manager
2

#4 User is offline   gallego123 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 535
  • Joined: 11-August 09
  • Location:Argentina

Posted 21 February 2011 - 12:07 PM

gracias Jack !!!

Use la primera (la mas fácil)
funciona de 10+iva

saludos
KISS - Keep It Simple Stupid
ASAP-As Soon As Possible
http://www.yiiframew...oc/cookbook/71/
0

#5 User is offline   Jack Fiallos 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 256
  • Joined: 15-October 09
  • Location:Mexico

Posted 21 February 2011 - 12:13 PM

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
Celestic Dev Team
Yii Open Source Project Manager
0

#6 User is offline   gallego123 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 535
  • Joined: 11-August 09
  • Location:Argentina

Posted 21 February 2011 - 12:24 PM

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

This post has been edited by Horacio Segura: 21 February 2011 - 12:27 PM

KISS - Keep It Simple Stupid
ASAP-As Soon As Possible
http://www.yiiframew...oc/cookbook/71/
0

#7 User is offline   Jack Fiallos 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 256
  • Joined: 15-October 09
  • Location:Mexico

Posted 21 February 2011 - 01:22 PM

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' ..
Celestic Dev Team
Yii Open Source Project Manager
0

#8 User is offline   Nacesprin 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 69
  • Joined: 04-April 10
  • Location:San Fernando - Cadiz - Spain

Posted 01 July 2011 - 09:01 PM

View PostJack Fiallos, on 21 February 2011 - 09:30 AM, said:

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



@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.yiiframew...dpost__p__92359
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