Bludit CMS: Archivos de contenido

by Sjlvanq E. R.
9 minutos
Bludit CMS: Archivos de contenido

Acerca de Bludit

Voy a dedicar la primera entrada de este sitio al sistema de gestión de contenidos que lo hace posible.

Bludit nos permite crear y gestionar desde un sitio web estático muy simple hasta uno de cierta complejidad, con contenidos dinámicos y múltiples secciones, muy fácilmente. Lo que sin duda resulta más atractivo es que todo esto puede hacerse sin necesidad de un servidor de bases de datos. El sistema de gestión de contenidos Bludit almacena toda la información en archivos flat-file en el disco rígido del servidor, por lo que puede tener, como es de esperarse, una performance algo menor que aquellas plataformas que hacen uso de sistemas de bases de datos sobre un modelo cliente-servidor. No obstante, Bludit tolerará volúmenes de datos y operaciones que deberían, en la mayoría de los casos, satisfacer ampliamente las necesidades de procesamiento y recuperación de información de un sitio web personal o empresarial.

Esta entrada se propone una inspección del funcionamiento de Bludit detrás de su front-end: los archivos y directorios afectados por la creación de nuevos contenido y su organización en categorías. 

"Simple, Fast, Secure, Flat-File CMS"

¿Qué es flat-file?

Flat file, literalmente "fichero chato", es un formato de archivo en el que la única información disponible se almacena en una tabla bidimensional o tabla de doble entrada. En consecuencia, un flat file no incluye información sobre la relación entre registros ni definiciones de métodos o funciones. Generalmente se trata de archivos de texto plano o plain-text, es decir, emplean únicamente símbolos que un editor de textos puede representar, sin información adicional acerca del formato de presentación de ese texto al usuario o bien especificándolo en el mismo conjunto de símbolos que su contenido admite. Básicamente, pueden ser leídos y modificados por cualquier persona usando un editor de textos con capacidad para procesar archivos en formato de texto plano.

Parser de flatfile. CVS. JSON. Humor

Bludit hace uso de JSON, un formato orientado al intercambio de datos que encuentra antecedentes en el XML pero con soporte nativo en JavaScript.

Una alternativa interesante que nos proporciona esta arquitectura es que una Web creada con Bludit podrá editarse en su totalidad trabajando directamente sobre estos ficheros.

Un vistazo rápido a JSON

Ejemplo de objeto JSON que representa una colección de libros:

{
"libros" :
[
{"titulo": "Martín Fierro", "autor": "Hernández, M.", "paginas":350},
{"titulo": "Don Quiojte", "autor": "Cervantes, M.", "paginas":600},
{"titulo": "Adán Buenosayres", "autor": "Marechal, L.", "paginas":900}
]
}

En este objeto JSON tenemos un dato con la clave "libros" cuyo valor es un arreglo de otros objetos, de tres datos cada uno, especificados con las claves "titulo", "autor" y "paginas".

De modo que puede representarse como una tabla de dos dimensiones:

titulo autor paginas
libros[0] Martín Fierro Hernández, M. 350
libros[1] Don Quijote Cervantes, M. 600
libros[2] Adán Buenosayres Marechal, L. 900

Tipos de valores admitidos en JSON

Debemos atender también al tipo de valor que una clave pueda tener dentro de un dato. A los fines de poder comprender y editar los ficheros de bases de datos que Bludit construye como flat files en JSON, nos detendremos en cinco de ellos:

  • Tipo de valor objeto. Un objeto puede ser el valor asignado a una clave, como vimos en el ejemplo anterior, los datos que integran un objeto deben escribirse dentro de corchetes { ... } y pueden ser de cualquier tipo.
  • Tipo de valor cadena de texto. Debe estar siempre entrecomillado "...".
  • Tipo de valor número. Sólo símbolos numéricos 0-9, sin entrecomillar.
  • Tipo de valor array. Un array es una estructura de datos al igual que los objetos y también admite elementos de cualquiera de los tipos conocidos. En un array, los elementos, definidos dentro de corchetes [ ... ], son sólo valores, sin clave. 
  • Tipo de valor lógico. Pueden tener valor verdadero o falso, indicado por la palabra true o false sin entrecomillar. 

Especificaciones de los archivos de contenidos en Bludit

¿Dónde y cómo almacena Bludit las entradas y páginas de un Sitio Web?

Los contenidos en Bludit son, por defecto, almacenados en ficheros que contienen el cuerpo de la página en crudo, HTML raw, en directorios individuales dentro de ./bl-content/pages/, mientras que sus atributos (título de la página, categoría, fecha de creación, autor o autora, entre otros) se registran en un archivo con formato JSON en ./bl-content/databases/pages.php.

Para el caso de un blog con dos entradas tituladas Página 1 y Página 2, tendríamos, restringiéndonos a los ficheros y directorios mínimos a los que afecta la creación de nuevos contenidos, un esquema similar al siguiente: 

\.
└───bl-content
├───pages
| ├───pagina-1
| | index.php
│ └───pagina-2
| index.php
└───databases
pages.php

Contenido posible del fichero BASE/bl-content/databases/pages.php:

{

 "pagina-1":{
    "title":"Página 1",
    "description":"Página de prueba creada por mí",
    "username":"martina0",
    "tags":[
       "etiqueta1",
       "etiqueta2"
    ],
    "type":"published",
    "date":"2023-01-03 16:00:00",
    "dateModified":"",
    "position":3,
    "coverImage":"",
    "category":"",
    "md5file":"7cb0f7205205c2180ee2e60aecfc154e",
    "uuid":"c69f688395c84ff13563f00d5b762c2c",
    "allowComments":true,
    "template":"",
    "noindex":false,
    "nofollow":false,
    "noarchive":false,
    "custom":[
       false
    ]
 },
 "pagina-2":{
    "title":"Página 2",
    "description":"Borrador de otra página de pruebas",
    "username":"lea_yo",
    "tags":[
       "etiqueta1",
       "etiqueta3"
    ],
    "type":"draft",
    "date":"2023-01-03 17:01:00",
    "dateModified":"",
    "position":3,
    "coverImage":"",
    "category":"",
    "md5file":"95ec30db2f0bd4dc220741512bb1817f",
    "uuid":"e25be89906a196f664a42371e05ed598",
    "allowComments":true,
    "template":"",
    "noindex":false,
    "nofollow":false,
    "noarchive":false,
    "custom":[
       false
    ]
 }
}

CLAVES DESCRIPCIÓN
title Cadena de texto. Título de la publicación.
description Cadena de texto. Descripción de la publicación.
username Cadena de texto. Nombre de usuario del autor del post.
tags Array. Array de etiquetas como cadenas de texto.
type Cadena de texto. Admite los valores "draft" (borrador), "published" (publicada), "scheduled" (programada), "static" (estática) o "sticky" (igual que static pero fijada en la parte superior).
date Cadena de texto. Fecha de publicación en formato "AAAA-MM-DD HH:MM:SS"
dateModified Cadena de texto. Fecha de modificación en formato "AAAA-MM-DD HH:MM:SS"
position Nùmero. 
coverImage Cadena de texto. Nombre del archivo de imagen que será utilizado como portada de la publicación.
category Cadena de texto. Nombre interno de la categoría.
md5file Cadena de texto. Hash MD5 del archivo de página index.txt dentro del directorio correspondiente en BASE/bl-content/pages/
uuid Cadena de texto. Identificador único de cada publicación. Las imágenes que se adjunten a una página se almacenarán en un directorio cuyo nombre será el uuid de la publicación dentro de BASE/bl-content/uploads/pages/
allowComments Lógico.
template ?
noindex Lógico. Indica a los motores de búsqueda que no muestren esta página en sus resultados de búsqueda. Añade una etiqueta meta "robots" en el HTML generado con "noindex" en el atributo "content" o lo agrega al atributo "content" en una etiqueta meta "robots" existente.
nofollow Lógico. Indica a los motores de búsqueda que no sigan los enlaces de esta página.  Añade una etiqueta meta "robots" en el HTML generado con "nofollow" en el atributo "content" o lo agrega al atributo "content" en una etiqueta meta "robots" existente.
noarchive Lógico. Indica a los motores de búsqueda que no guarden una copia almacenada en caché de esta página.  Añade una etiqueta meta en el HTML generado con "noarchive" en el atributo "content" o lo agrega al atributo "content" en una etiqueta meta "robots" existente.
custom Array. Campos personalizados.

Puede resultar curioso que ninguna de estas propiedades es requerida obligatoriamente salvo type, sin la cual la página permanecerá oculta sin mostrarse en ninguna lista de páginas y uuid .

Podemos encontrar  una descripción completa del árbol de directorios en Bludit en la documentación oficial (en inglés). Aquí nos centraremos únicamente en los ficheros que conforman el contenido y los metadatos de una página o entrada de blog. Por eso lo siguiente es...

¿Cómo organiza las páginas Bludit?

Al comenzar con una instalación desde cero de Bludit, el script install.php establece automáticamente las categorías general, music y videos. Lo hace escribiendo el siguiente bloque JSON en el flat file ./bl-content/databases/categories.php

ATENCIÓN: EN LA VERSIÓN 3.14.1 DE BLUDIT ES NECESARIO REEMPLAZAR LA LÍNEA 352 DE install.php

352c352
< array_push($slugs, $slug); ---
> array_push($slugs, $L->get($slug));

<?php defined('BLUDIT') or die('Bludit CMS.'); ?>
{
    "general": {
        "name": "General",
        "description": "",
        "template": "",
        "list": [
            "crea-tu-propio-contenido",
            "set-up-your-new-site",
            "follow-bludit",
            "acerca-de"
        ]
    },
    "music": {
        "name": "Music",
        "description": "",
        "template": "",
        "list": []
    },
    "videos": {
        "name": "Videos",
        "description": "",
        "template": "",
        "list": []
    }
}


Los temas Alternative y Blog X, incluidos en la instalación estándar de la versión 3.14.1 de Bludit no presentan la lista de enlaces de categorías ni cuentan con una plantilla diferenciada para las páginas de categoría que emplee el valor de la clave 'description' en su diseño. Utilizando estos temas, la descripción se volcará en una etiqueta <meta name="description"> del código HTML permaneciendo invisible al usuario. 

En el tema Blog X disponemos de una barra lateral a la que es posible añadir una lista de enlaces de categorías activando el plugin Categorías. A esto lo hacemos desde el panel de administración -> sección Plugins.

La URL de las páginas de categoría sigue el modelo BASE/category/nombre_de_la_categoría. El chunk category puede tener otro identificador según se haya definido Ajustes --> General --> Avanzado --> Filtros de URL o en el valor para la clave uriCategory de BASE/bl-content/databases/site.php.

VARIABLE DESCRIPCIÓN
name Cadena de texto. Nombre de la categoría para mostrar al usuario. El plugin Categorías utilizará esta propiedad como texto de enlace.
description Cadena de texto. Como explicamos antes, en los temas que se incluyen en la instalación estándar de Bludit el valor de esta propiedad se volcará en una etiqueta <meta name="description" ...>
template ?
list Array. Lista de páginas asignadas a la categoría como cadenas de texto cuyo valor será la clave de la definición de la página en BASE/bl-content/databases/pages.php: ["pagina-1", "pagina-2", "pagina-3"].

Palabras finales de la primera entrada del blog

Esperamos haber acercado al lector al funcionamiento interno de la creación de contenidos con un CMS tan singular como Bludit. Volveremos a ocuparnos de este gestor de contenidos.

¿Te gustó la entrada?

Dejanos un comentario, compartí en redes o regalame un backlink desde tu web.