------------------------------------------------------------------------------- $Id$ -----------------------------------------------------------------------------*/ require_once 'MLIB/HTML/TablaDB.php'; /** * Clase para armar Tablas HTML a partir de templates. * Se cambio el enfoque respecto de MLIB_HTML_Tabla y MLIB_HTML_TablaDB. Ahora * se utiliza UN solo objeto el cual puede utilizarse de manera tal que permite * armar tablas simples o agregarle la funcionalidad de TablaDB. * * Necesita para funcionar que se encuentren en el directorio pasado como * parametro los siguientes templates con las siguientes claves: * * - tabla Tabla general. Esta misma se usa para el paginador. * - ROWS Obligatorio. Es reemplazado por las filas con información. * - ATTR Opcional. Atributos dinamicos que se quieren asignar a la tabla. * * - row Fila con celdas de información. * - CELLS Obligatorio. Es reemplazado por las celdas con información. * - ATTR Opcional. Atributos dinamicos que se quieren asignar a la celda. * * - cellCabecera Encabezado de la tabla. * - cellComun Celdas comunes. * - cellTItulo Celdas titulo de columna. * - CELL Obligatorio. Dato de la celda. * - ATTR Opcional. Atributos dinamicos de las celdas. * * Para el paginador se utiliza * * - tabla El mismo de arriba con las mismas claves. * - row Idem. * - cell Idem. * * - anterior Celda que contendra la opción para volver hacia atras. * - SRC Href hacia donde apunta el link. * - siguiente Celda que contendra la opción de avanzar. * - SRC Href hacia donde apunta el link. * - paginas Contendra la información de las paginas. * - CURRENT Sera reemplazada con el numero de pagina actual. * - LAST Sera reemplazada con el numero de la ultima pagina. * * @author Martín Marrese */ class MLIB_Tpl_HTML_Table extends MLIB_HTML_TablaDB { /** * Template Engine a utilizar. * * @protected */ var $tpl = ''; /** * Constructor. * * @param Object MLIB_Tpl Engine de template a utilizar. * @param mixed tpl_dir Directorio en donde se encuentran los templates de * la tabla. * @param mixed attr Atributos de la tabla. * @param string desc Descripcion de los elementos listados. * @return void * @access public */ function MLIB_Tpl_HTML_Table($tpl, $tpl_dir = null, $attr = null, $desc = null) { $this->__constructor($tpl, $tpl_dir, $attr, $desc); } /** * Constructor. * * @param Object MLIB_Tpl Engine de template a utilizar * @param mixed tpl_dir Directorio en donde se encuentran los templates de * la tabla. * @param mixed attr Atributos de la tabla. * @param sring desc Descripcion de los elementos listados. * @return void * @access public */ function __constructor($tpl, $tpl_dir = null, $attr = null, $desc = null) { $this->tpl = $tpl; $this->tpl->root = ($tpl_dir) ? $tpl_dir : $_SERVER['DOCUMENT_ROOT'] . '/MLIB//templates/html/table'; parent::MLIB_HTML_TablaDB($desc, $attr); //Esto es para overrunnear el constuctor de MLIB_HTML_Tabla que asigna //unos atributos por defecto a la tabla. $this->setAttributes($attr); } /** * Método que devuelve una representacion textual del objeto para que sea * mostrado al usuario. * * @return El string correspondiente al objeto. * @access public */ function __toString() { $rows = ''; for ($row = 0; $row < $this->getRowCount(); $row++) { $cell = ''; for ($col = 0; $col < $this->getColCount(); $col ++) { //Verifico si la celda esta col/row spaneada if (!$this->getCellContents($row, $col)) { continue; } $content = $this->getStringCellContent($row, $col); $cellAttr = $this->getCellAttributes($row, $col); if (!$cellAttr) { $cellAttr = ''; // $cellAttr['celltype'] = 'cellComun'; } //Agrego las celdas a la fila parseada $cell.= $this->tpl->parse($cellAttr['celltype'], array ( 'CELL' => $content, 'ATTR' => $this->_getAttrString( $cellAttr ) ) ); } $rowAttr = $this->getRowAttributes($row); if (!$rowAttr) { $rowAttr = ''; } //Agrego las filas a la tabla parseada $rows.= $this->tpl->parse('row', array ( 'CELLS' => $cell, 'ATTR' => $this->_getAttrString($rowAttr) ) ); } //Armo el template de la tabla $result = $this->tpl->parse('tabla', array ( 'ROWS' => $rows, 'ATTR' => $this->getAttributes(true) ) ); //Armo el pager si corresponde $result.= $this->pagerToString(); return $result; } /* * Funcion que devuelve el pie en caso de estar definido este. * * @return mixed Pie. */ function pagerToString() { if ($this->_pie) { $cell = ''; //Veo si tengo que agregar el link a anterior. if (@$this->_pie['0']) { $cell.= $this->tpl->parse('cellPaginador', array ( 'CELL' => @$this->_pie['0']->toHtml(), 'ATTR' => 'align="left" width="33%" valign="middle"' ) ); } else { $cell.= $this->tpl->parse('cellPaginador', array ( 'CELL' => ' ', 'ATTR' => 'align="center" width="33%" valign="middle"' ) ); } //Veo si tengo que agregar el total de paginas. if (@$this->_pie['1']) { $cell.= $this->tpl->parse('cellPaginador', array ( 'CELL' => @$this->_pie['1'], 'ATTR' => 'align="center" width="33%" valign="middle"' ) ); } else { $cell.= $this->tpl->parse('cellPaginador', array ( 'CELL' => ' ', 'ATTR' => 'align="center" width="33%" valign="middle"' ) ); } //Veo si tengo que agregar el link a siguiente. if (@$this->_pie['2']) { $cell.= $this->tpl->parse('cellPaginador', array ( 'CELL' => @$this->_pie['2']->toHtml(), 'ATTR' => 'align="right" width="33%" valign="middle"' ) ); } else { $cell.= $this->tpl->parse('cellPaginador', array ( 'CELL' => ' ', 'ATTR' => 'align="center" width="33%" valign="middle"' ) ); } //Armo el row $rows = $this->tpl->parse('row', 'CELLS', $cell); //Armo el template de la tabla $result = $this->tpl->parse('tabla', array ( 'ROWS' => $rows, 'ATTR' => $this->getAttributes(true) ) ); return $result; } } /** * Agrega un páginador a la tabla, basado en un resultado de una base de datos. * Ejemplo: * @code * $tabla = new MLIB_HTML_TablaDB('personas', array('width' => '100%')); * $result = $db->query('SELECT nombre, apellido FROM tabla'); * if (DB::isError($result)) { * trigger_error('Error', E_USER_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'); * // Agrega los resultados paginados de la DB. * $tabla->addRows($pager, array('nombre', 'apellido')); * $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: * * 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 MLIB_HTML_Link (para poder pasar variables por * GET) o un string. * @param int $limit Parámetro usado para crear el MLIB_DB_Pager. * @param int $maxpages Parámetro usado para crear el MLIB_DB_Pager. * @param string $getvar Nombre de la variable GET a usar para indicar el número * de página actual (se le pone el \ref setGetPrefix prefijo) * * @return MLIB_DB_Pager Pager que se puede usar para realizar los fetch de * los resultados de la página actual. * * @see MLIB_DB_Pager, addRows(). */ function addPager($result, $tipo = null, $link = null, $limit = 10, $maxpages = 21, $getvar = 'from') { // Creo el pager con el resultado. $pager = (is_array($result))? new MLIB_Array_Pager($result, @$_GET[$this->getGetVarPrefix().$getvar], $limit, $maxpages): new MLIB_DB_Pager($result, @$_GET[$this->getGetVarPrefix().$getvar], $limit, $maxpages); // Obtengo un link válido. if (!$link) { $link = @$_SERVER['PHP_SELF']; } if (is_string($link)) { $link = new MLIB_HTML_Link($link, ''); } // Si es el tipo por defecto pone paginador nada más. //Esto se podria poner como valor por defecto (aunque dejaria muy largo //el encabezado de la funcion) if (!$tipo) { $tipo = array('anterior', 'paginas', 'siguiente'); } // Convierte tipo a array. if (!is_array($tipo)) { $tipo = array($tipo); } // 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->getGetVarPrefix().$getvar, $pager->prev); $img = new MLIB_HTML_Image('/MLIB/images/general_anterior', '<< '); $cont = ''; $link->setContents($img); $link->addContents($cont); $this->updatePie($link, 'izquierda'); } if (in_array('siguiente', $tipo) and $pager->numRows() and $pager->currentpage != $pager->numpages) { $link->setGetVar($this->getGetVarPrefix().$getvar, $pager->next); $img = new MLIB_HTML_Image('/MLIB/images/general_posterior', ' >>'); // Si no tiene titulo, le pone titulo por defecto. $cont = ''; $link->setContents($img); $link->addContents($cont); $this->updatePie($link, 'derecha'); } if (in_array('paginas', $tipo) and $pager->numRows() and $pager->numpages > 1) { $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->getGetVarPrefix().$getvar, $start_row); $link->setContents($page); $pags .= $link->toHtml(); } if ($page != $pager->lastpage) { $pags .= ' | '; } } $link->setContents($lnk); $this->updatePie($pags, 'centro'); } return $pager; } /** * Método que devuelve el contenido de una celda. * * @param int row Fila. * @param int col Columna. * * @return mixed. * @access protected */ function getStringCellContent($row, $col) { //Veo si esta seteado el contenido de la celda $content = ''; if (isset($this->_structure[$row][$col]['contents'])) { //Ver si es un objeto if (is_object($this->_structure[$row][$col]['contents'])) { //Busco el metodo toHtml if (method_exists($this->_structure[$row][$col]['contents'], "toHtml")) { $content = $this->_structure[$row][$col]['contents']->toHtml(); } //Busco el metodo toString elseif (method_exists($this->_structure[$row][$col]['contents'], "toString")) { $content = $this->_structure[$row][$col]['contents']->toString(); } //Busco el metodo __toString elseif (method_exists($this->_structure[$row][$col]['contents'], "__toString")) { $content = $this->_structure[$row][$col]['contents']->__toString(); } } //No es un objeto, devuelvo lo que es else { $content = $this->_structure[$row][$col]['contents']; } } return $content; } /** * Convierte un atributo a string * * Convierte un atributo HTML al string para pasar a los metodos de HTML_Table * Recibe en $attrs los atributos a modificar. * * @param mixed $attrs Atributos. * @param bool $isSet Indica si hay que setear. * * @return array * @access protected */ function _translateAttributes($attrs, $isSet) { if (!$attrs) { return array(); } if (is_string($attrs)) { $attrs = $this->_parseAttributes($attrs); } $rta = array (); /* Rezago de MLIB_HTML_Tabla. if ($isSet) { $rta = $this->_conf['atributos']['celda_comun']; } else { $rta = array(); } */ foreach ($attrs as $attr => $val) { $attr = strtolower($attr); switch ($attr) { // Estilos de celda case 'comun': case 'cabecera': case 'titulo': case 'clara': case 'oscura': case 'paginador': case 'sb': case 'comun_clara': $rta['celltype'] = 'cell' . ucfirst($attr); break; case 'align': case 'valign': case 'width': case 'height': case 'rowspan': case 'colspan': case 'bgcolor': case 'class': case 'border': case 'cellspacing': case 'cellpadding': case 'nowrap': $rta[$attr] = $val; break; case 'spacing': case 'padding': $rta["cell$attr"] = $val; break; case 'th': $rta[$attr] = ''; break; default: trigger_error("No se permite setear el atributo $attr", E_USER_ERROR); } } return $rta; } } ?>