用于输出区块中(页面的左右栏)的内容.这个模板是可选的,通过拷贝默认的模板文件,并修改它,就可以覆写这个模板.
模板可用的变量
$block对象包括:
$block->module
生成该区块的模块的名称.
$block->delta
区块在其模块中的id.
$block->subject
区块标题.
$block->content
区块的html内容
$block->status
区块的状态(0或者1).
$block->region
区域名称,默认可用的区域有'left', 'right', 'header' 和'footer'(左栏,右栏,页首,页脚).
$block->throttle:
节流阀设置.
其它变量:
$directory
主题所在的目录,比如themes/garland 或者themes/garland/minelli.
$is_front
如果当前页面为drupal站点首页的话,返回True。
$id
展示的区块的序列id,比如,第一个区块为1,第2个区块为2,等等。
$block_id
与$id一样,但是在左右栏中将被重置。
$zebra
'odd' 或者'even'。这对于使用css创建斑马线非常有用。
$block_zebra
与$zebra一样,但是在左右栏中将被重置。
默认模板
默认的block.tpl.php,位于themes/engines/phptemplate/block.tpl.php。
<div id="block-<?php print $block->module .'-'. $block->delta; ?>" class="block block-<?php print $block->module ?>">
<?php if ($block->subject): ?>
<h2><?php print $block->subject ?></h2>
<?php endif;?>
<div class="content"><?php print $block->content ?></div>
</div>
Drupal 4.6 vs. Drupal 4.7及更高版本
在Drupal 4.6中这些变量是不同的:
在drupal4.7及更高的版本中,除了默认的'left', 'right', 'header' 和'footer'以外,你还可以定义自己的区域。
推荐阅读:
我为客户创建过一些drupal站点,站点创建后由客户来维护,我发现客户对于节点、页面、区块这些drupal概念非常困惑,所以我在所有的自定义区块的底部都添加了一个链接“编辑这个区块”,而只有具有区块管理权限的用户才可以看到这个链接(同样,我对page.tpl.php也作了相应的修改,使得只有具有页面管理权限的用户才能看到页面右下角的编辑链接)。
<div class="<?php print "block block-$block->module" ?>" id="<?php print "block-$block->module-$block->delta"; ?>">
<?php print $block->subject ?>
<div class="content"><?php print $block->content ?>
<?php if ($block->module == "block"):?>
<?php if (user_access('administer blocks')) :?>
<br /><center><a href='/admin/block/edit/<?php print $block->delta;?>'>(edit this block)</a></center>
<?php endif; ?>
<?php endif; ?>
</div>
</div>
注意编辑链接的路径在各个drupal版本下有所不同。
在Drupal5.0中,设计者可以基于特定的区块、区块所属的模块、以及区块所在的区域,为区块创建多个tpl.php文件。
drupal模板文件的查找顺序如下:
例如,用户登录区块的delta为0。假如你将它放在了左栏中,当它显示时,PHPTemplate将按照下面的顺序寻找模板文件:
通过查看页面的源文件,你可以找到区块所属的模块以及delta:每个区块的主DIV都使用了下面的类和ID:
<div class="block block-{module}" id="block-{module}-{delta}">
使用CSS自定义样式
你也可以使用这些类和IDs为区块添加CSS规则,可用于所有的区块,特定模块的区块,或者单个区块。(为了通过区域来自定义区块的样式,你需要在选择器中使用整个区域DIV的类或者ID)。
注意,delta一般是一个数字:模块中区块的排序,从0开始。在一些情况下,delta也可以是一个名字:为了给Views模块创建的区块定义外观,你可以使用block-views-[name of your block].tpl.php。
注意:在Drupal 5中,这更简单了。只需要像前文所讲的那样就可以了。
方法1
这里所讲的具有一些技巧性,它允许你为特定的区块创建一个单独的block.tpl.php模板。你可以使用区块名称或者区块ID进行控制。下面是一个修改后的block.tpl.php,在前面带了一个条件语句。你所要做的就是编辑module == '[模块名]' 和delta == '[区块名或id]'部分就可以了。
下面是我当前的block.tpl.php,条件里面的区块信息是我站点特有的。如果你想在你的drupal站点上使用它的话,你需要按照前面所说的对其进行修改。这个是在我的站点上,为两个区块加载一个自定义block.tpl.php,你可以根据需要用于,1个,6个等等。对于每个自定义模板,你都需要一个条件语句("if "部分)。
<?php
if ( ( $block->module == 'views' && $block->delta == 'Cool Block' ) || ( $block->module == 'node' && $block->delta == '0' ) ) {
include 'block-custom.tpl.php'; /*load a custom template for those two block IDs */
return; }
?>
<div class="<?php print "block block-$block->module" ?>" id="<?php print "block-$block->module-$block->delta"; ?>">
<div class="title"><h3><?php print $block->subject ?></h3></div>
<div class="content"><?php print $block->content ?></div>
</div>
你需要自己创建一个block-custom.tpl.php,根据需要你可以创建任意多个这样的模板文件。为了在你的Drupal站点上进行测试,你可以复制一份标准的区块模板,将其改名为block-custom.tpl.php,然后对其进行编辑,比如将标题放在最后面而不是最前面,然后查看效果。剩下的就是你的事儿了。你可以在模板中根据需要放置任何想要的东西。
这意味着所有的区块都可以拥有自定义的外观,这是很多人都热切希望的。将这个添加到新的区域功能中,你将拥有100%的自定义区块。
方法2
JohnAlbin写的
block.tpl.php的内容:
<?php
$block_module = $block->module;
// force delta to be alphanumeric
$block_name = $block_module . '-' . preg_replace('/[^\w]/', '', $block->delta);
switch ($block_name) {
case 'menu-2': // Primary links
case 'views-CoolBlock': // a custom Views block named "Cool Block"
if ( @include("block-$block_name.tpl.php") ) {
return;
}
break;
}
?>
<div class="block block-<?php print $block_module; ?>" id="block-<?php print $block_name; ?>">
<h2 class="title"><?php print $block->subject; ?></h2>
<div class="content"><?php print $block->content; ?></div>
</div>
这段代码就有下面的优势:
1. 在id属性中不会有奇怪的字符(比如空格)。
2. 如果没有"block-[module]-[delta].tpl.php"文件的话,也不会引起PHP警告,此时将会使用默认的block.tpl.php代码。
方法3
dman写的
在block.tpl.php的最顶部:
<?php
// allow for unique blocks to have their own phptemplate theme
if(!empty($block->subject))
$blockid = 'block-'.strtolower(preg_replace("/[^A-Za-z0-9]+/","-",$block->subject));
else
$blockid = 'block-'.$block->module.'-'.$block->delta;
if (file_exists(path_to_theme() . "/$blockid.tpl.php")) {
include path_to_theme() . "/$blockid.tpl.php";
return;
}
?>
现在你就可以实现block-block-7.tpl.php或者block-login.tpl.php等等模板文件了。