Plantillas para webs en PHP
He estado trabajando en unas plantillas php para webs personales del personal en el trabajo. No es que sean muchas líneas de código ni una cosa muy complicada, pero me parece que han quedado bastante bien y quería comentarlo aquí, y mostrar parte del código que he utilizado. Se trata de unas plantillas que generan la web en función de los ficheros html, php o txt que se encuentren dentro de la carpeta de contenidos definida por el usuario.
Una de las partes que me han parecido más interesantes de programar ha sido la pequeña caché de los directorios de contenidos. El pequeño código es el siguiente:
-
$info = array();
-
if (!isset($_SESSION[’subdirs’])){
-
$_SESSION[’subdirs’] = array();
-
$_SESSION[’subdirs’][$content_dir] = 0;
-
}
-
foreach ($_SESSION[’subdirs’] as $key => $value){
-
$info = stat($key);
-
if ($_SESSION[’subdirs’][$key] != $info[’mtime’]){
-
$_SESSION[’subdirs’][$key] = $info[’mtime’];
-
$_SESSION[’menu’] = menu_walk($content_dir);
-
//echo "ACTUALIZANDO CACHE…<br>";
-
}
-
}
En la variable de sesión subdirs se almacenan todos los directorios por debajo de $content_dir, incluido él mismo. La clave del array es el nombre del subdirectorio y el valor es la fecha de última modificación. Así cada vez que se recarga la página se realiza un stat sobre cada elemento del array y se comprueba si ha sido modificado, y si lo ha sido, se vuelve a indexar el directorio de contenidos y a generar nuevamente las entradas de menú. Para cada tipo de fichero se realiza un tratamiento distinto del contenido, un include si es php, un echo si es html y un formateo por párrafos si es texto plano. El código que realiza esta parte no tiene demasiado interés.
Sí que vamos a ver el código de la función menu_walk () que tiene que ver con la caché en tanto que actualiza el sistema de ficheros virtual ($_SESSION[’subdirs’]) si el cambio que se ha producido en el contenido ha sido la creación de un nuevo directorio:
-
-
function menu_walk ($directorio)
-
{
-
if (is_dir($directorio)){
-
if ($gestor = opendir($directorio)) {
-
/* El menú se compone de un array de pares (arrays) cuya primera componente es el nombre del directorio o fichero y su segundO
-
* componente el enlace
-
* al archivo. En el caso de que se trate de un directorio, la segunda componente es un array con los archivos de ese subdirectorio.
-
*/
-
$menu = array();
-
$cont = 1;
-
//Iteramos en el directorio hasta haberlo leído todo.
-
while (false !== ($archivo = readdir($gestor))) {
-
if (strpos($archivo,"_") === 0){
-
//El archivo no debe ser mostrado y por tanto no generamos las entradas de menú.
-
}else{
-
//La funcion de php is_dir está rota y requiere el directorio padre para detectar si un archivo es directorio
-
$d = $directorio."/".$archivo;
-
if (is_dir($d) && ($archivo != "..") && ($archivo != ".")){
-
$menu[$cont] = array("<a href="http://www.nosomoslibres.com/#">".ucwords(strtolower($archivo))."</a>",menu_walk($d));
-
/*
-
* Actualizo el "sistema de ficheros" con el nuevo subdirectorio creado, de tal forma que se pueda actualizar la caché
-
* sin tener que recorrer de nuevo el directorio. De esta forma se puede realizar stat() sobre todos los subdirectorios
-
* y comprobar si han sido actualizados desde la última vez.
-
*/
-
$info = stat($directorio."/".$archivo);
-
//Comrpobamos que el directorio no había sido añadido anteriormente a la caché.
-
if (!in_array($directorio."/".$archivo,$_SESSION[’subdirs’])){
-
$_SESSION[’subdirs’][$directorio."/".$archivo] = $info[’mtime’];
-
}
-
}else{
-
//comprobamos que se trata de un archivo con extensión permitida (html, htm, txt o php)
-
$partes_ruta = pathinfo($archivo);
-
$extension = $partes_ruta[’extension’];
-
$basename = $partes_ruta[’basename’];
-
if (strtolower($extension) == "html" || strtolower($extension) == "htm" || strtolower($extension) == "txt" || strtolower($extension) == "php") {
-
$menu[$cont] = array(basename($basename,".".$extension),"<a href="http://www.nosomoslibres.com/contenedor.php?display=%22.$directorio.%22/%22.$archivo.%22">".ucwords(strtolower(basename($basename,".".$extension)))."</a>");
-
}
-
}
-
}
-
$cont++;
-
}
-
closedir($gestor);
-
return $menu;
-
}
-
}else{
-
echo "El parámetro especificado no es un directorio";
-
return $menu;
-
}
-
}
El código no queda demasiado legible debido a los comentarios y las frases demasiado extensas, pero si lo copiáis a un editor de texto está tabulado y se entiende mejor. menu_walk() actualiza el array menú y el “sistema de ficheros” para que la caché siga funcionando. Existe una función menu_print() que es la encargada de mostrar el menú formateado como es debido. El fichero contenedor.php es el encargado de leer el fichero a mostrar y darle el formato apropiado, como he comentado más arriba. En fin, eso es todo lo interesante. Si alguien quiere ver el código completo o utilizarlo para él, que me lo pida y se lo envío encantado.