------------------------------------------------------------------------------- $Id$ -----------------------------------------------------------------------------*/ require_once 'HTML/Table.php'; require_once 'MLIB/HTML/Image.php'; require_once 'MLIB/HTML/Link.php'; /** * Libreria para le manejo de las tablas de los sistemas de intranet. * */ class MLIB_HTML_Tabla extends HTML_Table { /** * Valores de Configuracion particular * * @var array() $conf * @access protected */ var $_conf; /** * Atributos de las tablas. * * @var array() attrs * @access protected */ var $_attrs; /** * Íconos e información que va arriba de la tabla. * * @var array() * @access private. */ var $_cabecera = array(); /** * Íconos e información que va abajo de la tabla. * * @var array() * @access private. */ var $_pie = array(); /** * Constructor. * Puede recibir como parametro un string con los atributos que se * quieren dar a la tabla en cuestion. Estos atributos estan * seteados por default segun el archivo de configuracion. * Ademas puede recibir la indicacion de algun estilo en particular. * * @param mixed $attrs Atributos diferentes a los estandares para la tabla * @param string $estilo Tipo de tabla * * @access public */ function MLIB_HTML_Tabla($attrs = null, $estilo = 'comun') { // Obtengo los valores particulares de configuracion. $this->_conf = include(dirname(__FILE__) . '/Tabla/estilo_' . $estilo . '.php'); // Seteo los atributos para la tabla $this->_attrs = $this->_conf['atributos']['tabla_comun']; //Genero el objeto HTML_Table if (is_string($attrs)) { $attrs = $this->_parseAttributes($attrs); } if (is_array($attrs)) { if (isset($attrs['width'])) { $this->_attrs['width'] = $attrs['width']; } if (isset($attrs['bgcolor'])) { $this->_attrs['bgcolor'] = $attrs['bgcolor']; } if (isset($attrs['cellspacing'])) { $this->_attrs['cellspacing'] = $attrs['cellspacing']; } if (isset($attrs['cellpadding'])) { $this->_attrs['cellpadding'] = $attrs['cellpadding']; } } $this->HTML_Table($this->_attrs); if (isset($attrs['align'])) { $this->_attrs['align'] = $attrs['align']; } } /** * Devuelve el html de la tabla * * Devuelve el html de la tabla para que sea mostrado. * Como parametro recibe el indicador de tabla simple. * Si $simple es falso, devuelve el html comun y corriente (con 2 * tablas), si es false devuelve una tabla sola. * * @param bool $simple Tipo de tabla que se quiere recibir. * * @return string Html * * @access public */ function toHtml($simple = 0) { if ($simple) { $result = parent::toHtml(); // Agregar la tabla de fondo. } else { $contenedora = $this->_conf['atributos']['tabla_contenedora']; $contenedora['width'] = $this->getAttribute('width'); $contenedora['align'] = $this->_attrs['align']; $this->updateAttributes(array('width' => '100%')); $tabla_externa = new HTML_Table($contenedora); $tabla_externa->addRow(array(parent::toHtml()), $this->_conf['atributos']['celda_contenedora']); $result = $tabla_externa->toHtml(); } // Si tiene pie o cabecera, crea tabla. if ($this->_cabecera or $this->_pie) { $tabla_externa = new HTML_Table(array('width'=>'100%','border'=>0)); } // Si tiene cabecera, la agrega. $this->_addSpecialRow($this->_cabecera, $tabla_externa); // Si tiene cabecera o pie, agrega la tabla original. if ($this->_cabecera or $this->_pie) { //$id = $tabla_externa->addRow($result); $tabla_externa->addRow(array($result), array( 'align' => 'center', 'valign' => 'middle', 'width' => '100%', 'colspan' => '3', )); } // Si tiene pie, lo agrega. $this->_addSpecialRow($this->_pie, $tabla_externa); return ($this->_cabecera or $this->_pie) ? $tabla_externa->toHtml() : $result; } function _addSpecialRow($array, &$tabla) { if ($array) { $row = array(); foreach ($array as $key => $val) { $row[$key] = $val ? $val : ' '; } $id = $tabla->addRow($row, array( 'valign' => 'middle', 'width' => '33%', )); // Si no hay celda central, hace colspan. if ($array[0] and !$array[1]) { $tabla->updateCellAttributes($id, 0, array( 'colspan' => 2, 'width' => '67%')); /* } XXX se complica hacer el colspan para atras: elseif ($array[2] and !$array[1]) { $tabla->updateCellAttributes($id, 1, array( 'colspan' => 2, 'width' => '67%')); */ } $tabla->updateCellAttributes($id, 0, array('align' => 'left')); $tabla->updateCellAttributes($id, 1, array('align' => 'center')); $tabla->updateCellAttributes($id, 2, array('align' => 'right')); } } /** * Cambia las propiedades de una celda * * Cambia las propiedades de una celda. Si $attrs es un array * asociativo, se setean los atributos representados por las claves * con los valores. * * @param int $row Identificador de la fila que se quiere modificar * @param int $col Identificador de la columna que se quiere modificar * @param mixed $attrs Atributo a modificar * * @access public */ function updateCellAttributes($row, $col, $attrs) { return parent::updateCellAttributes($row, $col, $this->_translateAttributes($attrs, false)); } /** * Establece las propiedades de una celda * * Establece las propiedades de una celda. Si $attrs es un array * asociativo, se setean los atributos representados por las claves * con los valores. * * @param int $row Identificador de la fila que se quiere modificar * @param int $col Identificador de la columna que se quiere modificar * @param mixed $attrs Atributo a modificar * * @access public */ function setCellAttributes($row, $col, $attrs) { return parent::setCellAttributes($row, $col, $this->_translateAttributes($attrs, true)); } /** * Agrega una fila * * Agrega una fila. El contenido es el que viene representado por * el array $content. Recibe los atributos en la variable $attrs * * @param mixed $content Contenido * @param mixed $attrs Atributos * * @return int $rowId Identificador de la fila * * @access public */ function addRow($content, $attrs = 'comun') { return parent::addRow($content, $attrs); } /** * 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 private */ function _translateAttributes($attrs, $isSet) { if (!$attrs) { return array(); } if (is_string($attrs)) { $attrs = $this->_parseAttributes($attrs); } 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 '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; //NO HTML STANDAR //HAY QUE SACAR LAS LINEAS QUE CONTIENEN $rta[$attr] = $attr; //que son reemplazadas por las que tienen $rta['mlib_style'] = $attr; //El estilo mlib_style es utilizado internamente y no representa //nada en el html generado. //Ej: Sirve para poder asignar un estilo especifico a una celda //para que MLIB_PDF_Tabla lo interprete. //Esto nos da mas flexibilidad. case 'mlib_style': $rta['mlib_style'] = $val; break; case 'comun': case 'cabecera': case 'titulo': $rta = array_merge($rta, $this->_conf['atributos']["celda_$attr"]); $rta[$attr] = $attr; $rta['mlib_style'] = $attr; break; case 'clara': $tmp = $this->_conf['atributos']['celda_comun']; $tmp['bgcolor'] = $this->_conf['atributos']['celda_titulo']['bgcolor']; $tmp['class'] = $this->_conf['atributos']['celda_titulo']['class']; $rta = array_merge($rta, $tmp); $rta[$attr] = $attr; $rta['mlib_style'] = $attr; break; case 'oscura': $tmp = $this->_conf['atributos']['celda_comun']; $tmp['bgcolor'] = $this->_conf['atributos']['celda_cabecera']['bgcolor']; $tmp['class'] = $this->_conf['atributos']['celda_cabecera']['class']; $rta = array_merge($rta, $tmp); $rta[$attr] = $attr; $rta['mlib_style'] = $attr; break; case 'comun_clara': $tmp = $this->_conf['atributos']['celda_comun']; $tmp['class'].= '_clara'; $rta = array_merge($rta, $this->_conf['atributos']["celda_comun"]); $rta[$attr] = $attr; $rta['mlib_style'] = $attr; break; default: trigger_error("No se permite setear el atributo $attr", E_USER_ERROR); } } return $rta; } /** * Obtiene la Cascade Style Sheet para esta tabla. * * @return string Path 'web' a la css. */ function getCSS() { return $this->_conf['css']; } /** * Setea la cabecera. * Ejemplo: * @code * $tabla->setCabecera(array('Hola', '', 'mundo!')); * @endcode * * @param array $cabecera Array de 3 elementos, que son la celda izquierda, * central y derecha de la cabecera (en ese órden). */ function setCabecera($cabecera) { if (count($cabecera) != 3) { $this->raiseError('Parámetro incorrecto: debe ser un array de 3 elementos.'); } $this->_cabecera = $cabecera; } /** * Agrega información a la cabecera de la tabla. * Ejemplo: * @code * $tabla->updateCabecera('Hola', 'izquierda'); * $tabla->updateCabecera('mundo!', 'derecha'); * @endcode * * @param mixed $cabecera Celda a agregar a la cabecera. Puede ser un string * o un objeto con un método toHtml(). * @param string $lugar Lugar en donde poner la cabecera. Puede ser * 'izquierda', 'centro' o 'derecha'. */ function updateCabecera($cabecera, $lugar) { if (!$this->_cabecera) { $this->_cabecera = array('', '', ''); } if ($lugar == 'izquierda') { $this->_cabecera[0] = $cabecera; } elseif ($lugar == 'centro') { $this->_cabecera[1] = $cabecera; } elseif ($lugar == 'derecha') { $this->_cabecera[2] = $cabecera; } else { $this->raiseError('Parámetro incorrecto: lugar debe ser izquierda, centro o derecha.'); } } /** * Setea el pie. * * @param array $pie Array de 3 elementos, que son la celda izquierda, * central y derecha del pie (en ese órden). * * @see Ejemplo en setCabecera(). */ function setPie($pie) { if (count($pie) != 3) { $this->raiseError('Parámetro incorrecto: debe ser un array de 3 elementos.'); } $this->_pie = $pie; } /** * Agrega información al pie de la tabla. * * @param mixed $pie Celda a agregar al pie. Puede ser un string * o un objeto con un método toHtml(). * @param string $lugar Lugar en donde poner el pie. Puede ser * 'izquierda', 'centro' o 'derecha'. * * @see Ejemplo en updateCabecera(). */ function updatePie($pie, $lugar) { if (!$this->_pie) { $this->_pie = array('', '', ''); } if ($lugar == 'izquierda') { $this->_pie[0] = $pie; } elseif ($lugar == 'centro') { $this->_pie[1] = $pie; } elseif ($lugar == 'derecha') { $this->_pie[2] = $pie; } else { $this->raiseError('Parámetro incorrecto: lugar debe ser izquierda, centro o derecha.'); } } /** * Agrega un link predefinido a la cabecera o pie de la tabla. * Ejemplo: * @code * if ($muchos) { * $tabla->addLink('nuevo'); * } else { * $tabla->addLink('nuevos', 'nuevos.php'); * } * $tabla->addLink('volver', * new MLIB_HTML_Link('atras.php')); * $tabla->addLink('anterior', * new MLIB_HTML_Link('previo.php', 'Persona Anterior')); * $tabla->addLink('siguiente', * new MLIB_HTML_Link('previo.php', 'Siguiente persona', * array('pers' => 'prox'))); * @endcode * * @param string $id Identificador del link predefinido. Puede ser 'volver', * 'nuevo', 'nuevos', 'buscar', 'anterior' y 'siguiente'. * @param MLIB_HTML_Link $link Link a usar. Si no tiene contenidos, se pone * uno por defecto. Si es null, se pone como * link la página actual. * */ function addLink($id, $link = null) { if (!$link) { $link = @$_SERVER['PHP_SELF']; } if (is_string($link)) { $link = new MLIB_HTML_Link($link, ''); } switch ($id) { case 'nuevo': $img = new MLIB_HTML_Image('/MLIB/images/general_nuevo', ' >>'); // Si no tiene titulo, le pone titulo por defecto. if (!$link->getContents()) { $link->setContents('Nuevo'); } $link->addContents($img); $this->updateCabecera($link, 'derecha'); break; case 'nuevos': $img = new MLIB_HTML_Image('/MLIB/images/general_muchos_nuevo', ' >>'); // Si no tiene titulo, le pone titulo por defecto. if (!$link->getContents()) { $link->setContents('Nuevos'); } $link->addContents($img); $this->updateCabecera($link, 'derecha'); break; case 'buscar': $img = new MLIB_HTML_Image('/MLIB/images/general_lupa', ' ?>'); // Si no tiene titulo, le pone titulo por defecto. if (!$link->getContents()) { $link->setContents('Buscar'); } $link->addContents($img); $this->updateCabecera($link, 'derecha'); break; case 'siguiente': $img = new MLIB_HTML_Image('/MLIB/images/general_posterior', ' >>'); // Si no tiene titulo, le pone titulo por defecto. if (!$link->getContents()) { $link->setContents('Siguiente'); } $link->addContents($img); $this->updatePie($link, 'derecha'); break; case 'volver': $img = new MLIB_HTML_Image('/MLIB/images/general_anterior', '<< '); // Si no tiene titulo, le pone titulo por defecto. $cont = $link->getContents() ? $link->getContents() : 'Volver'; $link->setContents($img); $link->addContents($cont); $this->updateCabecera($link, 'izquierda'); break; case 'anterior': $img = new MLIB_HTML_Image('/MLIB/images/general_anterior', '<< '); // Si no tiene titulo, le pone titulo por defecto. $cont = $link->getContents() ? $link->getContents() : 'Anterior'; $link->setContents($img); $link->addContents($cont); $this->updatePie($link, 'izquierda'); break; default: $this->raiseError("No hay un link predefinido llamado '$id'."); } } } ?>