it-swarm.com.de

Wie lade ich ein Formular mit einer bestimmten Formularanzeige (Formularmodus)?

Auf einer benutzerdefinierten Seite versuche ich, ein Benutzerbearbeitungsformular mit einer bestimmten Formularanzeige zu laden. Ich kann das Formular laden, kann jedoch nicht herausfinden, wie das Formular mit der spezifischen Anzeige geladen werden soll.

Das habe ich jetzt:

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

Hat jemand eine Idee?

5
Tijmen

In D8 können Sie Anzeigemodi für Formulare in der Benutzeroberfläche hinzufügen. Diese Formularmodi können jedoch nicht sofort wie Ansichtsmodi verwendet werden.

Wenn Sie einen Formularmodus im Code verwenden möchten, müssen Sie im Handlerabschnitt des Entitätstyps eine gleichnamige Formularoperation festlegen. Die für diesen Handler verwendete Formularklasse ist dieselbe wie im Standardhandler, da Sie steuern möchten, welche Felder im Formularmodus und nicht in einer anderen Formularklasse angezeigt werden.

Zum Beispiel, um einen Formularmodus zu verwenden profile2, die Sie in der Benutzeroberfläche konfiguriert haben, müssen Sie eine Formularoperation hinzufügen profile2 zur Definition des Benutzerentitätstyps in einem hook_entity_type_build :

mymodule.module

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

Dann können Sie die neue Formularoperation (Formularmodus) im Codebeispiel aus der Frage verwenden:

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

Fand diese Antwort wirklich hilfreich,

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');
    }
  }
}

Via drupal.org . Außerdem scheint form_mode_manager eine Möglichkeit zu sein, dieses Problem über die Benutzeroberfläche zu beheben.

0
powpow12