web-dev-qa-db-fra.com

Comment charger un formulaire avec un affichage de formulaire spécifique (mode formulaire)?

Sur une page personnalisée, j'essaie de charger un formulaire de modification utilisateur avec un affichage de formulaire spécifique. Je suis capable de charger le formulaire mais je ne peux pas comprendre comment charger le formulaire avec l'affichage spécifique.

Voici ce que j'ai maintenant:

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

Quelqu'un a une idée?

5
Tijmen

Dans D8, vous pouvez ajouter des modes d'affichage pour les formulaires dans l'interface utilisateur. Mais ces modes de formulaire ne peuvent pas être utilisés tout de suite comme les modes d'affichage.

Si vous souhaitez utiliser un mode formulaire dans le code, vous devez définir une opération de formulaire avec le même nom dans la section des gestionnaires du type d'entité. La classe de formulaire que vous utilisez pour ce gestionnaire est la même que dans le gestionnaire par défaut, car vous souhaitez contrôler quels champs sont affichés en mode formulaire, pas dans une classe de formulaire différente.

Par exemple, pour utiliser un mode formulaire profile2, que vous avez configuré dans l'interface utilisateur, vous devez ajouter une opération de formulaire profile2 à la définition du type d'entité utilisateur dans un hook_entity_type_build :

mymodule.module

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

Ensuite, vous pouvez utiliser la nouvelle opération de formulaire (mode formulaire) dans l'exemple de code de la question:

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

J'ai trouvé cette réponse vraiment utile,

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 . En outre, form_mode_manager semble être un moyen de contribuer à résoudre ce problème via l'interface utilisateur.

0
powpow12