如何以及在何处编写Webform提交钩子?

时间:2014-10-03 06:22:03

标签: drupal-7 hook drupal-webform

我是Drupal(7)的新手,因此在以下情况下需要一些帮助。

我创建了一个Webform(我还有其他webform),现在我想要将此webfrom插入到myTable中,而不是插入默认的webform_submitted_data表。根据我的发现,我需要为此编写一个钩子。实际上我对编写这个钩子的方式感到困惑。我有以下问题。

  1. 在哪里写这个钩子(在哪个文件中)。
  2. 如何仅针对一个网络表单编写此挂钩。
  3. 请提供帮助,如果您需要更多信息,请与我们联系。

3 个答案:

答案 0 :(得分:9)

首先,在开始扭曲Drupal的手臂以使其工作方式不同之前,请务必确保这一点。重新调整Webform的数据可能会对Webform的工作方式造成打嗝,这可能会在以后引起您的反响。它仍然可能希望将数据保存在自己的簿记表中,但如果您覆盖其行为,则无法在以后找到它。

话虽这么说,如果你想改变其他模块的行为,比如Webform,你将不得不编写自己的小模块。其中一些钩子也可以通过模板层(使用模板template.php文件)进行影响,但在我看来,这是改变这种行为的错误位置。

Drupal 7模块基本上由最少两个文件组成,*.info文件和*.module文件。前者包含Drupal对模块进行分类和计算可能的依赖关系所需的一些元数据。后者包含实际的PHP代码。

这些文件必须保存在一个目录中(最好)与您为infomodule文件命名的名称相同。要让Drupal找到您的模块,您可以将其放在sites/all/modules

例如,如果您将模块命名为 changemyform ,则这些是所需的最少文件:

  • changemyform.info
  • changemyform.module

两者都应该位于:sites / all / modules / changemyform。

我建议您查看Drupal's developer's manual以获取有关编写模块的更详细说明,包括许可,单元测试......但是对于这个例子,提到的两个文件都可以。

info文件中,您必须至少编写模块的名称,一个小描述,适用于哪个核心版本以及它具有哪些依赖项。像这样的东西就足够了我们的例子:

name = Change my form
description = Changes the submission behavior of my form.
core = 7.x
dependencies[] = webform

接下来我们应该为module文件本身编写逻辑。拦截任何表单提交(包括Webform)的一般钩子是:

function mymodule_form_alter( &$form, &$form_state,$form_id ){
  ...
}

使用此钩子,顾名思义,您可以使用Drupal更改所有表单。不仅是提交处理程序,还有添加/删除字段,添加标记,.......将 mymodule 替换为模块的实际名称,在我的示例中为 changemyform 。接下来,您需要将其范围缩小到仅影响您想要的形式:

function changemyform_form_alter( &$form, &$form_state,$form_id ){
  if ($form_id == 'my_desired_webform_form_id') {
    $form['#submit'][] = 'changemyform_submit_handler';
  }
}

请注意,我现在将mymodule替换为changemyform。您还可以看到我已经为表单的提交属性添加了自定义处理程序。您必须将此处理程序编写为一个函数,然后该函数将包含您需要的所有逻辑。因此,现在总module个文件变为(减去<?php ?>个标记):

function changemyform_form_alter( &$form, &$form_state,$form_id ){
  if ($form_id == 'my_desired_webform_form_id') {
    $form['#submit'][] = 'changemyform_submit_handler';
  }
}

function changemyform_submit_handler($form, &$form_state) {
  ... your submission logic ...
}

现在您已准备好编写在提交时捕获数据所需的所有逻辑,并随心所欲。

由于这是一个模块,您当然应该在管理模块概述屏幕中启用它以使其正常运行。

另外(作为一个挑剔)在编写自己的模块时,请使用描述每个函数的功能以及每个参数可以容纳的文档头来装饰每个函数。即使是微小的,微不足道的功能。

答案 1 :(得分:4)

最好的方法是使用hook_webform_submission_insert()

示例:

function MYMODULE_webform_submission_insert($node, $submission) {
  // Insert a record into a 3rd-party module table when a submission is added.
  db_insert('mymodule_table')
    ->fields(array(
    'nid' => $node->nid, 
    'sid' => $submission->sid, 
    'foo' => 'foo_data',
  ))
    ->execute();
}

答案 2 :(得分:0)

在Drupal 8中,引用entity_insert挂钩的最佳方法-

将此钩子写入模块文件夹的MODULE_NAME.module文件中

function MODULE_NAME_entity_insert(Drupal\Core\Entity\EntityInterface $entity) {
    if($entity->getEntityTypeId() == 'webform_submission') {
        $result = \Drupal::database()->insert('TABLE_NAME')
            ->fields([
                'nid' => $node->nid, 
                'sid' => $submission->sid, 
                'foo' => 'foo_data'
            ])
            ->execute();
    }
}