参考《Drupal专业开发指南》p16,或者查看drupal到index.php文件了解详细信息。
1.引导指令流程,调用drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);加载include的函数
在bootstrap.inc中定义
包括如下处理流程:
a.配置
b.早期页面缓存
...
2.处理一个url请求,调用menu_excute_active_handler(); //解析URL 路径
在menu.inc中定义
具体细节:
1.调用menu_get_item函数获取$router_item菜单系统URL的信息,包括访问权限access,页面回调函数page_callback,页面模板参数page arguments,路径映射map等等。
2.根据1的返回结果调用返回不同的结果。如果$router_item['access']=TRUE,则调用相应的菜单回调函数。
其中返回结果有:
a.根据url路径解析好的html代码
这是最普遍的结果,通常是调用菜单回调函数获取到的内容。
b.MENU_NOT_FOUND
系统找不到用户给出的url路径
c.MENU_ACCESS_DENIE
用户没有权限访问这个路径
d.MENU_SITE_OFFLINE
网站没有上线
3.主题化数据,对于在2中返回到a结果,调用theme('page', $result);
系统寻找对应的主题page模板,然后填充得到最终到html代码展示给用户。
在theme.inc文件中定义
其中处理流程如下:(参考 http://api.drupal.org/api/drupal/includes--theme.inc/function/theme/6)
1.调用func_get_args(),获取调用这个函数传进来的参数信息,以便确定$hook类型(上面的第一个参数,例如,‘page’)。
2.通过主题注册表获取这个url对应的$info信息,包括file,path,include files,function,arguments,template等等,为下一步做准备。
3.如果$info['function'] 不为空,说明这次调用theme函数的是一个回调函数填充数据,则调用相 应的回调函数返回结果。
3a1.否则,说明要使用模板填充数据返回。
3a2.首先获取模板引擎预定义的基本variables。
3a3.然后根据获取到的$info['preprocess functions']预处理函数,依次逐个调用。
//比如,$hook='page',则这些预定义的函数分为可能为:template_preprocess,template_preprocess_page,cms_node_preprocess_page, ctools_preprocess_page,page_title_preprocess_page,nodewords_preprocess_page,rootcandy_preprocess_page,nodereference_explorer_preprocess_page
//具体这些函数 怎么设定的我暂时还不明白,但是其中有2个函数template_preprocess,template_preprocess_page是drupal系统本身就有的框架处理函数,而rootcandy_preprocess_page是相应主题里面的预处理函数。而其他的就是各个模块里面定义的 。
3a4.经过了上面的预处理函数到依次调用,drupal就能获取到了这次主题使用的模板文件名字$variables['template_files'],drupal就调用drupal_discover_template等函数加载模板,返回相应的html代码。
4调用drupal_page_footer();
3a.对于其他异常返回,分别调用对应到函数去处理。最后也是主题化数据。
例如,对于返回值为MENU_ACCESS_DENIE,调用函数drupal_access_denie()去处理。