Drupal一些常用的主题函数
下面收集的这些函数均可在 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 中预设的动作实时生成图片缓存。
出处:http://nan.im/blog/922