Plataforma de código abierto para gobierno electrónico.Administración electrónica.
        Open Source Plattform for e-government.

"Beethoven era un buen compositor porque utilizaba ideas nuevas en combinación con ideas antiguas.
Nadie, ni siquiera Beethoven podría inventar la música desde cero. Es igual con la informática" (Richard Stallman)


4.6 Sesiones de Usuario


Introducción



Open Populi Application Framework utiliza un mecanismo propio para el manejo de sesiones. Este mecanismo es capaz de almacenar datos en forma persistente en base de datos. Fue pensado para resolver los problemas que vienen aparejados con el uso típico de sesiones de PHP con persistencia a través de archivos, tales como:

  • Problemas de seguridad que puede implicar usar un servidor compartido, donde otros usuarios podrían acceder a archivos de sesión de una aplicación propia.
  • En el caso de que se utilice un raid de servidores con balance de carga, no se garantiza de que una petición de una sesión existente, sea atendida por el servidor que tenia a cargo el mantenimiento del estado de la sesión en la petición anterior.
  • Se torna una difícil tarea para un administrador de websites realizar consultas del estilo, ¿Cuantos usuarios están actualmente navegando en el website? O ¿ Cuantos usuarios están logueados actualmente?
A continuación mostraremos la estructura necesaria en base de datos y luego detallaremos los métodos para acceder y manipular el objeto sesión.

Estructura





Métodos



Set

set($key, $value)
Setea un valor para la clave en la sesión
  • Ejemplo: Asignando un valor a la sesión.
//Obtenemos la instancia del contexto
$context = OP_Context::getInstance();
//Asignamos el theme blueSky
$context->getSession()->set('theme', 'blueSky');

Get

get($key)
Devuelve el valor asociado a la clave almacenado en la sesión.

  • Ejemplo: Obteniendo el valor desde la sesión.

//Obtenemos el theme actual.
$theme = $context->getSession()->get('theme');



Remove

remove($key)
Remueve el contenido asociado a la clave de la sesión.

  • Ejemplo: Obteniendo el valor desde la sesión.

//Limpiamos el valor de theme
$context->getSession()->remove('theme');



Accediendo a la sesión del usuario



La clase que maneja los datos del usuario es OP_User, que mediante el método getInstance(), brinda acceso a la instancia correspondiente. Esta clase cuenta con un contenedor de parámetros que permite guardar cualquier atributo del usuario en él( cadenas de texto, arrays asociativos, etc.), permaneciendo esta información disponible para otras peticiones, hasta que caduque o termine la sesión del usuario. Siempre hay una instancia de OP_User disponible se haya validado o no el usuario.

  • Ejemplo de acceso a la instancia del OP_User

class miModuloActions extends OP_Controller{

public function deEjemplo1(){
$op_user = OP_User::getInstance();
$data = $this->context->getRequest()->getAllParameters('POST');
$op_user->setParameter('user_name', $data['user_name']);
$op_user->setParameter('first_name', $data['first_name']);
$op_user->setParameter('last_name', $data['last_name']);
}

public function aEjemplo2(){
$op_user = OP_User::getInstance();

//Obteniendo información de la sesión del usuario
$user_name = $op_user->getParameter('user_name');
}
}

?>


Uso de mensajes Flash



Mediante el método flash() del controlador, se asignan valores a un buffer disponible en la sesión. El propósito de este buffer, es almacenar información que al obtenerse una vez, no tiene mas sentido permanezca disponible en la sesión del usuario. Un ejemplo de esto es cuando se quiere mostrar un mensaje de confirmación a un usuario, luego de realizar una actualización de datos vía formulario. Dado que el flujo de navegación es redirigido a otra página, la forma de mostrarle al usuario esta confirmación, es almacenándola en el buffer de sesión. El cual es usado, en este caso, para enviar mensajes a la vista.

  • Ejemplo de Uso de mensajes Flash

//Seteamos el mensaje en el buffer.
class newActions extends OP_Controller
{
public function delete(){
$news = new News();
$id = $this->context->getRequest()->getParameter('id_new', 'GET');
if(isset($id)){
$posts->delete($id);
$this->flash('notice','La operación se realizo correctamente.');
}
$this->forward();
}
}


  • miPlataforma.tpl.php

<html>
<head>

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">

<title><?php echo includeTitle($op_response) ?></title>

<?php echo includeCss($op_response) ?>
<?php echo includeJs($op_response) ?>

<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
</head>
<body>


//...

// Luego en el template de la plataforma, si existe un mensaje en el buffer, lo obtenemos y mostramos.

<?php if($op_context->getSession()->isset_flash('error')): ?>
<font color="red"><?php echo $op_context->getSession()->flash('error') ?></font>
<?php elseif($op_context->getSession()->isset_flash('notice')): ?>
<font color="green"><?php echo $op_context->getSession()->flash('notice') ?></font>
<?php endif; ?>

//...




««« Routing | Helpers »»»



Indice del manual