カスタムページで、特定のフォーム表示を持つユーザー編集フォームをロードしようとしています。フォームを読み込むことはできますが、特定の表示でフォームを読み込む方法がわかりません。
これは私が今持っているものです:
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);
}
誰かがアイデアを持っていますか?
D8では、UIのフォームに表示モードを追加できます。ただし、これらのフォームモードは、ビューモードのようにすぐには使用できません。
コードでフォームモードを使用する場合は、エンティティタイプのハンドラーセクションで同じ名前のフォーム操作を設定する必要があります。このハンドラーに使用するフォームクラスは、別のフォームクラスではなく、フォームモードで表示されるフィールドを制御する必要があるため、デフォルトハンドラーと同じです。
たとえば、UIで設定したフォームモードprofile2
を使用するには、フォーム操作profile2
を hook_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);
}
この答えは本当に役に立ちました、
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を介してこの問題を解決するための貢献方法のようです。