You are here

taxonomy_tools_redirect.module in Taxonomy Tools 8

Same filename and directory in other branches
  1. 7 taxonomy_tools_redirect/taxonomy_tools_redirect.module

Drupal hooks and functions to work with taxonomy terms.

Redirect URL can be set for each separate taxonomy term.

File

taxonomy_tools_redirect/taxonomy_tools_redirect.module
View source
<?php

/**
 * @file
 * Drupal hooks and functions to work with taxonomy terms.
 *
 * Redirect URL can be set for each separate taxonomy term.
 */

/**
 * Implements hook_init().
 */
function taxonomy_tools_redirect_init() {
  if (arg(1) == 'term' && is_numeric(arg(2)) && !arg(3)) {
    $config = variable_get('taxonomy_tools_redirect_config', array());
    $tid = arg(2);
    $vid = db_query('SELECT vid from {taxonomy_term_data} WHERE tid = :tid', array(
      ':tid' => $tid,
    ))
      ->fetchField();
    if (!empty($config) && in_array($vid, $config)) {

      // Check if redirect URL is set.
      $redirect = taxonomy_tools_redirect_check_redirect($tid);

      // Check for query parameters.
      $options = array();
      if (isset($redirect[2])) {
        $options = array(
          'query' => $redirect[2],
        );
      }

      // If redirect URL is set and user does not have
      // permission to bypass term redirection.
      if ($redirect[0] == TRUE && !user_access('bypass taxonomy redirect')) {
        drupal_goto($redirect[1], $options);
      }
      elseif ($redirect[0] == TRUE && user_access('bypass taxonomy redirect')) {
        $message = t('This taxonomy term is set to redirect to:');
        $message .= '&nbsp;';
        if ($redirect[1] == '<front>') {
          $text = $_SERVER['SERVER_NAME'];
        }
        else {
          $text = $redirect[1];
        }
        $message .= l($text, $redirect[1], array(
          'html' => TRUE,
          'absolute' => TRUE,
        ));
        drupal_set_message($message);
      }
    }
  }
}

/**
 * Implements hook_permission().
 */
function taxonomy_tools_redirect_permission() {
  return array(
    'administer taxonomy redirect' => array(
      'title' => t('Administer Taxonomy Redirect'),
      'description' => t('User is able to set, change and remove taxonomy term redirection URL.'),
    ),
    'bypass taxonomy redirect' => array(
      'title' => t('Bypass Taxonomy Redirect'),
      'description' => t('User is able to bypass redirection set by Taxonomy Redirect.'),
    ),
    'administer taxonomy redirect configuration' => array(
      'title' => t('Administer Taxonomy Redirect configuration'),
      'description' => t('User is able to access and use Taxonomy Redirect configuration page.'),
    ),
  );
}

/**
 * Get the status of specified taxonomy term redirection.
 *
 * @param string $tid
 *   Taxonomy term identificator.
 *
 * @return array
 *   An array containing redirection settings set for
 *   specified texonomy term.
 */
function taxonomy_tools_redirect_check_redirect($tid) {
  $redirect = array();
  $query = db_select('field_data_field_taxonomy_term_redirect', 'foo');
  $query
    ->addField('foo', 'field_taxonomy_term_redirect_value');
  $query
    ->condition('foo.entity_id', $tid);
  $result = $query
    ->execute()
    ->fetchField();
  if ($result) {

    // Redirection URL is set.
    $redirect[0] = TRUE;

    // Extract query parameters, if given.
    $url = parse_url($result);

    // External url.
    if (isset($url['scheme'])) {
      $path = $url['scheme'] . '://' . $url['host'] . $url['path'];
    }
    elseif (isset($url['path'])) {
      $path = $url['path'];
    }
    if (isset($url['query'])) {
      parse_str($url['query'], $output);
    }
    $redirect[1] = $path;
    if (isset($output)) {
      $redirect[2] = $output;
    }
  }
  else {
    $redirect[0] = FALSE;
  }
  return $redirect;
}

/**
 * Implements hook_menu().
 */
function taxonomy_tools_redirect_menu() {
  $items = array();
  $items['admin/config/taxonomy-tools/redirect'] = array(
    'title' => 'Taxonomy Redirect',
    'description' => 'Configure which vocabularies will use Taxonomy Redirect.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'taxonomy_tools_redirect_admin_form',
    ),
    'access arguments' => array(
      'administer taxonomy redirect configuration',
    ),
    'file' => 'taxonomy_tools_redirect.admin.inc',
    'file path' => drupal_get_path('module', 'taxonomy_tools_redirect'),
  );
  return $items;
}

/**
 * Implements hook_form_FORM_ID_alter().
 */
function taxonomy_tools_redirect_form_taxonomy_form_term_alter(&$form, &$form_state) {
  $vid = $form['#vocabulary']->vid;
  $config = variable_get('taxonomy_tools_redirect_config', array());
  if (!empty($config) && in_array($vid, $config)) {
    if (user_access('administer taxonomy redirect')) {

      // Add additional validation function.
      $form['#validate'][] = 'taxonomy_tools_redirect_taxonomy_term_form_validate';
    }
    else {
      $form['field_taxonomy_term_redirect']['#access'] = FALSE;
    }
  }
}

/**
 * Validation callback for taxonomy term form.
 *
 * @param array $form
 *   An array representing form.
 * @param array $form_state
 *   An array representing form state.
 */
function taxonomy_tools_redirect_taxonomy_term_form_validate($form, &$form_state) {
  if ($form_state['triggering_element']['#value'] != t('Delete')) {
    $path = $form_state['values']['field_taxonomy_term_redirect'][LANGUAGE_NONE][0]['value'];
    if ($path != '') {
      if (!url_is_external($path)) {
        $parsed = parse_url($path);
        if (!trim($parsed['path']) || !drupal_valid_path($parsed['path'], TRUE)) {
          form_set_error('field_taxonomy_term_redirect', t("The path '@link_path' is either invalid or you do not have access to it.", array(
            '@link_path' => $parsed['path'],
          )));
          return;
        }
        if (is_numeric(strpos($parsed['path'], 'taxonomy/term'))) {
          $split = explode('/', $parsed['path']);
          $query = db_select('field_data_field_taxonomy_term_redirect', 'foo');
          $query
            ->fields('foo');
          $query
            ->condition('foo.entity_id', $split[2]);
          $result = $query
            ->execute()
            ->fetchObject();
          if ($result) {
            form_set_error('field_taxonomy_term_redirect', t('You are trying to set redirection to a taxonomy term that redirects somewhere else.'));
            return;
          }
        }
      }
    }
  }
}

/**
 * Implements hook_taxonomy_tools_overview_info_icons().
 */
function taxonomy_tools_redirect_taxonomy_tools_overview_info_icons($tid) {
  $images = array();
  $query = db_select('field_data_field_taxonomy_term_redirect', 'foo');
  $query
    ->fields('foo');
  $query
    ->condition('foo.entity_id', $tid);
  $redirect = $query
    ->execute()
    ->fetchAll();
  if ($redirect) {
    $images['taxonomy_tools_redirect'] = array(
      'path' => base_path() . drupal_get_path('module', 'taxonomy_tools') . '/img/redirect.png',
      'title' => t('Redirect'),
      'alt' => t('redirect'),
      'attributes' => array(),
    );
  }
  return $images;
}

/**
 * Implements hook_term_copy_alter().
 */
function taxonomy_tools_redirect_term_copy_alter(&$term) {

  // Only for terms from vocabulary that uses Taxonomy Redirect.
  if (in_array($term->vid, variable_get('taxonomy_tools_redirect_config', array()))) {

    // Unset redirect URL.
    $term->field_taxonomy_term_redirect = array();
  }
  else {

    // Remove Taxonomy Redirect field if destination vocabulary does not use it.
    if (isset($term->field_taxonomy_term_redirect)) {
      unset($term->field_taxonomy_term_redirect);
    }
  }
}

Functions

Namesort descending Description
taxonomy_tools_redirect_check_redirect Get the status of specified taxonomy term redirection.
taxonomy_tools_redirect_form_taxonomy_form_term_alter Implements hook_form_FORM_ID_alter().
taxonomy_tools_redirect_init Implements hook_init().
taxonomy_tools_redirect_menu Implements hook_menu().
taxonomy_tools_redirect_permission Implements hook_permission().
taxonomy_tools_redirect_taxonomy_term_form_validate Validation callback for taxonomy term form.
taxonomy_tools_redirect_taxonomy_tools_overview_info_icons Implements hook_taxonomy_tools_overview_info_icons().
taxonomy_tools_redirect_term_copy_alter Implements hook_term_copy_alter().