Drupal主题模板文件结构

.info (required)

Drupal所必须靠.info文件才能看到你的主题。原数据,样式表,JavaScripts,区块区域和其它内容可以在这里定义。但其它内容全部是可选的。

主题的内部名字也是继承于这个名字,例如,如果它的名字命名为 "eureka.info",则Drupal会将该主题的名字作为“eureka”看待。

name = A fantasy name
//模板名称是必须的,这是用户可读的名字,与主题的Drupal内部名字可以分开单独进行设置。这在这里,字符的限制则很少。
description = Tableless multi-column theme designed for blogs.
//推荐,主题的简短描述
screenshot = screenshot.png
//截图键时可选的,它告诉Drupal主题的缩略图在哪里,在选择主题页面(admin/build/themes)里用到了缩略图.如果.info文件中忽略了该键,那么Drupal就会使用主题目录下面的”screenshot.png”文件。
只有当你的缩略图不叫"screenshot.png",或者你不想把它放到你主题的根目录(比如,screenshot = images/screenshot.png)下面时,才使用该键。
version = 1.0
当发布一个新的版本时,drupal.org会自动为其添加一个版本号。当你为Drupal贡献主题时,你可以忽略该值。如果你的主题没有放到drupal.org上的话,你可以为你的主题指定任意一个版本号。
core = 7.x
//内核,必须的,从Drupal 6.x开始,模块和主题的.info文件都必须指明它们兼容的Drupal内核主版本号。这里设的值将与DRUPAL_CORE_COMPATIBILITY常量相比较。如果不匹配的话,那么主题将被禁用。
engine = phptemplate
//主题引擎,推荐供主题使用。如果没有提供引擎的话,那么主题就是独立的,比如,实现一个”.theme”文件。大多数主题都使用”phptemplate”作为默认引擎。
PHPTemplate负责查找主题用到的主题函数和模板。只有当你理解你在做什么的时候,你才可以忽略这一设置。
base theme = garland
//子主题可以声明一个基主题。这允许主题的继承,也就是说基主题中的资源将被传递下来并在子主题中使用。子主题可以声明别的子主题作为其基主题,也就是允许多重继承的存在。基主题的名字为其在Drupal内部的名字。下面是Garland的子主题Minnelli的相应设置。
regions[header] = Header
regions[highlighted] = Highlighted
regions[help] = Help
regions[content] = Content
regions[sidebar_first] = Left sidebar
regions[sidebar_second] = Right sidebar
regions[footer] = Footer
//我们这样定义主题中的区域,声明键’regions’,紧跟着“[”,接下来是内部名字,接着是“]”,然后是一个等号,右边是用户可读的区域名字。例如,regions[theRegion] = The region name.
features[] = logo
features[] = name
features[] = slogan
features[] = node_user_picture
features[] = comment_user_picture
features[] = favicon
features[] = main_menu
features[] = secondary_menu
//特性
许多由主题控制输出的页面元素,可以在主题的配置页面启用或者禁用. “features”键控制着出现在主题配置页面上的复选框.对于一个主题,如果你不想为其定义某个复选框时,着非常有用.为了删去某个复选框,只需要在”features”中将其删除即可.如果一个也没有定义的话,那么会输出所有默认的复选框.
下面的例子列出了所有由features键控制的元素.通过注释掉primary_links和secondary_links元素,那么站点管理员就不会看到这两个复选框了.
stylesheets[all][] = theStyle.css
stylesheets[print][] = print.css
//传统方式,主题可自动的使用默认的style.css,并且可以在它们的template.php文件中通过调用drupal_add_css()来添加其它样式表。从Drupal6开始,主题也可以通过.info文件来添加样式表。
scripts[] = myscript.js
//传统方式,主题通过在template.php文件中调用drupal_add_js()来添加javascripts脚本。从Drupal6开始,主题也可以通过.info文件来添加javascripts了。
php = 4.3.3
//这个定义了主题支持的PHP最低版本。其默认值源自DRUPAL_MINIMUM_PHP常量,它是Drupal内核所需要的php最低版本。对于一个新的版本,如果需要的话,可以对其进行重新定义。而对于大多数的主题,都不应该添加这一项。
; Information added by drupal.org packaging script on 2011-04-23
version = "7.0"
project = "drupal"
datestamp = "1202913006"

什么是Drupal的区域?

想象一下,如果我们把Drupal网站的页面,切成一片一片的,然后我们可以分别往其中放置各种各样的内容。那么这些切片就是Drupal主题中所说的区域。本质上,区域是Drupal的一种内容组织方式。

Drupal的标准区域有哪些?

sidebar_first,sidebar_second,content,header,footer,highlighted,help,page_bottom,page_top。

Drupal的9个按时间顺序排列的预定义的主题区域

regions[page_top] = Page Top
regions[header] = Header
regions[highlighted] = Highlighted
regions[help] = Help
regions[content] = Content
regions[sidebar_first] = Sidebar First
regions[sidebar_second] = Sidebar Second
regions[footer] = Footer
regions[page_bottom] = Page Bottom
如图所示,展示的Drupal默认区域是一个标准的三栏布局。灰色的区域是必须的,而其余的是可选的。Header、sidebar_first、sidebar_second、footer是布局方面的区域。page_top和page_bottom是特殊区域;它们将在本章的“隐藏区域”部分讨论。

如何为我们的Drupal主题添加自定义区域?

共分两步走。首先,打开主题的info文件输入下列指令(假定我们要添加的自定义区域名为myregion):

regions[myregion] = My region

上述指令方括号里的myregion是区域的机读名,而My region则是区域的人读名。例如:我们在Drupal后台的区块配置界面(url:你的网站域名/admin/structure/block)所见到的就是区域的人读名。

然后打开主题的page.tpl.php文件在你喜欢的位置输入下列代码即可:

print render($page['myregion'];

模板文件 (.tpl.php)

这些模板用作为 xHTML 标记和 PHP 变量。在某些情况下,它们还输出其他类型的数据,例如xml rss。每一个 .tpl.php 文件处理特定的可主题化数据的输出,而有些时候,它能通过“ 这些建议处理多个multiple .tpl.php 文件。它们是可选的,如果在你的主题中没有这些文件,则会回退到缺省的输出。在这些文件中尽量控制住复杂的逻辑。在很多情况下,应该是简单的xHTML 标记和PHP变量。在核心和贡献模块中有许多的这些模板文件。把它们拷到你的主题目录中会使Drupal读取你的这个版本。

注: The 主题注册有关于存在的主题数据的缓存信息。当你添加 移除或相关主题文件或功能函数时,你需要重置它。

下表是Drupal核心提供的主题模板文件列表。

模板文件 位置 描述
html.tpl.php modules/system 站点的主模板文件,包含站点得到HTML页面的<head>...</head>之间的所有元素。
page.tpl.php modules/system 包含HTML页面的<body>...</body>之间的所有元素。
region.tpl.php modules/system 定义区域的布局和渲染
node.tpl.php modules/node 定义节点的布局和渲染
block.tpl.php modules/block 定义区块的布局和渲染
field.tpl.php modules/field/theme 定义字段的布局和渲染

template.php

对所有的条件逻辑和输出数据的处理过程,有template.php 文件。它不是必须的,但是保持.tpl.php文件整洁,常习惯于让 预处理器在产生变量前同.tpl.php文件中的标记合并。 自定义函数 重裁主题函数或者其它自定义的原始输出都可以在这里完成。这个文件必须使用PHP的开始标记 "<?php"打头。而结束标记并不需要,并且也建议你略过它。

使用主题预处理函数为模板添加变量

当大家打开Drupal的模板文件时,可以发现很多PHP变量。在很多时候,模板默认提供的这些变量有可能无法完全满足我们的需求,这时我们就需要为模板文件添加自己的自定义变量了。该怎么做呢?这就要用到Drupal的主题预处理函数THEME_preprocess_HOOK(&$variables)了。

在自己主题的文件夹下面创建一个template.php文件,在其中添加下列代码。

function mytheme_preprocess_page(&$variables) {$variables['custom_text'] = t('嘿!你好!预处理函数!');
}

在上述代码中函数的mytheme字段是主题的名字;page字段是预处理函数所对应的模板文件去掉扩展名之后的名字,也就是主题钩子的名字,即:指明本函数应用于page.tpl.php模板文件。$variables变量是一个数组,我们为它自定义了一个键custom_text,这个键的名字就是我们所创建的新变量的名字了,即:我们创建的新变量名为——$custom_text。然后,我们为这个变量赋予一个字符串‘嘿!你好!预处理函数!’,作为它的值。

好了,现在变量已经有了,下面我们就可以在page.tpl.php文件中使用它了。打开page.tpl.php文件,在希望的位置键入如下代码:

print $custom_text;

如果没有发现,也不要着急,可能是下面两个原因:

  • 你忘记清理缓存了。
  • 在实现预处理函数时,你忘记了参数前的&符号。

使用主题预处理函数处理逻辑

Drupal主题开发中的一个重要原则:尽量不要在模板文件中处理复杂的逻辑,它们应该放在PHP函数中,而不是模板中。这样做的最大好处是:逻辑层与表示层的分离,有利于代码的组织与维护。

function mytheme_preprocess_page(&variables) {if ($variables['is_front']) {$variables['custom_text'] = t(‘这儿是首页’);}else {$variables['custom_text'] = t('这儿不是首页');}
}

这是一个很简单的if...else...逻辑,if的条件是$variables['is_front']这个变量,其中的数组键'is_front'表示page.tpl.php模板文件中的$is_front变量,该变量是一个布尔值,用于判断用户访问的当前页面是否为Drupal网站的首页。如果是首页,我们的自定义模板变量$custom_text的值为‘这儿是首页’,否则为’这儿不是首页‘。

function mytheme_preprocess_page(&variables) {if (isset($variables['user']->roles[3])) {$variables['custom_text'] = t(‘我是网站管理员’);}else {$variables['custom_text'] = t('我不是网站管理员');}
}

第一个函数的区别在于$user(在预处理函数中用$variables['user']表示)变量,它采用对象的形式表示当前访问的用户,而$user->roles[3](在预处理函数中用$variables['user']->roles[3]表示)则表示网站管理员这一用户角色。

模板建议template suggestion

模板建议是基于Drupal中已经存在的.tpl.php模板文件的替换模板。这个定义主要有两个要点:(1)模板建议是.tpl.php模板;(2)模板建议用于替换已经存在的.tpl.php模板。

block.tpl.php是一个Drupal内核中定义的基模板,用于区块的显示,同时还定义了一些模板建议。通过实现这些模板建议,我们可以针对不同的区块条件使用特定的模板。如block--block--1.tpl.php模板用于Drupal网站中的第一个区块,block--sidebar_first.tp.php模板则用于Drupal网站中左边栏中的区块。
Drupal的内核,主题,主题引擎和模块都可以提供模板建议,这可以使Drupal的开发工作更加smart。

Drupal内核和很多contrib projects不是已经提供了非常多的模板建议了吗?这是因为我们有时需要根据自己的特定条件应用某个模板,而这些条件是Drupal内核和contrib projects的作者所没有顾及到的。

function mytheme_preprocess_node(&$variables) {if ($variables['type'] == 'page') {$variables['theme_hook_suggestions'][] = 'node__custom';}
}

没错!我们的自定义模板建议通过Drupal的主题预处理函数添加。

这个函数的作用:添加了名为node--custom.tpl.php的模板建议。if中的条件$variables['type'] == 'page'可以根据你的需求进行扩展......

预处理函数与处理函数的执行顺序

Drupal的主题机制当中存在很多种预处理函数和处理函数,看起来让人犯晕。本文为大家总结了它们执行的基本规律。

  • Drupal的所有预处理函数在处理函数之前运行。
  • template前缀的函数首先运行,module前缀的函数其次运行,theme前缀的函数最后运行。
  • Drupal的多钩子函数在特定钩子函数之前运行。

下面是总结的执行顺序列表,自上而下执行:

  • template_preprocess()
  • template_preprocess_HOOK()
  • MODULE_preprocess()
  • MODULE_preprocess_HOOK()
  • THEME_preprocess()
  • THEME_preprocess_HOOK()
  • template_process()
  • template_process_HOOK()
  • MODULE_process()
  • MODULE_process_HOOK()
  • THEME_preprocess()
  • THEME_preprocess_HOOK()

子主题

表面上,子主题同其它主题的行为是一样的。唯一区别是它继承了父主题的资源。要创建一个,则在.info文件中需要有一个“基主题”入口。在这里,它可以从父主题继承资源。还可以有多层的继承;例如,子主题可以声明其它的子主题作为它的基主题。对此没有固定的限制。

Drupal 5 以前的版本需要子主题目录在父主题目录中,现在不需要了。

其它s

  • 要让主题能运行,图标和截图不是绝对需要,但建议有,特别是当你将主题贡献到Drupal库中时。截图会显示在内部的主题管理页面,以及如果有相应权限的话用户账号设置中可以选择主题。更多信息请参见 截图指南
  • 为支持管理UI设置或在图标,搜索,使命等等上面的 "特性" ,可以使用 "theme-settings.php" 文件。这是一个高级特性,更多的信息参见手册中的 高级设置
  • 对于 颜色模块支持,需要一个有 "color.inc" 文件及相关文件的目录 "color"来支持。
  • 如果你想使用核心主题来做的话,使用 子主题 或者拷贝一份重命名一下。 强烈不建议直接修改Garland 或 Minnelli。因为它们要用来安装和更新过程。

参考 
page.tpl.php模板文件可用的标准变量
http://www.ibm.com/developerworks/cn/opensource/os-new-drupal-theme/index.html
http://drupalchina.cn/doc/1170.html

Drupal主题开发相关推荐

  1. drupal主题开发_Drupal开发人员,关于如何使您的网站更易于访问

    drupal主题开发 对于OpenConcept Consulting Inc.的创始人兼总裁开放源代码开发人员Mike Gifford ,在他的名字后面提到Drupal可访问性是多余的. 他花了十年 ...

  2. Drupal主题开发指南(5.x)

    这本指南适用于Drupal 5以及更早的版本,对于drupal,有一个新的主题开发指南已经可用.我们手册的这一部分,主要是关于主题系统的各个方面,希望这对广大的drupal主题开发者能够有所帮助. 强 ...

  3. Drupal常用开发工具(一)——Devel模块

    2019独角兽企业重金招聘Python工程师标准>>> 进行 Drupal 开发时有许多模块和工具可供使用,其中最常用的两项便是 Devel 及 Drupal for Firebug ...

  4. Css定制Drupal主题风格

    Css定制Drupal主题风格 "主题"是Drupal站点的基本外貌和感觉.有时一个特定的站点会安装不止一个的主题.如果站点管理员提供了多个主题,你可以为你的帐号选择你喜欢的默认主 ...

  5. wordpress模版post.php,WordPress主题开发手册

    WordPress使用多个模板文件来显示[文章]这个文章类型. 处理博客或其文章的任何内容都属于[文章]文章类型. Index.php 如果没有其他模板文件,index.php将显示[文章]文章类型. ...

  6. liferay开发文档_Liferay –简单主题开发

    liferay开发文档 实际上,Liferay的6.1版本已经走了很长一段路,该版本完全支持JSF和IceFaces. 我一直在努力学习它的绳索,因为我希望使其成为我们团队中的标准协作工具. 好的软件 ...

  7. Liferay –简单主题开发

    实际上,Liferay的6.1版本已经走了很长一段路,该版本完全支持JSF和IceFaces. 我的目标是使它成为我们团队中的标准协作工具,因此我仍在尝试学习它的精髓. 好的软件应用程序可以解决问题, ...

  8. wordpress 主题开发

    https://www.cnblogs.com/welhzh/p/6937243.html wordpress 主题开发 https://yusi123.com/3205.html https://t ...

  9. Drupal常用开发工具(二)——Drupal for Firebug

    2019独角兽企业重金招聘Python工程师标准>>> Drupal 的开发工具有很多,除了<Drupal常用开发工具(一)--Devel模块>中提到的 Devel 模块 ...

  10. 2020年wordpress主题开发视频教程、WP主题WP模板开发视频教程

    这个<2020年wordpress主题开发视频教程>是由码不停蹄官网录制的wordpress建站系列教程之一.本套视频教程非常适合wordpress新手用来学习开发wordpress主题模 ...

最新文章

  1. 智源重大研究方向:机器学习学术报告会(暨学者候选人发布)
  2. POJ 1474 Video Surveillance(半平面交)
  3. 浅拷贝和深拷贝的应用
  4. iis mysql php 附件上传大小_修改上传附件2M大小限制的方法/php+iis上传附件默认大小修改方法...
  5. 高级C语言教程-sscanf()函数使用方式
  6. 深度学习表征的不合理有效性——从头开始构建图像搜索服务(一)
  7. 此计算机无法设置密码,电脑该怎么设置密码
  8. 【数据结构1800题 (陈守孔) 第2章】线性表 算法设计题全解
  9. aspen吸收塔气液比优化_Aspen软件在天然气净化过程中的模拟与优化
  10. cad重新加载php命令,cad撤回命令是什么
  11. 五分钟入门 Dingo API 1
  12. 大鱼吃小鱼java源代码_大鱼吃小鱼Java课程设计
  13. 华为软开云2--玩转代码托管
  14. 众创空间和共享办公室有什么不同吗
  15. 转载 Fluent中的压力分类
  16. 软件供应链的漏洞及攻击类型
  17. matlab学习记录
  18. html响应式布局效果图,响应式网页布局的实现方法原理
  19. 刷机-3.71M33升级到3.71M33-4的方法
  20. Unable to find a version of the runtime to run this application解决方法

热门文章

  1. 苏宁易购正在“酝酿”下一场蝶变?
  2. SSL基础:12:查询证书详细信息
  3. Office 针式打印机如何插入色带
  4. 电风扇计算机控制系统,语音识别电风扇控制系统设计.doc
  5. 三层交换机和vrrp协议
  6. 网页中文转英文(国际化)
  7. linux怎么关闭超线程模式,Linux动态启用/禁用超线程技术的方法详解
  8. 工业级高精度电磁流量计解决方案
  9. 高三数学微课堂【教学视频】
  10. PTA-哥尼斯堡的“七桥问题” (20 分)