Рейтинг:0

Программно добавить доступ к одному узлу через модуль ACL

флаг ng

Я потратил день, пытаясь понять, почему мой код не работает. Я пытаюсь программно добавить доступ пользователю на одном узле. Он сохраняет запись в БД, и когда я посещаю страницу контроля доступа для данного узла, пользователь отображается в списках контроля доступа пользователей. Однако, когда я посещаю узел как этот пользователь, мне отказывают в доступе. Я пробовал всевозможные комбинации, но мой текущий код выглядит примерно так:

$node,$account = 'происходит из предыдущей логики, .irrelevant...';
$acl_id = content_access_get_acl_id($node, 'представление');

$connection = База данных::getConnection();
//проверить наличие записи!
$result = $connection->select('acl_user', 'au')
->поля('au')
->условие('au.acl_id', $acl_id)
->условие('au.uid', $account->id())
->выполнить();
$rows = $result->fetchAll();
если (пусто ($ строк)) {
 $connection->insert('acl_user')
  ->поля([
  'acl_id' => $acl_id,
  'uid' => $account->id(),
 ])->выполнить();

 $settings = content_access_get_per_node_settings($course_node);
 //dpm($settings,'settings');
\Drupal::entityTypeManager()->getAccessControlHandler('node')->writeGrants($node);
\Drupal::moduleHandler()->invokeAll('user_acl', $settings);

$grants = \Drupal::moduleHandler()->invokeAll('node_access_records', [$node]);
\Drupal::moduleHandler()->alter('node_access_records', $grants, $node);


$узел->сохранить();
если (node_access_needs_rebuild ()) {
  node_access_rebuild();
  node_access_needs_rebuild (ЛОЖЬ);
}

foreach (Cache::getBins() как $cache_backend) {
  $cache_backend->deleteAll();
}

Любая обратная связь?

Kevin avatar
флаг in
Это все пользовательский код? Нет дополнительного модуля?
флаг ng
Приведенный выше код является пользовательским, однако базовая функциональность исходит из модуля acl. Он работает через интерфейс администрирования, но мне нужно добавить или удалить доступ программно в пользовательском коде. Я думаю, что обхожу какой-то крючок, который вызывает мои проблемы.
Kevin avatar
флаг in
Он не показывает, как этот код называется
флаг ng
Он вызывается из контроллера, но я не думаю, что важно, откуда он вызывается.
Kevin avatar
флаг in
Важно, если он не работает.

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

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