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();
} 
Kamal Oberoi
la source

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.

Clive
la source
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);

Shreya Shetty
la source
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.

Ngatia Frankline
la source
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.

MICHAEL MWEBAZE
la source
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);
Muhammad Reda
la source
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,
    ];
  }
Taggart Jensen
la source