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

  ViewVC Help
Powered by ViewVC 1.1.2