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

  7 Responses to “Displaying Menu Items as Tabs”

  1. Muchas gracias Jose, sin tu ayuda y los enlaces que me has puesto , me hubiera costado más realizar los ejercicios de programación.

    Un saludo

    Atentamente Lucía González

  2. Jose Luis, al incluir este ejemplo como un módulo me salio este error:

    An AJAX HTTP error occurred. HTTP Result Code: 200 Debugging information follows. Path: /drupal/?q=batch&render=overlay&id=8&op=do StatusText: OK ResponseText: /** * Implementation hook_menu(). */ function menufun_menu() { $items['menufun'] = array( ‘title’ => ‘Menu Fun’, ‘page callback’ => ‘menufun_greeting’, ‘file’ => ‘menufun_greeting.inc’, ‘title callback’ => ‘menufun_title’, ‘access callback’ => TRUE, ‘page arguments’ => array(‘Jane’, ‘Doe’), ‘type’ => MENU_NORMAL_ITEM, ‘weight’ => -1, ); $items['menufun/farewell'] = array( ‘title’ => ‘Farewell’, ‘page callback’ => ‘menufun_farewell’, ‘file’ => ‘menufun_greeting.inc’, ‘access callback’ => TRUE, ‘type’ => MENU_NORMAL_ITEM, ); $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; }{“status”:true, “percentage”:”100″, “message”:”Trying to check available update data …\u003Cbr \u002F\u003EChecked available update data for \u003Cem class=\u0022placeholder\u0022\u003ECorporateClean\u003C\u002Fem\u003E.”}

    • Hola laura,
      Gracias por tu comentario, para resolver el error borra de menufun_menu() lo siguiente :

      $items['menufun'] = array(
       'title' => 'Menu Fun',
       'page callback' => 'menufun_greeting',
       'file' => 'menufun_greeting.inc',
       'title callback' => 'menufun_title',
       'access callback' => TRUE,
       'page arguments' => array('Jane', 'Doe'),
       'type' => MENU_NORMAL_ITEM,
       'weight' => -1,
       );
       
       $items['menufun/farewell'] = array(
       'title' => 'Farewell',
       'page callback' => 'menufun_farewell',
       'file' => 'menufun_greeting.inc',
       'access callback' => TRUE,
       'type' => MENU_NORMAL_ITEM,
       );
      

      Limpia cache y al acceder a “/milkshake” debe funcionar todo correctamente. Ha sido un error mio al escribir la entrada del blog.
      También está corregido el tutorial ya debería esta todo correcto.

      Un saludo y gracias.

      • Hice todos los pasos en este post que hice pero creo que tengo un problema con el archivo ‘.inc’ y me sale este error: Warning: call_user_func_array() expects parameter 1 to be a valid callback, function ‘milkshake_overview’ not found or invalid function name en menu_execute_active_handler() (línea 517 de C:\wamp\www\drupal-7.23\includes\menu.inc).
        Warning: call_user_func_array() expects parameter 1 to be a valid callback, function ‘milkshake_overview’ not found or invalid function name en menu_execute_active_handler() (línea 517 de C:\wamp\www\drupal-7.23\includes\menu.inc).

        Espero tu pronta ayuda.

  3. Buen aporte Luis Bellido. Realmente muchos estamos agradecidos con tus aportes…

    Si a muchos les da algún error en el archivo de ‘menufun.module’ no olviden colocar al inicio de la linea el codigo el ‘<?php' (realmente vendría siendo la Linea 1).

  4. Ya pude resolver =). Era que había creado un archivo .inc y habia introducido la referencia a los callbacks ahí. Todo va dentro del .module…captado!

 Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>