Creando un CMS (II)

En la anterior entrada nos habíamos quedado creando la estructura de directorios -que habíamos llamado skel- de lo que sería el gestor de contenidos. El siguiente paso lógico sería centralizar todos los accesos a un solo script: index.php.

Bienvenido a index.php

Es posible que centralizar todos los accesos en un solo archivo que a posteriori despache en base a diferentes urls tenga sus inconvenientes, pero a mi modo de verlo todo son ventajas puesto que hay un único control para todas las acciones de la aplicación.

Para convertir a nuestro index.php en el rey de la fiesta deberemos aliarnos con su gran amigo el .htaccess. El mensaje que le tendremos que mandar será el siguiente:
RewriteEngine on
RewriteRule ^(.*)$ /index.php
Algo así como "Amigo, sea la que sea la url que te estén pidiendo los usuarios, yo me encargo".

Pases vip

Cierto es que tendremos problemas con los elementos estáticos (imágenes, archivos de javascript, estilos css...), por lo que vamos a repartir varios pases vip para nuestros invitados de lujo:
RewriteEngine on
RewriteCond $1 !^(_img|_js|_themes)
RewriteRule ^(.*)$ /index.php
Con ésto se arregla el problema, los elementos estáticos serán cargados de forma normal mientras que el resto de elementos tendrán que pasar por index.php para seguir la lógica de la aplicación.

Despachando

Supongamos que hemos creado un dominio virtual para el cms en local llamado micms -gran alarde de originalidad-, cargando http://micms/ tendremos el esqueleto que estamos montando. Una vez puesto el .htaccess y un index.php con phpinfo() -por ejemplo- podremos cargar cualquier tipo de url que siempre hará referencia a la misma (http://micms/una, http://micms/dos.php, http://micms/33.html...).

¿Qué pasaría si ahora, en vez del phpinfo() ponemos en ese index.php algo tal que así?:
<?php
	$request = ltrim($_SERVER['REQUEST_URI'], '/');
	$vars = explode('/', $request);

	foreach ($vars as $var)
	{
		if(file_exists('/app/'.$var.'.html')
			include('/app/'.$var.'.html');
		else
			include('/app/error.html');
	}
?>
Al cargar la url http://micms/contaco cargaría el html que hubiera en el archivo /app/contacto.html siempre y cuando éste exista, de lo contrario cargaría el archivo de error.

¡Ya sabemos despachar! -obviemos chistes fáciles-. Como ejercicio para casa -siempre he querido decir algo así- se podría mejorar este código muy mucho y hacerlo un poco más universal, ¿alguien se da cuenta de alguno de los fallos que tienen estas 10 lineas?. Lo veremos en la siguiente entrega.

About the author

Óscar
has doubledaddy super powers, father of Hugo and Nico, husband of Marta, *nix user, Djangonaut and open source passionate.