Как получить URL-адрес изображения объекта Мультимедиа (поле ссылки на объект) в теме ВЕТКИ
Приношу извинения, если этот вопрос уже был задан. Однако в своем исследовании я обнаружил, что ответы были даны для простых полей изображений, которые по умолчанию установлены в Drupal 8. Однако для того, чтобы иметь многоразовые носители, я использую объект мультимедиа и связанные с ним модули. Проблема в том, что я не могу получить доступ к изображению или его URL-адресу в шаблоне TWIG, где простые поля изображения работают просто отлично.
В то время как приведенный ниже код работает должным образом, если field_image является простым типом изображения, но не работает, если это поле ссылки на сущность.
<div class="header-title white overlay" style="background-image:url({{content.field_image.0}});">
В случае поля ссылки на сущность вывод полностью экранируется и нарушает структуру моей темы. Как я могу получить необработанное изображение или URL-адрес? Я не программист, поэтому не знаю, как писать код препроцессора.
Я прикрепляю изображения конфигурации для используемого мной пакета мультимедиа и конфигурации узла, в котором я использую два типа полей изображений.
Конфигурация узла. Обратите внимание, 'field_image' - это тип изображения drupal по умолчанию, в то время как 'field_image2' - это поле ссылки на сущность, настроенное в пакете мультимедиа выше.
Пожалуйста, посоветуйте, как заставить это работать. Спасибо.
Конфигурация 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-форматирование изображений
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());
}
}
}