hook_block 的实现(2)

description: 
本篇教程介绍了如何用一个模块添加多个区块。

上篇文章我们在一个模块上添加了一个block,现在我们来学习如何添加多个block。快到春节了,我们再做一个春节的倒计时吧。
注意一下代码的变化:
<?php
/**
 * Implementation of hook_block().
 */
function dateblock_block($op = 'list', $delta = 0, $edit = array()) {
    switch ($op) {
        case 'list':
            $blocks[0]['info'] = t('Date Block');
            $blocks[0]['cache'] = BLOCK_NO_CACHE;
            $blocks[1]['info'] = t('春节倒计时');
            $blocks[1]['cache'] = BLOCK_NO_CACHE;
           
            return $blocks;
       
        case 'view':
            $block['subject'] = t("Today's Date");
            $format = variable_get('dateblock', 1);
            if ($format == 1) {
              $block['content'] = date('Y/n/j');
            }
            elseif ($format == 2) {
                $block['content'] = date('D n/j/Y');
            }
            elseif ($format == 3) {
                $block['content'] = date('D M/j/Y');
            }
           
            return $block;
       
        case 'configure':
            $options = array(
              1 => t('2009/1/1'),
              2 => t('Thur 1/1/2009'),
              3 => t('Thur Mon/1/2009'),
            );
           
            $form['date_format'] = array(
              '#type' => 'select',
              '#title' => t('Date Format'),
              '#options' => $options,
              '#default_value' => variable_get('dateblock', 1)
            );
           
            return $form;
           
        case 'save':
            variable_set('dateblock',(int)$edit['date_format']);
           
            break;
    }
}
?>
我在list里面又添加了$blocks[1],这就是第二个block。保存后访问 http://localhost/drupal/admin/build/block 就可以看到我新添加的“春节倒计时”。下面我们在view里为这个block添加内容。之前我提过$delta是用来表示block的编号的,第一个block$delta=0,第二个是1。所以我们现在要根据$delta的不同来给block分配不同的内容了。
<?php
/**
 * Implementation of hook_block().
 */
function dateblock_block($op = 'list', $delta = 0, $edit = array()) {
    switch ($op) {
        case 'list':
            $blocks[0]['info'] = t('Date Block');
            $blocks[0]['cache'] = BLOCK_NO_CACHE;
            $blocks[1]['info'] = t('春节倒计时');
            $blocks[1]['cache'] = BLOCK_NO_CACHE;
           
            return $blocks;
       
        case 'view':
            if ($delta == 0) {
                $block['subject'] = t("Today's Date");
                $format = variable_get('dateblock', 1);
                if ($format == 1) {
            $block['content'] = date('Y/n/j');
                }
                elseif ($format == 2) {
                    $block['content'] = date('D n/j/Y');
                }
                elseif ($format == 3) {
                    $block['content'] = date('D M/j/Y');
                }
               
                return $block;
            }
            elseif ($delta == 1) {
                $today = mktime();
                $spring_festival = mktime(0, 0, 0, 1, 25, 2009);
                $days = round(($spring_festival - $today) / (3600 *24));
                $block['subject'] = t('距离2009年春节还有:');
                $block['content'] = $days.t('天');
               
                return $block;
            }
       
        case 'configure':
            $options = array(
              1 => t('2009/1/1'),
              2 => t('Thur 1/1/2009'),
              3 => t('Thur Mon/1/2009'),
            );
           
            $form['date_format'] = array(
              '#type' => 'select',
              '#title' => t('Date Format'),
              '#options' => $options,
              '#default_value' => variable_get('dateblock', 1)
            );
           
            return $form;
           
        case 'save':
            variable_set('dateblock',(int)$edit['date_format']);
           
            break;
    }
}
?>
其实知道了原理后就简单了,我们只需要先判断一下$delta值,为不同的block分配不同的内容。如果要对第二个block进行配置的话也需要修改一下configure和save。具体的可以参考我上传的代码。

评论

不错,谢谢!
只是这个没有截图。

晕,怎么看不到我刚才的回复

-----------

呵呵,看到了。