]> git.llucax.com Git - mecon/meconlib.git/blobdiff - lib/MECON/HTML/TablaDB.php
BugFix.
[mecon/meconlib.git] / lib / MECON / HTML / TablaDB.php
index c91c82fb50969d5c541123b9f72896e84e1d03eb..6852ba91936ce4fade804d4a041a15ee1c52e65d 100644 (file)
@@ -26,10 +26,15 @@ $Id$
 
 require_once 'DB.php';
 require_once 'MECON/DB/Pager.php';
+require_once 'MECON/Array/Pager.php';
 require_once 'MECON/HTML/Error.php';
 require_once 'MECON/HTML/Link.php';
+require_once 'MECON/HTML/Icon.php';
 require_once 'MECON/HTML/Tabla.php';
 
+/// Prefijo a usar para las variables GET que genera la tabla.
+define('MECON_HTML_TABLADB_GET_VAR_PREFIX', '_');
+
 /**
  * Libreria para le manejo de las tablas de los sistemas de intranet.
  *
@@ -58,11 +63,6 @@ class MECON_HTML_TablaDB extends MECON_HTML_Tabla {
      */
     var $_appendRowsData = array();
 
-    /**
-     * Prefijo a usar para las variables GET que genera la tabla.
-     */
-    var $_getVarPrefix = '_';
-
     /**
      * Constructor. 
      * Puede recibir como parametro un string con los atributos que se 
@@ -85,16 +85,18 @@ class MECON_HTML_TablaDB extends MECON_HTML_Tabla {
 
     /**
      * Establece el prefijo usado para las variables de GET que genera la tabla.
+     * @deprecated No se puede cambiar el prefijo hasta que tengamos variables
+     * estaticas en las clases.
      */
-    function setGetVarPrefix($prefix) {
-        $this->_getVarPrefix = $prefix;
-    }
+    #function setGetVarPrefix($prefix) {
+    #    $this->_getVarPrefix = $prefix;
+    #}
 
     /**
      * Obtiene el prefijo usado para las variables de GET que genera la tabla.
      */
     function getGetVarPrefix() {
-        return $this->_getVarPrefix;
+        return MECON_HTML_TABLADB_GET_VAR_PREFIX;
     }
 
     /**
@@ -104,7 +106,7 @@ class MECON_HTML_TablaDB extends MECON_HTML_Tabla {
      * $tabla = new MECON_HTML_TablaDB('personas', array('width' => '100%'));
      * $result = $db->query('SELECT nombre, apellido FROM tabla');
      * if (DB::isError($result)) {
-     *      die('Error');
+     *      trigger_error('Error', E_USER_ERROR);
      * }
      * // Agrega el paginador por defecto y lo guarda para mostrar solo los
      * // resultados paginados después.
@@ -144,7 +146,10 @@ class MECON_HTML_TablaDB extends MECON_HTML_Tabla {
      */
     function addPager($result, $tipo = null, $link = null, $limit = 10, $maxpages = 21, $getvar = 'from') {
         // Creo el pager con el resultado.
-        $pager = new MECON_DB_Pager($result, @$_GET[$this->_getVarPrefix.$getvar], $limit, $maxpages);
+        $pager = (is_array($result))?
+                new MECON_Array_Pager($result, @$_GET[$this->getGetVarPrefix().$getvar], $limit, $maxpages):
+                new MECON_DB_Pager($result, @$_GET[$this->getGetVarPrefix().$getvar], $limit, $maxpages);
+
         // Obtengo un link válido.
         if (!$link) {
             $link = @$_SERVER['PHP_SELF'];
@@ -166,22 +171,22 @@ class MECON_HTML_TablaDB extends MECON_HTML_Tabla {
         }
         // Me fijo si tiene cada uno de los elementos y los agrego.
         if (in_array('anterior', $tipo) and $pager->numRows() and $pager->currentpage != 1) {
-            $link->setGetVar($this->_getVarPrefix.$getvar, $pager->prev);
+            $link->setGetVar($this->getGetVarPrefix().$getvar, $pager->prev);
             $this->addLink('anterior', $link);
         }
         if (in_array('siguiente', $tipo) and $pager->numRows() and $pager->currentpage != $pager->numpages) {
-            $link->setGetVar($this->_getVarPrefix.$getvar, $pager->next);
+            $link->setGetVar($this->getGetVarPrefix().$getvar, $pager->next);
             $this->addLink('siguiente', $link);
         }
         if (in_array('paginas', $tipo) and $pager->numRows() and $pager->numpages > 1) {
-            $from = @$_GET[$this->_getVarPrefix.$getvar];
+            $from = @$_GET[$this->getGetVarPrefix().$getvar];
             $pags = '';
             $lnk = $link->getContents();
             foreach ($pager->pages as $page => $start_row) {
                 if ($start_row == $from) {
                     $pags .= $page;
                 } else {
-                    $link->setGetVar($this->_getVarPrefix.$getvar, $start_row);
+                    $link->setGetVar($this->getGetVarPrefix().$getvar, $start_row);
                     $link->setContents($page);
                     $pags .= $link->toHtml();
                 }
@@ -295,7 +300,7 @@ class MECON_HTML_TablaDB extends MECON_HTML_Tabla {
      * $tabla = new MECON_HTML_TablaDB('personas', array('width' => '100%'));
      * $result = $db->query('SELECT nombre, apellido, activo FROM tabla');
      * if (DB::isError($result)) {
-     *      die('Error');
+     *      trigger_error('Error', E_USER_ERROR);
      * }
      * $tabla->addRow(
      *      array('Col1', 'Nombre', 'Apellido', 'Activo', 'PopUp1', 'PopUp2'),
@@ -323,7 +328,7 @@ class MECON_HTML_TablaDB extends MECON_HTML_Tabla {
      * 
      * 
      * //Ejemplo utilizando una funcion callback con varios parametros obtenidos
-     * //de la DB.
+     * //de la DB y otros argumentos arbitrarios.
      * $tabla->addRowsData (
      *      'Mi nombre es: %s, por lo tanto %s', //Formato de la columna a agregar.
      *      array(                               //Array de campos a incluir en el formato
@@ -331,7 +336,7 @@ class MECON_HTML_TablaDB extends MECON_HTML_Tabla {
      *          //El resultado de la llamada a la funcion nombre_callback que tomo
      *          //como paramteros los campos de la db que estan dentro del array
      *          //reemplazara al segundo %s
-     *          array(array('nombre', 'apellido'), 'nombre_callback'
+     *          array(array('nombre', 'apellido'), 'nombre_callback', array('Sr.', 'Junior'))
      *      )
      *  );
      * 
@@ -345,13 +350,13 @@ class MECON_HTML_TablaDB extends MECON_HTML_Tabla {
      * }
      *
      * //Funcion callback que acepta mas de un parametro en un array
-     * function nombre_callback($parametros) {
-     *      if ($parametros['nombre'] == 'Juan Carlos' &&
-     *      $parametros['apellido'] == 'Gomez') {
-     *          return 'soy Charly';
+     * function nombre_callback($parametros, $argumentos_arbitrarios) {
+     *      list($prefijo, $posfijo) = $argumentos_arbitrarios;
+     *      if ($parametros['nombre'] == 'Juan Carlos' && $parametros['apellido'] == 'Gomez') {
+     *          return "soy el $prefijo Charly $posfijo";
      *      }
      *      else {
-     *          return 'no soy Charly';
+     *          return "no soy el $prefijo Charly $posfijo";
      *      }
      * }
      * 
@@ -391,11 +396,13 @@ class MECON_HTML_TablaDB extends MECON_HTML_Tabla {
      *                      y el segundo argumento es una funcion
      *                      callback a llamar con el valor del campo (o los
      *                      campos si se paso un array de campos) como
-     *                      argumento para darle formato:
+     *                      argumento para darle formato (si hay un tercer
+     *                      elemento en el array se le pasa como segundo
+     *                      parametro a la callback):
      *                      @code $tabla->addRowsData('%s',
-     *      array('campo1', array(array('campo2', 'campo3'), 'callback_campo_2_3'))));
-     * function callback_campo_2_3($campos) {
-     *      return strtoupper($campos['campo2']) . ', ' . strtolower($campos['campo3']);
+     *      array('campo1', array(array('campo2', 'campo3'), 'callback_campo_2_3', 'arg_campo_2_3'))));
+     * function callback_campo_2_3($campos, $arg) {
+     *      return strtoupper($campos['campo2']) . ', ' . strtolower($campos['campo3']) . $arg;
      * } @endcode
      *                      Para ver un ejemplo de una callback con muchos
      *                      parametros ver la descripcion detallada de esta funcion.
@@ -409,9 +416,10 @@ class MECON_HTML_TablaDB extends MECON_HTML_Tabla {
      *      'prepend'); @endcode
      *
      * @warning Este método debe ser llamado antes de llamar a addRows().
-     * @note Las funciones callback toman todas un solo argumento (el valor del
-     *       campo a formatear) y deben devolver un string con el campo
-     *       formateado.
+     * @note Las funciones callback toman todas un argumento (el valor del
+     *       campo a formatear) como mínimo. Si se pasa un parametro arbitrario
+     *       recibe un segundo argumento con este parametro extra. Deben devolver
+     *       un string con el campo formateado.
      */
     function addRowsData($format, $campos = array(), $lugar = 'append') {
         if (!is_array($campos)) {
@@ -458,7 +466,7 @@ class MECON_HTML_TablaDB extends MECON_HTML_Tabla {
                 // Si el agumento es un array, usa una callback para
                 // darle formato.
                 if (is_array($campo)) {
-                    list($campo, $callback) = $campo;
+                    @list($campo, $callback, $callback_args) = $campo;
                 }
                 if (is_array($row)) {
                     if (is_array($campo)) {
@@ -483,15 +491,17 @@ class MECON_HTML_TablaDB extends MECON_HTML_Tabla {
                 }
                 // Si usa callback, cambio el campo por el resultado del
                 // llamado a su callback.
-                if (isset($callback) and function_exists($callback)) {
-                    $campo = $callback($campo);
-                }
-                else {
-                    //Si no existe la funcion de callback usa el callback como
-                    //formato y los campos como argumentos para el sprintf
-                    array_unshift($campo, $callback);
-                    $campo = call_user_func_array('sprintf', $campo);
+                if (isset($callback)) {
+                    if(function_exists($callback)) {
+                        $campo = $callback($campo, $callback_args);
+                    } else {
+                        //Si no existe la funcion de callback usa el callback como
+                        //formato y los campos como argumentos para el sprintf
+                        array_unshift($campo, $callback);
+                        $campo = call_user_func_array('sprintf', $campo);
+                    }
                 }
+                unset($callback);
                 // Agrego argumento procesado a la lista de argumentos.
                 $args[] = $campo;
             }
@@ -526,8 +536,9 @@ class MECON_HTML_TablaDB extends MECON_HTML_Tabla {
      */
     function _translateGetVars($link, $row) {
         $vars = $link->getGetVars();
+        $prefix = $this->getGetVarPrefix();
         foreach ($vars as $var => $val) {
-            if (preg_match("/^{$this->_getVarPrefix}(.+)$/", $var, $m)) {
+            if (preg_match("/^$prefix(.+)$/", $var, $m)) {
                 $campo = $m[1];
                 $campo = is_array($row) ? $row[$campo] : $row->$campo;
                 // Si no tiene valor, se lo reemplaza por el
@@ -553,18 +564,19 @@ class MECON_HTML_TablaDB extends MECON_HTML_Tabla {
      * Ejemplo:
      * @code
      * $tabla = new MECON_HTML_TablaDB('personas', array('width' => '100%'));
-     * $result = $db->query('SELECT nombre, apellido FROM tabla');
+     * $result = $db->query('SELECT id, nombre, apellido, activo FROM tabla');
      * if (DB::isError($result)) {
-     *      die('Error');
+     *      trigger_error('Error', E_USER_ERROR);
      * }
      * $tabla->addRow(array('Col1', 'Nombre', 'Apellido', 'Modificar', 'Borrar',
      *      'Agregar'), 'cabecera');
      * // Agrega ícono de modificar que apunta a modificar.php y pasa el 'id'.
      * $tabla->addRowsIcon('modificar', 'id', 'modificar.php');
-     * // Agrega ícono de borrar desactivado.
-     * $tabla->addRowsIcon('no_borrar');
-     * // Agrega ícono con una flecha que apunta a agregar.php y no pasa nada.
-     * $tabla->addRowsIcon('ir', null, 'modificar.php');
+     * // Agrega ícono de eliminar desactivado.
+     * $tabla->addRowsIcon('eliminar', 'id', 'borrar.php', false);
+     * // Agrega ícono con una flecha que apunta a agregar.php, pasa 2 campos
+     * // por GET y se activa o desactiva segun el campo de la DB 'activo'.
+     * $tabla->addRowsIcon('ir', array('id', 'nombre'), 'ver.php', 'activo');
      * // Agrega resultados de la tabla.
      * $tabla->addRows($result, array('nombre', 'apellido'));
      * $tabla->display();
@@ -573,9 +585,7 @@ class MECON_HTML_TablaDB extends MECON_HTML_Tabla {
      * @param string $id Identificador del tipo de ícono a agregar. Puede ser:
      *                   <ul>
      *                     <li><tt>'modificar'</tt>: Ícono de modificar.</li>
-     *                     <li><tt>'no_modificar'</tt>: Ícono de modificar desactivado.</li>
-     *                     <li><tt>'borrar'</tt>: Ícono de borrar.</li>
-     *                     <li><tt>'no_borrar'</tt>: Ícono de borrar desactivado.</li>
+     *                     <li><tt>'eliminar'</tt>: Ícono de eliminar.</li>
      *                     <li><tt>'ir'</tt>: Flecha hacia la derecha.</li>
      *                   </ul>
      * @param mixed $campos Campos de la DB a usar para generar el link. Estos
@@ -592,15 +602,19 @@ class MECON_HTML_TablaDB extends MECON_HTML_Tabla {
      *                    procesado de la misma forma en que es procesado el
      *                    parámetro $formato en addRowsData() con la excepción
      *                    de que el contenido del Link no es tomado en cuenta).
+     * @param mixed $activo Si es una variable booleana, si es true, se pone el
+     *                      ícono activado (con un link), si es false se pone el
+     *                      ícono desactivado (sin link). Si es un string se lo
+     *                      utiliza como el nombre de un campo de la DB y se
+     *                      activa o desactiva el ícono según este campo evalue
+     *                      a true o false respectivamente.
      * @param string $lugar Indica donde hay que agregar la columna. Puede ser:
      *                      <tt>'prepend'</tt> o <tt>'append'</tt>.
      *
      * @warning Este método debe ser llamado antes de llamar a addRows().
-     * @note Las funciones callback toman todas un solo argumento (el valor del
-     *       campo a formatear) y deben devolver un string con el campo
-     *       formateado.
      */
-    function addRowsIcon($id, $campos = array(), $link = null, $lugar = 'append') {
+    function addRowsIcon($id, $campos = array(), $link = null, $activo = true,
+            $lugar = 'append') {
         if (!$campos) {
             $campos = array();
         }
@@ -613,53 +627,73 @@ class MECON_HTML_TablaDB extends MECON_HTML_Tabla {
         if (is_string($link)) {
             $link = new MECON_HTML_Link($link, '');
         }
+        // Traducción para compatibilidad para atrás.
         switch ($id) {
-            case 'modificar':
-                $img = new MECON_HTML_Image('/MECON/images/general_modificar', '(M)');
-                $img->updateAttributes(array('title' => 'Modificar'));
-                $link->addContents($img);
-                foreach ($campos as $campo) {
-                    $format = null;
-                    if (is_array($campo)) {
-                        list($campo, $format) = $campo;
-                    }
-                    $link->setGetVar($this->_getVarPrefix.$campo, $format);
-                }
-                $this->addRowsData($link, array(), $lugar);
-                break;
             case 'no_modificar':
-                $img = new MECON_HTML_Image('/MECON/images/general_modificar_des', '(-)');
-                $img->updateAttributes(array('title' => 'Modificar'));
-                $this->addRowsData($img, array(), $lugar);
+                $id = 'modificar';
+                $activo = false;
                 break;
             case 'borrar':
-                $img = new MECON_HTML_Image('/MECON/images/general_eliminar', '(B)');
-                $img->updateAttributes(array('title' => 'Borrar'));
-                $link->addContents($img);
-                foreach ($campos as $campo) {
-                    $link->setGetVar($this->_getVarPrefix.$campo, null);
-                }
-                $this->addRowsData($link, array(), $lugar);
+                $id = 'eliminar';
                 break;
             case 'no_borrar':
-                $img = new MECON_HTML_Image('/MECON/images/general_eliminar_des', '(-)');
-                $img->updateAttributes(array('title' => 'Borrar'));
-                $this->addRowsData($img, array(), $lugar);
+                $id = 'eliminar';
+                $activo = false;
                 break;
-            case 'ir':
-                $img = new MECON_HTML_Image('/MECON/images/general_ir4', '->');
-                $img->updateAttributes(array('title' => 'Ir'));
-                $link->addContents($img);
-                foreach ($campos as $campo) {
-                    $link->setGetVar($this->_getVarPrefix.$campo, null);
+        }
+        if ($activo === true) {
+            $img = new MECON_HTML_Icon($id, $link, null,
+                array('title' => ucfirst($id)));
+            $l = $img->getLink();
+            foreach ($campos as $campo) {
+                $format = null;
+                if (is_array($campo)) {
+                    list($campo, $format) = $campo;
                 }
-                $this->addRowsData($link, array(), $lugar);
-                break;
-            default:
-                $this->raiseError("No hay un ícono predefinido llamado '$id'.");
+                $l->setGetVar($this->getGetVarPrefix().$campo, $format);
+            }
+            $this->addRowsData($l, array(), $lugar);
+        } elseif ($activo === false) {
+            $img = new MECON_HTML_Icon($id.'_des', null, '-',
+                array('title' => ucfirst($id)));
+            $this->addRowsData($img, array(), $lugar);
+        } else {
+            $campos[] = $activo;
+            $this->addRowsData('%s', array(array($campos,
+                'MECON_HTML_TablaDB_callback_addRowsIcon',
+                array($id, $link, $activo))), $lugar);
         }
     }
 
 }
 
+/**
+ * Callback para activar o desactivar un ícono según un campo de la DB.
+ *
+ * @param $campos Array asociativo con los datos de la DB para la fila actual.
+ * @param $args   Array de pámetros arbitrarios: 'tipo', 'link', 'activo'.
+ *                tipo:   tipo de link: 'modificar', 'eliminar', 'ir'.
+ *                link:   link a donde apunta el ícono si está activo.
+ *                activo: indica el nombre del campo a evaluar para mostrar
+ *                        el ícono activo o inactivo.
+ * @return Campo formateado.
+ * @protected
+ */
+function MECON_HTML_TablaDB_callback_addRowsIcon($campos, $args) {
+    list($tipo, $link, $activo) = $args;
+    if ($campos[$activo]) {
+        $img = new MECON_HTML_Icon($tipo, $link, null,
+            array('title' => ucfirst($tipo)));
+        $l = $img->getLink();
+        foreach ($campos as $campo => $valor) {
+            $l->setGetVar(MECON_HTML_TablaDB::getGetVarPrefix().$campo, $valor);
+        }
+        return $l->toHtml();
+    } else {
+        $img = new MECON_HTML_Icon($tipo.'_des', null, '-',
+            array('title' => ucfirst($tipo)));
+        return $img->toHtml();
+    }
+}
+
 ?>