]> git.llucax.com Git - mecon/meconlib.git/commitdiff
Se termina TablaDB con documentación y todo. Falta probar mejor y dar más ejemplos.
authorLeandro Lucarella <llucax@gmail.com>
Thu, 23 Oct 2003 19:46:19 +0000 (19:46 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Thu, 23 Oct 2003 19:46:19 +0000 (19:46 +0000)
lib/MECON/HTML/TablaDB.php

index 6876e947aa8120f8d08af2a5573989e5345f06ed..62dcb64f477d4d735695ee94586ee35aa7c3e380 100644 (file)
@@ -104,9 +104,13 @@ class MECON_HTML_TablaDB extends MECON_HTML_Tabla {
      * if (DB::isError($result)) {
      *      die('Error');
      * }
+     * // Agrega el paginador por defecto y lo guarda para mostrar solo los
+     * // resultados paginados después.
      * $pager = $tabla->addPager($result);
+     * // Agrega cabecera con los nombres de las columnas.
      * $tabla->addRow(array('Nombre', 'Apellido'), 'cabecera');
-     * $tabla->addRows($result, array('nombre', 'apellido'));
+     * // Agrega los resultados paginados de la DB.
+     * $tabla->addRows($pager, array('nombre', 'apellido'));
      * $tabla->display();
      * @endcode
      *
@@ -134,7 +138,7 @@ class MECON_HTML_TablaDB extends MECON_HTML_Tabla {
      * @return MECON_DB_Pager Pager que se puede usar para realizar los fetch de
      *         los resultados de la página actual.
      *
-     * @see MECON_DB_Pager.
+     * @see MECON_DB_Pager, addRows().
      */
     function addPager($result, $tipo = null, $link = null, $limit = 10, $maxpages = 21, $getvar = 'from') {
         // Creo el pager con el resultado.
@@ -201,16 +205,13 @@ class MECON_HTML_TablaDB extends MECON_HTML_Tabla {
      * Si no hay resultados, muestra un mensaje. Dependiendo de si es se pasa
      * un objeto a usar o no, llama a addRowsObject() o addRowsResult()
      * respectivamente.
-     * Ejemplo:
-     * @code
-     * @endcode
      *
      * @param DB_Result $result Resultados de una consulta.
      * @param array $campos Propiedades del objeto a mostrar.
      * @param mixed $obj Objeto a usar. Puede ser un objeto instanciado o un
      *                   string con el nombre de la clase.
      *
-     * @see Ejemplo en addPager();
+     * @see addRowsData(), addRowsIcon(), ejemplo en addPager().
      */
     function addRows($result, $campos, $obj = null) {
         if ($result->numRows()) {
@@ -233,17 +234,17 @@ class MECON_HTML_TablaDB extends MECON_HTML_Tabla {
      */
     function addRowsResult($result, $campos) {
         while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
-            $datos = array();
-            if ($this->_prependRowsData) {
-                $datos = $this->_buildRowsData($datos, $row, $this->_prependRowsData);
+            $columnas = array();
+            foreach ($this->_prependRowsData as $data) {
+                $columnas[] = $this->_buildCustomColumn($data, $row);
             }
             foreach ($campos as $campo) {
-                $datos[] = $row[$campo];
+                $columnas[] = $row[$campo];
             }
-            if ($this->_appendRowsData) {
-                $datos = $this->_buildRowsData($datos, $row, $this->_appendRowsData);
+            foreach ($this->_appendRowsData as $data) {
+                $columnas[] = $this->_buildCustomColumn($data, $row);
             }
-            $this->addRow($datos);
+            $this->addRow($columnas);
         }
     }
 
@@ -268,14 +269,67 @@ class MECON_HTML_TablaDB extends MECON_HTML_Tabla {
             $this->raiseError('La clase ' . get_class($obj) . ' no tiene un metodo cargar().');
         }
         while ($obj->cargar($result)) {
-            $datos = array();
+            foreach ($this->_prependRowsData as $data) {
+                $columnas[] = $this->_buildCustomColumn($data, $row);
+            }
             foreach ($campos as $campo) {
-                $datos[] = $obj->$campo;
+                $columnas[] = $obj->$campo;
+            }
+            foreach ($this->_appendRowsData as $data) {
+                $columnas[] = $this->_buildCustomColumn($data, $row);
             }
-            $this->addRow($datos);
+            $this->addRow($columnas);
         }
     }
 
+    /**
+     * Agrega una columna arbitraria a la tabla basado en valores de una fila.
+     * Ejemplo:
+     * @code
+     * $tabla = new MECON_HTML_TablaDB('personas', array('width' => '100%'));
+     * $result = $db->query('SELECT nombre, apellido, activo FROM tabla');
+     * if (DB::isError($result)) {
+     *      die('Error');
+     * }
+     * $tabla->addRow(array('Col1', 'Nombre', 'Apellido', 'Activo'), 'cabecera');
+     * // Agrega una columna con una leyenda 'El nombre es: {nombre}' al principio.
+     * $tabla->addRowsData('Me llamo %s.', 'nombre', 'prepend');
+     * // Agrega una columna al final con checkbox para seleccionar filas. El
+     * // segundo elemento será procesado por la callback checked_callback().
+     * $tabla->addRowsData('<input type="checkbox" name="datos[%s]" value="1" %s />',
+     *          array('nombre', array('activo', 'checked_callback')));
+     * // Agrega resultados de la tabla.
+     * $tabla->addRows($result, array('nombre', 'apellido'));
+     * $tabla->display();
+     * @endcode
+     *
+     * @param mixed $format Si es un string, especifica el formato a usar al
+     *                      estilo de sprintf. Si es un MECON_HTML_Link, se
+     *                      traduce cada variable por GET que empiece con el
+     *                      \ref getGetVarPrefix "prefijo" y cuyo valor sea null
+     *                      al campo correspondiente de la DB. Si e valor en vez
+     *                      de ser null es un string, se fija si existe una
+     *                      función con ese nombre para llamar con el campo de
+     *                      la DB como argumento para formatearlo. Si no existe
+     *                      la función, se toma el string como formato para
+     *                      sprintf para darle formato.
+     * @param mixed $campos Campos de la DB a usar como argumentos del sprintf.
+     *                      Puede ser un string para pasar un solo campo sin
+     *                      formato. Si es un array, cada elemento es un campo
+     *                      que puede ser un string representando el nombre de
+     *                      un campo a usar sin agumento o un array cuyo primer
+     *                      elemento es el nombre del campo a usar y el segundo
+     *                      argumento es una funcion callback a llamar con el
+     *                      valor del campo como argumento para darle formato.
+     *                      @code $tabla->addRowsData('%s', array('campo1', 'campo2', array('campo3', 'callback_campo3')))); @endcode
+     * @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 addRowsData($format, $campos = array(), $lugar = 'append') {
         if (!is_array($campos)) {
             $campos = array($campos);
@@ -292,41 +346,136 @@ class MECON_HTML_TablaDB extends MECON_HTML_Tabla {
         }
     }
 
-    function _buildRowsData($datos, $row, $array) {
-        if ($array) {
-            foreach ($array as $data) {
-                list($format, $fields) = $data;
-                // Si tiene formatos y argumentos.
-                if ($fields) {
-                    $args = array($format);
-                    foreach ($fields as $field) {
-                        if (is_array($row)) {
-                            $args[] = $row[$field];
-                        } else {
-                            $args[] = $row->$field;
-                        }
-                    }
-                    $datos[] = call_user_func_array('sprintf', $args);
-                // Si tiene solo formato.
+    /**
+     * Contruye una columna personalizada.
+     *
+     * @param array $data Datos sobre la columna, en el formato especificado
+     *                    para un elemento del array usado en _prependRowsData.
+     * @param mixed $row Fila de un resultado de una base de dotos. Puede ser un
+     *                   array asociativo o un objeto (en cuyo caso cada campo
+     *                   debe ser un atributo del mismo).
+     *
+     * @return mixed Columna formateada para agregar a la tabla.
+     *
+     * @protected
+     */
+    function _buildCustomColumn($data, $row) {
+        list($format, $campos) = $data;
+        // Si tiene formatos y argumentos.
+        if ($campos) {
+            // Si el formato es un MECON_HTML_Link, uso como formato a
+            // su contenido.
+            if (is_a($format, 'mecon_html_link')) {
+                $args = array($format->getContents());
+            } else {
+                $args = array($format);
+            }
+            // Proceso cada agumento.
+            foreach ($campos as $campo) {
+                // Si el agumento es un array, usa una callback para
+                // darle formato.
+                if (is_array($campo)) {
+                    list($campo, $callback) = $campo;
+                }
+                if (is_array($row)) {
+                    $campo = $row[$campo]; // Es un campo de un array.
                 } else {
-                    #echo "TAG: $format<br>";
-                    // Si es un link, traduce las variables GET.
-                    if (is_a($format, 'mecon_html_link')) {
-                        $vars = $format->getGetVars();
-                        foreach ($vars as $var => $val) {
-                            if (preg_match("/^{$this->_getVarPrefix}(.+)$/", $var, $m)
-                                    and ($val === null)) {
-                                $format->setGetVar($var, $row[$m[1]]);
-                            }
-                        }
-                    }
-                    $datos[] = $format;
+                    $campo = $row->$campo; // Es un atributo de un objeto.
                 }
+                // Si usa callback, cambio el campo por el resultado del
+                // llamado a su callback.
+                if (isset($callback) and function_exists($callback)) {
+                    $campo = $callback($campo);
+                }
+                // Agrego argumento procesado a la lista de argumentos.
+                $args[] = $campo;
+            }
+            // Si es un link, le seteo los contenidos procesados.
+            if (is_a($format, 'mecon_html_link')) {
+                $format->setContents(call_user_func_array('sprintf', $args));
+            // Si no formateo la cadena con los argumentos procesados.
+            } else {
+                $format = call_user_func_array('sprintf', $args);
             }
         }
-        return $datos;
+        // Si es un link, traduce las variables GET.
+        if (is_a($format, 'mecon_html_link')) {
+            $format = $this->_translateGetVars($format, $row);
+        }
+        // devuelve la columna.
+        return $format;
     }
 
+    /**
+     * Traduce las variables GET de un link.
+     * Puede formatearlas con printf() o llamando una callback.
+     *
+     * @param MECON_HTML_Link $link Link con las variables GET a formatear.
+     * @param mixed $row Fila de un resultado de una base de dotos. Puede ser un
+     *                   array asociativo o un objeto (en cuyo caso cada campo
+     *                   debe ser un atributo del mismo).
+     *
+     * @return MECON_HTML_Link Link con las variables GET traducidas.
+     *
+     * @protected
+     */
+    function _translateGetVars($link, $row) {
+        $vars = $link->getGetVars();
+        foreach ($vars as $var => $val) {
+            if (preg_match("/^{$this->_getVarPrefix}(.+)$/", $var, $m)) {
+                $campo = $m[1];
+                $campo = is_array($row) ? $row[$campo] : $row->$campo;
+                // Si no tiene valor, se lo reemplaza por el
+                // valor del campo.
+                if ($val === null) {
+                    $link->setGetVar($var, $campo);
+                // Si existe una funcion, se la usa para obtener
+                // el formato.
+                } elseif (function_exists($val)) {
+                    $link->setGetVar($var, $val($campo));
+                // Si no es ni null ni link, lo toma como
+                // formato para el sprintf
+                } else {
+                    $link->setGetVar($var, sprintf($val, $campo));
+                }
+            }
+        }
+        return $link;
+    }
+
+    /**
+     * Agrega un ícono predefinido a la 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>'ir'</tt>: Flecha hacia la derecha.</li>
+     *                   </ul>
+     * @param mixed $campos Campos de la DB a usar para generar el link. Estos
+     *                      campos serán pasados por GET a la página destino.
+     *                      Cada campo es pasado como la variable GET compuesta
+     *                      por el @ref getGetVarPrefix "prefijo" más el nombre
+     *                      del campo (ver parámetro $campos de addRowsData()
+     *                      para conocer de que formas se puede formatear un
+     *                      campo).
+     * @param mixed $link Si es un string, se usa como URL del link a generar.
+     *                    Si es un MECON_HTML_Link, se usa como base para el
+     *                    link a generar y se le va agregando las variables de
+     *                    GET generadas por el parámetro $campos (el link es
+     *                    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 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') {
         if (is_string($campos)) {
             $campos = array($campos);
@@ -342,7 +491,11 @@ class MECON_HTML_TablaDB extends MECON_HTML_Tabla {
                 $img = new MECON_HTML_Image('/MECON/images/general_modificar', '(M)');
                 $link->addContents($img);
                 foreach ($campos as $campo) {
-                    $link->setGetVar($this->_getVarPrefix.$campo, null);
+                    $format = null;
+                    if (is_array($campo)) {
+                        list($campo, $format) = $campo;
+                    }
+                    $link->setGetVar($this->_getVarPrefix.$campo, $format);
                 }
                 $this->addRowsData($link, array(), $lugar);
                 break;