
Diario de Honduras - fotos de mi última gran aventura
Algunas fotos (ejemplo del tutorial Fotolog en PHP)
publicado el 18 de Noviembre de 2005
Enlace permanente: http://www.marciobarrios.com/proyecto-php
En este artículo mostraré mi visión sobre la organización de los proyectos en PHP y las posibles técnicas para optimizar el trabajo, además de introducir las bases para una programación modular.
Cuando queremos comenzar un proyecto individual en PHP de pequeña-mediana escala y no utilizamos un framework debemos tener en cuenta muchos factores al organizar el proyecto, de la buena planificación de estos factores depende en gran parte el éxito del proyecto y un fácil mantenimiento, ampliación, modificación, etc. Con la experiencia se va aprendiendo a organizar mejor las carpetas, a crear y organizar mejor el código, a reutilizar mejor nuestras funciones básicas, en definitiva a optimizar el ritmo de trabajo con una serie de técnicas que deberían de repetirse en cada proyecto nuevo que iniciamos. Personalmente creo que esta división organizativa se puede dividir en varios puntos:
Para que nuestro proyecto sea consistente y a la vez fácil de entender es básico que planifiquemos una programación modular, eso implica por ejemplo una distribución de carpetas en el Server de manera que nos sea fácil identificar cualquier código y acceder a él. Si al código le añadimos los xml que queramos generar para sindicaciones, las imágenes que utilicemos, los css y demás requerimientos es necesario una distribución práctica y sencilla. La distribución de carpetas que a mi me resulta útil es la siguiente:
Personalmente también divido algunos módulos en varias partes, es decir, imaginemos que tenemos un módulo de noticias que es una sección de la web donde mostramos noticias de un determinado tema, bien pues creo que lo más útil(que no lo más óptimo) sería dividir este código en porciones de la siguiente manera:
Como veis la nomenclatura es importante ya que así podemos identificar fácilmente los archivos de un mismo módulo dentro de la carpeta includes.
Por otra parte hay que decir que en la en la raíz únicamente tendremos el index.php y el htaccess (si utilizamos un servidor apache, que seguro que sí ;p), así conseguiremos una buena organización que quizá no se vea especialmente útil cuando se plantea, pero seguro que lo agradeceréis cuando volváis a trabajar en el proyecto pasado un tiempo.
Evidentemente este es un punto que nos será útil una vez hayamos hecho varios proyectos y pruebas, a partir de aquí seguro que nos damos cuenta que hay porciones de código o funciones que podemos reutilizar en otros proyectos.
Lo ideal es que hagamos funciones con el código reutilizable, ya que así nos ayudará que nuestro programa sea más legible y más limpio que si lo utilizáramos directamente, de todos modos en cada proyecto nuevo sabremos identificar el código reutilizable y optimarlo para futuros proyectos, que en definitiva es de lo que se trata. En un artículo próximo implementaré algunas funciones en PHP que considero útiles para gran parte de nuestros códigos.
Bien pues esta es la parte importante del tema, el código que generamos creo que ante todo tiene que ser legible y limpio, porque en nuestro caso creo que es mucho más importante la claridad y organización que la optimización.
Seguramente muchos programadores con experiencia piensen que lo ideal es separar la lógica de la estructura (con plantillas como Smarty por ejemplo) pero sinceramente creo que no es necesario, en proyectos pequeños o medianos no vale la pena porque creo que se tarda demasiado (en relación con los beneficios) en separar el php del html y no aporta prácticamente ningun beneficio práctico (a excepción de vanagloriarse por ello) ya que el hecho de mezclar el código php y el html en la mayoría de los casos no tiene porqué ser sinónimo de ensuciar el código.
De todas maneras, conseguir un código limpio no es tan fácil como parece, al programar todos tenemos malos vicios que son muy difíciles de quitar, pero poco a poco aprendemos a mejorar.
Estas podrían ser algunas guías para mejorar nuestro código:
Cualquier web que podamos hacer en PHP tiene secciones diferentes, estas secciones las creamos en PHP de forma modular, esto significa que tenemos un archivo (index.php) que se encarga de llamar a cada sección dependiendo de los parámetros que le pasemos, esto hace que sea muy fácil añadir, modificar o eliminar secciones de la web. Lo más fácil para ver el funcionamiento es un ejemplo:
<?
//index.php
session_start();
error_reporting(E_ALL);
include_once($_SERVER['DOCUMENT_ROOT'].'/includes/conexion.php');
include_once($_SERVER['DOCUMENT_ROOT'].'/includes/funciones.php');
/*aqui incluimos todas las funciones, conexiones, etc. Ponemos el error_reporting a E_ALL para que podamos ver todos los fallos */
/*… todo nuestro html …*/
if (file_exists($_SERVER['DOCUMENT_ROOT'].'/modulos/'.$_GET['modulo'].'.php')) include_once($_SERVER['DOCUMENT_ROOT'].'/modulos/'.$_GET['modulo'].'.php');
else echo "<p class='error'>El archivo al que intentas acceder no existe. Verifica la dirección.</p><p><a href='/'>Principal</a></p>";
/*… html restante*/
?>
Como vemos en nuestro index.php incluimos nuestras funciones y conexión con la BBDD y además requerimos los módulos. En este caso los módulos estan en la carpeta modulos y por GET recibo el modulo al cual se quiere acceder, y solo accedo a el si existe en la carpeta 'modulos'. Sencillo no?
Entonces en cada módulo solo debemos implementar la sección que queramos, aunque aquí no acaba todo, para hacerlo más accesible el acceso a cada módulo lo haremos transformando las URL en URLs amigas (Friendly URLs) con un htacces (más concretamente mediante mod_rewrite del apache), es decir que para acceder al modulo de noticias la url sería http://www.dominio.com/noticias y el htaccess nos la transformará en http://www.dominio.com/index.php?modulo=noticias&pagina=1 (¿Mucho más bonita la URL de antes no?)
<?
ErrorDocument 404 /modulos/error.php
RewriteEngine on
RewriteRule ^principal$ /index.php [L]
RewriteRule ^contacto$ /index.php?modulo=contacto [L]
RewriteRule ^noticias$ /index.php?modulo=noticias&pagina=1 [L]
…
?>
Lo primero que hemos hecho con el htacces es decirle qué php tiene que ejecutar en caso de error 404 y acto seguido activamos el motor para reescribir las URLs del Apache. El símbolo "^" es para decirle que la cadena comienza y el “$” para decirle que ahí acaba. Acto seguido introducimos la cadena que aparecerá en nuestra url, dejamos un espacio y introducimos en lo que queremos que se convierta, la [L] final significa que no es una redirección, así no cambiará la url original por la reescrita. Y ya está! Esto debemos hacerlo para cada nuevo módulo, y es un cambio muy significativo en la experiencia de usuario, ya que es mucho más fácil e intuitivo recordar estas nuevas direcciones.
Como buen seguidor de los estándares un gran error de muchas webs modulares es que no tienen en consideración los Meta-Tags de cada módulo, y eso empobrece mucho la web además de desfavorecerla en los buscadores. Por tanto implementaremos el archivo metas.php (que guardaremos en la carpeta includes) para corregir esto, así que el archivo metas.php lo tendremos que incluir en el index.php en el lugar donde irían los metas (title, keywords, description, etc.)
<?
<? if($_GET['mod']=="contacto"){?>
<title>Titulo del modulo</title>
<meta name="keywords" content="palabras clave relacionadas con el modulo" />
<meta name="description" content="descripción del modulo" />
<? }
else if($_GET['mod']=="catalogo"){?>
<title>Titulo del modulo</title>
<meta name="keywords" content="palabras clave relacionadas con el modulo" />
<meta name="description" content="descripción del modulo" />
<? }
else {?>
<title>Titulo de la pagina principal</title>
<meta name="keywords" content="palabras clave relacionadas con la web" />
<meta name="description" content="descripción de la web en general" />
<? } ?>
?>
Como veis tendremos que crear los metas para cada modulo, y unos metas por defecto que se utilizaran en la página principal, con estos sencillo pasos lograremos una web modular consistente.