Agregar Ajax para buscar una descripcion

De CidesaWiki

(Diferencias entre revisiones)
Saltar a navegación, buscar
 
(11 ediciones intermedias no se muestran.)
Línea 3: Línea 3:
<pre>
<pre>
   <?php echo javascript_include_tag('ajax') ?>
   <?php echo javascript_include_tag('ajax') ?>
-
</pre> Luego ubicar dentro del _edit_form, la caja de texto donde se escribira el código al cual le quiero buscar la descripción, por ejemplo en el formulario Registro de Articulos (Almregart) necesito que al tipear el código del ramo se muestre la descripcion del mismo, en este caso dentro de la caja de texto del codigo del ramo debemos programar el evento onBlur (perder el foco) para que ejecute un procedimiento que busque en la base de datos la descripción correspondiente y la pinte en la vista de forma inmediata. Para ello la caja de texto del código del ramo queda de la siguiente manera
+
</pre> Luego ubicar dentro del _edit_form, la caja de texto donde se escribira el código al cual le quiero buscar la descripción, por ejemplo en el formulario Unidades Ejecutoras (fordefcatpre) necesito que al tipear el código del Responsable se muestre la descripcion del mismo, en este caso dentro de la caja de texto del codigo del Responsable debemos programar el evento onBlur (perder el foco) para que ejecute un procedimiento que busque en la base de datos la descripción correspondiente y la pinte en la vista de forma inmediata. Para ello la caja de texto del código del responsable queda de la siguiente manera
<pre>
<pre>
-
  <?php $value = object_input_tag($caregart, 'getRamart', array (
+
<?php echo label_for('fordefcatpre[codemp]', __($labels['fordefcatpre{codemp}']), 'class="required" ') ?>
-
   'size' => 20,
+
  <div class="content<?php if ($sf_request->hasError('fordefcatpre{codemp}')): ?> form-error<?php endif; ?>">
-
  'control_name' => 'caregart[ramart]',
+
  <?php if ($sf_request->hasError('fordefcatpre{codemp}')): ?>
-
  'maxlength' => 6,  
+
    <?php echo form_error('fordefcatpre{codemp}', array('class' => 'form-error-msg')) ?>
-
  'onBlur'=> remote_function(array(
+
   <?php endif; ?>
-
  'url'      => 'almregart/ajax',     
+
 
 +
  <?php echo input_auto_complete_tag('fordefcatpre[codemp]', $fordefcatpre->getCodemp(),  
 +
    'fordefcatpre/autocomplete?ajax=1',  array('autocomplete' => 'off','maxlength' => 16, 'onBlur'=> remote_function(array(
 +
  'url'      => 'fordefcatpre/ajax',     
  'complete' => 'AjaxJSON(request, json)',
  'complete' => 'AjaxJSON(request, json)',
-
     'with' => "'ajax=1&cajtexmos=nomram&cajtexcom=caregart_ramart&codigo='+this.value"
+
     'with' => "'ajax=1&cajtexmos=fordefcatpre_nomemp&cajtexcom=fordefcatpre_codemp&codigo='+this.value"
-
  )),  
+
  ))),
-
)); echo $value ? $value : '&nbsp;' ?>  
+
    array('use_style' => 'true')
 +
  )
 +
?></div>
</pre> En el evento onBlur se usa el remote_function que tiene los siguientes parametros
</pre> En el evento onBlur se usa el remote_function que tiene los siguientes parametros
* El url indica el nombre de la funcion a ejecutar, esta función debe crearse en el actions.class con el nombre de executeAjax.
* El url indica el nombre de la funcion a ejecutar, esta función debe crearse en el actions.class con el nombre de executeAjax.
Línea 27: Línea 32:
  Ahora en el archivo actions.class se debe colocar la siguiente función:
  Ahora en el archivo actions.class se debe colocar la siguiente función:
<pre>
<pre>
-
  public function executeAjax()
+
public function executeAjax()
-
{
+
  {
-
$cajtexmos=$this->getRequestParameter('cajtexmos');
+
    $cajtexmos=$this->getRequestParameter('cajtexmos');
-
        $cajtexcom=$this->getRequestParameter('cajtexcom');
+
    $cajtexcom=$this->getRequestParameter('cajtexcom');
-
  if ($this->getRequestParameter('ajax')=='1')
+
    if ($this->getRequestParameter('ajax')=='1')
-
    {
+
    {
-
      $dato=CaramartPeer::getDesramo($this->getRequestParameter('codigo'));    
+
      $dato=NphojintPeer::getNombre($this->getRequestParameter('codigo'));    
-
              $output = '[["'.$cajtexmos.'","'.$dato.'",""],["'.$cajtexcom.'","6","c"]]';      
+
      $output = '[["'.$cajtexmos.'","'.$dato.'",""]]';      
-
    }  
+
    }
-
      $this->getResponse()->setHttpHeader("X-JSON", '('.$output.')');  
+
    $this->getResponse()->setHttpHeader("X-JSON", '('.$output.')');  
-
      return sfView::HEADER_ONLY;
+
    return sfView::HEADER_ONLY;
-
}  
+
  }  
</pre>   
</pre>   
Esta función se debe colocar igual en el action.class correspondiente, lo unico que se debe cambiar es la instrucción:
Esta función se debe colocar igual en el action.class correspondiente, lo unico que se debe cambiar es la instrucción:
-
             $dato=CaramartPeer::getDesramo($this->getRequestParameter('codigo'));
+
             $dato=NphojintPeer::getNombre($this->getRequestParameter('codigo'));  
-
Aqui se debe llamar a la función que busque en la base de datos la descripción que se quiere mostrar, para este caso se quiere mostrar la descripcion del ramo a partir del código, entonces en la clase CaramartPeer cree el metodo que me hace la busqueda.
+
Aqui se debe llamar a la función que busque en la base de datos la descripción que se quiere mostrar, para este caso se quiere mostrar la Nombre del responsable a partir del código, entonces en la clase NphojintPeer cree el metodo que me hace la busqueda.
   Luego en la variable $output se debe crear un arreglo con datos que se necesita la funcion AjaxJSON par mostrarlos en la vista.  
   Luego en la variable $output se debe crear un arreglo con datos que se necesita la funcion AjaxJSON par mostrarlos en la vista.  
-
         $output = '[["'.$cajtexmos.'","'.$dato.'",""],["'.$cajtexcom.'","6","c"]]';
+
         $output = '[["'.$cajtexmos.'","'.$dato.'",""]]';
   La variable '''$output''' se construye con arreglos de 3 posiciones:  
   La variable '''$output''' se construye con arreglos de 3 posiciones:  
-
  1era posición se le envia el nombre de la caja de texto donde debe mostrar la descripcion.
+
 
-
  2do es la descripción que se quiere  mostrar
+
# Posición se le envia el nombre de la caja de texto donde debe mostrar la descripcion.
-
  3er el siguiente parametro del arreglo indica si es para completar la caja con ceros o no, para este caso se deja en blanco.  
+
# La descripción que se quiere  mostrar.
 +
# El siguiente parametro del arreglo indica si es para completar la caja con ceros o no, para este caso se deja en blanco.  
El segundo arreglo es para indicar que se rellene con ceros a la izquierda, en el 1er parametro se envia el nombre de la caja de texto donde se quiere completar con ceros, el 2do parametro la cantidad de ceros a rellenar, y el tercero se debe colocar 'C' de completar.
El segundo arreglo es para indicar que se rellene con ceros a la izquierda, en el 1er parametro se envia el nombre de la caja de texto donde se quiere completar con ceros, el 2do parametro la cantidad de ceros a rellenar, y el tercero se debe colocar 'C' de completar.
 +
 +
En caso, de que el codigo que vaya a utilizar ajax se le tenga que completar con ceros a la izquierda. En la varariable $output, se le agrega otro campo en el arreglo con el numero de ceros ha completar:
 +
 +
<pre>
 +
$dato=FordefprgPeer::getPrograma($this->getRequestParameter('codigo'));
 +
$output = '[["'.$cajtexmos.'","'.$dato.'",""],["'.$cajtexcom.'","3","c"]]';
 +
</pre>
 +
 +
Es importante señalar que la funcion getPrograma de la clase FordefprgPeer.php debemos agregar al código los ceros a la izquierda para que no pierda la busqueda.
 +
 +
<pre>
 +
  public static function getPrograma($codigo)
 +
  {
 +
    return Herramientas::getX('CODPRG','Fordefprg','Desprg',str_pad($codigo,3,0,STR_PAD_LEFT));
 +
  }
 +
</pre>
 +
 +
 +
Para que auto complete se debe llamar la siguiente función en el actions.class.php
 +
<pre>
 +
public function executeAutocomplete()
 +
  {
 +
if ($this->getRequestParameter('ajax')=='1')
 +
{
 +
  $this->tags=Herramientas::autocompleteAjax('CODEMP','Nphojint','Codemp',$this->getRequestParameter('fordefcatpre[codemp]'));
 +
    }  
 +
  } 
 +
</pre>
 +
 +
Ademas de agregar esta funcion de debe copiar el archivo autocompleteSucces que se encuentra en la carpeta templates del la forma Fordefcatpre.
 +
Y listo....
 +
 +
 +
== Ajax utilizando filtros ==
 +
Solamente hay que colocar al final de la variable '''$this->tags''', la siguientes estructura
 +
$this->tags=Herramientas::autocompleteAjax('','','','','''array('campo1','campo2','campo2'),array('value1','value2','value3')''');
 +
 +
donde:
 +
<pre>
 +
  campo1 = value1
 +
  campo2 = value2
 +
  campo3 = value3
 +
</pre>
 +
 +
 +
 +
<pre>
 +
public function executeAutocomplete()
 +
{
 +
  if ($this->getRequestParameter('ajax')=='2')
 +
    { 
 +
$this->tags=Herramientas::autocompleteAjax('CODCTA','Contabb','codcta',trim($this->getRequestParameter('bndefcons[ctadepcar]')),array('cargab'),array('C'));
 +
    }
 +
}
 +
 +
* En SQL quedaria
 +
<pre>
 +
  Select CODCTA from Contabb where codcta=bndefcons[ctadepcar] and  cargab = 'C'
 +
</pre>
 +
</pre>

Última versión de 22:11 10 ago 2007

  <?php echo javascript_include_tag('ajax') ?>
Luego ubicar dentro del _edit_form, la caja de texto donde se escribira el código al cual le quiero buscar la descripción, por ejemplo en el formulario Unidades Ejecutoras (fordefcatpre) necesito que al tipear el código del Responsable se muestre la descripcion del mismo, en este caso dentro de la caja de texto del codigo del Responsable debemos programar el evento onBlur (perder el foco) para que ejecute un procedimiento que busque en la base de datos la descripción correspondiente y la pinte en la vista de forma inmediata. Para ello la caja de texto del código del responsable queda de la siguiente manera
 <?php echo label_for('fordefcatpre[codemp]', __($labels['fordefcatpre{codemp}']), 'class="required" ') ?>
  <div class="content<?php if ($sf_request->hasError('fordefcatpre{codemp}')): ?> form-error<?php endif; ?>">
  <?php if ($sf_request->hasError('fordefcatpre{codemp}')): ?>
    <?php echo form_error('fordefcatpre{codemp}', array('class' => 'form-error-msg')) ?>
  <?php endif; ?>

   <?php echo input_auto_complete_tag('fordefcatpre[codemp]', $fordefcatpre->getCodemp(), 
    'fordefcatpre/autocomplete?ajax=1',  array('autocomplete' => 'off','maxlength' => 16, 'onBlur'=> remote_function(array(
			  'url'      => 'fordefcatpre/ajax',  			   
			  'complete' => 'AjaxJSON(request, json)',
  			  'with' => "'ajax=1&cajtexmos=fordefcatpre_nomemp&cajtexcom=fordefcatpre_codemp&codigo='+this.value"
			  ))),
     array('use_style' => 'true')
  ) 
?></div>
En el evento onBlur se usa el remote_function que tiene los siguientes parametros

Los parametros del with son necesarios y son los siguientes,


Ahora en el archivo actions.class se debe colocar la siguiente función:
 public function executeAjax()
  {
    $cajtexmos=$this->getRequestParameter('cajtexmos');
    $cajtexcom=$this->getRequestParameter('cajtexcom');
    if ($this->getRequestParameter('ajax')=='1')
    {
      $dato=NphojintPeer::getNombre($this->getRequestParameter('codigo'));	  			 
      $output = '[["'.$cajtexmos.'","'.$dato.'",""]]';		 			 	    
    } 	 
    $this->getResponse()->setHttpHeader("X-JSON", '('.$output.')'); 
    return sfView::HEADER_ONLY;
  }	 

Esta función se debe colocar igual en el action.class correspondiente, lo unico que se debe cambiar es la instrucción:

           $dato=NphojintPeer::getNombre($this->getRequestParameter('codigo'));	  			 

Aqui se debe llamar a la función que busque en la base de datos la descripción que se quiere mostrar, para este caso se quiere mostrar la Nombre del responsable a partir del código, entonces en la clase NphojintPeer cree el metodo que me hace la busqueda.

  Luego en la variable $output se debe crear un arreglo con datos que se necesita la funcion AjaxJSON par mostrarlos en la vista. 
        $output = '"'.$cajtexmos.'","'.$dato.'",""';
 La variable $output se construye con arreglos de 3 posiciones: 
  1. Posición se le envia el nombre de la caja de texto donde debe mostrar la descripcion.
  2. La descripción que se quiere mostrar.
  3. El siguiente parametro del arreglo indica si es para completar la caja con ceros o no, para este caso se deja en blanco.

El segundo arreglo es para indicar que se rellene con ceros a la izquierda, en el 1er parametro se envia el nombre de la caja de texto donde se quiere completar con ceros, el 2do parametro la cantidad de ceros a rellenar, y el tercero se debe colocar 'C' de completar.

En caso, de que el codigo que vaya a utilizar ajax se le tenga que completar con ceros a la izquierda. En la varariable $output, se le agrega otro campo en el arreglo con el numero de ceros ha completar:

$dato=FordefprgPeer::getPrograma($this->getRequestParameter('codigo'));
$output = '[["'.$cajtexmos.'","'.$dato.'",""],["'.$cajtexcom.'","3","c"]]';

Es importante señalar que la funcion getPrograma de la clase FordefprgPeer.php debemos agregar al código los ceros a la izquierda para que no pierda la busqueda.

  public static function getPrograma($codigo)
  {
     return Herramientas::getX('CODPRG','Fordefprg','Desprg',str_pad($codigo,3,0,STR_PAD_LEFT));		
  }


Para que auto complete se debe llamar la siguiente función en el actions.class.php

public function executeAutocomplete()
  {
	if ($this->getRequestParameter('ajax')=='1')
	{
	  $this->tags=Herramientas::autocompleteAjax('CODEMP','Nphojint','Codemp',$this->getRequestParameter('fordefcatpre[codemp]'));
    }		   
  }   

Ademas de agregar esta funcion de debe copiar el archivo autocompleteSucces que se encuentra en la carpeta templates del la forma Fordefcatpre. Y listo....


Ajax utilizando filtros

Solamente hay que colocar al final de la variable $this->tags, la siguientes estructura $this->tags=Herramientas::autocompleteAjax(,,,,array('campo1','campo2','campo2'),array('value1','value2','value3'));

donde:

 
  campo1 = value1
  campo2 = value2
  campo3 = value3


public function executeAutocomplete()
 {
   if ($this->getRequestParameter('ajax')=='2')
    {   
$this->tags=Herramientas::autocompleteAjax('CODCTA','Contabb','codcta',trim($this->getRequestParameter('bndefcons[ctadepcar]')),array('cargab'),array('C'));	
    }
 }

* En SQL quedaria 
<pre>
   Select CODCTA from Contabb where codcta=bndefcons[ctadepcar] and  cargab = 'C'

</pre>

Herramientas personales
Espacios de nombres
Variantes
Acciones
Navegación
Herramientas