You are here

match_redirect.module in Match Redirect 7

Match redirect module.

File

match_redirect.module
View source
<?php

/**
 * @file
 * Match redirect module.
 */

/**
 * Implements hook_entity_info().
 */
function match_redirect_entity_info() {
  $info['match_redirect'] = array(
    'label' => t('Match Redirect'),
    'base table' => 'match_redirect',
    'entity keys' => array(
      'id' => 'rid',
    ),
    'fieldable' => FALSE,
    'uuid' => FALSE,
  );
  return $info;
}

/**
 * Implements hook_menu().
 */
function match_redirect_menu() {
  $items['admin/config/search/match_redirect'] = array(
    'title' => 'Match redirects',
    'description' => 'Matching pattern redirects to target.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'match_redirect_list_form',
    ),
    'access arguments' => array(
      'administer matchredirect',
    ),
    'file' => 'match_redirect.admin.inc',
  );
  $items['admin/config/search/match_redirect/add'] = array(
    'title' => 'Add match redirect',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'match_redirect_add_form',
    ),
    'access arguments' => array(
      'administer matchredirect',
    ),
    'file' => 'match_redirect.admin.inc',
    'type' => MENU_LOCAL_ACTION,
  );
  $items['admin/config/search/match_redirect/edit/%match_redirect'] = array(
    'title' => 'Edit match redirect',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'match_redirect_add_form',
      5,
    ),
    'access arguments' => array(
      'administer matchredirect',
    ),
    'file' => 'match_redirect.admin.inc',
  );
  $items['admin/config/search/match_redirect/delete/%match_redirect'] = array(
    'title' => 'Delete match redirect',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'match_redirect_delete_form',
      5,
    ),
    'access arguments' => array(
      'administer matchredirect',
    ),
    'file' => 'match_redirect.admin.inc',
  );
  return $items;
}

/**
 * Implements hook_permission().
 */
function match_redirect_permission() {
  $perm['administer matchredirect'] = array(
    'title' => t('Administer Match Redirect'),
  );
  return $perm;
}

/**
 * Implements hook_init().
 */
function match_redirect_init() {

  // Get all redirects.
  $results = match_redirect_load_multiple(array());

  // Alias of page user is on.
  $current_alias = drupal_get_path_alias();

  // Check each redirect for a match and stop if found.
  foreach ($results as $row) {
    $patterns = $row->source_pattern;
    $redirect = $row->target;
    $override = $row->override;
    $query = $row->query;
    $code = $row->status_code;
    if (drupal_match_path($current_alias, $patterns)) {

      // Check if the current page exists unless overridden.
      if ($override || !match_redirect_url_exists()) {
        $options = array();
        if ($query) {
          $options['query'] = drupal_get_query_parameters();
        }

        // Do the redirect.
        drupal_goto($redirect, $options, $code);
        break;
      }
    }
  }
}

/**
 * Checks if current page is registered as a menu item (exists).
 *
 * @return bool
 *   Whether or not the menu item was found.
 */
function match_redirect_url_exists() {
  return (bool) menu_get_item();
}

/**
 * Implements hook_theme().
 */
function match_redirect_theme() {
  return array(
    'match_redirect_list_form' => array(
      'render element' => 'form',
      'file' => 'match_redirect.admin.inc',
    ),
  );
}

/**
 * Saves a redirect.
 *
 * @param object $redirect
 *   The redirect object to be saved.
 * 
 * @throws Exception
 */
function match_redirect_save($redirect) {
  $transaction = db_transaction();
  try {

    // Load the stored entity, if any.
    if (!empty($redirect->rid) && !isset($redirect->original)) {
      $redirect->original = entity_load_unchanged('match_redirect', $redirect->rid);
    }

    // Invoke hook_entity_presave() on other modules.
    module_invoke_all('entity_presave', $redirect, 'match_redirect');

    // Save to the database and fire relevent hooks.
    if (!empty($redirect->rid)) {
      drupal_write_record('match_redirect', $redirect, array(
        'rid',
      ));

      // Invoke hook_entity_update() on other modules.
      module_invoke_all('entity_update', $redirect, 'match_redirect');
    }
    else {
      drupal_write_record('match_redirect', $redirect);

      // Invoke hook_entity_insert() on other modules.
      module_invoke_all('entity_insert', $redirect, 'match_redirect');
    }
    unset($redirect->original);
  } catch (Exception $e) {
    $transaction
      ->rollback('match_redirect');
    watchdog_exception('match_redirect', $e);
    throw $e;
  }
}

/**
 * Deletes a redirect.
 *
 * @param int $rid
 *   The id of the redirect to be deleted.
 * 
 * @throws Exception
 */
function match_redirect_delete($rid) {
  $transaction = db_transaction();
  $redirect = match_redirect_load($rid);
  try {

    // Invoke hook_entity_delete() on other modules.
    module_invoke_all('entity_delete', $redirect, 'match_redirect');
    db_delete('match_redirect')
      ->condition('rid', $rid, '=')
      ->execute();
  } catch (Exception $e) {
    $transaction
      ->rollback('match_redirect');
    watchdog_exception('match_redirect', $e);
    throw $e;
  }
}

/**
 * Loads a redirect and returns it.
 *
 * @param int $rid
 *   The id of the redirect to be loaded.
 * @param bool $reset
 *   Whether to reset the internal cache for the requested entity type.
 * 
 * @return mixed
 *   Returns loaded redirect or FALSE if not found.
 */
function match_redirect_load($rid, $reset = FALSE) {
  $redirects = entity_load('match_redirect', array(
    $rid,
  ), array(), $reset);
  return !empty($redirects) ? reset($redirects) : FALSE;
}

/**
 * Loads redirects and returns them ordered by weight.
 *
 * @param array $rids
 *   Array of redirect ids to be loaded.
 * @param array $conditions
 *   An associative array of conditions on the base table, where the keys are 
 *   the database fields and the values are the values those fields must have. 
 *   Instead, it is preferable to use EntityFieldQuery to retrieve a list of 
 *   entity IDs loadable by this function.
 * @param bool $reset
 *   Whether to reset the internal cache for the requested entity type.
 * 
 * @return array
 *   Returns loaded redirects array or empty array if none found.
 */
function match_redirect_load_multiple($rids = array(), array $conditions = array(), $reset = FALSE) {

  // Order by weight.
  $query = new EntityFieldQuery();
  $query
    ->entityCondition('entity_type', 'match_redirect');

  // Get only provided rids but exclude if $rids array is empty.
  if (!empty($rids)) {
    $query
      ->propertyCondition('rid', $rids, 'IN');
  }
  $query
    ->propertyOrderBy('weight');
  $result = $query
    ->execute();

  // Check for result and substitute reordered rids.
  if (isset($result['match_redirect']) && !empty($result['match_redirect'])) {
    $rids = array_keys($result['match_redirect']);
  }
  return entity_load('match_redirect', $rids, $conditions, $reset);
}

Functions

Namesort descending Description
match_redirect_delete Deletes a redirect.
match_redirect_entity_info Implements hook_entity_info().
match_redirect_init Implements hook_init().
match_redirect_load Loads a redirect and returns it.
match_redirect_load_multiple Loads redirects and returns them ordered by weight.
match_redirect_menu Implements hook_menu().
match_redirect_permission Implements hook_permission().
match_redirect_save Saves a redirect.
match_redirect_theme Implements hook_theme().
match_redirect_url_exists Checks if current page is registered as a menu item (exists).