drupal/modules/block/block.api.php

202 lines
6.9 KiB
PHP

<?php
// $Id$
/**
* @file
* Hooks provided by the Block module.
*/
/**
* @addtogroup hooks
* @{
*/
/**
* Define all blocks provided by the module.
*
* Any module can export a block (or blocks) to be displayed by defining
* the _block hook. This hook is called by theme.inc to display a block,
* and also by block.module to procure the list of available blocks.
*
* @return
* An associative array whose keys define the $delta
* for each block and whose values contain the block descriptions. Each
* block description is itself an associative array, with the following
* key-value pairs:
* - 'info': (required) The human-readable name of the block.
* - 'cache': A bitmask of flags describing how the block should behave with
* respect to block caching. The following shortcut bitmasks are provided
* as constants in common.inc:
* - DRUPAL_CACHE_PER_ROLE (default): The block can change depending on the
* roles the user viewing the page belongs to.
* - DRUPAL_CACHE_PER_USER: The block can change depending on the user
* viewing the page. This setting can be resource-consuming for sites
* with large number of users, and should only be used when
* DRUPAL_CACHE_PER_ROLE is not sufficient.
* - DRUPAL_CACHE_PER_PAGE: The block can change depending on the page
* being viewed.
* - DRUPAL_CACHE_GLOBAL: The block is the same for every user on every
* page where it is visible.
* - DRUPAL_NO_CACHE: The block should not get cached.
* - 'weight', 'status', 'region', 'visibility', 'pages':
* You can give your blocks an explicit weight, enable them, limit them to
* given pages, etc. These settings will be registered when the block is first
* loaded at admin/block, and from there can be changed manually via block
* administration.
* Note that if you set a region that isn't available in a given theme, the
* block will be registered instead to that theme's default region (the first
* item in the _regions array).
*
* After completing your blocks, do not forget to enable them in the
* block admin menu.
*
* For a detailed usage example, see block_example.module.
*/
function hook_block_info() {
$blocks['exciting'] = array(
'info' => t('An exciting block provided by Mymodule.'),
'weight' => 0,
'status' => 1,
'region' => 'sidebar_first',
// DRUPAL_CACHE_PER_ROLE will be assumed for block 0.
);
$blocks['amazing'] = array(
'info' => t('An amazing block provided by Mymodule.'),
'cache' => DRUPAL_CACHE_PER_ROLE | DRUPAL_CACHE_PER_PAGE,
);
return $blocks;
}
/**
* Configuration form for the block.
*
* @param $delta
* Which block to return. This is a descriptive string used to identify
* blocks within each module and also within the theme system.
* The $delta for each block is defined within the array that your module
* returns when the hook_block_info() implementation is called.
* @return
* Optionally return the configuration form.
*
* For a detailed usage example, see block_example.module.
*/
function hook_block_configure($delta = '') {
if ($delta == 'exciting') {
$form['items'] = array(
'#type' => 'select',
'#title' => t('Number of items'),
'#default_value' => variable_get('mymodule_block_items', 0),
'#options' => array('1', '2', '3'),
);
return $form;
}
}
/**
* Save the configuration options.
*
* @param $delta
* Which block to save the settings for. This is a descriptive string used
* to identify blocks within each module and also within the theme system.
* The $delta for each block is defined within the array that your module
* returns when the hook_block_info() implementation is called.
* @param $edit
* The submitted form data from the configuration form.
*
* For a detailed usage example, see block_example.module.
*/
function hook_block_save($delta = '', $edit = array()) {
if ($delta == 'exciting') {
variable_set('mymodule_block_items', $edit['items']);
}
}
/**
* Process the block when enabled in a region in order to view its contents.
*
* @param $delta
* Which block to return. This is a descriptive string used to identify
* blocks within each module and also within the theme system.
* The $delta for each block is defined within the array that your module
* returns when the hook_block_info() implementation is called.
* @return
* An array which must define a 'subject' element and a 'content' element
* defining the block indexed by $delta.
*
* The functions mymodule_display_block_exciting and _amazing, as used in the
* example, should of course be defined somewhere in your module and return the
* content you want to display to your users. If the "content" element is empty,
* no block will be displayed even if "subject" is present.
*
* For a detailed usage example, see block_example.module.
*/
function hook_block_view($delta = '') {
switch ($delta) {
case 'exciting':
$block = array(
'subject' => t('Default title of the exciting block'),
'content' => mymodule_display_block_exciting(),
);
break;
case 'amazing':
$block = array(
'subject' => t('Default title of the amazing block'),
'content' => mymodule_display_block_amazing(),
);
break;
}
return $block;
}
/**
* Act on blocks prior to rendering.
*
* This hook allows you to add, remove or modify blocks in the block list. The
* block list contains the block definitions not the rendered blocks. The blocks
* are rendered after the modules have had a chance to manipulate the block
* list.
* Alternatively you can set $block->content here, which will override the
* content of the block and prevent hook_block_view() from running.
*
* @param $blocks
* An array of $blocks, keyed by $bid
*
* This example shows how to achieve language specific visibility setting for
* blocks.
*/
function hook_block_info_alter(&$blocks) {
global $language, $theme_key;
$result = db_query('SELECT module, delta, language FROM {my_table}');
$block_languages = array();
foreach ($result as $record) {
$block_languages[$record->module][$record->delta][$record->language] = TRUE;
}
foreach ($blocks as $key => $block) {
// Any module using this alter should inspect the data before changing it,
// to ensure it is what they expect.
if ($block->theme != $theme_key || $block->status != 1) {
// This block was added by a contrib module, leave it in the list.
continue;
}
if (!isset($block_languages[$block->module][$block->delta])) {
// No language setting for this block, leave it in the list.
continue;
}
if (!isset($block_languages[$block->module][$block->delta][$language->language])) {
// This block should not be displayed with the active language, remove
// from the list.
unset($blocks[$key]);
}
}
}
/**
* @} End of "addtogroup hooks".
*/