我想在Drupal 8
中使用块模块构建表单。我知道在Drupal
7中构建表单,但Drupal 8中的表单似乎有所不同。
请求任何使用drupal8自定义表单作为阻止的人来帮助我。
答案 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\YourForm');
$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
答案 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;
}
}
要将表单添加到阻止配置,请参阅:Add a Form to the Block Configuration。