Как в Drupal можно проверить, заполнено ли поле у параграфа?

У меня есть базовые знания в Drupal, но возникла задача, которую необходимо решить. У меня имеется параграф с названием <b>ad_section</b>, в котором присутствуют два поля: <b>field_link</b> (тип: <i>Plain Text</i>) и <b>field_video</b> (тип: <i>Media-&gt;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'
  ]
%}
...
&lt;body{{ attributes.addClass(body_classes) }}&gt;</code></pre> 

Я полагаю, что такую проверку можно реализовать через preprocess-функции в файле моей темы <i>customtheme.theme</i>. 

Тем не менее, когда я пытаюсь отправить класс в body, даже не добавляя никакой логики, это не приводит к желаемому результату. Вот пример кода, который я использую: 

<pre><code class="php">function constructor_preprocess__paragraph__ad_section__field_video(&amp;$variables) {
  $variables['attributes']['class'][] = 'just-test';
}</code></pre> 

Также я пробовал и другие варианты, но безуспешно: 

<pre><code class="php">function constructor_preprocess__ad_section__field_video(&amp;$variables) {
  $variables['attributes']['class'][] = 'just-test';
}</code></pre> 

<pre><code class="php">function constructor_preprocess_field_video(&amp;$variables) {
  $variables['attributes']['class'][] = 'just-test';
}</code></pre> 

<pre><code class="php">function constructor_preprocess_paragraph__ad_section(&amp;$variables) {
  $variables['attributes']['class'][] = 'just-test';
}</code></pre> 

Не могли бы вы помочь мне разобраться, как правильно реализовать эту логику?
  • 2 ноября 2024 г. 13:52
Ответы на вопрос 2
Для того чтобы проверить, заполнено ли поле у параграфа в 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';
      }
    }
  }
}


не проверял
Похожие вопросы