web-dev-qa-db-ja.com

許可に基づいて段落アイテムを非表示にする方法

段落フィールドの各アイテムへのアクセスを制限しようとしています。私の目標は、各アイテムの作成者のみが特定のアイテムを変更できるようにすることです。 Field Permission モジュールをインストールして有効にしたところ、これがほぼ正確に私が探しているものです。段落の各フィールドにカスタム権限を設定しています。現在の唯一の問題は、どのフィールドも表示されていなくても、各段落アイテムが表示されていることです。

enter image description here

所有者以外のすべてのユーザーに対して段落アイテムを非表示または無効にする方法はありますか?

1
Cyclonecode

フィールドのアクセス許可は必要なものではなく、フィールドのアクセス許可のみを実行し、必要なエンティティ全体のアクセス許可は実行しません。

Hook_ENTITY_TYPE_accessと呼ばれるフックがあり、それをhook_paragraphs_item_access()として使用して、権限を変更できます(例については、paragraph_bundle_permissionsサブモジュールをご覧ください)。

他の人が述べたように、段落アイテムには実際には所有者がいない-フィールドコレクションもそうではない。彼らは本当にこのように分離されるという意味ではありません。必要に応じて、プロパティを自分で追加できます。

段落を段落ではなくノードのようなものに変更することをお勧めします。権限があり、誰かが所有している場合、段落は実際には適切ではありません。フォームを埋め込む場合は、 Inline Entity Form を使用できます。それらはノードなので、パーミッションをより細かく制御できるはずです。

2
Derimagia

各段落エンティティにはユーザー参照ベースフィールドがあり、他に設定されていない場合は、デフォルトでログインしている現在のユーザーにデフォルト設定されます。

したがって、エンティティのアクセスを制御するフックを実装するだけで済みます。何かのようなもの

/**
 * Implements hook_ENTITY_TYPE_access().
 */
function custom_mod_paragraph_access(EntityInterface $entity, $operation, AccountInterface $account) {

  if ($operation !== 'update') {
    return AccessResult::neutral();
  }


  if ($entity->getOwnerId() !== $account->id()) {
    return AccessResult::forbidden();
  }

  return AccessResult::neutral();
}

結果は次のようになります。

enter image description here

ご覧のとおり、ユーザーは引き続き段落を削除できますが、編集はできません。したがって、上記のコードを更新して、削除操作を禁止することもできます。

これはまた、段落を「無効にする」だけで、非表示にしません。

それらを実際に非表示にするには、フォームを変更してから#access = falseに設定する必要があると思います。

2
johndevman