web-dev-qa-db-fra.com

Comment rendre un formulaire?

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

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 Change Record 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.

33
Clive

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

15
Shreya Shetty

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

Utilisez ceci si tu ne passes pas un paramètre:

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

Utilisez ceci si tu passes 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}

$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.

6
Ngatia Frankline

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

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

est également correct.

2
MICHAEL MWEBAZE

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,
    ];
  }
0
Taggart Jensen

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);
0
Muhammad Reda