Drupal主题高级特性

 译者:老葛

在前面的部分,你学到了Drupal使用的各种不同模板文件,当Drupal要将你的主题合并到一起时就会查找这些模板。你学到了如何创建页面模板文件,如何创建特定节点类型的节点模板文件,甚至特定区块的区块模板文件。换句话说,对于定制主题的知识,你已经掌握了80%。

那么剩下的20%呢?如何主题化Drupal的表单?如何修改一些简单的东西比如面包屑的外观?在这一部分,我们将回答这些问题并帮你成为Drupal主题化的高手。你将从主题化高手的基本武器之一template.php文件开始学起。

template.php文件是整合定制的模板文件的地方:定义新的区块区域,覆写Drupal的默认主题函数,拦截传递给模板文件的变量并创建定制的变量。

覆写主题函数

Drupal的主题系统背后的核心哲理和钩子系统的类似。通过遵循命名规范,就可以标识出哪些函数是主体相关的函数,它们负责格式化并返回你站点的内容。主题函数由它们函数名的前缀“theme_”来标识。这一命名规范使得Drupal能够为所有的主题函数创建一个函数覆写机制。设计者就可以命令Drupal执行一个具有更高优先级的定制的函数,从而代替开发者在模块中给出的默认的主题函数。例如,让我们检查一下当构建站点的面包屑时该流程是怎么工作的。

打开includes/theme.inc并检查文件中的函数。几乎所有的函数都以theme_开头,这就告诉人们它是可以被覆写的。特别的,我们检查theme_breadcrumb():

/**

* Return a themed breadcrumb trail.

*

* @param $breadcrumb

* An array containing the breadcrumb links.

* @return a string containing the breadcrumb output.

*/

function theme_breadcrumb($breadcrumb) {

if (!empty($breadcrumb)) {

return '<div class="breadcrumb">'. implode(' è ', $breadcrumb) .'</div>';

}

}

这个函数控制着Drupal中面包屑导航条的HTML输出。当前,它在面包屑的每一项之间添加了一个指向右边的双箭头分隔符(>>)。假定你想将div标签改为span标签,并使用星号(*)来代替双箭头(>>)。那么你该怎么办呢?一种方式是在theme.inc中修改这个函数,保存,并调用。这样也能达到目的。(不!不!千万不要这样做!)。我们有一些更好的方式。

你见过Drupal内核中是怎么调用这些主题函数么?你永远都不会看到直接调用theme_breadcrumb()的情况。替代的,它通常包装在助手函数theme()中。

你期望函数这样调用:

theme_breadcrumb($breadcrumb)

但实际不是这样。替代的,你将看到开发者这样调用:

theme('breadcrumb', $breadcrumb);

这个通用的theme()函数负责初始化主题层并将函数调用分发到合适的位置,这使得我们能够以更优雅的方案来解决我们的问题。图8-5展示了通过调用theme(),命令Drupal按照下面的次序查找相应的面包屑函数。

假定你使用的主题为bluemarine,它是基于PHPTemplate的主题,那么Drupal将会查找下面的函数:

bluemarine_breadcrumb()

phptemplate_breadcrumb()

theme_breadcrumb()

为了修改Drupal的面包屑,在当前主题的文件夹下创建一个空的template.php文件,并将theme.inc中的theme_breadcrumb()函数复制并粘贴到该文件里面。记住要包含<?php标签。还有对函数进行重命名,将theme_breadcrumb改为mytheme_breadcrumb。

<?php

/**

* Return a themed breadcrumb trail.

*

* @param $breadcrumb

* An array containing the breadcrumb links.

* @return a string containing the breadcrumb output.

*/

function mytheme_breadcrumb($breadcrumb) {

if (!empty($breadcrumb)) {

return '<span class="breadcrumb">'. implode(' * ', $breadcrumb) .'</span>';

}

}

图8-5 覆写主题的工作原理

 

当下一次Drupal需要生成面包屑时,它就会先找到你的函数并使用它来代替默认的theme_breadcrumb()函数,这样面包屑中就会包含你的星号了,而不再包含默认的双箭头了。很漂亮,不是么?你没有修改一行核心代码。通过theme()函数来管理所有的主题函数调用,如果当前主题覆写了任何一个theme_ 函数,Drupal都可以检查到这些覆写的函数并使用它们来代替默认的主题函数。开发者,请注意:在你的模块中任何需要输出HTML或者XML的部分都应该使用以“theme_”开头的主题函数,这样s设计者就可以覆写它们了。拿user.module来说(参看图8-6)

图8-6 可以在主题层覆写由模块暴露的主题函数。定制的主题函数mytheme_user_picture()覆写了默认的theme_user_picture(),接下来将会使用mytheme_user_picture()代替theme_user_picture()。

第8章 Drupal 主题系统( Drupal theme)(4) 高级特性--1,覆写主题函数相关推荐

  1. 第九章--对象的⽣命周期(工厂高级特性)

    1. 什么是对象的⽣命周期 指的是⼀个对象创建.存活.消亡的⼀个完整过程. 2. 为什么要学习对象的⽣命周期 new 出来的对象 最终内存不够由JVM虚拟机的垃圾回收GC 或者进程结束消亡. 由Spr ...

  2. Drupal 覆写系统样式

    如果要覆写系统样式,需要在指定的theme中的theme.info中做指定,假设需要覆写 modules/system/system-menus.css 样式文件,就需要在theme.info中增加或 ...

  3. 第8章 Drupal 主题系统( Drupal theme)(3) 模板文件

    译者:老葛 理解模板文件 一些主题包含所有的各种模板文件,而其他仅包含page.tpl.php.所以你如何知道你可以创建那些模板文件以及哪些可被Drupal识别?创建模板文件时所遵循的命名习惯有哪些? ...

  4. 第8章 Drupal 主题系统( Drupal theme)(2) 安装主题

    译者:老葛 安装主题 为了使在Drupal管理界面能够呈现一个新的主题,你需要把它放到sites/sitename/themes下面.如果你想在一个多站点Drupal系统中使所有的站点都可以使用它,那 ...

  5. Drupal 主题系统( Drupal theme)(1)

    译者:老葛 修改Drupal生成的HTML或者其他标识字体,你需要深入的了解主题系统的各个组成部分.主题系统是个优雅的架构,它可使你绕过核心代码,但是它有一个很长的学习曲线,特别是在你想使你的站点于其 ...

  6. Drupal Theme 主题系统:入门与进阶教程

    Drupal的外观控制是最为灵活可定制的,但是这个系统复杂而且不够直观.另外,某些思维不够流畅的作者经常会写出一些晦涩难懂的Drupal主题高级特性之类的文章,把学习Theme的激情完全打垮了.为此本 ...

  7. Drupal网站系统的应用

    Drupal网站管理系统 http://www.intematrix.cn/book/export/html/74 Drupal,全球最流行的开源网站的内容管理(CMS)和发布系统,它是用PHP写成的 ...

  8. php德育元素,的人如何使用tpl.php文件主题化drupal表单

    如何使用tpl.php文件主题化Drupal表单 来源萃图网络http://www.cuitu.net 您可能已经知道 tpl.php文件模板只能影响内容输出.下面的例子显示了PHPTempl ...

  9. material theme 自定义_Angular Material 主题系统(二)-- 自定义主题

    实际的开发场景中,应用程序的文字排版不是一成不变的,也常常需要自定义颜色来适配具体项目需求,这就需要去自定义 Material 的主题. Angular Material 库的样式是采用 Sass 开 ...

最新文章

  1. EL之Bagging(DTR):利用DIY数据集(预留30%数据+两种树深)训练Bagging算法(DTR)
  2. 使用KubeKey 离线环境部署 KubeSphere v3.0.0
  3. 在MAC系统的eclipse里打开android sdk manager
  4. pycharm无法识别css,PyCharm中HTML页面CSS class名称自动完成功能失效的问题
  5. 今天就唠叨唠叨吧……
  6. 传智播客软件测试第一期_播客:冒险如何推动一位软件工程师的职业发展
  7. Postman----Presets(预先设置)的使用
  8. dw上的php代码如何预览在浏览器_13个面向开发人员的JavaScript代码编辑器和IDE
  9. 计算机英语基础课程论文,计算机专业英语结课论文.doc
  10. C#-WinForm-ListView-表格式展示数据、如何将数据库中的数据展示到ListView中、如何对选中的项进行修改...
  11. oracle 索引问题梳理
  12. python 折线图 excel_python - 如何向excel插入新值同时更新对应的折线图
  13. FFmpeg色度抠图
  14. P2905 [USACO08OPEN]农场危机Crisis on the Farm-dp
  15. android网页编辑软件,HTML5编辑器
  16. 纪中游记(7.11~7.22)
  17. veket+linux+v7,veket linux安装工具
  18. 计算机毕业论文选题推荐|软件工程|系列八
  19. COMSOL多物理场/FDTD时域有限差分/ RSoft光电器件仿真设计“ 几十种案例解析,助您掌握光电器件仿真模拟
  20. 除了北上广深,程序员的归宿还有哪些城市?

热门文章

  1. 企业电子招标采购系统源码Spring Cloud + Spring Boot + MybatisPlus + Redis + Layui + 前后端分离 + 二次开发
  2. ubuntu10.04 下通过usb在真机调试android程序的设置
  3. 赛门铁克软件恢复服务器系统,赛门铁克系统恢复盘Veritas System Recovery 多语言版...
  4. 计算机考研只考计算机网络的学校,计算机考研容易的学校有哪些 计算机考研难度排行榜...
  5. 考研计算机南大和武大难度,全国高校考研录取难度排行榜,浙大第五、南大第十!武大掉出前十...
  6. activity的startActivity和context的startActivity区别
  7. Generalizing A Person Retrieval Model Hetero- and Homogeneously阅读总结
  8. GPS北斗定位模块如何应用于智慧农业
  9. 去掉video 自带的下载
  10. 群晖video station 2.4.9-1626申请API后无法连接的解决办法