Drupal8模块开发 - Drupal8配置API - 确认动作的确认窗体库

翻译者:长风Drupal开发

原文链接:https://www.drupal.org/docs/8/api/form-api/confirmformbase-to-confirm-an-action

 

Drupal8开发中,确认表单的构建相当简单,是推荐用户确认动作的推荐方式。与许多形式一样,这一切都是从一条路线开始的。
路由
在一个Drupal8模块的 *.routing.yml文件中,创建一个到表单的路径。在Drupal开发的许多情况下,希望将参数从路径传递到确认表单,就像删除某种内容一样。这可以在下面的例子中看到:
example_module.delete:
path: '/example/{id}/delete'
defaults:
_form: '\Drupal\example_module\Form\ConfirmDeleteForm'
_title: 'Confirm Deletion'
requirements:
_permission: 'administer site configuration'
id: ^\d+$

ID的值通过附加到标准参数列表的参数传递给窗体的buildForm()函数。一个只允许数字ID通过的ReGEX已经被应用在“需求”部分。
注意:路由参数是用户提供的内容,因此不安全。上面的正则表达式保证只传递数字,但是可能需要以某种方式对其他参数进行消毒或验证,以确保不传递恶意内容。

Drupal确认表单
构造了一个扩展确认表单库并实现确认窗体接口的新形式。至少,从确认窗体接口需要实现以下四个功能:
public function submitForm(array &$form, FormStateInterface $form_state);
public function getFormId();
public function getCancelUrl();
public function getQuestion();

Drupal8开发的具体实施过程中,要查看其他什么可以实现,请检查ConfirmFormInterface  API文档。
为了获得要在表单中使用的路由参数,需要在类中创建一个字段来存储它,并且需要用路由参数的附加参数实现buildForm()。

drupal8 确认表单例子
<?php
namespace Drupal\example_module\Form;
use Drupal\Core\Form\ConfirmFormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Url;
/**
* Defines a confirmation form to confirm deletion of something by id.
*/
class ConfirmDeleteForm extends ConfirmFormBase {
/**
 * ID of the item to delete.
 *
 * @var int
 */
protected $id;
/**
 * {@inheritdoc}
 */
public function buildForm(array $form, FormStateInterface $form_state, string $id = NULL) {
$this->id = $id;
return parent::buildForm($form, $form_state);
}
/**
 * {@inheritdoc}
 */
public function submitForm(array &$form, FormStateInterface $form_state) {
// @todo: Do the deletion.
}
/**
 * {@inheritdoc}
 */
public function getFormId() : string {
return "confirm_delete_form";
}
/**
 * {@inheritdoc}
 */
public function getCancelUrl() {
return new Url('example_module.another_path');
}
/**
 * {@inheritdoc}
 */
public function getQuestion() {
return t('Do you want to delete %id?', ['%id' => $this->id]);
}
}

这个例子相当简单,有很多方法可以改进。在Drupal8中,使用Drupal的Bartik 主题,结果将是这样的: