Jak renderować formularz?

20

Jaka jest alternatywa dla drupal_get_form('user_login'). w Drupal 8?

Korzystam z następującego kodu w theme_name.theme, ale to nie działa.

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

function MYTHEMENAME_preprocess_page(&$variables) {
  $form = UserLoginForm::create();
} 
Kamal Oberoi
źródło

Odpowiedzi:

33

drupal_get_form() został zastąpiony przez usługę konstruktora formularzy, np .:

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

Zobacz Szczegóły zmian, aby uzyskać więcej informacji.

Właściwie nie, ten rekord zmian jest niepoprawny. Powie ci, abyś przekazał identyfikator formularza, gdy w rzeczywistości musisz przekazać ciąg klasy.

Clive
źródło
dziękuję za twoją odpowiedź, ale już go użyłem podczas pisania, a także wiem, że zmiana drupal_get_form na kreator formularzy, ale chcę wiedzieć, jak go używać w moim temacie wstępnego przetwarzania tematu.
Kamal Oberoi
1
Nie jestem pewien, co masz na myśli, chyba że $variables['foo_form'] = \Drupal::formBuilder()->getForm('user_login');tak?
Clive
2
Argument jest klasą, a nie form_id. Coś jak UserLoginForm :: class.
Berdir
1
Polecam użycie klasy PHP 5.5 ::. Jest to o wiele łatwiejsze (wykorzystanie działa) i pozwala uniknąć denerwujących literówek
Berdir
1
Zadaj nowe pytanie na niezwiązany temat @KamalOberoi - w ten sposób zapewnisz dodatkową pomoc przyszłym użytkownikom. Ale z reguły spójrz na dzienniki błędów serwera i strażnika, gdy zobaczysz ten komunikat
Clive
15

Możesz utworzyć formularz w folderze formularzy. Następnie możesz zadzwonić do swojego formularza w dowolnym miejscu i przekazać parametry, jak pokazano.

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

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

Shreya Shetty
źródło
1
Jak uzyskać formularz dodawania do węzła, na przykład: dodaj formularz artykułu (/ node / add / article)?
JayKandari,
2
+1, możesz przekazać go również bez parametru $ w kontrolerze.
Mr.T
5

Istnieją dwie opcje zwrotu (D8) lub renderowania (D7) formularza. To są \Drupal::formBuilder()->getFormi Drupal::formBuilder()->buildForm. Używam \Drupal::formBuilder()->getFormjak poniżej.

Użyj tego, jeśli nie przekazujesz parametru:

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

Użyj tego, jeśli przekazujesz parametr:

$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 Odpowiednik powyższego:

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

Twoje zdrowie. Daj mi znać, jeśli to pomoże.

Ngatia Frankline
źródło
2

Dokumentacja pozwala również na wystąpienie klasy. Więc

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

jest również poprawne.

MICHAEL MWEBAZE
źródło
Prawdopodobnie nie rób tego. W przypadku, gdy klasa formularza używa wstrzykiwania zależności, omijałeś go tutaj. Lepiej pozwól, aby kreator formularzy utworzył instancję klasy, chyba że masz ku temu dobry powód.
aaronbauman
0

Zakładając, że poniżej jest twoja klasa formy

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

Najpierw musisz utworzyć nową instancję z klasy formularza i przekazać ją do getForm formBuilder.

$form_obj = new \Drupal\demo\Form\MyForm();
$form = \Drupal::formBuilder()->getForm($form_obj);
Muhammad Reda
źródło
2
Nie musisz „tworzyć nowej instancji” - to źle. Powinieneś przekazać ciąg klasy.
Christian
0

Ok, jeśli wszystko inne zawiedzie tutaj, to podstępna sztuczka polegająca na ustawieniu nowego obiektu stanu formularza.

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;

... następnie w formularzu metody buildForm możesz następnie ...

 // Get form state.
 $name = $form_state->get('name');
 if (!empty($name)) {
    $form['name'] = [
      '#type' => 'item',
      '#markup' => $name,
    ];
  }
Taggart Jensen
źródło