Получить список веб-форм, которые могут быть созданы текущим пользователем


Тестируя веб-форму в 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);

Спасибо и с наилучшими пожеланиями.

Author: sromero, 2017-09-11

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;
    }
}

Он возвращает только веб-формы, на которые вы имеете право отправлять материалы.

 3
Author: sromero, 2017-09-13 12:18:39