Guía 40 – Instalar desarrollo PHPRunner en múltiples instancias con personalización

Muchas de las consultas  que he tenido era a consecuencia de cómo desarrollar un aplicativo en PHPRunner e instalar el mismo para varias Oficinas o Empresas.
Ante estas situaciones, normalmente te preguntas:

  • ¿Se utiliza una única instancia de base de datos para todas las empresas?
  • ¿Cómo se personaliza la aplicación para que disponga de identificación (logo, nombre de la compañía, etc.) para cada empresa?.

Hay muchas más preguntas, pero estas suelen ser las «grandes» y difíciles de contestar.

Normalmente indico que si son datos de una única empresa, pero el análisis de los mismos es por departamento, almacén o cosa similar, se utilice una única base de datos y en todas las tablas se indique el departamento, almacén, etc., para gestionar autorizaciones de acuerdo a esa división de la información.
Tengo un ejemplo que utiliza este sistema,  es la aplicación de Múltiples Workflows, donde la clave de selección es el «Id» del proceso de gestión.

Ahora bien, si la misma aplicación es para empresas no relacionadas y nunca se va a analizar la información uniendo los datos de estas, lo más interesante es que sean distintas instancias de base de datos y también de aplicaciones (de cara a la personalización de cada empresa). Y en este caso, ¿ Cómo gestionamos el proyecto en PHPRunner?

  • ¿Tenemos versiones del proyecto distintos para cada una de las instancias?
    Esto significa que la evolución del producto va a ser diferente y por lo tanto las gestiones de cambios y evolución va a ser mucho más complejas.
  • ¿Tenemos una única versión del proyecto para todas las instancias/empresas?
    Esto significa generar versiones diferenciadas de aplicación con personalizaciones de cada una de las instancias/empresas. ¿Cómo se podría gestionar esto?

Objetivo

Diseñar una alternativa para disponer de un único proyecto de PHPRunner e instalar el mismo para varias empresas, personalizando la instancia de acuerdo a las características de la empresa a la que va a ofrecer servicio.

Solución Técnica

Realmente, no estoy inventando nada, lo que se desea obtener es lo que se suele estar disponible para cualquier desarrollo de PHP, es decir, que el aplicativo se personalice mediante un fichero de configuración.

En dicho fichero, además de los datos de conexión a la base de datos, también tiene que disponer de personalización de las características que son diferentes entre las compañías que utilizan el aplicativo.

Para dar respuesta a estos requisitos en la solución de PHPRunner, he definido:

  1.  Crear un fichero «config.php» para establecer  los datos de conexión a la base de datos.
  2. En el mismo fichero «config.php«, establecer en variables de sesión los valores de personalización (diferencias) de los valores que hay entre las empresas.
  3. Aislar las identificaciones de los usuarios de las distintas instancias (necesario por usar la misma cookie de sesión para todas las instancias de la aplicación)
  4. Por arquitectura de PHPRunner, hay personalizaciones que están sólo en HTML (por ejemplo, logo de la aplicación), deseamos cambiarlo sin tener que generar varias veces el producto. Para ello se utilizar un JavaScript «csi.js» , que nos va a permitir personalizar este tipo de información sin tener que generar desde PHPRunner.

Como visualmente no tiene prácticamente diferencias, no os facilito URL de pruebas, no obstante en el Kit que os dejo para instalar en vuestros PC, os dejo 2 bases de datos «business_1» y «business_2», para que confirméis que podéis hacer la personalización de la 2ª instancia sin volver a generar desde PHPRunner.

Codificación realizada

En el directorio «MyCode» va a estar todos los ficheros de personalización que podremos modificar externamente a la herramienta de PHPRunner.

Para que la funcionalidad del JavaScript «csi.js» esté disponible en todas las páginas he modificado la plantilla de la cabecera de todas las páginas para cargar este JavaScript.

En la definición del Logo, que PHPRunner sólo admite la introducción de HTML incluimos entre <span> o <div> el atributo «data-include» con la carga del fichero o la ejecución de un fichero en el server que va a sustituir esta parte de HTML. Esto se ha hecho para personalizar el icono del logo y el nombre de la empresa.

Aquí podéis apreciar el resultado de la ejecución del fichero «logo.php»

<?php
// Build HTML of the company logo || Construye HTML del Logo de la Emmpresa
require_once(__DIR__. "/../include/dbcommon.php");
$title = $_SESSION["app-title"]  ;
echo '<span style="background-color:white; color:black;font-size: 20px;"><img src="MyCode/logo.png" alt="'.$title.'" width="20"> '.$title.'</span>';
?>

Podríamos hacer todo tipo de cálculos con accesos o no a la información de la base de datos.

El fichero «config.php» tiene estos datos:

<?php 
// Database connection || Conexión a la base de datos
$host="localhost";
$user="root";
$pwd="password";
$port="";
$sys_dbname="business_1";  // Database

// Identification of the company || Identificación de la Empresa 
$business = 'business_1';

// Company customization variables || Variables de personalización de la Empresa
$_SESSION["app-title"] = "Business 1";  // Mandatory that they are session variables || Obligatorio que sean variables de sesión 
// All the variables that are required || Todas las variables que se requieram

// Control para verificar que se ha identificado en esta aplicación. Requerido por compartir identificación cookie de de sessión
// Control to verify that it has been identified in this application. Required for sharing cookie of session
if (isset($_SESSION['business'])) {
    if ($_SESSION['business'] <> $business ){
        $_SESSION['business'] = $business;
        //**********  Redirect to another page  ************
        header("Location: login.php?a=logout"); // User session is closed if not entry into this || Se cierra sesión de usuario si no se ha entrada en esta
        exit();
    }
} else {
    $_SESSION['business'] = $business; 
}

Como el ejemplo es muy simple (sólo tiene por objeto explicar una de las formas de personalizar el aplicativo de forma externa) tiene muy poquitas definiciones, pero podríamos utilizar este método para personalizaciones de código muy importantes.

Está dividido en varias partes:

  1. Las variables de configuración de la conexión a la base de datos.
  2. Identificación de la Compañía o instancia. Muy importante para asegurarnos los accesos correctos, ya que el aplicativo mantiene la misma Cookie de sesión para todas las instancias y si estas en comparten el mismo dominio (URL), podrían los usuarios pasar de una aplicación a otra, con al credencial de la primera aplicación. Este valor debe ser único en cada aplicación/instancia.
  3. Conjunto de variables de sesión que van a disponer de la personalización de esta instancia de aplicación.
  4. Código o lógica, que nos va a verificar que se ha hecho login en esta aplicación/instancia.

Para que se utilice este fichero de configuración tenemos que hacer esta definición. Como podéis apreciar, PHPRunner tiene la funcionalidad de poder describir varias conexiones a base de datos y generar el código con esa personalización. En este caso, vamos a utilizar esta funcionalidad, pero en vez de indicar los valores de la conexión le indicamos que ejecute el fichero «config.php«.

Espero que os guste. Seguramente hay otras formas de hacer esto mismo, pero esta me ha parecido simple y clara, para que se entienda por todos los desarrolladores.

Os dejo el ejemplo, con 2 bases de datos, para que puedas hace generar «tú» versión y duplicarla. Aunque está en versión PHPRunner 10.7, esto mismo funcionaría en cualquier versión 10.X

Para cualquier duda o necesidad, poneros en contacto contigo a través de mi email [email protected]

 

Adjuntos

Archivo Tamaño de archivo Descargas
zip PHPRunner 10.7 + base de datos de ejemplos 52 KB 252

Blog personal para facilitar soporte gratuito a usuarios de React y PHPRunner