Показать разделенный запятыми список терминов таксономии?

10

Drupal 7.

В моем файле node.tpl.php я хочу распечатать список терминов таксономии (таксономия называется «каналы»). Если я использую:

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

Очевидно, что это работает, но лучшее, что я могу сделать, чтобы встроить их, - это использовать CSS для перемещения их влево. Я хотел бы, чтобы они были разделены запятыми. Любые идеи?

Спасибо.

Майк
источник

Ответы:

11

Вы можете попробовать создать тематику поля, используя field.tpl.phpили theme_field().

В качестве примера (используя field.tpl.php):

  1. Скопируйте field.tpl.phpв каталог вашей темы из "modules / field / theme"
  2. Сделайте копию этого файла и переименуйте его в field--field-channel.tpl.php
  3. Отредактируйте файл так, как вам нравится.

В качестве быстрого / грязного примера, чтобы это работало, field--field-channel.tpl.phpможет выглядеть так:

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

Вероятно, есть несколько способов сделать это с помощью файла .tpl, но это только один вариант. Я рекомендую добавить класс в DIV вместо стиля и внести изменения в таблицу стилей вместо использования встроенных стилей.

Laxman13
источник
Круто, это сработало отлично. Я не знал, что вы можете использовать шаблоны на таких полях. Все еще есть чему поучиться с этим материалом. Еще раз спасибо.
Майк
Использование файлов tpl немного более ресурсоемко, и предпочтительным режимом является использование предложения hook_field ниже.
shaneonabike
11

Модуль Text Formatter теперь доступен для Drupal 7 и позволяет вам делать это без работы с пользовательскими темами.

jhedstrom
источник
Модуль Text Formatter, вероятно, является идеальным решением для этого сейчас, в отличие от выбранного выше ответа, который требует осмотра в слое темы.
Джеймс Уилсон
7

Вот один из способов использования theme_fieldподхода (добавьте его в свой template.phpфайл):

/**
 * 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
источник
1
Супер большое спасибо, это очень помогло на самом деле! Также предпочтительный метод, затем файл TPL!
shaneonabike
4

Вы можете сделать это легко просто в CSS:

.field-type-taxonomy-term-reference .field-items .field-item {
  дисплей: встроенный блок;
  * дисплей: встроенный;
  * увеличение: 1;
}
.field-type-taxonomy-term-reference .field-items .field-item: after {
  содержание: ",";
}
.field-type-taxonomy-term-reference .field-items .field-item: last-child: after {
  содержание: "";
}
Стивен Райт
источник
1
Спасибо, хотя мне пришлось использовать экранированный Unicode для пространства, как это 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
источник
3
Это обход системы тем, помещение жестко закодированной логики отображения в файл tpl и создание головной боли при обслуживании.
Джереми Френч
Лучше использовать боковые модули, которые делают почти то же самое? Не могли бы вы предоставить более удобный для обслуживания код?
Rootical V.
0

Еще проще для разделителя и оболочки, вы используете модуль таксономического форматера: http://drupal.org/project/taxonomy_formatter

Подробнее на странице проекта:

Это небольшой модуль, созданный для предоставления пользовательского средства форматирования для элементов таксономии. Оба средства форматирования по умолчанию выводят термины, заключенные в div. Этот модуль добавляет новый форматер, который позволяет вам указать тип элемента, тип оболочки, классы для обоих, используемый разделитель, и если они ссылаются на термин страницы или нет. Это дает гораздо больше настраиваемых параметров макета.

Грета
источник