11 将菜单项显示为标签

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com

有时候,Drupal的术语是异常晦涩难懂的,同样的名字,在Drupal中有着不同的含义,拿标签tabs来说,在Drupal中,我们把它叫做本地任务,对应的菜单类型为MENU_LOCAL_TASK或者MENU_DEFAULT_LOCAL_TASK本地任务的标题通常是一个简短的动词,比如“添加”或者“列出”。它通常作用在一些对象上,比如节点,或者用户。我们可以把一个本地任务理解为一个关于菜单项的语义声明,通常显示为一个标签(tab)----这和<strong>标签类似,后者也是一个语义声明,通常用来显示加粗的文本。

 

为了显示标签,本地任务必须有一个父菜单项。一个常用的做法是将一个回调指定到一个根路径上,比如my,然后将本地任务指定到扩展了该路径的子路径上,比如my/ordersmy/commentsmy/favorites等等。Drupal内置的主题仅支持两级本地任务。(底层系统可以支持多级的本地任务,但是为了显示更多的层级,你需要让你的主题为此提供支持。)

 

本地任务的显示顺序是由菜单项标题的字母顺序决定的。如果这种顺序不是你想要的,那么你可以为你的菜单项添加一个weight键,然后它们将按照重量进行排序。

 

下面的例子中,将会生成了四个主标签。这是一个实际模块代码改造而来的实例,用来解决Drupal用户个人主页的调整。我们将模块名字命名为my,然后分别创建3个文件,my.info、my.module、my.pages.inc,之后向my.info文件中添加以下内容: 

 

name = 用户主页

description = 使用tabs作为用户主页导航

core = 7.x

接着,向my.module文件中添加以下代码

<?php

 

/**

 * @file

 * 演示Drupal中菜单API本地任务的基本用法,

 */

 

/**

 * 实现 hook_menu().

 */

function my_menu() {

 

  $items['my'] = array(

    'title' => '我的主页',

    'page callback' => 'my_home_page',

    'file' => 'my.pages.inc',

    'access callback' => 'my_access_callback',

  );


$items['my/home'] = array(

    'title' => '我的主页',

    'page callback' => 'my_home_page',

    'file' => 'my.pages.inc',

    'access callback' => 'my_access_callback',

    'type' => MENU_DEFAULT_LOCAL_TASK,

    'weight' => 1,  

  );


$items['my/orders'] = array(

    'title' => '我的订单',

    'page callback' => 'my_orders_page',

    'file' => 'my.pages.inc',

    'access callback' => 'my_access_callback',

    'type' => MENU_LOCAL_TASK,

    'weight' => 2,

  );


$items['my/comments'] = array(

    'title' => '我的评论',

    'page callback' => 'my_comments_page',

    'file' => 'my.pages.inc',

    'access callback' => 'my_access_callback',

    'type' => MENU_LOCAL_TASK,

    'weight' => 3,  

  );


$items['my/favorites'] = array(

    'title' => '我的收藏',

    'page callback' => 'my_favorites_page',

    'file' => 'my.pages.inc',

    'access callback' => 'my_access_callback',

    'type' => MENU_LOCAL_TASK,

    'weight' => 4,

  );

  return $items;

}

 

/**

 * 页面回调.

 */

function my_access_callback(){

  global $user;

  $flag = FALSE;

  //只有注册用户才能访问自己的主页

  if($user->uid>0){

    $flag = TRUE;

  }

  return $flag;

}

 

    最后向my.pages.inc中添加对应的回调函数,注意回调函数中有注释,

 

<?php

 

/**

 * @file

 * my的各种回调函数,

 */

 

/**

 * 菜单项my的回调函数.

 */

function my_home_page(){

  global $user;

  $render_array = array();

  $render_array['#markup'] = t('我的主页页面内容');

  //逻辑代码,比如

  // $render_array['#markup'] .= views_embed_view('my_home', 'block', $user->uid);

  return $render_array;

}

 

/**

 * 菜单项my/orders的回调函数.

 */

function my_orders_page(){

  global $user;

  $render_array = array();

  $render_array['#markup'] = t('我的订单页面内容');

  //逻辑代码,比如

  // $render_array['#markup'] .= views_embed_view('my_orders', 'block', $user->uid);

  return $render_array;

}

 

/**

 * 菜单项my/comments的回调函数.

 */

function my_comments_page(){

  global $user;

  $render_array = array();

  $render_array['#markup'] = t('我的评论页面内容');

  //逻辑代码,比如

  // $render_array['#markup'] .= views_embed_view('my_comments', 'block', $user->uid);

  return $render_array;

}

 

/**

 * 菜单项my/favorites的回调函数.

 */

function my_favorites_page(){

  global $user;

  $render_array = array();

  $render_array['#markup'] = t('我的收藏页面内容');

  //逻辑代码,比如

  // $render_array['#markup'] .= views_embed_view('my_favorites', 'block', $user->uid);

  return $render_array;

}

 

    我们启用这个模块,访问http://localhost/thinkindrupal/my,看到如图4-14所示的效果。

图片1.png 

                 图 3-14.采用了本地任务的个人主页

 

注意,页面的标题来自于父回调函数,而不是来自于默认的本地任务。如果你想使用一个不同的标题,那么可以使用drupal_set_title()来单独设置它。


Drupal版本: