如何在drupal 8中使用块模块创建表单?

时间:2016-04-15 09:35:51

标签: drupal drupal-8

我想在Drupal 8中使用块模块构建表单。我知道在Drupal 7中构建表单,但Drupal 8中的表单似乎有所不同。

请求任何使用drupal8自定义表单作为阻止的人来帮助我。

3 个答案:

答案 0 :(得分:19)

您的问题非常模糊,因为我不知道您对Drupal 8中的模块,表单和块有多了解。所以这里有一个小指南该怎么做,有关如何进行操作的更多信息对于这个答案,细节会有点过分。

<强> 1。创建一个新模块并启用它

请看这里:Naming and placing your Drupal 8 module

基本上你创建模块文件夹和模块信息yml文件让Drupal知道模块。然后使用drush或Drupal中的管理区域启用它。

<强> 2。创建表单

请看这里:Introduction to Form API

your_module/src/Form下创建表单。上面链接中的更多细节。

第3。创建块并呈现表单

请看这里:Create a custom block

your_module/src/Plugin/Block/下,您将创建将呈现表单的块。

这个想法基本上是(根据Henrik的建议更新代码):

$builtForm = \Drupal::formBuilder()->getForm('Drupal\your_module\Form\Your‌​Form');
$renderArray['form'] = $builtForm;

return $renderArray;

注意:您不需要使用$builtForm包裹$renderArray,您只需返回$builtForm即可。我个人喜欢这样做,因为我经常需要在最终渲染数组中添加其他东西,如标记,缓存设置或库等。

<强> 4。放置块

将块放在所需的区域。完成。

答案 1 :(得分:0)

以下是如何解决此问题的详细摘要: -

https://www.sitepoint.com/building-drupal-8-module-blocks-forms/

按照上述指南,您可以将完成的表单添加到块构建功能,例如

class DemoBlock extends BlockBase {

  /**
   * {@inheritdoc}
   */
  public function build() {    
    $form = \Drupal::formBuilder()->getForm('Drupal\demo\Form\DemoForm');
    return $form;
  }

}

如果您是Drupal 8的新手,或者需要摒弃您的知识,可以使用一些更有用的文档:

https://www.drupal.org/docs/8/creating-custom-modules

https://www.drupal.org/docs/8/api/block-api

https://www.drupal.org/docs/8/api/form-api

答案 2 :(得分:0)

要使用块模块构建表单,您可以轻松使用Webform module添加表单并显示为块。

如果您想在自定义块中以编程方式创建表单,可以通过创建如下所示的两个文件来实现:

表单文件(src/Form/DemoForm.php):

<?php

/**
 * @file
 * Contains \Drupal\demo\Form\DemoForm.
 */

namespace Drupal\demo\Form;

use Drupal\Core\Form\FormBase;

class DemoForm extends FormBase {

  /**
   * {@inheritdoc}.
   */
  public function getFormId() {
    return 'demo_form';
  }

  /**
   * {@inheritdoc}.
   */
  public function buildForm(array $form, array &$form_state) {

    $form['email'] = array(
      '#type' => 'email',
      '#title' => $this->t('Your .com email address.')
    );
    $form['show'] = array(
      '#type' => 'submit',
      '#value' => $this->t('Submit'),
    );

    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function validateForm(array &$form, array &$form_state) {
    $values = $form_state->getValues();
    if (strpos($values['email'], '.com') === FALSE ) {
      $form_state->setErrorByName('email', t('This is not a .com email address.'));
    } 
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, array &$form_state) {
    drupal_set_message($this->t('Your email address is @email', array('@email' => $form_state['values']['email'])));
  }

}

来源:Building a Drupal 8 Module: Blocks and Forms

阻止文件(src/Plugin/Block/HelloBlock.php):

<?php

namespace Drupal\mymodule\Plugin\Block;

use Drupal\Core\Block\BlockBase;

/**
 * Provides a 'Hello' Block.
 *
 * @Block(
 *   id = "form_block",
 *   admin_label = @Translation("My form"),
 *   category = @Translation("My Category"),
 * )
 */
class HelloBlock extends BlockBase {

  /**
   * {@inheritdoc}
   */
  public function build() {
    $form = \Drupal::formBuilder()->getForm('\Drupal\mymodule\Form\HelloBlock');
    //$form['#attached']['js'][] = drupal_get_path('module', 'example') .  '/js/example.js';
    //$form['#markup'] = $this->t('Custom text');
    return $form;
  }

}

来源:Create a custom block

要将表单添加到阻止配置,请参阅:Add a Form to the Block Configuration