NotasTecnicas/personalizaciones/modelo

Modificando el Modelo

Modificar una función ya existente en el modelo

Como primer paso debe recrearse la estructura del directorio, en el sector correspondiente a la personalización.

Por ejemplo, haremos una modificación en el trámite de solicitud de certificados de un alumno, imaginemos que debemos agregar un parámetro nuevo en la función certificados_habilitados (que se encuentra en certificados.php)

└── src
    ├── pers
    │   ├── ejemplo01
    │   │   └── modelo
    │   │       └── datos
    │   │           └── db
    │ 	│		└── certificados.php	
    │   └── ejemplo02
    └── siu
        └── modelo
            └── datos
                └── db
    	    	    └── certificados.php

Vamos a modificar la función certificados_habilitados agregando, por ejemplo, el parámetro 'alumno'. Observando el código original (siu/modelo/datos/db/certificados.php), la definición de la función se da de esta forma:

<?php
...
...

class certificados
{
	/**
	 * parametros: _ua, nro_inscripcion
	 * cache: no
	 * filas: n
	 */
	function certificados_habilitados($parametros)
	{
		$sql = "execute procedure sp_certif_habilit ({$parametros['_ua']}, {$parametros['nro_inscripcion']})";
...
...
}
?>

Lo primero que hay que tener en cuenta, es que en la personalización debe hacerse un extends en la clase original, de la siguiente forma:

<?php
...
class certificados extends \siu\modelo\datos\db\certificados
...
?>

Es decir, debe respetarse la ruta donde se encuentra la clase original, para que de esta forma reconozca luego a las funciones correspondientes.

Para agregar un parámetro, por ejemplo, el parámetro alumno a la función certificados_habilitados, debe agregarse este parámetro en el comentario obligatorio, de la siguiente forma:

class certificados extends \siu\modelo\datos\db\certificados
{
	/**
	 * parametros: _ua, nro_inscripcion, alumno
	 * cache: no
	 * filas: n
	 */
	function certificados_habilitados($parametros)
	{ ...
        }
...
...
}

Cada función debe contener un comentario el cual se compone de las siguientes directivas:

parametros: Obligatorio. Lista de parámetros que recibe la función separados por una coma. Ej. parametros: _ua, carrera, legajo, periodo_inscripcion.

no_quote: Lista de parámetros que NO serán envueltos entre comillas simples. Ej. no_quote: legajo, periodo_inscripcion.

cache: Obligatorio. Indica si se va a cachear el resultado devuelto por la función o no. Los posibles valores son no (no cachea), memoria (cachea en memoria durante la cantidad de tiempo definido en cache_expiracion) y sesion (cachea en la sesión del usuario, almacena los datos hasta que el usuario cierre sesión). Ej. cache: memoria.

cache_expiracion: Es la cantidad de segundos que duraran los datos almacenados en cache, si no se especifica los datos permanecerán almacenados la cantidad de segundos definidos en la constante CACHE_EXPIRATION_MAX de la clase src/siu/modelo/datos/catalogo.php (por defecto 5 minutos). Se aplica si se utiliza la directiva cache: memoria. Ej. cache_expiracion: 600.

filas: Obligatorio. Cantidad de filas devueltas por la función, puede tomar el valor n (cantidad indefinida de filas) o un numero entero (cantidad exacta de filas devueltas). Ej. filas: n.

Es importante generar el catálogo cuando se modifica alguna directiva del comentario o el nombre de la función. De la siguiente manera: En una terminal, ubicarse donde se encuentra el proyecto y correr el comando 'generar_catalogo'.

demo@g3w2-demo:~/proyectos/g3w2/bin$ ./guarani generar_catalogo

Este comando regenera el archivo _info_catalago.php y lo ubica en el sector correspondiente a la personalización.

Aclaración: el comando 'generar_catalogo' debe correrse cada vez que se modifica el nombre de una función o sus parámetros.

Otro punto a tener en cuenta, es que se deben personalizar todas las clases que acceden al método modificado. En el ejemplo presentado, al método certificados_habilitados se accede desde modelo/datos/transacciones/solicitud_certificados.php, en la función lista_certificados. De la siguiente manera:

<?php
namespace siu\modelo\transacciones;

use kernel\kernel;
use siu\guarani;
use siu\errores\error_guarani;
use siu\modelo\datos\catalogo;

class solicitud_certificados extends transaccion
{
...
...
	function lista_certificados()
	{
		$parametros['nro_inscripcion'] = kernel::persona()->get_nro_inscripcion();
        $datos = catalogo::consultar('certificados', 'certificados_habilitados', $parametros);
...
...
}
?>	

Para personalizarlo, primero se replica la estructura del directorio en la sección correspondiente a la personalización:

└── src
    ├── pers
    │   └── ejemplo01
    │       └── modelo
    │           └── datos
    │               ├── db
    │ 		    │	└── certificados.php	
    │   	    └── transacciones
    │			└── solicitud_certificados.php	
    └── siu
        └── modelo
               └── datos
                   ├── db
    		   │	└── certificados.php	
       	    	   └── transacciones
    			└── solicitud_certificados.php

Luego, se debe agregar el nuevo parámetro en la clase que accede al método:

<?php
namespace ejemplo01\modelo\transacciones;

use kernel\kernel;
use siu\guarani;
use siu\errores\error_guarani;
use siu\modelo\datos\catalogo;
use siu\modelo\transacciones\transaccion;

class solicitud_certificados extends \siu\modelo\transacciones\solicitud_certificados
{
	function lista_certificados()
	{
		$parametros['nro_inscripcion'] = kernel::persona()->get_nro_inscripcion();
		$parametros['alumno'] = kernel::persona()->get_id_alumno();
        $datos = catalogo::consultar('certificados', 'certificados_habilitados', $parametros);
	...
        ...
}
?>

Deben tenerse en cuenta las siguientes consideraciones:

1)La clase solicitud_certificados personalizada debe extender de la clase solicitud_certificados original:

class solicitud_certificados extends \siu\modelo\transacciones\solicitud_certificados

2) En la función que accede al método que modificamos, debe agregarse el nuevo parámetro, de la siguiente forma:

function lista_certificados()
	{
		$parametros['nro_inscripcion'] = kernel::persona()->get_nro_inscripcion();
		$parametros['alumno'] = kernel::persona()->get_id_alumno();
        $datos = catalogo::consultar('certificados', 'certificados_habilitados', $parametros);
... }

Agregar una función nueva

Para agregar una función nueva, el esquema es muy similar al de modificación. Deben tenerse en cuenta:

1) Recrear la estructura del directorio donde se quiere agregar la función.

2) Personalizar la clase del modelo donde vamos a poner la función nueva, la cual debe extender de la original.

Por ejemplo: siguiendo el caso anterior, deberíamos personalizar siu/modelo/datos/db/certificados.php, agregando una nueva función allí. No olvidarse de extender a la clase original (class certificados extends \siu\modelo\datos\db\certificados)

3) Definir la función incluyendo comentario obligatorio, con los parámetros, caché y filas.

Por ejemplo: dentro de certificados.php, crear una función nueva

4) Extender la clase que la va a usar

Por ejemplo: como en el caso anterior, que la accede la clase solititud_certificados (class solicitud_certificados extends \siu\modelo\transacciones\solicitud_certificados)

5) Regenerar el catálogo

Por ejemplo: demo@g3w2-demo:~/proyectos/g3w2/bin$ ./guarani generar_catalogo


<< Volver