You are here

mongodb_block_ui.admin.inc in MongoDB 7

Admin page callbacks for the mongodb_block_ui module.

File

mongodb_block_ui/mongodb_block_ui.admin.inc
View source
<?php

/**
 * @file
 * Admin page callbacks for the mongodb_block_ui module.
 */

/**
 * Menu callback for admin/structure/mongodb_block_ui/demo.
 */
function mongodb_block_ui_admin_demo($theme = NULL) {
  drupal_add_css(drupal_get_path('module', 'mongodb_block_ui') . '/mongodb_block_ui.css', array(
    'preprocess' => FALSE,
  ));
  return '';
}

/**
 * Menu callback for admin/structure/mongodb_block_ui.
 *
 * @param string $theme
 *   The theme to display the administration page for. If not provided, defaults
 *   to the currently used theme.
 */
function mongodb_block_ui_admin_display($theme = NULL) {
  global $theme_key;
  drupal_theme_initialize();
  if (!isset($theme)) {

    // If theme is not specifically set, rehash for the current theme.
    $theme = $theme_key;
  }

  // Fetch and sort mongodb_block_uis.
  $current_blocks = _mongodb_block_rehash($theme);
  $blocks = array();
  foreach ($current_blocks as $block) {
    $module = $block['module'];
    $delta = $block['delta'];
    $blocks[$module . '_' . $delta] = $block;
  }
  $compare_theme =& drupal_static('_mongodb_block_ui_compare:theme');
  $compare_theme = $theme;
  usort($blocks, '_mongodb_block_ui_compare');
  return drupal_get_form('mongodb_block_ui_admin_display_form', $blocks, $theme);
}

/**
 * Generate main mongodb_block_uis administration form.
 *
 * @param array $form
 *   The form render array.
 * @param array $form_state
 *   The form state.
 * @param array $blocks
 *   The blocks to present.
 * @param string $theme
 *   The active theme key.
 *
 * @return array
 *   A render form array for the form.
 */
function mongodb_block_ui_admin_display_form(array $form, array &$form_state, array $blocks, $theme) {
  drupal_add_css(drupal_get_path('module', 'mongodb_block_ui') . '/mongodb_block_ui.css', array(
    'preprocess' => FALSE,
  ));
  $blocks_regions = system_region_list($theme, REGIONS_VISIBLE) + array(
    MONGODB_BLOCK_REGION_NONE => '<' . t('none') . '>',
  );

  // Weights range from -delta to +delta, so delta should be at least half
  // of the amount of mongodb_block_uis present. This makes sure all
  // mongodb_block_uis in the same region get an unique weight.
  $weight_delta = round(count($blocks) / 2);

  // Build the form tree.
  $form['edited_theme'] = array(
    '#type' => 'value',
    '#value' => $theme,
  );
  $form['#action'] = arg(4) ? url('admin/structure/mongodb_block/list/' . $theme) : url('admin/structure/mongodb_block');
  $form['#blocks'] = $blocks;
  $form['#tree'] = TRUE;
  foreach ($blocks as $key => $block) {
    $module = $block['module'];
    $delta = $block['delta'];
    $path_prefix = "admin/structure/mongodb_block/manage/{$theme}/{$module}/{$delta}";
    $form[$key]['module'] = array(
      '#type' => 'value',
      '#value' => $module,
    );
    $form[$key]['delta'] = array(
      '#type' => 'value',
      '#value' => $delta,
    );
    $form[$key]['info'] = array(
      '#markup' => check_plain($block['info']),
    );
    $form[$key]['theme'] = array(
      '#type' => 'hidden',
      '#value' => $theme,
    );
    $form[$key]['weight'] = array(
      '#type' => 'weight',
      '#default_value' => $block['weight'],
      '#delta' => $weight_delta,
    );
    $form[$key]['region'] = array(
      '#type' => 'select',
      '#default_value' => $block['region'],
      '#options' => $blocks_regions,
    );
    $form[$key]['configure'] = array(
      '#type' => 'link',
      '#title' => t('configure'),
      '#href' => "{$path_prefix}",
    );
    if ($module == 'mongodb_block_ui') {
      $form[$key]['delete'] = array(
        '#type' => 'link',
        '#title' => t('delete'),
        '#href' => "{$path_prefix}/delete",
      );
    }
  }

  // Do not allow disabling the main system content mongodb_block_ui.
  unset($form['system_main']['region']['#options'][MONGODB_BLOCK_REGION_NONE]);
  $form['actions'] = array(
    '#tree' => FALSE,
    '#type' => 'container',
    '#attributes' => array(
      'class' => array(
        'form-actions',
      ),
    ),
  );
  $form['actions']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save blocks'),
  );
  $form['#theme_key'] = $theme;
  return $form;
}

/**
 * Process main blocks administration form submissions.
 */
function mongodb_block_ui_admin_display_form_submit($form, &$form_state) {
  $collection = mongodb_collection('block_customized', $form['#theme_key']);
  foreach ($form_state['values'] as $block) {

    // Skip the buttons by checking for array and save only blocks that are not
    // disabled.
    if (is_array($block)) {
      $find = array(
        '_id' => array(
          'module' => $block['module'],
          'delta' => $block['delta'],
        ),
      );
      $set = array(
        'weight' => (int) $block['weight'],
        'region' => $block['region'],
      );
      $collection
        ->update($find, array(
        '$set' => $set,
      ), array(
        'upsert' => TRUE,
      ) + mongodb_default_write_options());
    }
  }
  drupal_set_message(t('The block settings have been updated.'));
  cache_clear_all();
}

/**
 * Helper for sorting mongodb_block_uis on admin/structure/mongodb_block_ui.
 *
 * Active mongodb_block_uis are sorted by region, then by weight.
 * Disabled mongodb_block_uis are sorted by name.
 */
function _mongodb_block_ui_compare($a, $b) {
  global $theme_key;

  // Theme should be set before calling this function, or the current theme
  // is being used.
  $theme =& drupal_static(__FUNCTION__ . ':theme');
  if (!isset($theme)) {
    $theme = $theme_key;
  }
  $regions =& drupal_static(__FUNCTION__ . ':regions');

  // We need the region list to correctly order by region.
  if (!isset($regions)) {
    $regions = array_flip(array_keys(system_region_list($theme)));
    $regions[MONGODB_BLOCK_REGION_NONE] = count($regions);
  }

  // Separate enabled from disabled.
  $status = $b['status'] - $a['status'];
  if ($status) {
    return $status;
  }

  // Sort by region (in the order defined by theme .info file).
  if (!empty($a['region']) && !empty($b['region']) && ($place = $regions[$a['region']] - $regions[$b['region']])) {
    return $place;
  }

  // Sort by weight.
  $weight = $a['weight'] - $b['weight'];
  if ($weight) {
    return $weight;
  }

  // Sort by title.
  return strcmp($a['info'], $b['info']);
}

/**
 * Menu callback; displays the mongodb_block_ui configuration form.
 */
function mongodb_block_ui_admin_configure($form, &$form_state, $theme, $module, $delta) {
  if (!($block = mongodb_collection('block', $theme)
    ->findOne(array(
    '_id' => array(
      'module' => $module,
      'delta' => $delta,
    ),
  )))) {
    $block = array();
  }
  if ($module == 'mongodb_block_ui' && ($custom_block = mongodb_block_ui_load($delta))) {
    $block += $custom_block;
    $form = mongodb_block_ui_custom_block_form($block);
  }
  $block = (object) $block;
  $form['title'] = array(
    '#type' => 'textfield',
    '#title' => t('Block title'),
    '#maxlength' => 64,
    '#description' => t('The title of the block as shown to the user.'),
    '#default_value' => isset($block->title) ? $block->title : '',
    '#weight' => -20,
  );
  $form['module'] = array(
    '#type' => 'value',
    '#value' => $module,
  );
  $form['delta'] = array(
    '#type' => 'value',
    '#value' => $delta,
  );

  // Get the block subject for the page title.
  $info = module_invoke($module, 'block_info');
  if (isset($info[$delta])) {
    drupal_set_title(t("'%name' block", array(
      '%name' => $info[$delta]['info'],
    )), PASS_THROUGH);
  }

  // Module-specific block configuration.
  if ($settings = module_invoke($module, 'block_configure', $delta)) {
    foreach ($settings as $k => $v) {
      $form['settings'][$k] = $v;
    }
  }
  $description = t("Specify pages by using their paths. Enter one path per line.\n    The '%' character is a wildcard. Example paths are %blog for the blog page\n    and %blog-wildcard for every personal blog. %front is the front page.", [
    '%blog' => 'blog',
    '%blog-wildcard' => 'blog/%',
    '%front' => '<front>',
  ]);

  // Visibility settings.
  $form['visibility_title'] = array(
    '#type' => 'item',
    '#title' => t('Visibility settings'),
  );
  $form['visibility'] = array(
    '#type' => 'vertical_tabs',
    '#attached' => array(
      'js' => array(
        drupal_get_path('module', 'mongodb_block_ui') . '/mongodb_block_ui.js',
      ),
    ),
  );

  // Per-path visibility.
  $form['visibility']['path_include'] = array(
    '#type' => 'fieldset',
    '#title' => t('Pages'),
    '#collapsible' => TRUE,
    '#collapsed' => TRUE,
    '#group' => 'visibility',
    '#weight' => 0,
  );
  $form['visibility']['path_exclude'] = array(
    '#type' => 'fieldset',
    '#title' => t('Pages exclude'),
    '#collapsible' => TRUE,
    '#collapsed' => TRUE,
    '#group' => 'visibility',
    '#weight' => 0,
  );
  $access = user_access('use PHP for settings');
  if (isset($block->visibility) && $block->visibility == 2 && !$access) {
    $form['visibility']['path']['visibility'] = array(
      '#type' => 'value',
      '#value' => 2,
    );
    $form['visibility']['path']['pages'] = array(
      '#type' => 'value',
      '#value' => isset($block->pages) ? $block->pages : '',
    );
  }
  else {
    if (module_exists('php') && $access) {
      $description .= ' ' . t('If the PHP option is chosen, enter PHP code between %php. Note that executing incorrect PHP code can break your Drupal site.', array(
        '%php' => '<?php ?>',
      ));
    }
    $form['visibility']['path_include']['pages'] = array(
      '#type' => 'textarea',
      '#title' => t('Show on these pages'),
      '#default_value' => isset($block->pages) ? implode("\n", $block->pages) : '',
      '#description' => $description,
    );
    $form['visibility']['path_exclude']['pages_exclude'] = array(
      '#type' => 'textarea',
      '#title' => t('Do not show on these pages'),
      '#default_value' => isset($block->pages_exclude) ? implode("\n", $block->pages_exclude) : '',
      '#description' => $description,
    );
  }
  $form['visibility']['node_type'] = array(
    '#type' => 'fieldset',
    '#title' => t('Content types'),
    '#collapsible' => TRUE,
    '#collapsed' => TRUE,
    '#group' => 'visibility',
    '#weight' => 5,
  );
  $form['visibility']['node_type']['types'] = array(
    '#type' => 'checkboxes',
    '#title' => t('Show block for specific content types'),
    '#default_value' => isset($block->node_type) ? $block->node_type : array(),
    '#options' => node_type_get_names(),
    '#description' => t('Show this block only on pages that display content of the given type(s). If you select no types, there will be no type-specific limitation.'),
  );
  $form['actions'] = array(
    '#type' => 'container',
    '#attributes' => array(
      'class' => array(
        'form-actions',
      ),
    ),
  );
  $form['actions']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save block'),
  );
  $form['#theme_key'] = $theme;
  return $form;
}

/**
 * Form validation handler for block_admin_configure().
 *
 * @param array $form
 *   The form.
 * @param array &$form_state
 *   The referenced form state.
 *
 * @throws \MongoConnectionException
 * @throws \MongoException
 * @throws \MongoWriteConcernException
 */
function mongodb_block_ui_admin_configure_validate(array $form, array &$form_state) {
  if ($form_state['values']['module'] == 'mongodb_block_ui') {
    $collection = mongodb_collection('block_custom');
    $find = array(
      '_id' => array(
        '$ne' => $form_state['values']['delta'],
      ),
      'info' => $form_state['values']['info'],
    );
    $custom_block_exists = (bool) $collection
      ->findOne($find);
    if (empty($form_state['values']['info']) || $custom_block_exists) {
      form_set_error('info', t('Ensure that each block description is unique.'));
    }
  }
}

/**
 * Form submission handler for block_admin_configure().
 *
 * @param array $form
 *   The form.
 * @param array &$form_state
 *   The referenced form state.
 *
 * @throws \MongoConnectionException
 * @throws \MongoCursorException
 * @throws \MongoCursorTimeoutException
 * @throws \MongoException
 * @throws \MongoWriteConcernException
 */
function mongodb_block_ui_admin_configure_submit(array $form, array &$form_state) {

  // FIXME: this stores the visibility settings, the title of the block etc.
  $collection = mongodb_collection('block_customized', $form['#theme_key']);
  $id = array(
    'module' => $form_state['values']['module'],
    'delta' => $form_state['values']['delta'],
  );
  $customized = array(
    'pages' => _mongodb_block_ui_admin_pages($form_state['values']['pages'], array(
      '%',
    )),
    'pages_exclude' => _mongodb_block_ui_admin_pages($form_state['values']['pages_exclude'], array()),
    'title' => $form_state['values']['title'],
  );

  // This way region and weight is preserved.
  $collection
    ->update(array(
    '_id' => $id,
  ), array(
    '$set' => $customized,
  ), array(
    'upsert' => TRUE,
  ) + mongodb_default_write_options());

  // Ensure that custom blocks have their settings saved.
  // @todo: this should probably be done via hook_block_configure().
  if ($form_state['values']['module'] == 'mongodb_block_ui') {
    $block = array(
      '_id' => $form_state['values']['delta'],
      'body' => $form_state['values']['body'],
      'info' => $form_state['values']['info'],
      'title' => $form_state['values']['title'],
    );
    mongodb_collection('block_custom')
      ->save($block, mongodb_default_write_options());
  }
  module_invoke($form_state['values']['module'], 'block_save', $form_state['values']['delta'], $form_state['values']);
  drupal_set_message(t('The block configuration has been saved.'));
  cache_clear_all();
  $form_state['redirect'] = 'admin/structure/mongodb_block/manage/' . $form_state['values']['module'] . '/' . $form_state['values']['delta'];
}

/**
 * Admin pages.
 *
 * @param array $pages
 *   Admin pages.
 * @param array $default
 *   Default valye.
 *
 * @return array
 *   The list of admin pages received as argument, cleaned up.
 */
function _mongodb_block_ui_admin_pages(array $pages, array $default) {
  $pages = array_map('trim', explode("\n", trim($pages)));
  if (!$pages[0]) {
    $pages = $default;
  }
  return $pages;
}

/**
 * Menu callback: display the custom mongodb_block_ui addition form.
 *
 * @param array $form
 *   The form array.
 * @param array $form_state
 *   The form state.
 * @param string $theme
 *   The active theme.
 *
 * @return mixed
 *   A render array for the form.
 */
function mongodb_block_ui_add_block_form(array $form, array &$form_state, $theme) {
  $form = mongodb_block_ui_custom_block_form();
  $form['title'] = array(
    '#type' => 'textfield',
    '#title' => t('Block title'),
    '#maxlength' => 64,
    '#description' => t('The title of the block as shown to the user.'),
    '#default_value' => '',
    '#weight' => -20,
  );
  $form['actions'] = array(
    '#tree' => FALSE,
    '#type' => 'container',
    '#attributes' => array(
      'class' => array(
        'form-actions',
      ),
    ),
  );
  $form['actions']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save block'),
  );
  $form['#theme_key'] = $theme;
  return $form;
}

/**
 * Form validation handler for mongodb_block_ui_add_block_form.
 *
 * @param array $form
 *   The form.
 * @param array &$form_state
 *   The referenced form state.
 */
function mongodb_block_ui_add_block_form_validate(array $form, array &$form_state) {
  $blocks = module_invoke_all('block_info');
  foreach ($blocks as $block) {
    if ($form_state['values']['info'] == $block['info']) {
      form_set_error('info', t('Ensure that each block description is unique.'));
    }
  }
}

/**
 * Save the new custom block.
 *
 * @param array $form
 *   The form.
 * @param array &$form_state
 *   The referenced form state.
 *
 * @throws \MongoConnectionException
 * @throws \MongoCursorException
 * @throws \MongoCursorTimeoutException
 * @throws \MongoException
 */
function mongodb_block_ui_add_block_form_submit(array $form, array &$form_state) {
  $collection = mongodb_collection('block_custom');
  $delta = mongodb_next_id('block_custom');
  $block = array(
    '_id' => (string) $delta,
    'body' => $form_state['values']['body'],
    'info' => $form_state['values']['info'],
    'title' => $form_state['values']['title'],
  );
  $collection
    ->insert($block, mongodb_default_write_options());
  drupal_set_message(t('The block has been created.'));
  cache_clear_all();
  $theme = $form['#theme_key'];
  $form_state['redirect'] = "admin/structure/mongodb_block/manage/{$theme}/mongodb_block_ui/" . $delta;
}

/**
 * Menu callback; confirm deletion of custom block.
 */
function mongodb_block_ui_custom_block_delete($form, &$form_state, $theme, $module, $delta) {
  $block = mongodb_block_ui_load($delta);
  $form['info'] = array(
    '#type' => 'hidden',
    '#value' => $block['info'] ? $block['info'] : $block['title'],
  );
  $form['module'] = array(
    '#type' => 'hidden',
    '#value' => $module,
  );
  $form['delta'] = array(
    '#type' => 'hidden',
    '#value' => $delta,
  );
  $path = 'admin/structure/mongodb_block';
  if ($theme != variable_get('theme_default', 'bartik')) {
    $path .= "/{$theme}";
  }
  return confirm_form($form, t('Are you sure you want to delete the block %name?', array(
    '%name' => $block['info'],
  )), $path, '', t('Delete'), t('Cancel'));
}

/**
 * Deletion of custom mongodb_block_uis.
 */
function mongodb_block_ui_custom_block_delete_submit($form, &$form_state) {

  // Remove the custom block.
  mongodb_collection('block_custom')
    ->remove(array(
    '_id' => $form_state['values']['delta'],
  ), mongodb_default_write_options());

  // Also remove customization for every theme.
  $id = array(
    'module' => $form_state['values']['module'],
    'delta' => $form_state['values']['delta'],
  );
  foreach (list_themes() as $theme) {
    mongodb_collection('block_customized', $theme->name)
      ->remove(array(
      '_id' => $id,
    ), mongodb_default_write_options());
  }
  drupal_set_message(t('The block %name has been removed.', array(
    '%name' => $form_state['values']['info'],
  )));
  cache_clear_all();
  $form_state['redirect'] = 'admin/structure/mongodb_block';
}

/**
 * Process variables for mongodb_block_ui-admin-display.tpl.php.
 *
 * The $variables array contains the following arguments:
 * - $form.
 *
 * @see mongodb_block_ui-admin-display.tpl.php
 * @see theme_mongodb_block_ui_admin_display()
 */
function template_preprocess_mongodb_block_ui_admin_display_form(&$variables) {
  $block_regions = system_region_list($variables['form']['edited_theme']['#value'], REGIONS_VISIBLE);
  $variables['block_regions'] = $block_regions + array(
    MONGODB_BLOCK_REGION_NONE => t('Disabled'),
  );
  foreach ($block_regions as $key => $value) {

    // Initialize an empty array for the region.
    $variables['block_listing'][$key] = array();
  }

  // Initialize disabled mongodb_block_uis array.
  $variables['block_listing'][MONGODB_BLOCK_REGION_NONE] = array();

  // Set up to track previous region in loop.
  foreach (element_children($variables['form']) as $i) {
    $block =& $variables['form'][$i];

    // Only take form elements that are mongodb_block_uis.
    if (isset($block['info'])) {

      // Fetch region for current mongodb_block_ui.
      $region = $block['region']['#default_value'];

      // Set special classes needed for table drag and drop.
      $variables['form'][$i]['region']['#attributes']['class'] = array(
        'block-region-select',
        'block-region-' . $region,
      );
      $variables['form'][$i]['weight']['#attributes']['class'] = array(
        'block-weight',
        'block-weight-' . $region,
      );
      $variables['block_listing'][$region][$i] = new stdClass();
      $variables['block_listing'][$region][$i]->row_class = !empty($block['#attributes']['class']) ? implode(' ', $block['#attributes']['class']) : '';
      $variables['block_listing'][$region][$i]->block_modified = !empty($block['#attributes']['class']) && in_array('block-modified', $block['#attributes']['class']);
      $variables['block_listing'][$region][$i]->block_title = drupal_render($block['info']);
      $variables['block_listing'][$region][$i]->region_select = drupal_render($block['region']) . drupal_render($block['theme']);
      $variables['block_listing'][$region][$i]->weight_select = drupal_render($block['weight']);
      $variables['block_listing'][$region][$i]->configure_link = drupal_render($block['configure']);
      $variables['block_listing'][$region][$i]->delete_link = !empty($block['delete']) ? drupal_render($block['delete']) : '';
      $variables['block_listing'][$region][$i]->printed = FALSE;
    }
  }
  $variables['form_submit'] = drupal_render_children($variables['form']);
}

Functions

Namesort descending Description
mongodb_block_ui_add_block_form Menu callback: display the custom mongodb_block_ui addition form.
mongodb_block_ui_add_block_form_submit Save the new custom block.
mongodb_block_ui_add_block_form_validate Form validation handler for mongodb_block_ui_add_block_form.
mongodb_block_ui_admin_configure Menu callback; displays the mongodb_block_ui configuration form.
mongodb_block_ui_admin_configure_submit Form submission handler for block_admin_configure().
mongodb_block_ui_admin_configure_validate Form validation handler for block_admin_configure().
mongodb_block_ui_admin_demo Menu callback for admin/structure/mongodb_block_ui/demo.
mongodb_block_ui_admin_display Menu callback for admin/structure/mongodb_block_ui.
mongodb_block_ui_admin_display_form Generate main mongodb_block_uis administration form.
mongodb_block_ui_admin_display_form_submit Process main blocks administration form submissions.
mongodb_block_ui_custom_block_delete Menu callback; confirm deletion of custom block.
mongodb_block_ui_custom_block_delete_submit Deletion of custom mongodb_block_uis.
template_preprocess_mongodb_block_ui_admin_display_form Process variables for mongodb_block_ui-admin-display.tpl.php.
_mongodb_block_ui_admin_pages Admin pages.
_mongodb_block_ui_compare Helper for sorting mongodb_block_uis on admin/structure/mongodb_block_ui.