@BarneyGumble

Как в Drupal проверить заполненность поля у параграфа?

Я небольшой специалист в Drupal, однако, встала задача сделать следущее:

У меня есть параграф с именем ad_section и 2-мя полями: field_link (type: Plain Text) и field_video (type: Media->Video)

Нужно чтобы на странице где выводится этот параграф, случилась проверка: если поле field_video заполненно прикреплённым к нему видео-файлом, то в body добавить класс has-video, а если это поле пустое и осталось незаполненным, то в body добавить класс no-video

Сейчас в html.html.twig классы для body выводятся так:

{%
  set body_classes = [
    logged_in ? 'user-logged-in'
  ]
%}
...
<body{{ attributes.addClass(body_classes) }}>


Как я понял, подобное можно сделать через preprocess-функции в файле моей темы customtheme.theme

Но когда я пытаюсь даже пока безо всякой логики отправить из такой функции класс в body, то ничего не происходит:
function constructor_preprocess__paragraph__ad_section__field_video(&$variables) {
  $variables['attributes']['class'][] = 'just-test';
}

Эти варианты также не дают никакого результата:
function constructor_preprocess__ad_section__field_video(&$variables) {
  $variables['attributes']['class'][] = 'just-test';
}

function constructor_preprocess_field_video(&$variables) {
	$variables['attributes']['class'][] = 'just-test';
}

function constructor_preprocess_paragraph__ad_section(&$variables) {
	$variables['attributes']['class'][] = 'just-test';
}


Вопроса два:
1. Как всё же правильным образом реализовать preprocess-функцию для моего параграфа, чтобы она подхватывалась ядром?
2. И как можно в такой функции сделать проверку на прикреплённый видео-файл?
  • Вопрос задан
  • 21 просмотр
Пригласить эксперта
Ответы на вопрос 1
andead
@andead
друпал девелопер, фрилансер
function THEMENAME_preprocess_html(array &$vars): void {
  if (
    \Drupal::routeMatch()->getRouteName() == 'entity.node.canonical' &&
    $node = \Drupal::routeMatch()->getParameter('node')
  ) {
    foreach ($node->get('field_paragraphs') as $item) {
      $paragraph = $item->entity;
      if ($paragraph->bundle() == 'ad_section' && !$paragraph->get('field_video')->isEmpty()) {
        $vars['attributes']['class'][] = 'has-video';
      }
    }
  }
}


не проверял
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы