2014-10-03 48 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(); 
} 
相關問題