我需要呈现一个自定义表单,该表单是通过自定义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,
];
}
}
答案 0 :(得分:1)
很高兴与Hemantha Dhanushka在我的评论中找到解决方案。
为使这个问题有一个正确的答案,我在这里通过了经过验证的评论。
我建议您使用第一种方法(改用 routing :: _ form 控制器)。另外,看来您使用了错误的
#type
first_name
字段。尝试使用textfield
而不是textField
。
此外,对于想走得更远的人,以下是一些实施适当链接的链接 routing :: _ form 方法可将表单显示为页面而不是使用Controller:https://www.valuebound.com/resources/blog/step-by-step-method-to-create-a-custom-form-in-drupal-8。
对于寻求有关现有表单元素引用(textfield
,checkboxes
,entity_autocomplete
,...)的更多帮助的人,这里是一篇出色的最新文章{{3 }}
答案 1 :(得分:0)
您可以使用buildForm()
方法。检查以下代码示例:
public function add()
{
$form_state = new Drupal\Core\Form\FormState();
$form_state->setRebuild();
$form = \Drupal::formBuilder()->buildForm('Drupal\my_module\Form\AddForm', $form_state);
return [
'#theme' => 'form_my_module_add',
'#form' => $form,
];
}