]> git.llucax.com Git - mecon/ai.git/blob - lib/AI/Form.php
- Se agrega un método estático AI_Error::isError() para saber si algo es un
[mecon/ai.git] / lib / AI / Form.php
1 <?php
2 // vim: set binary expandtab tabstop=4 softtabstop=4 shiftwidth=4:
3 // +--------------------------------------------------------------------+
4 // |                      Ministerio de Economía                        |
5 // |                  AI (Administrador de Intranet)                    |
6 // +--------------------------------------------------------------------+
7 // | This file is part of AI.                                           |
8 // |                                                                    |
9 // | AI is free software; you can redistribute it and/or modify         |
10 // | it under the terms of the GNU General Public License as published  |
11 // | by the Free Software Foundation; either version 2 of the License,  |
12 // | or (at your option) any later version.                             |
13 // |                                                                    |
14 // | AI is distributed in the hope that it will be useful, but          |
15 // | WITHOUT ANY WARRANTY; without even the implied warranty of         |
16 // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   |
17 // | General Public License for more details.                           |
18 // |                                                                    |
19 // | You should have received a copy of the GNU General Public License  |
20 // | along with Hooks; if not, write to the Free Software Foundation,   |
21 // | Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA      |
22 // +--------------------------------------------------------------------+
23 // | Creado: Thu Jul 3 17:39:15 2003                                    |
24 // | Autor:  Leandro Lucarella <llucar@mecon.gov.ar>                    |
25 // +--------------------------------------------------------------------+
26 //
27 // $Id$
28 //
29
30 // +X2C includes
31 require_once 'MECON/HTML/QuickForm.php';
32 // ~X2C
33
34 // Definicion de acciones.
35 define('AI_ALTA',   1);
36 define('AI_BAJA',   2);
37 define('AI_MODIF',  4);
38
39 // +X2C Class 507 :AI_Form
40 /**
41  * Formularios para el Administrador de Intranet.
42  *
43  * @access public
44  */
45 class AI_Form extends MECON_HTML_QuickForm {
46     // ~X2C
47
48     // +X2C Operation 509
49     /**
50      * Construye un formulario para el objecto especificado.
51      *
52      * @param  object &$obj Objeto con el cual rellenar el formulario. Puede ser GrupoSecciones, Servicio o Sistema.
53      * @param  int $accion Accion que realizar?el formulario a crear. Puede ser AI_ALTA, AI_BAJA o AI_MODIFICACION.
54      *
55      * @return void
56      * @access public
57      */
58     function iniciar(&$obj, $accion = AI_ALTA) // ~X2C
59     {
60         # FIXME - Tomar la db desde afuera.
61         $db = AI_DB::connect('../conf/DB.ini');
62         $tipo   = substr(get_class($obj), 3);
63         $s_tipo = ucfirst($tipo);
64         if ($tipo == 'gruposecciones') {
65             $tipo   = 'grupo';
66             $s_tipo = 'Grupo de Secciones';
67         }
68         $padre = $tipo.'_padre';
69         switch ($accion) {
70             case AI_BAJA:
71                 $s_accion = 'Borrar';
72                 break;
73             case AI_MODIF:
74                 $s_accion = 'Modificar';
75                 break;
76             default:
77                 $accion   = AI_ALTA;
78                 $s_accion = 'Agregar';
79         }
80         // Construyo con el padre y seteos generales.
81         $this->setRendererOpts(array('width' => '400'));
82         $this->addElement('header','cabecera', $s_accion . ' ' . $s_tipo);
83         // Elementos.
84         if ($tipo == 'sistema') {
85             require_once 'SAMURAI/Sistema.php';
86             $sistemas = array('' => '--');
87             $cargados = AI_Sistema::getSistemasArray($db);
88             foreach (SAMURAI_Sistema::getArraySistemas($db) as $id => $nom) {
89                 if (!in_array($id, $cargados)
90                         or ($accion & (AI_BAJA | AI_MODIF) and $id == $obj->$tipo)) {
91                     $sistemas[$id] = $nom;
92                 }
93             }
94             $fId =& $this->addElement('select', $tipo, 'Sistema', $sistemas);
95             $this->addRule($tipo, 'Debe ingresar un sistema.', 'required');
96         }
97         if ($accion & (AI_BAJA | AI_MODIF)) {
98             if ($tipo == 'sistema') {
99                 $fId->setSelected($obj->$tipo);
100             } else {
101                 $fId =& $this->addElement('text', $tipo, 'Identificador');
102                 $fId->setValue($obj->$tipo);
103             }
104             $fId->freeze();
105         }
106         if ($tipo == 'grupo' or $tipo == 'servicio') {
107             $tipos = array('' => '--', '0' => 'Página Principal')
108                 + arbol2array($db, ($tipo == 'grupo') ? 'grupo_secciones' : $tipo,
109                     0, $tipo, 'nombre', $tipo . '_padre', 'ASC');
110             // Saco el elemento actual si hay uno cargado (no puede ser padre de si mismo).
111             if ($accion & (AI_BAJA | AI_MODIF)) {
112                 unset($tipos[$obj->$tipo]);
113             }
114             $fPadre  =& $this->addElement('select', $padre, 'Padre', $tipos);
115             $fNombre =& $this->addElement('text', 'nombre', 'Nombre');
116             // Validación.
117             $this->addRule('nombre', 'Debe ingresar un nombre.', 'required');
118             $this->addRule($padre, 'Debe ingresar un padre.', 'required');
119             $this->addRule($padre, 'El padre debe ser un número natural.',
120                 'regex', '/^\d*$/');
121             // Carga datos.
122             if ($accion & (AI_BAJA | AI_MODIF)) {
123                 $fPadre->setSelected($obj->$padre);
124                 $fNombre->setValue($obj->nombre);
125             }
126         }
127         if ($tipo == 'grupo') {
128             $fAntiguedad   =& $this->addElement('select', 'antiguedad', 'Antigüedad',
129                 array(3 => '3 días', 1 => '1 día', 7 => '1 semana'));
130             $fSecciones    =& $this->addElement('select', 'secciones', 'Secciones',
131                 AI_GrupoSecciones::getSeccionesArray($db),
132                 array('multiple' => 'multiple', 'size' => 8));
133             $fMostrarHijos =& $this->addElement('checkbox', 'mostrar_hijos', 'Mostrar hijos');
134             // Validación.
135             $this->addRule('antiguedad', 'La antigüedad debe ser un número natural.',
136                 'regex', '/^\d*$/');
137             // Carga datos.
138             if ($accion & (AI_BAJA | AI_MODIF)) {
139                 $fAntiguedad->setSelected($obj->antiguedad);
140                 $fSecciones->setSelected($obj->secciones);
141                 $fMostrarHijos->setChecked($obj->mostrar_hijos);
142             }
143         }
144         if ($tipo == 'servicio') {
145             $fDescripcion =& $this->addElement('text', 'descripcion', 'Descripción');
146             $fLogueo      =& $this->addElement('checkbox','logueo', 'Necesita login');
147             // Validación
148             $this->addRule('descripcion',   'Debe ingresar una descripción.',   'required');
149             // Carga datos.
150             if ($accion & (AI_BAJA | AI_MODIF)) {
151                 $fDescripcion->setValue($obj->descripcion);
152                 $fLogueo->setChecked($obj->necesita_logueo);
153             }
154         }
155         if ($tipo == 'servicio' or $tipo == 'sistema') {
156             $fLink      =& $this->addElement('text', 'link', 'Enlace');
157             $fLinkAyuda =& $this->addElement('text', 'link_ayuda', 'Enlace de la ayuda');
158             //$fIcono     =& $this->addElement('text', 'icono', 'Ícono');
159             $fIcono     =& $this->addElement('select', 'icono', 'Ícono',
160             listaImagenes('/var/www/sistemas/intranet/www/images', $tipo . '_', '\.gif'));
161             // Carga datos.
162             if ($accion & (AI_BAJA | AI_MODIF)) {
163                 $fLink->setValue($obj->link);
164                 $fLinkAyuda->setValue($obj->link_ayuda);
165                 $fIcono->setValue($obj->icono);
166             }
167             // Validación.
168             if ($tipo == 'sistema') {
169                 $this->addRule('link',  'Debe ingresar un nombre.', 'required');
170                 $this->addRule('icono', 'Debe ingresar un ícono.',  'required');
171             }
172         }
173         $fHabilitado =& $this->addElement('checkbox','habilitado', 'Está habilitado',
174             '', array('checked' => 'checked'));
175         // Carga datos.
176         if ($accion & (AI_BAJA | AI_MODIF)) {
177             $fHabilitado->setChecked($obj->habilitado);
178         }
179         // Botones.
180         $fBtnAccion =& parent::createElement('submit', 'aceptar' , $s_accion);
181         if ($accion & AI_MODIF) {
182             $fBtnCancelar =& parent::createElement('submit', 'modificar' , 'Borrar');
183         } elseif ($accion & AI_ALTA) {
184             $fBtnCancelar =& parent::createElement('reset', 'agregar', 'Limpiar');
185         } elseif ($accion & AI_BAJA) {
186             $fBtnCancelar =& parent::createElement('submit', 'borrar', 'Cancelar');
187         }
188         $grupo = array(
189             &$fBtnAccion,
190             &$fBtnCancelar,
191         );
192         $this->addGroup($grupo, 'botones');
193     }
194     // -X2C
195
196     // +X2C Operation 510
197     /**
198      * Llena un objeto con los datos del formulario.
199      *
200      * @param  mixed &$obj Objeto a llenar con los datos del formulario. Puede ser GrupoSecciones, Servicio o Sistema.
201      *
202      * @return void
203      * @access public
204      */
205     function llenarObjeto(&$obj) // ~X2C
206     {
207         $tipo  = substr(get_class($obj), 3);
208         if ($tipo == 'gruposecciones') {
209             $tipo = 'grupo';
210         }
211         $padre = $tipo.'_padre';
212         // Elementos.
213         $obj->$tipo = $this->getSubmitValue($tipo);
214         $obj->habilitado = $this->getSubmitValue('habilitado');
215         if ($tipo == 'grupo' or $tipo == 'servicio') {
216             $obj->$padre = $this->getSubmitValue($padre);
217             $obj->nombre = $this->getSubmitValue('nombre');
218         }
219         if ($tipo == 'grupo') {
220             $obj->antiguedad    = $this->getSubmitValue('antiguedad');
221             $obj->secciones     = $this->getSubmitValue('secciones');
222             $obj->mostrar_hijos = $this->getSubmitValue('mostrar_hijos');
223         }
224         if ($tipo == 'servicio') {
225             $obj->descripcion     = $this->getSubmitValue('descripcion');
226             $obj->necesita_logueo = $this->getSubmitValue('logueo');
227         }
228         if ($tipo == 'servicio' or $tipo == 'sistema') {
229             $obj->link       = $this->getSubmitValue('link');
230             $obj->link_ayuda = $this->getSubmitValue('link_ayuda');
231             $obj->icono      = $this->getSubmitValue('icono');
232         }
233     }
234     // -X2C
235
236 } // -X2C Class :AI_Form
237
238 // FIXME - Poner esto en algun lugar mejor.
239 function listaImagenes($dir = '.', $prepend = '', $append = '')
240 {
241     $lista = array('' => '--');
242     $d = dir($dir);
243     while (($file = $d->read()) !== false) {
244         if (preg_match("/$prepend(.*)$append/", $file, $m)) {
245             $nombre = ucwords(join(' ', preg_split('/_/', $m[1])));
246             $lista[$file] = $nombre;
247         }
248     }
249     return $lista;
250 }
251
252 // FIXME - Poner esto en algun lugar mejor.
253 function arbol2array(&$db, $tabla, $actual, $id, $nombre, $padre, $order = '', $indent = '&nbsp;&nbsp;&nbsp;')
254 {
255     // Para llevar el nivel de indentación
256     static $nivel = 0;
257     $nivel++;
258     $sql = "SELECT $id, $nombre
259             FROM $tabla";
260     if (!is_null($padre)) {
261         $sql .= " WHERE $padre = ".$db->quote($actual);
262     }
263     if ($order) {
264         $sql .= " ORDER BY $nombre $order";
265     }
266     $array = $db->getAssoc($sql);
267     if (DB::isError($array)) {
268         return $array;
269     }
270     $ret = array();
271     foreach ($array as $key => $val) {
272         $ret[$key] = str_repeat($indent, $nivel) . $val;
273         $ret += arbol2array($db, $tabla, $key, $id, $nombre, $padre, $order, $indent);
274     }
275     $nivel--;
276     return $ret;
277 }
278
279 ?>