通过Drupal 8中的控制器创建用于渲染自定义表单的自定义模块

时间:2019-07-13 05:52:22

标签: drupal-8 drupal-modules drupal-forms

我需要呈现一个自定义表单,该表单是通过自定义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,
        ];
    }
}

2 个答案:

答案 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

对于寻求有关现有表单元素引用(textfieldcheckboxesentity_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,
    ];
}

参考:https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Form!FormBuilder.php/function/FormBuilder::getForm/8.2.x