Как получить URL-адрес изображения объекта Мультимедиа (поле ссылки на объект) в теме ВЕТКИ


Приношу извинения, если этот вопрос уже был задан. Однако в своем исследовании я обнаружил, что ответы были даны для простых полей изображений, которые по умолчанию установлены в Drupal 8. Однако для того, чтобы иметь многоразовые носители, я использую объект мультимедиа и связанные с ним модули. Проблема в том, что я не могу получить доступ к изображению или его URL-адресу в шаблоне TWIG, где простые поля изображения работают просто отлично.

В то время как приведенный ниже код работает должным образом, если field_image является простым типом изображения, но не работает, если это поле ссылки на сущность.

<div class="header-title white overlay" style="background-image:url({{content.field_image.0}});">

В случае поля ссылки на сущность вывод полностью экранируется и нарушает структуру моей темы. Как я могу получить необработанное изображение или URL-адрес? Я не программист, поэтому не знаю, как писать код препроцессора.

Я прикрепляю изображения конфигурации для используемого мной пакета мультимедиа и конфигурации узла, в котором я использую два типа полей изображений.

Медиа-пакет конфигурация enter image description here

Конфигурация узла. Обратите внимание, 'field_image' - это тип изображения drupal по умолчанию, в то время как 'field_image2' - это поле ссылки на сущность, настроенное в пакете мультимедиа выше. enter image description here

Пожалуйста, посоветуйте, как заставить это работать. Спасибо.

Конфигурация Drupal

  • Друпал 8.3
  • media_entity_browser-8.x-1.0-бета2
  • медиа_ценность-8.x-1.6
  • изображение media_entity_image-8.x-1.2
  • встраивание-8.x-1.0-rc3
  • сущность-8.x-1.0-бета2
  • внутренняя форма-8.x-1.0-бета1
  • имя файла-8.x-2.0-beta3
  • файл-8.2.6
  • форматирование полей-8.x-1.0
  • форматирование изображений-8.x-1.x-dev
  • image_url_formatter-форматирование изображений
Author: Wim Mostrey, 2017-02-22

1 answers

Если это изображение, на которое ссылается объект, управляется носителем, то вы должны разрешить обычную визуализацию:

{{ content.field_image2 }}

Затем визуализацией управляет форматер полей, который будет искать режим отображения в Мультимедиа, который не отличается от режимов отображения узлов (по умолчанию, тизер и т. Д.).

Ваше имя файла будет примерно таким:

media--media-bundle--display-mode.html.twig
media--media-bundle.html.twig

Первый из них наиболее специфичен, второй будет основой для этого медиа-объекта, где бы он ни использовался. Я обычно выбираю первый.

Именно в этом конкретном шаблоне ветки должен находиться этот код. По моему мнению, разметка должна быть получена там, а не в ссылочном объекте.

Вы также можете выполнить некоторую предварительную обработку, чтобы решить эту проблему. Вот пример:

/**
 * Implements hook_preprocess_node().
 * @param $variables
 */
function mytheme_preprocess_node(&$variables) {
  $node = $variables['elements']['#node'];
  $bundle = $node->bundle();

  if ($bundle == 'landing_page' && $variables['elements']['#view_mode'] == 'hero') {
    $hero_image = $node->get('field_hero_image')->getValue();

    if (!empty($hero_image)) {
      $entity = Media::load($hero_image[0]['target_id']);
      $variables['hero_image'] = ImageStyle::load('landing_page_hero')->buildUrl($entity->field_image->entity->getFileUri());
    }
  }
}

Затем в моем соответствующем шаблоне...

<div{{ attributes.addClass(classes) }} style="background-image: url('{{ hero_image }}');"></div>

В качестве альтернативы вы можете предварительно обработать объект мультимедиа:

/**
 * Prepares variables for media templates.
 *
 * Default template: media.html.twig.
 *
 * @param array $variables
 *   An associative array containing:
 *   - media: An individual media for display.
 */
function mytheme_preprocess_media(&$variables) {
  /** @var \Drupal\media_entity\MediaInterface $media */
  $media = $variables['elements']['#media'];

  $variables['media'] = $media;
  $variables['name'] = $media->label();

  // Helpful $content variable for templates.
  foreach (Element::children($variables['elements']) as $key) {
    $variables['content'][$key] = $variables['elements'][$key];
  }

  $variables['attributes']['class'][] = 'media';
  $variables['attributes']['class'][] = Html::getClass('media-' . $media->bundle());

  if (!$media->isPublished()) {
    $variables['attributes']['class'][] = 'unpublished';
  }

  if ($variables['elements']['#view_mode']) {
    $variables['attributes']['class'][] = Html::getClass('view-mode-' . $variables['elements']['#view_mode']);

    if ($variables['elements']['#view_mode'] == 'hero') {
      $variables['hero_image'] = ImageStyle::load('hero')->buildUrl($media->field_image->entity->getFileUri());
    }
  }
}
 6
Author: Kevin, 2017-02-22 17:54:25