Wyświetla listę terminów taksonomicznych oddzieloną przecinkami?

10

Drupal 7.

W moim node.tpl.php chcę wydrukować listę terminów taksonomii (taksonomia nazywa się „kanałami”). Jeśli użyję:

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

Działa, oczywiście, ale najlepsze, co mogę zrobić, aby je wprowadzić, to użyć CSS, aby przesunąć je w lewo. Chciałbym, aby były oddzielone przecinkami. Jakieś pomysły?

Dzięki.

Mikrofon
źródło

Odpowiedzi:

11

Możesz spróbować zmienić temat pola za pomocą field.tpl.phplub theme_field().

Jako przykład (za pomocą field.tpl.php):

  1. Skopiuj field.tpl.phpdo katalogu motywów z „modułów / pola / motywu”
  2. Zrób kopię tego pliku i zmień jego nazwę na field--field-channel.tpl.php
  3. Edytuj plik, jak chcesz.

Jako szybki / brudny przykład tego działania field--field-channel.tpl.phpmoże wyglądać następująco:

<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>

Prawdopodobnie istnieje wiele sposobów osiągnięcia tego celu przy użyciu pliku .tpl, ale jest to tylko jedna opcja. Zalecam dodanie klasy do DIV zamiast stylu i dokonanie zmian w arkuszu stylów zamiast używania stylów wbudowanych.

Laxman13
źródło
Wspaniale, działało idealnie. Nie wiedziałem, że możesz używać szablonów na takich polach. Wciąż mam wiele do nauczenia się z tymi rzeczami. Dzięki jeszcze raz.
Mike
Korzystanie z plików tpl wymaga nieco więcej zasobów, a preferowanym trybem jest użycie poniższej sugestii hook_field.
shaneonabike
11

Moduł Text Formatter jest teraz dostępny dla Drupal 7 i pozwala to zrobić bez pracy z niestandardowymi motywami.

jhedstrom
źródło
Moduł Text Formatter jest prawdopodobnie idealnym rozwiązaniem tego problemu, w przeciwieństwie do wybranej powyżej odpowiedzi, która wymaga przesuwania się w warstwie motywu.
JamesWilson,
7

Oto jeden ze sposobów wykorzystania tego theme_fieldpodejścia (dodaj go do template.phppliku):

/**
 * 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
źródło
1
Super wielkie dzięki, to naprawdę bardzo pomogło! Również preferowana metoda to plik tpl!
shaneonabike
4

Możesz to zrobić łatwo tylko w CSS:

.field-type-taksonomy-term-reference .field-items .field-item {
  display: blok wbudowany;
  * wyświetlacz: wbudowany;
  * zoom: 1;
}
.field-type-taksonomy-term-reference .field-items .field-item: after {
  zadowolony: ", ";
}
.field-type-taksonomy-term-reference .field-items .field-item: last-child: after {
  zadowolony: "";
}
Steven Wright
źródło
1
Dzięki, chociaż musiałem użyć znaku ucieczki Unicode dla tego miejsca, takie jak 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
źródło
3
To omija system motywów, umieszcza logikę wyświetlania na stałe w pliku tpl i powoduje ból głowy związany z konserwacją.
Jeremy French
Czy lepiej jest używać modułów bocznych, które działają prawie tak samo? Czy możesz podać kod bardziej przyjazny dla konserwacji?
Rootical V.
0

Jeszcze łatwiejsze dla separatora i otoki jest moduł modułu taksonomii: http://drupal.org/project/taxonomy_formatter

Więcej szczegółów ze strony projektu:

Jest to mały moduł napisany w celu zapewnienia niestandardowego formatyzatora pozycji taksonomii. Domyślne formaterery wypisują terminy zawinięte w div. Ten moduł dodaje nowy formatyzator, który pozwala określić typ elementu, typ opakowania, klasy dla obu, zastosowany separator oraz czy prowadzą do stron z terminem, czy nie. Daje to znacznie bardziej konfigurowalne opcje układu.

Greta
źródło