drupal theme()工作原理概览

老葛的Drupal培训班 Think in Drupal

当一个简单的节点页面显示时,比如http://example.com/?q=node/3,都发生了什么呢,这里给出了大致的总结:
 
1. Drupal的菜单系统收到了请求,并将控制权转交给节点模块。
 
2. 在构建了节点数据结构以后,调用theme('node', $node, $teaser, $page)。这将查找合适的主题函数或者模板文件,定义模板文件中所用的各种变量,应用该模板,为节点生成最终的HTML。(如果有多个节点正在被显示,比如一个日志,那么对于每个节点都会调用一遍这个流程。)
 
3. 如果启用了评论模块,节点的评论也将被转化为HTML,并追加在节点的HTML后面。
 
4. 这样就返回了一团HTML(在index.php中,它就是变量$return),使用theme('page', $return),这样就再次传递给了theme()函数。
 
5. 在处理页面模板以前,Drupal作了一些预处理,比如,找出有哪些区域可用,以及在每个区域中显示哪些区块。通过调用theme('blocks', $region),将每个区块转化为HTML,theme('blocks', $region)是用来定义区块变量并应用区块模板的。在这里,你应该可以开始看到一个模式了。
 
6. 最后,Drupal定义了许多供页面模板使用的变量,并将其应用到页面模板中去。
 
    现在,从前面的列表中,你应该能够认识到theme()函数在Drupal中的重要地位。它负责运行预处理函数,来设置模板中所用的变量;它将主题函数的调用,分发给合适的函数或者查找合适的模板文件。而输出的结果就是HTML。这一流程的图示可参看图8-5。我们将在后面更深入的学习一下,这个函数是如何工作的。现在,应该不难理解,当Drupal想将一个节点转化为HTML时,就会调用theme('node')。根据所启用的主题,theme_node()将用来生成HTML,或者使用一个名为node.tpl.php的模板文件来生成HTML。
    可以在多个层次上,对这个流程进行覆写。例如,主题可以覆写内置的主题函数,所以,当调用theme('node')时,那么将会调用greyscale_node(),而不是默认的theme_node()。模板文件也有命名约定,我们将在后对它进行讲解,所以,模板文件node-story.tpl.php将专门负责Story类型的节点。
8-5. theme()函数调用时的执行流程
 

Drupal版本: