You are here

1创建一个菜单项

admin 的头像
Submitted by admin on 星期一, 2015-06-01 03:29

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com
我们在前面一章,学习过hook_menu这个钩子函数,通过这个钩子函数,我们可以定义自己的菜单项(回调映射)。我们现在编写一个简单的实例模块menu_abc.module,通过这个模块来学习菜单API。首先让我们在sites/all/modules/custom目录下面创建一个文件夹menu_abc,然后创建两个空白文件,分别为menu_abc.info、 menu_abc.module,让我们向menu_abc.info文件中添加一下内容:


name = 菜单ABC

description = 用来学习菜单API的简单实例模块

core = 7.x

 

    记得将文件的格式保存为UTF-8的形式,在以后的模块中,就不再提醒这一点了。

 

接着打开sites/all/modules/custom/menu_abc/menu_abc.module文件,在里面添加hook_menu()的实现,以及对应的回调函数:

 

<?php

 

/**

 * @file

 * 演示Drupal中菜单API的基本用法,主要包括钩子hook_menu(),

 */

 

/**

 * 实现 hook_menu().

 */

function menu_abc_menu() {

 

  $items['menu_abc'] = array(

    'title' => '菜单ABC',

    'description' => '一个简单的菜单项.',

    'page callback' => 'menu_abc_callback_page',

    'access callback' => TRUE,

  );

 

   return $items;

}

 

/**

 * 菜单项menu_abc的回调函数.

 */

function menu_abc_callback_page(){

  $render_array = array();

  $render_array['#markup'] = t('菜单ABC页面内容');

  return $render_array;

}

 

在“管理模块”中,启用这个模块,这样Drupal就会将菜单项menu_abc保存到数据库menu_router表中,当我们访问http://localhost/thinkindrupal/menu_abc时,这里我启用了简洁URL,Drupal就可以找到这个菜单项并调用对应的回调函数了,如图3-1所示。

1.png

            图3-1  访问菜单项menu_abc后,Drupal显示的页面内容

 

    需要注意的要点是,这里我们定义了一个路径,并将其映射到了一个函数上。该路径是一个Drupal路径。我们使用它作为$items数组的键。你还会注意到这个路径的名字和模块的名字是一样的,这里主要是用来保证有一个干净的URL命名空间。实际上,你可以在hook_menu定义各种有效的路径。

 

    让我们来学习一下,这个菜单项数组里面所包含的每一项的含义。

    'title':是用来定义菜单项的标题的,这里定义为'菜单ABC',当在浏览器中显示该页面时,它会自动用作页面标题。如果我们需要在后面的回调函数中覆写页面标题,那么可以使用drupal_set_title()函数。此外,我们没有在这里使用t()函数。这是因为对于菜单项的title来说,系统会自动地调用t()。

   'description':是这个菜单项的简单描述,这里定义为'一个简单的菜单项.',当我们把鼠标移到右边导航区块的对应链接时,这一文本会显示出来,如图3-2所示。

 

                       2.png

                   图3-2 菜单项在导航区块中的显示

 

    'page callback': 定义了这个菜单项的页面回调函数,这里定义为' menu_abc_callback_page',当用户访问路径”menu_abc”时,Drupal就会执行函数menu_abc_callback_page。对于这个函数,我们需要注意的是,它返回的是一个数组结构,Drupal会自动地将这个数组结构呈现为页面内容。对于学习过Drupal6开发的用户来说,我们知道,通常在页面回调函数中,我们返回字符串;在Drupal7中,返回字符串也是可以的,但是最好返回数组结构的形式。上述代码等价于:

 

  $output = '';

  $output = t('菜单ABC页面内容');

  return $output;

 

    'access callback':定义了这个菜单项的访问控制回调函数,这里定义为TRUE,表示所有用户都可以绕过访问控制检查,也就是所有用户都可以正常的访问这个路径。

 

    尽管在前面的菜单项中没有定义,但实际却用到的是'type''menu_name' ' weight ''type'定义了这个菜单项的类型,这里我们使用了默认的MENU_NORMAL_ITEM,所以在这里的代码里,type键可被忽略。'menu_name'定义了这个菜单项所属的菜单,这里我们使用了默认的'navigation',这样我们这里定义的菜单项,就会显示在导航区块中了。' weight '定义了这个菜单项在菜单中的位置,由于这里我们没有定义它,所以使用了默认值0。


Drupal版本: