drupal的Block.tpl.php

用于输出区块中(页面的左右栏)的内容.这个模板是可选的,通过拷贝默认的模板文件,并修改它,就可以覆写这个模板.

 

模板可用的变量

$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中这些变量是不同的:

  • $block->region只允许使用0(左栏)或者1(右栏)。
  • 使用$seqid代替$id。
  • 使用$block_seqid代替$block_id。

在drupal4.7及更高的版本中,除了默认的'left', 'right', 'header' 和'footer'以外,你还可以定义自己的区域。

推荐阅读:

 

 相关链接: http://drupal.org/node/11813 , Think in Drupal

 

添加一个“编辑这个区块”链接

我为客户创建过一些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版本下有所不同。

  • /admin/build/block/configure 用于drupal5.x
  • /admin/block/configure 用于drupal4.7
  • /admin/block/edit/ 用于drupal4.6

 相关链接: http://drupal.org/node/120334, Think in Drupal

按区域或者模块,对drupal区块进行主题化

在Drupal5.0中,设计者可以基于特定的区块、区块所属的模块、以及区块所在的区域,为区块创建多个tpl.php文件。

 

drupal模板文件的查找顺序如下:

  • block-[module]-[delta].tpl.php
  • block-[module].tpl.php
  • block-[region].tpl.php
  • block.tpl.php

 

例如,用户登录区块的delta为0。假如你将它放在了左栏中,当它显示时,PHPTemplate将按照下面的顺序寻找模板文件:

  • block-user-0.tpl.php
  • block-user.tpl.php
  • block-left.tpl.php
  • block.tpl.php

 

通过查看页面的源文件,你可以找到区块所属的模块以及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。

 相关链接:http://drupal.org/node/104319 , Think in Drupal

 

Drupal版本:

用于不同区块类型的可选模板(drupal4.7)

注意:在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%的自定义区块。

iDonny, nevetsHeine对本文作了审查

 

方法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等等模板文件了。

 相关链接:http://drupal.org/node/63757 , Think in Drupal

 

Drupal版本: