Bagaimana cara membuat formulir?

20

Apa alternatifnya drupal_get_form('user_login'). di Drupal 8?

Saya menggunakan kode berikut di theme_name.theme, tetapi tidak berhasil.

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

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

Jawaban:

33

drupal_get_form() telah digantikan oleh layanan pembangun formulir, misalnya:

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

Lihat Ubah Catatan untuk detail lebih lanjut.

Sebenarnya, jangan - catatan perubahan itu tidak benar. Ini akan memberitahu Anda untuk melewati ID formulir, padahal sebenarnya Anda harus melewati string kelas.

Clive
sumber
terima kasih atas balasan Anda tetapi saya sudah menggunakannya saat Anda menulis dan juga saya tahu perubahan drupal_get_form untuk membentuk builder tetapi saya ingin tahu bagaimana menggunakannya dalam kait preproses tema saya.
Kamal Oberoi
1
Saya tidak yakin apa yang Anda maksud, kecuali $variables['foo_form'] = \Drupal::formBuilder()->getForm('user_login');apakah itu?
Clive
2
Argumennya adalah kelas, bukan form_id. Sesuatu seperti UserLoginForm :: class.
Berdir
1
Saya sarankan Anda menggunakan kelas PHP 5.5 ::. Ini jauh lebih mudah (menggunakan karya) dan menghindari kesalahan ketik
Berdir
1
Tolong ajukan pertanyaan baru untuk topik yang tidak terkait @KamalOberoi - itu akan memberikan lebih banyak bantuan kepada pengunjung masa depan dengan cara itu. Tetapi sebagai aturan umum, lihat di log kesalahan server Anda dan pengawas ketika Anda melihat pesan itu
Clive
15

Anda dapat membuat formulir di bawah folder formulir. Dan kemudian Anda dapat memanggil formulir Anda di mana saja dan melewati parameter seperti yang ditunjukkan.

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

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

Shreya Shetty
sumber
1
Bagaimana cara mendapatkan formulir tambah simpul, misalnya: tambahkan formulir artikel (/ simpul / tambahkan / artikel)?
JayKandari
2
+1, Anda dapat meneruskannya tanpa $ parameter di controller juga.
Mr.T
5

Ada dua opsi untuk mengembalikan (D8) atau membuat (D7) formulir. Ini \Drupal::formBuilder()->getFormdan Drupal::formBuilder()->buildForm. Saya menggunakan \Drupal::formBuilder()->getFormseperti di bawah ini.

Gunakan ini jika Anda tidak melewati parameter:

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

Gunakan ini jika Anda melewati parameter:

$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 Setara di atas:

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

Bersulang. Beritahu saya jika itu membantu.

Ngatia Frankline
sumber
2

Dokumentasi juga memungkinkan instance kelas. Begitu

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

juga benar.

MICHAEL MWEBAZE
sumber
Mungkin jangan lakukan ini. Jika kelas bentuk menggunakan injeksi dependensi, Anda telah mengelak di sini. Lebih baik membiarkan pembangun formulir instantiate kelas kecuali Anda memiliki alasan yang baik untuk melakukannya.
aaronbauman
0

Dengan asumsi di bawah ini adalah kelas formulir Anda

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

Anda harus membuat instance baru dari kelas formulir Anda terlebih dahulu, dan meneruskannya ke getForm formBuilder.

$form_obj = new \Drupal\demo\Form\MyForm();
$form = \Drupal::formBuilder()->getForm($form_obj);
Muhammad Reda
sumber
2
Anda tidak "harus membuat contoh baru" - ini salah. Anda harus melewati string kelas.
Christian
0

Ok jika semuanya gagal di sini adalah trik licik dengan mengatur objek bentuk negara baru.

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;

... lalu dalam formForm metode form Anda, Anda kemudian dapat ...

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