You are here

pathauto_taxonomy.inc in Pathauto 6

Same filename and directory in other branches
  1. 5.2 pathauto_taxonomy.inc
  2. 5 pathauto_taxonomy.inc

Hook implementations for taxonomy module integration.

File

pathauto_taxonomy.inc
View source
<?php

/**
 * @file
 * Hook implementations for taxonomy module integration.
 *
 * @ingroup pathauto
 */

/**
 * Implements hook_pathauto().
 */
function taxonomy_pathauto($op) {
  switch ($op) {
    case 'settings':
      $settings = array();
      $settings['module'] = 'taxonomy';
      $settings['token_type'] = 'taxonomy';
      $settings['groupheader'] = t('Taxonomy term paths');
      $settings['patterndescr'] = t('Default path pattern (applies to all vocabularies with blank patterns below)');
      $settings['patterndefault'] = 'category/[vocab-raw]/[catpath-raw]';
      $patterns = token_get_list('taxonomy');
      foreach ($patterns as $type => $pattern_set) {
        if ($type != 'global') {
          foreach ($pattern_set as $pattern => $description) {
            $settings['placeholders']['[' . $pattern . ']'] = $description;
          }
        }
      }
      $settings['supportsfeeds'] = '0/feed';
      $settings['bulkname'] = t('Bulk generate aliases for terms that are not aliased');
      $settings['bulkdescr'] = t('Generate aliases for all existing terms which do not already have aliases.');
      $vocabularies = taxonomy_get_vocabularies();
      if (sizeof($vocabularies) > 0) {
        $settings['patternitems'] = array();
        $forum_vid = variable_get('forum_nav_vocabulary', '');
        foreach ($vocabularies as $vocab) {
          if ($vocab->vid != $forum_vid) {
            $vocabname = $vocab->name;
            $fieldlabel = t('Pattern for all %vocab-name paths', array(
              '%vocab-name' => $vocabname,
            ));
            $settings['patternitems'][$vocab->vid] = $fieldlabel;
          }
        }
      }
      return (object) $settings;
    default:
      break;
  }
}

/**
 * Generate aliases for all categories without aliases.
 */
function taxonomy_pathauto_bulkupdate() {

  // From all node types, only attempt to update those with patterns
  $pattern_vids = array();
  foreach (taxonomy_get_vocabularies() as $vid => $info) {

    // Exclude forum module's vocabulary.
    if ($vid == variable_get('forum_nav_vocabulary', '')) {
      continue;
    }
    $pattern = trim(variable_get('pathauto_taxonomy_' . $vid . '_pattern', ''));

    // If it's not set, check the default
    // TODO - If there's a default we shouldn't do this crazy where statement because all vocabs get aliases
    // TODO - Special casing to exclude the forum vid (and the images vid and...?)
    if (empty($pattern)) {
      $pattern = trim(variable_get('pathauto_taxonomy_pattern', ''));
    }
    if (!empty($pattern)) {
      $pattern_vids[] = $vid;
    }
  }
  $count = 0;
  if (!empty($pattern_vids)) {
    $concat = _pathauto_sql_concat("'taxonomy/term/'", 'td.tid');
    $sql = "SELECT td.tid FROM {term_data} td LEFT JOIN {url_alias} ua ON {$concat} = ua.src WHERE ua.src IS NULL AND td.vid IN (" . db_placeholders($pattern_vids, 'int') . ")";
    $query = db_query_range($sql, $pattern_vids, 0, variable_get('pathauto_max_bulk_update', 50));
    while ($tid = db_result($query)) {
      $term = taxonomy_get_term($tid);
      $count += _taxonomy_pathauto_alias($term, 'bulkupdate');
    }
  }
  drupal_set_message(format_plural($count, 'Bulk generation of terms completed, one alias generated.', 'Bulk generation of terms completed, @count aliases generated.'));
}

/**
 * Create aliases for taxonomy objects.
 *
 * @param $category
 *   A taxonomy object.
 */
function _taxonomy_pathauto_alias($category, $op) {
  $count = 0;
  $placeholders = pathauto_get_placeholders('taxonomy', $category);
  $forum_vid = variable_get('forum_nav_vocabulary', '');

  // If we're in a forum vocabulary, also create a forum container, forum, or forum topic alias.
  if (module_exists('forum') && $forum_vid == (int) $category->vid) {
    $source = 'forum/' . $category->tid;
    if (pathauto_create_alias('forum', $op, $placeholders, $source, $category->tid, $category->vid)) {
      $count++;
    }
  }
  else {
    $source = taxonomy_term_path($category);
    if (pathauto_create_alias('taxonomy', $op, $placeholders, $source, $category->tid, $category->vid)) {
      $count++;
    }
  }
  return $count;
}

/**
 * Implementation of hook_pathauto() for forum module.
 */
function forum_pathauto($op) {
  switch ($op) {
    case 'settings':
      $settings = array();
      $settings['module'] = 'forum';
      $settings['token_type'] = 'taxonomy';
      $settings['groupheader'] = t('Forum paths');
      $settings['patterndescr'] = t('Pattern for forums and forum containers');
      $settings['patterndefault'] = '[vocab-raw]/[catpath-raw]';
      $patterns = token_get_list('taxonomy');
      foreach ($patterns as $type => $pattern_set) {
        if ($type != 'global') {
          foreach ($pattern_set as $pattern => $description) {
            $settings['placeholders']['[' . $pattern . ']'] = $description;
          }
        }
      }
      $settings['supportsfeeds'] = '0/feed';
      $settings['bulkname'] = t('Bulk generate aliases for forum paths that are not aliased');
      $settings['bulkdescr'] = t('Generate aliases for all existing forums and forum containers which do not already have aliases.');
      return (object) $settings;
    default:
      break;
  }
}

/**
 * Generate aliases for all forums and forum containers without aliases.
 */
function forum_pathauto_bulkupdate() {
  $concat = _pathauto_sql_concat("'forum/'", 'td.tid');
  $forum_vid = variable_get('forum_nav_vocabulary', '');
  $sql = "SELECT td.tid FROM {term_data} td LEFT JOIN {url_alias} ua ON {$concat} = ua.src WHERE ua.src IS NULL AND td.vid = %d";
  $query = db_query_range($sql, $forum_vid, 0, variable_get('pathauto_max_bulk_update', 50));
  $count = 0;
  while ($tid = db_result($query)) {
    $term = taxonomy_get_term($tid);
    $count += _taxonomy_pathauto_alias($term, 'bulkupdate');
  }
  drupal_set_message(format_plural($count, 'Bulk update of forums and forum containers completed, one alias generated.', 'Bulk update of forums and forum containers completed, @count aliases generated.'));
}

Related topics

Functions

Namesort descending Description
forum_pathauto Implementation of hook_pathauto() for forum module.
forum_pathauto_bulkupdate Generate aliases for all forums and forum containers without aliases.
taxonomy_pathauto Implements hook_pathauto().
taxonomy_pathauto_bulkupdate Generate aliases for all categories without aliases.
_taxonomy_pathauto_alias Create aliases for taxonomy objects.