drupal主题层
在接下来的两章 我们先讲module如何与theme层整合,第三章我们主要讲述体系架构,主题函数,模板,渲染元素,主题注册。第四章我们讲实例。
业务逻辑与表现逻辑
传统的分离为了:
- 代码容易维护
- 代码复用
drupal却把”swap-ability“用到了极致
你也许会想 主题是给网站提供html和css的,那么在drupal官网有成百上千的贡献模块,这些主题能照顾到每一个模块的外观么??当然不
因为模块本身是最知道该如何排列的,模块随时可以覆写默认主题样式来达到目的
回头看第二章的代码
$variables = array('items' => $list, 'type' => 'ol');
$content = theme('item_list', $variables)
通过调用theme(),我们确认了委托并用了合适的接口,我们实际在告诉drupal:
“hey theme()! 我想要把我的数据标记成item_list形状,你能帮我么?我不太知道细节~谢谢”
我们的模块仅仅需要决定用哪一个主题钩子来标记数据,数据被显示为一个无序列表 一个表格 还是一个字母表。
除了API钩子,drupal也提供了theme钩子,一个主题钩子是一个简单的标记数据命名法,如 用item_list等不同参数来标记数据将会有不同的效果,不过要记住,跟以前一样,一个模块只能有一个主题钩子
当你调用theme()时,实际调用的是缺省主题function theme_HOOKNAME ,覆写的主题function为 THEMENAME_HOOKNAME,在drupal内部机制中,你可以看到一个theme_item_list()在 includes.inc或 theme.inc中,这个是缺省主题下面的item_list。如果我们启用了另一个主题,如Bartik,它可以用bartik_item_list()来覆写原先的function,这样theme()就用这个代替了原先的函数了。
数据粒度
这样做有两个优点
- 每个模块负责主题化自己的data,可以制作非常特殊化的主题,也可以复用缺省主题,同时还允许自定义css
- 对开发者很友好,颗粒化使得开发者能根据自己的意图更好的改写界面。
主题引擎
Title: 列表项的titile
Type: 返回的列表类型 (e.g. ul, ol).
Attributes:应用于列表元素的属性。
$vars)。