Generator

La creación de catálogos en los sistemas, son una parte importante para el funcionamiento de los sistemas, sin embargo, crearlos de la forma habitual, hace que el desarrollo se vuelva tardado. Por ese motivo esque fue implementado un módulo al framework, denominado Generator. Generator es un módulo que facilita y agilizar la creación de catálogos en los sistemas. A continuación se dará una explicación de la forma en la trabaja, para que puedas darle uso de manera correcta.

 

1. Funcionamiento

La forma en la que funciona este módulo es el siguiente:

Por medio de la URL escribir, el nombre del dominio seguido del nombre del módulo que se desea crear, por ejemplo, si de desea crear un módulo escuelas , se tiene escribir lo siguiente:

  1. Se sabe que el framework después del Path le sigue el controlador, pero en este caso cuando se detecta que se intenta llamar a un controlador que no existe, lo que hará será buscar dentro de la carpeta Generators un archivo PHP con el nombre escuelasGenerator.
  2. Dentro del archivo escuelasGenerator  se encuentran todos los datos que se necesitan para la creación del módulo, por lo que este, envía la información al controlador GeneratorController, el cual debe estar dentro de la carpeta Controllers.
  3. GeneratorController  ejecutará una función que hará uso del modelo Generator para crear el módulo escuelas.
  4. Por último se mandará llamar la vista Generator.tpl en donde se visualizará el módulo creardo.

Ya se sabe la forma en la que funciona Generator, ahora siguiendo con el ejemplo anterior se explicará a nivel código todos los datos necesarios que el archivo PHP escuelasGenerator  debe contener.

 

2. Tablas para el catálogo

Lo primero que se realiza es listar por medio del array "$tablas" el conjunto de tablas que intervienen para realizar  el catálogo. El contenido del array es el siguiente:

  • nom   -> Nombre de la tabla
  •  id    -> nombre de la llave primaria de la tabla de la tabla
  •  getId -> sql para obtener el ID siguiente, para insertar un registro nuevo; si el id es autoincrement NO se agrega.
$tablas["a"]= array(
      'nom'  =>"PESCUELAS",
      'id'   => "ESCU_ESCU",
      'getId'=> "SELECT (MAX(ESCU_ESCU) + 1) AS ID FROM PESCUELAS"
);

 

2.1. Listar el contenido de la tabla 

 El array $bd tiene lo necesario para desplegar el contenido del catálogo, está conformado por: 

  • sqlDeplegar -> SQL que se usar para mostrar la información. Se usa "AS" para renombrar el nombre de los campos de la tabla de la BD, para después usarlos para poner los titulos de las tablas que se mostrará al usuario.
  • idDeplegar -> llave que se usará para manipular el catálogo, para realizar las funciones de eliminar o editar.
  • busqLike -> nombre de los campos, tal como fue renombrado con el "AS", que se usan para hacer búsquedas con la instrucción sql "LIKE", el está conformado como: LIKE '%palabra%'"
  • busqIgual ->nombre de los campos, tal como fue renombrado con el "AS", que se usan para realzar búsquedas directas: campo  = palabra
  • nomPlural -> Nombre plural del catálogo que se le desea asignar.
  • nomSingular -> Nombre singular del catálogo que se le desea asignar.
  • cssEditar -> css para hacer ajustes al diseño del formulario de edición, este css se aplica de forma individual, ya que no todos los catálogos tendrán el mismo diseño ni la misma estructura.
  • Columnas -> Array (opcional), donde se define que columnas aparecen en el catálogo, su ancho y su orden.
  • btnOpciones-> Array (opcional), con las opciones que contendrá el menú desplegable en el catalogo. Para más información véase el capítulo “5. Menú de opciones en el catalogo”.

 

$bd = array(
      'columnas' => array(
            array('campo' => 'ID','width' => '2%',),
            array('campo' => ' SIGLAS ','width' => '5%',),
            array('campo' => ' NOMBRE DE LA ESCUELA '),		
      ),
      'sqlDeplegar' => 'SELECT ESCU_ESCU AS ID, ESCU_SIGLAS AS SIGLAS,
             ESCU_NOMBRE AS "NOMBRE DE LA ESCUELA" 
             FROM PESCUELAS 
             ORDER BY "NOMBRE DE LA ESCUELA" ASC',
      'idDeplegar' => "ID",
      'busqLike' => '"NOMBRE DE LA ESCUELA" ,"SIGLAS"',
      'busqIgual' =>'"SIGLAS"',
      'nomPlural' => "escuelas",
      'nomSingular' => "escuela",
      'cssEditar' => '
		       h4{
		          color:powderblue;
		          border-bottom: 1px solid darkturquoise;
		       }
		       .box-body{
			  max-width:980px; margin:auto;
		       }

		       @media print {
	    	         .make-grid(print);
		       }
      '
      'btnOpciones' => array(
            'editar' => true,
            'detalles' => false,
            'duplicar' => true,
            'eliminar' => true
      ),
);

 

3. Formulario para inserción  y edición

Se establecen los campos que tendrá el formulario para insertar un nuevo registro o actualizar uno existente. Algunas propiedades son obligatorias y otras opcionales, a continuación se listan:

  • campo -> Obligatorio. Nombre del campo de la tabla, que representa.
  • tipo -> Obligatorio. Se escribe el tipo de campo, en este caso es del tipo  "text" . 
  • label -> Opcional. texto que llevará la etiqueta del campo de texto, en otras palabras el título del campo
  • holder-> Opcional. Texto que va dentro del campo, el cual ayuda al usuario a saber qué información escribir.
  • pattern -> Opcional. expresión regular que regula el contenido de la información que se teclea en el campo de texto. Limita al usuario a escribir determinados tipos de caracteres, ya sea números o letras.

    Ejemplo: 'pattern'=>'[A-Z ]{1,512}'
     
  • tabla -> Opcional. se indica la tabla al que pertenece el campo, de acuerdo al listado de tablas definido con anterioridad; cuando no se expecifica se toma la primera tabla declarada. Ejemplo: ('tabla' =>'d').
  • col -> Opcional. Se especifica el tamaño de las columnas con las clases css que Bootstrap define para cada tamaño de pantalla, por ejemplo .col-md-XX, donde XX es el tamaño de la columna, que podrá tomar valores entre 1 y 12.
  • required -> Opcional. Especificamos si el campo es obligatorio para que el formulario sea enviado.

 

$form = array(
   array('etiq'  =>''), 
   array( 
      'col' =>'col-xs-3', 
      'campo' =>'ESCU_SIGLAS', 
      'tipo' =>'text', 'label' =>'SIGLAS', 
      'holder'=>'Escriba nombre en MAYUSCULAS y sin acentos', 
      'pattern'=>'[A-Z ]{1,512}', 
      'required'=>'true', 
      'tabla' =>'p'
   ), 

   array( 
      'col' =>'col-xs-9',
      'campo' =>'ESCU_NOMBRE', 
      'tipo' =>'text', 
      'label' =>'Nombre de la escuela', 
      'holder'=>'Escriba el nombre de la escuela'
   ), 

   array('etiq' =>''), 
   array( 
      'col' =>'col-xs-12',
      'detalles' =>'width:100%;', 
      'sql' => " SELECT ECIU_NOMBRE AS CIUDAD, EEST_NOMBRE AS ESTADO, EPAI_NOMBRE AS PAIS FROM PEDESCU ESC LEFT JOIN PECIUDAD C ON C.ECIU_CIUDAD = ESC.EDES_CIUDAD LEFT JOIN PEESTADO E ON C.ECIU_ESTADO = E.EEST_ESTADO LEFT JOIN PEPAIS P ON E.EEST_PAIS = P.EPAI_PAIS WHERE ESC.EDES_ESCU=:id ", 
      'id' => 'tablaciudades', 
      'idrel'=>'ESCU_ESCU', 
      'tipo' =>'tabla' 
   ), 

   array('etiq' =>''), 
   array( 
      'campo' =>'ESCU_ESCU', 
      'tipo' =>'oculto' 
   ), 
);

 

3.1. Lista de campos soportados en Generator

Componente Descripción
text define un campo de entrada de texto de una línea.
textarea elemento define un campo de entrada de líneas múltiples ( un área de texto ).
select elemento define una lista desplegable.
datalist elemento especifica una lista de opciones predefinidas para un  elemento input.
password define un campo de contraseña.
checkbox Casillas de verificación permitir que un usuario seleccione cero o más opciones de un número limitado de opciones.
radio Los botones de radio permiten al usuario seleccionar sólo una de un número limitado de opciones.
color se utiliza para campos de entrada que deben contener un color.
time permite al usuario seleccionar un tiempo (sin zona horaria).
datetime-local especifica un campo de entrada de fecha y hora, sin zona horaria.
date

se utiliza para campos de entrada que deben contener una fecha.

En función de soporte de los navegadores, un selector de fecha puede aparecer en el campo de entrada.

week permite al usuario seleccionar una semana y el año.
month permite al usuario seleccionar un mes y el año.
telephone se utiliza para campos de entrada que deben contener un número de teléfono.
number define una numérico campo de entrada.
range define un control para la introducción de un número cuyo valor exacto no es importante (como un control deslizante). Rango por defecto es de 0 a 100.
email se utiliza para campos de entrada que deben contener una dirección de correo electrónico.
file define un campo de selección de archivo y un botón "Examinar" para la carga de archivos.
search se utiliza para campos de búsqueda (un campo de búsqueda se comporta como un campo de texto normal).
url

se utiliza para campos de entrada que deben contener una dirección URL.

En función de soporte de los navegadores, el campo URL se puede validar de forma automática cuando se presente.

table para mostrar contenido en su sitio web. Cconsta de una o varias filas, cada una de las cuales consta, a su vez, de una o más celdas.

 

3.2. Otros elementos HTML soportados por Generator

Componente Descripción
ckeditor  un editor de texto web.
   

 

3.3. Atributos HTML soportados por Generator

Componente Descripción
readonly  El atributo de sólo lectura es un atributo booleano. Cuando está presente, especifica que un campo de entrada es de sólo lectura.
disabled

El atributo discapacitado es un atributo booleano. Cuando está presente, especifica que el elemento input debe ser desactivada.

style se utiliza para definir información de estilo para un documento HTML.

 

3.4. Elementos HTML próximos a ser compatibles con Generator

Componente Descripción

keygen

 Representa un control de par generador de llaves.
progress

Representa el progreso de finalización de una tarea.

meter Representa la medida escalar (o el valor fraccionario) dentro de un rango conocido.
output Representa el resultado de un cálculo.
fieldset Representa un conjunto de controles.
legend Representa el título de un fieldset
menu Representa una lista de comandos .
details Representa un widget desde el que un usuario puede obtener información o controles adicionales.
summary Representa un resumen, título o leyenda para un elemento  details dado.
comand Representa un comando que un usuario puede invocar.
embed Representa un punto de integración para una aplicación o contenido interactivo externo que por lo general no es HTML.
object Representa un recurso externo, que será tratado como una imagen, un sub-documento HTML o un recurso externo a ser procesado por un  plugin.
param Define parámetros para el uso por los plugins invocados por los elementos object
souerce Permite a autores especificar recursos multimedia alternativos para los elementos multimedia como video o audio.
track Permite a autores especificar una pista de texto temporizado para elementos multimedia como video o audio.
canvas Representa un área de mapa de bits  en el que se pueden utilizar scripts para renderizar gráficos como gráficas, gráficas de juegos o cualquier imagen visual al vuelo.
map En conjunto con area, define un mapa de imagen.
area En conjunto con map, define un mapa de imagen.
svg Define una imagen vectorial embebida.
math Define una fórmula matemática.

 

3.5. Ejemplo componentes

"Text" (Campo de texto)

                        array(
                              'col'   =>'col-xs-12',
                              'campo' =>'denominacion',
                              'tipo'  =>'text',
                              'label' =>'Denominación',
                              'holder'=>'Escriba el nombre del tour'

 

"invisible" (Campo que no se muestra en el formulario)

        array(
            'campo' =>'fk_id_sitio',
            'valor' =>    $_SESSION['id_sitio'],
            'tipo'  =>'invisible'
            ) 

 

"Select" (Menú desplegable).

                       Ejemplo 1. Con consulta SQL. Se debe tener la columna ID y CAMPO

                        array(
                              'col'   =>'col-md-6',
                              'campo' =>'EEST_PAIS',
                              'tipo'  =>'select',
                              'datosSQL' =>'SELECT EPAI_PAIS AS ID, EPAI_NOMBRE AS CAMPO FROM PEPAIS',
                              'label' =>'PAIS',
                              'holder'=>'Escriba el pais del estado'),

                       Ejemplo 1. Con array de valores

                        array(
                              'campo' =>'PERS_SEXO',
                              'col'   =>'col-xs-2',
                              'datos' => array( 
    &uploadfilenbsp;                                          array('ID'=>'M','CAMPO'=>'Masculino'),
                                               array('ID'=>'F','CAMPO'=>'Femenino')
                                               ),
                              'tipo'  =>'select',
                              'label' =>'Sexo: '
                              ),

"Examinar" (Input con botón de buscar).

                         En la consulta SQL se debe tener la columna ID y DENOMINA

                        array(
                              'campo' =>'PERS_LOCALIDAD',
                              'col'   =>'col-xs-6',
                              'tipo'  =>'examinar',
                              'numero' => 'si',
                              'sql' =>'SELECT C.ECIU_CIUDAD  AS ID,  E.EEST_NOMBRE AS DENOMINA FROM PECIUDAD ',
                              'label' =>'Localidad',
                              'holder'=>'Escriba el id '),

Dual_listbox - cuadro de lista dual o lista de transferencia


array(
   'col'   =>'col-md-12',
   'campo' =>'tours',
   'tipo'  =>'dual_listbox',
   'class' => 'select2',
   'datosSQL' =>'SELECT t.id AS ID, t.denominacion AS CAMPO FROM tours t',
   'label' =>'Tour',
   'holder'=>'Seleccione uno o mas tours',
   'tabla_g' =>'pruebas_tours_2',
   'id_tabla_g' =>'id_registro',
//'campo_tabla_g' =>'campo', 
   'valor_tabla_g' =>'id_tour',
),

Descripción de propiedades

  • tabla_g. Nombre de la tabla en donde se van a guardar los valores de los checkbox.
  • id_tabla_g. Nombre de la columna en donde se va a guarda el id del registro del generador. Este es el campo que va a relacionar la tabla principal definida en el array $tablas con la tabla tabla_g que es donde se guardan los valores de los checkbox.
  • valor_tabla_g.Nombre de la columna en la tabla donde se van a guardar los valores de los checkbox.
  • datosSQL. Consulta SQL. Se debe tener la columna ID y CAMPO en minúsculas.

 

Checkbox - casilla de verificación

array( 
   'col'   =>'col-sm-6',
   'campo' =>'tour',
   'tipo'  =>'checkbox',
   'tabla_g' =>'tours_actividades_tours',
   'id_tabla_g' =>'id_tour',
   'valor_tabla_g' =>'id_actividad',
   'datosSQL' =>'SELECT t.id_grupo_idioma AS ID, t.denominacion AS CAMPO FROM tours_actividades t WHERE id_idioma=1',
   'label' =>'Actividades',
   'style'=> 'border: 1px solid #CCC;'
),

Descripción de propiedades

  • tabla_g. Nombre de la tabla en donde se van a guardar los valores de los checkbox.
  • id_tabla_g. Nombre de la columna en donde se va a guarda el id del registro del generador. Este es el campo que va a relacionar la tabla principal definida en el array $tablas con la tabla tabla_g que es donde se guardan los valores de los checkbox.
  • valor_tabla_g.Nombre de la columna en la tabla donde se van a guardar los valores de los checkbox.
  • datosSQL. Consulta SQL. Se debe tener la columna ID y CAMPO en minúsculas.

 

select_ajax - Menús desplegables con autocompletado con Ajax

array(
   'campo' =>'ATRE_IDCOLONIA',
   'col'   =>'col-md-3',
   'tipo'  =>'select_ajax',
   'sql' =>'SELECT COL.ID_COLONIAS AS "id", COL.D_ASENTA AS "text" FROM PLT_COLONIAS COL',
   'label' =>'Colonia',
),

Descripción de propiedades

  • sql.  Consulta SQL. Se debe tener la columna id text en minúsculas.

 

Uploadfile - Campo para subir archivos

array( 
   'col'   =>'col-sm-6 col-md-4',
   'campo' =>'EST_DOC_CEDULA',
   'tipo'  =>'uploadfile',
   'format'=>["jpg", "pdf", "png"],
   //'multiple'=>'true',
   'size'  =>'10000', //En KB
   'path'  =>$_SERVER['DOCUMENT_ROOT'].'documentos_personales/estudios',
   'label' =>'Cédula ',
   'file_name' =>'cedula',
),

Descripción de propiedades

  • format.  Lista de extensiones de archivo permitidas para cargar.
  • multiple (en desarrollo). Indica si se podrán cargar varios archivos o solo uno. Los valores son True para cargar varios archivos o False para cargar solo uno.
  • size: Tamaño máximo de archivo para cargar en KB. Si se establece en 0, significa que el tamaño permitido es ilimitado.
  • path. Ruta de la carpeta en donde se va a guardar el archivo.
  • file_nameNombre que recibirá el archivo al ser guardado.


4. Permisos Generator

delete-nombredelgenerator

edit-nombredelgenerator

see-nombredelgenerator

 

5. Menú de opciones en el catalogo

El menú de opciones del catálogo es una lista de opciones que se despliega al seleccionar el botón Ver, que se encuentra en la columna Opciones.

Por defecto este menú cuenta con las opciones de Editar, Detalles, Duplicar y Eliminar, pero también es posible añadir mas opciones por medio de la opción btnOpciones en el array $bd.

'btnOpciones' => array(
   'editar' => true,
   'detalles' => false,
   'duplicar' => true,
   'eliminar' => array(
      'mostrar_si' => '[STATUS] != "En oficio" ',
   ),
   'descargar' => array(
      'label'=>' Descargar',
      'class'=>"", 
      'href'=>BASE_URL."contratospa/editar/[ID]/0/1",
      'target'=>"_self",
      'mostrar_si' => '',
   ),
),

 

Cada opción en el menú es un array con las siguientes propiedades:

  • label: Es el texto que se va a visualizar al momento de desplegar el menú.
  • class: En esta propiedad para agregar una o más clases a la opción.
  • href: En esta propiedad indicamos el URL o función en JavaScript a la que queremos dirigirnos al darle clic a la opción.
  • target: Esta propiedad nos indica donde se abrirá la URL indicada en href, los valores pueden ser _blank (abre el URL en una nueva ventana o pestaña) o _self  (abre el URL en la misma ventana o pestaña).
  • mostrar_si: en esta propiedad se define la condición que se usará para mostrar la opción al usuario, si no se cumple no se mostrará.

Las propiedades de las opciones Editar, Detalles, Duplicar y Eliminar pueden ser sobrescritas, y asignarles otras propiedades.


Establecer valores dentro de las opciones

Para establecer un valor en las opciones es necesario escribir el nombre de la columna como aparece en la consulta sql que se definió en la opción sqlDeplegar en el array $bd. Ejemplo:

'eliminar' => array(
      'mostrar_si' => '[STATUS] != "ACTIVO" ',
),

El nombre de la columna ESTATUS debe estar entre corchetes para que pueda ser remplazada por su valor en la consulta sql.