-------------------------------------------------------------------------------
$Id$
-----------------------------------------------------------------------------*/
require_once 'MLIB/Marco/Seccion.php';
require_once 'MLIB/Marco/ImagenAnimada.php';
require_once 'HTML/Table.php';
define ('MENU_SERIALIZADO' , 'MenuSerializado');
define ('ARRAYSECCIONES_SERIALIZADO', 'ArraySeccionesSerializado');
/**
* Clase para el manejo de los menues y secciones de los sistemas.
*
* @access public
*/
class MLIB_Marco_Menu {
/**
* Array con los resultados para agregar a la pagina.
* Sobre este array MLIB_Marco realiza un foreach para agregar lo que
* corresponda.
*
* @var array $resultado
* @access public
*/
var $resultado = array(); /**
* Array con la configuracion de las secciones del sistema o subsecciones de
* la sección principal.
*
* @var array $configuracion
* @access private
*/
var $_configuracion = array();
/**
* Array de array con los componentes del menu.
*
* @var array $componentes
* @access private
*/
var $_componentes = array();
/**
* Objeto que contiene el menu a mostrar. Opcionalmente puede contener el
* body de la pagina si es el caso de un menu vertical.
*
* @var table $tabla
* @access private
*/
var $_tabla;
/**
* Variable que contiene el titulo de la seccion seleccionada.
*
* @var string $titulo
* @access private
*/
var $_titulo = '';
/**
* Array con los objetos seccion.
*
* @var array $secciones
* @access private
*/
var $_secciones = array();
/**
* Array de array con los componentes del menu en caso de ser este vertical.
*
* @var string $componentesVertical
* @access private
*/
var $_componentesVertical = array();
/**
* Recibe como parametro la configuracion del sistema.
*
* @param array $configuracion Array con los datos de las secciones
*
* @return void
* @access public
*/
function MLIB_Marco_Menu($configuracion = null)
{
$this->_configuracion = $configuracion;
$this->_tabla =& new HTML_Table (
array (
'width' => '760',
'cellspacing' => '0',
'cellpadding' => '0',
'border' => '0',
)
);
}
/**
* Funcion que obtiene el array de configuracion de secciones.
*
* @return array
* @access private
*/
function _obtenerConfSecciones()
{
return $this->_configuracion['secciones'];
}
/**
* Devuelve un string con el encabezado de la seccion
*
* @param string $titulo Titulo de la seccion
*
* @return string
* @access private
*/
function _armarEncabezado($titulo)
{
return '
'.$titulo.'
';
}
/**
* Funcion que arma a partir de la configuracion de las secciones el array
* con los objetos seccion.
*
* @param array $confSec Array con la informacion de las secciones
*
* @return void
* @access private
*/
function _armarArraySecciones($confSec)
{
$linksel = $_SERVER['PHP_SELF'];
$ultimo = 0;
$cuenta = count ($confSec);
$i = 1;
foreach ($confSec as $sec) {
//Veo si tiene permisos para ver la seccion
if (!@$this->_configuracion['obj_permiso'] || !@$sec['permisos']) {
$ver = true;
}
elseif ($this->_configuracion['obj_permiso']->tiene(@$sec['permisos'])) {
$ver = true;
}
else {
$ver = false;
}
if ($ver) {
$tmp = new MLIB_Marco_Seccion ($sec, $this->_configuracion);
array_push($this->_componentes, $tmp->toHtml($linksel));
if ($cuenta == $i) {
$ultimo = 1;
}
array_push($this->_componentesVertical,
$tmp->toHtmlVertical($linksel,$ultimo));
array_push($this->_secciones,$tmp);
}
$i++;
}
}
/**
* Funcion que se encarga de agregar componentes al array
*
* @param array $componente Datos del componente de menu a agregar
*
* @return void
* @access public
*/
function agregarComponente($componente)
{
array_push($this->_componentes,$componente);
}
/**
* Funcion que se encarga de devolver lo que se debe mostrar en pantalla
*
* @return string
* @access public
*/
function toHtml()
{
return $this->_tabla->toHtml();
}
/**
* Devuelve el html del menu que hay que mostrar en pantalla
*
* @return string
* @access public
*/
function menuToHtml()
{
return $this->_menuHtml;
}
/**
* Funcion que se encarga de generar el archivo que despues sera utilizado
* con la funcion EVAL.
*
* @return void
* @access private
*/
function _generarArchivo()
{
$s = serialize($this);
$fp = fopen($this->_configuracion['directorios']['root'].'/'.MENU_SERIALIZADO,'w');
fputs($fp, $s);
fclose($fp);
}
/**
* Funcion que se encarga de obtener el archivo con los datos del objeto
* para ser utilizado con la funcion EVAL.
*
* @param string $directorio Nombre del directorio en donde se encuentra el
* sistema instalado
*
* @return string
* @access private
*/
function _obtenerArchivo($directorio)
{
$s = implode("", @file($this->_configuracion['directorios']['root'].'/'.MENU_SERIALIZADO));
return unserialize($s);
}
/**
* Funcion que se encarga de serializar el array asociativo
* paginas-secciones. Se utilizara en la clase seccion para identificar
* a que seccion pertenece la pagina a la cual se quiere acceder.
*
* @return void
* @access private
*/
function _serializarArraySecciones()
{
$secciones = $this->_configuracion['secciones'];
$tmp = array();
$tmp2 = array();
$PATH = $this->_configuracion['directorios']['root'];
foreach ($secciones as $sec) { //Chequeo las secciones
$tmp[$sec['nombre']] = array ($PATH.'/'.$sec['link']);
if (array_key_exists('hijos',$sec)) {
foreach ($sec['hijos'] as $hijo) { //Chequeo las subsecciones
array_push($tmp[$sec['nombre']],$PATH.'/'.$hijo['link']);
$tmp2[$sec['nombre'].'-'.$hijo['nombre']] = array ($PATH.'/'.$hijo['link']);
if (array_key_exists('subhijos',$hijo)) {
foreach ($hijo['subhijos'] as $subhijo) { //Chequeo las subsubsecciones
array_push($tmp[$sec['nombre']],$PATH.'/'.$subhijo);
array_push($tmp2[$sec['nombre'].'-'.$hijo['nombre']],$PATH.'/'.$subhijo);
}
}
}
}
if (array_key_exists('subhijos',$sec)) {
foreach ($sec['subhijos'] as $subhijo2) { //Chequeo la lista de hijos no secciones
array_push($tmp[$sec['nombre']],$PATH.'/'.$subhijo2);
}
}
}
$tmp = array_merge($tmp,$tmp2);
$s = serialize($tmp);
$file_cache = strtr( $this->_configuracion['directorios']['root'], '/','_');
$fp = fopen($this->_configuracion['directorios_fs']['cache'].'/'.ARRAYSECCIONES_SERIALIZADO.'_'.$file_cache,'w');
fputs($fp, $s);
fclose($fp);
}
}
?>