Consultas avanzadas y plantillas simples

Cuando tenemos un sistema de aplicaciones web multidominio, las tareas como comprobar si un fichero existe cuando está en otro dominio virtual se pueden complicar.

Con el framework zenphp es fácil evitar el problema enfocándolo de una manera práctica y sencilla, he aprendido muchísimo desde que empecé con él en el año 2005, este truco os lo regalo, como todo lo que he hecho en mi trabajo 🙂

Veamos la solución al problema con un ejemplo sencillo: tengo que poner una imagen de miniatura en una parte de la web en cada dominio, pero el usuario es posible que no haya subido ninguna imagen de miniatura y si no lo ha hecho debemos crear un “thumbnail” famoso, pero,..y aquí viene la cuestión del millón de dólares…¿cómo podremos hacer la comprobación de existencia de un fichero si los almacenamos en el servidor principal que es virtual y no queremos crear ningún servicio web porque no queremos perder tiempo?

Lo primero que tenemos que hacer es crear una plantilla HTML con una etiqueta genérica del sistema de plantillas de zenphp (basado en una simple substitución de etiquetas entre #almohadillas# desde un array) de forma que el atributo src será de la forma:

<img src=”http://www.Mi_Dominio.es/#foto1#” width=”290″ height=”135″/>

bien, podéis fijaros que el dominio utilizado es donde reside nuestro almacén de imágenes, y que se restringe a un ancho y alto para mayor seguridad.

El siguiente paso es evidente, vamos a ir al visualizador (concepto mezcla de controlador/vista del patrón mvc), en este caso el de productos, la función que muestra el listado de productos, donde encontraremos en su lista de campos una modificación de foto1 por

if(miniatura<>”,miniatura,id) as foto1

así, le decimos a mysql: si ves que hay miniatura, quiero la miniatura, en otro caso el id de producto, pero lo llamamos en cualquier caso foto1 a este campo, tal como decía en la plantilla HTML.

Ahora, sabremos si el usuario ha usado una miniatura con una simple condición

[php]

if (is_numeric($dato[‘foto1’]))
$dato[‘foto1’] = “img/{$dato[‘foto1’]}/290/135/”; //redimensionada con la original
else
$dato[‘foto1’] = “fotos/thumbs/{$dato[‘foto1’]}”; //miniatura del usuario

[/php]

Lo cual viene a ser, que si es un ID, no hay miniatura y utilizaremos un script básico de creación de thumbnail (con redirección al nuevo fichero creado al terminar la operación de generación) y en otro  caso, muestra la miniatura.

Observar que en la generación de thumbnail con PHP se utiliza como parámetros el ID del producto para extraer la primera imagen y el tamaño, es decir, alto y ancho (290×135).

aquí está la función para crear el thumbnail:

[php]

/**

* Construye una imagen a partir del id de un producto
*  * @param array $datos  */

function img($datos=null){
$foto = $this->padre->bd->seleccion_unica(“foto1 from productos where id=”.intval($datos[0]));
if (!$foto) die(“No existe la imagen”);
//existe el thumbnail?
$w  = isset($datos[1])&&$datos[1]<600&&$datos[1]>20?abs(intval($datos[1])):101;
$h  = isset($datos[2])&&$datos[2]<600&&$datos[2]>20?abs(intval($datos[2])):100;
if (!file_exists(ZF_DIR_PPAL.”fotos/thumbs/$w$foto”)){

//crear el thumbnail

require_once(ZF_DIR_LIBRERIAS.”clase_zen_Imagen.php”);

$zi =& new zen_Imagen(ZF_DIR_PPAL.”fotos/$foto”,ZF_DIR_PPAL.”fotos/thumbs/$w$foto”);

$zi->redimensionar($w,$h);

}

//Redirigir a la imagen thumbnail

header(“Location: /fotos/thumbs/$w$foto”);

}

[/php]

Espero que os sirva y os lo paséis tan bien como en mi caso programando 😉

Automatizando Flash mediante XHTML, DHTML,ActionScript y PHP

Primero deberemos preparar el Flash, con un poco de código en ActionScript para cargar el XML y guardar las variables Flash en el nodo root de la película de forma que así activaremos las animaciones

Después diseñamos el XML como plantilla para zenphp:

así como el JavaScript en otra plantilla, que escribirá el objeto Flash con las variables mediante PHP

sólo queda el PHP, una función simplísima para escribir los contenidos:

Y ya tenemos funcionando el conjunto para cualquier entrada de la base de datos:

Nuevos Videotutoriales : MVC modificado y un proyecto de ensayo


Nuevos videotutoriales han sido añadidos a la sección de documentos de la Forja.

En este caso para explicar como funciona el modelo+visualizador junto con la sencillez de añadir un andamio o Scaffolding.

Se añaden junton con un vídeo del generador de aplicaciones Gtk y el inicio de un ensayo científico sobre la meditación.

Instalar PHP+GTK2 en Linux

  1. Descargar todos los paquetes
    Primero, descargar todos los siguientes paquetes y ten en cuenta el número de versión.

    • pkg-config-0.21 – una herramienta para llevar el control de las banderas de compilación necesarias para las librerías usadas por GTK+ [descargar]
    • glib-2.12.4 – es el núcleo de librerías de bajo nivel que construyen las bases de GTK+ y GNOME [download]
    • libpng-1.2.8 – librería de imagen PNG [download]
      Elige la versión:  .tar.bz2 que contien configure. Es más fácil de compilar.
    • freetype-2.2.1 – un motor de fuentes que provee de una “API” simple y fácil de usar para acceder al contenido de una fuente con un método uniforme, independientemente del formato del fichero. Soporta fuentes escalables en formatos como TrueType o “Type 1” nativo. [download]
    • fontconfig-2.4.0 – le da a Pango la estandarización para la localización de fuentes para poder encontrarlas por sus nombres [download]
    • cairo-1.2.4 – una librería gráfica que soporta vectorización y composición de imágenes. Tanto Pango como GTK+ usan cairo para gran parte de su dibujado. [download]
      Atención: Descarga la versión v1.2.4 (o mayor) directamente de cairographics.org. NO USES la que viene en el ftp ftp://ftp.gtk.org/pub/gtk/v2.10/dependencies/. ¡En mi PC ha causado muchísimos bugs! Encontrarás que gtk+ no te compila si usas cairo-1.2.0. Y el mensaje de error dice que hay un problema con pango, aunque realmente el problema viene de esta versión, cairo-1.2.0 que es la que causa el problema. Además, la v1.2.6. parece que también da algunos errores.
    • pango-1.16.4 – una librería para manejar texto internacionalizado [download]
    • atk-1.9.1 – Herramientas de Accesibilidad [download]
    • gtk+-2.10.12 – la base para php-gtk2 [download]
    • libgnomeprint-2.12.1 – se necesita para gtksourceview [download]
    • gtksourceview-1.6.0 – permite que se pueda mostrar código fuente con numeración automática y coloreado de sintaxis (se usa en el generador) [download]
    • gtk+extra-2.1.1 – contiene un número de útiles widgets incluyendo: GtkSheet, GtkPlot y GtkDirTree [download]
    • php-5.2.3 – php5 [download]
    • php-mysql – módulo de MySQL para PHP5 [download]
    • mysql – Servidor de base de datos MySQL [download]
    • php-gtk-2.0.0beta – php-gtk2 [download]
  2. Librerías de desarrollo de las X-Window
    Haz una rápida comprobación de tu configuración y asegúrate de que tienes las librerías de desarrollo de las X instaladas…
  3. Variables de entorno necesarias
    Si estás usando bash, establece las siguientes variables:
    CPPFLAGS="-I/usr/local/include"
    LDFLAGS="-L/usr/local/lib"
    PKG_CONFIG_PATH="/usr/local/lib/pkgconfig"
    LD_LIBRARY_PATH="/usr/local/lib"
    PATH="/usr/local/bin:$PATH"
    export CPPFLAGS LDFLAGS PKG_CONFIG_PATH LD_LIBRARY_PATH PATH

    Si usas csh o tcsh, añade lo siguiente a tu $HOME/.cshrc
    setenv CPPFLAGS "-I/usr/local/include"
    setenv LDFLAGS "-L/usr/local/lib"
    setenv PKG_CONFIG_PATH "/usr/local/lib/pkgconfig"
    setenv LD_LIBRARY_PATH "/usr/local/lib"

    setenv PATH /usr/local/bin:${PATH}

  4. Compilar GTK+ primeroAtención: Para todos los paquetes, usa el ./configure por defecto. Los ficheros compilados irán a /usr/local/lib y /usr/local/include.

    Orden de compilación:

    1. Compilar glib-2.12.4
      tar xvzf glib-2.12.4.tar.gz
      cd glib-2.12.4
      ./configure
      make

      sudo make install
    2. Compilar libpng-1.2.12
      bunzip2 libpng-1.2.12.tar.bz2
      tar xvf libpng-1.2.12.tar
      cd libpng-1.2.12
      ./configure
      make

      sudo make install
    3. Compilar freetype-2.2.1
      tar xvzf freetype-2.2.1.tar.gz
      cd freetype-2.2.1
      ./configure
      make

      sudo make install
    4. Compilar fontconfig-2.4.0
      tar xvzf fontconfig-2.4.0.tar.gz
      cd fontconfig-2.4.0
      ./configure
      make

      sudo make install
    5. Compilar cairo-1.2.4
      tar xvzf cairo-1.2.4.tar.gz
      cd cairo-1.2.4
      ./configure
      make

      sudo make install
    6. Compilar pango-1.16.4
      tar xvzf pango-1.16.4.tar.gz
      cd pango-1.16.4
      ./configure
      make

      su (entrar como root)
      make install
      Atención: Algunos de vosotros encontraréis errores en este punto. No preocuparse. Esto es porque necesitas volver como usuario normal (que no administrador), y las variables de entorno previamente definidas lo están para la cuenta de usuario,y no para root. Sólo tienes que volver a especificarlas como root y volver  a lanzar
      make install
      “on more time” :] Todo debe de funcionar ahora.
    7. Compilar atk-1.9.1
      bunzip2 atk-1.9.1.tar.bz2
      tar xvf atk-1.9.1.tar
      cd atk-1.9.1
      ./configure
      make

      sudo make install
    8. Compile gtk+-2.10.12
      tar xvzf gtk+-2.10.12.tar.gz
      cd gtk+-2.10.12
      ./configure
      make

      su (entrar como root)
      make install
      Atención: Aquí es posible que encontréis otro error, igual que antes,el problema es por las  variables de entorno definidas como usuario que también necesitan ser declaradas como root, entonces se puede hacer make install de nuevo, y todo debe de ir bien.
      Si gtk+ compila ok, debe de haber una gtk-demo en /usr/local/bin. Ahora puedes probar que gtk+-2.10.6 está funcionando si la ejecutas.
  5. Añadir componentes adicionales útiles — GtkSourceView y GtkExtraGtkSourceView permite visualizar código fuente con coloreado automático así como autonumeración de líneas.
    • Primero compila libgnomeprint-2.12.1
      bunzip libgnomeprint-2.12.1.tar.bz2
      tar xvf libgnomeprint-2.12.1.tar
      cd libgnomeprint-2.12.1
      ./configure
      make

      sudo make install
    • Ahora compila gtksourceview-1.6.0
      tar xvzf gtksourceview-1.6.0.tar.gz
      cd gtksourceview-1.6.0
      ./configure
      make

      sudo make install
    • Compila gtk+extra-2.1.1
      tar xvzf gtk+extra-2.1.1.tar.gz
      cd gtk+extra-2.1.1
      ./configure
      make

      sudo make install
  6. Compila php-5.2.3
    • Primero necesitas compilar php5
      tar xvzf php-5.2.3.tar.gz
      cd php-5.2.3
      ./configure --prefix=/usr/local/php-5.2.3 --disable-cgi
      make

      sudo make install
    • Crear php.ini y añadir la extensión de php_gtk2.so:echo extension=php_gtk2.so >> /usr/local/php-5.2.3/lib/php.ini
      /usr/local/php-5.2.3/bin/php-config --extension-dir | xargs echo 'extension_dir=' >> /usr/local/php-5.2.3/lib/php.ini
  7. Compilar php-gtk-2.0.0
    • Construir configure
      tar xvzf php-gtk-2.0.0beta.tar.gz
      cd php-gtk-2.0.0
      ./buildconf --with-phpize=/usr/local/php-5.2.3/bin/phpize
    • Compilar php-gtk2
      Atención: No olvides usar “–enable-sourceview –enable-gtkextra” en tu configure para que se incluyan gtksourceview y gtkextra.

      ./configure --prefix=/usr/local/php-gtk-2.01 --enable-sourceview --enable-gtkextra --with-php-config=/usr/local/php-5.2.3/bin/php-config
      make

      sudo make install

Para llamar más fácilmente a php-gtk, crea un enlace simbólico al binario:
ln -s /usr/local/php-5.2.3/bin/php /usr/bin/php-gtk2

Si tu variable de entorno PATH contiene /usr/bin, puedes ejecutar los scripts PHP usando:
php-gtk2 script.php

Comunicando tecnologías : PHP + mySQL + AJAX + PERL + DHTML

Hoy se suponía que iba a estar recogiendo la aceituna pero ayer salimos para desquitarnos un poco a una fiesta de americanas xD asi que imposible varear nada ,entonces he picado un poco de artículo matinal 🙂 por cierto habis visto el Wii Aceitunero?

Cambiando de tema,…esto es un ¡Todo en uno!

Mi reto ha sido hoy sincronizar las tecnologías PHP + mySQL + AJAX + PERL + DHTML en un sólo script.

La idea es:

  • Una ventana con 2iframes, en uno se añaden los ficheros , se envían comprobando el estado con un script PERL/CGI su estado que es actualizado en la ventana en su iframe por medio de AJAX y al llegar a completarse dicha transferencia se envia una señal al segundo iframe que inserta una entrada en la BD con el nuevo fichero.
  • Todo ésto con comprobaciones de sesiones en PHP gracias a zenphp…y Funciona! pero bendito internet explorer, con navegadores como este podemos decir que el trabajo de programador web no está bien pagado ni mucho menos…porque me hace reescribir las aplicaciones 2 veces, …para el ie no es lo mismo :
    parent.document.getElementById(‘frm_Ficheros’).contentDocument.getElementById(‘frmSubeFicheros’);
    que:
    window.fileUpload.window.parent.frm_Ficheros.document
    lo mejor es que tengo el ie4linux y SI me dice donde está el error, y en windows no…es irónico ¿no?

Bueno,como viene siendo habitual, una captura:

Continue reading