drupal

Debuguear php con emacs, xdebug y geben

Tags: 

Una de las cosas más útiles que puedes aprender para debuguear un programa en PHP es a usar xdebug. Y la verdad no es nada complicado.

Paso 1. Instalar xdebug. Eso lo puedes hacer con un simple sudo apt-get install php5-xdebug. Lo malo es que en ubuntu 10.04 (nuestros servers de prueba) se instala una versión viejita. Se necesita la versión 2.1 para que funcionen cosas padres como inspeccionar variables. Instalarlo en ubuntu tampoco es difícil.

cd ~
sudo apt-get install php5-dev
wget http://www.xdebug.org/files/xdebug-2.1.3.tgz
tar -xzf xdebug-2.1.3.tgz
cd xdebug-2.1.3
phpize
./configure --enable-xdebug
make
sudo make install

Paso 2. Configurar xdebug en tu php.ini. En ubuntu para el cli y apache esto es en una carpeta como /etc/php5/cli/php.ini:

xdebug.remote_enable=On
xdebug.remote_autostart=On
xdebug.remote_port=9001 # el puerto default es 9001, pero como uso fpm ese puerto ya está ocupado

Paso 3. Instalar un cliente para xdebug como geben para emacs (lo puedo usar en mi servidor directamente). Estoy suponiendo que ya tienes emacs instalado:

wget http://geben-on-emacs.googlecode.com/files/geben-0.26.tar.gz
tar xzf geben-0.26.tar.gz
cd geben-0.26
make
sudo make install

Y agregar estas líneas a tu .emacs:

(add-to-list 'load-path "/usr/share/emacs/23.1/site-lisp/geben") ; Geben directory
(require 'geben)

Y listo, ahora para debuguear un programa de php de tu cli simplemente:

  1. inicia emacs y luego corre C-u M-m geben. Puerto 9001.
  2. corre un programa de php en otra consola
  3. utiliza geben en todo su esplendor. Para ver qué shortucts tiene geben simplemente presiona '?'

Cuidado!!! No lo uses en tu servidor de producción, porque el desempeño baja considerablemente.

Referencias:

Image: 

Usando views handlers para mostrar el total de una vista de inventario

Hay veces que quieres desplegar información específica en una vista además de los datos que traes de tus nodos. Bien puede ser para desplegar simplemente una descripción de tu vista, o tal vez un subtítulo con datos de tu argumento, o incluso un subtotal si estás mostrando datos de productos o algo así.

Este tipo de cosas las puedes insertar en el header y footer de tu view. Y en los casos más sencillos puedes simplemente insertar un "text area" donde pongas el texto estático. Pero hay veces que quieres más ;-).

Pudiera ser tentador habilitar el módulo "PHP Filter" y poner código de PHP ahí mismo en tu vista. Para algo sencillo puede ser suficiente, pero si tu código van a ser más de 3 líneas te recomiendo usar un views_handler que sirve precisamente para eso y así podrás meter tu código en un control de versiones y editarlo con vi o emacs.

Manos a la obra, vamos a implementar un modulo views_total para desplegar el total de un inventario. El views_total.info está fácil:

name = Views Total
description = Implements an area handler to display the inventory summary
package = Other
core = 7.x

files[] = views_total.module
dependencies[] = "views"

; Views handlers
files[] = views_total_handler_area_summary.inc

El views_total.module simplemente implemente el hook_views_api para indicarle a views que existimos:

<?php

/**
 * Implements hook_views_api().
 */
function views_total_views_api() {
  return array(
    'api' => 3,
  );
}

En el views_total.views.inc finalmente declaramos nuestro handler que va a estar en la "tabla global" porque no estámos adjuntándonos a ninguna tabla de nuestra BD.

<?php

/**
 * Implements hook_views_data.
 */
function views_total_views_data()
{
  $data = array();

  $data['views_total']['table']['group'] = t('Global');
  $data['views_total']['table']['join'] = array(
    '#global' => array(),
  );

  $data['views_total']['summary'] = array(
    'title' => t('Inventory summary'),
    'help' => t('Display the total of items in the inventory'),
    'area' => array(
      'handler' => 'views_total_handler_area_summary',
    ),
  );

  return $data;
}

Y finalmente, viene el bueno, nuestro handler:

<?php

/**
 * Definir un area handler para que el total del inventario se pueda agregar a la vista
 */
class views_total_handler_area_summary extends views_handler_area {

  function option_definition() {
    $options = parent::option_definition();

    // Quitamos opciones del formulario de edición del handler que no queramos.
    // las opciones vienen heredadas del views_handler_area
    unset($options['empty']);

    return $options;
  }

  function options_form(&$form, &$form_state) {
    parent::options_form($form, $form_state);

    // Quitamos el empty también del display
    unset($form['empty']);
  }

  // Esto es lo que se va a desplegar en la vista
  function render($empty = FALSE) {
    if (!$empty) {
      $total = 0;
      foreach ($this->view->result as $result) {
        $total += $result->node_taxonomy_index_nid;
      }
      return "<table class="views-table"><tr><th>Total de equipos</th><th class="views-field-nid">$total</th></tr></table>";
    }

    return '';
  }
}

Puedes inspeccionar el $this->view->result con un print_r o un krumo (si tienes devel instalado) para ver qué variables te pueden servir.

Para hacer este modulito me basé mucho en el código del submodulo line_item del módulo commerce para Drupal 7.

redirigir los dominios www usando aegir y nginx

Desde hace algunos meses que usamos aegir para manejar todos los sitios de drupal de clientes que hosteamos en nuestro servidor. Es una bendición del cielo =). Pero por ahí acabamos de hacer una pequeña modificación. Usualmente, todos los dominios que manejamos tienen su version con www y sin www. Como www.elevare.org y elevare.org. Ambos queremos que funcionen. Con aegir tu puedes crear alias para tus sitios, pero como esto es una regla general, pues hicimos una modificación a la regla de nginx para que jale en TODOS los sitios www:

## www. redirect
if ($host ~* ^(www\.)(.+)) {
  set $rawdomain $2;
  rewrite ^/(.*)$  http://$rawdomain/$1 permanent;
}

Con esta regla de nginx puesta en el servidor default, todos los dominios con www serán redirigidos al dominio sin www. Presto =).

Crear un calendario de grupo con drupal

Este tutorial es para sitios en drupal que utilizan el módulo de organic groups para crear comunidades virtuales. Al terminar el módulo tendrás una página donde se mostrarán únicamente las actividades específicas a tu grupo en forma de calendario.

Módulos Necesarios

Primero necesitas tener los siguientes módulos en tu sites/all/modules:

Los módulos que necesitas habilitar para que esto funcione (suponiendo que ya tienes og habilitado) son como mínimo: content, calendar, date, date api, date timezone, views y views ui. Al crear sitios con drupal lo mejor es habilitar los menos módulos posibles, ya que cada módulo que instalas tiene un impacto en el desempeño de tu sitio.

CCK y Date

Ahora hay que crear un tipo de contenido que tenga un campo de fecha. Para esto vamos a admin/content/types y creamos un tipo nuevo. No olvides que este tipo de contenido debe de poder pertenecer a un grupo. Yo le puse evento. Y luego le agregamos un campo de cck, puedes elegir 3 tipos de fecha: datestamp, datetime y date. Date es únicamente la fecha, datetime incluye hora y datestamp es el más específico. O al menos eso parece no? ;-).

Crea algunos eventos de prueba.

Views y Calendar

Ahora viene lo bueno. Ve a la vista de administrar vistas en admin/build/views y activa la vista de calendario que nos va a servir como base. Esta vista la puedes editar para que todos los calendarios que crees tengan ciertos elementos en común:

  1. Por ejemplo, a mi no me gusta que en la vista mensual me muestren el número de semana. Para corregir esto nos vamos a la vista de mes y en basic settings -> calendar damos click en el ícono de settings y deshabilitamos esa opción.

  2. Tampoco me gusta que en la vista se desplieguen las etiquetas de los campos (Título:, Updated date:). Así que las podemos quitar.

  3. Normalmente nada más quieres que se puedan ver los nodos publicados, así que hay que agregar un filtro de Nodo: publicado = TRUE.

  4. Finalmente, el cambio que considero más importante es hacer que las vistas de calendario, por default, utilicen el campo de fecha que acabamos de crear en lugar de la fecha de última actualización de los nodos. Para hacer esto vamos a editar el argumento de fecha (node.changed):

    1. como el sitio está en español, cambia las cadenas que dicen 'all' por 'todos'
    2. quita la palomita al campo Nodo: update date
    3. pon una palomita al campo tu campo de fecha, en mi caso Contenido: Datestamp: Fecha (field_fecha_futura)
    4. guarda tus cambios

Esta vista de calendario (a la que puedes navegar en el url calendar) ya nos sirve como punto de partida, y si la visitas podrás ver una vista general de todas las actividades programadas en tu sitio.

OG, Views y Arguments

Ahora nada más falta hacer una vista que te muestre nada más las actividades del grupo en el que te encuentres. Para esto vamos a usar un elemento muy poderoso de las vistas: argumentos.

Los argumentos sirven para personalizar tu vista de acuerdo a información que reciben de diversas fuentes, normalmente el url de tu vista. Entonces:

  1. Desde la lista de vistas, clona la vista del calendario base (calendar). Yo a esta vista la nombre calendario_grupo y su descripción es eso precisamente: Calendario de grupos. Next.

  2. Vamos a agregar un argumento: Grupos: Grupos. Este argumento lo que hace es mostrar únicamente los nodos que pertenezcan al grupo que especifiques en el argumento. Add.

    Agregar grupo

  3. Este argumento de grupo debe aparecer antes del argumento de fecha, así que hay que reordenarlos presionando este ícono:

  4. Hay que modificar la ruta de la vista de página para que sepa que forzosamente debe llevar un argumento, así que la vamos a cambiar de calendara calendario/%

Y listo, con esto ya sabes lo básico para adecuarla a tus necesidades. Si navegas en tu sitio a (/calendario/id_de_un_grupo)[http://fef-apostolado.org/calendario/50], podrás ver tu vista de calendario ;-).

Usando tags de taxonomía para organizar el contenido en drupal

El módulo de taxonomy de drupal sirve para organizar el contenido de tu sitio. Ese módulo es muy poderoso, y permite muchos tipos de categorizaciones: jerárquicas, lineales, jerárquicas pero con múltiples padres.

Uno de los métodos más populares del web 2.0 (buzzwords por favor) es utilizar tags, o en términos de drupal, categorización libre. Donde a cada contenido que publicar le asignas varias etiquetas de acuerdo al tema que estás tratando.

En la página de axai contamos con un blog empresarial donde publicamos cosas que nos parecen interesantes, nuestro trabajo y en general lo que va pasando con nuestra empresa. Estos artículos están categorizados libremente, PERO, pero pero pero, de cualquier manera ese libremente tiene que tener algo de sentido.

Les pongo un ejemplo. Hace poco empezamos a subir artículos con los sitios que hemos estado terminando. Los tags que les estamos poniendo a estos artículos son:

Así, cuando queramos montar una liga a nuestro portafolio en nuestro sitio, no tendremos más que apuntar a ese tag. O cuando queramos mostrar sitios hechos en drupal únicamente (también tenemos sitios con symfony o en flash), o todos los artículos relacionados con algún cliente, o..... tienen la idea no?

Entonces, todo el chiste está en ser consistente. También, si los artículos los escribe más de una persona, pues hay que encontrar la manera de comunicarse y estar de acuerdo en los tags que se están usando para que estos sean más efectivos. Recuerden que además, estos tags ayudan al ranking con los buscadores ;-).

CVS desde git, y como mantenerlos sincronizados

Llevo algún rato intentando rastrear de manera eficaz algunos módulos de drupal que están en desarrollo: spaces y context.

Lamentablemente, en drupal todavía usan CVS para administrar el código. El código que usan para administrar los projectos en drupal.org (releases, registro de bugs, descargas, etc) está basado en CVS, y aunque poco a poco avanzan para hacerlo más independiente de CVS y poder utilizar subversion o cualquier otra cosa, pues es algo que va a tomar todavía algo de tiempo.

Así que la solución que más me agrada es seguir el avance de estos repositorios utilizando git ;-). Este blog te dice cómo hacerlo en inglés. Los pasos son simples. El comando de git-cvsimport actúa en la carpeta en la que estás ubicado a menos que utilices la opción de -C para decirle a qué carpeta quieres importar, así que crea una carpeta para tu repositorio antes de empezar.

$ mkdir spaces $ cd spaces $ git-cvsimport -d:pserver:anonymous@cvs.drupal.org:/cvs/drupal-contrib -k -v -r drupal-contrib contributions/modules/spaces

  • La opción de -d indica donde esta el repositorio de CVS
  • la opción de -k es para evitar cambiar los keywords de CVS y es opcional aunque recomendada (al menos si ves el manpage de git-cvsimport)
  • -v para que te imprima lo que está haciendo (si no, funcionará como cualquier comando de UNIX que no imprime nada a menos que haya un error)
  • la opción de -r es para que utilice un nombre en tu repositorio de git diferente a origin para este repositorio remoto, puedes decidir no utilizarla
  • y finalmente le tienes que decir qué módulo de CVS quieres traerte

Para mantener actualizado este repositorio de git no hay más que correr este mismo comando en la misma carpeta y lixto!

Subscribe to RSS - drupal
Drupal theme by Kiwi Themes.