web-dev-qa-db-ja.com

現在のユーザーが作成できるWebフォームのリストを取得します

Drupal 8でWebフォームをテストしています。ユーザーが使用できるWebフォームのリストを取得しようとしたときに、何か奇妙なことがわかりました作成

私のテスト環境:ロール、そのロールに属するユーザー、および3つのWebフォームを作成しました。各Webフォームの[Access]タブで、「Anonymous user」と「Authenticated User "、および2つのWebフォームの"Administrator "へのアクセスのみを許可。最後の1つでは、自分の特定の役割に「作成」アクセス権を与えました。

次に、テスト目的で、次のコードを使用して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}]
_

実際、JSONとして_$entity_オブジェクトを返しましたが、エンティティが次の権限を参照していることがわかりました: "create"、 "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);
_

よろしくお願いします。

3
sromero

私は私の質問に自動回答します:)

Webformソースコード内でgrepを実行すると、dpm($entity)が "create"を参照している場合でも、権限名は "create"ではなく、 "submission_create"であることがわかりました。

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

送信を送信する資格があるWebフォームのみを返します。

2
sromero