跳转到主要内容
长风 提交于 8 September 2018

翻译者:长风Drupal开发

翻译地址:http://www.5188jxt.com/technology/drupal8mo-kuai-kai-fa-drupal8pei-zhi-api-que-ren-dong-zuo-de-que-ren-chuang-ti-ku.htm

原文链接: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 主题,结果将是这样的: