PHP主题是Drupal主题化的最直接的方式了。一个PHP主题包含了对Drupal内置主题函数的覆写。大多数情况下,你只需要覆写基本的主题钩子(比如,页面,节点,区块等等),但是你还可以覆写你想要的任何东西,比如列表和链接的主题。
为了创建一个PHP主题,你需要在你的themes目录下面创建一个子目录(我们这里假定为themes/mytheme),在子目录中,我们创建一个mytheme.theme文件。这个文件是普通的PHP文件,所以一定要包含<?php ?>标签。
在Drupal中,默认的主题函数的命名方式为theme_something() 或者theme_module_something(),后者允许模块为Drupal添加可以主题化的默认外观。一些基本的主题函数,比如theme_error() 和theme_table(),从它们的名字我们就可以看出,它们分别返回一个错误消息和一个表格的HTML代码。由模块定义的主题函数,包括theme_forum_display() 和theme_node_list()。
在你的.theme文件中,你可以覆写任何主题函数。为了覆写主题函数theme_something(),你需要在你的.theme文件中定义一个mytheme_something()函数。这个函数应该和原有函数保持一致。你可以将原有函数拷贝过来,重命名函数名,然后按照需求进行修改。为了避免在将来升级Drupal时出现问题,最好标出原始drupal函数与你定制版本的区别。这样当原有版本被修改时,你能方便的跟进。
必须的函数
除了这些主题函数以外,你还需要两个函数。
第一个就是mytheme_features()。这个函数返回以恶字符串数组,用来标记你主题所支持的特性(比如,搜索框,logo,使命(mission)…)。主题系统会在管理员界面提供这些特性的复选框和相应的设置。在你的代码中,你可以使用theme_get_setting()来获取这些设置的值。如果你打算把你的主题提交到drupal.org上的话,那么建议你实现所有的drupal特性,这样他人就可以定制你的主题了。
可用特性有:
logo |
可用的logo。主题应该检查以下设置:default_logo (布尔值) 和logo_path (字符串) |
toggle_logo |
Logo可被开启和关闭 |
toggle_name |
站名可被开启和关闭 |
toggle_search |
搜索框可被开启和关闭 |
toggle_slogan |
站点标语可被开启和关闭 |
toggle_mission |
站点使命可被开启和关闭 |
toggle_node_user_picture |
展示挨着节点的用户图片,可选的 |
toggle_comment_user_picture |
展示挨着评论的用户图片,可选的 |
下面是标准的chameleon.theme中的_features()函数:
<?php
function chameleon_features() {
return array(
'logo',
'toggle_name',
'toggle_slogan');
}
?>
第2个必须的函数是mytheme_regions(),它定义了主题中可用的区域。
下面是chameleon.theme的_regions()函数:
<?php
function chameleon_regions() {
return array(
'left' => t('left sidebar'),
'right' => t('right sidebar')
);
}
?>
对于你定义的每个区域,你可能想包含一个代码片断,用来在页面中输出该区域的内容。一般情况下,代码是这个样子的:
<?php
if ($blocks = theme_blocks('regionname')) {
$output .= '[wrapping content]' . $blocks . '[/wrapping content]';
}
?>
注意这里的'regionname'是数组中的键,而不是它的文本描述(比如,使用'left',而不是'left sidebar')。这里的'wrapping content'(包装内容),是用来在你的区域内容外面添加一些div, td,文本,或者其它元素的。
所以,为了添加额外的区域,你需要 (a)将你的区域添加到你的_regions()函数的区域列表中, (b)如上所示,将结果内容输出到页面中去。这里的代码简洁易懂,不妨尝试一下。
目录名称
注意,于模板和样式不同,主题是和它们的目录名称绑定到一起的。如果你想复制一个主题,你需要对它的目录,.theme文件,以及.theme文件中的函数名,进行重命名。