Buenas, queria compartir este tutorial que estoy elaborando poco a poco.
Un CMS es un un Sistema de Gestión de Contenidos, permite la publicación de contenido en linea de forma ordenada por parte de terceros o del propio administrador, el contenido de los artículos o post enviados se almacena en la base de datos, mientras que de forma separada podemos gestionar la apariencia de nuestro sitio. En la actualidad hay muchos CMS disponibles, dos ejemplos muy importantes podrían ser WordPress y Drupal, ambos muy potentes y con comunidades muy grandes detrás, aunque ambos pueden hacer las mismas funciones, entrar en cual es mejor es una tontería, WordPress es mucho mas practico en sitios cuya función sea un blog, y Drupal es mas practico en blogs en los que intervengan muchas personas o en portales corporativos, al menos así los veo yo, por supuesto configurándolos y instalado plugins adicionales se puede hacer absolutamente de todo con cada uno de ellos, el uso que le demos depende única y exclusivamente de nosotros, intervendrá lo cómodo que nos sintamos trabajando con un sistema en concreto y que es lo que queremos crear.
Aunque cada sistema es único, todos (y no me refiero solo a WordPress y a Drupal) trabajan de forma similar en cuanto a la forma de publicar, moderar y dar formato al contenido.
Los Sistemas de gestión de foros como SMF o PHPBB también se podrían considerar dentro de la categoría de CMS, puesto que hacen lo mismo, permiten publicar, editar y borrar contenido almacenado en la base de datos, ademas de poder cambiar el ‘theme‘ de forma separada al sistema.
Mucha gente usa sin saberlo CMS en Internet, en servicios de blogs ya configurados, en foros etc.. pero muchos de ellos no saben como funcionan o por donde empezar si quisieran hacer algo parecido, es por eso que voy a montar un CMS paso a paso, explicando detalladamente que hace falta y para que se usa cada cosa.
La idea principal (sujeta a cambios), es crear un CMS con foro incluido, que permita añadir módulos sin mucha complicación una vez creado todo el sistema base y que tenga roles para los usuarios donde se distinguirá Inactivo, Usuario, Administrador, y otros que se quieran añadir.
Para este proyecto voy a usar xhtml, css, php5, mysql, y Jquery que es un Framework javascript que me hace mas fácil muchas cosas, entre ellas el uso de ajax.
Si quieres seguir el proceso es conveniente que tengas conocimientos previos de SQL, PHP y XHTML, aunque intentare explicarlo todo para que les resulte fácil a los menos experimentados.
Para empezar debemos de montar la estructura de la base de datos, no sera ni por asomo la estructura definitiva, si no que esta ira sufriendo cambios a lo largo del proceso, pero por algo tenemos que empezar ¿verdad?. Yo la he llamado cms.
Primero necesitamos una tabla donde registrar a los usuarios y controlar quien puede y no puede escribir en nuestro gestor de contenidos ,esta debe de contener:
- ID: Sera el numero de identificación del usuario
- USER: El nombre que el usuario elegirá para entrar en el cms
- NAME: El nombre que el usuario decidirá mostrar una vez dentro del cms
- PASS: La contraseña del usuario (Estará en MD5 para evitar problemas de seguridad)
- EMAIL: Un email de contacto
- DATE: La fecha en la que se registro el usuario
- LAST_DATE: Fecha del ultimo movimiento del usuario en el cms
- IP: Dirección ip desde la que el usuario registro su cuenta
- LAST_IP: Ultima dirección ip que tuvo el usuario
- STATUS: Indicara si el usuario tiene su cuenta inactiva (0), si es un usuario normal (1) o que rol tiene (otro numero)
De momento con esos campos tenemos suficiente, en un futuro se puede ampliar para aportar mas datos, permitir avatares, etc…
Esta es la tabla:
CREATE TABLE IF NOT EXISTS `users` (
`id` INT(5) NOT NULL AUTO_INCREMENT,
`user` VARCHAR(33) NOT NULL,
`name` VARCHAR(33) NOT NULL,
`pass` VARCHAR(33) NOT NULL,
`email` VARCHAR(50) NOT NULL,
`date` INT(15) NOT NULL,
`last_date` INT(15) NOT NULL,
`ip` VARCHAR(128) NOT NULL,
`last_ip` VARCHAR(128) NOT NULL,
`status` SMALLINT(2) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `user` (`user`,`email`)
)
Si nos fijamos en el ultimo campo de la tabla users vemos que ahí controlamos si el usuario tiene su cuenta activa, y que rol tiene. ¿Que es un rol? Un rol vendría a ser un papel o funciones que una persona tiene que cumplir, adaptándolo a nuestro sistema el ser Administrador o moderador es tener un rol. Entonces ¿Quien define que tipo de roles hay y cuantos?, fácil, nosotros.
Creamos otra tabla con los siguientes campos:
- ID: Identificación numérica del rol
- NAME: El nombre que elijamos para ese rol, admin, administrador, colaborador, lo que queramos.
- DESCRIPTION: Descripción de las funciones del rol, a nivel informativo solamente.
- PERMISSION: Permisos que tendrá el Rol sobre el cms
El campo permission esta pensado de cara al futuro para posibles funciones que queramos añadir, pero no adelantemos acontecimientos aun.
Esta es la tabla:
CREATE TABLE IF NOT EXISTS `users_role` (
`id` INT(5) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(30) NOT NULL,
`description` text NOT NULL,
`permission` VARCHAR(30) NOT NULL,
PRIMARY KEY (`id`)
)
Bien, hasta el momento ya hemos pensado como va a ser la estructura de las tablas que controlan a los usuarios, pero ¿que es un CMS sin contenido que gestionar?, necesitamos pensar que tablas necesitamos para controlar el contenido.
Ahora necesitamos una con los campos correspondientes para almacenar el contenido, el usuario, y algunas cosas mas, estos serian los campos que vamos a usar:
- ID: Identificación numérica de la revisión (¡Ojo! de la revisión no del contenido)
- CID: Identificación numérica del contenido
- TYPE: El tipo de contenido
- REVISION: La revisión seria una copia de seguridad del contenido
- USER: el usuario que envía el contenido
- DATE: Fecha en la que se envía el contenido
- DATE_PUBLISHED: Fecha de publicación del contenido
- TITLE: Titulo del contenido
- CONTENT: Cuerpo del contenido
- CATEGORY: Categoría en la que se clasifica el contenido
- TAGS: Etiquetas de referencia sobre el contenido
- COMMENT_ALLOWED: Permitir los comentarios o no…
Esta es la tabla:
CREATE TABLE IF NOT EXISTS `content` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`cid` INT(10) NOT NULL,
`type` INT(5) NOT NULL,
`revision` INT(10) NOT NULL,
`user` INT(5) NOT NULL,
`date` INT(15) NOT NULL,
`status` SMALLINT(1) NOT NULL,
`date_published` INT(15) NOT NULL,
`title` text NOT NULL,
`content` longtext NOT NULL,
`category` INT(10) NOT NULL,
`tags` VARCHAR(150) NOT NULL,
`comment_allowed` tinyint(1) NOT NULL,
PRIMARY KEY (`id`)
)
Algo muy importante es poder elegir si el contenido que queremos introducir es una entrada del blog, una pagina, un post, o cualquier otra cosa que queramos, así que vamos a definir una tabla para controlar el tipo de contenido.
- ID: Identificación numérica del tipo de contenido
- NAME: Nombre del tipo, por ejemplo ‘Entrada’ o ‘Pagina’
- DESCRIPTION: Breve descripción sobre el uso de este tipo de contenido
- COMMENT_ALLOWED: Comentarios permitidos
- ACCESS_ROLE: Que roles pueden acceder a los contenidos de este tipo
- DEL_ROLE: Que roles pueden borrar los contenidos de este tipo
- EDIT_ROLE: Que roles pueden editar los contenidos de este tipo
Aunque en la tabla content ya tengamos la opcion comment_allowed para permitir o no el envió de comentarios, es importante usarlo también aquí para darle un valor por defecto al tipo de contenido, luego puede ser que nosotros queramos desactivar los comentarios en alguna situación excepcional aunque el tipo de contenido lo permita.
Esta es la tabla
CREATE TABLE IF NOT EXISTS `content_type` (
`id` INT(5) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
`description` text NOT NULL,
`comment_allowed` tinyint(1) NOT NULL,
`access_role` VARCHAR(50) NOT NULL,
`del_role` VARCHAR(50) NOT NULL,
`edit_role` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`)
)
Por ultimo nos quedan dos tablas, una para las categorías y otra para las etiquetas o tags, son ambas muy simples y no necesitan explicación.
CREATE TABLE IF NOT EXISTS `tags` (
`id` INT(5) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`)
)
CREATE TABLE IF NOT EXISTS `category` (
`id` INT(5) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`)
)
Con estas 6 tablas ya tenemos una estructura básica para seguir avanzando, pero eso sera en otra entrada.
Un Saludo!