Рейтинг:0

Как использовать hook_block_access() с пользовательским блоком, созданным в пользовательском интерфейсе

флаг gb

У меня есть пользовательский блок, созданный с использованием библиотеки пользовательских блоков Drupal 9. Я хочу использовать hook_block_access() для управления доступом к нему, но, поскольку это пользовательский блок, у него нет машинного имени блока. Единственный идентификатор, который я могу найти (используя переменные Devel):

объект стандартного класса ( [УЧЕБНЫЙ КЛАСС] => Drupal\block_content\Entity\BlockContent [тема: защищено] => [значения: защищено] => Массив
( [id] => Массив ( [х-по умолчанию] => 4 )

        [revision_id] => Массив
            (
                [х-по умолчанию] => 4
            )

        [тип] => Массив
            (
                [x-по умолчанию] => базовый
            )

        [uuid] => Массив
            (
                [x-по умолчанию] => f0c17429-584a-4221-995c-c00f4c41c714
            )

        [код языка] => Массив
            (
                [x-по умолчанию] => ru
            )

        [revision_user] => Массив
            (
                [х-по умолчанию] => 
            )

        [revision_created] => Массив
            (
                [х-по умолчанию] => 1632243859
            )

        [revision_log] => Массив
            (
                [х-по умолчанию] => 
            )

        [revision_default] => Массив
            (
                [х-по умолчанию] => 1
            )

        [isDefaultRevision] => Массив
            (
                [х-по умолчанию] => 1
            )

        [статус] => Массив
            (
                [х-по умолчанию] => 1
            )

        [информация] => Массив
            (
                [x-default] => Добавить контент
            )

        [изменено] => Массив
            (
                [х-по умолчанию] => 1632261438
            )

        [default_langcode] => Массив
            (
                [х-по умолчанию] => 1
            )

        [revision_translation_affected] => Массив
            (
                [х-по умолчанию] => 1
            )

        [многоразовый] => Массив
            (
                [х-по умолчанию] => 1
            )

        [тело] => Массив
            (
                [x-по умолчанию] => Массив
                    (
                        [0] => Массив
                            (
                                [значение] => 

и т.д...

Я добираюсь до редактирования блока, перейдя к: http://mysite.com/block/4

Как я могу использовать hook_block_access (блокировка $ блок, $ операция, AccountInterface $ учетная запись) управлять доступом к этому блоку? Как определить этот блок в $блок переменная?

Рейтинг:2
флаг cn

После того, как вы создали пользовательский блок в пользовательском интерфейсе, вы можете разместить его в разных регионах. Каждый из этих экземпляров получает имя машины и hook_block_access() работает по назначению.

Если вы хотите контролировать доступ на уровне объекта контента, это имеет смысл, потому что вы можете использовать блочный контент не только в макете блока, реализовать хук доступа для типа объекта 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() == 4) {
      вернуть AccessResult::forbidden();
    }
  }
  вернуть AccessResult::neutral();
}
SomebodySysop avatar
флаг gb
Обнаружено, что hook_block_access() вообще не работает, когда блок размещается с помощью компоновщика. hook_entity_type_access(), с другой стороны, работает отлично. Спасибо вам за это.

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

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