2014-10-03 18 views
3

我是Drupal(7)的新手,因此需要一些帮助以下情况。如何以及在哪里写Webform提交钩子?

我已经创建了一个网络表单(我有其他的网页表单太)和现在,而不是在默认webform_submitted_data表中插入,我想这webfrom插入到mytable的。从我发现的,我需要为此写一个钩子。事实上,我正在为编写这个钩子而感到困惑。我有以下问题。

  1. 在哪里写这个钩子(在哪个文件中)。
  2. 如何仅为一个Web窗体编写此钩子。

请帮助,让我知道,如果你需要的任何信息。

回答

7

首先,非常肯定你开始扭Drupal的胳膊成使事情不同的工作,然后他们应该之前。对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文件本身。截取任何形式的提交(包括网上表格)一般挂钩是:

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'; 
    } 
} 

请注意,我现在changemyform取代mymodule。正如你还可以看到我已经添加了一个自定义处理程序的窗体的提交属性。你将不得不编写这个处理程序作为一个函数,然后将包含您所需的所有逻辑。因此,总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 ... 
} 

现在您就可以写你需要捕获的数据提交,并请你做的所有的逻辑。

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

在编写自己的模块时,还要使用文档标题来修饰每个函数,这些文档标题描述了每个函数的作用以及每个参数可以容纳的内容。即使是微小的琐碎功能。

+0

谢谢Timusan为您详细的解释。它帮我解决这个问题。 – 2014-10-03 12:02:01

+0

@RahulM不客气。如果它帮助你,请不要忘记接受答案。 – Timusan 2014-10-03 12:04:57

0

最好的办法是使用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(); 
} 
相关问题