【发布时间】:2019-07-13 05:52:22
【问题描述】:
我需要通过自定义 Drupal 8 模块中的控制器呈现使用 Drupal\Core\Form\FormBase 和 Drupal\Core\Form\FormStateInterface 创建的自定义表单。是否有任何指导或参考可以遵循?
实际上我尝试通过控制器直接渲染表单。但两种方式都行不通。仅呈现提交按钮。我也参考了 drupal 8 文档。但我找不到解决方案。请在下面找到我的编码示例。如果有什么不妥。请纠正我。
my_module.routing.yml
partner.content:
path: '/partner'
defaults:
_controller: '\Drupal\partner\Controller\PartnerController::add'
_title: 'Add Partner'
requirements:
_permission: 'access content'
partner.addform:
path: '/partner/add'
defaults:
_form: '\Drupal\partner\Form\AddForm'
_title: 'Add Partner'
requirements:
_permission: 'access content'
AddForm.php
namespace Drupal\my_module\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
class AddForm extends FormBase
{
/**
* Returns form id
*
* @return string
*/
public function getFormId(): string
{
return 'my_module_add_form';
}
/**
* Build form array
*
* @param array $form
* @param FormStateInterface $formState
* @return array
*/
public function buildForm(array $form, FormStateInterface $form_state): array
{
// First name
$form['first_name'] = [
'#type' => 'textField',
'#title' => t('First Name'),
'#required' => true,
];
// Other input fields...
$form['submit'] = array(
'#type' => 'submit',
'#value' => $this->t('Save Changes'),
'#button_type' => 'primary',
);
return $form;
}
public function validateForm(array &$form, FormStateInterface $form_state) {}
public function submitForm(array &$form, FormStateInterface $form_state) {}
}
MyModuleController.php
<?php
namespace Drupal\my_module\Controller;
use Drupal\Core\Controller\ControllerBase;
use Drupal\my_module\Form\AddForm;
class MyModuleController extends ControllerBase
{
public function add()
{
$addForm = new AddForm();
$form = \Drupal::formBuilder()->getForm($addForm);
return [
'#theme' => 'form_my_module_add',
'#form' => $form,
];
}
}
【问题讨论】:
-
Hemantha Dhanushka,在回答您的问题之前,我需要一些指导。 Drupal 能够直接从路由器渲染表单 (
your_module.routing.yml) - 为什么要从控制器渲染表单?您是否想要关于通过路由呈现表单的答案(这是最常见的情况 - 也是最佳实践 - 使用表单呈现页面)或者您真的想从控制器的角度呈现表单? -
@KevinWenger 我也尝试过这种方式。但是当我这样做时,它只呈现了提交按钮。不是其他领域。我在上面编辑了我的问题。请检查我的代码,如果有任何问题,请帮助我更正。谢谢
-
我建议您使用第一种方法(使用路由而不是 Controller)。此外,似乎:您为您的
first_name使用了错误的#type。尝试textfield而不是textField。如果您需要更多帮助,我会在此处发布带有完整示例的答案。 -
@KevinWenger 非常感谢您的帮助。如果你能给我一个完整的例子,那就太好了。
-
@KevinWenger 问题已解决:)。你是对的。问题出在
textField。感谢朋友的帮助。
标签: drupal-8 drupal-modules drupal-forms