posts - 431,  comments - 344,  trackbacks - 0
1Understanding How Blocks Are Themed

During a page request, the theme system will ask the block system to return a list of blocks for

each region. It does this when generating the variables to send to the page template (usually

page.tpl.php). To gather the themed blocks for the left and right sidebars, Drupal executes the

following:

$sidebar_left = theme('blocks', 'left');

$sidebar_right = theme('blocks', 'right');

// And any other regions exposed by hook_regions().

You might remember that theme('blocks') is actually a call to theme_blocks(). Here’s what theme_blocks() actually does:

function theme_blocks($region) {

$output = '';

if ($list = block_list($region)) {

foreach ($list as $key => $block) {

$output .= theme('block', $block);

}

}

return $output;

}

2Using the Block Hook

function hook_block($op = 'list', $delta = 0, $edit = array())

<?php

// $Id$

/**

 * @file

 * Implements various blocks to improve pending content workflow.

 */

 

/**

 * Implementation of hook_block().

 */

function approval_block($op = 'list', $delta = 0, $edit = array()) {

 switch ($op) {

    case 'list':

      $blocks[0]['info'] = t('Pending comments');

      $blocks[1]['info'] = t('Unpublished nodes');

      return $blocks;

    case 'configure':

      // Only in block 0 (the Pending comments block) can one

      // set the number of comments to display.

      if ($delta == 0) {

        $form['approval_block_num_posts'] = array(

          '#type' => 'textfield',

          '#title' => t('Number of pending comments to display'),

          '#default_value' => variable_get('approval_block_num_posts', 5),

        );

      }

      return $form;

    case 'save':

      if ($delta == 0) {

        variable_set('approval_block_num_posts', (int) $edit['approval_block_num_posts']);

      }

      break;

    case 'view':

      if ($delta == 0 &&user_access('administer comments')) {

        // Retrieve the number of pending comments to display that

        // we saved earlier in the 'save' op, defaulting to 5.

        $num_posts = variable_get('approval_block_num_posts', 5);

        // Query the database for unpublished comments.

        $result = db_query_range('SELECT c.* FROM {comments} c WHERE c.status = %d ORDER BY c.timestamp', COMMENT_NOT_PUBLISHED, 0, $num_posts);

        // Preserve our current location so user can return after editing.

        $destination = drupal_get_destination();

        $items = array();

        while ($comment = db_fetch_object($result)) {

          $items[] = l($comment->subject, 'node/'. $comment->nid, array(), NULL, 'comment-'. $comment->cid). ' '. l(t('[edit]'), 'comment/edit/'. $comment->cid, array(), $destination);

        }

        $block['subject'] = t('Pending comments');

        // We theme our array of links as an unordered list.

        $block['content'] = theme('item_list', $items);

      }

      elseif ($delta == 1 && user_access('administer nodes')) {

        // Query the database for the 5 most recent unpublished nodes.

        // Unpublished nodes have their status column set to 0.

        $result = db_query_range('SELECT title, nid FROM {node} WHERE status = 0 ORDER BY changed DESC', 0, 5);

        $destination = drupal_get_destination();

        while ($node = db_fetch_object($result)) {

          $items[] = l($node->title, 'node/'. $node->nid). ' '. l(t('[edit]'), 'node/'. $node->nid .'/edit', array(), $destination);

        }

        $block['subject'] = t('Unpublished nodes');

        // We theme our array of links as an unordered list.

        $block['content'] = theme('item_list', $items);

      }

      return $block;

 }   

}

drupal_get_destination()

This function remembers the page you were on before you submitted a form, so after you update the comment form to publish or delete a comment, you’ll be automatically redirected from whence you came.

posted on 2007-12-04 11:50 周锐 阅读(210) 评论(0)  编辑  收藏 所属分类: PHP

只有注册用户登录后才能发表评论。


网站导航: