block.module 19.2 KB
Newer Older
Dries's avatar
   
Dries committed
1
<?php
2
// $Id$
Dries's avatar
 
Dries committed
3

Dries's avatar
   
Dries committed
4
5
6
7
/**
 * Implementation of hook_help().
 */
function block_help($section) {
Dries's avatar
   
Dries committed
8
  switch ($section) {
Dries's avatar
   
Dries committed
9
    case 'admin/help#block':
Dries's avatar
   
Dries committed
10
      return t("
Dries's avatar
   
Dries committed
11
<p>Blocks are the boxes visible in the sidebar(s) of your web site. These are usually generated automatically by modules (e.g. recent forum topics), but you can also create your own blocks using either static HTML or dynamic PHP content.</p>
Dries's avatar
   
Dries committed
12
<p>The sidebar each block appears in depends on both which theme you're using (some are left-only, some right, some both), and on the settings in block management.</p><p>Whether a block is visible in the first place depends on four things:</p><ul><li>It must have its \"enabled\" box checked in block management.</li><li>If it has its \"custom\" box checked in block management, the user must have chosen to display it in their user preferences.</li><li>If the \"path\" field in block management is set, the visitor must be on a page that matches the path specification (more on this later).</li><li>If the block has its throttle box checked, the user will only see the block if the site throttle level is low.</li></ul>
Dries's avatar
   
Dries committed
13
<p>The block management screen also lets you specify the vertical sort-order of the blocks within a sidebar. You do this by assigning a <strong>weight</strong> to each block. Lighter blocks (smaller weight) \"float up\" towards the top of the sidebar. Heavier ones \"sink down\" towards the bottom of it.</p>
Dries's avatar
   
Dries committed
14
<p>The path setting lets you define the pages on which a specific block is visible. If you leave the path blank it will appear on all pages. The path uses a regular expression syntax so remember to escape special characters! The path expression is matched against the relative URL of a Drupal page, e.g. <code>book</code>, <code>node/12</code>, <code>admin</code>.</p>
Dries's avatar
   
Dries committed
15
16
<p>In case you do not know what a regular expression is, you should read about them in the PHP manual. The chapter to look at is the one on <a href=\"%pcre\">Perl-Compatible Regular Expressions (PCRE)</a>.</p>
<p>However, for basic tasks it is sufficient to look at the following examples:</p>
Dries's avatar
   
Dries committed
17
<p>If the block should only show up on blog pages, use &lt;^blog&gt;.  To display on all node views use &lt;^node&gt;.  The angular brackets are used as delimiters of the regular expression.  To show up on either forum or book pages use &lt;^(forum|book)&gt;.  The round brackets form a group of expressions, divided by the | character. It matches if any of the expressions in it match.  A more complicated example is &lt;^node/add/(story|blog|image)&gt;. Blocks which have their paths set to this expression will show up on story, block, or image composition pages.  If you want to show a block an all pages, but not the search page, use &lt;^(?!search)&gt;.</p>
Dries's avatar
   
Dries committed
18
19
20
21
22
<h3>Administrator Defined Blocks</h3>
<p>An administrator defined block contains HTML, text or PHP content supplied by you (as opposed to being generated automatically by a module). Each admin-defined block consists of a title, a description, and a body containing text, HTML, or PHP code which can be as long as you wish. The Drupal engine will 'render' the content of the block.</p>
<h4>PHP in admin-defined blocks</h4>
<p>If you know how to script in PHP, Drupal gives you the power to embed any script you like inside a block. It will be executed when the page is viewed and dynamically embedded into the page. This gives you amazing flexibility and power, but of course with that comes danger and insecurity if you don't write good code. If you are not familiar with PHP, SQL or with the site engine, avoid experimenting with PHP blocks because you can corrupt your database or render your site insecure or even unusable! If you don't plan to do fancy stuff with your blocks then you're probably better off with straight HTML.</p>
<p>Remember that the code within each PHP block must be valid PHP code - including things like correctly terminating statements with a semicolon so that the parser won't die. It is highly recommended that you develop your blocks separately using a simple test script on top of a test database before migrating to your production environment.</p>
23
<p>Notes:</p><ul><li>You can use global variables, such as configuration parameters, within the scope of a PHP box but remember that variables which have been given values in a PHP box will retain these values in the engine or module afterwards.</li><li>register_globals is now set to <strong>off</strong> by default. If you need form information you need to get it from the \"superglobals\" \$_POST, \$_GET, etc.</li><li>You should use the <code>return</code> statement to return the actual content for your block.</li></ul>
Dries's avatar
   
Dries committed
24
25
26
<p>A basic example:</p>
<blockquote><p>You want to have a box with the title \"Welcome\" that you use to greet your visitors. The content for this box could be created by going:</p>
<pre>
Dries's avatar
   
Dries committed
27
  return t(\"Welcome visitor, ... welcome message goes here ...\");
Dries's avatar
   
Dries committed
28
29
30
</pre>
<p>If we are however dealing with a registered user, we can customize the message by using:</p>
<pre>
Dries's avatar
   
Dries committed
31
32
33
34
35
  if (\$user->uid) {
    return t(\"Welcome \$user->name, ... welcome message goes here ...\");
  }
  else {
    return t(\"Welcome visitor, ... welcome message goes here ...\");
Dries's avatar
   
Dries committed
36
37
  }
</pre></blockquote>
Dries's avatar
   
Dries committed
38
<p>For more in-depth examples, we recommend that you check the existing boxes and use them as a starting point.</p>", array('%pcre' => 'http://php.net/pcre/'));
Dries's avatar
   
Dries committed
39
    case 'admin/modules#description':
Dries's avatar
   
Dries committed
40
      return t('Controls the boxes that are displayed around the main content.');
Dries's avatar
   
Dries committed
41
    case 'admin/block':
Dries's avatar
   
Dries committed
42
      return t("Blocks are the boxes in the left- and right- side bars of the web site, depending on the chosen theme.  They are made available active modules or created manually. The \"enabled\" checkbox sets the default status of the block. Only enabled blocks are shown. When the \"custom\" checkbox is checked, your users can show or hide the block using their account settings. In that case, the 'enabled' checkbox signifies the block's default status. You can assign the block's placement by giving it a region and a weight. The region specifies which side of the page the block is on, and the weight sorts blocks within a region. Lighter (smaller weight value) blocks \"float up\" towards the top of the page. The path setting lets you define which pages you want a block to be shown on.  Blocks can automatically be temporarily disabled to reduce server load when your site becomes extremely busy by checking throttle.  The auto-throttle functionality must be enabled on the <a href=\"%throttle\">throttle configuration page</a> after having enabled the throttle module.", array('%throttle' => url('admin/settings/throttle')));
Dries's avatar
   
Dries committed
43
    case 'admin/block/add':
44
      return t("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. If you are going to place PHP code in the block, and you have the <em>create php content</em> permission (see the <a href=\"%permission\">permissions</a> page), you <em>must</em> change the type to PHP to make your code active.", array('%overview' => url('admin/block'), '%permission' => url('admin/user/configure/permission')));
Dries's avatar
   
Dries committed
45
  }
Dries's avatar
   
Dries committed
46
47
}

Dries's avatar
   
Dries committed
48
/**
Dries's avatar
Dries committed
49
 * Menu callback; presents the block-specific information from admin/help.
Dries's avatar
   
Dries committed
50
 */
Dries's avatar
   
Dries committed
51
function block_help_page() {
Dries's avatar
   
Dries committed
52
  print theme('page', block_help('admin/help#block'));
Dries's avatar
   
Dries committed
53
54
}

Dries's avatar
   
Dries committed
55
56
57
/**
 * Implementation of hook_perm().
 */
Dries's avatar
   
Dries committed
58
function block_perm() {
Dries's avatar
   
Dries committed
59
  return array('administer blocks');
Dries's avatar
   
Dries committed
60
61
}

Dries's avatar
   
Dries committed
62
/**
Dries's avatar
   
Dries committed
63
 * Implementation of hook_menu().
Dries's avatar
   
Dries committed
64
 */
Dries's avatar
   
Dries committed
65
66
67
68
69
function block_menu() {
  $items = array();
  $items[] = array('path' => 'admin/block', 'title' => t('blocks'),
    'access' => user_access('administer blocks'),
    'callback' => 'block_admin');
Dries's avatar
   
Dries committed
70
71
  $items[] = array('path' => 'admin/block/list', 'title' => t('list'),
    'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10);
Dries's avatar
   
Dries committed
72
73
74
75
76
77
78
79
80
  $items[] = array('path' => 'admin/block/edit', 'title' => t('edit block'),
    'access' => user_access('administer blocks'),
    'callback' => 'block_box_edit',
    'type' => MENU_CALLBACK);
  $items[] = array('path' => 'admin/block/delete', 'title' => t('delete block'),
    'access' => user_access('administer blocks'),
    'callback' => 'block_box_delete',
    'type' => MENU_CALLBACK);
  // Tabs:
Dries's avatar
Dries committed
81
  $items[] = array('path' => 'admin/block/add', 'title' => t('add'),
Dries's avatar
   
Dries committed
82
83
84
85
    'access' => user_access('administer blocks'),
    'callback' => 'block_box_edit',
    'type' => MENU_LOCAL_TASK);
  return $items;
Dries's avatar
   
Dries committed
86
87
}

Dries's avatar
   
Dries committed
88
89
90
91
92
93
94
95
/**
 * Implementation of hook_block().
 *
 * Generates the administrator-defined blocks for display.
 */
function block_block($op = 'list', $delta = 0) {
  if ($op == 'list') {
    $result = db_query('SELECT bid, title, info FROM {boxes} ORDER BY title');
Dries's avatar
   
Dries committed
96
    while ($block = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
97
      $blocks[$block->bid]['info'] = $block->info;
Dries's avatar
   
Dries committed
98
99
100
101
    }
    return $blocks;
  }
  else {
Dries's avatar
   
Dries committed
102
103
104
    $block = db_fetch_object(db_query('SELECT * FROM {boxes} WHERE bid = %d', $delta));
    $data['subject'] = $block->title;
    $data['content'] = ($block->type == 1) ? eval($block->body) : $block->body;
Dries's avatar
   
Dries committed
105
    return $data;
106
107
108
  }
}

Dries's avatar
 
Dries committed
109
function block_admin_save($edit) {
Dries's avatar
   
Dries committed
110
111
  foreach ($edit as $module => $blocks) {
    foreach ($blocks as $delta => $block) {
Dries's avatar
   
Dries committed
112
      db_query("UPDATE {blocks} SET region = %d, status = %d, custom = %d, path = '%s', weight = %d, throttle = %d WHERE module = '%s' AND delta = '%s'",
Dries's avatar
   
Dries committed
113
                $block['region'], $block['status'], $block['custom'], $block['path'], $block['weight'], $block['throttle'], $module, $delta);
Dries's avatar
   
Dries committed
114
    }
Dries's avatar
 
Dries committed
115
  }
Dries's avatar
   
Dries committed
116

Dries's avatar
   
Dries committed
117
  return t('the block settings have been updated.');
Dries's avatar
 
Dries committed
118
119
}

Dries's avatar
   
Dries committed
120
/**
Dries's avatar
   
Dries committed
121
 * Update the 'blocks' DB table with the blocks currently exported by modules.
Dries's avatar
   
Dries committed
122
 *
Dries's avatar
   
Dries committed
123
124
125
 * @param $order_by php <a
 *   href="http://www.php.net/manual/en/function.array-multisort.php">array_multisort()</a>
 *   style sort ordering, eg. "weight", SORT_ASC, SORT_STRING.
126
 *
Dries's avatar
   
Dries committed
127
128
 * @return
 *   Blocks currently exported by modules, sorted by $order_by.
Dries's avatar
   
Dries committed
129
 */
Dries's avatar
   
Dries committed
130
131
function _block_rehash($order_by = array('weight')) {
  $result = db_query('SELECT * FROM {blocks} ');
Dries's avatar
   
Dries committed
132
133
134
135
  while ($old_block = db_fetch_object($result)) {
    $old_blocks[$old_block->module][$old_block->delta] = $old_block;
  }

Dries's avatar
   
Dries committed
136
  db_query('DELETE FROM {blocks} ');
Dries's avatar
   
Dries committed
137
138

  foreach (module_list() as $module) {
Dries's avatar
   
Dries committed
139
    $module_blocks = module_invoke($module, 'block', 'list');
Dries's avatar
   
Dries committed
140
141
    if ($module_blocks) {
      foreach ($module_blocks as $delta => $block) {
Dries's avatar
   
Dries committed
142
143
        $block['module'] = $module;
        $block['delta']  = $delta;
Dries's avatar
   
Dries committed
144
        if ($old_blocks[$module][$delta]) {
Dries's avatar
   
Dries committed
145
146
147
148
149
150
          $block['status'] = $old_blocks[$module][$delta]->status;
          $block['weight'] = $old_blocks[$module][$delta]->weight;
          $block['region'] = $old_blocks[$module][$delta]->region;
          $block['path']   = $old_blocks[$module][$delta]->path;
          $block['custom'] = $old_blocks[$module][$delta]->custom;
          $block['throttle'] = $old_blocks[$module][$delta]->throttle;
Dries's avatar
   
Dries committed
151
152
        }
        else {
Dries's avatar
   
Dries committed
153
154
          $block['status'] = $block['weight'] = $block['region'] = $block['custom'] = 0;
          $block['path']   = '';
Dries's avatar
   
Dries committed
155
156
157
        }

        // reinsert blocks into table
Dries's avatar
   
Dries committed
158
        db_query("INSERT INTO {blocks} (module, delta, status, weight, region, path, custom, throttle) VALUES ('%s', '%s', %d, %d, %d, '%s', %d, %d)",
Dries's avatar
   
Dries committed
159
                  $block['module'], $block['delta'], $block['status'], $block['weight'], $block['region'], $block['path'], $block['custom'], $block['throttle']);
Dries's avatar
   
Dries committed
160
161

        $blocks[] = $block;
Dries's avatar
   
Dries committed
162

Dries's avatar
   
Dries committed
163
164
        // build array to sort on
        $order[$order_by[0]][] = $block[$order_by[0]];
Dries's avatar
   
Dries committed
165
166
167
168
      }
    }
  }

Dries's avatar
   
Dries committed
169
170
171
  // sort
  array_multisort($order[$order_by[0]], $order_by[1] ? $order_by[1] : SORT_ASC, $order_by[2] ? $order_by[2] : SORT_REGULAR, $blocks);

Dries's avatar
   
Dries committed
172
173
  return $blocks;
}
Dries's avatar
   
Dries committed
174

Dries's avatar
   
Dries committed
175
176
177
/**
 * Prepare the main block administration form.
 */
Dries's avatar
   
Dries committed
178
function block_admin_display() {
Dries's avatar
   
Dries committed
179

Dries's avatar
   
Dries committed
180
  $blocks = _block_rehash();
Dries's avatar
   
Dries committed
181

Dries's avatar
   
Dries committed
182
  $header = array(t('block'), t('enabled'), t('custom'), t('throttle'), t('weight'), t('region'), t('path'), array('data' => t('operations'), 'colspan' => 2));
Dries's avatar
   
Dries committed
183

Dries's avatar
   
Dries committed
184
  foreach ($blocks as $block) {
Dries's avatar
   
Dries committed
185
    if ($block['module'] == 'block') {
Dries's avatar
   
Dries committed
186
187
      $edit = l(t('edit'), 'admin/block/edit/'. $block['delta']);
      $delete = l(t('delete'), 'admin/block/delete/'. $block['delta']);
188
    }
Dries's avatar
   
Dries committed
189
    else {
Dries's avatar
   
Dries committed
190
191
      $edit = '';
      $delete = '';
Dries's avatar
   
Dries committed
192
    }
Dries's avatar
   
Dries committed
193

Dries's avatar
   
Dries committed
194
    $rows[] = array($block['info'], array('data' => form_checkbox(NULL, $block['module'] .']['. $block['delta'] .'][status', 1, $block['status']), 'align' => 'center'), array('data' => form_checkbox(NULL, $block['module'] .']['. $block['delta'] .'][custom', 1, $block['custom']), 'align' => 'center'), array('data' => form_checkbox(NULL, $block['module'] .']['. $block['delta'] .'][throttle', 1, $block['throttle'], NULL, module_exist('throttle') ? NULL : array('disabled' => 'disabled')), 'align' => 'center'), form_weight(NULL, $block['module'] .']['. $block['delta'] .'][weight', $block['weight']), form_radios(NULL, $block['module'] .']['. $block['delta'] .'][region', $block['region'], array(t('left'), t('right'))), form_textfield(NULL, $block['module'] .']['. $block['delta'] .'][path', $block['path'], 10, 255),
Dries's avatar
   
Dries committed
195
    $edit, $delete);
Dries's avatar
 
Dries committed
196
  }
Dries's avatar
   
Dries committed
197

Dries's avatar
   
Dries committed
198
199
  $output = theme('table', $header, $rows);
  $output .= form_submit(t('Save blocks'));
Dries's avatar
 
Dries committed
200

Dries's avatar
   
Dries committed
201
  return form($output, 'post', url('admin/block'));
Dries's avatar
 
Dries committed
202
203
}

204
function block_box_get($bid) {
Dries's avatar
   
Dries committed
205
206
207
208
  return db_fetch_array(db_query('SELECT * FROM {boxes} WHERE bid = %d', $bid));
}

/**
Dries's avatar
Dries committed
209
210
211
 * Menu callback; displays the block editing form.
 *
 * On edit, saves changes and displays the block overview.
Dries's avatar
   
Dries committed
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
 */
function block_box_edit($bid = 0) {
  $edit = $_POST['edit'];
  $op = $_POST['op'];

  if ($op == t('Save block')) {
    drupal_set_message(block_box_save($edit));
    cache_clear_all();
    $output = block_admin_display();
  }
  else {
    if ($bid) {
      $output = block_box_form(block_box_get($bid));
    }
    else {
      $output = block_box_form();
    }
  }

  print theme('page', $output);
232
233
234
}

function block_box_form($edit = array()) {
Dries's avatar
   
Dries committed
235
  $type = array(0 => 'HTML', 1 => 'PHP');
236

237
238
239
  $group = form_textfield(t('Block title'), 'title', $edit['title'], 50, 64, t('The title of the block as shown to the user.'));
  $group .= form_textarea(t('Block body'), 'body', $edit['body'], 70, 10, t('The content of the block as shown to the user.'));
  $group .= form_textfield(t('Block description'), 'info', $edit['info'], 50, 64, t('A brief description of your block.  Used on the <a href="%overview">block overview page</a>.', array('%overview' => url('admin/block'))));
Dries's avatar
   
Dries committed
240
  if (user_access('create php content')) {
241
    $group .= form_radios(t('Block type'), 'type', $edit['type'], $type, t("If you would like to use PHP code inside your block, set the above option to 'PHP' instead of 'HTML'."));
Dries's avatar
   
Dries committed
242
  }
243

Dries's avatar
   
Dries committed
244
  if ($edit['bid']) {
245
    $group .= form_hidden('bid', $edit['bid']);
246
247
  }

248
  $group .= form_submit(t('Save block'));
249

250
251
  $output = form_group(t('Add a new block'), $group);
  return form($output);
252
253
254
}

function block_box_save($edit) {
Dries's avatar
   
Dries committed
255
256
  if (!user_access('create php content')) {
    $edit['type'] = 0;
Dries's avatar
   
Dries committed
257
258
  }

Dries's avatar
   
Dries committed
259
260
261
  if ($edit['bid']) {
    db_query("UPDATE {boxes} SET title = '%s', body = '%s', info = '%s', type = %d WHERE bid = %d", $edit['title'], $edit['body'], $edit['info'], $edit['type'], $edit['bid']);
    return t('the block has been updated.');
262
263
  }
  else {
Dries's avatar
   
Dries committed
264
265
    db_query("INSERT INTO {boxes} (title, body, info, type) VALUES  ('%s', '%s', '%s', %d)", $edit['title'], $edit['body'], $edit['info'], $edit['type']);
    return t('the new block has been added.');
266
267
268
  }
}

Dries's avatar
   
Dries committed
269
/**
Dries's avatar
Dries committed
270
 * Menu callback; deletes a custom box, then displays the overview page.
Dries's avatar
   
Dries committed
271
272
 */
function block_box_delete($bid = 0) {
273
  if ($bid) {
Dries's avatar
   
Dries committed
274
275
276
    db_query('DELETE FROM {boxes} WHERE bid = %d', $bid);
    drupal_set_message(t('the block has been deleted.'));
    cache_clear_all();
277
  }
Dries's avatar
   
Dries committed
278
  print theme('page', block_admin_display());
279
280
}

Dries's avatar
   
Dries committed
281
/**
Dries's avatar
Dries committed
282
 * Menu callback; displays the block overview page.
Dries's avatar
   
Dries committed
283
 */
Dries's avatar
 
Dries committed
284
function block_admin() {
Dries's avatar
   
Dries committed
285
286
  $edit = $_POST['edit'];
  $op = $_POST['op'];
Dries's avatar
   
Dries committed
287

Dries's avatar
   
Dries committed
288
289
290
  if ($op == t('Save blocks')) {
    drupal_set_message(block_admin_save($edit));
    cache_clear_all();
Dries's avatar
   
Dries committed
291
  }
Dries's avatar
   
Dries committed
292
  print theme('page', block_admin_display());
Dries's avatar
 
Dries committed
293
}
Dries's avatar
   
Dries committed
294

Dries's avatar
   
Dries committed
295
296
297
298
299
300
/**
 * Implementation of hook_user().
 *
 * Allow users to decide which custom blocks to display when they visit
 * the site.
 */
301
function block_user($type, $edit, &$user, $category = NULL) {
302
  switch ($type) {
303
    case 'form':
304
305
306
307
308
309
310
311
      if ($category == 'account') {
        $result = db_query('SELECT * FROM {blocks} WHERE custom = %d ORDER BY module, delta', 1);

        while ($block = db_fetch_object($result)) {
          $data = module_invoke($block->module, 'block', 'list');
          if ($data[$block->delta]['info']) {
            $form .= form_checkbox($data[$block->delta]['info'], "block][$block->module][$block->delta", 1, isset($user->block[$block->module][$block->delta]) ? $user->block[$block->module][$block->delta] : $block->status);
          }
Kjartan's avatar
Kjartan committed
312
313
        }

314
315
316
        if (isset($form)) {
          return array(array('title' => t('Block configuration'), 'data' => $form, 'weight' => 2));
        }
317
      }
Dries's avatar
   
Dries committed
318
319

      break;
Dries's avatar
   
Dries committed
320
321
322
    case 'validate':
      if (!$edit['block']) {
        $edit['block'] = array();
323
324
      }
      return $edit;
325
326
327
  }
}

328
329
330
/**
 * Return blocks available for current $user at $region.
 *
Dries's avatar
   
Dries committed
331
 * @param $region main|left|right
332
 *
Dries's avatar
   
Dries committed
333
 * @return array of block objects, indexed with <i>module</i>_<i>delta</i>
334
 *
Dries's avatar
   
Dries committed
335
 * @see <a href="http://drupal.org/node/1042" target="_top">[feature]
336
 *   Generic template design difficult w/o block region "look-ahead"</a>
Dries's avatar
   
Dries committed
337
 * @todo add a proper primary key (bid) to the blocks table so we don't have
338
339
340
341
 *   to mess around with this <i>module</i>_<i>delta</i> construct. currently,
 *   "blocks" has no primary key defined (bad)!
 */
function block_list($region) {
342
  global $user, $base_url;
343
344
345
346
  static $blocks = array();

  if (!isset($blocks[$region])) {
    $blocks[$region] = array();
Dries's avatar
   
Dries committed
347
    $result = db_query('SELECT * FROM {blocks} WHERE (status = 1 OR custom = 1) '. ($region != 'all' ? 'AND region = %d ' : '') .'ORDER BY weight, module', $region == 'left' ? 0 : 1);
348
349

    while ($result && ($block = db_fetch_array($result))) {
350
351
352
353
      // When the user's account setting is empty, we use the block's regular 'status' (which is the default)
      if ($block['custom'] && $user->uid && !isset($user->block[$block['module']][$block['delta']])) {
        $user->block[$block['module']][$block['delta']] = $block['status'];
      }
Dries's avatar
   
Dries committed
354

355
356
357
358
359
360
361
362
      // Determine block visibility
      $enabled = $block['status'] && (!$user->uid || !$block['custom']);
      $custom = $block['custom'] && $user->block[$block['module']][$block['delta']];

      // Match path if necessary
      if ($block['path']) {
        $base = parse_url($base_url);
        $session = session_name() .'='. session_id();
Steven Wittens's avatar
Steven Wittens committed
363
364
365
        $url = str_replace(array($base['path'], '?'. $session), '', request_uri());
        $url = ereg_replace('^/(\?q=)?', '', $url);      
        $matched = preg_match($block['path'], $url);
366
367
368
369
370
371
      }
      else {
        $matched = true;
      }

      if (($enabled || $custom) && $matched) {
Dries's avatar
   
Dries committed
372
        /*
373
374
        ** Check the current throttle status and see if block should be displayed
        ** based on server load.
Dries's avatar
   
Dries committed
375
        */
Dries's avatar
   
Dries committed
376
        if (!($block['throttle'] && (module_invoke('throttle', 'status') > 4))) {
Dries's avatar
   
Dries committed
377
378
          $block = array_merge($block, module_invoke($block['module'], 'block', 'view', $block['delta']));
        }
Dries's avatar
   
Dries committed
379
        if (isset($block['content']) && $block['content']) {
380
381
382
383
384
385
386
387
          $blocks[$region]["$block[module]_$block[delta]"] = (object) $block;
        }
      }
    }
  }
  return $blocks[$region];
}

388
?>