/[drupal]/drupal/modules/block.module
ViewVC logotype

Contents of /drupal/modules/block.module

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.206.2.6 - (show annotations) (download) (as text)
Sun Nov 12 17:12:08 2006 UTC (3 years ago) by killes
Branch: DRUPAL-4-7
Changes since 1.206.2.5: +2 -2 lines
File MIME type: text/x-php
#63267, results of drupal_eval() depend on whitespace, backport from HEAD
1 <?php
2 // $Id: block.module,v 1.206.2.5 2006/11/01 19:19:16 killes Exp $
3
4 /**
5 * @file
6 * Controls the boxes that are displayed around the main content.
7 */
8
9 /**
10 * Implementation of hook_help().
11 */
12 function block_help($section) {
13 switch ($section) {
14 case 'admin/help#block':
15 $output = '<p>'. t('Blocks are boxes of content that may be rendered into certain regions of your web pages, for example, into sidebars. Blocks are usually generated automatically by modules (e.g., Recent Forum Topics), but administrators can also define custom blocks.') .'</p>';
16 $output .= '<p>'. t('The region each block appears in depends on both which theme you are using (some themes allow greater control over block placement than others), and on the settings in the block administration section.') .'</p>';
17 $output .= '<p>'. t('The block administration screen lets you specify the vertical placement of the blocks within a region. You do this by assigning a weight to each block. Lighter blocks (those having a smaller weight) "float up" towards the top of the region; heavier ones "sink".') .'</p>';
18 $output .= t('<p>A block\'s visibility depends on:</p>
19 <ul>
20 <li>Its enabled checkbox. Disabled blocks are never shown.</li>
21 <li>Its throttle checkbox. Throttled blocks are hidden during high server loads.</li>
22 <li>Its page visibility settings. Blocks can be configured to be visible/hidden on certain pages.</li>
23 <li>Its custom visibility settings. Blocks can be configured to be visible only when specific conditions are true.</li>
24 <li>Its user visibility settings. Administrators can choose to let users decide whether to show/hide certain blocks.</li>
25 <li>Its function. Some dynamic blocks, such as those generated by modules, will be displayed only on certain pages.</li>
26 </ul>
27 ');
28 $output .= '<h3>'. t('Module blocks') .'</h3>';
29 $output .= '<p>'. t('Some modules generate blocks that become available when the modules are enabled. These blocks can be administered via the <a href="%admin-block">blocks administration page</a>.</p>', array('%admin-block' => url('admin/block'))) .'</p>';
30 $output .= '<h3>'. t('Administrator defined blocks') .'</h3>';
31 $output .= '<p>'. t('Administrators can also define custom blocks. These blocks consist of a title, a description, and a body which can be as long as you wish. Block content can be in any of the input formats supported for other content.') .'</p>';
32 $output .= t('<p>You can</p>
33 <ul>
34 <li>enable, throttle and configure blocks at <a href="%admin-block">administer &gt;&gt; blocks</a>.</li>
35 <li>add an administrator-defined block at <a href="%admin-block-add">administer &gt;&gt; blocks &gt;&gt; add block</a>.</li>
36 </ul>
37 ', array('%admin-block' => url('admin/block'), '%admin-block-add' => url('admin/block/add')));
38 $output .= '<p>'. t('For more information please read the configuration and customization handbook <a href="%block">Block page</a>.', array('%block' => 'http://drupal.org/handbook/modules/block/')) .'</p>';
39 return $output;
40 case 'admin/modules#description':
41 return t('Controls the boxes that are displayed around the main content.');
42 case 'admin/block':
43 return t("
44 <p>Blocks are boxes of content that may be rendered into certain regions of your web pages, for example, into sidebars. They are usually generated automatically by modules, but administrators can create blocks manually.</p>
45 <p>Only enabled blocks are shown. You can position blocks by specifying which area of the page they should appear in (e.g., a sidebar). Highlighted labels on this page show the regions into which blocks can be rendered. You can specify where within a region a block will appear by adjusting its weight.</p>
46 <p>If you want certain blocks to disable themselves temporarily during high server loads, check the 'Throttle' box. You can configure the auto-throttle on the <a href=\"%throttle\">throttle configuration page</a> after having enabled the throttle module.</p>
47 <p>You can configure the behaviour of each block (for example, specifying on which pages and for what users it will appear) by clicking the 'configure' link for each block.</p>
48 ", array('%throttle' => url('admin/settings/throttle')));
49 case 'admin/block/add':
50 return t('<p>Here you can create a new block. Once you have created this block you must make it active and give it a place on the page using <a href="%overview">blocks</a>. The title is used when displaying the block. The description is used in the "block" column on the <a href="%overview">blocks</a> page.</p>', array('%overview' => url('admin/block')));
51 }
52 }
53
54 /**
55 * Implementation of hook_perm().
56 */
57 function block_perm() {
58 return array('administer blocks', 'use PHP for block visibility');
59 }
60
61 /**
62 * Implementation of hook_menu().
63 */
64 function block_menu($may_cache) {
65 $items = array();
66
67 if ($may_cache) {
68 $items[] = array('path' => 'admin/block', 'title' => t('blocks'),
69 'access' => user_access('administer blocks'),
70 'callback' => 'block_admin_display');
71 $items[] = array('path' => 'admin/block/list', 'title' => t('list'),
72 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10);
73 $items[] = array('path' => 'admin/block/configure', 'title' => t('configure block'),
74 'access' => user_access('administer blocks'),
75 'callback' => 'block_admin_configure',
76 'type' => MENU_CALLBACK);
77 $items[] = array('path' => 'admin/block/delete', 'title' => t('delete block'),
78 'access' => user_access('administer blocks'),
79 'callback' => 'block_box_delete',
80 'type' => MENU_CALLBACK);
81 $items[] = array('path' => 'admin/block/add', 'title' => t('add block'),
82 'access' => user_access('administer blocks'),
83 'callback' => 'block_box_add',
84 'type' => MENU_LOCAL_TASK);
85 foreach (list_themes() as $key => $theme) {
86 if ($theme->status) {
87 if ($key == variable_get('theme_default', 'bluemarine')) {
88 $items[] = array('path' => 'admin/block/list/' . $key, 'title' => t('%key settings', array('%key' => $key)),
89 'access' => user_access('administer blocks'), 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10);
90 }
91 else {
92 $items[] = array('path' => 'admin/block/list/' . $key, 'title' => t('%key settings', array('%key' => $key)),
93 'access' => user_access('administer blocks'), 'type' => MENU_LOCAL_TASK);
94 }
95 }
96 }
97 }
98
99 return $items;
100 }
101
102 /**
103 * Implementation of hook_block().
104 *
105 * Generates the administrator-defined blocks for display.
106 */
107 function block_block($op = 'list', $delta = 0, $edit = array()) {
108 switch ($op) {
109 case 'list':
110 $blocks = array();
111
112 $result = db_query('SELECT bid, title, info FROM {boxes} ORDER BY title');
113 while ($block = db_fetch_object($result)) {
114 $blocks[$block->bid]['info'] = $block->info ? check_plain($block->info) : check_plain($block->title);
115 }
116 return $blocks;
117
118 case 'configure':
119 $box = block_box_get($delta);
120 if (filter_access($box['format'])) {
121 return block_box_form($box);
122 }
123 break;
124
125 case 'save':
126 block_box_save($edit, $delta);
127 break;
128
129 case 'view':
130 $block = db_fetch_object(db_query('SELECT * FROM {boxes} WHERE bid = %d', $delta));
131 $data['subject'] = check_plain($block->title);
132 $data['content'] = check_markup($block->body, $block->format, FALSE);
133 return $data;
134 }
135 }
136
137 /**
138 * Update the 'blocks' DB table with the blocks currently exported by modules.
139 *
140 * @return
141 * Blocks currently exported by modules.
142 */
143 function _block_rehash() {
144 global $theme_key;
145
146 init_theme();
147
148 $result = db_query("SELECT * FROM {blocks} WHERE theme = '%s'", $theme_key);
149 while ($old_block = db_fetch_object($result)) {
150 $old_blocks[$old_block->module][$old_block->delta] = $old_block;
151 }
152
153 $blocks = array();
154
155 foreach (module_list() as $module) {
156 $module_blocks = module_invoke($module, 'block', 'list');
157 if ($module_blocks) {
158 foreach ($module_blocks as $delta => $block) {
159 $block['module'] = $module;
160 $block['delta'] = $delta;
161 // If previously written to database, load values.
162 if ($old_blocks[$module][$delta]) {
163 $block['status'] = $old_blocks[$module][$delta]->status;
164 $block['weight'] = $old_blocks[$module][$delta]->weight;
165 $block['region'] = $old_blocks[$module][$delta]->region;
166 $block['visibility'] = $old_blocks[$module][$delta]->visibility;
167 $block['pages'] = $old_blocks[$module][$delta]->pages;
168 $block['custom'] = $old_blocks[$module][$delta]->custom;
169 $block['throttle'] = $old_blocks[$module][$delta]->throttle;
170 }
171 // Otherwise, use any set values, or else substitute defaults.
172 else {
173 $properties = array('status' => 0, 'weight' => 0, 'region' => 'left', 'pages' => '', 'custom' => 0);
174 foreach ($properties as $property => $default) {
175 if (!isset($block[$property])) {
176 $block[$property] = $default;
177 }
178 }
179 }
180
181 $blocks[] = $block;
182 }
183 }
184 }
185
186 db_lock_table('blocks');
187 // Remove all blocks from table.
188 db_query("DELETE FROM {blocks} WHERE theme = '%s'", $theme_key);
189
190 // Reinsert new set of blocks into table.
191 foreach ($blocks as $block) {
192 db_query("INSERT INTO {blocks} (module, delta, theme, status, weight, region, visibility, pages, custom, throttle) VALUES ('%s', '%s', '%s', %d, %d, '%s', %d, '%s', %d, %d)", $block['module'], $block['delta'], $theme_key, $block['status'], $block['weight'], $block['region'], $block['visibility'], $block['pages'], $block['custom'], $block['throttle']);
193 }
194 db_unlock_tables();
195
196 return $blocks;
197 }
198
199 /**
200 * Generate main block administration form.
201 */
202 function block_admin_display() {
203 global $theme_key, $custom_theme;
204
205 // If non-default theme configuration has been selected, set the custom theme.
206 if (arg(3)) {
207 $custom_theme = arg(3);
208 }
209 else {
210 $custom_theme = variable_get('theme_default', 'bluemarine');
211 }
212 init_theme();
213
214 // Fetch and sort blocks
215 $blocks = _block_rehash();
216 usort($blocks, '_block_compare');
217
218 $throttle = module_exist('throttle');
219 $block_regions = system_region_list($theme_key);
220
221 // Build form tree
222 $form['#action'] = arg(3) ? url('admin/block/list/' . $theme_key) : url('admin/block');
223 $form['#tree'] = TRUE;
224 foreach ($blocks as $i => $block) {
225 $form[$i]['module'] = array('#type' => 'value', '#value' => $block['module']);
226 $form[$i]['delta'] = array('#type' => 'value', '#value' => $block['delta']);
227 $form[$i]['info'] = array('#value' => $block['info']);
228 $form[$i]['status'] = array('#type' => 'checkbox', '#default_value' => $block['status']);
229 $form[$i]['theme'] = array('#type' => 'hidden', '#value' => $theme_key);
230 $form[$i]['weight'] = array('#type' => 'weight', '#default_value' => $block['weight']);
231 $form[$i]['region'] = array('#type' => 'select',
232 '#default_value' => isset($block['region']) ? $block['region'] : system_default_region($theme_key),
233 '#options' => $block_regions,
234 );
235
236 if ($throttle) {
237 $form[$i]['throttle'] = array('#type' => 'checkbox', '#default_value' => $block['throttle']);
238 }
239 $form[$i]['configure'] = array('#value' => l(t('configure'), 'admin/block/configure/'. $block['module'] .'/'. $block['delta']));
240 if ($block['module'] == 'block') {
241 $form[$i]['delete'] = array('#value' => l(t('delete'), 'admin/block/delete/'. $block['delta']));
242 }
243 }
244 $form['submit'] = array('#type' => 'submit', '#value' => t('Save blocks'));
245
246 return drupal_get_form('block_admin_display', $form);
247 }
248
249 /**
250 * Helper function for sorting blocks on admin/block.
251 *
252 * Active blocks are sorted by region, then by weight.
253 * Disabled blocks are sorted by name.
254 */
255 function _block_compare($a, $b) {
256 $status = $b['status'] - $a['status'];
257 // Separate enabled from disabled.
258 if ($status) {
259 return $status;
260 }
261 // Enabled blocks
262 if ($a['status']) {
263 $place = strcmp($a['region'], $b['region']);
264 return $place ? $place : ($a['weight'] - $b['weight']);
265 }
266 // Disabled blocks
267 else {
268 return strcmp($a['info'], $b['info']);
269 }
270 }
271
272 /**
273 * Process main block administration form submission.
274 */
275 function block_admin_display_submit($form_id, $form_values) {
276 foreach ($form_values as $block) {
277 db_query("UPDATE {blocks} SET status = %d, weight = %d, region = '%s', throttle = %d WHERE module = '%s' AND delta = '%s' AND theme = '%s'", $block['status'], $block['weight'], $block['region'], $block['throttle'], $block['module'], $block['delta'], $block['theme']);
278 }
279 drupal_set_message(t('The block settings have been updated.'));
280 cache_clear_all();
281 }
282
283 /**
284 * Theme main block administration form submission.
285 *
286 * Note: the blocks are already sorted in the right order,
287 * grouped by status, region and weight.
288 */
289 function theme_block_admin_display($form) {
290 global $theme_key;
291
292 $throttle = module_exist('throttle');
293 $block_regions = system_region_list($theme_key);
294
295 // Highlight regions on page to provide visual reference.
296 foreach ($block_regions as $key => $value) {
297 drupal_set_content($key, '<div class="block-region">' . $value . '</div>');
298 }
299
300 // Build rows
301 $rows = array();
302 $last_region = '';
303 $last_status = 1;
304 foreach (element_children($form) as $i) {
305 $block = &$form[$i];
306 // Only take form elements that are blocks.
307 if (is_array($block['info'])) {
308 // Fetch values
309 $region = $block['region']['#default_value'];
310 $status = $block['status']['#default_value'];
311
312 // Output region header
313 if ($status && $region != $last_region) {
314 $region_title = t('%region', array('%region' => drupal_ucfirst($block_regions[$region])));
315 $rows[] = array(array('data' => $region_title, 'class' => 'region', 'colspan' => ($throttle ? 7 : 6)));
316 $last_region = $region;
317 }
318 // Output disabled header
319 elseif ($status != $last_status) {
320 $rows[] = array(array('data' => t('Disabled'), 'class' => 'region', 'colspan' => ($throttle ? 7 : 6)));
321 $last_status = $status;
322 }
323
324 // Generate block row
325 $row = array(
326 array('data' => form_render($block['info']), 'class' => 'block'),
327 form_render($block['status']) . form_render($block['theme']),
328 form_render($block['weight']),
329 form_render($block['region'])
330 );
331 if ($throttle) {
332 $row[] = form_render($block['throttle']);
333 }
334 $row[] = form_render($block['configure']);
335 $row[] = $block['delete'] ? form_render($block['delete']) : '';
336 $rows[] = $row;
337 }
338 }
339
340 // Finish table
341 $header = array(t('Block'), t('Enabled'), t('Weight'), t('Placement'));
342 if ($throttle) {
343 $header[] = t('Throttle');
344 }
345 $header[] = array('data' => t('Operations'), 'colspan' => 2);
346
347 $output = theme('table', $header, $rows, array('id' => 'blocks'));
348 $output .= form_render($form['submit']);
349 $output .= form_render($form);
350 return $output;
351 }
352
353 function block_box_get($bid) {
354 return db_fetch_array(db_query('SELECT * FROM {boxes} WHERE bid = %d', $bid));
355 }
356
357 /**
358 * Menu callback; displays the block configuration form.
359 */
360 function block_admin_configure($module = NULL, $delta = 0) {
361
362 $form['module'] = array('#type' => 'value', '#value' => $module);
363 $form['delta'] = array('#type' => 'value', '#value' => $delta);
364
365 $edit = db_fetch_array(db_query("SELECT pages, visibility, custom FROM {blocks} WHERE module = '%s' AND delta = '%s'", $module, $delta));
366
367 // Module-specific block configurations.
368 if ($settings = module_invoke($module, 'block', 'configure', $delta)) {
369 $form['block_settings'] = array(
370 '#type' => 'fieldset',
371 '#title' => t('Block specific settings'),
372 '#collapsible' => true,
373 );
374
375 foreach ($settings as $k => $v) {
376 $form['block_settings'][$k] = $v;
377 }
378 }
379
380 // Get the block subject for the page title.
381 $info = module_invoke($module, 'block', 'list');
382 drupal_set_title(t("'%name' block", array('%name' => $info[$delta]['info'])));
383
384 // Standard block configurations.
385
386 $form['user_vis_settings'] = array(
387 '#type' => 'fieldset',
388 '#title' => t('User specific visibility settings'),
389 '#collapsible' => true,
390 );
391 $form['user_vis_settings']['custom'] = array(
392 '#type' => 'radios',
393 '#title' => t('Custom visibility settings'),
394 '#options' => array(t('Users cannot control whether or not they see this block.'), t('Show this block by default, but let individual users hide it.'), t('Hide this block by default but let individual users show it.')),
395 '#description' => t('Allow individual users to customize the visibility of this block in their account settings.'),
396 '#default_value' => $edit['custom'],
397 );
398 $form['page_vis_settings'] = array(
399 '#type' => 'fieldset',
400 '#title' => t('Page specific visibility settings'),
401 '#collapsible' => true,
402 );
403 $access = user_access('use PHP for block visibility');
404
405 if ($edit['visibility'] == 2 && !$access) {
406 $form['page_vis_settings'] = array();
407 $form['page_vis_settings']['visibility'] = array('#type' => 'value', '#value' => 2);
408 $form['page_vis_settings']['pages'] = array('#type' => 'value', '#value' => $edit['pages']);
409 }
410 else {
411 $options = array(t('Show on every page except the listed pages.'), t('Show on only the listed pages.'));
412 $description = t("Enter one page per line as Drupal paths. The '*' character is a wildcard. Example paths are '%blog' for the blog page and %blog-wildcard for every personal blog. %front is the front page.", array('%blog' => theme('placeholder', 'blog'), '%blog-wildcard' => theme('placeholder', 'blog/*'), '%front' => theme('placeholder', '<front>')));
413
414 if ($access) {
415 $options[] = t('Show if the following PHP code returns <code>TRUE</code> (PHP-mode, experts only).');
416 $description .= t('If the PHP-mode is chosen, enter PHP code between %php. Note that executing incorrect PHP-code can break your Drupal site.', array('%php' => theme('placeholder', '<?php ?>')));
417 }
418 $form['page_vis_settings']['visibility'] = array(
419 '#type' => 'radios',
420 '#title' => t('Show block on specific pages'),
421 '#options' => $options,
422 '#default_value' => $edit['visibility'],
423 );
424 $form['page_vis_settings']['pages'] = array(
425 '#type' => 'textarea',
426 '#title' => t('Pages'),
427 '#default_value' => $edit['pages'],
428 '#description' => $description,
429 );
430 }
431
432 $form['submit'] = array(
433 '#type' => 'submit',
434 '#value' => t('Save block'),
435 );
436
437 return drupal_get_form('block_admin_configure', $form);
438 }
439
440 function block_admin_configure_validate($form_id, $form_values) {
441 if ($form_values['module'] == 'block') {
442 if (empty($form_values['info']) || db_num_rows(db_query("SELECT bid FROM {boxes} WHERE bid != %d AND info = '%s'", $form_values['delta'], $form_values['info']))) {
443 form_set_error('info', t('Please ensure that each block description is unique.'));
444 }
445 }
446 }
447
448 function block_admin_configure_submit($form_id, $form_values) {
449 if (!form_get_errors()) {
450 db_query("UPDATE {blocks} SET visibility = %d, pages = '%s', custom = %d WHERE module = '%s' AND delta = '%s'", $form_values['visibility'], trim($form_values['pages']), $form_values['custom'], $form_values['module'], $form_values['delta']);
451 module_invoke($form_values['module'], 'block', 'save', $form_values['delta'], $form_values);
452 drupal_set_message(t('The block configuration has been saved.'));
453 cache_clear_all();
454 return 'admin/block';
455 }
456 }
457
458 /**
459 * Menu callback; displays the block creation form.
460 */
461 function block_box_add() {
462 $form = block_box_form();
463 $form['submit'] = array('#type' => 'submit', '#value' => t('Save block'));
464
465 return drupal_get_form('block_box_add', $form);
466 }
467
468 function block_box_add_validate($form_id, $form_values) {
469 if (empty($form_values['info']) || db_num_rows(db_query("SELECT info FROM {boxes} WHERE info = '%s'", $form_values['info']))) {
470 form_set_error('info', t('Please ensure that each block description is unique.'));
471 }
472 }
473
474 function block_box_add_submit($form_id, $form_values) {
475 if (!form_get_errors()) {
476 if (block_box_save($form_values)) {
477 drupal_set_message(t('The block has been created.'));
478 return 'admin/block';
479 }
480 }
481 }
482
483 /**
484 * Menu callback; confirm deletion of custom blocks.
485 */
486 function block_box_delete($bid = 0) {
487 $box = block_box_get($bid);
488 $form['info'] = array('#type' => 'hidden', '#value' => $box['info'] ? $box['info'] : $box['title']);
489 $form['bid'] = array('#type' => 'hidden', '#value' => $bid);
490
491 return confirm_form('block_box_delete_confirm', $form, t('Are you sure you want to delete the block %name?', array('%name' => theme('placeholder', $box['info']))), 'admin/block', '', t('Delete'), t('Cancel'));
492 }
493
494 /**
495 * Deletion of custom blocks.
496 */
497 function block_box_delete_confirm_submit($form_id, $form_values) {
498 db_query('DELETE FROM {boxes} WHERE bid = %d', $form_values['bid']);
499 drupal_set_message(t('The block %name has been removed.', array('%name' => theme('placeholder', $form_values['info']))));
500 cache_clear_all();
501 return 'admin/block';
502 };
503
504 function block_box_form($edit = array()) {
505 $form['info'] = array(
506 '#type' => 'textfield',
507 '#title' => t('Block description'),
508 '#default_value' => $edit['info'],
509 '#maxlength' => 64,
510 '#description' => t('A brief description of your block. Used on the <a href="%overview">block overview page</a>.', array('%overview' => url('admin/block'))),
511 '#required' => TRUE,
512 '#weight' => -19,
513 );
514 $form['title'] = array(
515 '#type' => 'textfield',
516 '#title' => t('Block title'),
517 '#default_value' => $edit['title'],
518 '#maxlength' => 64,
519 '#description' => t('The title of the block as shown to the user.'),
520 '#weight' => -18,
521 );
522 $form['body_filter']['#weight'] = -17;
523 $form['body_filter']['body'] = array(
524 '#type' => 'textarea',
525 '#title' => t('Block body'),
526 '#default_value' => $edit['body'],
527 '#rows' => 15,
528 '#description' => t('The content of the block as shown to the user.'),
529 '#weight' => -17,
530 );
531 $form['body_filter']['format'] = filter_form($edit['format'], -16);
532
533 return $form;
534 }
535
536 function block_box_save($edit, $delta = NULL) {
537 if (!filter_access($edit['format'])) {
538 $edit['format'] = FILTER_FORMAT_DEFAULT;
539 }
540
541 if (isset($delta)) {
542 db_query("UPDATE {boxes} SET title = '%s', body = '%s', info = '%s', format = %d WHERE bid = %d", $edit['title'], $edit['body'], $edit['info'], $edit['format'], $delta);
543 }
544 else {
545 db_query("INSERT INTO {boxes} (title, body, info, format) VALUES ('%s', '%s', '%s', %d)", $edit['title'], $edit['body'], $edit['info'], $edit['format']);
546 }
547 return true;
548 }
549
550 /**
551 * Implementation of hook_user().
552 *
553 * Allow users to decide which custom blocks to display when they visit
554 * the site.
555 */
556 function block_user($type, $edit, &$user, $category = NULL) {
557 switch ($type) {
558 case 'form':
559 if ($category == 'account') {
560 $result = db_query('SELECT * FROM {blocks} WHERE status = 1 AND custom != 0 ORDER BY weight, module, delta');
561 $form['block'] = array('#type' => 'fieldset', '#title' => t('Block configuration'), '#weight' => 3, '#collapsible' => TRUE, '#tree' => TRUE);
562 while ($block = db_fetch_object($result)) {
563 $data = module_invoke($block->module, 'block', 'list');
564 if ($data[$block->delta]['info']) {
565 $return = TRUE;
566 $form['block'][$block->module][$block->delta] = array('#type' => 'checkbox', '#title' => $data[$block->delta]['info'], '#default_value' => isset($user->block[$block->module][$block->delta]) ? $user->block[$block->module][$block->delta] : ($block->custom == 1));
567 }
568 }
569
570 if ($return) {
571 return $form;
572 }
573 }
574
575 break;
576 case 'validate':
577 if (!$edit['block']) {
578 $edit['block'] = array();
579 }
580 return $edit;
581 }
582 }
583
584 /**
585 * Return all blocks in the specified region for the current user.
586 *
587 * @param $region
588 * The name of a region.
589 *
590 * @return
591 * An array of block objects, indexed with <i>module</i>_<i>delta</i>.
592 * If you are displaying your blocks in one or two sidebars, you may check
593 * whether this array is empty to see how many columns are going to be
594 * displayed.
595 *
596 * @todo
597 * Add a proper primary key (bid) to the blocks table so we don't have
598 * to mess around with this <i>module</i>_<i>delta</i> construct.
599 * Currently, the blocks table has no primary key defined!
600 */
601 function block_list($region) {
602 global $user, $theme_key;
603
604 static $blocks = array();
605
606 if (!count($blocks)) {
607 $result = db_query("SELECT * FROM {blocks} WHERE theme = '%s' AND status = 1 ORDER BY region, weight, module", $theme_key);
608 while ($block = db_fetch_object($result)) {
609 if (!isset($blocks[$block->region])) {
610 $blocks[$block->region] = array();
611 }
612 // Use the user's block visibility setting, if necessary
613 if ($block->custom != 0) {
614 if ($user->uid && isset($user->block[$block->module][$block->delta])) {
615 $enabled = $user->block[$block->module][$block->delta];
616 }
617 else {
618 $enabled = ($block->custom == 1);
619 }
620 }
621 else {
622 $enabled = TRUE;
623 }
624
625 // Match path if necessary
626 if ($block->pages) {
627 if ($block->visibility < 2) {
628 $path = drupal_get_path_alias($_GET['q']);
629 $regexp = '/^('. preg_replace(array('/(\r\n?|\n)/', '/\\\\\*/', '/(^|\|)\\\\<front\\\\>($|\|)/'), array('|', '.*', '\1'. preg_quote(variable_get('site_frontpage', 'node'), '/') .'\2'), preg_quote($block->pages, '/')) .')$/';
630 // Compare with the internal and path alias (if any).
631 $page_match = preg_match($regexp, $path);
632 if ($path != $_GET['q']) {
633 $page_match = $page_match || preg_match($regexp, $_GET['q']);
634 }
635 // When $block->visibility has a value of 0, the block is displayed on
636 // all pages except those listed in $block->pages. When set to 1, it
637 // is displayed only on those pages listed in $block->pages.
638 $page_match = !($block->visibility xor $page_match);
639 }
640 else {
641 $page_match = drupal_eval($block->pages);
642 }
643 }
644 else {
645 $page_match = TRUE;
646 }
647
648 if ($enabled && $page_match) {
649 // Check the current throttle status and see if block should be displayed
650 // based on server load.
651 if (!($block->throttle && (module_invoke('throttle', 'status') > 0))) {
652 $array = module_invoke($block->module, 'block', 'view', $block->delta);
653 if (isset($array) && is_array($array)) {
654 foreach ($array as $k => $v) {
655 $block->$k = $v;
656 }
657 }
658 }
659 if (isset($block->content) && $block->content) {
660 $blocks[$block->region]["{$block->module}_{$block->delta}"] = $block;
661 }
662 }
663 }
664 }
665 // Create an empty array if there were no entries
666 if (!isset($blocks[$region])) {
667 $blocks[$region] = array();
668 }
669 return $blocks[$region];
670 }
671
672

  ViewVC Help
Powered by ViewVC 1.1.2