【问题标题】:Create custom module for render custom forms through a controller in Drupal 8通过 Drupal 8 中的控制器创建自定义模块以呈现自定义表单
【发布时间】: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


【解决方案1】:

很高兴在我的评论中找到 Hemantha Dhanushka 的解决方案。

为了明确这个问题有一个正确的答案,我在这里通过了经过验证的评论。

我建议您使用第一种方法(使用 routing::_form 控制器)。此外,您似乎使用了错误的#type first_name 字段。试试textfield 而不是textField


另外,对于想要更进一步的人,这里有一些链接可以实现适当的 routing::_form 将表单公开为页面而不是使用控制器的方法:https://www.valuebound.com/resources/blog/step-by-step-method-to-create-a-custom-form-in-drupal-8

对于寻求有关现有表单元素参考(textfieldcheckboxesentity_autocomplete、...)的更多帮助的人,这里有一篇出色的最新文章 https://drupalize.me/tutorial/form-element-reference?p=2766

【讨论】:

    【解决方案2】:

    您可以使用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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-03
      • 1970-01-01
      • 1970-01-01
      • 2015-02-21
      相关资源
      最近更新 更多