Drupal 7 如何以及在何处编写WebFormSubmitHook?

Drupal 7 如何以及在何处编写WebFormSubmitHook?,drupal-7,hook,drupal-webform,Drupal 7,Hook,Drupal Webform,我是Drupal(7)的新手,因此在以下情况下需要一些帮助 我已经创建了一个Webform(我还有其他Webform),现在我不想在默认Webform_submitted_数据表中插入,而是希望将此webfrom插入myTable。根据我的发现,我需要为这个写一个钩子。实际上,我对写这个钩子的方法感到困惑。我有以下问题 在何处写入此钩子(在哪个文件中) 如何只为一个webform编写此钩子 如果您需要更多信息,请帮助并告诉我。首先,在您开始扭转Drupal的手臂使事情以不同于预期的方式工作之前,

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

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

  • 在何处写入此钩子(在哪个文件中)
  • 如何只为一个webform编写此钩子

  • 如果您需要更多信息,请帮助并告诉我。

    首先,在您开始扭转Drupal的手臂使事情以不同于预期的方式工作之前,请务必确保。为Webform重新路由数据可能会给Webform的工作方式带来潜在的问题,这可能会影响您以后的工作。它可能仍然希望数据保存在它自己的簿记表中,但如果您覆盖它的行为,它将无法在那里找到它

    也就是说,如果您希望改变其他模块(如Webform)的行为,则必须编写自己的微型模块。其中一些钩子也可以通过模板层(使用您的模板
    template.php
    文件)受到影响,但在我看来,这是改变这种行为的错误地方

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

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

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

    • changemyform.info
    • changemyform.module
    两者都应该位于:sites/all/modules/changemyform

    我建议您查看有关编写模块的更详细说明,包括许可、单元测试等等。但是对于这个例子,上面提到的两个文件就可以了

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

    name = Change my form
    description = Changes the submission behavior of my form.
    core = 7.x
    dependencies[] = webform
    
    接下来,我们应该为
    模块
    文件本身编写逻辑。拦截任何表单提交(包括Webform)的通用钩子是:

    函数mymodule\u form\u alter(&$form,&$form\u state,$form\u id){
    ...
    }
    
    顾名思义,有了这个钩子,您可以更改使用Drupal呈现的所有表单。不仅是提交处理程序,还有添加/删除字段、添加标记等。在我们的示例changemyform中,用模块的实际名称替换mymodule。接下来,您需要将其范围缩小到只影响所需的形式:

    函数更改myform\u form\u alter(&$form,&$form\u state,$form\u id){
    如果($form\u id=='my\u desired\u webform\u form\u id'){
    $form['#submit'][='changemyform_submit_handler';
    }
    }
    
    请注意,我现在将
    mymodule
    替换为
    changemyform
    。您还可以看到,我已经向表单的submit属性添加了一个自定义处理程序。您必须将这个处理程序作为一个函数来编写,然后它将包含您想要的所有逻辑。因此,总的
    模块
    文件现在变为(减去
    标记):

    函数更改myform\u form\u alter(&$form,&$form\u state,$form\u id){
    如果($form\u id=='my\u desired\u webform\u form\u id'){
    $form['#submit'][='changemyform_submit_handler';
    }
    }
    函数changemyform\u submit\u处理程序($form,&$form\u state){
    …您的提交逻辑。。。
    }
    
    现在,您已经准备好编写在提交时捕获数据所需的所有逻辑,并可以随心所欲了

    由于这是一个模块,您当然应该在administration modules overview(管理模块概述)屏幕中启用它,以使其正常工作

    另外(作为挑剔),在编写自己的模块时,一定要用文档标题来修饰每个函数,这些标题描述每个函数的功能以及每个参数可以包含的内容。即使是很小很琐碎的函数。

    最好的方法就是使用

    例如:

    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();
    }
    

    在Drupal 8中,引用实体的最佳方式是插入钩子-

    在模块文件夹的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();
        }
    }
    

    谢谢Timusan的详细解释。。它帮助我解决了这个问题。@RahulM不客气。如果答案对你有帮助,不要忘记接受它。当问题是关于Drupal7时,添加这个Drupal8代码的目的是什么?