May 312011
 

Post to Twitter Post to Facebook

En el artículo “Cómo crear un menu item básico en Drupal 7 ” creamos un menu sencillo menu item simplemente implementando hook_menu() y el callback asociado a dicho menu item.En este artículo ampliaremos este menu y construiremos un menu anidado (nested menu) el cual lo visualizaremos como tabs.

Los callback mostrados como tabs son conocidos como “local task“, drupal ya nos proporciona 2 types para poder definirlos : MENU_LOCAL_TASK y MENU_DEFAULT_LOCAL_TASK. La clave ‘title’ de nuestro menu item debería ser algún tipo de acción como , listar , añadir, etc..Destacar que toda local task debe tener algún menu item raiz para ser mostrado , la práctica más común es asociar un callback como raí­z y después ir añadiendo nuestras local task como menu items anidados.Hay que tener en en cuenta que el theming incorporado por dupal solo soporta dos niveles, pero que no cunda el pánico ,pero nuestro el theme que estés usando puede que si soporte más niveles.

Ahora vayamos a la práctica, como se vio en el artículo anterior para poder definir menu items simplemente debemos implementar hook_menu() , por tanto vayamos a nuestro fichero menufun.module y vamos a redefinir nuestro hook menufun_menu() :


/**
 * Implementation hook_menu().
 */
 function menufun_menu() { 
 $items['milkshake'] = array(
 'title' => 'Milkshake flavors',
 'access arguments' => array('list flavors'),
 'page callback' => 'milkshake_overview',
 'type' => MENU_NORMAL_ITEM,
 );
 $items['milkshake/list'] = array(
 'title' => 'List flavors',
 'access arguments' => array('list flavors'),
 'type' => MENU_DEFAULT_LOCAL_TASK,
 'weight' => 0,
 );
 $items['milkshake/add'] = array(
 'title' => 'Add flavor',
 'access arguments' => array('add flavor'),
 'page callback' => 'milkshake_add',
 'type' => MENU_LOCAL_TASK,
 'weight' => 1,
 );
 $items['milkshake/list/fruity'] = array(
 'title' => 'Fruity flavors',
 'access arguments' => array('list flavors'),
 'page callback' => 'milkshake_list',
 'page arguments' => array(2), // Pass 'fruity'.
 'type' => MENU_LOCAL_TASK,
 );
 $items['milkshake/list/candy'] = array(
 'title' => 'Candy flavors',
 'access arguments' => array('list flavors'),
 'page callback' => 'milkshake_list',
 'page arguments' => array(2), // Pass 'candy'.
 'type' => MENU_LOCAL_TASK,
 );

 return $items;
 }

Ahora definimos cada una de los callback asociados a cada uno de los menu items , las cuales implementamos en menufun.module

Nota: A diferencia del artículo anterior esta vez no hemos incluido las callback en un fichero adicional,pero se podría hacer igualmente como se explicó en el artículo anterior.


function milkshake_overview() {
 $output = t('The following flavors are available...');
 // ... more code here
 return $output;
 }

 function milkshake_add() {
 return t('A handy form to add flavors might go here...');
 }

 function milkshake_list($type) {
 return t('List @type flavors', array('@type' => $type));
 }

Finalmente podemos comprobar como queda nuestro nuevo menu item (Construimos de nuevo nuestro modulo menufun y limpiamos la cache) y podremos ver nuestro preciosos menu items como tabs:

Fuente : Pro Drupal 7 Development

May 252011
 

Post to Twitter Post to Facebook

En el artículo anterior “How works the menu system in Drupal 7” veíamos como trabajaba Drupal para procesar una URL y generar una respuesta.En este artículo crearemos un nuevo menu item básico al cual iremos añadiendo en artículos posteriores nuevas funcionalidades aumentando su complejidad.

Primeros pasos

Para desarrollar cualquier módulo en drupal debemos crear nuestro directorio en sites/all/modules/custom un directorio , en nuestro caso /menufun y creamos tres ficheros : menufun.info , menufun.module y menufun_greeting.inc

NOTA:El directorio custom ha sido creado para diferenciar los módulos desarrollados por nosotros mismos de los desarrollados por la comunidad de drupal.

Ahora toca “aporrear el teclado”, en menufun.info describimos nuestro nuevo módulo:


name = Menu Fun
description = Learning about the menu system.
package = Pro Drupal Development
core = 7.x
files[] = menufun.module
Implementando hook_menu() y su page callback.

Usaremos el hook hook_menu() para definir nuestro array de elementos que serán añadidos al menu, por tanto el siguiente paso será definir nuestro hook dentro de menufun.module :


<?php

/**
 * @file
 * Use this module to learn about Drupal´s menu system
 */

/**
 * Implementation hook_menu().
 */
 function menufun_menu() {
 $items['menufun'] = array(
 'title' => 'Menu Fun',
 'page callback' => 'menufun_greeting',
 'page arguments' => array('Jane', 'Doe'),
 'file' => 'menufun_greeting.inc',
 'access callback' => TRUE,
 'type' => MENU_NORMAL_ITEM,
 'weight' => -1,
 );

 return $items;
 }

Según nuestra implementación del hook_menu() hemos definido un elemento de menu (menufun) con las siguientes características :

  • Título : Menu fun
  • Page callback asociada : menufun_greeting
  • File (Añade ficheros externos) : menufun_greeting.inc
  • Mediante “page arguments” establecemos dos parámetros que se le pasarán a nuestra callback.Cabe destacar que cualquier parámetro pasado por la URL será enviado igualmente a la callback definida anteriormente, de tal forma que si no definiéramos ningún argumento pero usamos la url http://example.com/menufun/Jane/Doe  los parámetros Jane y Doe se enviarían igualmente ,¡Pruebalo! .Los argumentos se usan mas comúnmente en casos donde debemos controlar más específicamente que parámetros enviar a la callback.
  • No hemos establecido ningún control de acceso.
  • Hemos definido este elemento para que aparezca en el menu navigation.

Por último abrimos el fichero menufun_greeting.inc donde definiremos el callback menufun_greeting:


<?php

/**
 * Page callback
 */
function menufun_greeting($first_name = '', $last_name = ''){
 return t('Hello @first_name @last_name', array('@first_name' => $first_name, '@last_name' => $last_name));
}

Viendo los resultados y conclusiones

Finalmente podemos ver los resultados , habilitamos nuestro módulo , limpiamos la cache y podemos comprobar como en el menu navigation aparece nuestro menu item.Si pulsamos sobre él se activará nuestra callback obteniendose el siguiente resultado:

Como conclusión podemos decir que definir elementos menu en Drupal 7 es muy fácil gracias a la API que nos ofrece este CMS, simplemente tenemos que implementar hook_menu() y su callback asociada.

En artí­culos posteriores partiremos de este módulo e iremos enriqueciendo nuestro menu item.

Fuente: Pro Drupal 7 Development

May 232011
 

Post to Twitter Post to Facebook

Este es el primero de una serie de artículos donde aprenderemos a trabajar con la API de Drupal 7 en lo referente a los menus, the menu system.

El menu system tiene responsabilidades básicas :

  • Callback mapping.
  • Control de acceso.
  • Personalización de menu.

El código esencial del menu system se encuentran en includes/menu.inc ,mientras que el código opcional sobre algunas características se encuentra en modules/menu, por ejemplo la personalización de menus.

Asignando URLs a funciones :

Antes de desarrollar cualquier ejemplo , en primer lugar debemos entender cómo drupal procesa las URLs y cómo maneja las peticiones (request) y emitir una respuesta.

El enfoque general es el siguiente: Drupal pregunta a los módulos habilitados para conseguir un array de menu items.Cada menu item consiste en un array clave-valor donde a cada path (clave) le corresponde una serie de información asociada (valor) a dicha path.Uno de los datos asociados a una path que debemos definir es la page callback asociada a la path, la cual simplemente consiste en una función PHP que se ejecutará cuando el navegador solicite cierta path.Este proceso lo podemos describir en los siguientes pasos:

  1. Drupal establece la path.Por ejemplo si nuestra url es http://example.com/?q=node/6 o http://example.com/node/6 ,si trabajamos con urls amigables,la path que drupal establecería sería node/6.
  2. Se realiza un seguimiento del mapa de direcciones (paths map) con sus correspondientes callbacks consultando la tabla menu_router de la base de datos.Del mismo modo hace un seguimiento de los elementos de menu (menu items) consultando la tabla menu_links.
  3. Averigua qué entrada de la tabla menu_router corresponde con la path y se construye un elemento de enrutamiento (router item) describiendo la callback que va a ser llamada.
  4. Se cargan cualquier objeto necesario para la funcion callback.
  5. Se comprueban los permisos de usuario para acceder a la callback, si no se tienen permisos suficientes se retorna un mensaje de “Acces denied”.
  6. Se localizan el título y la descripción del menu item para el lenguaje actual.
  7. Se cargan los ficheros adicionales necesarios.
  8. Finalmente se llama a la función callback y devuelve un resultado, conforme a este resultado index.php lo pasa a través de la theme_page() mostrándose finalmente la pagina deseada.