Translate to

Buscar

27 de abril de 2011

Haciendo backtrace rápido y sucio

En el artículo Quick-and-Dirty Debugging, de Angela Byron, se muestra una manera rápida de ver el backtrace (la secuencia de llamadas de funciones), de un error.

Consiste en modificar drupal_set_message(), localizado en includes/bootstrap.inc:

function drupal_set_message($message = NULL, $type = 'status', $repeat = TRUE) {
  if ($type == 'error') {
    $message .= '<xmp>'. print_r(debug_backtrace(), 1) .'</xmp>';
    drupal_add_js('console.log('.json_encode(array('Drupal Backtrace'=>debug_backtrace())).');','inline');
  }
  
  if ($message) {
  ...
}

La línea en amarillo está basada en la propuesta de Byron y la verde en la que David Konsumer puso en los comentarios al artículo.

Puedes comentar la linea que desees o el condicional if para hacer el backtrace en diferentes circunstancias.

Listando los hooks invocados


Al programar con Drupal, algo que me gustaría conocer es cuáles son los hooks que podría usar en un momento determinado.

Y, si se pudiera, en que orden son ejecutados.

Cuando he preguntado a otros, nadie parece tener la respuesta.

Bueno, aún no la he hallado, pero he encontrado en el artículo Drupal: Exposed de Angie Byron, una forma de listar los hooks usados en un momento determinado.

Consiste en localizar la funcion module_implements, que está en includes/module.inc, y hacer algo algo como:

function module_implements($hook, $sort = FALSE, $reset = FALSE) {
  ...
  drupal_set_message("hook_$hook");
  ...
}

Dice el articulo que como pueden haber hooks que se invocan después que la página es mostrada (no sabía que eso podía suceder), esta lista de hooks los mostraría en la siguiente carga de la página.

CSS3 para mejorar el breadcrumb de un tema Zen

CSS3 está permitiendo hacer muchas cosas interesantes que antes requerían además javascript o imágenes de apoyo.

Por ejemplo, usando sólo CSS se puede hacer que la lista de breadcrumbs se vea como:


La idea es independiente del tema. En este caso, la ilustraré con un subtema Zen.

Configuración del tema
Normalmente hay un caracter de separación para los términos del breadcrumb. Ingresar a la configuración del tema e indicar que no se use ninguno. También indicar que no se agregue dicho caracter al final de la lista.

HTML
De ese modo, el HTML del breadcrumb será similar a:

<div class="breadcrumb">
  <a href="/drupal/inmobiliaria/">Inicio</a>
  <a href="/drupal/inmobiliaria/admin">Administrar</a>
  <a title="Controla la apariencia del sitio."
    href="/drupal/inmobiliaria/admin/build">Construcci&#195;&#179;n
    del sitio</a>
  <a title="Cambia el tema que usa el sitio o permite que los usuarios lo elijan."
    href="/drupal/inmobiliaria/admin/build/themes">Temas</a>
</div>

Es decir, una lista simple de enlaces bajo la clase breadcrumb.

CSS
En el archivo css/pages.css del tema:

...
.breadcrumb /* The path to the current page in the form of a list of links */ {
  padding-bottom: 0; /* Undo system.css */
}
.breadcrumb a {
  text-decoration: none;
  background-color: #fa4;
  display: inline-block;
  line-height: 20px;
  padding-left: 10px;
  border-left: 3px solid #fff;
}
.breadcrumb a:first-child {
  border-left: none;
}
.breadcrumb a:hover {
  background-color: #fea;
}
.breadcrumb a:hover:after {
  border-left-color: #fea;
}
.breadcrumb a:after {
  content: " ";
  width: 0;
  height: 0;
  position: absolute;
  border-top: 10px solid transparent;
  border-left: 8px solid #fa4;
  border-bottom: 10px solid transparent;
  margin: 0;
  z-index: 2;
}
.breadcrumb a:before {
  content: " ";
  width: 0;
  height: 0;
  position: absolute;
  border-top: 10px solid transparent;
  border-left: 8px solid #fff;
  border-bottom: 10px solid transparent;
  margin-left: -10px;
}
.breadcrumb a:first-child:before {
  content: " ";
  width: 0;
  height: 0;
  position: relative;
  border: none;
  margin-left: -5px;
}
...

  • La idea es formar los triángulos en los extremos de cada enlace, darles los colores adecuados y luego superponerlos para que se concatenen los items.
  • Los enlaces se muestran con inline-block para establecer sus dimensiones (con line-height).
  • Se usa el pseudo selector :after para agregar después de cada enlace un triángulo del mismo color de fondo.
  • Para lograr el triángulo se usa un truco. El browser dibuja una diagonal en el cruce de un borde horizontal y vertical, si son de diferente color. Esto se aprecia en los bordes gruesos.
    Entonces, si se hace una caja de 0px por 0px con bordes de 5px, del mismo color de fondo para el izquierdo y transparente para el superior e inferior, se tendrá un triángulo apuntando a la derecha.
  • Para darle un borde al triángulo, se usa el pseudo selector :before para agregar antes de cada enlace un triángulo de color blanco que calce debajo del triángulo del bloque anterior y ligeramente desfasado.
  • Para diferenciar el primer enlace de los demás, se usa el pseudo selector :first-child
  • Además, se usa el pseudo selector :hover para proveer un cambio de color al pasar el mouse.
  • El borde dibujado con los triángulos solapados tiene un espacio en los vértices de su base. Para mejorar eso, se dibuja una línea del mismo color en el lado izquierdo de cada enlace, excepto el primero.
  • Se usan márgenes y paddings para posicionar los elementos.
Ojalá esta técnica te sirva de ayuda.

26 de abril de 2011

Hacking Views

Vengo usando Views prácticamente desde que empecé con Drupal. Aprender Views me requirió paciencia y, principalmente, práctica, pero creo que ha valido el esfuerzo. La interfaz puede parece un poco intimidante al comienzo, pero luego va adquiriendo sentido.

Hay varias cosas de Views que me gustaría saber, pero aún no he resuelto. Estas son algunas, sin ningún orden en particular:

  • ¿Se puede usar Views para mostrar un array arbitrario?
    Eso me ayudaría a usar su mecanismo de paginación, al menos, para presentar otro tipo de resultados que no tengan que ver necesariamente con base de datos.
  • ¿Puede usar Views un SQL arbitrario?
  • ¿Cuál es la forma de modificar, programaticamente, la consulta, el proceso o el resultado?
  • ¿Cómo lograr una caja de búsqueda que ubique el termino en cualquiera de un conjunto de campos especificados?
Hoy encontré este artículo de Jeff EatonHacking Views, Part 1: Basic Concepts

Me está ayudando a entender mejor algunas cosas. Por ejemplo, yo suelo definir en una sola vista todas las vistas que requiero para cierto tipo de dato, colocando cada una en un display. Ahora me parece que una mejor forma de trabajar sería dar a cada caso su propia vista y usar los displays como diferentes formas de presentar una misma cosa.

Continuare leyendo...

21 de abril de 2011

Cómo agregar un formato minutos:segundos

Para agregar un nuevo formato a los disponibles en el combo que se muestra en las opciones de visualización de un nodo (o de un campo CCK), normalmente habría que agregar algunas funciones en un módulo.

El módulo custom_formatters permite hacerlo de modo más sencillo.

Requiere que además esté instalado cck y token.

Pasos
Una vez instalado custom_formatters, ir a admin/build/formatters. Hay algunos ejemplos que pueden servir de guía.

Elegir Add new formatter para agregar un nuevo formato.

Para este ejemplo:

Nombre: minuto_segundo
Etiqueta: Minuto:Segundo
Editor mode: Advanced
Field type(s): number_float
PHP: return sprintf('%02d:%02d', $element['#item']['value']/60, $element['#item']['value']%60);

Cuando se elige Editor mode: Advanced, se puede usar PHP. De otro modo es HTML y tokens.

Para este caso, el valor del elemento a formatear, está en $element['#item']['value'].

Puede leer el artículo original en Drupalab: Cómo agregar un formato minutos:segundos

6 de abril de 2011

Cómo personalizar los enlaces de nodereference_url

Nodereference_url permite indicar que se agreguen enlaces para crear un hijo al final del nodo padre.

Por ejemplo, si hay un nodo proyecto, se puede crear un nodo foto, con un campo nodereference que apunte a un determinado proyecto. Nodereference_url permite agregar automáticamente al nodo proyecto un enlace que conduzca a la creación de un nodo foto.

Esto puede ser cómodo. De ese modo podemos tener nodo foto, nodo plano, nodo noticia, nodo inscripcíon, etc, cada uno con un campo nodereference apuntando a proyecto. Y, en el nodo proyecto, automáticamente enlaces que permiten crear estos nodos hijos.

Los nodos automáticos son dispuestos en orden alfabético. ¿Qué tal si deseamos otro orden?. Además, ¿qué tal si queremos que se muestre el enlace sólo en algunas circunstancias y no en otras?.

nodereference_url_create_link
El módulo nodereference_url contiene la función nodereference_url_create_link($node, $field_name, $type_name, $attributes), donde:

  • $node es el nodo que contiene a los enlaces
  • $field_name es el nombre del campo nodereference que apunta al padre (por ejemplo field_foto_proyecto)
  • $type_name es el nombre del tipo (por ejemplo foto)
  • $attributes, opcionalmente, permite asignar atributos al enlace.

Se puede usar en el template del nodo que contiene los enlaces. Por ejemplo en node-proyecto.tpl.php:

...
<div class="nodereference_url_links">
  <ul class="links">
    <?php
      if (!in_array('manager', array_values($user->roles))) {
        if ($nid=misc_get_inscripcion_en_proyecto($node->nid)) {
          echo '<li>'.l(t('Está inscrito en este proyecto'), 'node/'.$nid).'</li>';
        } else {
          $field_name = 'field_inscripcion_proyecto';
          $type_name = 'inscripcion';
          $attributes = array();
          echo '<li>'.nodereference_url_create_link($node, $field_name, $type_name, $attributes).'</li>';
        }
      }
      echo '<li>'.nodereference_url_create_link($node, 'field_foto_proyecto', 'foto').'</li>';
      echo '<li>'.nodereference_url_create_link($node, 'field_plano_proyecto', 'plano').'</li>';
      echo '<li>'.nodereference_url_create_link($node, 'field_noticia_proyecto', 'noticia').'</li>';
    ?>
  </ul>
</div>

<?php print $links; ?>
...

En este ejemplo, el enlace Crear inscripción se muestra sólo en caso que no se haya creado una inscripción antes. misc_get_inscripcion_en_proyecto(), definida en el módulo misc, devuelve el nodo de tipo inscripción que se haya creado por este usuario para este proyecto, o FALSE en caso contrario.

Los enlaces Crear foto, Crear planos y Crear noticia se colocan manualmente como se prefiera.

Más artículos