2 // vim: set expandtab tabstop=4 softtabstop=4 shiftwidth=4 foldmethod=marker textwidth=80:
3 // +----------------------------------------------------------------------+
5 // +----------------------------------------------------------------------+
6 // | Copyright (c) 1997-2003 The PHP Group |
7 // +----------------------------------------------------------------------+
8 // | This source file is subject to version 2.02 of the PHP license, |
9 // | that is bundled with this package in the file LICENSE, and is |
10 // | available at through the world-wide-web at |
11 // | http://www.php.net/license/2_02.txt. |
12 // | If you did not receive a copy of the PHP license and are unable to |
13 // | obtain it through the world-wide-web, please send a note to |
14 // | license@php.net so we can mail you a copy immediately. |
15 // +----------------------------------------------------------------------+
16 // | Created: mar ago 26 13:18:26 ART 2003
17 // | Author: Martin Marrese <mmarre@mecon.gov.ar>
18 // +----------------------------------------------------------------------+
23 /** \page page_samurai_html_perfil Perfil Embebido
25 \section page_samurai_html_perfil_descripcion Descripcion
26 Samurai provee de una funcion que permite embeber la funcionalidad de
27 perfiles dentro de aquellos sistemas que asi lo requieran.
28 Es completamente independiente del sistema en el cual trabaja y puede ser
29 agregado de cualquier manera (Seccion, Subseccion o Contenido) al sistema.
31 \note Es necesario para embeber los perfiles que se haya realizado un
34 \section page_samurai_html_perfil_funcionamiento Funcionamiento
35 Es una copia de la seccion Perfiles dentro de SAMURAI. Se relizan las mismas
36 verificaciones, tiene las mismas condiciones y se utilizan los mismos
39 \subsection page_samurai_html_perfil_funcionamiento_validaciones Validaciones y Condiciones
40 - Los espacios entre las palabras que componen el nombre de un
41 perfil son eliminados. Ej: Agregar Usuario
42 se cambia por Agregar Usuario.
43 - Es obligatorio que los perfiles contengan al menos un permiso.
44 - No puede haber dos perfiles con los mismos permisos.
45 - No se pueden borrar perfiles que esten asociados a usuarios.
46 - No se pueden ingresar pefiles nuevos que ya esten cargados.
48 \section page_samurai_html_perfil_ejemplo Ejemplo
49 SAMURAI_HTML_Perfil agrega el contenido directamente en el marco que se este
51 Para embeber los perfiles hay que hacerlo de la siguiente manera
54 include 'SAMURAI/HTML/Perfil.php';
55 SAMURAI_HTML_Perfil($MARCO, $ID_SISTEMA);
58 \note $MARCO es el objeto MECON_Marco o el objeto HTML_DietMarco de
60 $ID_SISTEMA es el identificador numerico en el cual se esta realizando la
63 \section page_samurai_html_perfil_permisos Pasos Finales
64 Para que los usuarios puedan acceder a los perfiles embebidos es necesario
65 que en el sistema en el cual se este embebiendo se agregen los permisos que
66 utiliza la seccion Perfiles (enumerados mas abajo), y que estos mediante
67 perfiles se asignen a usuarios.
68 Esto implica que por lo menos un usuario tendra que ser cargado desde
69 SAMURAI para que este tenga acceso a la zona embebida.
79 require_once 'SAMURAI/DB.php';
80 require_once 'SAMURAI/Perm.php';
81 require_once 'SAMURAI/constantes.php';
82 require_once 'SAMURAI/Perfil.php';
83 require_once 'SAMURAI/Sistema.php';
84 require_once 'SAMURAI/Permiso.php';
85 require_once 'MECON/HTML/Tabla.php';
86 require_once 'MECON/HTML/QuickForm.php';
87 require_once 'MECON/HTML/Error.php';
88 require_once 'MECON/HTML/Image.php';
89 require_once 'PEAR.php';
93 * Funcion que se encarga agregar los componentes necesarios al sistema para
94 * que se pueda realizar un abm de perfiles.
95 @see \ref page_samurai_html_perfil
97 * @param MECON_Marco &$MARCO Referencia al objeto MECON_Marco que se este utilizando en la pagina
98 * @param int $id_sistema Identificador del sistema en el cual se esta trabajando
102 //SAMURAI_HTML_Perfil {{{
103 function SAMURAI_HTML_Perfil(&$MARCO, $id_sistema) {
105 //INICIALIZO OBJETOS GENERALES {{{
107 $tmp = new SAMURAI_DB();
108 $DB =& $tmp->connect();
109 //CREAR EL OBJETO SAMURAI_Perm
110 $SAMURAI_PERM = new SAMURAI_Perm ($_SESSION['usuario'], $id_sistema, $DB);
113 if (@$_POST['samurai_accion'] == 'abm' || @$_GET['samurai_perfiles'] == 'abm') {
116 elseif (@$_POST['samurai_accion'] == 'nuevo' || @$_GET['samurai_perfiles'] == 'nuevo') {
124 // listado -> Listado de los perfiles ya creados en el sistema.
125 // nuevo -> Pantalla de seleccion o de ingreso de un nuevo nombre.
126 // abm -> Formulario para la carga de la info del perfil.
129 if ($OPCION == 'listado') {
130 //VEO SI PUEDE ACCEDER{{{
131 $SAMURAI_PERM->chequear(SAMURAI_PERM_PERFIL_ALTA,SAMURAI_PERM_PERFIL_BAJA,SAMURAI_PERM_PERFIL_MODIF);
134 $aHref = '<a href="'.$_SERVER['PHP_SELF'].'?accion=##ACCION##&id_perfil=##NUEVO##&samurai_perfiles=abm">';
135 $aHrefModif = $aHref.'<img src="/MECON/images/general_modificar.gif" border="0" alt="Modificar Perfil"></a>';
136 $aHrefElim = $aHref.'<img src="/MECON/images/general_eliminar.gif" border="0" alt="Eliminar Perfil" ></a>';
138 //CREO LOS OBJETOS NECESARIOS {{{
139 $TABLA2 =& new MECON_HTML_Tabla ('cellspacing=0');
140 $TABLA =& new MECON_HTML_Tabla ('cellpadding=2');
141 $TABLA3 =& new MECON_HTML_Tabla ('cellspacing=0');
142 $SISTEMA =& new SAMURAI_Sistema($DB, $id_sistema);
144 //OBTENGO LA INFORMACION DE LA BASE {{{
145 $perfiles = SAMURAI_Perfil::getPerfiles($DB, null, $id_sistema);
147 //AGREGO LOS DATOS A LAS TABLAS {{{
148 $imagen = new MECON_HTML_Image('/MECON/images/vinetas_flecha_doble.gif');
149 $row = array ($imagen->toHtml().' <b>SISTEMA: '.$SISTEMA->getNombre().'</b>');
150 $TABLA3->addRow($row,'align=left');
152 //Agrego el link a nuevo
153 if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_ALTA)) {
154 $row = array ('<a href="'.$_SERVER['PHP_SELF'].'?samurai_perfiles=nuevo"><img src="/MECON/images/general_nuevo.gif" border="0">Ingresar Nuevo Perfil</a>');
155 $TABLA2->addRow($row,'align=right');
158 //Genero la cabecera de la tabla
159 $row = array ('Id','Descripción');
160 if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_TIPO)) {
163 if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_MODIF)) {
166 if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_BAJA)) {
170 $TABLA->addRow($row,'cabecera');
171 foreach ($perfiles as $perfil) {
172 $Modif = ereg_replace('##NUEVO##' , $perfil->getId(), $aHrefModif);
173 $Elim = ereg_replace('##NUEVO##' , $perfil->getId(), $aHrefElim );
174 $Modif = ereg_replace('##ACCION##', 'm' , $Modif );
175 $Elim = ereg_replace('##ACCION##', 'e' , $Elim );
176 $row = array ($perfil->getId(), $perfil->getDescripcion());
178 if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_TIPO)) {
179 $row[] = $perfil->getTipo();
181 if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_MODIF)) {
184 if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_BAJA)) {
187 $TABLA->addRow($row);
190 //AGREGO LA INFO AL MARCO {{{
191 $MARCO->addBodyContent($TABLA3);
192 $MARCO->addBodyContent($TABLA2->toHtml(1));
193 $MARCO->addBodyContent($TABLA);
198 elseif ($OPCION == 'nuevo') {
199 //VEO SI PUEDE ACCEDER{{{
200 $SAMURAI_PERM->chequear(SAMURAI_PERM_PERFIL_ALTA);
202 //CREO LOS OBJETO NECESARIOS {{{
203 $FORM =& new MECON_HTML_QuickForm ('samurai_perfiles','post',$_SERVER['PHP_SELF']);
204 $SISTEMA =& new SAMURAI_Sistema ($DB, $id_sistema);
206 //AGREGO LOS ELEMENTOS DEL FORM {{{
207 $FORM->addElement ('hidden', 'samurai_accion', 'nuevo');
208 $FORM->addElement ('header', 'cabecera' , 'Nuevo Perfil');
209 $FORM->addElement ('select', 'perfiles' , 'Perfiles', null, array('size' => '1'));
210 $FORM->addElement ('text' , 'filtro' , 'Filtrar' , array('size' => '50'));
211 $FORM->addElement ('text' , 'descripcion', 'Nombre' , array('size' => '50'));
212 $group[] = HTML_QuickForm::createElement('submit', 'continuar', 'Continuar');
213 $group[] = HTML_QuickForm::createElement('submit', 'filtrar' , 'Filtrar' );
214 $group[] = HTML_QuickForm::createElement('submit', 'cancelar' , 'Cancelar', array ('onClick' => 'javascript:window.location =\''.$_SERVER['PHP_SELF'].'\';return false;') );
215 $FORM->addGroup($group,'botones');
217 //RESTRINJO EL FORMATO DEL NOMBRE DEL PERFIL{{{
218 $FORM->addRule ('descripcion', 'El nombre del perfil solo puede contener letras y/o numeros.', 'regex','/^[a-zA-Z0-9 ]+$/');
220 // CARGO LA INFORMACION EN EL SELECT DE PERFILES {{{
221 $botones = $FORM->getSubmitValue('botones');
222 $perfiles =& $FORM->getElement('perfiles');
223 $descripcion =& $FORM->getElement('descripcion');
224 if (@$botones['cancelar']) {
225 header('Location: '.$_SERVER['PHP_SELF'].'/');
227 if (!isset($botones['filtrar'])) {
228 $PERFILES = SAMURAI_Perfil::getArrayPerfiles($DB);
230 elseif (@$botones['filtrar']) {
231 $filtro =& $FORM->getElement('filtro');
232 $PERFILES = SAMURAI_Perfil::getArrayPerfiles($DB, $filtro->getValue());
234 $perfiles->addOption('--', '--');
235 $perfiles->loadArray($PERFILES);
237 // VALIDO EL FORMULARIO {{{
238 if ($FORM->validate()) {
239 if (@$botones['continuar']) { //Ya selecciono un nombre para el perfil
241 $tmp = $perfiles->getSelected();
242 if ((!@$descripcion->getvalue() && $tmp['0'] == '--') || ($descripcion->getvalue() && $tmp['0'] != '--')) {
243 $res = new PEAR_Error("Debe seleccionar un perfil del combo o ingresar un nombre en la casilla correspondiente.<br>Solo una de las dos opciones.");
244 @$descripcion->setValue('');
246 elseif ($tmp['0'] != '--') {
247 //verificar que el sistema no tenga una asociacion con ese perfil
248 if (SAMURAI_Perfil::existeAsociacion($DB, $tmp['0'], $id_sistema)) {
249 $res = new PEAR_Error("El sistema ya tiene asociado el perfil seleccionado, modifique sus permisos desde la seccion perfiles.");
252 header('Location: '.$_SERVER['PHP_SELF'].'?samurai_perfiles=abm&id_perfil='.$tmp['0']);
255 elseif ($descripcion->getValue()) {
256 //Verificar que no exista un perfil con la misma descripcion
257 //Reduzco los blancos
258 $temp = $descripcion->getValue();
259 $tt = split (' ', $temp);
261 foreach ($tt as $t) {
268 if (SAMURAI_Perfil::existePerfil($DB, $rta)) {
269 $res = new PEAR_Error("Ya existe un perfil con ese nombre, seleccionelo del combo.<br> Recuerde que varios espacios se reduciran a uno solo (Ej: Agregar Usuario -> Agregar Usuario)");
272 $temp = ereg_replace(' ' , '%20', $rta); //Cambio los espacios por %20 para que no chille el netscape
273 header('Location: '.$_SERVER['PHP_SELF'].'?samurai_perfiles=abm&desc_perfil='.$temp);
276 if (PEAR::isError($res)) {
277 $TABLA = new MECON_HTML_Tabla ('cellspacing=0');
278 $row = array ('<font color="red"><b>'.$res->getMessage().'</b></font>');
279 $TABLA->addRow($row,'align=left');
284 //AGREGO LA INFO AL MARCO {{{
285 //AGREGO LOS DATOS A LAS TABLAS {{{
286 $TABLA3 = new MECON_HTML_Tabla ('cellspacing=0');
287 $imagen = new MECON_HTML_Image('/MECON/images/vinetas_flecha_doble.gif');
288 $row = array ($imagen->toHtml().' <b>SISTEMA: '.$SISTEMA->getNombre().'</b>');
289 $TABLA3->addRow($row,'align=left');
291 $MARCO->addBodyContent($TABLA3);
293 $MARCO->addBodyContent($TABLA);
295 $MARCO->addBodyContent($FORM);
300 elseif ($OPCION == 'abm') {
301 //VEO SI PUEDE ACCEDER{{{
302 $SAMURAI_PERM->chequear(SAMURAI_PERM_PERFIL_ALTA,SAMURAI_PERM_PERFIL_BAJA,SAMURAI_PERM_PERFIL_MODIF);
304 //CREO LOS OBJETO NECESARIOS {{{
305 if (@$_GET['id_perfil']) {
306 $id_perfil = $_GET['id_perfil'];
308 elseif (@$_POST['id_perfil']) {
309 $id_perfil = $_POST['id_perfil'];
314 //XXX OBTENGO LA ACCION {{{
315 switch (@$_REQUEST['accion']) {
317 $b_accion = 'Modificar';
321 $b_accion = 'Eliminar';
325 $b_accion = 'Grabar';
330 $FORM =& new MECON_HTML_QuickForm ('samurai_perfiles','post',$_SERVER['PHP_SELF']);
331 $SISTEMA =& new SAMURAI_Sistema ($DB, $id_sistema);
332 $PERFIL =& new SAMURAI_Perfil ($DB, $id_perfil, $id_sistema);
334 if ($PERFIL->getResponsable()) {
335 $responsable = $PERFIL->getResponsable();
338 $responsable = $_SESSION['usuario'];
341 if (!@$_GET['id_perfil']) {
342 if (@$_GET['desc_perfil']) {
343 $PERFIL->setDescripcion(@$_GET['desc_perfil']);
346 $PERFIL->setDescripcion(@$_POST['desc_ant']);
349 $descripcion = $PERFIL->getDescripcion();
351 //OBTENGO LOS PERMISOS DEL SISTEMA {{{
352 $ASOCIACIONES = $SISTEMA->getAsociaciones();
353 $PERMISOS = array ();
354 foreach ($ASOCIACIONES as $as) {
355 $clave = $as['id'].'##'.$as['obs'];
356 $texto = ($as['obs'] != '') ? $as['desc'].' - '.$as['obs']: $as['desc'];
357 $PERMISOS[$clave] = $texto;
360 //AGREGO LOS ELEMENTOS DEL FORM {{{
362 $FORM->addElement ('hidden', 'samurai_accion', 'abm');
363 $FORM->addElement ('header', 'cabecera', 'ABM Perfiles');
364 $FORM->addElement ('hidden', 'id_perfil', $id_perfil);
365 $FORM->addElement ('hidden', 'desc_ant' , $descripcion);
366 $FORM->addElement ('static', 'desc_perfil', 'Descripción', $descripcion);
367 $FORM->addElement ('select', 'permisos' , 'Permisos' , $PERMISOS, array('size' => '5', 'multiple' => 'true'));
368 if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_TIPO)) {
369 $FORM->addElement ('select', 'tipo_perfil', 'Tipo Perfil', array('E' => 'Externo', 'I' => 'Interno', 'D' => 'Dios'), array ('size' => '1'));
371 $FORM->addElement ('hidden', 'responsable', $responsable);
372 $FORM->addElement ('hidden', 'accion', $accion);
373 $group[] = HTML_QuickForm::createElement('submit', 'aceptar', $b_accion);
374 $group[] = HTML_QuickForm::createElement('submit', 'cancelar', 'Cancelar', array ('onClick' => 'javascript:window.location=\''.$_SERVER['PHP_SELF'].'\';return false;'));
375 $FORM->addGroup($group,'botones');
378 $ERROR = new MECON_HTML_Error('El sistema no posee permisos asociados.');
381 //AGREGO LAS REGLAS DE VALIDACION {{{
382 $FORM->addRule ('permisos', 'Se debe seleccionar al menos un permiso', 'required');
384 //CARGO LOS DATOS SI YA EXISTEN EN BASE {{{
385 if (isset($_GET['accion']) && $_GET['accion'] != '') {
387 $id_perfil =& $FORM->getElement ('id_perfil' );
388 $desc_perfil =& $FORM->getElement ('desc_perfil');
389 $permisos =& $FORM->getElement ('permisos' );
391 if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_TIPO)) {
392 $tipo_perfil =& $FORM->getElement ('tipo_perfil');
394 $responsable =& $FORM->getElement ('responsable');
395 $group =& $FORM->getElement ('botones' );
396 $group =& $group->getElements('aceptar' );
397 $aceptar =& $group[0];
399 $permisos->setSelected($PERFIL->getPermisos());
401 if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_TIPO)) {
402 $tipo_perfil->setSelected($PERFIL->getTipo());
405 if ($PERFIL->getResponsable() != '') {
406 $responsable->setValue($PERFIL->getResponsable());
409 //Modifico el valor del boton
410 $aceptar->setValue('Modificar');
412 //ELIMINACION -> modifico el valor del boton
413 if ($_GET['accion'] == 'e') {
414 $aceptar->setValue('Eliminar');
415 $aceptar->updateAttributes(array ('onClick' => 'javascript:if (confirm(\'¿Esta Seguro?\')) return true;return false;'));
420 //VALIDO EL FORMULARIO {{{
421 if ($FORM->validate()) {
422 // VEO SI SE CANCELO {{{
423 $botones = $FORM->getSubmitValue('botones');
424 if (@$botones['cancelar']) {
425 header('Location: '.$_SERVER['PHP_SELF']);
429 $samurai_accion =& $FORM->getElement('samurai_accion');
430 $samurai_accion->setValue('listado');
431 $id_perfil =& $FORM->getElement ('id_perfil' );
432 $desc_perfil =& $FORM->getElement ('desc_perfil');
433 $permisos =& $FORM->getElement ('permisos' );
435 if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_TIPO)) {
436 $tipo_perfil =& $FORM->getElement ('tipo_perfil');
437 $tipo_perfil_tmp = $tipo_perfil->getSelected();
439 $responsable =& $FORM->getElement ('responsable');
440 $group =& $FORM->getElement ('botones' );
441 $group =& $group->getElements('aceptar' );
442 $aceptar =& $group[0];
444 $PERFIL->setDescripcion($desc_perfil->_text );
445 $PERFIL->setResponsable($responsable->getValue());
446 $PERFIL->setPermisos ($permisos->getSelected()); //Le asigno al perfil los permisos seleccionados
448 if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_TIPO)) {
449 $PERFIL->setTipo($tipo_perfil_tmp['0']);
452 //Grabo y verifico si se produjo algun error
453 $res = $PERFIL->guardarDatos($aceptar->getValue());
455 if (PEAR::isError($res)) {
456 $ERROR = new MECON_HTML_Error($res->getMessage());
457 if ($aceptar->getValue() == 'Eliminar') {
463 header('Location: '.$_SERVER ['PHP_SELF'].'/');
469 //DIBUJO LA PAGINA {{{
470 $imagen = new MECON_HTML_Image('/MECON/images/vinetas_flecha_doble.gif');
471 $row = array ($imagen->toHtml().' <b>SISTEMA: '.$SISTEMA->getNombre().'</b>');
472 $TABLA3 = new MECON_HTML_Tabla ('cellspacing=0');
473 $TABLA3->addRow($row,'align=left');
475 $MARCO->addBodyContent($TABLA3);
477 $MARCO->addBodyContent($ERROR);
479 $MARCO->addBodyContent($FORM);