Réécrire la sortie de taxonomy_term_page () sans hacking core


10

Dans Drupal 7, taxonomy.pages.inc contient le taxonomy_term_page(), qui place un <div class="term-listing-heading">autour de la sortie de l'en-tête de taxonomie.

Comment puis-je réécrire la sortie de taxonomy_term_page () dans mon thème, afin de pouvoir supprimer le DIV sans pirater le noyau?

Je suis assez surpris qu'il n'y ait pas de fichier tpl.php disponible taxonomy_term_page()car cela rendrait le thème beaucoup plus facile.


Réponses:


11

Vous pouvez le faire avec la page de prétraitement quelque chose comme ceci:

function themename_preprocess_page(&$vars) {
  if  (arg(0) == 'taxonomy' && arg(1) == 'term' && is_numeric(arg(2))) {
    unset($vars['page']['content']['system_main']['term_heading']['#prefix']);
    unset($vars['page']['content']['system_main']['term_heading']['#suffix']);
  }
}

dans votre thème template.php

Je pense qu'on system_mainpourrait l'appeler autrement, selon la configuration de votre site.


6

Comme il s'agit d'un rappel de menu, vous pouvez implémenter hook_menu_alter () dans un module pour modifier le rappel de menu appelé pour cette page.

function mymodule_menu_alter(&$items) {
  if (!empty($items['taxonomy/term/%taxonomy_term'])) {
    $items['taxonomy/term/%taxonomy_term']['page callback'] = 'mymodule_term_page';
  }
}

function mymodule_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/' . $current->tid);
  }
  $breadcrumb[] = l(t('Home'), NULL);
  $breadcrumb = array_reverse($breadcrumb);
  drupal_set_breadcrumb($breadcrumb);
  drupal_add_feed('taxonomy/term/' . $term->tid . '/feed', 'RSS - ' . $term->name);

  $build = array();

  $build['term_heading'] = array(
    'term' => taxonomy_term_view($term, 'full'),
  );

  if ($nids = taxonomy_select_nodes($term->tid, TRUE, variable_get('default_nodes_main', 10))) {
    $nodes = node_load_multiple($nids);
    $build += node_view_multiple($nodes);
    $build['pager'] = array(
      '#theme' => 'pager', 
      '#weight' => 5,
    );
  }
  else {
    $build['no_content'] = array(
      '#prefix' => '<p>', 
      '#markup' => t('There is currently no content classified with this term.'), 
      '#suffix' => '</p>',
    );
  }
  return $build;
}

Merci! Je préfère la méthode de googletorp car elle n'a pas besoin d'un module séparé. Mais votre suggestion est excellente car elle donne plus de contrôle. Merci!
big_smile

Pour autant que je me souvienne, hook_menu_alter()peut également être mis en œuvre dans un thème; dans Drupal 7, les thèmes peuvent implémenter d'autres hooks.
kiamlaluno

2

Comme l'exemple précédent, sauf qu'il peut être plus propre et plus à l'épreuve du temps de modifier les retours de taxonomy_term_page dans un wrapper plutôt que de copier la fonction d'origine en gros:

function mymodule_menu_alter(&$items) {
  if (!empty($items['taxonomy/term/%taxonomy_term'])) {
    $items['taxonomy/term/%taxonomy_term']['page callback'] = '_custom_taxonomy_term_page';
  }
}

function _custom_taxonomy_term_page ( $term ) {

   $build = taxonomy_term_page( $term );

   // Make customizations then return
   unset( $build['term_heading']['#prefix'] ); 
   unset( $build['term_heading']['#suffix'] );

   return $build;
}

C'est probablement la meilleure façon de procéder.
Horatio Alderaan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.