跳转到主要内容
qingkong 提交于 21 August 2014

3.3 Drupal主题制作的准备工作(下)Get ready to Theming (III)

3.5    模板建议(template / theme hook suggestion)

一旦你确认了页面构成元素、填写好了对应的表格并画好了线框图,你就可以开始制作主题了。

我们已经在上一章第三节讲述覆写的时候提过模板覆写的命名规则。在Drupal的范畴中这个命名规则有着自己的专有名词:template suggestion 或者theme hook suggestion .我们权且翻译成模板建议好了。

开始制作主题之前,这个知识点还是有必要了解一下的,因为当你为不同的区块、页面编写模板的时候,你都会遇到模板文件命名的问题。如果命名错误,你的模板就不会生效。以下是Drupal7的模板命名规则——模板建议:

3.5.1  区块的模板建议

基模板: block.tpl.php

模板建议:block--[region|[module|--delta]].tpl.php

可能的模板:

1. block--module--delta.tpl.php

2. block--module.tpl.php

3. block--region.tpl.php

“module”是模块的名称、“delta”是由模块指定的区块ID。

比如我们用自定义区块功能定义的第一个区块,其相应的模板文件命名为:“block--block--1.tpl.php”这其中第二个“block”的含义是:这个区块是由核心的block模块生成的。“1”的含义是生成的第一个模块,该区块的delta值为1。“region”会在相对应的区域上生效,例如:“block--sidebar_first.tpl.php”,这其中的“sidebar_first”就是一个在.info文件中定义的区域。(值得注意的是,这里的下划线被保留了)

如果你有一个叫做“custom”的自定义模块生成了一个ID为“my-blcok”的区块,那么当你为这个区块定义自己的模板时,你就应该把模板命名为“block--custom--my-block.tpl.php”

如果你用views模块生成了一个视图名为“front_news”,ID为“block_1”的区块,那么这个区块的模板建议应该是“block--views--front-news-block-1.tpl.php”(值得注意的是,这里的下划线应该被转换成短横线)

上面的“module”是模块的名称,如果你有一个叫做“MyModule”的模块生成了一个区块,这个区块的模板建议应该是“block--MyModule.tpl.php”,如果你的模块叫做“xxx”,那么这个区块的模板建议应该是“block--xxx.tpl.php”。不过,请你别把模块命名为xxx,写程序的人很多都是偏执暴力狂,他们看到这样的名字往往会发病。

3.5.2  其他模板建议

其余的模板建议可以在官网找到:https://www.drupal.org/node/1089656。由于内容的相似性,这里不对其余模板建议进行详细描述,仅列举部分如下,请注意,标有序号的都是可

选的模板,但是越是排在前面的作用范围越小,优先级也越高,即查找顺序从上至下:

评论:comment--node-[type].tpl.php  

基模板:comment.tpl.php

如果对某内容类型为“article”的节点进行评论,则模板建议为“comment--node-article.tpl.php”

comment-wrapper--node-[type].tpl.php  同上

基模板:comment-wrapper.tpl.php

 

字段:field--[type|name[--content-type]|content-type].tpl.php

基模板:field.tpl.php

1.field--field-name--content-type.tpl.php

2.field--content-type.tpl.php

3.field--field-name.tpl.php

4.field--field-type.tpl.php

注意这里的name指的是字段的机读名称,并且这个机读名称中的下划线会被短横线所替换。并且自定义字段的名字前面要加上“field-”如:“field--field-phone.tpl.php”

 

论坛:forums--[[container|topic]--forumID].tpl.php

基模板:forums.tpl.php

For forum containers:

1. forums--containers--forumID.tpl.php

2. forums--forumID.tpl.php

3. forums--containers.tpl.php

For forum topics:

1. forums--topics--forumID.tpl.php

2. forums--forumID.tpl.php

3. forums--topics.tpl.php

 

HTML模板:html.tpl.php

如下是两个例子:

html--internalviewpath.tpl.php

html--node--id.tpl.php

 

维护状态:maintenance-page--[offline].tpl.php

当数据库出错的时候,你可以为出错页面写一个更友好的页面模板。为了显示出这个更友好维护页面必须先进行正确的配置,详情请看https://www.drupal.org/node/195435

 

节点:node--[type|nodeid].tpl.php

基模板:node.tpl.php

1. node--nodeid.tpl.php

2. node--type.tpl.php

3. node.tpl.php

 

页面:page--[front|internal/path].tpl.php

基模板:page.tpl.php

这个模板建议可以有无数个,因为它对应的是页面路径,你的网站有多少内容,就会产生多少路径,相应的每个路径的页面都可以使用不同的模板。比较特殊的是首页,在drupal7中,你可以通过 "Administration > Configuration > System > Site information."即“管理》配置》系统》站点信息”来设置首页。被设置成首页的页面会启用模板建议“page--front.tpl.php”

而“http://www.example.com/node/1/edit”路径会有以下的模板建议:

1. page--node--edit.tpl.php

2. page--node--1.tpl.php

3. page--node.tpl.php

4. Page.tpl.php

投票:

poll-results--[block].tpl.php

基模板:poll-results.tpl.php

poll-vote--[block].tpl.php

基模板:poll-vote.tpl.php

poll-bar--[block].tpl.php

基模板:poll-bar.tpl.php

 

Profile:profile-wrapper--[field].tpl.php

基模板:profile-wrapper.tpl.php

 

区域:region--[region].tpl.php

基模板:region.tpl.php

 

搜索:search-results--[searchType].tpl.php

基模板:search-results.tpl.php

 

分类:taxonomy-term--[vocabulary-machine-name|tid].tpl.php

基模板:taxonomy-term.tpl.php

1. taxonomy-term--tid.tpl.php

2. taxonomy-term--vocabulary-machine-name.tpl.php

3. taxonomy-term.tpl.php

注意这里的vocabulary-machine-name中的下划线会被短横线所替换。

标签
Drupal 版本

如果是要复写某个内容类型 的整个page页面的话,单纯的这样page--node--type.tpl.php(type为内容类型的机读名)命名是不行的 ,还要在 tempalte.php 里面加上给出起模板建议的代码。 

function theme_preprocess_page(&$variables,$hook) {
if (isset($variables['node']->type)){
if($variables['node']->type == 'about'){
$variables['theme_hook_suggestions'][]='page__node__about';
}
//如果 想复写多个这里可以继续按照上面的来
}
}
 
其中theme为主题名  例如:bartik_preprocess_page    about为你要复写的内容类型的机读名, page__node__about 为你所命名的 模板(page__node__about.tpl.php)
 
给个简单的例子: 主题是 bartik       内容类型机器读名是 about :
 
function bartik_preprocess_page(&$variables,$hook) {
if (isset($variables['node']->type)){
if($variables['node']->type == 'about'){
$variables['theme_hook_suggestions'][]='page__node__about';
}
}
}
那么这样你复写的 page--node--about.tpl.php才会生效