阅读:3632回复:0
Drupal 主题模板方案(Template Suggestions)与覆写机制的实现和原理简述
Drupal 在主题制作方面有一套灵活的开发机制,通过使用级联的模板方案(Template Suggestions),使开发人员能够灵活地扩展和使用 Drupal 模板(.tpl.php)文件。本文将结合相关源代码简单介绍此机制的实现方式与用法。
一个 Drupal 页面的显示可以简单地分为两步,第一步为模板脚本(template.php)准备数据,第二步将模板脚本准备好的数据填充到模板文件(.tpl.php)中。这样一来,模板文件主要用于定义网页的布局,模板脚本则包含生成模板文件中变量的逻辑代码(这样便将业务逻辑层和表示层分离,使得程序员和设计人员可以更好地分工和合作)。 以节点页面为例,程序员通过 template_preprocess_node() 函数将节点的 $title, $content, $node_url 等数据准备好,设计人员制作 node.tpl.php 模板,并将 $title, $content, $node_url 等变量放置到模板中即可(本文的最后一段源代码的前几行,便是 template_preprocess_node() 函数在为模板文件(.tpl.php)准备变量)。 在 Drupal 中,模板脚本也是级联的,关于模板脚本的加载和运行顺序请参考《使用 preprocess 函数处理模板文件中使用的变量》。 Drupal 使用 drupal_discover_template() 函数查找并加载模板文件(.tpl.php),通过逆向查询传入的 $suggestions 数组,来确定使用哪个模板对当前页面进行主题化。以下是 drupal_discover_template() 函数的源代码 这里需要注意,$suggestions 数组在进行轮循之前被进行了一次数组翻转(array_reverse)操作,这么做的目的在于将最后添加到模板列表中的模板最先被取出,即 FILO-First In Last Out,从而能够实现模板文件的级联与覆写。 因此,在加载模板之前,应该先定义 $suggestions 数组,这样才可以让 drupal_discover_template() 从所有模板文件中返回当前页面所使用的模板文件。所以,如果我们要自己添加模板,还需要知道如何设置 $suggestions 变量。 通过以上代码可知,传入 drupal_discover_template() 函数的 $suggestions 数组,是来自于变量 $variables[‘template_file‘] 或者 $variables[‘template_files‘]。可以在 template.php 中的预处理函数中为 $variables 赋值。 以预处理函数 template_preprocess_node() 为例,在打开节点页面时,Drupal 会先查找 node-[node_type].tpl.php 作为此页面的模板。 因此,当我们要使用自定义模板时,只需要在模板脚本的预处理函数中,将模板名赋值到 $variables['template_file'] 或者 $variables['tempalte_files'][] 即可。示例: |
|