You are here

将菜单项显示为标签

Drupal的公认晦涩的菜单行话来说,一个显示为标签的回调被认为是一个本地任务,它的菜单类型为MENU_LOCAL_TASK或者MENU_DEFAULT_LOCAL_TASK.本地任务的标题应该是一个简短的动词,比如“添加”或者“列出”。它通常作用在一些对象上,比如节点,或者用户。你可以把一个本地任务想象为一个关于菜单项的语义声明,通常显示为一个标签(tab)----这和<strong>标签类似,后者也是一个语义声明,通常用来显示加粗的文本。

 
    为了显示标签,本地任务必须有一个父菜单项。一个常用的实践是将一个回调指定到一个根路径上,比如milkshake,然后将本地任务指定到扩展了该路径的子路径上,比如milkshake/prepare,milkshake/drink,等等。Drupal内建的主题支持两级标签本地任务。(底层系统可以支持多级的标签,但是为了显示更多的层级,你需要让你的主题为此提供支持。)
 
    标签的显示顺序是由菜单项标题的字母顺序决定的。如果这种顺序不是你想要的,那么你可以为你的菜单项添加一个weight键,然后它们将按照重量进行排序。
 
    下面的例子所示的代码将会生成了两个主标签和位于默认本地任务下面的两个次标签。创建sites/all/modules/custom/milkshake/milkshake.info文件,如下所示:
 
; $Id$
name = Milkshake
description = Demonstrates menu local tasks.
package = Pro Drupal Development
core = 6.x
 
    接着,创建sites/all/modules/custom/milkshake/milkshake.module文件:
<?php
// $Id$
 
/**
* @file
* Use this module to learn about Drupal's menu system,
* specifically how local tasks work.
*/
 
/**
* Implementation of hook_perm().
*/
function milkshake_perm() {
    return array('list flavors', 'add flavor');
}
 
/**
* Implementation of hook_menu().
*/
function milkshake_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;
}
 
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));
}
    图 4-14给出了在Bluemarine主题下的效果图
4-14.本地任务和标签化菜单
 
    注意,页面的标题来自于父回调,而不是来自于默认本地任务。如果你想使用一个不同的标题,那么可以使用drupal_set_title()来设置它。
 
 老葛的Drupal培训班 Think in Drupal

Drupal版本: