Comment rendre un formulaire?


20

Quelle est l'alternative à drupal_get_form('user_login'). dans Drupal 8?

J'utilise le code suivant dans theme_name.theme, mais cela ne fonctionne pas.

// Include namespace for userLoginForm.
use \Drupal\Core\core\modules\user\src\Form;

function MYTHEMENAME_preprocess_page(&$variables) {
  $form = UserLoginForm::create();
} 

Réponses:


33

drupal_get_form() a été remplacé par le service de création de formulaire, par exemple:

$form = \Drupal::formBuilder()->getForm(\Drupal\user\Form\UserLoginForm::class);

Voir le dossier de modification pour plus de détails.

En fait, ne le faites pas - cet enregistrement de changement est incorrect. Il vous dira de passer l'ID du formulaire, alors qu'en fait vous devez passer la chaîne de classe.


merci pour votre réponse mais je l'ai déjà utilisé pendant que vous écrivez et je sais aussi que drupal_get_form change pour le générateur de formulaires mais je veux savoir comment l'utiliser dans mon crochet de prétraitement de thème.
Kamal Oberoi

1
Je ne sais pas ce que tu veux dire, à moins que $variables['foo_form'] = \Drupal::formBuilder()->getForm('user_login');ce soit?
Clive

2
L'argument est une classe, pas un form_id. Quelque chose comme UserLoginForm :: class.
Berdir

1
Je vous recommande d'utiliser la classe PHP 5.5 ::. C'est beaucoup plus facile (utiliser des œuvres) et évite les
typos

1
Veuillez poser une nouvelle question pour un sujet sans rapport @KamalOberoi - cela fournira plus d'aide aux futurs visiteurs de cette façon. Mais en règle générale, regardez dans les journaux d'erreurs de votre serveur et le chien de garde lorsque vous voyez ce message
Clive

15

Vous pouvez créer un formulaire sous dossier de formulaire. Et puis vous pouvez appeler votre formulaire n'importe où et passer le paramètre comme indiqué.

Drupal 7 :$form = drupal_get_form('form_id',$parameter);

Drupal 8 :$form = \Drupal::formBuilder()->getForm('Drupal\custom_module\Form\CustomModuleForm',$parameter);


1
Comment obtenir un formulaire d'ajout de nœud, par exemple: ajouter un formulaire d'article (/ nœud / ajouter / article)?
JayKandari

2
+1, vous pouvez également le passer sans paramètre $ dans le contrôleur.
Mr.T

5

Il existe deux options pour retourner (D8) ou rendre (D7) un formulaire. Ce sont \Drupal::formBuilder()->getFormet Drupal::formBuilder()->buildForm. J'utilise \Drupal::formBuilder()->getFormcomme ci-dessous.

Utilisez ceci si vous ne transmettez pas de paramètre:

$form = \Drupal::formBuilder()->getForm('\Drupal\example\Form\ExampleForm');
return $form;

Utilisez ceci si vous passez un paramètre:

$parameter = "your_parameter";
$form = \Drupal::formBuilder()->getForm('\Drupal\example\Form\ExampleForm', $parameter);
return $form;
//pass to formbuild function
public function buildForm(array $form, FormStateInterface $form_state, $parameter = NULL){//form code}


Drupal 7 Équivalent de ce qui précède:

$parameter = 'your_parameter';
$form = drupal_get_form('form_id', $parameter);
print drupal_render($form);
//pass to form function
function form_id ($form, &$form_state, $parameter){//form code}

À votre santé. Faites-moi savoir si cela aide.


2

La documentation autorise également une instance de la classe. Donc

$formObj = new \Drupal\demo\Form\MyForm();
$form = \Drupal::formBuilder()->getForm($formObj);

est également correct.


Ne fais probablement pas ça. Si la classe de formulaire utilise l'injection de dépendances, vous l'avez contournée ici. Il vaut mieux laisser le générateur de formulaires instancier la classe, sauf si vous avez une bonne raison de le faire.
aaronbauman

0

En supposant que ce qui suit est votre classe de formulaire

namespace Drupal\demo\Form;
use \Drupal\Core\Form\FormBase;
class MyForm extends FormBase {
}

Vous devez d'abord créer une nouvelle instance à partir de votre classe de formulaire et la transmettre à getForm de formBuilder.

$form_obj = new \Drupal\demo\Form\MyForm();
$form = \Drupal::formBuilder()->getForm($form_obj);

2
Vous n'avez pas "à créer une nouvelle instance" - c'est faux. Vous devez transmettre la chaîne de classe.
Christian

0

Ok si tout le reste échoue, voici une astuce sournoise en définissant un nouvel objet d'état de formulaire.

use Drupal\Core\Form\FormState;
...

$form_state = new FormState();
$form_state->set('name', $name);
$form_state->set('user', $user);
$render_array = \Drupal::formBuilder()->buildForm('\Drupal\mod\Form\MyForm', $form_state);
...
// Example render.
$response = new AjaxResponse();
// Show a dialog box.
$dialogText['#attached']['library'][] = 'core/drupal.dialog.ajax';
$response->addCommand(new OpenModalDialogCommand("Dialog Title", $render_array, ['width' => '300']));
return $response;

... alors dans votre méthode de formulaire buildForm vous pouvez alors ...

 // Get form state.
 $name = $form_state->get('name');
 if (!empty($name)) {
    $form['name'] = [
      '#type' => 'item',
      '#markup' => $name,
    ];
  }
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.