如何呈现表格?


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();
} 

Answers:


33

drupal_get_form() 已由表单构建器服务代替,例如:

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

有关更多详细信息,请参见更改记录

实际上,不要-该更改记录不正确。实际上,当您需要传递类字符串时,它将告诉您传递表单ID。


感谢您的答复,但我在您编写时已经使用了它,并且我知道将drupal_get_form更改为表单生成器,但我想知道如何在主题预处理挂钩中使用它。
卡马尔·欧贝罗伊2015年

1
我不确定您的意思,除非$variables['foo_form'] = \Drupal::formBuilder()->getForm('user_login');是?
克莱夫(Clive)

2
参数是一个类,而不是form_id。类似于UserLoginForm :: class。
贝尔迪尔

1
我建议您使用PHP 5.5 :: class。这更容易(使用方法),并且避免了令人讨厌的错字
-Berdir

1
请提出一个与主题无关的新问题@KamalOberoi-这样可以为将来的访客提供更多帮助。但作为一般规则,看在你的服务器的错误日志和看门狗,当你看到这样的信息
克莱夫

15

您可以在form文件夹下创建一个表单。然后,您可以在任何地方调用您的表单,并如图所示传递参数。

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

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


1
如何获取节点添加表单,例如:添加文章表单(/ node / add / article)?
JayKandari'8

2
+1,您也可以在控制器中不带$参数的情况下传递它。
T先生

5

有两个选项可以返回(D8)或渲染(D7)表单。这些是\Drupal::formBuilder()->getFormDrupal::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

好吧,如果其他所有方法都失败了,那么可以通过设置一个新的表单状态对象来完成一个trick俩。

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,
    ];
  }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.