В Drupal 6 я мог управлять видимостью блока, используя PHP-код в конфигурации пользовательского интерфейса блока, например:
<?php return MYMODULE_abc() || MYMODULE_def() ; ?>
Эти функции просматривали текущий узел, таксономию и т. Д., Чтобы решить, отображать ли блок. Эта опция PHP отсутствует в Drupal 8, но есть $visibility
поле в BlockBase
. Могу ли я использовать это для программной установки видимости во время выполнения?
Ответы:
Фрагмент рабочего кода, как использовать
hook_block_access()
. Здесь я получаю условие из поля текущего узла:Спасибо @Insasse за то, что поделились следующей жемчужиной в комментариях. Для программно созданных пользовательских блоков вы можете управлять видимостью прямо из класса блока с помощью
blockAccess()
:Источник: Как программно создать блок в Drupal 8
источник
Отсутствие фильтра php в Drupal 8, это больше невозможно из пользовательского интерфейса.
Единственный вариант - использовать блок api.
hook_block_access - ваш лучший кандидат. Оттуда вы можете проверить
$operation
и вернуть AccessResult в зависимости от ваших условий.Так же, как и в пользовательском интерфейсе, только на этот раз вставляем php в модуль.
источник
Вот решение Drupal 8: блок исключать страницы .
источник
Для 8.2.x вам нужно создать плагин условия и реализовать ContextProviderInterface .
Смотрите пример из DO, но он как-то устарел (потому что BlockEvent и BlockSubscriberBase удалены в пользу службы хранилища контекста).
Также было бы неплохо использовать консоль Drupal для генерации плагина:
источник
чтобы расширить возможности видимости блока, вы можете попробовать этот патч:
https://www.drupal.org/project/drupal/issues/923934#comment-12401360
он вводит оператор соединения И / ИЛИ для условий видимости, так что вы можете сказать о, я хочу, чтобы этот блок был видимым, если он имеет тип my_content_type, ИЛИ у пользователя есть роль администратора, ИЛИ URL начинается с моего / path / to / * и т.д .. также условия можно отменить, чтобы вы могли установить множество условий, при которых вы не хотите, чтобы ваш блок был видимым
также, если вы используете модуль Drupal Commerce, вы можете попробовать описанное выше, установив модуль https://www.drupal.org/project/commerce_quick_purchase, отметив, что при установке модуль предоставляет эту функциональность для всех блоков в системе, даже если вы не используйте блок, предоставленный модулем, см. подробнее
https://github.com/drugan/commerce_quick_purchase#block-visibility
Кроме того, вы можете создать свой собственный плагин условия см. пример из модуля
https://cgit.drupalcode.org/commerce_quick_purchase/tree/src/Plugin/Condition
источник