]> git.llucax.com Git - mecon/meconlib.git/commitdiff
Se agrega el metodo addPager().
authorLeandro Lucarella <llucax@gmail.com>
Fri, 17 Oct 2003 19:52:23 +0000 (19:52 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Fri, 17 Oct 2003 19:52:23 +0000 (19:52 +0000)
lib/MECON/HTML/Tabla.php

index 9dbeb041812eacc6bd4e7312c954f4a712f309bc..e6010a7c836849bc903825f9b130eb4e993a1935 100644 (file)
@@ -26,6 +26,7 @@ $Id$
 
 require_once 'HTML/Table.php';
 require_once 'MECON/HTML/Image.php';
+require_once 'MECON/DB/Pager.php';
 
 /**
  * Libreria para le manejo de las tablas de los sistemas de intranet.
@@ -525,7 +526,11 @@ class MECON_HTML_Tabla extends HTML_Table {
      * Agrega un link predefinido a la cabecera o pie de la tabla.
      * Ejemplo:
      * @code
-     * $tabla->addLink('nuevo');
+     * if ($muchos) {
+     *      $tabla->addLink('nuevo');
+     * } else {
+     *      $tabla->addLink('nuevos', 'nuevos.php');
+     * }
      * $tabla->addLink('volver',
      *      new MECON_HTML_Link('atras.php'));
      * $tabla->addLink('anterior',
@@ -544,7 +549,10 @@ class MECON_HTML_Tabla extends HTML_Table {
      */
     function addLink($id, $link = null) {
         if (!$link) {
-            $link = new MECON_HTML_Link($_SERVER['PHP_SELF'], '');
+            $link = @$_SERVER['PHP_SELF'];
+        }
+        if (is_string($link)) {
+            $link = new MECON_HTML_Link($link, '');
         }
         switch ($id) {
             case 'nuevo':
@@ -595,6 +603,112 @@ class MECON_HTML_Tabla extends HTML_Table {
         }
     }
 
+    /**
+     * Agrega un páginador a la tabla, basado en un resultado de una base de datos.
+     * Ejemplo:
+     * @code
+     * $tabla = new MECON_HTML_Tabla();
+     * $result = $db->query('SELECT * FROM tabla');
+     * if (DB::isError($result)) {
+     *      die('Error');
+     * }
+     * $pager = $tabla->addPager($result);
+     * $tabla->addRow(array('Nombre', 'Apellido'), 'cabecera');
+     * if ($pager->numRows()) {
+     *      while ($row = $pager->fetchRow(DB_FETCHMODE_ASSOC)) {
+     *          $tabla->addRow(array($row['nombre'], $row['apellido']));
+     *      }       
+     * } else {
+     *      $tabla->addRow(array(new MECON_HTML_Error('No se encontraron agentes.')),
+     *          array('colspan' => 2));
+     * }   
+     * $tabla->display();
+     * @endcode
+     *
+     * @param DB_Result $result Resultado de una consulta de base de datos.
+     * @param mixed $tipo Tipo de link(s) a agregar. Puede ser:
+     *                    <ul>
+     *                      <li><tt>'anterior'</tt></li>
+     *                      <li><tt>'siguiente'</tt></li>
+     *                      <li><tt>'paginas'</tt></li>
+     *                      <li><tt>'total'</tt></li>
+     *                      <li><tt>'info'</tt></li>
+     *                    </ul>
+     *                    Puede pasarse uno solo como un string o varios como un
+     *                    array. Si se pasa <tt>'todo'</tt>, se incluyen todos.
+     *                    Si se pasa null, se incluyen <tt>'anterior'</tt>,
+     *                    <tt>'siguiente'</tt> y <tt>'paginas'</tt>.
+     * @param mixed $link Dirección a la que apuntan los links generados. Puede
+     *                    ser un MECON_HTML_Link (para poder pasar variables por
+     *                    GET) o un string.
+     * @param int $limit Parámetro usado para crear el MECON_DB_Pager.
+     * @param int $maxpages Parámetro usado para crear el MECON_DB_Pager.
+     *
+     * @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
+     */
+    function addPager($result, $tipo = null, $link = null, $limit = 10, $maxpages = 21) {
+        // Creo el pager con el resultado.
+        $pager = new MECON_DB_Pager($result, @$_GET['pager_from'], $limit, $maxpages);
+        // Obtengo un link válido.
+        if (!$link) {
+            $link = @$_SERVER['PHP_SELF'];
+        }
+        if (is_string($link)) {
+            $link = new MECON_HTML_Link($link, '');
+        }
+        // Si es el tipo por defecto pone paginador nada más.
+        if (!$tipo) {
+            $tipo = array('anterior', 'paginas', 'siguiente');
+        }
+        // Convierte tipo a array.
+        if (!is_array($tipo)) {
+            $tipo = array($tipo);
+        }
+        // Si se quiere mostrar todas las decoraciones del paginador.
+        if (in_array('todo', $tipo)) {
+            $tipo = array('anterior', 'paginas', 'siguiente', 'total', 'info');
+        }
+        // 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('pager_from', $pager->prev);
+            $this->addLink('anterior', $link);
+        }
+        if (in_array('siguiente', $tipo) and $pager->numRows() and $pager->currentpage != $pager->numpages) {
+            $link->setGetVar('pager_from', $pager->next);
+            $this->addLink('siguiente', $link);
+        }
+        if (in_array('paginas', $tipo) and $pager->numRows() and $pager->numpages > 1) {
+            $from = @$_GET['pager_from'];
+            $pags = '';
+            $lnk = $link->getContents();
+            foreach ($pager->pages as $page => $start_row) {
+                if ($start_row == $from) {
+                    $pags .= $page;
+                } else {
+                    $link->setGetVar('pager_from', $start_row);
+                    $link->setContents($page);
+                    $pags .= $link->toHtml();
+                }
+                if ($page != $pager->lastpage) {
+                    $pags .= ' | ';
+                }
+            }
+            $link->setContents($lnk);
+            $this->updatePie($pags, 'centro');
+        }
+        if (in_array('total', $tipo) and $pager->numRows()) {
+            $this->updateCabecera('Se encontraron ' . $pager->numrows . ' resultados.', 'izquierda');
+        }
+        if (in_array('info', $tipo) and $pager->numRows()) {
+            $this->updateCabecera('Página ' . $pager->currentpage . ' de ' . $pager->numpages
+                . ' - ' . $pager->limit . ' resultados por página.', 'derecha');
+        }
+        return $pager;
+    }
+
 }
 
 ?>