// +----------------------------------------------------------------------+
//
// $Id$
//
/** \page page_samurai_html_perfil Perfil Embebido
\section page_samurai_html_perfil_descripcion Descripcion
Samurai provee de una funcion que permite embeber la funcionalidad de
perfiles dentro de aquellos sistemas que asi lo requieran.
Es completamente independiente del sistema en el cual trabaja y puede ser
agregado de cualquier manera (Seccion, Subseccion o Contenido) al sistema.
\note Es necesario para embeber los perfiles que se haya realizado un
session_start().
\section page_samurai_html_perfil_funcionamiento Funcionamiento
Es una copia de la seccion Perfiles dentro de SAMURAI. Se relizan las mismas
verificaciones, tiene las mismas condiciones y se utilizan los mismos
permisos que en este.
\subsection page_samurai_html_perfil_funcionamiento_validaciones Validaciones y Condiciones
- Los espacios entre las palabras que componen el nombre de un
perfil son eliminados. Ej: Agregar Usuario
se cambia por Agregar Usuario.
- Es obligatorio que los perfiles contengan al menos un permiso.
- No puede haber dos perfiles con los mismos permisos.
- No se pueden borrar perfiles que esten asociados a usuarios.
- No se pueden ingresar pefiles nuevos que ya esten cargados.
\section page_samurai_html_perfil_ejemplo Ejemplo
SAMURAI_HTML_Perfil agrega el contenido directamente en el marco que se este
utilizando.
Para embeber los perfiles hay que hacerlo de la siguiente manera
\code
include 'SAMURAI/HTML/Perfil.php';
SAMURAI_HTML_Perfil($MARCO, $ID_SISTEMA);
\endcode
\note $MARCO es el objeto MECON_Marco o el objeto HTML_DietMarco de
intranet.
$ID_SISTEMA es el identificador numerico en el cual se esta realizando la
accion de embeber.
\section page_samurai_html_perfil_permisos Pasos Finales
Para que los usuarios puedan acceder a los perfiles embebidos es necesario
que en el sistema en el cual se este embebiendo se agregen los permisos que
utiliza la seccion Perfiles (enumerados mas abajo), y que estos mediante
perfiles se asignen a usuarios.
Esto implica que por lo menos un usuario tendra que ser cargado desde
SAMURAI para que este tenga acceso a la zona embebida.
Permisos
- perfil alta
- perfil baja
- perfil modificacion
- perfil tipo
*/
//REQUIRE ONCE {{{
require_once 'SAMURAI/DB.php';
require_once 'SAMURAI/Perm.php';
require_once 'SAMURAI/constantes.php';
require_once 'SAMURAI/Perfil.php';
require_once 'SAMURAI/Sistema.php';
require_once 'SAMURAI/Permiso.php';
require_once 'MECON/HTML/Tabla.php';
require_once 'MECON/HTML/QuickForm.php';
require_once 'MECON/HTML/Error.php';
require_once 'MECON/HTML/Image.php';
require_once 'PEAR.php';
// }}}
/**
* Funcion que se encarga agregar los componentes necesarios al sistema para
* que se pueda realizar un abm de perfiles.
@see \ref page_samurai_html_perfil
*
* @param MECON_Marco &$MARCO Referencia al objeto MECON_Marco que se este utilizando en la pagina
* @param int $id_sistema Identificador del sistema en el cual se esta trabajando
*
* @return void
*/
//SAMURAI_HTML_Perfil {{{
function SAMURAI_HTML_Perfil(&$MARCO, $id_sistema) {
//INICIALIZO OBJETOS GENERALES {{{
//REALIZO CONEXION
$tmp = new SAMURAI_DB();
$DB =& $tmp->connect();
//CREAR EL OBJETO SAMURAI_Perm
$SAMURAI_PERM = new SAMURAI_Perm ($_SESSION['usuario'], $id_sistema, $DB);
//}}}
if (@$_POST['samurai_accion'] == 'abm' || @$_GET['samurai_perfiles'] == 'abm') {
$OPCION = 'abm';
}
elseif (@$_POST['samurai_accion'] == 'nuevo' || @$_GET['samurai_perfiles'] == 'nuevo') {
$OPCION = 'nuevo';
}
else {
$OPCION = 'listado';
}
//POSIBLES ACCIONES
// listado -> Listado de los perfiles ya creados en el sistema.
// nuevo -> Pantalla de seleccion o de ingreso de un nuevo nombre.
// abm -> Formulario para la carga de la info del perfil.
//LISTADO {{{
if ($OPCION == 'listado') {
//VEO SI PUEDE ACCEDER{{{
$SAMURAI_PERM->chequear(SAMURAI_PERM_PERFIL_ALTA,SAMURAI_PERM_PERFIL_BAJA,SAMURAI_PERM_PERFIL_MODIF);
//}}}
//LINKS {{{
$aHref = '';
$aHrefModif = $aHref.'';
$aHrefElim = $aHref.'';
// }}}
//CREO LOS OBJETOS NECESARIOS {{{
$TABLA2 =& new MECON_HTML_Tabla ('cellspacing=0');
$TABLA =& new MECON_HTML_Tabla ('cellpadding=2');
$TABLA3 =& new MECON_HTML_Tabla ('cellspacing=0');
$SISTEMA =& new SAMURAI_Sistema($DB, $id_sistema);
// }}}
//OBTENGO LA INFORMACION DE LA BASE {{{
$perfiles = SAMURAI_Perfil::getPerfiles($DB, null, $id_sistema);
// }}}
//AGREGO LOS DATOS A LAS TABLAS {{{
$imagen = new MECON_HTML_Image('/MECON/images/vinetas_flecha_doble.gif');
$row = array ($imagen->toHtml().' SISTEMA: '.$SISTEMA->getNombre().'');
$TABLA3->addRow($row,'align=left');
//Agrego el link a nuevo
if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_ALTA)) {
$row = array ('Ingresar Nuevo Perfil');
$TABLA2->addRow($row,'align=right');
}
//Genero la cabecera de la tabla
$row = array ('Id','Descripcion');
if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_TIPO)) {
$row[] = 'Tipo';
}
if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_MODIF)) {
$row[] = 'Modif.';
}
if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_BAJA)) {
$row[] = 'Elim.';
}
$TABLA->addRow($row,'cabecera');
foreach ($perfiles as $perfil) {
$Modif = ereg_replace('##NUEVO##' , $perfil->getId(), $aHrefModif);
$Elim = ereg_replace('##NUEVO##' , $perfil->getId(), $aHrefElim );
$Modif = ereg_replace('##ACCION##', 'm' , $Modif );
$Elim = ereg_replace('##ACCION##', 'e' , $Elim );
$row = array ($perfil->getId(), $perfil->getDescripcion());
if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_TIPO)) {
$row[] = $perfil->getTipo();
}
if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_MODIF)) {
$row[] = $Modif;
}
if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_BAJA)) {
$row[] = $Elim;
}
$TABLA->addRow($row);
}
// }}}
//AGREGO LA INFO AL MARCO {{{
$MARCO->addBodyContent($TABLA3);
$MARCO->addBodyContent($TABLA2->toHtml(1));
$MARCO->addBodyContent($TABLA);
//}}}
}
//}}}
//NUEVO {{{
elseif ($OPCION == 'nuevo') {
//VEO SI PUEDE ACCEDER{{{
$SAMURAI_PERM->chequear(SAMURAI_PERM_PERFIL_ALTA);
//}}}
//CREO LOS OBJETO NECESARIOS {{{
$FORM =& new MECON_HTML_QuickForm ('samurai_perfiles','post',$_SERVER['PHP_SELF']);
$SISTEMA =& new SAMURAI_Sistema ($DB, $id_sistema);
// }}}
//AGREGO LOS ELEMENTOS DEL FORM {{{
$FORM->addElement ('hidden', 'samurai_accion', 'nuevo');
$FORM->addElement ('header', 'cabecera' , 'Nuevo Perfil');
$FORM->addElement ('select', 'perfiles' , 'Perfiles', null, array('size' => '1'));
$FORM->addElement ('text' , 'filtro' , 'Filtrar' , array('size' => '50'));
$FORM->addElement ('text' , 'descripcion', 'Nombre' , array('size' => '50'));
$group[] = HTML_QuickForm::createElement('submit', 'continuar', 'Continuar');
$group[] = HTML_QuickForm::createElement('submit', 'filtrar' , 'Filtrar' );
$group[] = HTML_QuickForm::createElement('submit', 'cancelar' , 'Cancelar', array ('onClick' => 'javascript:window.location =\''.$_SERVER['PHP_SELF'].'\';return false;') );
$FORM->addGroup($group,'botones');
// }}}
//RESTRINJO EL FORMATO DEL NOMBRE DEL PERFIL{{{
$FORM->addRule ('descripcion', 'El nombre del perfil solo puede contener letras y/o numeros.', 'regex','/^[a-zA-Z0-9 ]+$/');
// }}}
// CARGO LA INFORMACION EN EL SELECT DE PERFILES {{{
$botones = $FORM->getSubmitValue('botones');
$perfiles =& $FORM->getElement('perfiles');
$descripcion =& $FORM->getElement('descripcion');
if (@$botones['cancelar']) {
header('Location: '.$_SERVER['PHP_SELF'].'/');
}
if (!isset($botones['filtrar'])) {
$PERFILES = SAMURAI_Perfil::getArrayPerfiles($DB);
}
elseif (@$botones['filtrar']) {
$filtro =& $FORM->getElement('filtro');
$PERFILES = SAMURAI_Perfil::getArrayPerfiles($DB, $filtro->getValue());
}
$perfiles->addOption('--', '--');
$perfiles->loadArray($PERFILES);
// }}}
// VALIDO EL FORMULARIO {{{
if ($FORM->validate()) {
if (@$botones['continuar']) { //Ya selecciono un nombre para el perfil
$res = '';
$tmp = $perfiles->getSelected();
if ((!@$descripcion->getvalue() && $tmp['0'] == '--') || ($descripcion->getvalue() && $tmp['0'] != '--')) {
$res = new PEAR_Error("Debe seleccionar un perfil del combo o ingresar un nombre en la casilla correspondiente.
Solo una de las dos opciones.");
@$descripcion->setValue('');
}
elseif ($tmp['0'] != '--') {
//verificar que el sistema no tenga una asociacion con ese perfil
if (SAMURAI_Perfil::existeAsociacion($DB, $tmp['0'], $id_sistema)) {
$res = new PEAR_Error("El sistema ya tiene asociado el perfil seleccionado,
modifique sus permisos desde la seccion perfiles.");
}
else {
header('Location: '.$_SERVER['PHP_SELF'].'?samurai_perfiles=abm&id_perfil='.$tmp['0']);
}
}
elseif ($descripcion->getValue()) {
//Verificar que no exista un perfil con la misma descripcion
//Reduzco los blancos
$temp = $descripcion->getValue();
$tt = split (' ', $temp);
$rta = '';
foreach ($tt as $t) {
if ($t != '') {
$rta.= $t.' ';
}
}
$rta = rtrim($rta);
//
if (SAMURAI_Perfil::existePerfil($DB, $rta)) {
$res = new PEAR_Error("Ya existe un perfil con ese nombre, seleccionelo del combo.
Recuerde que varios espacios se reduciran a uno solo
(Ej: Agregar Usuario -> Agregar Usuario)");
}
else {
$temp = ereg_replace(' ' , '%20', $rta); //Cambio los espacios por %20 para que no chille el netscape
header('Location: '.$_SERVER['PHP_SELF'].'?samurai_perfiles=abm&desc_perfil='.$temp);
}
}
if (PEAR::isError($res)) {
$TABLA = new MECON_HTML_Tabla ('cellspacing=0');
$row = array (''.$res->getMessage().'');
$TABLA->addRow($row,'align=left');
}
}
}
// }}}
//AGREGO LA INFO AL MARCO {{{
//AGREGO LOS DATOS A LAS TABLAS {{{
$TABLA3 = new MECON_HTML_Tabla ('cellspacing=0');
$imagen = new MECON_HTML_Image('/MECON/images/vinetas_flecha_doble.gif');
$row = array ($imagen->toHtml().' SISTEMA: '.$SISTEMA->getNombre().'');
$TABLA3->addRow($row,'align=left');
//}}}
$MARCO->addBodyContent($TABLA3);
if (isset($TABLA)) {
$MARCO->addBodyContent($TABLA);
}
$MARCO->addBodyContent($FORM);
//}}}
}
//}}}
//ABM {{{
elseif ($OPCION == 'abm') {
//VEO SI PUEDE ACCEDER{{{
$SAMURAI_PERM->chequear(SAMURAI_PERM_PERFIL_ALTA,SAMURAI_PERM_PERFIL_BAJA,SAMURAI_PERM_PERFIL_MODIF);
//}}}
//CREO LOS OBJETO NECESARIOS {{{
if (@$_GET['id_perfil']) {
$id_perfil = $_GET['id_perfil'];
}
elseif (@$_POST['id_perfil']) {
$id_perfil = $_POST['id_perfil'];
}
else {
$id_perfil = null;
}
$FORM =& new MECON_HTML_QuickForm ('samurai_perfiles','post',$_SERVER['PHP_SELF']);
$SISTEMA =& new SAMURAI_Sistema ($DB, $id_sistema);
$PERFIL =& new SAMURAI_Perfil ($DB, $id_perfil, $id_sistema);
if ($PERFIL->getResponsable()) {
$responsable = $PERFIL->getResponsable();
}
else {
$responsable = $_SESSION['usuario'];
}
if (!@$_GET['id_perfil']) {
if (@$_GET['desc_perfil']) {
$PERFIL->setDescripcion(@$_GET['desc_perfil']);
}
else {
$PERFIL->setDescripcion(@$_POST['desc_ant']);
}
}
$descripcion = $PERFIL->getDescripcion();
// }}}
//OBTENGO LOS PERMISOS DEL SISTEMA {{{
$ASOCIACIONES = $SISTEMA->getAsociaciones();
$PERMISOS = array ();
foreach ($ASOCIACIONES as $as) {
$clave = $as['id'].'##'.$as['obs'];
$texto = ($as['obs'] != '') ? $as['desc'].' - '.$as['obs']: $as['desc'];
$PERMISOS[$clave] = $texto;
}
// }}}
//AGREGO LOS ELEMENTOS DEL FORM {{{
if (@$PERMISOS) {
$FORM->addElement ('hidden', 'samurai_accion', 'abm');
$FORM->addElement ('header', 'cabecera', 'ABM Perfiles');
$FORM->addElement ('hidden', 'id_perfil', $id_perfil);
$FORM->addElement ('hidden', 'desc_ant' , $descripcion);
$FORM->addElement ('static', 'desc_perfil', 'Descripcion', $descripcion);
$FORM->addElement ('select', 'permisos' , 'Permisos' , $PERMISOS, array('size' => '5', 'multiple' => 'true'));
if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_TIPO)) {
$FORM->addElement ('select', 'tipo_perfil', 'Tipo Perfil', array('E' => 'Externo', 'I' => 'Interno', 'D' => 'Dios'), array ('size' => '1'));
}
$FORM->addElement ('hidden', 'responsable', $responsable);
$group[] = HTML_QuickForm::createElement('submit', 'aceptar' , 'Grabar');
$group[] = HTML_QuickForm::createElement('submit', 'cancelar', 'Cancelar', array ('onClick' => 'javascript:window.location=\''.$_SERVER['PHP_SELF'].'\';return false;'));
$FORM->addGroup($group,'botones');
}
else {
$ERROR = new MECON_HTML_Error('El sistema no posee permisos asociados.');
}
// }}}
//AGREGO LAS REGLAS DE VALIDACION {{{
$FORM->addRule ('permisos', 'Se debe seleccionar al menos un permiso', 'required');
// }}}
//CARGO LOS DATOS SI YA EXISTEN EN BASE {{{
if (isset($_GET['accion']) && $_GET['accion'] != '') {
//MODIFICACION
$id_perfil =& $FORM->getElement ('id_perfil' );
$desc_perfil =& $FORM->getElement ('desc_perfil');
$permisos =& $FORM->getElement ('permisos' );
if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_TIPO)) {
$tipo_perfil =& $FORM->getElement ('tipo_perfil');
}
$responsable =& $FORM->getElement ('responsable');
$group =& $FORM->getElement ('botones' );
$group =& $group->getElements('aceptar' );
$aceptar =& $group[0];
$permisos->setSelected($PERFIL->getPermisos());
if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_TIPO)) {
$tipo_perfil->setSelected($PERFIL->getTipo());
}
if ($PERFIL->getResponsable() != '') {
$responsable->setValue($PERFIL->getResponsable());
}
//Modifico el valor del boton
$aceptar->setValue('Modificar');
//ELIMINACION -> modifico el valor del boton
if ($_GET['accion'] == 'e') {
$aceptar->setValue('Eliminar');
$aceptar->updateAttributes(array ('onClick' => 'javascript:if (confirm(\'żEsta Seguro?\')) return true;return false;'));
$FORM->freeze();
}
}
// }}}
//VALIDO EL FORMULARIO {{{
if ($FORM->validate()) {
// VEO SI SE CANCELO {{{
$botones = $FORM->getSubmitValue('botones');
if (@$botones['cancelar']) {
header('Location: '.$_SERVER['PHP_SELF']);
}
// }}}
else {
$samurai_accion =& $FORM->getElement('samurai_accion');
$samurai_accion->setValue('listado');
$id_perfil =& $FORM->getElement ('id_perfil' );
$desc_perfil =& $FORM->getElement ('desc_perfil');
$permisos =& $FORM->getElement ('permisos' );
if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_TIPO)) {
$tipo_perfil =& $FORM->getElement ('tipo_perfil');
$tipo_perfil_tmp = $tipo_perfil->getSelected();
}
$responsable =& $FORM->getElement ('responsable');
$group =& $FORM->getElement ('botones' );
$group =& $group->getElements('aceptar' );
$aceptar =& $group[0];
$PERFIL->setDescripcion($desc_perfil->_text );
$PERFIL->setResponsable($responsable->getValue());
$PERFIL->setPermisos ($permisos->getSelected()); //Le asigno al perfil los permisos seleccionados
if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_TIPO)) {
$PERFIL->setTipo($tipo_perfil_tmp['0']);
}
//Grabo y verifico si se produjo algun error
$res = $PERFIL->guardarDatos($aceptar->getValue());
if (PEAR::isError($res)) {
$ERROR = new MECON_HTML_Error($res->getMessage());
if ($aceptar->getValue() == 'Eliminar') {
$FORM->freeze();
}
}
else {
$FORM->freeze();
header('Location: '.$_SERVER ['PHP_SELF'].'/');
exit;
}
}
}
// }}}
//DIBUJO LA PAGINA {{{
$imagen = new MECON_HTML_Image('/MECON/images/vinetas_flecha_doble.gif');
$row = array ($imagen->toHtml().' SISTEMA: '.$SISTEMA->getNombre().'');
$TABLA3 = new MECON_HTML_Tabla ('cellspacing=0');
$TABLA3->addRow($row,'align=left');
$MARCO->addBodyContent($TABLA3);
if (isset($ERROR)) {
$MARCO->addBodyContent($ERROR);
}
$MARCO->addBodyContent($FORM);
//}}}
}
//}}}
}
//}}}
?>