用debug_backtrace来打印drupal中theme函数的调用堆栈

对于像drupal这样复杂的系统来说,如果没有好用的debug工具,要把它彻底搞清楚还是比较困难的。想着php中应该有打印堆栈的东西,一搜之下,果然有个函数,就是标题中说到的debug_backtrace。 这个函数会返回当前位置的调用堆栈,各函数的调用参数也一并提供了,于是用在drupal中看了看它的调用情况。主要关心的是theme函数的调用,因为我发现这个函数在theme(‘page’,$return)之前就被调用过,而不是想象中的theme函数调用是从这句话开始。

下面是看到的第一个theme函数的调用,后面括号是该函数所在的文件,我在写的时候,把堆栈倒过来了,上面的调用下面的
menu_execute_active_handler (index.php) 在menu系统中找到当前path的callback =》
node_page_default (menu.inc) =>
node_view (modules/node/node.module) =>
drupal_render (modules/node/node.module) =>
drupal_render (includes/common.inc) =>
theme (includes/common.inc)

由此可以看出,theme会在前面的某些地方被调用。

下面是当theme(‘page’,$return) 被调用时,某一时刻的堆栈状态:
theme(‘page’,$return) (index.php) =>
template_preprocess_page (includes/theme.inc) =>
template_preprocess_page =>
theme(array(‘block’,’left’) ) (theme.inc)=>
call_user_func_array (‘theme_blocks’,array(‘left’)) (theme.inc) =>
theme_blocks(array(‘left’)) =>
block_list (‘left’) =>
module_invoke(array(‘system’,’block’,’view’)) (modules/block/block.module) =>
call_user_func_array( system_block ) includes/module.inc =>
system_block (view) =>
theme (system_powered_by , misc/powered-blue-80×15.png ) modules/system/system.module =>
call_user_func_array (theme_system_powered_by , misc/powered-blue-80×15.png) includes/theme.inc =>
theme_system_powered_by() =>
theme (image,…) system/system.module

由此可见,theme的整个调用过程是比较复杂的,大概看看分析一下,看起来过程是这样的。
theme(page) => template_preprocess 来分析page的结构,然后对每个子结构调用theme函数。如上面看到的theme(block,left) , 对于每个子结构而言,他们应该知道自己有些什么东西,然后在调用相应的theme函数去显示。基本概念应该是这样了。

现在问题是,哪些结构的theme会在kernel中被调用,那些theme是在自己添加的模块中调用,那些kernel中能调用的theme函数是固定的吗。有那些是必须要实现的,那些是不必要实现的。每个子结构如何知道要调用哪个theme函数。

另外关于debug_backtrace的官方文档和实例在这里:



本文地址: http://www.bagualu.net/wordpress/archives/1659 转载请注明




发表评论

电子邮件地址不会被公开。 必填项已用*标注