Ограничить тизер для отображения только первого значения поля

14

У меня есть тип контента с полем изображения. Это поле обычно заполняется значениями от 0 до 4. По умолчанию тизер для этого типа контента выводит все от 0 до 4 изображений. Как настроить тизер так, чтобы отображалось только первое изображение?

Greg
источник

Ответы:

12

Создайте пользовательский модуль, замените MODULENAMEего именем и field_imageименем вашего поля:

/**
 * Implements hook_entity_view().
 */
function MODULENAME_entity_view($entity, $type, $view_mode, $langcode) {
  if ($view_mode == 'teaser') {
    $entity->content['field_image']['#items'] = array_slice($entity->content['field_image']['#items'], 0, 1);
  }
}

Смотрите документацию по hook_entity_view () для более подробной информации.

tim.plunkett
источник
Это выглядит многообещающе, я попробую. Может пройти пара дней, прежде чем я смогу это реализовать и доложить. Я относительно новичок в написании модулей, поэтому у меня есть пара вопросов: (1) будет ли ваш пример кода работать (не сбой), когда в поле есть нулевые значения, и (2) он будет работать (не сбой), когда есть другие типы контента без поля изображения? Благодарность!
Грег
1) Да, так и должно быть. 2) Вы можете изменить оператор if на if ($view_mode == 'teaser' && $entity->type == 'CONTENT_TYPE').
tim.plunkett
4
Или просто && isset ($ entity-> content ['field_image']), тогда вам не нужно обновлять код при добавлении поля к другому типу контента или его переименовании, или .. :)
Berdir
Хммм. Это может сработать, но это пример добавления в код того, что должно быть в теме.
artfulrobot
Это будет работать, но если вы решите, как это делается с помощью пользовательского кода, сайт в будущем станет менее обслуживаемым. Вместо этого используйте модуль из drupal.org, упомянутый в других ответах.
Бобик
12

Не нужно писать собственный код.

Попробуйте использовать модуль Field множественный лимит .

Это позволяет вам перейти к настройкам отображения для вашего типа контента и настроить параметры тизера для отображения только определенного количества значений. Вы даже можете пропустить вейлс, например, если хотите, чтобы он отображал значения от 2 до 5

,

rooby
источник
4

Если используется шаблон тизера (то есть: node - CONTENT-TYPE - teaser.tpl.php ), это работает:

  <?php print render($content['IMAGE-FIELD'][0]); ?>
nelslynn
источник
1

Я использовал hook_field_extra_fields () и hook_node_view (), чтобы создать новое поле для отображения первого изображения, чтобы не вмешиваться в исходное поле изображений.

hook_field_extra_fields () инициализирует новое поле, которое появится на вкладке управления отображением вашего типа узла.

function HOOK_field_extra_fields() {
  $extra['node']['NODE_TYPE'] = array(
    'display' => array(
      'primary_image' => array(
        'label' => t('Primary Image'),
        'weight' => 0,
      )
    ),
  );
  return $extra;
}

Затем hook_node_view () используется для добавления первого изображения в качестве содержимого вашего нового поля.

function HOOK_node_view($node, $view_mode, $langcode) {
  if($node->type == 'NODE_TYPE' && $view_mode == 'teaser') {

    //make sure there are images
    if(!empty($node->field_images)) {
      $node->content['primary_image'] = $node->content['field_images'][0];

      //hide the original field with multiple images
      hide($node->content['field_images']);
    }
  }
}

ПРИМЕЧАНИЕ. Если у вас включен набор отображения, вы можете сделать это на вкладке управления отображением.

Teegan
источник