You are here

block_visibility_vocabulary.module in Block Visibility by Vocabularies 7

File

block_visibility_vocabulary.module
View source
<?php

/**
 * Implements hook_form_FORMID_alter(): block_add_block_form.
 */
function block_visibility_vocabulary_form_block_add_block_form_alter(&$form, &$form_state) {
  block_visibility_vocabulary_form_block_admin_configure_alter($form, $form_state);
}

/**
 * Implements hook_form_FORMID_alter(): block_admin_configure.
 */
function block_visibility_vocabulary_form_block_admin_configure_alter(&$form, &$form_state) {
  $options = array();
  foreach (taxonomy_vocabulary_get_names() as $vocabulary) {
    $options[$vocabulary->vid] = $vocabulary->name;
  }
  if ($form['module']['#value'] && $form['delta']['#value']) {
    $default_value = block_visibility_vocabulary_settings_get($form['module']['#value'], $form['delta']['#value']);
  }
  else {
    $default_value = array();
  }
  $form['visibility']['vocabularies'] = array(
    '#type' => 'fieldset',
    '#title' => t('Vocabularies'),
    '#collapsible' => TRUE,
    '#collapsed' => TRUE,
    '#group' => 'visibility',
    '#weight' => 20,
  );
  $form['visibility']['vocabularies']['vocabularies'] = array(
    '#type' => 'checkboxes',
    '#title' => t('Show block for specific vocabularies'),
    '#default_value' => $default_value,
    '#options' => $options,
    '#description' => t('Show this block only on term pages of the given vocabulary. If you select no vocabulary, there will be no limitation.'),
  );
  $form['#submit'][] = 'block_visibility_vocabulary_form_block_admin_configure_submit';
}

/**
 * Form submission handler for block_admin_configure().
 */
function block_visibility_vocabulary_form_block_admin_configure_submit($form, &$form_state) {
  $vocabularies = array_keys(array_filter($form_state['values']['vocabularies']));
  $blocks_visibility_settings = block_visibility_vocabulary_settings_get();
  $key = $form_state['values']['module'] . ':' . $form_state['values']['delta'];
  $blocks_visibility_settings[$key] = $vocabularies;
  if (!$vocabularies) {
    unset($blocks_visibility_settings[$key]);
  }
  block_visibility_vocabulary_settings_save($blocks_visibility_settings);
}

/**
 * Implements hook_form_FORMID_alter(): block_custom_block_delete.
 */
function block_visibility_vocabulary_form_block_custom_block_delete_alter(&$form, &$form_state) {
  $form['#submit'][] = 'block_visibility_vocabulary_form_block_custom_block_delete_submit';
}

/**
 * Form submission handler for block_custom_block_delete().
 */
function block_visibility_vocabulary_form_block_custom_block_delete_submit($form, &$form_state) {
  $blocks_visibility_settings = block_visibility_vocabulary_settings_get();
  $key = 'block:' . $form_state['values']['bid'];
  if (isset($blocks_visibility_settings[$key])) {
    unset($blocks_visibility_settings[$key]);
    block_visibility_vocabulary_settings_save($blocks_visibility_settings);
  }
}

/**
 * Implements hook_modules_uninstalled().
 */
function block_visibility_vocabulary_modules_uninstalled($modules) {
  $blocks_visibility_settings = block_visibility_vocabulary_settings_get();
  foreach ($modules as $module_name) {
    foreach ($blocks_visibility_settings as $key => $vocabularies) {
      if (strpos($key, $module_name . ':') === 0) {
        unset($blocks_visibility_settings[$key]);
      }
    }
  }
  block_visibility_vocabulary_settings_save($blocks_visibility_settings);
}

/**
 * Implements hook_block_list_alter().
 */
function block_visibility_vocabulary_block_list_alter(&$blocks) {
  $blocks_visibility_settings = block_visibility_vocabulary_settings_get();
  $term = NULL;
  if (arg(0) == 'taxonomy' && arg(1) == 'term' && is_numeric(arg(2))) {
    $term = taxonomy_term_load(arg(2));
  }
  foreach ($blocks as $key => $block) {
    if (!isset($block->theme) || !isset($block->status) || $block->theme != $GLOBALS['theme_key'] || $block->status != 1) {
      continue;
    }
    $setting_key = $block->module . ':' . $block->delta;
    if (!empty($blocks_visibility_settings[$setting_key]) && (!$term || !in_array($term->vid, $blocks_visibility_settings[$setting_key]))) {
      unset($blocks[$key]);
    }
  }
}

/**
 * Get settings.
 */
function block_visibility_vocabulary_settings_get($block_module = NULL, $block_delta = NULL) {
  $settings = variable_get('block_visibility_vocabulary', array());
  if ($block_module && $block_delta) {
    $key = $block_module . ':' . $block_delta;
    if (isset($settings[$key])) {
      return $settings[$key];
    }
    return array();
  }
  return $settings;
}

/**
 * Save settings.
 */
function block_visibility_vocabulary_settings_save($settings) {
  variable_set('block_visibility_vocabulary', $settings);
}