你可以为单篇文章、URL路径、分类术语、章节、和你的首页定制主题。
一种方式是使用sections module,来为你站点的不同部分使用不同的主题。然而,如果你的自定义主题或者模块拥有自己的主题模板文件的话,比如event(事件)模块,它需要许多重复的CSS和图片资源。
在一个Drupal站点上使用多个主题的关键是,由主题引擎决定当前你在站点中所处的位置。下面是我们可以从模板引擎中检查的一列条件。
$is_front phptemplate变量可用来检查当前是否处于首页。
if ($is_front) {
include('front.tpl.php');
return;
}
?>
Drupal的arg()函数用来得到路径中的参数。
arg(0)=="admin"// is /admin
arg(0) =="node"// is /node
arg(0)=="user" // is /user
arg(0)=="node"&&arg(1)=="add" // is /node/add
arg(0)=="node"&& arg(2)=="edit" // is /node/###/edit
arg(0)=="user"&&arg(1)=="add" // is /user/add
arg(0)=="admin"&&arg(1)="user"&&arg(2)=="create" // is /admin/user/create
arg(0)=="alias"&&arg(1)=="alias1" is /alias/alias1
arg(0)=="taxonomy"&&arg(1)=="term"&&arg(2)=="term#" // is /taxonomy/term/term#
//arg(1)=="comment"
//arg(2)=="reply"
一旦你知道了front_page的值,或者路径,那么我们就可以使用不同的主题模板,也可使用CSS文件,或者修改xHTML标签的CSS类了。本节将分成3个子页面。
1,使用一个特定的模板,比如front.tpl.php, admin.tpl.php, term#.tpl.php。
if ($is_front) {
include 'front.tpl.php';
return;
}
elseif (arg(0)=="taxonomy"&&arg(1)=="term"&&arg(2)=="term#") { // add argument of choice
include 'term#.tpl.php';// add template of choice
return;
}
2,另一种选择是,为站点的不同部分使用不同的CSS。在下面的例子中,我们将基于路径来决定当前所在的位置,然后使用不同的CSS。在下面的例子中,我们决定要添加哪一个CSS。
if ($is_front) {
include 'page_front.tpl.php';
return;
}
if ($node->type == 'nodetype') { // all pages on my site are 'nodetype'
$my_path = explode("/", drupal_get_path_alias('node/'.$node->nid)); // all pages have path like 'section/page'
$my_path = $my_path[0];
} else {
$my_path = arg(0);
}
switch ($my_path) {
case 'using':
$section = 1;
break;
case 'education':
$section = 2;
break;
case 'company':
$section = 3;
break;
case 'image':
$section = 4;
break;
case 'forum':
$section = 5;
break;
default:
$section = 0;
}
$css_section = 'section'.$section;
?>
3,我们也可以为要被主题化的xHTML直接添加CSS类。
PHPTemplate 主题:
在page.tpl.php的body标签中(来自于bluemarine):
将变为:
接着你就可以为管理页面使用.admin作为css父选择器了。
对于Smarty
在page.tpl的body标签中(来自于bluemarine_smarty):
将变为:
当查看根节点时,这可能产生一个空的class属性值---可以在class中包含一个固定的前缀,从而阻止这种情况的发生。