web-dev-qa-db-ja.com

特定のフォーム表示(フォームモード)でフォームをロードするにはどうすればよいですか?

カスタムページで、特定のフォーム表示を持つユーザー編集フォームをロードしようとしています。フォームを読み込むことはできますが、特定の表示でフォームを読み込む方法がわかりません。

これは私が今持っているものです:

public function content($substep) {

    $user = \Drupal::entityTypeManager()
      ->getStorage('user')
      ->load(1); // loading user 1 for test purpose

    $form_state = new FormState();

    $form = \Drupal::entityTypeManager()
      ->getFormObject('user', 'default')
      ->setEntity($user);

    return \Drupal::formBuilder()->getForm($form);
}

誰かがアイデアを持っていますか?

5
Tijmen

D8では、UIのフォームに表示モードを追加できます。ただし、これらのフォームモードは、ビューモードのようにすぐには使用できません。

コードでフォームモードを使用する場合は、エンティティタイプのハンドラーセクションで同じ名前のフォーム操作を設定する必要があります。このハンドラーに使用するフォームクラスは、別のフォームクラスではなく、フォームモードで表示されるフィールドを制御する必要があるため、デフォルトハンドラーと同じです。

たとえば、UIで設定したフォームモードprofile2を使用するには、フォーム操作profile2hook_entity_type_build のユーザーエンティティタイプ定義に追加する必要があります。

mymodule.module

function mymodule_entity_type_build(array &$entity_types) {
  $entity_types['user']->setFormClass('profile2', 'Drupal\user\ProfileForm');
}

次に、質問のコード例で新しいフォーム操作(フォームモード)を使用できます。

public function content($substep) {

  $user = \Drupal::entityTypeManager()
    ->getStorage('user')
    ->load(1); // loading user 1 for test purpose

  $form = \Drupal::entityTypeManager()
    ->getFormObject('user', 'profile2')
    ->setEntity($user);

  return \Drupal::formBuilder()->getForm($form);
}
9
4k4

この答えは本当に役に立ちました、

function my_module_entity_form_display_alter(&$form_display, $context) {
  if($context['entity_type'] == 'user' && $context['bundle'] == 'user'){
    $user = \Drupal::currentUser();
    if(!in_array('administrator', $user->getRoles())){
      $storage = \Drupal::service('entity_type.manager')->getStorage('entity_form_display');
      $form_display = $storage->load('user.user.restricted');
    }
  }
}

drupal.org 経由。また、 form_mode_manager は、UIを介してこの問題を解決するための貢献方法のようです。

0
powpow12