Я потратил день, пытаясь понять, почему мой код не работает. Я пытаюсь программно добавить доступ пользователю на одном узле. Он сохраняет запись в БД, и когда я посещаю страницу контроля доступа для данного узла, пользователь отображается в списках контроля доступа пользователей. Однако, когда я посещаю узел как этот пользователь, мне отказывают в доступе.
Я пробовал всевозможные комбинации, но мой текущий код выглядит примерно так:
$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();
}
Любая обратная связь?