Está en la página 1de 50

Personalizaciones

Guaraní 3 - Autogestión

Leonel Leonardis / Guaraní


guarani3@siu.edu.ar
CONCEPTOS BÁSICOS
G3W3
Está desarrollado en Chulupí

SIU-Chulupí es un framework de desarrollo web MVC.

Usado para el desarrollo de G3W3, y posteriormente de


Preinscripción.

Basado en frameworks como Zend (formularios) y Symfony


(plantillas, traducciones y comandos).
Chulupí
Objetivos de diseño

Performance
Flexibilidad
Fácil de personalizar
¿Chulupí tiene metadatos?

Algunos elementos (formularios, catálogos, etc) están definidos a


base de metadatos.

A diferencia con Toba no se almacenan metadatos en base de


datos (instancia), sino que se definen en PHP.
Comparación Toba - Chulupí

Pros Contras
- Performance
Ventajas de desarrollo:
- Escalabilidad
- Interfaces
Toba - Complejidad de las
- Persistencia
personalizaciones
- Tiempo
- Performance
- Escalabilidad El desarrollo es más
Chulupí - Flexibilidad para artesanal, por lo que
personalizaciones consume más tiempo.
Interconexión Toba - Chulupí

G3W3 reutiliza ciertos componentes de Gestión, como ser:


- Clases PHP (Núcleo)
- Reportes (Jasper)
- Personalizaciones
Interconexión Toba - Chulupí

Clases PHP (Núcleo):

<Path G3W3>/src/siu/modelo_g3 -> <Path Gestión>/php/nucleo

Reportes (Jasper):

<Path G3W3>/src/exportaciones_g3/jasper -> <Path Gestión>/exportaciones/jasper

Personalizaciones:

<Path G3W3>/src/pers_gestion -> <Path Gestión>/personalizacion


ARQUITECTURA
Patrón MVC

(3) Datos (4) Datos preparados

(2) Consultas y/o


actualizaciones

(1) Petición (5) Interfaz


Modelo

Contiene una representación de los datos que maneja el


sistema, su lógica de negocio, y sus mecanismos de persistencia.

Define las reglas de negocio.


Vista

También conocida como interfaz de usuario.

Compone la información que se envía al cliente y los


mecanismos de interacción con éste.

Recibe datos del modelo (a través del controlador) y los muestra


al usuario.
Controlador

Actúa como intermediario entre el Modelo y la Vista,


gestionando el flujo de información entre ellos y las
transformaciones para adaptar los datos a las necesidades de cada
uno.
Modelo Chulupí

Consiste de dos capas:

Catálogo: contiene las sentencias SQL a ejecutar. Es una capa


de bajo nivel.

Transacción: contiene acciones de más alto nivel.


Modelo Chulupí

+-- src
+-- siu
Catálogo
+-- modelo
+-- datos
+-- db
+-- transacciones Transacción
Catálogo

Son clases contenedoras de métodos con sentencias SQL.

Toda función de catálogo debe tener un bloque de comentarios


arriba (annotations).

Es posible guardar en caché los resultados obtenidos (APC o


Memcached).
Los parámetros:

/** ● Son todos obligatorios por


* parametros: carrera, legajo defecto.
* param_null: legajo ● Deben ser especificados en
* no_quote: legajo minúscula.
* cache: no | memoria | sesion
● param_null contiene los
* cache_expiracion: 300
* filas: 1 | n parámetros opcionales.
*/ ● Se ponen entre comillas de forma
automática, salvo los listados en
no_quote.
Catálogo

Cada vez que se crea un nueva función de catálogo o se


modifican las annotations, se debe ejecutar:
<Path G3W3>/bin/guarani generar_catalogo <ACC_ID>

Este comando compila los comentarios de los catálogos a


archivos PHP para su posterior consumo.
class personas {
/**
Catálogo
* parametros: nombre, apellido
* cache: no
*/
function insertar_persona($parametros) {
$sql = " INSERT INTO personas (nombre, apellido)
VALUES (
{$parametros['nombre']},
{$parametros['apellido']}
) ";
kernel::db()->ejecutar($sql);
}

/**
* cache: memoria
*/
function lista_personas() {
$sql = "SELECT id, nombre, apellido FROM personas";
return kernel::db()->consultar($sql);
}
}
Transacciones

Contiene acciones y directivas de alto nivel sobre el modelo en


cuestión.
Algunas convenciones:
• Los métodos de consulta comienzan con info__
• Los métodos que efectúan cambios en la DB llevan el
prefijo evt__
class carga_personas {

//---------------------------------------------
//-- INFO
//---------------------------------------------
function info__personas() {
return catalogo::consultar('personas',
'lista_personas', array());
}

//---------------------------------------------
//-- Eventos
//---------------------------------------------

function evt__agregar_persona() {
$parametros[‘nombre’] = ‘Jose’;
$parametros[apellido] = ‘Pérez’;
catalogo::consultar('personas', 'insertar_persona',
$parametros);
}
}
kernel::db()->abrir_transaccion();

try {
Implementa la lógica de
...
negocio de la operación.
kernel::db()->cerrar_transaccion();

} catch (error_kernel $e) {

kernel::db()->abortar_transaccion(); Puede agrupar varios


... accesos a datos en el marco
throw $e; de una transacción.
}
Controlador Chulupí

Tiene dos propósitos:

Definir acciones que se pueden realizar sobre la operación,


métodos que tienen el prefijo accion__

Intermediario entre la vista y el modelo.


Controlador Chulupí

class controlador extends controlador_g3w2


{
function modelo() {
// Instanciación del modelo (patrón singleton)
}
function vista() {
// Instanciación de la vista (patrón singleton)
}
function accion__guardar(…) {
// …
}
}
Vista Chulupí

Cada operación suele contar con:


- Un archivo template.twig que define el layout global de la
operación (twig es un motor de plantillas).
- Un archivo vista.php que maneja las configuraciones
globales de la vista.
- Uno o más pagelets.
Pagelets

Es la unidad básica de renderización de la vista. Una pantalla


puede estar compuesta por uno o varios pagelets.

Consta de:
- PHP: Prepara los datos para ser consumidos por la plantilla.
- Twig: Contenido HTML del pagelet.
- CSS: Estilos.
- JS: Comportamiento en el lado del cliente.
Twig

- Es un motor de plantillas tomado de Symfony.


- Pensado para que sea simple, sencillo y no mezclar código
PHP con la vista.
- Permite reaprovechar porciones de vistas.
- Los datos dinámicos son cargados por el archivo PHP del
pagelet.
Twig: Sintaxis Básica

{% if product.stock > 10 %}
<h1>Available</h1>
{% elseif product.stock > 0 %}
<h1>Only {{ product.stock }} left!</h1>
{% else %}
<h1>Sold-out!</h1>
{% endif %}

<h1>Members</h1>
<ul>
{% for user in users %}
<li>{{ user.username|e }}</li>
{% endfor %}
</ul>
Twig: Mensajes

Utilizamos un archivo de internacionalización, por defecto


src/siu/mensajes/mensajes.es.php, donde se mantiene un arreglo
asociativo de mensajes:

'saludo' => '¡Hola Mundo!',

Para mostrar un mensaje en un Twig:

{{ 'saludo' | trans }}
Twig: Estructuras de Control

{% if menu %}
<ul>
{% for item in menu %}
<li>
{{ item.descripcion }}
</li>
{% endfor %}
</ul>
{% else %}
<div class="mensaje">
{{ 'sin_menu' | trans }}
</div>
{% endif %}
Twig: Herencia

Implementa un mecanismo de herencia similar al de la POO.

Hay plantillas base con layouts predefinidos, con una estética


similar para toda la aplicación.

<div id='layout_dos_columnas' class="row-fluid">


<div id='columna_1' class="span3">
{% block columna_1 %}{% endblock %}
</div>
<div id='columna_2' class="span9">
{% block columna_2 %}{% endblock %}
</div>
</div>
dos_columnas.twig
Twig: Herencia

Implementa la herencia por medio de bloques, utilizando la


directiva extends.

{% extends "kernel/dos_columnas.twig" %}
{% block columna_1 %}
...
{% endblock %}
{% block columna_2 %}
...
{% endblock %}

default.twig de un pagelet
MECANISMO DE
PERSONALIZACIÓN
Personalizaciones

Se apoya fuertemente sobre el sistema de archivos y SVN.

Se debe mantener separado el código del SIU y de las


instituciones que desean aplicar una personalización.

No cuenta con metadatos en la DB, es un mecanismo mucho


más flexible que el utilizado por Toba.
Mecanismo

Los proyectos basados en Chulupí organizan su código de la


siguiente manera:

+-- bin
+-- instalacion
+-- src
+-- siu
+-- pers
+-- personalizacion01
+-- personalizacion02
Mecanismo

Para personalizar un archivo en particular se debe recrear el


árbol de directorios tal cual como está en la carpeta siu, en su
carpeta de la personalización.

Es muy importante copiar sólo los archivos que se quieren


personalizar y no otros, además de extender los métodos
mediante herencia en las clases PHP.
EJEMPLOS DE
PERSONALIZACIÓN
Activando Personalizaciones

1) Creamos una carpeta raíz para la personalización.


2) El nombre puede ser el del nodo de Colab o cualquier otro
que sea significativo.
3) En este caso, le pondremos unx.
Activando Personalizaciones

1) Activar las personalizaciones (instalacion/config.php):


array (
....
'usar_personalizaciones' => true,
),

2) Indicar que personalizacion utilizar:


array (
'des01' =>
array(
'personalizacion' => 'unx',
...
),
),
Ejemplo 1

Personalizar el logo del sistema (logo institucional).


Ejemplo 2

Personalizar el mensaje que aparece en la portada


(clave: texto_portada).
Ejemplo 3

Estilos Globales: Personalizar el color de fondo de


todo el sistema.
Ejemplo 4

Estilos pagelet: Personalizar el login del usuario.


Ejemplo 5

Personalizar Twig: Agregar un link a la


documentación de Guaraní en el pagelet de la
portada.
Nota: Los archivos Twig se deben copiar de manera
completa.
Ejemplo 6

Personalizar JS: En el pagelet del Login, validar


que en el campo usuario se puedan ingresar solo
letras.
Nota: Los archivos JS se deben copiar de manera
completa.
Ejemplo 7

Personalizar PHP: En la operación Horarios de


cursadas en el combo de Responsable Académica,
además de mostrar el nombre de las mismas
mostraremos el código.
Además se quiere agregar una caché de 6 minutos.
Ejemplo 8

Crear una nueva operación, la cual llamaremos Información


del alumno.

En dicha operación veremos:


● Todo lo visto en los casos anteriores.
● Manejo de múltiples personalizaciones.
● Interconexión entre Gestión y 3W, se utilizara una clase de
consulta de Gestión.
● Manejo de Namespaces.
¿PREGUNTAS?
¡MUCHAS GRACIAS!

También podría gustarte