你现在的位置:首页 > PHP网站建设知识库 > Drupal > 正文

Drupal 在新模块中进行主题化

如果创建新模块来扩展 Drupal 函数,就需要告诉 Drupal 您希望如何显示这个模块生成的数据。为了保持可扩展性,最好是在可由您或他人选择使用的主题化系统轻松重写的模块中设置数据的默认显示方式Drupal 主题系统给这个模板提供的一个变量。

创建默认的显示方式 
为了生成默认的主题化输出,我们在模块中创建一个函数。这个函数操作传递给它的数据,并在一个字符串中返回主题化后的内容。例如,在一个称为 shopping_list_items 的模块中,对条目列表进行主题化。主题化后的输出是一个 xHTML 无序条目列表,如 清单 7 所示:

清单 7. 将内容主题化为无序条目列表

function theme_shopping_list_items($list = array()) { $content = '<ul>'; foreach ($list as $list_item) { $content .= '<li>'.$list_item.'</li>'; } $content .= '</ul>'; return $content; }
然后,在模块中构建 Web 页面的部分中,使用 Drupal 主题函数调用 theme_shopping_list_items 函数来返回主题化后的列表。执行的调用如 清单 8 所示:

清单 8. 将输出主题化为条目列表

$tools = array('hammer', 'drill', 'saw'); $content .= theme('shopping_list_items', $tools);
用主题覆盖模块的输出 
正如前面所解释的,可以使用主题目录中的 template.php 文件覆盖主题函数。对于上面的示例,假设我们希望将显示 shopping_list_items 模块生成的条目列表的默认操作从 xHTML 无序列表改为 xHTML 定义列表,见 清单 9。我们在 template.php 文件或节点模块文件中创建这个函数。

清单 9. 将输出主题化为定义列表

function phptemplate_shopping_list_items($items = array()) { $content = '<dl>'; foreach ($items as $list_item) { $content .= '<dt>'.$list_item.'<dt>'; } $content .= '</dl>'; return $content; }
因为 Drupal 知道我们的主题使用 PHPtemplate 引擎,所以它会自动地用这个函数覆盖 shopping_list 模块中的 theme_shopping_list_items 函数。产生的结果是工具的 xHTML 定义列表。还可以更进一步,可以在这个覆盖函数中定义一个文件名,从而让 Drupal 使用一个模板文件定义这个列表的显示,见 清单 10。

清单 10. 使用模板文件进行主题化的函数

function phptemplate_shopping_list_items($items = array()) { $template_file = 'shopping_list_items'; $content = _phptemplate_callback('shopping_list_items', array('items' => $items), $template_file); return $content; }
这里的模板文件可能包含以下代码:

清单 11. 模板文件中显示条目列表的代码片段

<dl> <?php foreach ($items as $list_item) : ?> <dl><?php print $list_item; ?></dl> <?php endforeach; ?> </dl>
请记住,我们正在使用 PHPtemplate 引擎。_phptemplate_callback 函数将变量 list_items 设置为 $items 数组,并将对 phptemplate_shopping_list_items 的调用连接到模板文件 shopping_list_items.tpl.php。这种内容主题化方法是首选的,因为它干净地将大块 PHP 代码与 xHTML 分隔开了。