Relaciones simples
Preweb-Helper es capaz de manejar automáticamente relaciones simples de tipo 1..N y con un poco de ayuda relaciones 1..N mas complejas, como relaciones por categorías, N..M o N..1
Veremos a continuación un ejemplo con 3 relaciones 1..N
Supongamos el típico ejemplo de la biblioteca. Tenemos 3
tablas, ml_autor, ml_libro y ml_editorial.
Como
requerimiento tenemos que las editoriales estan agrupadas en categorias
de si mismas, ya que hay casos de editoriales grandes que tienen sellos
distintos para diferentes tipos de publicaciones, como la editorial
Destino, que es una división de Editorial Planeta para libros
fantásticos y de ciencia ficción, y además tiene una subdivisión
llamada Destino Joven con los libros para mas jóvenes.
Luego, cada libro está relacionado con un autor (relación 1..N simple) y con una editorial (relación 1..N ordenada por categorías)
Relaciones Simples 1..N Automáticas
Preweb-Helper reconocerá automáticamente una relación y construirá el <select> correspondiente en los formularios si el nombre del campo tiene el siguiente formato: id_<nombre_de_la_tabla_foránea>
Se asumirá entonces que se debe mostrar un select con el valor "nombre" de todos los registros de la tabla indicada y el valor a guardar en la tabla local será el campo "id" de la foránea.
Podemos cambiar estos y otros parámetros por defecto seteando valores por comentarios
Configurando entonces nuestra tabla de libros de una forma
similar a la siguiente:
CREATE TABLE mlib_libro (
id bigint(20) NOT NULL auto_increment,
titulo varchar(50) NOT NULL character set utf8,
cant_paginas int NOT NULL,
id_ml_autor bigint NOT NULL,
editorial bigint NOT NULL,
PRIMARY KEY (`id`)
)
y solo poniendo el nombre del campo indicando que es una
relación bastará para que el helper, tanto modelo como vista, sepan
inteprearlo. Dado que en este caso se cumplen las configuraciones por
defecto (El texto en la tabla foránea es el campo "nombre", el id es el
campo "id" y no se muestra un mensaje vacio)
Si queremos agregar un mensaje del tipo "-- Elija Autor --" debemos agregar en el template algo como "[{345|Elija Autor}]" y definir la tabla de la siguiente manera
CREATE TABLE mlib_libro (
id bigint(20) NOT NULL auto_increment,
titulo varchar(50) NOT NULL character set utf8,
cant_paginas int NOT NULL,
id_ml_autor bigint NOT NULL
COMMENT 'empty:=-- [{345|}] --',
editorial bigint NOT NULL,
PRIMARY KEY (`id`)
)
y quedaría algo asi:
Dado que la opción por comentario "Empty" genera un option con value =
"" y el campo fue definido como
NOT NULL si no es seleccionado un autor y se deja la
opción "-- Elija Autor--" al aceptar, producirá un error de validación
del tipo "Este campo es obligatorio"
Relaciones 1..N por categorias
En nuestro ejemplo el módulo de editoriales es un módulo autocategorizado, es decir que los propios elementos pueden ser padres o hijos en la estructura, similar al módulo de contenidos. Evidentemente esto significa que dicho módulo tiene una estructura jerárquica y, además que tiene una relación consigo mismo.
Otros tipos de relaciones que no sean simples y directas no son detectadas por helper y deben ser indicadas desde otro lugar.
En este caso, para armar un selector ordenado por categorías debemos indicarlo mediante comentarios. Existe un tipo de campo llamado CatRelation que permite armar este tipo de selectores.
Por lo tanto debemos indicar en el comment "type:=CatRelation;" para decirle al helper que debe utilizar ese tipo de dato ignorando lo que hay en el Type de la tabla.
Luego, este campo necesita los siguientes parámetros
- tableRel: Es la tabla con la que nos vamos a relacionar. En nuestro ejemplo es "ml_editorial". Este campo es obligatorio suministrarlo
- idparentname: Es el nombre del campo donde se guarda la información de padre en la tabla foránea, por defecto es "padre" y en nuestro ejemplo también.
- self: Esta variable indica si debe aparecer el id actual en la jerarquía. Esto es para los casos de autocategorias en donde no queremos que un elemento se tenga como padre a si mismo. En el caso de la tabla ml_editorial en su relacion consigo mismo deberia ser false. En el caso de la tabla ml_libro en su relación con ml_editorial deberia ser true puesto que si ponemos false y estamos viendo el libro de id 5 nos quitará del selector a la editorial de id 5, que claramente no tiene nada que ver. Por defecto es false
- maxdepth: Esta campo es opcional. Es la profundidad maxima del arbol de jerarquias que se mostrara, un valor de 1 por ejemplo solo mostrara los padres absolutos.
- show:="nombre";
- idname:="id";
- empty:= "";
Por lo que no necesitaremos setearlos dado que son los valores por defecto. Finalmente nuestra tabla quedará:
CREATE TABLE mlib_libro (
id bigint(20) NOT NULL auto_increment,
titulo varchar(50) NOT NULL character set utf8,
cant_paginas int NOT NULL,
,
id_ml_autor bigint NOT NULL
COMMENT 'empty:=-- [{345|}] --'
editorial bigint NOT NULL COMMENT
'type:=CatRelation;tableRel:=ml_editorial;self:=1',
PRIMARY KEY (`id`)
)
Y tendremos un resultado como el siguiente: