Generar web estática de un proyecto
El objetivo es hacer una publicación web de páginas estáticas .htm (no una web dinámica que se indiza peor en el SEO) y poner ese contenido al público con información de nuestra BD de incidencias, inventario, mantenimiento... en una intranet o de forma totalmente abierta en internet. El espacio de alojamiento de la web, así como el servidor web que atenderá nuestra dirección también lo proporciona Ingrid dentro del espacio de nuestro proyecto en la nube.
demo-sanse-verde,
entrando con el usuario ingrid y contraseña ingrid, es la
BD de jardinería que podemos usar para ver como ejemplo muy
simple, con pocos datos. Un tutorial de funcionamiento que explica las
herramientas. Además, en la base tenemos el generador web de una web más
completa con funciones que nos ayudarán a generar la de nuestro
proyecto aunque tenga un modelo de datos distinto.
Opción A. Para probar la web sencilla desde este mismo proyecto es:
- Abrir el procedimiento 'Generador web ejemplo reducido' y ejecutar los botones Arbolado, Varios, Monta sitemap y Abre desarrollo. Se muestra la web generada al pulsar los 3 primeros botones (sería necesario haber ejecutado Marca concepto .web, pero ya lo hemos hecho nosotros).
- Al pulsar Producción, se copian y comprimen los archivos al directorio que va a ser público y que se abre con el botón Abre Producción.
- Podemos trabajar regenerando o cambiando la web en la parte desarrollo y producirla otra vez al público cuando la tengamos bien probada.
Opción B. Para generar la web completa de este proyecto demo:
- Los mismos, pero desde el script 'Generador WEB completa' que trabaja con más clases, espacios, y también con una organización de incidencias.
Opción C. Para generar la web en un proyecto de una BD distinta:
- Descargar del directorio 'Directorio \ima del proyecto' el archivo '/webD - minima/webD - minima.rar' y poner el contenido dentro de nuestro directorio de proyecto en '/ima/webD - minima/<archivos del .rar descomprimido>'. Estas son las piezas mínimas de una web y tendremos que cambiar los logos, formatos de páginas, estilos y colores como nos convenga. Después tendremos que cambiar en el script los directorios de trabajo, y por supuesto las clases, campos y toda la lógica de nuestra web, basándonos en esta plantilla. Los pasos se detallan en el siguiente capítulo.
Paso a paso del ejemplo reducido
Introducción
Este documento es un manual de usuario para automatizar la creación de páginas web. Para cada página web generada, se utilizan aproximadamente ocho archivos clave:
- Una hoja de estilos CSS o CSS Less
- Un archivo JavaScript
encargado de dotar a las páginas de funcionalidades en tiempo real como
ordenar tablas o expandirlas
- Por otro lado, existirá otro archivo
JavaScript que automatizará tareas técnicas, como la creación automática
de carpetas y la generación de un archivo .zip que contendrá toda la
página web completa.
- Un archivo principal index.htm
- Imágenes
(si las hay) dentro de la carpeta '/ima' para mantener una estructura
jerárquica, es más fácil para luego hacer el pro.generaWEB.htm
- Htms
estáticos como pueden ser documentación y ayuda.
- Una plantilla.html
que contiene los componentes que siempre estarán presentes en la página
web como el encabezado, pie de página o menú lateral.
Para comprender mejor el procedimiento y los archivos necesarios para
crear una página web, en la base de datos demo-sanse-verde se encuentra
el pro.generaWEB. Además, se incluye un archivo con un ejemplo
simplificado de generación de web llamado pro.generaWEBMinimo, diseñado
específicamente para facilitar la comprensión del proceso y sus
componentes fundamentales.
El pro.generaWEB que se encuentra en esta
base de datos está adaptado a los datos de Sanse Verde. Para poder
utilizar el pro.generaWEB en otras bases de datos se tienen que realizar
los siguientes pasos:
1. En demo-sanse-verde, en el directorio dir.ima, se encuentra webD - minima, que en su interior tiene un .rar con todos los archivos necesarios para crear una web. Deberás descargar este .rar y descomprimirlo de manera local.
2. Posteriormente, en la nueva base de datos donde se utilice el
procedimiento, deberás crear “dir.ima”, que nos servirá como carpeta
raíz . Dentro de este, con la función de Admin activada, en la persiana
Directorio, escribir en directorio asociado ima y recargar página.
Una vez dentro del directorio /ima, deberemos crear dos carpetas, las
cuales son:
web: donde estarán los archivos de la página web para
producción. Se crearán automáticamente.
webD: dónde estarán los
archivos de la página web para desarrollo.
En webD deberemos copiar
los archivos web_util.css, web_util.js e index.htm. A continuación
creamos dos carpetas, las cuales son:
· a: donde estará la plantilla.htm, y los
distintos archivos de texto plano, en el caso de Sanse Verde son
formulario_cuerpo y ayuda_cuerpo.
· ima: dónde se
encontrarán todas las imágenes que va a utilizar la página web.
Archivos sencillos
.css
En el proyecto tendremos un archivo llamado web_util.css que
contendrá los estilos correspondientes a los diferentes elementos que
necesitaremos para la visualización de la página web.
.js
En
el proyecto se utilizará un archivo llamado web_util.js, que incluirá
diferentes funciones JavaScript encargadas del funcionamiento dinámico y
en tiempo real de las páginas web. Estas funciones permiten realizar
tareas comunes como ordenar tablas haciendo clic en sus encabezados o
expandir contenido para visualizar más información. El objetivo es que
web_util.js sea altamente reutilizable, siendo el mismo archivo
utilizado en todas las páginas web generadas, lo cual facilita su
mantenimiento e integración de funcionalidades específicas según sea
necesario. Por otro lado, existirá otro archivo llamado produccion.js
JavaScript que automatizará la creación automática de carpetas y la
generación de un archivo .zip que contendrá toda la página web completa.
Index.htm
Un archivo index.htm muy sencillo que contendrá una
redirección a la URL que queremos que sea la principal.
Imágenes
En caso de que se empleen imágenes en la página web, estas se
almacenarán siempre dentro de la carpeta "ima". Esta estructura facilita
la gestión de archivos, evitando la necesidad de modificar las URLs en
el proceso automático de generación de páginas. Es importante destacar
que dentro de la carpeta "ima" todas las imágenes deben estar al mismo
nivel, sin subcarpetas.
Plantilla.htm
Archivo .htm que
contiene todos los elementos fijos de la página web. Este archivo deberá
incluir siempre tres bloques fundamentales sin nada dentro: <style></style>,
<article></article> y <script></script>. Estos bloques son esenciales
para que el proceso de generación automática inserte correctamente su
código: el contenido HTM generado automáticamente irá dentro de <article></article>,
los estilos CSS dentro de <style></style> y las funciones JavaScript
necesarias dentro de <script></script>.
Un ejemplo práctico de este concepto puede observarse en Sanse Verde, donde tanto el encabezado como el menú lateral permanecen constantes, siendo únicamente el contenido ubicado dentro del bloque <article></article> lo que varía en cada página generada automáticamente.
Archivos de texto plano
En este procedimiento se pueden utilizar archivos de texto plano para simplificar el mantenimiento del código y facilitar las actualizaciones de ciertas páginas web. Estos archivos contienen información estática como documentación, guías de uso o archivos de ayuda, que pueden ser fácilmente editados sin afectar al código fuente. En el caso del proyecto sanse-verde se puede observar en el documento ayuda_cuerpo.htm.
Archivo complejo pro.GeneraWeb.htm
En esta primera parte se explicarán los pasos para generar los htms de la información obtenida de la base de datos.
1. El primer paso consiste en definir una lista con todas las clases que queremos visualizar en nuestro sistema. Ej:

En este caso creamos una lista con:
· cod: indicará el código que se
utilizará en este procedimiento para llamar a esa clase
· col: color
con el que se va a representar en la página web
· res: breve resumen de
la clase
· res1: Nombre corto de la clase
2. Convertir esta lista (array de objetos) a un objeto de objetos utilizando la función de la api ingra.ds seleccionando un atributo como índice, esto nos servirá para buscar y modificar fácilmente . Ej:
let clas= ingra.ds(clal,'cod') nos dará como resultado la lista “clal” en forma de objeto de objetos donde el índice de cada objeto será el cod0.

3. Debemos preparar un
menú de opciones que permita al usuario interactuar con el sistema. Esto
implica definir qué ocurre al hacer clic en cada botón o enlace
disponible. Por ejemplo, si se pulsa el botón 1, se ejecutará una
función específica; si se pulsa el botón 2, se ejecutará otra función, y
así sucesivamente. Un ejemplo de creación de menú es:
Definimos el
menú en “Definición de parámetros” dentro del procedimiento dentro de la
base de datos. Ej:

Que se verán de manera visual en el programa de la siguiente forma:

En el procedimiento (código fuente) realizaremos unos “if” que permitan manipular qué opción se intenta realizar:

4. Lo siguiente que necesitamos en nuestro programa es recoger los datos de la base de datos para tenerlos ya disponibles en una lista. Para el ejemplo de sanse-verde, esto se realiza en la función de cargaArbolado(). Para este proceso se utiliza una función de la API muy común llamada leeConceptos, donde hay que indicar de la siguiente forma:
leeConceptos( ‘búsqueda en la base de datos’, {que atributos queremos seleccionar de cada clase}) y hacer un return en caso de error.
Ejemplo código:
r= await bas.leeConceptos('cla=famgen', {cod:1,res:1,gencom:1,IDgen:1}); if (r?.error) return r
En el código anterior leeremos de la base de datos todos los conceptos de la búsqueda cla=famgen y lo guardaremos en una lista de objetos y de cada concepto seleccionamos el código (cod), resumen (res), nombre común (gemcon) y ID genero (IDgen) y, si no se devuelve nada, retornaría un error.
5. Una vez tenemos todos los conceptos se puede filtrar aquellos que tengan relevancia para la página web. Para el caso de Sanse Verde, mediante la función calculaArbolado() filtraremos familias, zonas y calles que tengan árboles y saber cuántos árboles tiene cada uno.
6. Una vez tenemos los datos y el menú terminado, podemos crear los componentes html con sus datos correspondientes de las clases. Cada clase se compondrá de dos partes principales: montarclase_doc1 y montarclase_doc2:
montarclase_doc1: se procesan y estructuran todos los datos relevantes correspondientes a un concepto específico dentro de una clase, como por ejemplo, la especie Platanus hybrida. Ej:

montarclase_doc2: genera una tabla general que agrupa todos los elementos pertenecientes a esa clase como, por ejemplo, una Tabla General de Especies que incluye múltiples filas, cada una representando un concepto diferente (como Platanus hybrida).

7. Código montarclase_doc2, caso específico de tablas:
· Se crean las listas para
introducir el htm, estilo y javascript.
· Se introducen las cabeceras en
la lista de htm
· Se monta la tabla con monta_tabla_num_por().
· Se
realizan las gráficas con monta_grafica().
· Una vez finalizado
utilizaremos la función graba_htm() que creará todos los htm.
8. Código
de montarclase_doc1, caso específico de tablas:
· Filtramos los datos
relacionados únicamente con ese concepto. En el caso de Sanse Verde,
filtramos el árbol y determinamos en qué calles y zonas aparece dicho
árbol.
· Se crean las listas para introducir el htm, estilo y
javascript.
· Se introducen las cabeceras en la lista de htm
· Se crea
una tabla con las propiedades del concepto
· Se copia un objeto con la
estructura de docl, para poder realizar el calculaArbolado(), pero en
este caso es para un concepto en específico, así se puede calcular
cuántos árboles hay en cada zona, calle, etc. pero solo para este árbol
·
Se monta la tabla con monta_tabla_num_por().
· Se realizan las gráficas
con monta_grafica().
· Una vez finalizado utilizaremos la función
graba_htm() que creará el htm individual.
Ahora que tenemos una idea general sobre cómo mostrar una clase y generar sus respectivos archivos .htm, continuaremos con la explicación de funciones de utilidad, la creación de archivos de texto plano y otros componentes esenciales.
Función montaSitemap(): se encarga principalmente de generar dos archivos esenciales para la indexación y gestión de un sitio web por parte de los motores de búsqueda. Esta función debería funcionar igual para todas las páginas web:
· sitemap.xml: Este archivo contiene un listado estructurado de todas las URLs generadas por el sistema, permitiendo a los motores de búsqueda como Google rastrear e indexar el contenido de manera eficiente. Cada URL se presenta junto con información relevante como la última modificación, la frecuencia de actualización y la prioridad asignada.
· robots.txt: Este archivo proporciona instrucciones a los robots de búsqueda sobre qué partes del sitio web deben o no ser rastreadas. Es útil para controlar el acceso de los bots a determinadas áreas del sitio y optimizar así la eficiencia del rastreo
Función marcaConceptosWeb(): el propósito de esta función es identificar y marcar en la base de datos aquellos conceptos que ya tienen su archivo .htm generado. Para ello, actualiza su parámetro correspondiente denominado "en web" estableciéndose en 1, lo cual indica que el archivo .htm ha sido creado correctamente. Marcar el parámetro permite que la función de búsqueda sólo identifique y devuelva aquellos conceptos que tienen un archivo .htm generado. Hay que indicar las listas donde se quiere marcar el parámetro.
Función monta_ayuda(): sirve para generar el .htm del archivo texto plano ayuda_cuerpo.htm. Habría que crear otra función en caso de que el archivo texto plano sea diferente a “dirDesarrollo+'/a/ayuda_cuerpo.htm”, con la nueva dirección como, por ejemplo: “dirDesarollo+’/b/archivo_texto.htm”.
Función monta_formulario(): sirve para generar el .htm del archivo formulario_cuerpo.htm para enviar consultas a la base de datos.
Función calculaArbolado(): Función específica de Sanse Verde que nos sirve para calcular cuántos árboles hay en cada zona, calle, etc. En el caso de sanse-verde el orden es:
· Crear un objeto de la lista dónde
queremos encontrar un parámetro e inicializar una variable que nos sirve
como contador
· Se recorre la lista, buscando si ese código existe en
la lista árboles, en caso de que exista, se suma uno al contador
·
Ahora comprobamos la lista y aquellos parámetros que tengan el valor
diferente de 0 serán los seleccionados.
· Se añade el % de árboles que
hay en esa zona.
Función monta_tabla_num_por(): Esta función creará las tablas con los datos que tenemos almacenados en las listas. Esta función consta de 3 partes principales que son:
· Cabecera: el primer
al.push se encarga de añadir la fila de cabecera, recorriendo los
diferentes parámetros de nuestra lista. Durante este proceso, se asigna
el evento ordenaTabla() a cada columna y, si el parámetro es numérico,
se agrega un indicador especial (flag) para identificarlo.
· Datos: el
segundo al.push introduce los datos correspondientes a cada fila,
columna por columna. Utilizamos el índice i para definir cuántas filas
se mostrarán inicialmente. Para cada dato, se crea un elemento <a> con
un evento onclick=location que redirige a su respectivo concepto.htm.
Además, se aplica un estilo específico dependiendo del tipo de dato que
se esté mostrando.
· Última fila: esta fila se utiliza para añadir
funcionalidades adicionales, como expandir o colapsar filas, mostrar el
total de árboles, etc.
Función monta_propiedades(): pequeña función que sirve para crear una tabla con las propiedades del concepto de ese concepto.htm.
Función monta_grafica(): pequeña función que utiliza la API para crear una gráfica. El parámetro “docl” debe ser aquella lista de la que queramos realizar la gráfica y posteriormente seleccionar sus atributos.
Función monta_mapa(): pequeña función que utiliza la API para crear un mapa INCA. El parámetro “docl” debe ser aquella lista de conceptos de la que queramos realizar el mapa.
IMPORTANTE Función
graba_htm(): Esta función se encarga de automatizar la generación de los
distintos archivos .htm. Durante la creación de tablas, mapas y otros
elementos, se añaden los datos correspondientes a sus respectivos arrays
(al, bl, cl).
Al ejecutar la función graba_htm(), cada uno de estos
arrays se inserta en su lugar correspondiente dentro de la plantilla
HTML que hemos diseñado:
· El contenido de la lista al se inserta
dentro de las etiquetas <article> </article>.
· El contenido de la
lista bl se inserta dentro de las etiquetas <script> </script>.
· El
contenido de la lista dl se inserta dentro de las etiquetas <style> </style>.
· Cuando se realiza una gráfica o mapa, se guardará contenido en la
lista cl, que se introduce en window.onload
Finalmente, la función
graba_htm() llama a la función grabaArchivo de la API, que se encarga de
generar el archivo .htm individual con el contenido.