У меня есть базовые знания в Drupal, но возникла задача, которую необходимо решить. У меня имеется параграф с названием <b>ad_section</b>, в котором присутствуют два поля: <b>field_link</b> (тип: <i>Plain Text</i>) и <b>field_video</b> (тип: <i>Media->Video</i>). Мне нужно реализовать логику на странице, где отображается этот параграф: если поле <b>field_video</b> содержит прикреплённый видео-файл, то нужно добавить класс <i>has-video</i>, а если это поле пустое, то следует добавить класс <i>no-video</i>. В данный момент классы для body настраиваются следующим образом в файле <b>html.html.twig</b>: <pre><code>{% set body_classes = [ logged_in ? 'user-logged-in' ] %} ... <body{{ attributes.addClass(body_classes) }}></code></pre> Я полагаю, что такую проверку можно реализовать через preprocess-функции в файле моей темы <i>customtheme.theme</i>. Тем не менее, когда я пытаюсь отправить класс в body, даже не добавляя никакой логики, это не приводит к желаемому результату. Вот пример кода, который я использую: <pre><code class="php">function constructor_preprocess__paragraph__ad_section__field_video(&$variables) { $variables['attributes']['class'][] = 'just-test'; }</code></pre> Также я пробовал и другие варианты, но безуспешно: <pre><code class="php">function constructor_preprocess__ad_section__field_video(&$variables) { $variables['attributes']['class'][] = 'just-test'; }</code></pre> <pre><code class="php">function constructor_preprocess_field_video(&$variables) { $variables['attributes']['class'][] = 'just-test'; }</code></pre> <pre><code class="php">function constructor_preprocess_paragraph__ad_section(&$variables) { $variables['attributes']['class'][] = 'just-test'; }</code></pre> Не могли бы вы помочь мне разобраться, как правильно реализовать эту логику?
Для того чтобы проверить, заполнено ли поле у параграфа в Drupal и добавить соответствующий класс, вам нужно использовать подход с написанием preprocess-функции правильно. Мы будем использовать `hook_preprocess_paragraph` для вашего параграфа и добавим логику проверки поля `field_video`. Давайте разберемся, как это сделать шаг за шагом. ### Шаг 1: Проверка наличия видео Для проверки заполненности поля `field_video`, вам нужна структура вашей функции. Проверьте наличие поля в переменной `$variables`: ```php /** * Implements hook_preprocess_paragraph(). */ function customtheme_preprocess_paragraph(&$variables) { // Убедитесь, что речь идет о параграфе нужного типа. if ($variables['paragraph']->getType() === 'ad_section') { // Получаем значение поля field_video. $video_field = $variables['paragraph']->field_video; // Проверяем, есть ли прикрепленный видео-файл. if (!$video_field->isEmpty()) { // Если есть видео, добавляем класс has-video. $variables['attributes']['class'][] = 'has-video'; } else { // В противном случае, добавляем класс no-video. $variables['attributes']['class'][] = 'no-video'; } } } ``` ### Шаг 2: Очистка кеша После того как вы внесли изменения в файл вашей темы (например, `customtheme.theme`), вам нужно очистить кеш Drupal, чтобы изменения вступили в силу. Вы можете сделать это через администраторский интерфейс, перейдя в `Administration -> Configuration -> Performance -> Clear all caches`, или используя команду Drush: ```bash drush cr ``` ### Шаг 3: Проверка в Twig Теперь, когда классы `has-video` и `no-video` корректно добавляются к атрибутам параграфа, вы можете использовать эти классы в вашем Twig-шаблоне для соответствующей разметки. ### Важные заметки 1. Убедитесь, что у вас правильно настроены права доступа и видимость для ваших полей. 2. Обратите внимание, что имена классов, которые вы добавляете, должны соответствовать стилям CSS, определенным в вашей теме, чтобы они могли правильно отображать изменения. ### Заключение Теперь ваш код должен правильно проверять наличие видео и добавлять соответствующий класс к параграфу. Если у вас возникают дополнительные вопросы или трудности, напишите, и мы постараемся помочь.
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'; } } } }
не проверял