ฉันจะแสดงฟอร์มได้อย่างไร


20

drupal_get_form('user_login')เป็นทางเลือกอะไร ใน Drupal 8

ฉันใช้รหัสต่อไปนี้ใน theme_name.theme แต่ใช้ไม่ได้

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

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

คำตอบ:


33

drupal_get_form() ถูกแทนที่ด้วยบริการสร้างแบบฟอร์มเช่น:

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

ดูบันทึกการเปลี่ยนแปลงสำหรับรายละเอียดเพิ่มเติม

ที่จริงอย่า - บันทึกการเปลี่ยนแปลงนั้นไม่ถูกต้อง มันจะบอกให้คุณส่ง ID ของแบบฟอร์มเมื่อจริง ๆ แล้วคุณจำเป็นต้องผ่านสตริงของคลาส


ขอบคุณสำหรับการตอบกลับของคุณ แต่ฉันได้ใช้ไปแล้วในขณะที่คุณเขียนและฉันรู้ว่า drupal_get_form เปลี่ยนเป็นตัวสร้างแบบฟอร์ม แต่ฉันต้องการทราบวิธีใช้งานในตะขอ preprocess ธีมของฉัน
Kamal Oberoi

1
ฉันไม่แน่ใจว่าคุณหมายถึงอะไรเว้นแต่$variables['foo_form'] = \Drupal::formBuilder()->getForm('user_login');จะเป็นเช่นนั้น?
Clive

2
อาร์กิวเมนต์เป็นคลาสไม่ใช่ form_id สิ่งที่ต้องการ UserLoginForm :: class
Berdir

1
ฉันแนะนำให้คุณใช้ PHP 5.5 :: class มันง่ายกว่ามาก (ใช้งานได้) และหลีกเลี่ยงการพิมพ์ผิดที่น่ารำคาญ
Berdir

1
โปรดถามคำถามใหม่สำหรับหัวข้อที่ไม่เกี่ยวข้อง @KamalOberoi - จะให้ความช่วยเหลือเพิ่มเติมแก่ผู้เยี่ยมชมในอนาคต แต่ตามกฎทั่วไปให้ดูในบันทึกข้อผิดพลาดของเซิร์ฟเวอร์ของคุณและสุนัขเฝ้ายามเมื่อคุณเห็นข้อความนั้น
Clive

15

คุณสามารถสร้างฟอร์มภายใต้โฟลเดอร์ฟอร์ม จากนั้นคุณสามารถโทรหาแบบฟอร์มของคุณได้ทุกที่และส่งผ่านพารามิเตอร์ตามที่แสดง

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

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


1
วิธีรับแบบฟอร์มเพิ่มโหนดเช่น: เพิ่มแบบฟอร์มบทความ (/ node / เพิ่ม / บทความ)?
JayKandari

2
+1 คุณสามารถผ่านได้โดยไม่มีพารามิเตอร์ $ ในตัวควบคุมเช่นกัน
Mr.T

5

มีสองตัวเลือกในการส่งคืน (D8) หรือแสดงผล (D7) แบบฟอร์ม เหล่านี้เป็นและ\Drupal::formBuilder()->getForm Drupal::formBuilder()->buildFormฉันใช้\Drupal::formBuilder()->getFormดังต่อไปนี้

ใช้สิ่งนี้หากคุณไม่ผ่านพารามิเตอร์:

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

ใช้สิ่งนี้หากคุณผ่านพารามิเตอร์:

$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 เทียบเท่ากับด้านบน:

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

ไชโย แจ้งให้เราทราบหากช่วยได้


2

เอกสารประกอบอนุญาตให้ใช้อินสแตนซ์ของคลาสได้เช่นกัน ดังนั้น

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

ถูกต้องเช่นกัน


อาจไม่ทำเช่นนี้ ในกรณีที่คลาสฟอร์มใช้การฉีดขึ้นต่อกันคุณได้หลีกเลี่ยงที่นี่ ดีกว่าที่จะให้ผู้สร้างแบบฟอร์มยกตัวอย่างคลาสถ้าคุณไม่มีเหตุผลที่ดีที่จะทำเช่นนั้น
aaronbauman

0

สมมติว่าด้านล่างเป็นชั้นเรียนแบบฟอร์มของคุณ

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

คุณต้องสร้างอินสแตนซ์ใหม่จากคลาสฟอร์มของคุณก่อนและส่งผ่านไปยัง formBuilder ของ getForm

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

2
คุณไม่ต้อง "สร้างอินสแตนซ์ใหม่" - นี่มันผิด คุณควรผ่านคลาสสตริง
คริสเตียน

0

ตกลงหากสิ่งอื่นล้มเหลวที่นี่เป็นเคล็ดลับลับ ๆ ล่อๆโดยการตั้งค่าวัตถุสถานะแบบฟอร์มใหม่

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;

... จากนั้นในรูปแบบวิธีการของคุณ buildForm คุณสามารถ ...

 // Get form state.
 $name = $form_state->get('name');
 if (!empty($name)) {
    $form['name'] = [
      '#type' => 'item',
      '#markup' => $name,
    ];
  }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.