NotasTecnicas/personalizaciones/modelo
Sumario
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)
├── 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:
...
...
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:
...
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:
{
/**
* 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'.
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:
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:
├── 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:
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:
- La clase solicitud_certificados personalizada debe extender de la clase solicitud_certificados original:
- class solicitud_certificados extends \siu\modelo\transacciones\solicitud_certificados
- 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:
- Recrear la estructura del directorio donde se quiere agregar la función.
- 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)
- 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
- 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)
- Regenerar el catálogo
- Por ejemplo: demo@g3w2-demo:~/proyectos/g3w2/bin$ ./guarani generar_catalogo