Получить список веб-форм, которые могут быть созданы текущим пользователем
Тестируя веб-форму в Drupal 8, я обнаружил нечто странное при попытке получить список доступных веб-форм, которые пользователь может создать.
Моя тестовая среда: Я создал роль, пользователя, который принадлежит к этой роли, и 3 веб-формы. На вкладке "Доступ" каждой из веб-форм я снял флажок "Анонимный пользователь" и "Аутентифицированный пользователь" и разрешил доступ только "Администратору" в 2 веб-формах. В в последнем случае я предоставил "создать" доступ к моей конкретной роли.
Затем в целях тестирования я создал службу rest со следующим кодом:
public function get()
{
// Load all the available entities
$entities = \Drupal::entityTypeManager()->getStorage('webform')->loadMultiple(NULL);
// Check the access of the current user to each of the entities
$forms = array();
foreach( $entities as $entity_id => $entity )
{
$forms[] = array( "$entity_id" => $entity->access('create', NULL) );
}
return new ModifiedResourceResponse($forms);
}
Я ожидал получить:
[{"webform1":false},{"webform2":false},{"webform3":true}]
Но я получаю:
[{"webform1":false},{"webform2":false},{"webform3":false}]
На самом деле я вернул объект $entity
в формате JSON и обнаружил, что сущность ссылается на следующие разрешения: "создать", "view_any", "update_any", "delete_any", "purge_any", "view_own", "update_own", "delete_own". Если я разверну дерево, то смогу увидеть это внутри разрешение "создать" моей сущности webform3, на разрешения даны правильные ссылки (Объект->доступ->создать->Роли->Моя роль присутствует только в последней форме).
Но функция ->access('create')
всегда возвращает значение false. То же самое касается "view_any" и других разрешений. Единственное разрешение, которое возвращает значение true для всех форм, - это "просмотр".
Есть ли какой-нибудь способ, которым я могу это сделать?:
$entities = \Drupal::entityTypeManager()->getStorage('webform')->loadMultiple(NULL);
$forms = array();
foreach( $entities as $entity_id => $entity )
{
if( $entity->access('create', NULL) )
{
$forms[] = $entityid;
}
}
return new ModifiedResourceResponse($forms);
Спасибо и с наилучшими пожеланиями.
1 answers
Я автоматически отвечу на свой вопрос:)
Путем поиска в исходном коде веб-формы я обнаружил, что имя разрешения не "создать", а "submission_create", даже если dpm($entity)
ссылается на "создать".
$ grep -r "access" * | grep submission_create
webform_node.routing.yml: entity_access: 'webform.submission_create'
Webform.php: if (!$webform || !$webform->access('submission_create')) {
(...)
Итак, это работает так, как ожидалось:
$entities = \Drupal::entityTypeManager()->getStorage('webform')->loadMultiple(NULL);
$forms = array();
foreach( $entities as $entity_id => $entity )
{
if( $entity->access('submission_create', NULL) ) {
$forms[] = $entity_id;
}
}
Он возвращает только веб-формы, на которые вы имеете право отправлять материалы.