Wie rendere ich ein Formular?


20

Was ist die Alternative zu drupal_get_form('user_login'). in Drupal 8?

Ich verwende den folgenden Code in theme_name.theme, aber es funktioniert nicht.

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

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

Antworten:


33

drupal_get_form() wurde durch den Form Builder Service ersetzt, zB:

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

Weitere Informationen finden Sie im Änderungsdatensatz .

Tatsächlich nicht - dieser Änderungsdatensatz ist falsch. Sie werden aufgefordert, die Formular-ID zu übergeben, wenn Sie tatsächlich die Klassenzeichenfolge übergeben müssen.


Vielen Dank für Ihre Antwort, aber ich habe es bereits verwendet, als Sie schreiben und auch ich weiß, drupal_get_form ändern, um Builder zu bilden, aber ich möchte wissen, wie man es in meinem Thema Preprocess Hook verwendet.
Kamal Oberoi

1
Ich bin mir nicht sicher, was du meinst, es $variables['foo_form'] = \Drupal::formBuilder()->getForm('user_login');sei denn ?
Clive

2
Das Argument ist eine Klasse, keine form_id. So etwas wie UserLoginForm :: class.
Berdir

1
Ich empfehle die Verwendung der PHP 5.5 :: Klasse. Es ist viel einfacher (benutze Works) und vermeidet lästige Tippfehler
Berdir

1
Bitte stellen Sie eine neue Frage für ein nicht verwandtes Thema @KamalOberoi - es wird zukünftigen Besuchern auf diese Weise mehr Hilfe bieten. Aber als allgemeine Regel, Blick in Ihrem Server-Fehlerprotokollen und der Watchdog , wenn Sie sehen , dass die Nachricht
Clive

15

Sie können ein Formular unter Formularordner erstellen. Und dann können Sie Ihr Formular überall aufrufen und den Parameter wie gezeigt übergeben.

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

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


1
Wie bekomme ich ein Formular zum Hinzufügen eines Knotens, zum Beispiel: Artikelformular hinzufügen (/ node / add / article)?
JayKandari

2
+1, Sie können es auch ohne $ -Parameter im Controller übergeben.
Mr.T

5

Es gibt zwei Möglichkeiten, ein Formular zurückzugeben (D8) oder zu rendern (D7). Das sind \Drupal::formBuilder()->getFormund Drupal::formBuilder()->buildForm. Ich benutze \Drupal::formBuilder()->getFormwie folgt.

Verwenden Sie dies, wenn Sie keinen Parameter übergeben:

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

Verwenden Sie dies, wenn Sie einen Parameter übergeben:

$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 des oben genannten:

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

Prost. Lass es mich wissen, wenn es hilft.


2

Die Dokumentation erlaubt auch eine Instanz der Klasse. So

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

ist auch richtig.


Mach das wahrscheinlich nicht. Falls die Formularklasse die Abhängigkeitsinjektion verwendet, haben Sie sie hier umgangen. Es ist besser, den Form Builder die Klasse instanziieren zu lassen, es sei denn, Sie haben einen guten Grund, dies zu tun.
Aaronbauman

0

Angenommen, das Folgende ist Ihre Formularklasse

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

Sie müssen zuerst eine neue Instanz aus Ihrer Formularklasse erstellen und diese an das getForm von formBuilder übergeben.

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

2
Sie müssen "keine neue Instanz erstellen" - das ist falsch. Sie sollten die Klassenzeichenfolge übergeben.
Christian

0

Wenn alles andere fehlschlägt, ist dies ein hinterhältiger Trick, indem Sie ein neues Formularstatusobjekt festlegen.

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;

... dann können Sie in Ihrer Formularmethode buildForm ...

 // Get form state.
 $name = $form_state->get('name');
 if (!empty($name)) {
    $form['name'] = [
      '#type' => 'item',
      '#markup' => $name,
    ];
  }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.