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