Рейтинг:0

Как я могу сделать так, чтобы пользовательский блок отображал другой контент на главной странице?

флаг za

У меня есть пользовательский модуль в Drupal 9 (показывающий блок в регионе), который имеет форму администратора с флажком для отображения только на «главной странице» или, если флажок не установлен, на «всех» страницах.

Чтобы блок отображался на главной странице или на всех страницах, мне нужна какая-то функция предварительной обработки для запуска до загрузки блока? Выполняется ли build() только один раз, а затем кешируется? Если да, то как программно сообщить блоку, к какой странице он принадлежит?

У меня есть простая функция сборки для проверки этого (build() находится внутри src/plugin/block), которая не работает:

 общедоступная функция сборки () {
        $alert_front = \Drupal::config('alert_front.settings')->get('front');
        $current_is_front = \Drupal::service('path.matcher')->isFrontPage();
    
      если ($current_is_front) {
        возвращаться [
          '#markup' => $this->t("Да, только главная страница"),
        ];
      }еще{
       возвращаться [
        '#markup' => $this->t('@alert и @fp',[
          '@alert' => тип оповещения($alert_type),
          '@fp' => $alert_front,
        ]),
       ];
     }
}

Блок API Drupal не дает мне многого здесь, но я продолжу копать. Спасибо за любые идеи.

sonfd avatar
флаг in
См. [кэшируемость массивов рендеринга](https://www.drupal.org/docs/8/api/render-api/cacheability-of-render-arrays) на drupal.org.
Рейтинг:1
флаг vg

Обычно вы ограничиваете блок типом контента, страницами или ролями (или их сочетанием) при размещении блока в диалоговом окне редактирования блока — см. https://www.drupal.org/docs/core-modules-and-themes/core-modules/block-module/managing-blocks

Тем не менее, это не будет обрабатывать кэширование содержимого вашего динамического блока.

Если вы хотите сделать этот «переключатель» в своем методе сборки, вам обязательно нужно подумать о кэшировании самостоятельно, см. fe. этот ответ от @Berdir https://drupal.stackexchange.com/a/199601/3218

Вы можете использовать url.path.is_front контекст - см. https://www.drupal.org/docs/drupal-apis/cache-api/cache-contexts для дополнительной информации

Возможно, разделение вашего блока на два разных блока сделает его проще и понятнее.

флаг za
Спасибо @remy, в итоге я использовал кеширование на основе этого другого поста. Это был билет.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.