Làm cách nào để kết xuất biểu mẫu?


20

Thay thế cho là gì drupal_get_form('user_login'). trong Drupal 8?

Tôi đang sử dụng đoạn mã sau trong theme_name.theme, nhưng nó không hoạt động.

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

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

Câu trả lời:


33

drupal_get_form() đã được thay thế bởi dịch vụ xây dựng biểu mẫu, ví dụ:

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

Xem Bản ghi thay đổi để biết thêm chi tiết.

Trên thực tế, không - hồ sơ thay đổi đó là không chính xác. Nó sẽ bảo bạn vượt qua ID mẫu, trong khi thực tế bạn cần phải vượt qua chuỗi lớp.


cảm ơn bạn đã trả lời nhưng tôi đã sử dụng nó khi bạn viết và tôi cũng biết drupal_get_form thay đổi thành trình xây dựng nhưng tôi muốn biết làm thế nào để sử dụng nó trong hook tiền xử lý chủ đề của mình.
Kamal Oberoi

1
Tôi không chắc ý của bạn là gì, trừ khi $variables['foo_form'] = \Drupal::formBuilder()->getForm('user_login');nó là?
Clive

2
Đối số là một lớp, không phải là form_id. Một cái gì đó như UserLoginForm :: class.
Berdir

1
Tôi khuyên bạn nên sử dụng lớp PHP 5.5 ::. Nó dễ dàng hơn nhiều (sử dụng các tác phẩm) và tránh các lỗi đánh máy gây phiền nhiễu
Berdir

1
Vui lòng đặt câu hỏi mới cho một chủ đề không liên quan @KamalOberoi - nó sẽ cung cấp thêm trợ giúp cho khách truy cập trong tương lai theo cách đó. Nhưng theo nguyên tắc chung, hãy xem nhật ký lỗi của máy chủ và cơ quan giám sát khi bạn thấy thông báo đó
Clive

15

Bạn có thể tạo một biểu mẫu dưới thư mục mẫu. Và sau đó bạn có thể gọi biểu mẫu của bạn ở bất cứ đâu và vượt qua paramater như được hiển thị.

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

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


1
Làm thế nào để có được một biểu mẫu thêm nút, ví dụ: thêm biểu mẫu bài viết (/ nút / thêm / bài viết)?
JayKandari

2
+1, bạn cũng có thể vượt qua nó mà không cần tham số $ trong bộ điều khiển.
ÔngT

5

Có hai tùy chọn để trả về (D8) hoặc kết xuất (D7) một biểu mẫu. Đây là \Drupal::formBuilder()->getFormDrupal::formBuilder()->buildForm. Tôi sử dụng \Drupal::formBuilder()->getFormnhư dưới đây.

Sử dụng cái này nếu bạn không truyền tham số:

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

Sử dụng điều này nếu bạn đang truyền một tham số:

$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 Tương đương như trên:

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

Chúc mừng. Hãy cho tôi biết nếu nó giúp.


2

Các tài liệu cũng cho phép một thể hiện của lớp. Vì thế

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

cũng đúng


Có lẽ đừng làm điều này. Trong trường hợp lớp biểu mẫu sử dụng phép nội xạ phụ thuộc, bạn đã phá vỡ nó ở đây. Tốt hơn hết là để cho trình xây dựng biểu mẫu khởi tạo lớp trừ khi bạn có lý do chính đáng để làm như vậy.
aaronbauman

0

Giả sử dưới đây là lớp mẫu của bạn

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

Trước tiên, bạn phải tạo một phiên bản mới từ lớp biểu mẫu của bạn và chuyển nó đến getForm của formBuild.

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

2
Bạn không "phải tạo một trường hợp mới" - điều này là sai. Bạn nên truyền chuỗi lớp.
Christian

0

Ok nếu tất cả những thứ khác thất bại ở đây là một thủ thuật lén lút bằng cách đặt một đối tượng trạng thái biểu mẫu mới.

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;

... sau đó trong phương thức biểu mẫu buildForm của bạn, sau đó bạn có thể ...

 // Get form state.
 $name = $form_state->get('name');
 if (!empty($name)) {
    $form['name'] = [
      '#type' => 'item',
      '#markup' => $name,
    ];
  }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.