]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MLIB/Marco/Menu.php
Se agrega a la clase MLIB_PDF_Tabla la posibilidad de agregar estilos nuevos para
[mecon/meconlib.git] / lib / MLIB / Marco / Menu.php
1 <?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
2 -------------------------------------------------------------------------------
3                                     mlib
4 -------------------------------------------------------------------------------
5 This file is part of mlib.
6
7 mlib is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2 of the License, or (at your option)
10 any later version.
11
12 mlib is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
15  
16 You should have received a copy of the GNU General Public License; if not,
17 write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
18 Boston, MA  02111-1307  USA
19 -------------------------------------------------------------------------------
20 Creado: Mon Apr 14 16:23:22 2003
21 Autor:  Martin Marrese <mmarre@mecon.gov.ar>
22 -------------------------------------------------------------------------------
23 $Id$
24 -----------------------------------------------------------------------------*/
25
26 require_once 'MLIB/Marco/Seccion.php';
27 require_once 'MLIB/Marco/ImagenAnimada.php';
28 require_once 'HTML/Table.php';
29
30 define ('MENU_SERIALIZADO'          , 'MenuSerializado');
31 define ('ARRAYSECCIONES_SERIALIZADO', 'ArraySeccionesSerializado');
32
33 /**
34  * Clase para el manejo de los menues y secciones de los sistemas.
35  *
36  * @access public
37  */
38 class MLIB_Marco_Menu {
39     /**
40      * Array con los resultados para agregar a la pagina.
41      * Sobre este array MLIB_Marco realiza un foreach para agregar lo que
42      * corresponda.
43      *
44      * @var array $resultado
45      * @access public
46      */
47     var $resultado = array();    /**
48                                    
49      * Array con la configuracion de las secciones del sistema o subsecciones de
50      * la sección principal.
51      *
52      * @var    array $configuracion
53      * @access private
54      */
55     var $_configuracion = array();
56     
57     /**
58      * Array de array con los componentes del menu.
59      *
60      * @var    array $componentes
61      * @access private
62      */
63     var $_componentes = array();
64
65     /**
66      * Objeto que contiene el menu a mostrar. Opcionalmente puede contener el
67      * body de la pagina si es el caso de un menu vertical.
68      *
69      * @var    table $tabla
70      * @access private
71      */
72     var $_tabla;
73
74     /**
75      * Variable que contiene el titulo de la seccion seleccionada.
76      *
77      * @var    string $titulo
78      * @access private
79      */
80     var $_titulo = '';
81
82     /**
83      * Array con los objetos seccion.
84      *
85      * @var    array $secciones
86      * @access private
87      */
88     var $_secciones = array();
89
90     /**
91      * Array de array con los componentes del menu en caso de ser este vertical.
92      *
93      * @var    string $componentesVertical
94      * @access private
95      */
96     var $_componentesVertical = array();
97     
98     /**
99      * Recibe como parametro la configuracion del sistema.
100      *
101      * @param  array $configuracion Array con los datos de las secciones
102      *
103      * @return void
104      * @access public
105      */
106     function MLIB_Marco_Menu($configuracion = null) 
107     {
108         $this->_configuracion = $configuracion;
109         $this->_tabla =& new HTML_Table (
110                 array (
111                     'width'       => '760',
112                     'cellspacing' => '0',
113                     'cellpadding' => '0',
114                     'border'      => '0',
115                     )
116                 );
117     }
118     
119     /**
120      * Funcion que obtiene el array de configuracion de secciones.
121      *
122      * @return array
123      * @access private
124      */
125     function _obtenerConfSecciones() 
126     {
127         return $this->_configuracion['secciones'];
128     }
129
130     /**
131      * Devuelve un string con el encabezado de la seccion
132      *
133      * @param  string $titulo Titulo de la seccion
134      *
135      * @return string
136      * @access private
137      */
138     function _armarEncabezado($titulo) 
139     {
140         return '<div class="MLIB_marco_subtitle">'.$titulo.'</div>';
141     }
142
143     /**
144      * Funcion que arma a partir de la configuracion de las secciones el array
145      * con los objetos seccion.
146      *
147      * @param  array $confSec Array con la informacion de las secciones
148      *
149      * @return void
150      * @access private
151      */
152     function _armarArraySecciones($confSec) 
153     {
154         $linksel = $_SERVER['PHP_SELF'];
155         $ultimo = 0;
156         $cuenta = count ($confSec);
157         $i = 1;
158         foreach ($confSec as $sec) {
159             //Veo si tiene permisos para ver la seccion
160             if (!@$this->_configuracion['obj_permiso'] || !@$sec['permisos']) {
161                 $ver = true;
162             }
163             elseif ($this->_configuracion['obj_permiso']->tiene(@$sec['permisos'])) {
164                 $ver = true;
165             }
166             else {
167                 $ver = false;
168             }
169             if ($ver) {
170                 $tmp = new MLIB_Marco_Seccion ($sec, $this->_configuracion);         
171                 array_push($this->_componentes, $tmp->toHtml($linksel));
172                 if ($cuenta == $i) {
173                     $ultimo = 1;
174                 }
175                 array_push($this->_componentesVertical, 
176                         $tmp->toHtmlVertical($linksel,$ultimo));
177                 array_push($this->_secciones,$tmp);
178             }
179             $i++;
180         }
181     }
182     
183     /**
184      * Funcion que se encarga de agregar componentes al array
185      *
186      * @param  array $componente Datos del componente de menu a agregar
187      *
188      * @return void
189      * @access public
190      */
191     function agregarComponente($componente) 
192     {
193         array_push($this->_componentes,$componente);
194     }
195     
196     /**
197      * Funcion que se encarga de devolver lo que se debe mostrar en pantalla
198      *
199      * @return string
200      * @access public
201      */
202     function toHtml() 
203     {
204         return $this->_tabla->toHtml();
205     }
206     
207     /**
208      * Devuelve el html del menu que hay que mostrar en pantalla
209      *
210      * @return string
211      * @access public
212      */
213     function menuToHtml() 
214     {
215         return $this->_menuHtml;
216     }
217
218     /**
219      * Funcion que se encarga de generar el archivo que despues sera utilizado 
220      * con la funcion EVAL.
221      *
222      * @return void
223      * @access private
224      */
225     function _generarArchivo() 
226     {
227         $s = serialize($this);
228         $fp = fopen($this->_configuracion['directorios']['root'].'/'.MENU_SERIALIZADO,'w');
229         fputs($fp, $s);
230         fclose($fp);
231     }
232     
233     /**
234      * Funcion que se encarga de obtener el archivo con los datos del objeto 
235      * para ser utilizado con la funcion EVAL.
236      *
237      * @param  string $directorio Nombre del directorio en donde se encuentra el
238      *                            sistema instalado
239      *
240      * @return string
241      * @access private
242      */
243     function _obtenerArchivo($directorio) 
244     {
245         $s = implode("", @file($this->_configuracion['directorios']['root'].'/'.MENU_SERIALIZADO));
246         return unserialize($s);
247     }
248     
249     /**
250      * Funcion que se encarga de serializar el array asociativo 
251      * paginas-secciones. Se utilizara en la clase seccion para identificar 
252      * a que seccion pertenece la pagina a la cual se quiere acceder.
253      *
254      * @return void
255      * @access private
256      */
257     function _serializarArraySecciones() 
258     {
259         $secciones = $this->_configuracion['secciones'];
260         $tmp  = array();
261         $tmp2 = array();
262         
263         $PATH = $this->_configuracion['directorios']['root'];
264        
265         foreach ($secciones as $sec) { //Chequeo las secciones
266             $tmp[$sec['nombre']] = array ($PATH.'/'.$sec['link']);
267             if (array_key_exists('hijos',$sec)) {
268                 foreach ($sec['hijos'] as $hijo) { //Chequeo las subsecciones            
269                     array_push($tmp[$sec['nombre']],$PATH.'/'.$hijo['link']);
270                     $tmp2[$sec['nombre'].'-'.$hijo['nombre']] = array ($PATH.'/'.$hijo['link']);
271                     if (array_key_exists('subhijos',$hijo)) {
272                         foreach ($hijo['subhijos'] as $subhijo) { //Chequeo las subsubsecciones
273                             array_push($tmp[$sec['nombre']],$PATH.'/'.$subhijo);
274                             array_push($tmp2[$sec['nombre'].'-'.$hijo['nombre']],$PATH.'/'.$subhijo);
275                         }
276                     }
277                 }
278             }
279             if (array_key_exists('subhijos',$sec)) {
280                 foreach ($sec['subhijos'] as $subhijo2) { //Chequeo la lista de hijos no secciones
281                     array_push($tmp[$sec['nombre']],$PATH.'/'.$subhijo2);
282                 }
283             }
284         }
285         $tmp = array_merge($tmp,$tmp2);
286         $s = serialize($tmp);
287         $file_cache = strtr( $this->_configuracion['directorios']['root'], '/','_');
288         $fp = fopen($this->_configuracion['directorios_fs']['cache'].'/'.ARRAYSECCIONES_SERIALIZADO.'_'.$file_cache,'w');
289         fputs($fp, $s);
290         fclose($fp);
291     }
292 }
293 ?>