Drupal 7 如何以及在何处编写WebFormSubmitHook?
我是Drupal(7)的新手,因此在以下情况下需要一些帮助 我已经创建了一个Webform(我还有其他Webform),现在我不想在默认Webform_submitted_数据表中插入,而是希望将此webfrom插入myTable。根据我的发现,我需要为这个写一个钩子。实际上,我对写这个钩子的方法感到困惑。我有以下问题Drupal 7 如何以及在何处编写WebFormSubmitHook?,drupal-7,hook,drupal-webform,Drupal 7,Hook,Drupal Webform,我是Drupal(7)的新手,因此在以下情况下需要一些帮助 我已经创建了一个Webform(我还有其他Webform),现在我不想在默认Webform_submitted_数据表中插入,而是希望将此webfrom插入myTable。根据我的发现,我需要为这个写一个钩子。实际上,我对写这个钩子的方法感到困惑。我有以下问题 在何处写入此钩子(在哪个文件中) 如何只为一个webform编写此钩子 如果您需要更多信息,请帮助并告诉我。首先,在您开始扭转Drupal的手臂使事情以不同于预期的方式工作之前,
如果您需要更多信息,请帮助并告诉我。首先,在您开始扭转Drupal的手臂使事情以不同于预期的方式工作之前,请务必确保。为Webform重新路由数据可能会给Webform的工作方式带来潜在的问题,这可能会影响您以后的工作。它可能仍然希望数据保存在它自己的簿记表中,但如果您覆盖它的行为,它将无法在那里找到它 也就是说,如果您希望改变其他模块(如Webform)的行为,则必须编写自己的微型模块。其中一些钩子也可以通过模板层(使用您的模板
template.php
文件)受到影响,但在我看来,这是改变这种行为的错误地方
Drupal 7模块基本上由至少两个文件组成,一个*.info
文件和一个*.module
文件。前者包含Drupal对模块进行分类和计算可能的依赖关系所必需的一些元数据。后者包含实际的PHP代码
这些文件必须保存在与您命名的info
和module
文件同名的目录中(最好)。为了让Drupal找到您的模块,您可以将其放在sites/all/modules
下
例如,如果将模块命名为changemyform,则以下是所需的最少文件:
- changemyform.info
- changemyform.module
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代码的目的是什么?