X-Git-Url: https://git.llucax.com/mecon/meconlib.git/blobdiff_plain/cacc1525e7102dfef7964462a50e4ff13f02dcc6..eadc9e63372dde805c0a1b0ad7db6aaa113995cf:/lib/MECON/HTML/Tabla.php diff --git a/lib/MECON/HTML/Tabla.php b/lib/MECON/HTML/Tabla.php index df56c44..378653b 100644 --- a/lib/MECON/HTML/Tabla.php +++ b/lib/MECON/HTML/Tabla.php @@ -1,65 +1,86 @@ - | -// +--------------------------------------------------------------------+ -// -// $Id$ -// -// $URL$ -// $Rev$ -// $Date$ -// $Author$ + +------------------------------------------------------------------------------- +$Id$ +-----------------------------------------------------------------------------*/ require_once 'HTML/Table.php'; +require_once 'MECON/HTML/Image.php'; +require_once 'MECON/HTML/Link.php'; /** - * Manejo de tablas. - * * Libreria para le manejo de las tablas de los sistemas de intranet. * - * @version $Rev$ - * @author $Author$ */ - -class Tabla extends HTML_Table { - +class MECON_HTML_Tabla extends HTML_Table { + /** * Valores de Configuracion particular * - * @var array + * @var array() $conf + * @access protected */ var $_conf; /** * Atributos de las tablas. * - * @var array + * @var array() attrs + * @access protected */ var $_attrs; /** - * Constructor. + * Í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 $atributos Atributos diferentes a los estandares para la - * tabla + * @param mixed $attrs Atributos diferentes a los estandares para la tabla + * @param string $estilo Tipo de tabla * * @access public */ - function Tabla($attrs = null) - { - $this->_conf = include 'Tabla/conf_Tabla.php'; // Obtengo los valores particulares de configuracion + function MECON_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 @@ -81,165 +102,11 @@ class Tabla extends HTML_Table { } } $this->HTML_Table($this->_attrs); - } - - /** - * Agrega una fila del tipo Cabecera - * - * Agrega una fila del tipo cabecera, tomando colores y demas del - * archivo de configuracion. Recibe como parametro un array con - * los datos a incluir en la linea. Agrega tantas columnas como - * elementos tenga el array. Si no recibe parametro alguno, - * inserta una fila en blanco. Devuelve el identificador de la - * fila en donde inserto los datos. - * - * @param $contenido Contenido de la fila - * - * @return int Identificador de Linea - * - * @access public - * @deprecated - */ - function agregarFilaCabecera($contenido = '', $atributos = '') - { - return $this->addRow($contenido, 'cabecera'); - } - - /** - * Agrega una fila del tipo Comun - * - * Agrega una fila del tipo comun, tomando colores y demas del - * archivo de configuracion. Recibe como parametro un array con - * los datos a incluir en la linea. Agrega tantas columnas como - * elementos tenga el array. Si no recibe parametro alguno, - * inserta una fila en blanco. Devuelve el identificador de la - * fila en donde inserto los datos. - * - * @param $contenido Contenido de la fila - * - * @return int Identificador de Linea - * - * @access public - * @deprecated - */ - function agregarFila($contenido = '') - { - return $this->addRow($contenido, 'comun'); - } - - /** - * Modifica el atributo rowSpan a la celda pasada por parametro - * - * @param int $fila - * @param int $columna - * @param int $valor - * - * @access public - * @deprecated - */ - function rowSpan($fila, $columna, $valor) - { - return $this->updateCellAttributes($fila, $columna, 'rowspan="'.$valor.'"'); - } - - /** - * Modifica el atributo colSpan a la celda pasada por parametro - * - * @param int $fila - * @param int $columna - * @param int $valor - * - * @access public - * @deprecated - */ - function colSpan($fila, $columna, $valor) - { - return $this->updateCellAttributes($fila, $columna, 'colspan="'.$valor.'"'); - } - - /** - * Modifica el atributo aling de la celda pasada por parametro - * - * @param int $fila - * @param int $columna - * @param string $valor (left, center, right...) - * - * @access public - * @deprecated - */ - function align($fila, $columna, $valor) - { - return $this->updateCellAttributes($fila, $columna, 'align="'.$valor.'"'); - } - - /** - * Setea una columna como del tipo cabecera - * - * @param int $columna - * - * @access public - * @deprecated - */ - function setColCabecera($columna) - { - return $this->updateColAttributes($columna, 'cabecera'); - } - - /** - * Setea una columna como del tipo titulo - * - * @param int $columna - * - * @access public - * @deprecated - */ - function setColTitulo($columna) - { - return $this->updateColAttributes($columna, 'titulo'); - } - - /** - * Alinea una columna entera - * - * @param int $columna - * @param string $valor - * - * @access public - * @deprecated - */ - function setColAlign($columna, $valor) - { - return $this->updateColAttributes($columna,'align="'.$valor.'"'); - } - - /** - * Cambia el tamanio de una columna entera - * - * @param int $columna - * @param string $valor - * - * @access public - * @deprecated - */ - function setColWidth($columna, $valor) - { - return $this->updateColAttributes($columna,'width="'.$valor.'"'); - } + if (isset($attrs['align'])) { + $this->_attrs['align'] = $attrs['align']; + } - /** - * Cambia el color de fondo de una celda - * - * @param int $fila - * @param int $columna - * @param string $valor - * - * @access public - * @deprecated - */ - function setCellBgcolor($fila, $columna, $valor) - { - return $this->updateCellAttributes($fila, $columna,'bgcolor="'.$valor.'"'); - } + } /** * Devuelve el html de la tabla @@ -249,28 +116,72 @@ class Tabla extends HTML_Table { * Si $simple es falso, devuelve el html comun y corriente (con 2 * tablas), si es false devuelve una tabla sola. * - * @param bool $simple + * @param bool $simple Tipo de tabla que se quiere recibir. * * @return string Html * * @access public */ - function toHtml($simple = 0) - { + function toHtml($simple = 0) { + if ($simple) { + $result = parent::toHtml(); // Agregar la tabla de fondo. - if ($simple == 0) { - $tmp = $this->_parseAttributes($this->_conf['atributos']['tabla_contenedora']); - $tmp['width'] = $this->_attrs['width']; - $tabla_externa = new HTML_Table($tmp); - $tabla_externa->setCellContents(0, 0, parent::toHtml()); - $tabla_externa->setCellAttributes(0, 0, $this->_conf['atributos']['celda_comun']); + } 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(); } - else { - $result = parent::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; + } - return $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')); + } } /** @@ -280,15 +191,14 @@ class Tabla extends HTML_Table { * asociativo, se setean los atributos representados por las claves * con los valores. * - * @param int $row - * @param int $col - * @param mixed $attrs + * @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)); + function updateCellAttributes($row, $col, $attrs) { + return parent::updateCellAttributes($row, $col, $this->_translateAttributes($attrs, false)); } /** @@ -298,15 +208,14 @@ class Tabla extends HTML_Table { * asociativo, se setean los atributos representados por las claves * con los valores. * - * @param int $row - * @param int $col - * @param mixed $attrs + * @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)); + function setCellAttributes($row, $col, $attrs) { + return parent::setCellAttributes($row, $col, $this->_translateAttributes($attrs, true)); } /** @@ -315,15 +224,14 @@ class Tabla extends HTML_Table { * Agrega una fila. El contenido es el que viene representado por * el array $content. Recibe los atributos en la variable $attrs * - * @param mixed $content - * @param mixed $attrs + * @param mixed $content Contenido + * @param mixed $attrs Atributos * - * @return int $rowId + * @return int $rowId Identificador de la fila * * @access public */ - function addRow($content, $attrs = 'comun') - { + function addRow($content, $attrs = 'comun') { return parent::addRow($content, $attrs); } @@ -333,22 +241,24 @@ class Tabla extends HTML_Table { * Convierte un atributo HTML al string para pasar a los metodos de HTML_Table * Recibe en $attrs los atributos a modificar. * - * @param string $attrs + * @param mixed $attrs Atributos. + * @param bool $isSet Indica si hay que setear. * - * @return string + * @return array * @access private */ - function _translateAttributes($attrs) - { + function _translateAttributes($attrs, $isSet) { if (!$attrs) { return array(); } if (is_string($attrs)) { $attrs = $this->_parseAttributes($attrs); } - #$rta = array(); - $rta = $this->_conf['atributos']['celda_comun']; - #$sin_estilo = true; + if ($isSet) { + $rta = $this->_conf['atributos']['celda_comun']; + } else { + $rta = array(); + } foreach ($attrs as $attr => $val) { $attr = strtolower($attr); switch ($attr) { @@ -356,8 +266,9 @@ class Tabla extends HTML_Table { case 'comun': case 'cabecera': case 'titulo': - #$sin_estilo = false; - $rta = array_merge($rta, $this->_conf['atributos']["celda_$attr"]); + $rta = array_merge($rta, + $this->_conf['atributos']["celda_$attr"]); + $rta[$attr] = $attr; break; case 'align': case 'valign': @@ -370,27 +281,221 @@ class Tabla extends HTML_Table { case 'border': case 'cellspacing': case 'cellpadding': + case 'nowrap': $rta[$attr] = $val; break; case 'spacing': case 'padding': $rta["cell$attr"] = $val; break; - case 'nowrap': case 'th': $rta[$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; + 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; + break; default: trigger_error("No se permite setear el atributo $attr", E_USER_ERROR); } } - // Si no tiene estilo, agrego estilo comun. - #if ($sin_estilo) { - #$rta = $this->_conf['atributos']['celda_comun']; - #} 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 MECON_HTML_Link('atras.php')); + * $tabla->addLink('anterior', + * new MECON_HTML_Link('previo.php', 'Persona Anterior')); + * $tabla->addLink('siguiente', + * new MECON_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 MECON_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 MECON_HTML_Link($link, ''); + } + switch ($id) { + case 'nuevo': + $img = new MECON_HTML_Image('/MECON/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 MECON_HTML_Image('/MECON/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 MECON_HTML_Image('/MECON/images/general_lupa', 'Q'); + // 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 MECON_HTML_Image('/MECON/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 MECON_HTML_Image('/MECON/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 MECON_HTML_Image('/MECON/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'."); + } + } + } ?>