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);
_
よろしくお願いします。
私は私の質問に自動回答します:)
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フォームのみを返します。