【Drupal】一些常用的主题函数备忘

Drupal 做为一款优秀的开源 CMS 其主题模板定制功能也非常强大,昨天写了在 Joomla 模板中常用的函数今天当然少不了整理 Drupal 的了。做模块程序开发的就不用往下看了,以下大部分函数及方法多用于模板及调试主题,解释说明部分也仅适合 Drupal 前台开发,因为本人是做前端开发,后台程序的部分我就不献丑了。按照惯例下面的代码需要放在 php 标签内,下面收集的这些函数均可在 Drupal 官方的 API 文档中找到,具体地址 http://api.drupal.org/ 个人这里列出了一些对前台模板主题比较实用重要的如下:

1、打印数组及对象:print_r();

 echo print_r($user); 

解释说明:做 Drupal 主题模板开发一段时间会发现 print_r(); 函数将伴随始终,当你需要调用某个值的时候可以去请教跟你协作的后台工程师,也可以使用上面代码自行打印,然后找出自己需要的。示例中打印的即是所有 user 对象的值,有用户 ID 可以用来拼出用户的页面路径,有用户的角色,用户的头像,当然包含用户密码的 MD5 值信息等;拓展一下,你可以在 node.tpl.php 模板中打印 node 对象以达到完全拆分 cck 输出的信息和节点正文等各个字段。

2、判断用户是否登陆:global $user;

global $user;    if( $user->uid ){ /* 用户已经登陆 */ }else{ /* 用户没有登陆 */ }

解释说明:其实本示例是通过判断 uid 来区别用户是否登陆的,该使用方法可以扩展到根据 uid 的具体值来区分具体某个用户,如 if ( $user->uid == 1 ) 为超级管理员。

3、判断角色以区别对待:global $user;

global $user;    if( in_array('guest',$user->roles) ){ /* 用户 guest 角色 */ }else{ /* 不是该角色 */ }

解释说明:这里仍然是通过读取 user 对象获取其角色信息,其他的应用可以自己去拓展,如输出用户头像、输出用户基本信息等等。

4、判断用户是否有编辑权限

if ( node_access('update', $node) ){ /* 具有编辑权限 */ } else { /* 不可编辑该节点 */ }

解释一下:示例用于区分当前用户是否具有对该节点的编辑权限,具有编辑权限是通常会输出编辑按钮或编辑的链接地址。

5、按节点 node 类型使用不同的 page 模板

if( $node->type == 'blog' ){ include 'page-blog.tpl.php'; return; }

解释一下:通常我们会根据节点内容类型使用诸如 node-blog.tpl.php 格式的节点模板分别渲染,但如果想做到整个 page 都有所区别则需要示例中的代码。

6、按照 URL 选择不同的 page 模板

if( arg(0) == 'admin' ){ include 'admin.tpl.php'; return; }

解释一下:这里的 URL 必须为 Drupal 的内部路径而不是通过 path 的 url 重写后的路径,而且模板引擎默认会先按路径寻找模板文件如 page-admin.tpl.php 如果没有找到才会读取 page.tpl.php 进而使示例代码生效。

7、在外部 JavaScript 文件中引用 Drupal 路径

解释一下:如果你引入一个外部 JavaScript 脚本文件,而这个文件里面又恰好有用到网站路径的话就需要用到 Drupal 默认提供的 Drupal JS 对象了,在 JavaScript 文件中可以使用 Drupal.settings[‘basePath’] 来直接调用当前 Drupal 的根路径等同于 $base_path 变量或者是 base_path() 函数在 PHP 中使用。

8、在模板中定义更多区块位置

function yourTheme_regions(){
    return array('side' => '边栏', 'head' => '页头', 'foot' => '页脚', 'content' => '内容');
}

解释一下:将代码放于模板文件夹下的 template.php 文件中(如果没有请创建并以 <?php 作为文件开头)即可在“管理-区块”页面定义更多区域位置,这块可能也是从 Joomla 到 Drupal 最不习惯的概念之一。

9、判断当前页面是否为首页

if( $is_front ){ /* 首页代码 */ }

简单解释:通过判断 Drupal 变量 is_front 可以直接判断当前页面是否是首页,这在首页与内页结构样式相差不大的情况下将非常有用,可以方便的减少大量重复代码。

10、根据 URL 生成页面 Class ID 以更方便使用 CSS 定制外观

  

简单解释:尽管 Drupal 的主题化定制已经非常灵活,但毕竟多数模块提供的 theme 函数非常有限,如果仅仅是为了调整一小块的样式而使用 page-*.tpl.php 甚至单独开发模块的话明显得不偿失,于是可以使用上面的变通的方法,这样页面在加载时会添加一个以当前路径命名的 Class 或 ID 这样就可以很方便的使用 CSS 的层级选择器来修改样式(如 div.path-node-add a { color:#F00; } 就可以方便的定制“node/add”页面的链接的样式而不需要单独创建 tpl 或覆写函数)这也正是 Yahoo UI 里面采用的方案。

11、语言 PO 的文件头信息

msgid ""
msgstr ""
"Project-Id-Version: drupal (6.10)\n"
"POT-Creation-Date: 2009-05-06 23:18 +0800\n"
"PO-Revision-Date: 2009-04-16 23:06 +0800\n"
"Language-Team: Chinese, Simplified\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n!=1);\n"

简单解释,这是 Drupal 的本地化 PO 文件中简体中文(zh-hans)的头部信息,特别需要注意的是最后的 Plural-Forms 属性,一定不要写错。

12、定制搜索没有返回结果的页面

我们知道定制 Drupal 的搜索结果页可在 phptemplate.php 里面通过覆写 theme_search_item($item, $type) 函数来实现,但如果搜索没有返回任何结果时 Drupal 是写死的,这里所实现的就是修改 “Check if your spelling is correct. 请检查您的拼写。” 部分的内容。

简单的说是通过在模板文件 box.tpl.php 里面判断 $title == t(‘Your search yielded no results’) 来实现搜索无结果页的定制。

简单解释,由于 Search 模块内没有提供“无返回搜索结果”时可供 phptemplate 覆写的主题函数,而是直接写死的(即“请检查您的拼写是否正确”等文字提示)而多数情况为了避免用户跳出,这里会做一些提示性信息或是一些链接;所以这里可以在 box.tpl.php 模板里面通过判断 title 为 “搜索没有找到任何结果” 来单独定制该页面的内容。

依葫芦画瓢,此方法可应用来定制其他模块里面所有使用 theme(‘box’, $title, $output) 函数渲染的输出内容部分,只需要在 box.tpl.php 里面判断 $title 的值与该模块输出的 $title 值相同(如评论模块里面的 theme(‘box’, t(‘Comment viewing options’), $output) 里面的 t(‘Comment viewing options’) 等等)即可;但不适用于 $title 为非固定值得部分,好在多数由 box 方式渲染的部分都是固定的(如 菜单管理页面的“导航”部分 提交评论的“提交新评论”部分 等等)。

13、取得网站的绝对路径: $base_path 和 base_path();

由于 Drupal 整站采用的都是相对路径,但当网站安装目录没有在根目录(/)下而我们又需要获得绝对路径的时候我们可以使用 $base_path(在 page.tpl.php 里)base_path()(在 node.tpl.php 里)变量或者函数获取。

14、配合 ImageCache 手工输出格式化图片输出效果

print theme('imagecache', $preset, $image['filepath'], $alt, $title,  $attributes);
// $preset :预先在 admin 里面定义的 ImageCache 动作如缩放裁切等;
// $image['filepath'] :即文件的路径,可使用 upload 或者 CCK 的内容;
// $alt $title :即图片的 alt 及 title 属性,没有图片或关闭图片浏览时的替代文字及提示;
// $attributes :定义其他属性的一个数组,如图片的 class width height 等内容;

我们在使用 ImageCache 和 CCK 结合可以很方便的任意设置动态生成各种缩略图缓存,而在 tpl 模板文件中则可以直接使用上面的 theme 函数调用 ImageCache 中预设的动作实时生成图片缓存。

15、……

一条评论

已关闭评论。