Entradas

Mostrando entradas de 2010

Cómo personalizar la página site-offline

Imagen
La página site-offline se muestra cuando ponemos el sitio en mantenimiento (admin/settings/site-maintenance), o cuando Drupal no puede conectarse a la base de datos. Aquí me refiero al segundo caso. Para probar esta característica, puede apagar el servidor de base de datos. También puede cambiar temporalmente el archivo sites/default/settings.php poniendo parámetros erroneos de conexión. Por ejemplo: sites/default/settings.php ... #$db_url = 'mysqli://mydatabase:clave@localhost/mydatabase'; $db_url = 'mysqli://mydatabase:clave_erronea@localhost/mydatabase'; ... 1 En sites/default/settings.php, indicar el nombre del tema que contendrá a maintenance-page-offline.tpl.php, la página personalizada. Hay unas líneas que se pueden descomentar para eso, pero quizás lo más sencillo sea agregar las que necesitamos al final. Por ejemplo, usaré el tema minnelli, que viene por default con Drupal: sites/default/settings.php ... $conf['maintenance_theme'] = '

Debug con Xdebug y Aptana (y Notepad++)

Imagen
Aunque quizás llevo bastante tiempo desarrollando aplicaciones web, no me había preocupado mucho por encontrar un modo de hacer depuración línea por línea (como lo hacía cuando estudiaba Turbo Pascal... cuantos años ya). No creía que se podría hacer con comodidad. Suponía que el procedimiento era demasiado técnico o se requería de un IDE pesado o costoso. Por ejemplo, en Java, no llegué a hacerlo. Ni siquiera con las aplicaciones no web. Quizás porque fueron muy pocas o muy pequeñas como para sentir la necesidad. Con PHP, he sentido muchas veces la necesidad, pero hasta ahora había podido sobrevivir poniendo echo y print_r. Pero ahora, trabajando con Drupal, aunque el código es relativamente claro, hay varios paradigmas de organización conviviendo y con frecuencia no sé por donde entrar. Hay documentación, pero muchas veces siento que sólo parece aumentar las sombras del bosque. Usar la técnica de echo y print_r es util, como dejar migajas en el camino, pero puede ser algo tedi

Cómo quitar el historial del perfil del usuario

En el perfil del usuario (el mostrado en el url user) aparece " Historial, Miembro desde... ". A veces se desea que no aparezca esa información. Ocultarlo Una forma de hacerlo es ocultarlo. Por ejemplo localizando el elemento y aplicándole CSS para eso: En algún .css del tema: .profile h3, .profile .user-member {   display: none; } Quitarlo Otra forma de hacerlo es quitarlo, que ni siquiera se genere el HTML. Con el template Una forma de quitarlo es copiando al tema el template /modules/user/user-profile-category.tpl.php y agregar una línea que prevenga la presentación. Por ejemplo: themes/ttt/user-profile-category.tpl.php <?php if ($title == t('History')) return; ?> <?php if ($title) : ?>   <h3><?php print $title; ?></h3> <?php endif; ?> <dl<?php print $attributes; ?>>   <?php print $profile_items; ?> </dl> Con una función del template Otra forma de quitarlo es modificando las variables de tem

Un pr() para Drupal

pr() es un comando que suelo usar mucho en CakePHP para revisar el valor de una variable. En Drupal, hay comandos como dsm() pero, a veces, lo que requiero es algo tan simple como lo que hace pr(). Al no encontrar un comando igual de práctico, que funcionara tanto en los templates como en los módulos, y sin instalar ningún módulo extra, uso una solución rápida que consiste en colocar el siguiente código al final del archivo sites/default/settings.php: function pr($x, $return=TRUE, $set_message=TRUE) { $output = '<xmp>'; $output .= print_r($x, TRUE); $output .= '</xmp>'; if ($set_message) { drupal_set_message($output); } if ($return) { return $output; } else { echo $output; } } $return=TRUE permite asignar el valor de salida a una variable. $set_message permite mostrarlo con drupal_set_message.

Un año después

Imagen
HACE COMO un año empecé a aprender Drupal, animado por las cosas buenas que escuchaba de él. Como que fue elegido para el portal de la Casa Blanca. Luego me enteré que además era usado por El Comercio, los Grammys, MTV, y en los portales de muchos artistas famosos. Inspirado por esos ejemplos, empecé consultando algunos libros y tratando de hacer sites. Tal vez soy un poco cabeza dura. Tal vez me cuesta algunas cosas más que a la mayoría. Recuerdo que tarde meses en comprender MVC. Ya va siendo un año y recién empiezo a sentir atisbos de comprensión en Drupal. No es que no pueda hacer cosas con él. Puedo usarlo, configurarlo, definir tipos, hacer vistas, programar módulos, personalizar plantillas... pero el hecho de poder hacer algo no es lo mismo que comprenderlo. Me gusta Drupal. Es realmente muy interesante. Cuando trabajo con él, me siento asombrado de la comodidad con que permite hacer algunas cosas que normalmente son complicadas, como la administración del sitio y la col

Hello SimpleTest

Imagen
Este es un ejemplo trivial donde uso  SimpleTest  para comprobar el módulo HelloWorld . Entorno Windows 7 Pro Drupal 6.19 XAMPP 1.7.1 para Windows Aptana Studio 2.0.4 Módulo  SimpleTest 6.x-2.10 Procedimiento Tengo creado el módulo HelloWorld: helloworld.info ; $Id$ name = Hello World description = Hello World simple module core = 6.x package = Hello helloworld.module <?php // $Id$ /**  * Implementation of hook_menu()  */ function helloworld_menu() {   $items = array();      $items['helloworld'] = array(     'title' => 'Hello World',     'page callback' => 'helloworld_page',     'access arguments' => array('access helloworld content'),     'type' => MENU_NORMAL_ITEM,   );      return $items; } /**  * Return content  */ function helloworld_page() {   $greeting = variable_get('helloworld_greeting', ' Hello World! ');      $content = '<div id="helloworld_block"><

Instalando SimpleTest

Imagen
SimpleTest es un módulo que permite usar unit testing (test unitarios) en la programación de Drupal. Entorno Windows 7 Pro Drupal 6.19 XAMPP 1.7.1 para Windows Aptana Studio 2.0.4 Ingredientes Módulo SimpleTest 6.x-2.10 Procedimiento drush dl simpletest Antes de activar el módulo, revisé el archivo INSTALL.txt. Allí, indican que el primer paso es aplicar el parche D6-core-simpletest.patch a Drupal core. Para aplicar el parche, uso Aptana Studio. Como el directorio del site aún no era un proyecto de Aptana, lo ubico en la pestaña File, click secundario, Promote to Project... Una vez que el site ya figura bajo Projects, en la misma pestaña File, click secundario, Team, Apply Patch... Luego indico aplicar modules/simpletest/D6-core-simpletest.patch en el site. Usando el administrador de Drupal, indico activar el módulo SimpleTest. Obtengo un mensaje que dice que no se puede activar el módulo porque el php no tiene la biblioteca curl (uno de los requisitos). Edito el ar

Actualizando el Drupal Core con Drush

Imagen
Supongamos que mydrupal es un site drupal-6.17, cuyo core deseo actualizar a drupal-6.19. El paso cero , es hace un backup adecuado del site. Eso significa parquear la aplicación (Administer, Site configuration, Site maintenance, Site status: Off-line) , limpiar el caché (Administer, Site configuration, Performance, Clear cached data; ó drush cc all ) , hacer un backup del directorio mydrupal, y hacer un backup de la base de datos usada por mydrupal. Luego, damos el primer paso :-) La idea es sobrescribir mydrupal con el nuevo drupal y luego correr el script de actualización. Una forma es bajando drupal-6.19.tar.gz, descomprimiéndolo, y luego copiando o moviendo sus subdirectorios dentro de mydrupal. Hecho eso, ejecutar el script de actualización, por ejemplo entrando a http://localhost/mydrupal/update.php Pero, ¿cómo hacerlo con drush? . En la ayuda ví que hay una opción sup , pero no la llegué a entender, sorry. Pero encontré este post , donde usan un truco que sí ent

Resolviendo Drupal multisite

Imagen
Aunque la instalación y configuración inicial de Drupal es relativamente sencilla y directa, configurarlo para que varios sites compartan el mismo motor fue, para mí, casi un dolor de cabeza... Continúe leyendo aquí .

Instalando Drupal en un directorio con alias

Imagen
Normalmente, los sites drupal que creo en mi XAMPP (1.7.1, bajo Windows 7) reconocen que pueden habilitar la opción de URL limpios. Sin embargo, no fue ese el caso cuando creé un site drupal en un directorio con alias. Cree el directorio con alias dropbox , indicando en el httpd.conf de apache la siguiente configuración: ... <IfModule alias_module>   ...   Alias /dropbox " C:/Users/Rulo/Documents/My Dropbox/htdocs "   ... </IfModule> <Directory " C:/Users/Rulo/Documents/My Dropbox/htdocs ">     Options Indexes FollowSymLinks Includes ExecCGI      AllowOverride All     Order allow,deny     Allow from all </Directory> ... De ese modo, puedo navegar por http://localhost /dropbox . Llevo usando Dropbox unas semanas y me gusta mucho cómo me permite manejar mis archivos. Configurando apache de esta forma en la casa y también en el trabajo, puedo continuar cómodamente el proyecto sin preocuparme mucho en los detalles de la s

Drupal como framework genérico

Imagen
El sábado 24 de Julio asistí al Drupal Camp de Invierno que organizó Drupal Peru. Fue mi segunda asistencia a este tipo de evento. La primera fue en Mayo, para el Drupal Camp de Verano. Llevo aprendiendo Drupal desde noviembre del 2009; aproximádamente 9 meses. Al usar Drupal como CMS he podido comprobar que algunas cosas que uno supone difíciles resultan fáciles (como la administracion de usuarios). Pero otras cosas resultan más difíciles de lo que uno espera (como el manejo de formularios). Pienso que es porque el framework recién está saliendo a flote y a veces hay que bucear un poco para encontrar las cosas que uno quiere ver. En la época del Drupal Camp de Verano estaba un poco desorientado en el tema de usar Drupal como un framework genérico. En algún lugar había leído insinuar esa posibilidad, pero no había logrado encontrar pistas claras al respecto. En este evento oí que, de hecho, se usaba de ese modo en el diario El Comercio. Eso me alentó en la tarea. En este Camp d

Numberguess en Drupal

Imagen
HAY ALGUNOS ejecicios básicos que me gusta practicar cuando aprendo un framework. Aunque los tutoriales hagan otros, más reales o útiles, estos me siguen pareciendo un buen punto de partida. El primer ejercicio es Hola Mundo . Hacer aparecer el tradicional saludo "¡Hola Mundo!". El siguiente ejercicio es Hola Tú . Recojer un nombre, por ejemplo "Antonio" y hacer aparecer el saludo "¡Hola Antonio!". Luego está Numberguess , un poco más exigente en el manejo de formularios. Hola Mundo En Drupal no es obvio cómo hacer el Hola Mundo . Pero luego de un tiempo experimentando con el Drupal básico, uno puede encontrar que es posible definir un bloque y hacer aparecer el mensaje allí. Pero eso es en un bloque, ¿y si quisiera que fuera en una página, con un url propio? Para ese caso, se define un módulo. Eso ya es entrar en el terreno del Drupal intermedio. Hay que aprender el protocolo para definir módulos. Y, principalmente, lo que son los hooks. El c

Mostrando imágenes grandes con Zoomify

Imagen
Imagine que necesita mostrar una imagen muy grande en su página web. Una imagen jpeg de 640x480 mide alrededor de 100 KB y puede tardar un par de segundos en cargar en una conexión típica. Una imagen de 2000x3000 mide más de 1 MB y tardaría como un minuto. Zoomify permite navegar sobre una imagen muy grande usando un componente flash que carga sólo las imágenes necesarias para mostrar cierta porción de ella. Es posible desplazarse, acercarse y alejarse. Puede ver un ejemplo de uso directo de Zoomify aquí . Instalación Descargué ZoomifyExpress (disponible gratuitamente tanto para Windows como para Mac... pero anímese, más abajo describo cómo se puede usar con Drupal en Linux), y lo descomprimí. La carpeta resultante, ZoomifyExpress4, se puede colocar en cualquier lugar de su disco; no necesita instalación. Contiene tanto el visor flash ZoomifyViewer.swf, como el preprocesador de imágenes Zoomify Converter.exe, usado para generar los mosaicos que serán cargados por el visor según

Moviendo Drupal

Imagen
Pensaba que mover un sitio drupal era siempre fácil, pero no necesariamente. El procedimiento báse consiste en: Preparar el sitio de origen (desactivar Clean URL y hacer Clear Cache) Hacer un backup de la base de datos del sitio de origen. Preparar el sitio destino (un sitio drupal básico) . Importar ese backup en la base de datos del sitio de destino. Copiar los archivos de los directorios modules y files que sea necesario. Sin embargo, hay algunas cosas importantes que tener en cuenta. Principalmente si se trabaja con un sitio tipo multisite. Multisite es un tipo de configuración de drupal que permite que varios sitios compartan el mismo motor drupal. Puede encontrar un poco más de información sobre esto en el post Resolviendo Drupal Multisite . Cuando un sitio drupal sube un archivo, por ejemplo una imagen, guarda su ubicación en la base de datos, incluyendo el nombre del sitio. Así que si el sitio de destino tiene un nombre diferente, después de la importación tendrá probl

Resolviendo HTTP request status Fails

Imagen
Usando Drupal 6.16 con XAMP 1.7.1 en Windows 7 Home Basic obtengo este error: HTTP request status Fails Your system or network configuration does not allow Drupal to access web pages, resulting in reduced functionality. This could be due to your webserver configuration or PHP settings, and should be resolved in order to download information about available updates, fetch aggregator feeds, sign in via OpenID, or use other network-dependent services. Al parecer, Drupal no logra encontrarse a sí misma. Pude solucionarlo entrando a C:\Windows\System32\drivers\etc\hosts y asegurándome que estuviera descomentada la línea: 127.0.0.1       localhost Referencia: HTTP request staus fails

Drush en Windows 7

Imagen
Drush es una utilidad Drupal que funciona en línea de comandos y permite descargar módulos, activarlos y desactivarlos, entre otras cosas. Aunque algunas personas no se sienten muy bien frente a una consola de comandos, en realidad puede ser tu mejor amiga. Cuestión de buscar conocerla un poco mejor. Una de las ventajas de los comandos escritos es que son muy fáciles de registrar. Basta con ir copiándolos a un archivo de texto. Luego, puedo reproducir fácilmente todos los pasos que hice. Es una manera de automatizar. Con los clics es un poco más complicado. Instalando Drush en Windows 7 Usando Windows 7 Home Basic 64, Drupal 6.16, Drush 3. Drush es un conjunto de scripts que se tienen que colocar en un directorio que sea parte del path de ejecutables (la que en Windows está definida por la variable de entorno Path). Por ejemplo, descomprimo drush-All-versions-3.0.tar.gz y lo coloco en C:\bin\dev\drush\ Me aseguro de que ese directorio esté en el path (WIN+PAUSA para informac

Al fín, Hello World!

Imagen
Siguiendo la guía de un libro había hecho un par módulos, pero sin entender realmente lo que hacía. Ayer asistí al Drupal Camp Perú 2010. En la conferencia de Fernando P. García, "Cómo hacer tu primer módulo en Drupal 6", él siguió un enfoque algo diferente al que había visto en los libros. Partió de lo que quería que apareciera en la página, dada una ruta, y cómo sería el módulo para lograrlo. Usó el hook_menu(). Hello World! Basado en el módulo que mostró Fernando, practiqué en casa hacer un módulo que simplemente dijera 'Hello World!'. Por alguna razón, cuando eso me resulta me siento más seguro para poder continuar :) Lo que deseo es un módulo que, al ingresar a la ruta helloworld , muestre 'Hello World!' . En el directorio modules apropiado, creé el directorio helloworld, y dentro los archivos helloworld.info y helloworld.modules. helloworld.info name = Hello World description = Hello World module core = 6.x helloworld.module /**  * Impleme

Frameworks y Drupal

Imagen
Framework... con qué se come? Recuerdo que, cuando empecé a programar en PHP, navegando por Internet encontraba algunas veces la palabra framework . Primero pasaba de largo, pensando que todavía estaría lejos el momento en que estuviera listo para abordar algo que, seguramente por complejo, no había visto en los tutoriales o libros introductorios de PHP. Quizás deberían hablar más sobre eso. Alguna vez bajé un framework e intenté hacer algo, pero lo dejaba después de un rato, frustrado por no entender dónde poner las cosas para lograr las cosas que quería. Ya había desarrollado algunas aplicaciones web, principalmente usando el JSP del mundo Java. Con PHP todo era similar pero más simple y ligero, más directo y más rápido, y me empezaba a gustar. Pero no entendía lo de los framework. Luego, estuve encargado del desarrollo de una aplicación web que debía ser hecha con Struts 1.1. Tardé como un mes en darme cuenta que el framework determinaba una secuencia de trabajo. Eso era. P