taxonomy_tools_redirect.module in Taxonomy Tools 8
Same filename and directory in other branches
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.moduleView 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 .= ' ';
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
Name![]() |
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(). |