按区域或者模块,对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版本: