-------------------------------------------------------------------------------
$Id$
-----------------------------------------------------------------------------*/
require_once 'MECON/DB/Pager.php';
require_once 'MECON/HTML/Tabla.php';
/**
* Libreria para le manejo de las tablas de los sistemas de intranet.
*
*/
class MECON_HTML_TablaDB extends MECON_HTML_Tabla {
/**
* 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:
*
* - 'anterior'
* - 'siguiente'
* - 'paginas'
* - 'total'
* - 'info'
*
* Puede pasarse uno solo como un string o varios como un
* array. Si se pasa 'todo', se incluyen todos.
* Si se pasa null, se incluyen 'anterior',
* 'siguiente' y 'paginas'.
* @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;
}
}
?>