No Somos Libres

September 28, 2007

Plantillas para webs en PHP

Filed under: php — Adrián @ 6:48 pm

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:

Code (php)
  1. $info = array();
  2. if (!isset($_SESSION[’subdirs’])){
  3.     $_SESSION[’subdirs’] = array();
  4.     $_SESSION[’subdirs’][$content_dir] = 0;
  5. }
  6. foreach ($_SESSION[’subdirs’] as $key => $value){
  7.     $info = stat($key);
  8.     if ($_SESSION[’subdirs’][$key] != $info[’mtime’]){
  9.         $_SESSION[’subdirs’][$key] = $info[’mtime’];
  10.         $_SESSION[’menu’] = menu_walk($content_dir);
  11.        //echo "ACTUALIZANDO CACHE…<br>";
  12.     }
  13. }

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:

Code (php)
  1.  
  2. function menu_walk ($directorio)
  3. {
  4.     if (is_dir($directorio)){
  5.         if ($gestor = opendir($directorio)) {
  6.             /* El menú se compone de un array de pares (arrays) cuya primera componente es el nombre del directorio o fichero y su segundO
  7.              * componente el enlace
  8.              * al archivo. En el caso de que se trate de un directorio, la segunda componente es un array con los archivos de ese subdirectorio.
  9.              */
  10.             $menu = array();
  11.             $cont = 1;
  12.            //Iteramos en el directorio hasta haberlo leído todo.
  13.             while (false !== ($archivo = readdir($gestor))) {
  14.                 if (strpos($archivo,"_") === 0){
  15.                     //El archivo no debe ser mostrado y por tanto no generamos las entradas de menú.
  16.                 }else{
  17.                     //La funcion de php is_dir está rota y requiere el directorio padre para detectar si un archivo es directorio
  18.                     $d = $directorio."/".$archivo;
  19.                     if (is_dir($d) && ($archivo != "..") && ($archivo != ".")){
  20.                         $menu[$cont] = array("<a href="http://www.nosomoslibres.com/#">".ucwords(strtolower($archivo))."</a>",menu_walk($d));
  21.                         /*
  22.                          * Actualizo el "sistema de ficheros" con el nuevo subdirectorio creado, de tal forma que se pueda actualizar la caché
  23.                          * sin tener que recorrer de nuevo el directorio. De esta forma se puede realizar stat() sobre todos los subdirectorios
  24.                          * y comprobar si han sido actualizados desde la última vez.
  25.                          */
  26.                         $info = stat($directorio."/".$archivo);
  27.                         //Comrpobamos que el directorio no había sido añadido anteriormente a la caché.
  28.                         if (!in_array($directorio."/".$archivo,$_SESSION[’subdirs’])){
  29.                                 $_SESSION[’subdirs’][$directorio."/".$archivo] = $info[’mtime’];
  30.                         }
  31.                     }else{
  32.                         //comprobamos que se trata de un archivo con extensión permitida (html, htm, txt o php)
  33.                         $partes_ruta = pathinfo($archivo);
  34.                         $extension = $partes_ruta[’extension’];
  35.                         $basename = $partes_ruta[’basename’];
  36.                         if (strtolower($extension) == "html" || strtolower($extension) == "htm" || strtolower($extension) == "txt" || strtolower($extension) == "php") {
  37.                             $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>");
  38.                         }
  39.                     }
  40.                 }
  41.                 $cont++;
  42.             }
  43.             closedir($gestor);
  44.             return $menu;
  45.         }
  46.     }else{
  47.         echo "El parámetro especificado no es un directorio";
  48.         return $menu;
  49.     }
  50. }

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.

June 16, 2007

Convertir html en pdf o postscript de manera sencilla

Filed under: php, Informática — Adrián @ 11:51 pm

Html2ps es una forma cómoda de generar pdfs y archivos postscript vía web. A mí me permite trabajar desde cualquier pc y lugar. Desde mi punto de vista, cualquier aplicación que pueda ejecutar en el servidor es un avance en comodidad, sobre todo a la hora de trabajar varias personas en lo mismo. Bueno, fuera de la utilidad, os pongo algunas cosas sobre la instalación y configuración del programa. En primer lugar, podéis descargarlo de aquí: http://www.tufat.com/s_html2ps_html2pdf.htm


Es gratuito. Para instalarlo basta con descomprimirlo en la carpeta del servidor dónde queráis usarlo. Después podéis ir a http://www.tudominio.com/html2ps/public_html/ o donde lo hayáis instalado y os saldrá el conversor vía web. No entraré a hablar sobre las opciones, que son sencillas.
Puede que os de algún error de configuración referido a los permisos de los archivos o directorios. Se puede ver información detallada en el enlace siguiente: http://www.tudominio.com/html2ps/public_html/demo/systemcheck.php
Cambiad los permisos apropiados y a seguir.

Yo obtuve un error que parece ser que es bastante común. Decía algo como “Fatal error: Call to a member function on a non-object in /home/suptrain/public_html/html2pdf/css.rules.page.inc.php on line 378″
La solución -he encontrado otras a posteriori, esta es la que apañé- pasa por modificar la función en la línea 378 en el archivo css.rules.page.inc.php por esta otra:

Code (php)
  1. function parse_css_atpage_declaration($css, &$at_rule, &$pipeline) {
  2.     $parsed = parse_css_property($css, $pipeline);
  3.     if ( ! is_null( $parsed ) ) {
  4.         $properties = $parsed->getPropertiesSortedByPriority();
  5.         foreach ($properties as $property) {
  6.             $at_rule->setCSSProperty($property);
  7.         };
  8.     }
  9. }

Una vez hecho eso, debería funcionar, al menos las opciones de pdf, que son las que yo uso, ya que el ps requiere algunas funcionalidades del lado del servidor que pueden no estar instaladas. No es buena política dejar la url de conversión abierta a todo el mundo, así que convendría pedir algún tipo de autenticación. También sería interesante poder llamar al conversor directamente desde un script en php, de tal forma que pueda integrarse en tu panel de administración o en cualquier programa que estés desarrollando, pero eso va a quedar para otra ocasión.

Powered by WordPress