Drupal 6 Menu系统
一、 原理
Drupal6的Menu被分为两种,一种是用于导航的Menu_router,一种是用于显示的Menu_links。Menu_links是Menu_router的一个子集。
二、 Menu Router流程
1、 系统接收请求之后启动,调用函数menu_execute_active_handler()进入Menu router系统;
2、 系统调用menu_get_item()函数寻找该请求路径对应的处理单元,判断该单元的access属性,如果为真,判断该处理单元是否需要加载额外的file文件,然后调用该处理单元的回调函数,返回相应的结果;
3、 在menu_get_item()内部,系统获取当前的$_GET[‘q’]路径,或者引用传入的路径,根据该路径组成一个优先调用的路径数组列表,在menu_router表里根据优先等级搜寻最适合的menu项,取出;
4、 调用_menu_translate()函数,将取出的menu项根据当前的实际路径值进行翻译。载入路径需要载入的对象,判断路径的access值,如果为真,进行_menu_item_localize();
三、 Menu Links流程
1、 通过调用menu_navigation_links()或者menu_local_tasks()进入Menu Links系统;
2、 对于menu_navigation_links(),调用menu_tree_page_data()以获得请求menu的层级列表;
3、 在menu_tree_page_data()内部,先调用menu_get_item()获得当前请求menu的menu项,然后在menu_links表里寻找当前请求menu的子menu以及同级menu id,根据id列表调用menu_tree_data()获得所有id的menu项列表;调用menu_tree_collect_node_links()搜寻menu项列表里的node节点项,调用menu_tree_check_access()判断menu项和节点项的access属性,若为假,则从menu项列表里去掉;
四、 API
通过实现Hook_menu()返回menu项数组;
Array(
‘menu/%path’ => array(
‘title’ => ‘’, //不需写为t(‘’),系统自动调用t(),如果没有指定title callback
‘title callback’ => ‘’,
‘title arguments’ => array(),
‘page callback’ => ‘’,
‘page arguments’ => array(),
‘access callback’ => ‘’, //若省略的话系统默认为user_access;若access arguments省略,而access callback也无特定函数时,true表示任何人都可进入,false表示任何人都不可进入;
‘access arguments’ => array(),
‘file’ => ‘’ //额外调用的文件;
)
)
- wilson's blog
- Login or register to post comments

