You are here

block_views.module in Block Views Visibility 7

Demonstrate basic module block_views.

File

block_views.module
View source
<?php

/**
 * @file
 * Demonstrate basic module block_views.
 */

/**
 * Implements hook_form_FORMID_alter().
 *
 * Adds node-type specific visibility options to add block form.
 *
 * @see block_add_block_form()
 */
function block_views_form_block_add_block_form_alter(&$form, &$form_state) {
  block_views_form_block_admin_configure_alter($form, $form_state);
}

/**
 * Implements hook_form_FORMID_alter().
 *
 * Adds node-type specific visibility options to block configuration form.
 *
 * @see block_admin_configure()
 */
function block_views_form_block_admin_configure_alter(&$form, &$form_state) {
  drupal_add_js(drupal_get_path('module', 'block_views') . '/block_views.js');
  $result = db_query("SELECT * FROM {block_views} WHERE module = :module AND delta = :delta", array(
    ':module' => $form['module']['#value'],
    ':delta' => $form['delta']['#value'],
  ))
    ->fetchAll();
  $defaults = array();
  if (is_array($result)) {
    foreach ($result as $row) {
      $defaults[] = "{$row->view}:{$row->display}";
    }
  }
  $form['visibility']['views'] = array(
    '#type' => 'fieldset',
    '#title' => t('Views'),
    '#collapsible' => TRUE,
    '#collapsed' => TRUE,
    '#group' => 'visibility',
    '#weight' => 5,
  );
  $options = block_views_get_views_options();
  $form['visibility']['views']['views'] = array(
    '#type' => 'checkboxes',
    '#title' => t('Show block for specific views'),
    '#default_value' => $defaults,
    '#options' => $options,
    '#description' => t('Show this block only on specific views pages. If you select no views, there will be no views-specific limitation.'),
  );
  $form['#submit'][] = 'block_views_form_block_admin_configure_submit';
  $menu = menu_get_item();
}
function block_views_get_views_options() {
  $options = array();
  $views = views_get_enabled_views();
  foreach ($views as $view_name => $view) {
    if (!empty($view->disabled)) {
      continue;
    }
    foreach ($view->display as $display_name => $display) {
      if ($display->display_plugin == 'page') {
        $options["{$view_name}:{$display_name}"] = ($view->human_name ? $view->human_name : $view->name) . ": " . $display->display_title;
      }
    }
  }
  natcasesort($options);
  return $options;
}

/**
 * Form submit handler for block configuration form.
 *
 * @see node_form_block_admin_configure_alter()
 */
function block_views_form_block_admin_configure_submit($form, &$form_state) {
  db_delete('block_views')
    ->condition('module', $form_state['values']['module'])
    ->condition('delta', $form_state['values']['delta'])
    ->execute();
  $query = db_insert('block_views')
    ->fields(array(
    'view',
    'display',
    'module',
    'delta',
  ));
  foreach (array_filter($form_state['values']['views']) as $viewdisplay) {
    list($view, $display) = explode(':', $viewdisplay);
    $query
      ->values(array(
      'view' => $view,
      'display' => $display,
      'module' => $form_state['values']['module'],
      'delta' => $form_state['values']['delta'],
    ));
  }
  $query
    ->execute();
}

/**
 * Implements hook_form_FORMID_alter().
 *
 * Adds node specific submit handler to delete custom block form.
 *
 * @see block_custom_block_delete()
 */
function block_views_form_block_custom_block_delete_alter(&$form, &$form_state) {
  $form['#submit'][] = 'block_views_form_block_custom_block_delete_submit';
}

/**
 * Form submit handler for custom block delete form.
 *
 * @see node_form_block_custom_block_delete_alter()
 */
function block_views_form_block_custom_block_delete_submit($form, &$form_state) {
  db_delete('block_views')
    ->condition('module', 'block')
    ->condition('delta', $form_state['values']['bid'])
    ->execute();
}

/**
 * Implements hook_block_list_alter().
 *
 * Check the view specific visibilty settings.
 * Remove the block if the visibility conditions are not met.
 */
function block_views_block_list_alter(&$blocks) {
  global $theme_key;

  // Build an array of node types for each block.
  $block_views = array();
  $result = db_query('SELECT * FROM {block_views}');
  foreach ($result as $record) {
    $block_views[$record->module][$record->delta][$record->view][$record->display] = TRUE;
  }

  //dsm($block_views);
  $menu = menu_get_item();

  //dsm($menu);
  $view = '';
  if ($menu['page_callback'] == 'views_page') {
    $view = $menu['page_arguments'][0];
    $display = $menu['page_arguments'][1];
  }

  //dsm($view);
  foreach ($blocks as $key => $block) {
    if (!isset($block->theme) || !isset($block->status) || $block->theme != $theme_key || $block->status != 1) {

      // This block was added by a contrib module, leave it in the list.
      continue;
    }

    // If a block has no node types associated, it is displayed for every type.
    // For blocks with node types associated, if the node type does not match
    // the settings from this block, remove it from the block list.
    if (isset($block_views[$block->module][$block->delta])) {
      if (!empty($view)) {

        // This is a node or node edit page.
        if (!isset($block_views[$block->module][$block->delta][$view][$display])) {

          // This block should not be displayed for this node type.
          unset($blocks[$key]);
          continue;
        }
      }
      else {

        // This is not a views page, remove the block.
        unset($blocks[$key]);
        continue;
      }
    }
  }
}

Functions

Namesort descending Description
block_views_block_list_alter Implements hook_block_list_alter().
block_views_form_block_add_block_form_alter Implements hook_form_FORMID_alter().
block_views_form_block_admin_configure_alter Implements hook_form_FORMID_alter().
block_views_form_block_admin_configure_submit Form submit handler for block configuration form.
block_views_form_block_custom_block_delete_alter Implements hook_form_FORMID_alter().
block_views_form_block_custom_block_delete_submit Form submit handler for custom block delete form.
block_views_get_views_options