Afficher la liste des termes de taxonomie séparés par des virgules?

10

Drupal 7.

Dans mon node.tpl.php, je veux imprimer une liste de termes de taxonomie (la taxonomie est appelée "canaux"). Si j'utilise:

<?php print render($content['field_channel']); ?>

Cela fonctionne, bien sûr, mais le mieux que je puisse faire pour les aligner est d'utiliser CSS pour les laisser flotter à gauche. Je voudrais qu'ils soient séparés par des virgules. Des idées?

THX.

Mike
la source

Réponses:

11

Vous pouvez essayer de thématiser le champ en utilisant field.tpl.phpou theme_field().

À titre d'exemple (en utilisant field.tpl.php):

  1. Copiez field.tpl.phpdans votre répertoire de thème à partir de "modules / field / theme"
  2. Faites une copie de ce fichier et renommez-le en field--field-channel.tpl.php
  3. Modifiez le fichier comme vous le souhaitez.

Comme exemple rapide / sale pour que cela fonctionne, field--field-channel.tpl.phppourrait ressembler à:

<div class="<?php print $classes; ?> clearfix"<?php print $attributes; ?>>
  <?php if (!$label_hidden) : ?>
    <div class="field-label"<?php print $title_attributes; ?>><?php print $label ?>:&nbsp;</div>
  <?php endif; ?>
  <div class="field-items"<?php print $content_attributes; ?>>
    <?php foreach ($items as $delta => $item) : ?>
      <div style="display:inline;" class="field-item <?php print $delta % 2 ? 'odd' : 'even'; ?>"<?php print $item_attributes[$delta]; ?>>
        <?php 
          print render($item);
          // Add comma if not last item
          if ($delta < (count($items) - 1)) {
            print ','; 
          }
        ?>
      </div>
    <?php endforeach; ?>
  </div>
</div>

Il existe probablement plusieurs façons d'accomplir cela en utilisant le fichier .tpl, mais ce n'est qu'une option. Je recommande d'ajouter une classe au DIV au lieu d'un style et d'apporter les modifications dans votre feuille de style au lieu d'utiliser des styles en ligne.

Laxman13
la source
Génial, cela a parfaitement fonctionné. Je ne savais pas que vous pouviez utiliser des modèles sur des champs comme ça. J'ai encore beaucoup à apprendre avec ce genre de choses. Merci encore.
Mike
L'utilisation de fichiers tpl est un peu plus gourmande en ressources et le mode préféré est d'utiliser la suggestion hook_field ci-dessous.
shaneonabike
11

Le module Text Formatter est maintenant disponible pour Drupal 7 et vous permet de le faire sans travail de thème personnalisé.

jhedstrom
la source
Le module de formatage de texte est probablement la solution idéale à cela maintenant, par opposition à la réponse choisie ci-dessus qui nécessite de contourner la couche de thème.
JamesWilson
7

Voici une façon d'utiliser l' theme_fieldapproche (ajoutez-la à votre template.phpfichier):

/**
 * Implements theme_field()
 *
 * Make field items a comma separated unordered list
 */
function THEMENAME_field__NAME_OF_FIELD__NAME_OF_CONTENT_TYPE($variables) {
  $output = '';

  // Render the label, if it's not hidden.
  if (!$variables['label_hidden']) {
    $output .= '<div class="field-label"' . $variables['title_attributes'] . '>' . $variables['label'] . ':&nbsp;</div>';
  }

  // Render the items as a comma separated inline list
  $output .= '<ul class="field-items"' . $variables['content_attributes'] . '>';
  for ($i=0; $i < count($variables['items']); $i++) {
    $output .= '<li>'. drupal_render($variables['items'][$i]);
    $output .= ($i == count($variables['items'])-1) ? '</li>' : ', </li>';
  }
  $output .= '</ul>';

  return $output;
}
cdmo
la source
1
Super super merci cela a beaucoup aidé en fait! Aussi la méthode préférée, puis un fichier tpl!
shaneonabike
4

Vous pouvez le faire facilement simplement en CSS:

.field-type-taxonomy-term-reference .field-items .field-item {
  affichage: bloc en ligne;
  * affichage: en ligne;
  * zoom: 1;
}
.field-type-taxonomy-term-reference .field-items .field-item: après {
  contenu: ", ";
}
.field-type-taxonomy-term-reference .field-items .field-item: dernier enfant: après {
  contenu: "";
}
Steven Wright
la source
1
Merci, même si j'ai dû utiliser Unicode échappé pour l'espace, comme ceci content: ", \00a0": stackoverflow.com/a/5467676/724176
Hugo
0
<?php
if ($node->taxonomy) {
    foreach($node->taxonomy as $term) {
        if ($term->vid == 3) { // the id of the vocabulary
            $my_terms[] = l(
                t($term->name),
                'taxonomy/term/' . $term->tid
            );
        }
    }
}

if ($my_terms) { ?>
    <div class="clear-block">
        <div class="terms">
            <?php print implode(", ", $my_terms); ?>
        </div>
    </div>
<?php } ?>
brunorios1
la source
3
Cela contourne le système de thème, met une logique d'affichage codée en dur dans le fichier tpl et crée un mal de tête de maintenance.
Jeremy French
Est-il préférable d'utiliser des modules latéraux qui font presque la même chose? Pourriez-vous s'il vous plaît fournir un code plus facile à entretenir?
Rootical V.
0

Encore plus simple pour le délimiteur et le wrapper, vous utilisez le module Taxonomy Formatter: http://drupal.org/project/taxonomy_formatter

Plus de détails sur la page du projet:

Il s'agit d'un petit module écrit pour fournir un formateur personnalisé pour les éléments de taxonomie. Les formateurs par défaut génèrent tous deux les termes enveloppés dans des divs. Ce module ajoute un nouveau formateur qui vous permet de spécifier le type d'élément, le type d'encapsuleur, les classes pour les deux, le séparateur utilisé et s'ils sont liés ou non aux pages de termes. Cela donne des options de mise en page beaucoup plus personnalisables.

Greta
la source