Monthly Archives: August 2009

Como obtener los nodos de un tipo específico en Drupal 6 desde API

Introducción.

En algunos casos puede ser útil obtener desde un fragmento de código PHP utilizando el API oficial, los nodos de un portal basado en Drupal 6 que correspondan con un tipo específico (file, story, event, page, …).  Esto se puede hacer fácilmente de la siguiente manera.

Procedimiento.

Obtener el listado con la información general de los nodos del tipo específico.  Para esto se consulta la tabla node que contiene la siguiente información de los nodos.

nid         int(10)           # ID del nodo.
vid         int(10)           # ID de la versión del nodo.
type        varchar(32)       # Tipo del nodo.
title       varchar(255)      # Título.
uid         int(11)           # ID del propietario.
status      int(11)           # Estado (publicado = 1; sin publicar/oculto = 0)
created     int(11)           # Timestamp de la creación del nodo.
changed     int(11)           # Timestamp de la modificación del nodo.
comment     int(11)           # Estado de comentarios (desactivados = 0; sólo lectura = 1; activados = 2).
promote     int(11)           # Promocionado a la página principal (no = 0; si = 1).
moderate    int(11)           # Moderado
(no = 0; si = 1).
sticky      int(11)           # Pegajoso (no = 0; si = 1).
language    varchar(12)       # Código del idioma.
tnid        int(10)
translate   int(11)

La consulta básica se puede realizar de la siguiente manera.

$sql = "SELECT nid
        FROM {node}
        WHERE type = 'TIPO_DE_NODO' AND
              status = 1
        ORDER BY created DESC";
$results = db_query($sql);

Posteriormente se iteran los resultados obtenidos de la consulta y se carga la información completa de cada uno de los nodos.

while ($result = db_fetch_object($results))
{
    $node = node_load($result -> nid);
}

El contenido del nodo recuperado dependerá en cierta medida de los módulos instalados que alteran su estructura.  Para mostrar por ejemplo el título, la fecha de creación, el mensaje y la fecha de modificación de una noticia se utiliza el siguiente fragmento.

echo 'Titulo: ' . $node -> title . '<br />';
echo 'Fecha: ' . format_date($node->created) . '<br />';
echo 'Mensaje: ' . $node->body . '<br /><br /><hr /><br />';
echo 'changed on: ' . format_date($node->changed, 'custom', 'Y-m-d H:i:s O') . '<br />';

Enlaces.

Probando Compiz con una tarjeta Intel 965 bajo Ubuntu 9.04

Introducción.

Mi portátil, un Dell Vostro 1400, tiene una tarjeta de video sencilla Intel 965.  La aceleración gráfica de este modelo es bastante limitada, sin embargo es mas que suficiente para mis requerimientos personales en este rubro.

Con la versión 8.10 de Ubuntu funcionaba decentemente sin embargo con la actualización a 9.04 el Compiz dejo de funcionar.  La explicación es amplia, aparentemente hicieron cambios profundos en los drivers de Intel y en el sistema de ventanas que parecen no estar del todo completos aún.

El día de hoy estuve experimentando un poco con el video e hice funcionar al Compiz con poco esfuerzo.

Procedimiento.

Como primera medida actualicé el kernel a la versión 2.6.30 la cual he escuchado colabora a la mejora de los problemas reportados con las tarjetas Intel.

Después desactivé el compositing manager de Gnome que interfería con el de Compiz de la siguiente manrera.

  1. Presionar ALT+F2: abrir Run Application.
  2. Ejecutar la aplicación gconf-editor.
  3. Navegar por las ramas del árbol izquierdo: / > Apps > Metacity > General.
  4. En el panel derecho desactivar la casilla correspondiente a la llave compositing_manager.
  5. Seleccione File > Quit para terminar la configuración.

Finalmente activé el Compiz.

$ compiz –replace

O desde la interfaz gráfica realizando los siguientes pasos.

    1. System > Preferences > Appearance.
    2. Seleccionar la hoja de efectos visuales (Visual Effects).
    3. Activar la opción Normal.
    4. De ser exitosa la activación se deberá confirmar.
    5. Cerrar el diálogo de propiedades de apariencia.

Solución de problemas.

Para encontrar que estaba entorpeciendo el funcionamiento del Compiz en mi equipo encontré que el script compiz-check es un buen aliado.  Estos fueron los pasos que seguí para su instalación y ejecución.

$ wget http://blogage.de/files/9124/download -O compiz-check

$ chmod +x compiz-check

$ ./compiz-check

Enlaces.

Como personalizar la barra de idiomas en Drupal 6

Introducción.

Después de instalar y configurar los módulos para mantener las traducciones del contenido en el portal basado en Drupal 6, el siguiente paso era crear la barra de banderas que permitiera cambiar fácilmente entre los distintos idiomas del portal.

BarraIdiomas

Procedimiento.

  1. Instalar el módulo Consistent Language Interface que provee al bloque Consistent Language Interface block (languageinterface).
    http://drupal.org/project/languageinterface
  2. Editar page.tpl.php e incluír el siguiente fragmento de código donde se desea la barra de banderas.
    <?php
        $flags = module_invoke('languageinterface', 'block', 'view', 0);
        print $flags['content'];
    ?>
  3. Personalice la presentación de la barra con CSS ya que su estructura es básicamente una lista no ordenada.  Para establecer la distribución horizontal como la de la imagen propuesta, agregue el siguiente código en la hoja de estilos del tema.
    #language-interface
    {
        padding: 0;
        margin: 0;
    }
    #language-interface li
    {
        display: inline;
        list-style-type: none;
        padding: 0;
        margin: 0px 5px 0px 0px;
        height: 12px;
    }
  4. Si desea puede además establecer estilos particulares para cada idioma, la clase CSS deberá llamarse igual que el código del idioma.  Además es posible resaltar al idioma actual utilizando la clase active.

Enlaces.

Mejorando la creación de contenido traducido con Drupal 6

Además de los pasos realizados para la configuración y edición del contenido traducido en Drupal 6 recientemente he instalado algunos módulos adicionales que permiten mayor flexibilidad en su mantenimiento como el hecho de tener una barra para cambiar el idioma desplegado, controlar que nodo es la traducción a otro idioma de otro, cuales idiomas ya han sido traducidos de un nodo, traducción de partes del portal como cadenas, taxonomía y encuestas, y mostrar la versión original de un nodo si el idioma requerido aún no se encuentra disponible.

Los siguientes módulos requieren que los idiomas del sitio se encuentren definidos (?q=admin/settings/language) y que el Language Negotiation (?q=admin/settings/language/configure) deba ser Path prefix only o Path prefix with language fall-back.

?q=admin/settings/language/configure

Personalizar el formulario de login en Drupal 6

Procedimiento.

Editar el archivo template.php y agregar la siguiente función (el nombre es libre).

function phptemplate_generarFormularioLogin()
{
   $form_id = 'user_login';
   $form = array();
   $form['name'] = array(
      '#type' => 'textfield',
      '#maxlength' => USERNAME_MAX_LENGTH,
      '#required' => TRUE,
      '#attributes' => array('tabindex' => '1',
      'class' => 'registro'),
   );
   $form['pass'] = array(
      '#type' => 'password',
      '#required' => TRUE,
      '#attributes' => array('tabindex' => '2',
      'class' => 'registro'),
   );
   $form['submit'] = array(
      '#type' => 'submit',
      '#value' => t('Log in'),
      '#weight' => 2,
      '#attributes' => array('tabindex' => '3')
   );
   $form['#validate'] = user_login_default_validators();
   $form['#build_id'] = sprintf('form-%s', md5(uniqid(mt_rand(), TRUE)));
   $form_state = array();
   drupal_prepare_form($form_id, $form, $form_state);
   drupal_process_form($form_id, $form, $form_state);
   $out = new stdClass;
   $out->form_start = sprintf("<form method='post' accept-charset='UTF-8' action='%s'>",
                             url('user/login'));
   $out->form_end = "</form>";
   $out->name = drupal_render($form['name']);
   $out->pass = drupal_render($form['pass']);
   $out->submit = drupal_render($form['form_id']) .
   drupal_render($form['form_build_id']) .
   drupal_render($form['submit']);
   return $out;
}

Insertar en el lugar deseado de page.tpl.php el siguiente fragmento de código o su correspondiente personalización.

<?php $login_form = phptemplate_generarFormularioLogin(); ?>
<?php print $login_form -> form_start; ?>
    Usuario &nbsp; <?php print $login_form->name; ?> &nbsp;&nbsp;&nbsp;
    Contraseña &nbsp; <?php print $login_form->pass; ?>&nbsp;&nbsp;
    <?php print $login_form->submit; ?>
<?php print $login_form->form_end; ?>

Enlaces.

Compactando los discos de Virtualbox con Linux Ubuntu como cliente

Introducción.

Cuando se crean discos virtuales en Virtualbox de tipo dinámico (Dynamically Expanding), a diferencia del estático (Fixed-size), el archivo que lo representa no se crea inicialmente del tamaño solicitado sino que este crece hasta el tamaño elegido a medida que se van agregando archivos.

Después de cierto tiempo de uso, de copiar y borrar archivos, es posible que este termine con un tamaño mayor al tamaño de los archivos que efectivamente contiene, esto quiere decir que hubo un momento en que contenía tal cantidad de información pero que es suceptible ahora de ser compactado.  Esta tarea se puede realizar de cuando en cuando para optimizar el tamaño de estos archivos.

Para este artículo se deberá tener en cuenta que el sistema operativo instalado en la máquina virtual cliente es Linux XUbuntu.

Pasos previos.

  • Liberar todo el espacio posible removiendo los archivos y aplicaciones instaladas que ya no sean necesarios.
  • Remover los archivos temporales que ya no sean necesarios.
  • Limpiar el caché e información fuera de línea del navegador.
  • Remover el caché de los paquetes instalados.

    $ sudo aptitude purge
    $ sudo aptitude clean

Procedimiento.

  1. Inicie la máquina virtual a compactarse desde el live-cd de instalación, ya sea físicamente insertado en la unidad o desde su imagen ISO.

    Configuración del CDROM en Virtualbox.

    Configuración del CDROM en Virtualbox.

  2. Seleccione la opción Try XUbuntu without any change to your computer.

    Inicio del livecd.

    Inicio del livecd.

  3. Instale la aplicación zerofree.
    Instalación de ZeroFree.

    Instalación de ZeroFree.

    $ sudo aptitude install zerofree

  4. Ejecute zerofree de la siguiente manera.

    $ sudo zerofree /dev/sda1

    /dev/sda1 deberá corresponder con la partición que se desea limpiar, ajúste su valor según corresponda en su máquina virtual.  Este paso puede tomar un tiempo proporcional a la cantidad de espacio libre que tenga la unidad.

  5. Al terminar la ejecución de zerofree apague la máquina virtual.
  6. En el huésped abra una consola y acceda al directorio donde se encuentra el archivo que representa el disco a compactar.  En mi caso:

    $ cd /VirtualMachines/XUbuntu9.04
    $ ls -l

    -rwxrwx— 1 root plugdev 3670049280 2009-08-13 19:14 MyHardDrive.vdi

  7. Ejecute el siguiente comando para compactar la unidad.

    $ sudo VBoxManage clonehd MyHardDrive.vdi /VirtualMachines/XUbuntu9.04/MyClonedDrive.vdi

    Reemplace el nombre MyHardDrive con el nombre del archivo del disco duro y MyClonedDrive con un nombre para la copia del archivo del disco duro que se va a generar.

    Es importante establecer la ruta absoluta donde se desea almacenar la copia resultante, /VirtualMachines/XUbuntu9.04/ en este caso, porque de lo contrario será automáticamente almacenada en ~/.VirtualBox/HardDisks/.

  8. Renombre al archivo inicial del disco duro.

    $ mv MyHardDrive.vdi MyHardDrive.vdi.original

  9. Renombre la nueva versión del archivo a su nombre original o el que considere necesario.

    $ mv MyCloneDrive.vdi MyHardDrive.vdi

  10. En la consola de Virtualbox seleccione la máquina virtual y la sección de Hard disks.
  11. Seleccione el disco duro modificado y el icono de Remove attachment.

    Configurar el nuevo disco duro.

    Configurar el nuevo disco duro.

  12. Seleccione el disco duro antigüo y presione los botones de liberar (Release) y remover (Remove).

    Liberar y remover al disco duro antigüo.

    Liberar y remover al disco duro antigüo.

  13. Presione el botón de agregar (Add) y seleccione el nuevo archivo de la imagen del disco.  Para este caso sería /VirtualMachines/XUbuntu9.04/MyHardDrive.vdi.

    Agregar el nuevo disco a la máquina virtual

    Agregar el nuevo disco a la máquina virtual

  14. Presione el botón de seleccionar (Select) y posteriormente el de aceptar (Ok).
  15. Desmote el CDROM de instalación de XUbuntu.

    Desmontar CDROM de la máquina virtual.

    Desmontar CDROM de la máquina virtual.

  16. Inicie la máquina virtual para verificar el correcto funcionamiento del nuevo disco duro compactado.
  17. En caso de estar funcionando todo perfectamente puede si lo desea remover el archivo antigüo de la unidad de disco.  Para este caso:

    $ rm /VirtualMachines/XUbuntu9.04/MyHardDrive.vdi.original

Enlaces.

Dynamically Expanding

Personalizar el formulario de búsqueda en un tema de Drupal 6

Introducción.

En algunas ocasiones no es suficiente con el bloque de búsquedas de Drupal y es necesario incluír un formulario de búsquedas en la plantilla del tema con un estilo muy específico.

Las búsquedas en Drupal utilizan un sistema de llaves o claves para impedir que sean consumidas desde fuera del sitio, así que escribir un formulario propio con el action direccionado no es una buena alternativa.

Implementación.

  1. Activar el formulario de búsquedas en el tema.
    1. Acceda el menú de administración de temas (?q=admin/build/themes).
    2. Haga clic sobre el enlace Configurar frente al tema elegido.
    3. Seleccione la casilla Bloque de búsqueda.
    4. Presione el botón Guardar configuración.
  2. Copie el archivo modules/search/search-block-form.tpl.php a la carpeta del tema con el nombre search-theme-form.tpl.php.
  3. Edite page.tpl.php del tema e incluya la etiqueta <?php print $search_box; ?> donde desee que aparezca el campo de búsqueda en el tema.
  4. Edite el archivo search-theme-form.tpl.php con el formulario de búsqueda personalizado.
    1. No es necesario incluír las etiquetas <form> ya que estas se incluyen automáticamente.
    2. El ID del formulario generado es search-theme-form.
    3. El ID del campo de las palabras clave deberá ser edit-search-theme-form-1.
    4. El nombre del campo de las palabras clave deberá ser search_theme_form.
    5. Incluya esta etiqueta en cualquier lugar del archivo <?= $search['hidden']; ?>.

Enlaces.

Como mantener actualizado Firefox en Linux Ubuntu

Introducción.

Los métodos para instalar y mantener actualizados los paquetes en Linux son actualmente mas que sorprendentes, evitan la necesidad de ir a buscar los archivos, descargarlos e instalarlos así como lidiar con el infierno de las dependencias.  La distribución Linux de Ubuntu utiliza aptitude que se basa en los repositorios de software de esta empresa donde publican con mucha frecuencia las nuevas versiones de los paquetes y el sistema se encarga de notificar e instalar estos paquetes si son de nuestro interés.

Con Mozilla Firefox sucede algo particular.  Las nuevar versiones de la misma línea del Firefox que tenemos instalado son notificadas e instaladas, sin embargo si surge una nueva versión superior esta no es incluída hasta la siguiente versión de Ubuntu.  Es decir, Ubuntu Jaunty (9.04) viene con Firefox 3.0 y nos notificará de cualquier actualización de esta línea (3.0.x) que suceda, sin embargo nunca nos informará del ya disponible Firefox 3.5.x hasta la próxima gran actualización de Ubuntu.

Para solventar esto es posible utilizar Ubuntuzilla que es un script en Python que nos actualiza e informa de las nuevas versiones de Firefox disponibles.

Instalación.

1. Descargar la última versión de Ubuntuzilla desde la siguiente ubicación.

http://sourceforge.net/projects/ubuntuzilla/

2. Hacer doble clic sobre el archivo recién descargado y presionar el botón Install package para su instalación o ejecutar la siguiente instrucción desde la línea de comando.

$ dpkg -i ubuntuzilla-*-i386.deb

Ejecución.

1. Cierre las ventanas de Firefox que tenga abiertas.

2. Abra una consola y ejecute el siguiente comando.

$ ubuntuzilla.py

3. Verifique que la información desplegada corresponda con la última versión de Firefox disponible.

Retrieving the version of the latest release of Firefox from the Mozilla website…
The most recent release of Firefox is detected to be 3.5.2. Please make sure this is correct before proceeding. (You can confirm by going to http://www.mozilla.org/)
If no version number shows, if the version shown is not the latest, or if you would like to install an older release, press 'n', and you'll be given the option to enter the version manually. Otherwise, press 'y', and proceed with installation. [y/n]?
Please enter 'y' or 'n': y

4. Seleccione la localización que se desea para Firefox.  En mi caso inglés de US.

Please choose the localization (language) for Firefox. Enter the number of your choice from the list below. [If you do not see a list of localizations, please check the help section of our website at http://ubuntuzilla.sourceforge.net/ for steps you can take to resolve this problem.]
0. af         Afrikaans [Afrikaans]
1. ar         Arabic [عربي]
3. be         Belarusian [Беларуская]
4. bg         Bulgarian [Български]
5. bn-BD      Bengali (Bangladesh) [বাংলা (বাংলাদেশ)]
6. bn-IN      Bengali (India) [বাংলা (ভারত)]
7. ca         Catalan [català]
8. cs         Czech [Čeština]
9. cy
10. da         Danish [Dansk]
11. de         German [Deutsch]
12. el         Greek [Ελληνικά]
13. en-GB      English (British) [English (British)]
14. en-US      English (US) [English (US)]
15. eo         Esperanto [Esperanto]
16. es-AR      Spanish (Argentina) [Español (de Argentina)]
17. es-CL      Spanish (Chile) [Español (de Chile)]
18. es-ES      Spanish (Spain) [Español (de España)]
19. es-MX      Spanish (Mexico) [Español (de México)]
20. et         Estonian [Eesti keel]
21. eu         Basque [Euskara]
22. fa         Persian [فارسی]
24. fr         French [Français]
25. fy-NL      Frisian [Frysk]
26. ga-IE      Irish [Gaeilge]
27. gl         Galician [Galego]
28. gu-IN      Gujarati [ગુજરાતી]
29. he         Hebrew [עברית]
31. hr         Croatian [Hrvatski]
32. hu         Hungarian [Magyar]
33. id         Indonesian [Bahasa Indonesia]
34. is         Icelandic [íslenska]
35. it         Italian [Italiano]
36. ja         Japanese [日本語]
37. ka         Georgian [ქართული]
38. kk         Kazakh [Қазақ]
39. kn         Kannada [ಕನ್ನಡ]
40. ko         Korean [한국어]
41. ku         Kurdish [Kurdî]
42. lt         Lithuanian [lietuvių kalba]
43. lv         Latvian [Latviešu]
44. mk         Macedonian [Македонски]
45. ml         Malayalam [മലയാളം]
46. mn         Mongolian [Монгол]
47. mr         Marathi [मराठी]
48. nb-NO      Norwegian (Bokmål) [Norsk bokmål]
49. nl         Dutch [Nederlands]
50. nn-NO      Norwegian (Nynorsk) [Norsk nynorsk]
51. oc         Occitan (Lengadocian) [occitan (lengadocian)]
52. or         Oriya [ଓଡ଼ିଆ]
53. pa-IN      Punjabi [ਪੰਜਾਬੀ]
54. pl         Polish [Polski]
55. pt-BR      Portuguese (Brazilian) [Português (do Brasil)]
56. pt-PT      Portuguese (Portugal) [Português (Europeu)]
57. rm         Romansh [rumantsch]
58. ro         Romanian [română]
59. ru         Russian [Русский]
60. si         Sinhala [සිංහල]
61. sk         Slovak [slovenčina]
62. sl         Slovenian [slovensko]
63. sq         Albanian [Shqip]
64. sr         Serbian [српски]
65. sv-SE      Swedish [Svenska]
66. ta-LK      Tamil (Sri Lanka) [தமிழ் (இலங்கை)]
67. ta         Tamil [தமிழ்]
68. te         Telugu [తెలుగు]
69. th         Thai [ไทย]
70. tr         Turkish [Türkçe]
71. uk         Ukrainian [Українська]
72. vi         Vietnamese [Tiếng Việt]
73. zh-CN      Chinese (Simplified) [中文 (简体)]
74. zh-TW      Chinese (Traditional) [正體中文 (繁體)]

Enter your choice of localization (integer, from 0 to 74): 14
You have chosen localization en-US, English (US) [English (US)]. Is that correct [y/n]?
Please enter 'y' or 'n': y

5. Indique si desea que Ubuntuzilla verifique regularmente por nuevas versiones de Firefox.

Would you like to set up automatic update checking for the official Mozilla build of Firefox (recommended)? This feature will regularly check for updates to Firefox, and put up a small unobtrusive notification message with update information, when a new release is available. [y/n]
Please enter 'y' or 'n': y

6. Disfrute de su nuevo Firefox y de las actualizaciones periódicas de nuevas versiones.

Enlaces.

Como crear nuevas regiones en Drupal 6

Introducción.

Las regiones en Drupal permiten la ubicación de los bloques en la página.  Su distribución se realiza generalmente en el archivo page.tpl.php del tema.

Por defecto se incluyen las siguientes regiones.

  1. Columna izquierda (left).
  2. Columna derecha (right).
  3. Contenido central (content).
  4. Cabecera (header).
  5. Pies de página (footer).

Agregar nuevas regiones al tema.

Es posible según la complejidad del tema que sea necesario agregar nuevas regiones para manipular la distribución del contenido del sitio con mayor precisión y granularidad.

Hasta la versión 5 de Drupal esto se realizaba sobreescribiendo la función phptemplate_regions() del archivo template.php, sin embargo este estilo de configuración fue modificado para las versiones 6 y posteriores.

Ahora la configuración de las regiones se realiza en el archivo TEMA.info de la siguiente manera.

regions[left] = Columna izquierda
regions[right] = Columna derecha
regions[content] = Contenido
regions[header] = Cabecera
regions[footer] = Pies de pagina
regions[menu] = Menu horizontal

Enlaces.

Cómo determinar si el usuario se encuentra autenticado en Drupal

En algunas ocasiones es necesario saber si el usuario que visita el portal basado en Drupal se encuentra autenticado o no en una sesión.  Particularmente útil para determinar que elementos de la interfaz de usuario pueden ser accedidos por usuarios anónimos y cuales deben ser accedidos sólo por usuarios autenticados.

Esto se realiza gracias al objeto $user disponible durante la generación de las vistas de la siguiente manera.

global $user;
if($user -> uid)
{
    // El usuario se encuentra autenticado y en sesión.
}
else
{
    // El visitante del portal es anónimo.
}