minimalCMS
Friday, December 7. 2007
(Sí, ya sé; no hacía falta otro CMS más, pero bueh, es lo que hay.)
Motivación y desarrollo
La historia es así. Corría noviembre de 2006; un amigo me dice que necesitaba instalar algo que le permitiera mandar postales electrónicas desde su sitio, pensaba hacer el lanzamiento antes de las fiestas. Me puse a investigar los softwares de e-cards que habían y no me convenció ninguno; ¿solución?, escribir uno desde cero.
Entre idas y vueltas mías, de mi amigo, del hosting, su conexión a internet (con un océano de distancia no tener internet complica un poco la comunicación...), y más cosas, las fiestas del 2006 se pasaron. Yo dejé el proyecto a "casi terminar", y de vez en cuando lo agarraba de vuelta, le daba vueltas a alguna cosa un par de veces, y lo volvía a colgar.
Para mitad de este año creo que ya había redondeado la aplicación... una capa de datos y negocios bastante encapsulada, y un sistema de templates con recortes que juntaba toda la magia. Aplicación modesta que servía especificamente para mandar postalitas, nada más, pero lo hacía sencillo y con un sistema de templates basado en HTML cortado, fácil de integrar para alguien que no programara.
Cuando empecé a escribir el panel de control empezó el delirio... empecé a escribir un panel con un script monolítico de acciones donde un par de formularios le posteaban y a poco de empezarlo lo colgué. Varias veces más quise agarrar eso, y siempre el mismo embole, no me gusta hacer formularios, y no me gusta el código chorizo... ¿en qué terminé?; empecé a hacer un panel de control modular, usando el mismo sistema de templates que para el sitio, agregándole funcionalidades a la clase de negocios.
Llegamos a octubre; más o menos estaba redondeado... empieza la batalla por pensar un nombre un poco más buscable que "ecards" para la publicación. Para mitad del mes, registro el proyecto en SF bajo el horrendo (pero original, eso sí) nombre de PHPsdraCe; creo que la descripción era algo de la onda de "a PHP eCards engine with a versatile template system".
Culo inquieto; mientras pulía lo que había hecho para dejarlo cerrado, empecé a limpiar el código y de a poco me iba convenciendo de que tenía poco sentido dejar eso como un programa de postales y que daba para un poco más. En base a las cosas que tenía escritas, empecé a mover código para un lado y para el otro, y empecé a encaminar la idea de un CMS, cosa en la que estuve trabajando en los pocos ratos libres que tuve este último mes. PHPsdraCe se transformó, finalmente, en minimalCMS, "A simple and light content manager system, written in PHP.".
Diseño
La aplicación está escrita en PHP 4.2, con MySQL como motor, y pensando en Apache como servidor (estos últimos dos, de momento). ¿Por qué este combo?; porque era lo que tenía el hosting para el cual lo empecé... reconozco que el desarrollo tiene un par de soluciones ad-hoc que hubieran sido evitables usando PHP 5 (u otro lenguaje), pero no es algo que me quite el sueño; si bien no es un lenguaje que ame, me siento cómodo desarrollando PHP.
La característica principal que tiene (y si bien es lógico por lo verde del proyecto que sea así, mi idea es seguir trabajándolo sin perder eso de vista) es la de trabajar con una estructura pequeña de datos básica para operar; dependiendo del tipo de contenido a generar, el mismo suele resolverse con un par de consultas a bases de datos y haciendo un uso mínimo de importación de scripts.
Los objetos básicos del CMS son categorías e items (si bien es probable que a futuro fusione las dos cosas como una para optimizar búsquedas); como es de esperar, una categoría contiene categorías o items, y un item es sólo contenido. Los ítems y categorías viven en la base de datos, y cada uno tiene asociado un tipo (en caso de ser extensiones de los objetos base) y un template. La resolución de los objetos se hace siempre con semantic URLs, utilizando mod_rewrite, sobre la categoría. Por ejemplo, si se pide /hola/mundo/que/tal.html primero se busca una categoría de nombre que hija de hola y mundo; si ella no existiera, se busca a mundo hija de hola y así hasta llegar a la categoría root (la cual siempre existe). Cuando se encuentra el primer nombre que coincide con una categoría, se instancia la misma (según su tipo) y se le pasa como argumento la porción de URL que quedara sin reconocer; si en el ejemplo existiera la categoría que<-mundo<-hola, la misma se instanciaría con tal.html de argumento. Suponiendo que esta fuera una categoría de comportamiento base, entonces, con ese parámetro, intentaría encontrar un ítem llamado tal contenido en ella. Si los argumentos de la categoría no llegaran a ser resolvibles, el pedido podría terminar en un error 404.
Dado este diseño; es posible tener árboles completos dentro de la estructura de directorios virtuales que emula el CMS, que tengan su comportamiento totalmente controlado por una categoría base en la jerarquía (por ejemplo, un módulo que implementé, genera una categoría que sirve, emulando al Autoindex de Apache, un directorio del servidor); lo cual permite la integración de practicamente cualquier cosa, simplemente instanciándola como una categoría y procesando sus argumentos.
El proyecto actual permite construir muy rapidamente contenidos utilizando una plantilla y las categorías e ítems base. Dado que cada categoría y cada ítem contiene dos títulos, descripción, contenido, imagen y thumbnail asociados; es posible, sin necesidad de extensiones, crear diferentes tipos de contenido cambiando nomás el template. Si bien el sistema de templates aún no está cerrado; el mismo permite acceder a propiedades y métodos de los objetos, pasarle parámetros, establecer fondos de repetición discriminados por contexto (¿es la categoría actual?, ¿es una categoría padre de la actual?, etc), establecer sentencias condicionales sencillas, etc.. En paralelo al sistema de templates hay un par de utilidades de base las cuales hacen, entre otras cosas, resizeos y cacheos de imágenes según parámetros del template, enlazar e instanciar diferentes objetos, etc..
minimalCMS funcionando
De momento el minimalCMS puede verse funcionando en su página de SourceForge aunque, debido a las falencias y errores permanentes que tiene dicho servidor, recomiendo acceder a la versión que está corriendo en mi servidor.
Pueden descargarse los fuentes del repositorio SVN que está en SF; pero, sinceramente, creo que hay poco que ver (por supuesto, de hacer andar lo publicado, ni lo sueñen :)).
El proyecto para mí
Más allá de la justificación desde la inercia, ¿por qué escribí un CMS?
En primer lugar; si bien este es el primer CMS OpenSource que escribo y publico, fui coautor y autor de, al menos, tres proyectos similares previos. Habiendo recorrido un camino de diseño y desarrollo con otros tiempos y exigencias un par de veces; es para mí una experiencia nueva el poder hacer desde cero un desarrollo, solo, tranquilo, sin nadie arriba, andando y desandando caminos para concluir una aplicación a gusto propio y como una distensión... ya lo saben todos, a veces considero muy productivo reinventar alguna que otra rueda para llegar a lo mismo que habían llegado otros.
En segundo lugar; hice suficientes búsquedas infructuosas para instalar y usar CMSs y desde hace bastante que estoy convencido de que (a) no hay uno que se adapte a lo que suelo necesitar para proyectos modestos, (b) que encontrarlo me vaya a insumir menos tiempo que hacerlo desde cero, y (c) que una vez encontrado vaya a quedarme tranquilo sin tener que reescribirlo en parte. Bueno o malo, este es un software escrito a mi capricho, y seguramente va a ser el core del que echaré mano para varios proyectos que dejé colgados por disgregarme al no poder definir un buen software de base.
Si bien lo estoy publicando y actualizaré las cosas que vaya puliendo, dudo que a alguien le importe o le sirva; este es un CMS más en la inmensa lista de otros que ya hay, seguramente mucho más inmaduro, mal diseñado e inutil que muchos otros que andan dando vueltas.
Está claro; lo escribí para mí... y claaaaro, para mi amigo; ¿ya mencioné que todo lo referente al envío de postales quedó desmantelado?