You are here

function homebox_build in Homebox 6.3

Same name and namespace in other branches
  1. 6 homebox.module \homebox_build()
  2. 6.2 homebox.module \homebox_build()
  3. 7.3 homebox.module \homebox_build()
  4. 7.2 homebox.module \homebox_build()

Responsible for firing the hook_theme()

Parameters

$page: A page object

Return value

homebox_theme() call

2 calls to homebox_build()
homebox_og_override_group in homebox_og/homebox_og.module
Override a group's homepage with a homebox
homebox_pre_build_user in ./homebox.module
Helper function for performing operations prior to rendering a Homebox that is set as a user profile tab
2 string references to 'homebox_build'
homebox_menu in ./homebox.module
Implementation of hook_menu().
homebox_og_menu in homebox_og/homebox_og.module

File

./homebox.module, line 306
Homebox main file, takes care of global functions settings constants, etc.

Code

function homebox_build($page) {
  global $user;

  // If no default block layout is set, return a simple message
  if (empty($page->settings['blocks'])) {
    return t('This page has not yet been configured.');
  }

  // Get every block placed into its region sorted by weight
  $column_count = $page->settings['regions'];
  $regions = array_fill(1, $column_count, array());

  // Extract blocks from the page
  $blocks = $page->settings['blocks'];
  $allowed_blocks = array();
  $info = array();
  foreach ($page->settings['blocks'] as $block) {
    if (!isset($info[$block['module']])) {
      $info[$block['module']] = module_invoke($block['module'], 'block', 'list');
    }
    $allowed_blocks[$block['module']][$block['delta']] = $info[$block['module']][$block['delta']];
    if (!empty($block['title'])) {
      $allowed_blocks[$block['module']][$block['delta']]['info'] = $block['title'];
    }
  }

  // Get user settings, so custom blocks are placed in regions.
  $user_blocks = _homebox_get_user_settings($page);
  if ($user_blocks !== FALSE) {

    // Add custom blocks.
    foreach ($user_blocks as $key => $block) {
      if (isset($allowed_blocks[$block['module']][$block['delta']])) {
        $blocks[$key] = $user_blocks[$key];
      }
    }
  }

  // Preparing blocks object for theming
  foreach ($blocks as $key => $block_settings) {

    // Adds block to its regions
    if ($block_settings['status']) {
      $block = homebox_prepare_block($key, $page);
      if (!is_null($block)) {

        // If user defined region is greater than real column count put block in
        // the last column/region.
        $regions[min($block->region, $column_count)][$block->weight][] = $block;
        $allowed_blocks[$block->module][$block->delta]['used'] = TRUE;
      }
    }
  }

  // Sort each region/column based on key value
  // Also separate the regions into rows based on the region widths
  $sum_width = 0;
  $row = 0;
  for ($i = 1; $i <= count($regions); $i++) {
    ksort($regions[$i]);
    $sum_width += $page->settings['widths'][$i];
    if ($sum_width > 100) {
      $row++;
      $sum_width = 0;
    }
    $page->settings['rows'][$i] = $row;
  }

  // Add block links
  if ($user->uid) {
    $add_links = array();
    foreach ($allowed_blocks as $module => $blocks) {
      foreach ($blocks as $delta => $info) {
        $options = array();
        if (isset($info['used'])) {
          $options['attributes'] = array(
            'class' => 'used',
          );
        }
        $add_links[] = homebox_add_link($info['info'], $page, $module, $delta, $options);
      }
    }
    $add_links['restore'] = l(t('Restore to defaults'), 'homebox/' . $page->name . '/restore', array(
      'attributes' => array(
        'class' => 'restore',
      ),
    ));
    $add_links = theme('item_list', $add_links, NULL, 'ul', array(
      'class' => 'clear-block',
    ));
    $save_form = drupal_get_form('homebox_save_form', $page);
  }
  else {
    $add_links = NULL;
    $save_form = NULL;
  }

  // Build output
  $output = theme('homebox', $regions, $page->settings['regions'], $add_links, $save_form, $page);

  // Build the page
  if ($page->settings['full']) {

    // If page is set to full, avoid printing other theme block regions
    print theme('page', $output, FALSE);
  }
  else {

    // Simply return the page
    return $output;
  }
}