看了很多天drupal的源文件了,或多或少的明白了一些drupal的工作流程。今天就选择一个页面介绍一下drupal页面加载的流程,整个流程是依靠drupal的源文件中函数调用的过程的。
以加载http://localhost/drupal-6.22/admin/help(我的网站文件夹名:drupal-6.22)这个页面为例:
1:我们输入url在浏览器的地址栏,然后drupal就开始调用index.php这个文件。
2:index.php中以下两句代码就是为完全运行drupal做准备工作,把数据库,语言,包含include文件夹中的函数等(详情查看http://www.akon405.com/en/node/200)。
require_once './includes/install.inc';
define('MAINTENANCE_MODE', 'install');
3:index.php中第三句为$return = menu_execute_active_handler();这句话的作用就是通过url,调用数据库中的相关函数,并且把相关的inc文件加载到 drupal系统中。这句话就是drupal文件加载的核心了,这里我们需要打开的路径是http://localhost/drupal-6.22 /admin/help,所以我可以在数据库的menu_router表中得到此页面包含了help.admin.inc文件并且调用的函数为 help_main()。
4:跟随函数的脚步前进,进入drupal调用的help_main函数中进行分析(这个函数在help.admin.inc文件中),这个函数的源代码为:(我们在打开的页面中可以看到一些文字描述和一个模块列表,这里我们看函数是如何实现的)
function help_main() {
// Add CSS
drupal_add_css(drupal_get_path('module', 'help') .'/help.css', 'module', 'all', FALSE);
$output = ''. t('Help topics') .''. t('Help is available on the following items:') .''. help_links_as_list();
return $output;
}
5:这里面有一个help_links_as_list()函数,然后我们再一次追随函数。在这个函数中我们看到了如下定义:
function help_links_as_list() {
$empty_arg = drupal_help_arg();
$module_info = module_rebuild_cache();
$modules = array();
foreach (module_implements('help', TRUE) as $module) {
if (module_invoke($module, 'help', "admin/help#$module", $empty_arg)) {
$modules[$module] = $module_info[$module]->info['name'];
}
}
asort($modules);
// Output pretty four-column list
$count = count($modules);
$break = ceil($count / 4);
$output = '
';
$i = 0;
foreach ($modules as $module => $name) {
$output .= '
'. l($name, 'admin/help/'. $module) .'
';
if (($i + 1) % $break == 0 && ($i + 1) != $count) {
$output .= '
';
}
$i++;
}
$output .= '
';
return $output;
}
这个函数的作用就是得到包含hook_help这个钩子函数的模块的列表并且调用了hook_help函数。
6:至此,你就可以知道页面生成的大体流程了。
以加载http://localhost/drupal-6.22/admin/help(我的网站文件夹名:drupal-6.22)这个页面为例:
1:我们输入url在浏览器的地址栏,然后drupal就开始调用index.php这个文件。
2:index.php中以下两句代码就是为完全运行drupal做准备工作,把数据库,语言,包含include文件夹中的函数等(详情查看http://www.akon405.com/en/node/200)。
require_once './includes/install.inc';
define('MAINTENANCE_MODE', 'install');
3:index.php中第三句为$return = menu_execute_active_handler();这句话的作用就是通过url,调用数据库中的相关函数,并且把相关的inc文件加载到 drupal系统中。这句话就是drupal文件加载的核心了,这里我们需要打开的路径是http://localhost/drupal-6.22 /admin/help,所以我可以在数据库的menu_router表中得到此页面包含了help.admin.inc文件并且调用的函数为 help_main()。
4:跟随函数的脚步前进,进入drupal调用的help_main函数中进行分析(这个函数在help.admin.inc文件中),这个函数的源代码为:(我们在打开的页面中可以看到一些文字描述和一个模块列表,这里我们看函数是如何实现的)
function help_main() {
// Add CSS
drupal_add_css(drupal_get_path('module', 'help') .'/help.css', 'module', 'all', FALSE);
$output = ''. t('Help topics') .''. t('Help is available on the following items:') .''. help_links_as_list();
return $output;
}
5:这里面有一个help_links_as_list()函数,然后我们再一次追随函数。在这个函数中我们看到了如下定义:
function help_links_as_list() {
$empty_arg = drupal_help_arg();
$module_info = module_rebuild_cache();
$modules = array();
foreach (module_implements('help', TRUE) as $module) {
if (module_invoke($module, 'help', "admin/help#$module", $empty_arg)) {
$modules[$module] = $module_info[$module]->info['name'];
}
}
asort($modules);
// Output pretty four-column list
$count = count($modules);
$break = ceil($count / 4);
$output = '
';
$i = 0;
foreach ($modules as $module => $name) {
$output .= '
'. l($name, 'admin/help/'. $module) .'
';
if (($i + 1) % $break == 0 && ($i + 1) != $count) {
$output .= '
';
}
$i++;
}
$output .= '
';
return $output;
}
这个函数的作用就是得到包含hook_help这个钩子函数的模块的列表并且调用了hook_help函数。
6:至此,你就可以知道页面生成的大体流程了。