Combos de Recargables Dependientes

De CidesaWiki

(Diferencias entre revisiones)
Saltar a navegación, buscar
 
(38 ediciones intermedias no se muestran.)
Línea 1: Línea 1:
-
Colocar esto en el form edit donde valla cada combo, donde pais es el padre y estado es el hijo
+
*El siguiente código se encuentra en el módulo Obras; forma oycdatsol. Para cargar los combos creamos una función Cargarcombo en lib/herramientas, la cual contiene el siguiente código.
<pre>
<pre>
-
<?php echo label_for('ocdatste[codpai]', __($labels['ocdatste{codpai}']), 'class="required" ') ?>
+
  public static function Cargarcombo($tablas,$filtros_tablas,$filtros_variales,$campos_retornados)
-
<div
+
    {
-
class="content<?php if ($sf_request->hasError('ocdatste{codpai}')): ?> form-error<?php endif; ?>">
+
      $c = new Criteria();
-
<?php if ($sf_request->hasError('ocdatste{codpai}')): ?><?php echo form_error('ocdatste{codpai}', array('class' => 'form-error-msg')) ?>
+
      if ($filtros_tablas[0]!='')
-
<?php endif; ?> <?php echo select_tag('ocdatste[codpai]', options_for_select($pais,'001'),array('onChange'=> remote_function(array(
+
{
-
'update'  => 'divEstados',//*****Div a Actualizar*******
+
  for($a=0;$a<count($filtros_tablas);$a++)
-
'url'     => 'oycdatsol/combo?par=1',//*****Variable para el control de la accion******* (1)
+
    {
-
'with' => "'pais='+this.value"//*****Valor de la variale de la caja de texto
+
      eval('$c->add('.ucfirst(strtolower($tablas[0])).'Peer::'.strtoupper($filtros_tablas[$a]).','.chr(39).ucfirst(strtolower($filtros_variales[$a])).chr(39).');');
-
  ))));?>
+
 
-
</div>
+
    }
 +
}
 +
      eval('$lista_arreglo = '.ucfirst(strtolower($tablas[0])).'Peer::doSelect($c);');
 +
      $arreglo = array();
 +
      foreach($lista_arreglo as $obj_estado)
 +
{
 +
  eval('$arreglo[$obj_estado->get'.ucfirst(strtolower($campos_retornados[0])).'()] = $obj_estado->get'.ucfirst(strtolower($campos_retornados[1])).'();');
 +
}
 +
return $arreglo;
 +
  }
-
<br>
+
</pre>
-
<?php echo label_for('ocdatste[codedo]', __($labels['ocdatste{codedo}']), 'class="required" ') ?>
+
*Luego en el Actions.class.php, creamos la funciones Cargar de cada campo asociado al combo.
-
<div class="content<?php if ($sf_request->hasError('ocdatste{codedo}')): ?> form-error<?php endif; ?>">
+
<pre>
-
<?php if ($sf_request->hasError('ocdatste{codedo}')): ?> <?php echo form_error('ocdatste{codedo}', array('class' => 'form-error-msg')) ?>
+
-
<?php endif; ?>
+
-
<div id="divEstados">
+
  public function Cargarpais()
-
<?php echo select_tag('ocdatste[codedo]', options_for_select($estados,'001'),array('onChange'=> remote_function(array(
+
  {
-
'update'   => 'divMunicipios',//*****Div a Actualizar*******
+
    $tablas=array('ocpais');//arreglo de los joins de las tablas
-
'url'     => 'oycdatsol/combo?par=2',//*****Variable para el control de la accion******* (1)
+
    $filtros_tablas=array('');//Envio  los filtros de las clases
-
'with' => "'pais='+document.getElementById('ocdatste_codpai').value+'&estado='+this.value"//*****Valor de la variale de la caja de texto
+
     $filtros_variales=array('');//Envio  los parametros de la funcion
-
  ))));?></div>
+
    $campos_retornados=array('codpai','nompai');// arreglos donde me traigo el nombre y el codigo
-
</div>
+
    return $pais= Herramientas::Cargarcombo($tablas,$filtros_tablas,$filtros_variales,$campos_retornados);
 +
  }
 +
  public function Cargarestados($codpais)
 +
    {
 +
      $tablas=array('ocestado');//arreglo de los joins de las tablas
 +
      $filtros_tablas=array('codpai');//Envio  los filtros de las clases
 +
      $filtros_variales=array($codpais);//Envio  los parametros de la funcion
 +
      $campos_retornados=array('codedo','nomedo');// arreglos donde me traigo el nombre y el codigo
 +
      return $estado= Herramientas::Cargarcombo($tablas,$filtros_tablas,$filtros_variales,$campos_retornados);
 +
    }       
</pre>
</pre>
 +
'''Nota:''' En el mismo '''actions.class''' creamos una función general que contiene la llamada de cada uno de los Cargar que detallamos en las lineas
 +
anteriores.
-
creamos un archivo llamado comboSuccess.php donde vamos a colocar lo siguiente:
+
*Hacemos el llamdo de la funcion de funciones_combos en la executeEdit() y en updateClaseFromRequest():
 +
<pre>
 +
  public function executeEdit()
 +
    {
 +
      $this->funciones_combos();
 +
      ...
 +
      ...
 +
      ...
 +
    }
 +
 
 +
  public function updateClaseFromRequest()
 +
    {
 +
      $this->funciones_combos();
 +
      ...
 +
      ...
 +
      ...
 +
    }
 +
</pre>
 +
 
 +
<pre>
 +
  //En el Action.class
 +
  public function funciones_combos()
 +
    {
 +
      $this->pais = $this->Cargarpais();
 +
      $this->estados = $this->Cargarestados($this->ocdatste->getCodpai());//contiene los datos de la bd
 +
    }
 +
 
 +
</pre>
 +
 
 +
'''Nota''': $this->ocdatste->getCodpai() son los parametros que le tenemos que debemos enviarles dependiendo de cuantos filtros debera tener la funcion de cargar combo.
 +
 
 +
*En los templates de esta forma, creamos un archivo '''comboSuccess.php''' que contiene la secuencia de como se deben ejecutar los combos, haciendo uso de Ajax.
<pre>
<pre>
Línea 42: Línea 91:
<?php if ($tipo=='P')
<?php if ($tipo=='P')
{
{
-
  echo select_tag('ocdatste[codedo]', options_for_select($estados,'001'),array('onChange'=> remote_function(array(
+
  echo select_tag('ocdatste[codedo]', options_for_select($estados,'','include_custom=Seleccione'),array('onChange'=> remote_function(array(
'update'  => 'divMunicipios',
'update'  => 'divMunicipios',
'url'      => 'oycdatsol/combo?par=2',
'url'      => 'oycdatsol/combo?par=2',
Línea 50: Línea 99:
else if ($tipo=='E')
else if ($tipo=='E')
{
{
-
echo select_tag('ocdatste[codmun]', options_for_select($municipio,'001'),array('onChange'=> remote_function(array(
+
echo select_tag('ocdatste[codmun]', options_for_select($municipio,'','include_custom=Seleccione'),array('onChange'=> remote_function(array(
'update'  => 'divParroquia',
'update'  => 'divParroquia',
'url'      => 'oycdatsol/combo?par=3',
'url'      => 'oycdatsol/combo?par=3',
Línea 59: Línea 108:
</pre>
</pre>
-
Cabe destacar que lo mismos numero de combos que tenga el edit form lo debe tener el comboSuccess.php, despues agregamos lo siguiente en el action.class, esta funcion controla que se va a ejecutar con la variable de el control de la accion vea (1)
+
'''Nota:''' Cabe destacar que el mismo número de combos que contenga el edit form lo debe tener el archivo '''comboSuccess.php'''.
 +
 
 +
* Además en el actions.class agregamos la función que valida, que se va a ejecutar con la variable de el control de la acción.
<pre>
<pre>
-
public function executeCombo()
+
  public function executeCombo()
-
{
+
    {
-
if ($this->getRequestParameter('par')=='1')
+
      if ($this->getRequestParameter('par')=='1')
-
{
+
        {
-
$this->estados = $this->Cargarestados($this->getRequestParameter('pais'));
+
  $this->estados = $this->Cargarestados($this->getRequestParameter('pais'));
-
$this->tipo='P';
+
  $this->tipo='P';
-
}
+
-
elseif ($this->getRequestParameter('par')=='2')
+
-
{
+
-
$this->municipio = $this->Cargarmunicipio($this->getRequestParameter('pais'),$this->getRequestParameter('estado'));
+
-
$this->tipo='E';
+
-
}
+
}
}
 +
elseif ($this->getRequestParameter('par')=='2')
 +
  {
 +
    $this->municipio = $this->Cargarmunicipio($this->getRequestParameter('pais'),$this->getRequestParameter('estado'));
 +
    $this->tipo='E';
 +
  }
 +
    }
</pre>
</pre>
 +
 +
*En el archivo editSuccess.php agregar las variables que hace referencia al pais, estados, etc
 +
<pre>
 +
<div id="sf_admin_content">
 +
<?php include_partial('oycdatsol/edit_form', array('ocdatste' => $ocdatste, 'labels' => $labels, 'desste' => $desste, 'pais' => $pais, 'estados' =>  $estados)) ?>
 +
</div>
 +
 +
</pre>
 +
 +
*Por último, en el _edit_form se coloca el código php que imprime los combos; en cada uno de sus respecivos campos.
 +
<pre>
 +
//Campo que contiene el pais.
 +
<?php echo select_tag('ocdatste[codpai]', options_for_select($pais,'','include_custom=Seleccione'),array('onChange'=> remote_function(array(
 +
'update'  => 'divEstados',//Div a Actualizar
 +
'url'      => 'oycdatsol/combo?par=1',//Variable para el control de la accion(1)
 +
'with' => "'pais='+this.value"//Valor de la variale de la caja de texto
 +
  ))));?>
 +
</div>
 +
 +
<br>
 +
//Campo que contiene el estado.
 +
<div id="divEstados">
 +
<?php echo select_tag('ocdatste[codedo]', options_for_select($estados,'','include_custom=Seleccione'),array('onChange'=> remote_function(array(
 +
'update'  => 'divMunicipios',//Div a Actualizar
 +
'url'      => 'oycdatsol/combo?par=2',//Variable para el control de la accion(1)
 +
'with' => "'pais='+document.getElementById('ocdatste_codpai').value+'&estado='+this.value"//Valor de la variale de la caja de texto
 +
  ))));?></div>
 +
</div>
 +
</pre>
 +
 +
 +
== Esquema ==
 +
 +
*Ahora se va a mostrar un esquema sistemático de como trabaja la función para llenar el combo en todo el proceso:
 +
 +
*Al editar un dato se realiza una serie de llamados a las funciones, que se muestra a continuación:
 +
<pre>
 +
  Editar
 +
    |---> Funciones_combos()
 +
                |---> $this->pais()= $this->Cargarpais();
 +
                                              |--->CargarCombos()
 +
                                                          |---> $this->pais() = 'p'
 +
 +
</pre>
 +
 +
 +
Y listooooooooooooooooooooooo a jugar Symfony
 +
'''Jsuarez::::....'''

Última versión de 19:22 14 jun 2007


  public static function Cargarcombo($tablas,$filtros_tablas,$filtros_variales,$campos_retornados)
    {
      $c = new Criteria();
      if ($filtros_tablas[0]!='')
	{
	  for($a=0;$a<count($filtros_tablas);$a++)
	    {
 	      eval('$c->add('.ucfirst(strtolower($tablas[0])).'Peer::'.strtoupper($filtros_tablas[$a]).','.chr(39).ucfirst(strtolower($filtros_variales[$a])).chr(39).');');
	  			
	    }
	 }
       eval('$lista_arreglo = '.ucfirst(strtolower($tablas[0])).'Peer::doSelect($c);');
       $arreglo = array();
       foreach($lista_arreglo as $obj_estado)
	 {
	   eval('$arreglo[$obj_estado->get'.ucfirst(strtolower($campos_retornados[0])).'()] = $obj_estado->get'.ucfirst(strtolower($campos_retornados[1])).'();');
	 }
	return $arreglo;
  }


  public function Cargarpais()
   {
     $tablas=array('ocpais');//arreglo de los joins de las tablas
     $filtros_tablas=array('');//Envio  los filtros de las clases
     $filtros_variales=array('');//Envio  los parametros de la funcion
     $campos_retornados=array('codpai','nompai');// arreglos donde me traigo el nombre y el codigo
     return $pais= Herramientas::Cargarcombo($tablas,$filtros_tablas,$filtros_variales,$campos_retornados);
   }

   public function Cargarestados($codpais)
     {
       $tablas=array('ocestado');//arreglo de los joins de las tablas
       $filtros_tablas=array('codpai');//Envio  los filtros de las clases
       $filtros_variales=array($codpais);//Envio  los parametros de la funcion
       $campos_retornados=array('codedo','nomedo');// arreglos donde me traigo el nombre y el codigo
       return $estado= Herramientas::Cargarcombo($tablas,$filtros_tablas,$filtros_variales,$campos_retornados);
     }        	

Nota: En el mismo actions.class creamos una función general que contiene la llamada de cada uno de los Cargar que detallamos en las lineas anteriores.

  public function executeEdit()
    {
      $this->funciones_combos(); 
      ...
      ...
      ...
    }

  public function updateClaseFromRequest()
    {
      $this->funciones_combos(); 
      ...
      ...
      ...
    }
  //En el Action.class
  public function funciones_combos()
    {
      $this->pais = $this->Cargarpais();
      $this->estados = $this->Cargarestados($this->ocdatste->getCodpai());//contiene los datos de la bd
    }

Nota: $this->ocdatste->getCodpai() son los parametros que le tenemos que debemos enviarles dependiendo de cuantos filtros debera tener la funcion de cargar combo.


<?php use_helper('Object', 'Validation', 'Javascript') ?>

<?php if ($tipo=='P')
{
 echo select_tag('ocdatste[codedo]', options_for_select($estados,'','include_custom=Seleccione'),array('onChange'=> remote_function(array(
'update'   => 'divMunicipios',
'url'      => 'oycdatsol/combo?par=2',
'with' => "'pais='+document.getElementById('ocdatste_codpai').value+'&estado='+this.value"
  ))));
}
else if ($tipo=='E')
{
echo select_tag('ocdatste[codmun]', options_for_select($municipio,'','include_custom=Seleccione'),array('onChange'=> remote_function(array(
	'update'   => 'divParroquia',
	'url'      => 'oycdatsol/combo?par=3',
	'with' => "'pais='+document.getElementById('ocdatste_codpai').value+'&estado='+document.getElementById('ocdatste_codedo').value+'&municipio='+this.value"
  ))));
}

Nota: Cabe destacar que el mismo número de combos que contenga el edit form lo debe tener el archivo comboSuccess.php.


  public function executeCombo()
    {
      if ($this->getRequestParameter('par')=='1')
        {
	  $this->estados = $this->Cargarestados($this->getRequestParameter('pais'));
	  $this->tipo='P';
	}
	elseif ($this->getRequestParameter('par')=='2')
	  {
	    $this->municipio = $this->Cargarmunicipio($this->getRequestParameter('pais'),$this->getRequestParameter('estado'));
	    $this->tipo='E';
	  }
     }

 <div id="sf_admin_content">
 <?php include_partial('oycdatsol/edit_form', array('ocdatste' => $ocdatste, 'labels' => $labels, 'desste' => $desste, 'pais' => $pais, 'estados' =>  $estados)) ?>
 </div>

//Campo que contiene el pais.
<?php echo select_tag('ocdatste[codpai]', options_for_select($pais,'','include_custom=Seleccione'),array('onChange'=> remote_function(array(
		'update'   => 'divEstados',//Div a Actualizar
		'url'      => 'oycdatsol/combo?par=1',//Variable para el control de la accion(1)
		'with' => "'pais='+this.value"//Valor de la variale de la caja de texto
  ))));?>
</div>

<br>
//Campo que contiene el estado.
<div id="divEstados">
<?php echo select_tag('ocdatste[codedo]', options_for_select($estados,'','include_custom=Seleccione'),array('onChange'=> remote_function(array(
		'update'   => 'divMunicipios',//Div a Actualizar
		'url'      => 'oycdatsol/combo?par=2',//Variable para el control de la accion(1)
		'with' => "'pais='+document.getElementById('ocdatste_codpai').value+'&estado='+this.value"//Valor de la variale de la caja de texto
  ))));?></div>
</div>


Esquema

  Editar
    |---> Funciones_combos()
                |---> $this->pais()= $this->Cargarpais();
                                               |--->CargarCombos()
                                                           |---> $this->pais() = 'p'


Y listooooooooooooooooooooooo a jugar Symfony Jsuarez::::....

Herramientas personales
Espacios de nombres
Variantes
Acciones
Navegación
Herramientas