1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
|
<?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;
}
/**
* Change block definition before saving to the database.
*
* @param $blocks
* A multidimensional array of blocks keyed by the defining module and delta
* the value is a block as seen in hook_block_info(). This hook is fired
* after the blocks are collected from hook_block_info() and the database,
* right before saving back to the database.
* @param $theme
* The theme these blocks belong to.
* @param $code_blocks
* The blocks as defined in hook_block_info before overwritten by the
* database data.
*/
function hook_block_info_alter(&$blocks, $theme, $code_blocks) {
// Disable the login block.
$blocks['user']['login']['status'] = 0;
}
/**
* 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;
}
/**
* Perform alterations to the content of a block.
*
* This hook allows you to modify any data returned by hook_block_view().
*
* Note that instead of hook_block_view_alter(), which is called for all
* blocks, you can also use hook_block_view_MODULE_DELTA_alter() to alter a
* specific block.
*
* @param $data
* An array of data, as returned from the hook_block_view() implementation of
* the module that defined the block:
* - subject: The localized title of the block.
* - content: Either a string or a renderable array representing the content
* of the block. You should check that the content is an array before trying
* to modify parts of the renderable structure.
* @param $block
* The block object, as loaded from the database, having the main properties:
* - module: The name of the module that defined the block.
* - delta: The identifier for the block within that module, as defined within
* hook_block_info().
*
* @see hook_block_view_MODULE_DELTA_alter()
* @see hook_block_view()
*/
function hook_block_view_alter(&$data, $block) {
// Remove the contextual links on all blocks that provide them.
if (is_array($data['content']) && isset($data['content']['#contextual_links'])) {
unset($data['content']['#contextual_links']);
}
// Add a theme wrapper function defined by the current module to all blocks
// provided by the "somemodule" module.
if (is_array($data['content']) && $block->module == 'somemodule') {
$data['content']['#theme_wrappers'][] = 'mymodule_special_block';
}
}
/**
* Perform alterations to a specific block.
*
* Modules can implement hook_block_view_MODULE_DELTA_alter() to modify a
* specific block, rather than implementing hook_block_view_alter().
*
* @param $data
* An array of data, as returned from the hook_block_view() implementation of
* the module that defined the block:
* - subject: The localized title of the block.
* - content: Either a string or a renderable array representing the content
* of the block. You should check that the content is an array before trying
* to modify parts of the renderable structure.
* @param $block
* The block object, as loaded from the database, having the main properties:
* - module: The name of the module that defined the block.
* - delta: The identifier for the block within that module, as defined within
* hook_block_info().
*
* @see hook_block_view_alter()
* @see hook_block_view()
*/
function hook_block_view_MODULE_DELTA_alter(&$data, $block) {
// This code will only run for a specific block. For example, if MODULE_DELTA
// in the function definition above is set to "mymodule_somedelta", the code
// will only run on the "somedelta" block provided by the "mymodule" module.
// Change the title of the "somedelta" block provided by the "mymodule"
// module.
$data['subject'] = t('New title of the 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_list_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 (!isset($block->theme) || !isset($block->status) || $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".
*/
|