如何在hook_form_alter()中实现自定义提交处理程序?


15

我已经将我的Drupal 7模块之一更新为8,而我的表单alter遇到了问题。我添加了验证功能和提交处理程序。验证函数可以正常调用,但是提交函数不会被触发。我想知道这是否意味着需要采用Symfony样式的方法将提交处理程序添加到现有表单中。我做了很多搜索,找不到任何示例。还浏览了一些正在进行的D8模块,但我也没有真正找到任何可行的示例。

有谁知道正确的Drupal 8方式是什么?


2
您应该发布现有代码,以便人们查看并发现任何问题/建议的替代方法。
Yuriy Babenko 2013年

从D8 beta9开始,有用于提交处理程序的getter和setter,但是我似乎无法使它们工作并使用下面的答案。我希望节点接口将来能够调度一些事件,因为我宁愿订阅事件而不是使用钩子。
亚历克斯·芬纳

Answers:


13

根据文档中的示例,它与Drupal 7相同:

$form['actions']['submit']['#submit'][] = 'mymodule_upload_enabled_types_submit';

您可以在中找到类似的(有效的)逻辑

还有其他一些。


1
我不能与API文档争论。我的实现可能有些麻烦,我将进行更深入的研究。
Arbee

请参阅上面的更新,除了$ form ['actions'] ['submit']之外,还有$ form ['actions'] ['publish']和['unpublish']部分可以附加提交处理程序。
Arbee

我必须使用$ form ['actions'] ['publish'] ['#submit'] []而不是$ form ['actions'] ['submit'] ['#submit'] []作为提交处理程序在节点发布时正常工作。但是,当节点第一次保存为未发布时,我似乎无法使回调工作。
亚历克斯·芬纳

6

您可以使用以下代码添加所需的提交处理程序数量:

 $form['actions']['submit']['#submit'][] = 'mymodule_what_ever_function';

如果要在默认的提交处理程序之后添加一个提交处理程序(一个在提交回调之后将被调用的提交处理程序),则可以使用以下命令。

$form['#submit'][1] = test_function;

删除提交处理程序:

unset($form["actions"]['submit']);

3

行为可能会更改,或因情况而异。使用“节点删除多个”确认表单

$form['actions']['submit']['#submit'][] = 'mymodule_upload_enabled_types_submit';

@Clive的代码使Drupal忽略主处理程序。在这种情况下,将处理程序添加到该$form['#submit']部分:

$form['#submit'][] = 'mymodule_upload_enabled_types_submit';

1

这是将自定义提交处理程序附加到Drupal 8中的article节点添加/编辑表单的方法:

<?php

use Drupal\Core\Form\FormStateInterface;

/**
 * Implements hook_form_alter().
 */
function my_module_form_alter(&$form, FormStateInterface $form_state, $form_id) {

  // Use this to reveal the form id.
  //drupal_set_message($form_id);

  // Use this with the devel module to inspect the button action(s).
  //kint($form['actions']);

  switch ($form_id) {

    case 'node_article_form':      // New article nodes.
    case 'node_article_edit_form': // Existing article nodes.

      // Attach our custom submit handler.
      $form['actions']['publish']['#submit'][] = 'my_module_node_article_form_submit';
      break;

  }

}

function my_module_node_article_form_submit($form, FormStateInterface $form_state) {
  drupal_set_message('Running custom submit handler...');
}

我无法成功将自定义提交处理程序附加到$form['#submit']该函数,并且无法正常启动该函数。创建新文章时,我必须将其显式附加到“ 保存并发布”按钮,而在编辑现有文章时,必须将其附加至“ 保存并保留发布”按钮。

除了publish,还有一些其他可用的按钮动作:

unpublish
preview
delete

我在Drupal 8.7.3中,my_module_node_article_form_submit($form, FormStateInterface $form_state给了我TypeError: Argument 2 passed to _ccad_content_log_webform_submit() must be an instance of FormStateInterface, instance of Drupal\Core\Form\FormState given;进行更改以_submit($form, $form_state)修复错误。
user1359
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.