5.5 Case Study
5.5.1 Encoding
Por último, para devolver los datos a la petición AJAX, se codifica en JSON el resultado con la función json_encode y se envía mediante un echo.
8.5 Sesión de usuario y bloqueo de contenido a usuarios sin
sesión iniciada.
En este apartado se abarca primero el inicio de sesión por parte de un usuario desarrollador y después se muestra como se bloquea el contenido a partir de la sesión del usuario.
Lo primero para iniciar la sesión del usuario es necesario comprobar que los datos introducidos por el usuario son validos, para ellos consulta la base de datos y se comprueba que exista ese usuario. En caso de que la comprobación sea afirmativa, se inicia la sesión con método session_start() de PHP, además se guardan dos variables de sesión, una con el usuario de la sesión y otra con el estado.
Una vez la sesión está activa, en todas las páginas de la aplicación en las cuales solo puede tener acceso un usuario con sesión iniciada, se invoca al método genérico desarrollado llamado checkSession() al que se le pasan como parámetros el nombre la página que se esta intentando acceder para mostrarlo en el fichero de log y la ruta de la página a la cual redireccionar si la sesión no es valida en este caso la página de inicio de sesión.
El método desarrollado invoca al método de PHP session_start() para iniciar la sesión y se comprueba que exista la variable de sesión del usuario y que la variable de sesión estado tenga el valor “Autenticado”. Si las comprobaciones anteriores son validas se permite el acceso a la página y se carga el código HTML, en caso de no ser validas se redirige al usuario a la página de inicio de sesión.
8.6 Petición de argumentos al usuario
En este apartado se aborda uno de los temas más importantes y complejos de la aplicación, la petición de los argumentos a los usuarios de forma fácil e intuitiva al consumidor.
Para empezar, se ha preparado el sistema para que el desarrollador al insertar el servicio inserte todos los argumentos necesario para el consumo del mismo. Estos argumento se introducen de uno en uno y se guardan en la base de datos, estos se componen de los siguientes campos: nombre descriptivo, nombre del argumento, tipo y obligatoriedad.
/**
* Comprueba si el usuario actual tiene la sesion iniciada * En caso afirmativo -> carga la página y el header de usuario * En caso negativo -> redigue el al usuario al login
* @param string $page nombre de la página
* @param strign $loginPage ruta del la página de login */
function checkSession($page,$loginPage){ session_start();
write_log("Comprobando acceso a la página ".$page,"Info"); if(isset($_SESSION['user']) and $_SESSION['state'] == 'Autenticado'){
//Se permite el acceso
write_log("El usuario: ".$_SESSION['user']." tiene la sesión iniciada.","Info");
}
else{
// Usuario que no se ha logueado
write_log("ERROR: No hay sesión iniciada para el
usuario.","Error"); //Rediriguiendo al login header('Location: '.$loginPage); } }
Figura 8.1. Formulario de alta de argumentos.
Estos campos son necesarios para consumir el servicio y para formatear el formulario de petición de los valores al usuario. A continuación se detalla la funcionalidad de cada uno.
• Nombre descriptivo, este campo se utiliza posteriormente para mostrar al usuario en el momento de solicitar el valor del argumento, este campo tiene que identificar lo que se solicita en ese argumento. Este campo es necesario ya que en muchas ocasiones el nombre del argumento no es del todo identificativo y podría llevar al usuario final a una confusión.
• Nombre argumento, es el nombre real del argumento y se utiliza únicamente para formatear la petición al servicio internamente en el servidor.
• Tipo, está orientado a formatear el formulario que se muestra al usuario para solicitar los argumentos, en función del tipo se muestra un componente de formulario u otro. Por ejemplo, si el formato necesario es una fecha se indica que es de tipo date, de esta forma el sistema internamente formatea un input de tipo date para mostrárselo al usuario. El tipo se selecciona desde un desplegable con los tipos que el sistema está preparado para interpretar. El sistema soporta todos los siguiente tipos de inputs de HTML5:
o text o color o date o datetime-local o email o month o number o range o search o time o url o week
• Obligatorio, indica si el argumento es obligatorio para consumir el servicio. En caso de ser obligatorio, cuando el usuario insertar los valores de los argumento y consume el servicio se comprueba que este argumento existe antes de realizar la petición al servicio, en caso de no existir se solicita al usuario que complete dicho argumento para poder continuar.
Una vez el desarrollador ha guardado el servicio con todos sus argumento en la base de datos, un usuario final ya puede encontrar ese servicio y consumirlo. Cuando un usuario selecciona el servicio, el sistema realiza todas las operaciones internas necesarias para formatear el formulario de solicitud de argumentos al usuario, como se observa en la siguiente imagen.
Figura 8.2. Formulario usuario petición argumentos para consumir servicio.
Para formatear el formulario se utilizan los datos de la base de datos, el sistema solicita todos los argumentos para el servicio que el usuario va a consumir. Una vez se disponen de los argumentos se recorren con un bucle, dentro de este el sistema añade por cada argumento el nombre descriptivo al formulario, acompañado de un asterisco rojo en caso de que ese argumento tenga el campo obligatoriedad a verdadero.
Seguidamente, el sistema inserta el componente de formulario, en función del tipo que el desarrollador haya establecido para ese argumento, se inserta el input y se le asigna el tipo en la etiqueta type, para el caso del tipo map se inicializa un mapa de google maps. Además, en los inputs si el argumento es obligatorio se asigna la propiedad required de HTML, que obliga a rellenar ese campo para enviar el formulario.
En caso de que el tipo sea map, el sistema se encargar de generar e inicializar el mapa para el argumento correspondiente. A continuación, se muestra el código que carga la interfaz de usuario.
$.each(serviceData.arguments, function(i, arg){ i++; switch(arg.type){ case 'text': case 'color': case 'date': case 'datetime-local': case 'email': case 'month': case 'number': case 'range': case 'search': case 'time': case 'url': case 'week': $('#arguments-consume-tbody').append('<tr><td style="display:none;"><span id="name'+arg.name+'">' +arg.name+' </span></td>'+'<td class="align-middle"><span
id="description'+arg.name+'"><strong>'+arg.name_description+'</strong></span></t d>'+'<td class="text-primary text-center align-middle"><input
type="'+arg.type+'" class="form-control"'+' name="'+arg.name+'" id="'+arg.name+'" >'+'<span class="text-danger"
id="span'+arg.name+'Err"></span></td></tr>'); if(arg.required == "1"){
$("#arguments-form #description"+arg.name).append('<span class="text danger">*</span>');
$("#arguments-form #"+arg.name).prop("required", true); }
break; case "map":
$('#arguments-consume-tbody').append('<tr><td
style="display:none;"><span id="name'+arg.name+'">'+arg.name+'</span></td>'+' <td class="align-middle"><span id="description'+arg.name+'"> <strong>
'+arg.name_description+'</strong></span></td>'+'<td class="text-primary text- center align-middle"><div id="map-'+arg.name+'"></div>');
if(arg.required == "1"){
$("#arguments-form #description"+arg.name).append('<span class="text-danger">*</span>');
}
var location = new google.maps.LatLng(50.0875726, 14.4189987); var mapOptions = {
center: location,
zoom: 16,
panControl: false }
var map = new google.maps.Map($("#map-"+arg.name),mapOptions);
break;
} });
Una vez el usuario a completado y enviado el formulario, el sistema vuelve a realizar las comprobaciones de obligatoriedad en PHP y posteriormente consume el servicio web de la forma explicada en el siguiente punto de la implementación y devuelve el resultado al usuario.