我是新来的Drupal(7),因此需要下列情形一些帮助。
我已创建了一个网络表单(我有其他的网页表单太)和现在,而不是在默认webform_submitted_data表中插入,我想这webfrom插入到mytable的。从我发现,我需要为此编写一个钩子。其实我感到困惑的方式来写这个钩子。我有以下问题。
请帮助,让我知道,如果你需要的任何信息。
首先,非常肯定你开始扭Drupal的胳膊成使事情不同的工作,然后他们应该之前。转引数据一个WebForm可能提供打嗝如何Webform的作品,这以后会咬你。它可能仍然预计数据保存在自己的记账表,但未能后来在那里找到它,如果你覆盖其行为。
话虽这么说,如果你想改变其他模块,如网络表单的行为,你将不得不写自己的,微小的模块。一些挂钩也可以通过模板层(使用模板template.php
文件)的影响,但是这是错误的地方来改变这种行为在我看来。
一个Drupal 7模块基本上包括了最小的两个文件,一个*.info
文件和*.module
文件。前者包含了Drupal的分类您的模块和计算可能需要依赖一些元数据。后者包含实际的PHP代码。
这些文件都必须使用(最好)的同名保存在目录中,你命名你的info
和module
文件。为Drupal找到你的模块,你可以把它下sites/all/modules
。
如果,例如,你的名字你的模块changemyform,这些都是必需的最少的文件:
而且两者应位于:网站/所有/模块/ 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';
}
}
请注意,我现在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 ...
}
现在,您可以写你需要捕获的数据提交,并请你做的所有的逻辑。
由于这是一个模块,你当然应该,使其能够在您的管理模块概览屏幕为它的运行。
此外(作为挑剔)编写自己的模块时,做装饰,具有描述了每个功能确实每个参数可以持什么样的文件头的每个功能。即使是微小的,琐碎的功能。
最好的办法是使用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();
}
在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();
}
}