Рейтинг:1

Как изменить видимость блока Layout Builder?

флаг us

Есть ли хук для изменения доступа к блокам для блоков, размещенных с помощью Layout Builder? Я вижу, что есть hook_block_access; но, к сожалению, это не срабатывает, когда блок размещается с помощью Layout Builder.

Здесь также ведутся работы: https://www.drupal.org/project/drupal/issues/2916876#comment-14279293 сделать стандартные настройки видимости блоков доступными для блоков Layout Builder; но это позволяет использовать только определенные плагины visibilify. Это мой единственный вариант, чтобы создать собственный плагин видимости блока и использовать его с этим патчем?

флаг in
Я считаю, что Drupal постепенно отказывается от хуков в пользу плагинов и подписчиков событий (вы можете найти много статей о том, почему они лучше). Я не удивлюсь, если в патче не будет реализации хука. Кроме того, блоки, размещенные в Block Layout, уже используют плагины Condition. Нет смысла создавать совершенно другой механизм, если вместо этого можно использовать его.
liquidcms avatar
флаг us
@Joseph, так что есть идеи, какое событие управляет доступом к блокам, размещенным с помощью компоновщика макетов?
флаг in
Упомянутый вами патч использует [плагины условий] (https://www.drupal.org/node/1961370), такие же, которые используются для блоков в Block Layout. [Вы можете создавать свои собственные плагины условий] (https://drupalsun.com/2021/04/29/condition-plugins-visibility-drupal-8-9), как и встроенные.
berliner avatar
флаг bd
@liquidcms Можете ли вы немного подробнее описать, чего вы хотите достичь?
liquidcms avatar
флаг us
@Joseph, спасибо за ссылку, и да, я знаю, что с патчем, о котором я упоминаю (поскольку LB еще не использует плагины условий), я мог бы сделать это с помощью плагина, но это кажется излишним, поскольку это обеспечивает ненужный пользовательский интерфейс. Хук (или обработчик событий) был бы более эффективным.
Рейтинг:1
флаг cn

Это мой единственный вариант, чтобы создать собственный плагин видимости блока и использовать его с этим патчем?

Нет, настройка видимости экземпляра блока — не единственный вариант. Вы также можете контролировать доступ на уровне плагина. Если вы добавите BlockPluginTrait:: blockAccess к классу плагина вы контролируете все экземпляры блока этого плагина.

Однако чаще всего в Layout Builder используются встроенные настраиваемые блоки. Плагин для этих блоков уже реализует этот метод, проверяя доступ к объекту содержимого базового блока. Так что в этом случае можно использовать крючок, но для block_content:

используйте Drupal\Core\Access\AccessResult;
используйте Drupal\Core\Entity\EntityInterface;
используйте Drupal\Core\Session\AccountInterface;

/**
 * Реализует hook_ENTITY_TYPE_access().
 */
function mymodule_block_content_access(EntityInterface $entity, $operation, AccountInterface $account) {
  если ($operation == 'представление') {
    если ($entity->id() == 123) {
      вернуть AccessResult::forbidden();
    }
  }
  вернуть AccessResult::neutral();
}
liquidcms avatar
флаг us
я никогда не находил это: «наиболее распространенными в Layout Builder являются встроенные пользовательские блоки», чтобы иметь дело. В любом случае, я не думал, что это необходимо, но я должен был упомянуть, что это блок Views. И для этого не используется хук block_content_access (но полезно знать). Все еще ищу.
4uk4 avatar
флаг cn
Это основная функция пользовательского интерфейса Layout Builder, позволяющая создавать блоки, не подлежащие повторному использованию, на лету. Кстати, класс плагина блока Views реализует `blockAccess()`, проверяющий доступ к View. Таким образом, вы можете настроить доступ там или даже написать свой собственный плагин доступа к представлениям, если вы не найдете параметры доступа, которые ищете.
liquidcms avatar
флаг us
Да, я мог бы написать плагин, в котором больше пользовательского интерфейса, который не требуется. Я думаю, что я, вероятно, неправильно описал вопрос. У меня есть 2 блока (просмотра), которые отображаются или нет в зависимости от содержимого. Мне удалось выполнить то, что я делал, избавившись от одного из блоков и включив часть условия в представление с помощью twig. Спасибо за помощь. Извините, я недостаточно хорошо объяснил.
4uk4 avatar
флаг cn
В исходном вопросе нет ничего плохого, иначе я бы не ответил на него. Но вы не могли ожидать, что это станет таким конкретным. Вы можете применить мой ответ и к этой конкретной задаче. Вставьте два представления в блок и поместите часть условия в blockAccess().

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

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