diff --git a/modules/taxonomy/taxonomy.module b/modules/taxonomy/taxonomy.module index 9fb5a54d5085a3c6aca8b8ca5e6fa8d2a771db0b..a8996514df60316d82d6277326a0a092bae01c6f 100644 --- a/modules/taxonomy/taxonomy.module +++ b/modules/taxonomy/taxonomy.module @@ -168,15 +168,17 @@ function taxonomy_menu() { 'type' => MENU_LOCAL_TASK, ); - $items['taxonomy/term/%taxonomy_terms'] = array( + $items['taxonomy/term/%taxonomy_term'] = array( 'title' => 'Taxonomy term', + 'title callback' => 'taxonomy_term_title', + 'title arguments' => array(2), 'page callback' => 'taxonomy_term_page', 'page arguments' => array(2), 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, ); - $items['taxonomy/term/%taxonomy_terms/view'] = array( + $items['taxonomy/term/%taxonomy_term/view'] = array( 'title' => 'View', 'type' => MENU_DEFAULT_LOCAL_TASK, ); @@ -189,7 +191,15 @@ function taxonomy_menu() { 'type' => MENU_LOCAL_TASK, 'weight' => 10, ); - + $items['taxonomy/term/%taxonomy_term/feed'] = array( + 'title' => 'Taxonomy term', + 'title callback' => 'taxonomy_term_title', + 'title arguments' => array(2), + 'page callback' => 'taxonomy_term_feed', + 'page arguments' => array(2), + 'access arguments' => array('access content'), + 'type' => MENU_CALLBACK, + ); $items['taxonomy/autocomplete'] = array( 'title' => 'Autocomplete taxonomy', 'page callback' => 'taxonomy_autocomplete', @@ -1330,17 +1340,6 @@ function taxonomy_vocabulary_load($vid) { return reset(taxonomy_vocabulary_load_multiple(array($vid), array())); } -/** - * Return array of tids and join operator. - * - * This is a wrapper function for taxonomy_terms_parse_string which is called - * by the menu system when loading a path with taxonomy terms. - */ -function taxonomy_terms_load($str_tids) { - $terms = taxonomy_terms_parse_string($str_tids); - return $terms; -} - /** * Load multiple taxonomy terms based on certain conditions. * @@ -1408,6 +1407,7 @@ function taxonomy_term_load_multiple($tids = array(), $conditions = array()) { // $tids still to load, or if $conditions was passed without $tids. if ($tids || ($conditions && !$passed_tids)) { $query = db_select('taxonomy_term_data', 't'); + $query->addTag('term_access'); $query->join('taxonomy_vocabulary', 'v', 't.vid = v.vid'); $taxonomy_term_data = drupal_schema_fields_sql('taxonomy_term_data'); $query->addField('v', 'machine_name', 'vocabulary_machine_name'); @@ -1730,32 +1730,6 @@ function taxonomy_node_update_index($node) { } } -/** - * Parses a comma or plus separated string of term IDs. - * - * @param $str_tids - * A string of term IDs, separated by plus or comma. - * comma (,) means AND - * plus (+) means OR - * - * @return an associative array with an operator key (either 'and' - * or 'or') and a tid key containing an array of the term ids. - */ -function taxonomy_terms_parse_string($str_tids) { - $terms = array('operator' => '', 'tids' => array()); - if (preg_match('/^([0-9]+[+ ])+[0-9]+$/', $str_tids)) { - $terms['operator'] = 'or'; - // The '+' character in a query string may be parsed as ' '. - $terms['tids'] = preg_split('/[+ ]/', $str_tids); - } - elseif (preg_match('/^([0-9]+,)*[0-9]+$/', $str_tids)) { - $terms['operator'] = 'and'; - $terms['tids'] = explode(',', $str_tids); - } - $terms['str_tids'] = $str_tids; - return $terms; -} - /** * Implement hook_help(). */ @@ -1840,3 +1814,15 @@ function taxonomy_hook_info() { ), ); } + +/** + * Title callback for term pages. + * + * @param $term + * A term object. + * @return + * The term name to be used as the page title. + */ +function taxonomy_term_title($term) { + return check_plain($term->name); +} diff --git a/modules/taxonomy/taxonomy.pages.inc b/modules/taxonomy/taxonomy.pages.inc index e2cdf516e9dd6451ba1d0f5c6d21c0cf137e0f01..983ea3ac998bd94718df1c1c5a05c12783ecf71b 100644 --- a/modules/taxonomy/taxonomy.pages.inc +++ b/modules/taxonomy/taxonomy.pages.inc @@ -8,104 +8,72 @@ /** * Menu callback; displays all nodes associated with a term. + * + * @param $term + * The taxonomy term. + * @return + * The page content. */ -function taxonomy_term_page($terms, $depth = 0, $op = 'page') { - if ($terms['operator'] != 'and' && $terms['operator'] != 'or') { - drupal_not_found(); +function taxonomy_term_page($term) { + // Build breadcrumb based on the hierarchy of the term. + $current = (object) array( + 'tid' => $term->tid, + ); + $breadcrumb = array(); + while ($parents = taxonomy_get_parents($current->tid)) { + $current = array_shift($parents); + $breadcrumb[] = l($current->name, taxonomy_term_path($current)); + } + $breadcrumb[] = l(t('Home'), NULL); + $breadcrumb = array_reverse($breadcrumb); + drupal_set_breadcrumb($breadcrumb); + drupal_add_feed(url('taxonomy/term/' . $term->tid . '/feed'), 'RSS - ' . $term->name); + drupal_add_css(drupal_get_path('module', 'taxonomy') . '/taxonomy.css'); + + $build = array(); + $build += field_attach_view('taxonomy_term', $term); + if (!empty($term->description)) { + $build['term_description'] = array( + '#markup' => filter_xss_admin($term->description), + '#weight' => -1, + '#prefix' => '<div class="taxonomy-term-description">', + '#suffix' => '</div>', + ); } - $str_tids = $terms['str_tids']; - - if ($terms['tids']) { - $query = db_select('taxonomy_term_data', 't'); - $query->addTag('term_access'); - - // Load array with all tid's the user has access to in the format tid => name. - $term_results = $query - ->fields('t', array('tid', 'name')) - ->condition('tid', $terms['tids'], 'IN') - ->execute() - ->fetchAllKeyed(); - $tids = array_keys($term_results); - $names = array_values($term_results); - - if ($names) { - $title = implode(', ', $names); - drupal_set_title($title); - - switch ($op) { - case 'page': - // Build breadcrumb based on first hierarchy of first term: - $current = (object) array( - 'tid' => $tids[0], - ); - $breadcrumb = array(); - while ($parents = taxonomy_get_parents($current->tid)) { - $current = array_shift($parents); - $breadcrumb[] = l($current->name, taxonomy_term_path($current)); - } - $breadcrumb[] = l(t('Home'), NULL); - $breadcrumb = array_reverse($breadcrumb); - drupal_set_breadcrumb($breadcrumb); - drupal_add_feed(url('taxonomy/term/' . $str_tids . '/' . $depth . '/feed'), 'RSS - ' . $title); - drupal_add_css(drupal_get_path('module', 'taxonomy') . '/taxonomy.css'); - - $build = array(); - // Only display fields if we have a single term, to avoid clutter and - // confusion. - if (count($tids) == 1) { - $term = taxonomy_term_load($tids[0]); - $build += field_attach_view('taxonomy_term', $term); - if (!empty($term->description)) { - $build['term_description'] = array( - '#markup' => filter_xss_admin($term->description), - '#weight' => -1, - '#prefix' => '<div class="taxonomy-term-description">', - '#suffix' => '</div>', - ); - } - } - - if ($nids = taxonomy_select_nodes($tids, $terms['operator'], $depth, TRUE)) { - $nodes = node_load_multiple($nids); - $build += node_build_multiple($nodes); - $build['pager'] = array( - '#markup' => theme('pager', NULL), - '#weight' => 5, - ); - } - else { - $build['no_content'] = array( - '#prefix' => '<p>', - '#markup' => t('There are currently no posts in this category.'), - '#suffix' => '</p>', - ); - } - - return $build; - - case 'feed': - $channel['link'] = url('taxonomy/term/' . $str_tids . '/' . $depth, array('absolute' => TRUE)); - $channel['title'] = variable_get('site_name', 'Drupal') . ' - ' . $title; - // Only display the description if we have a single term, to avoid clutter and confusion. - if (count($tids) == 1) { - $term = taxonomy_term_load($tids[0]); - // HTML will be removed from feed description, so no need to filter here. - $channel['description'] = $term->description; - } - - $nids = taxonomy_select_nodes($tids, $terms['operator'], $depth, FALSE); - - node_feed($nids, $channel); - break; - default: - drupal_not_found(); - } - } - else { - drupal_not_found(); - } + if ($nids = taxonomy_select_nodes(array($term->tid), NULL, TRUE)) { + $nodes = node_load_multiple($nids); + $build += node_build_multiple($nodes); + $build['pager'] = array( + '#markup' => theme('pager', NULL), + '#weight' => 5, + ); + } + else { + $build['no_content'] = array( + '#prefix' => '<p>', + '#markup' => t('There are currently no posts in this category.'), + '#suffix' => '</p>', + ); } + return $build; +} + +/** + * Generate the content feed for a taxonomy term. + * + * @param $term + * The taxonomy term. + */ +function taxonomy_term_feed($term) { + $channel['link'] = url('taxonomy/term/' . $term->tid, array('absolute' => TRUE)); + $channel['title'] = variable_get('site_name', 'Drupal') . ' - ' . $term->name; + // Only display the description if we have a single term, to avoid clutter and confusion. + // HTML will be removed from feed description, so no need to filter here. + $channel['description'] = $term->description; + $nids = taxonomy_select_nodes(array($term->tid, NULL, NULL, FALSE)); + + node_feed($nids, $channel); } /**