2011-04-06 79 views
0

Drupal 7. Webforms 3.x.在webform提交的值上使用Hook_form_alter

我想修改提交時的webform組件值。我製作了一個名爲'mos'的自定義模塊,並將此代碼添加到它。

function mos_form_alter(&$form, $form_state, $form_id) { 
    if ($form_id == 'webform_client_form_43') { 
     dsm($form['#node']->{'webform'}['components']['1']); 
     $form['#submit'][] = 'mos_contact_us_submit'; 
    } 
} 
function mos_contact_us_submit($form, &$form_state) { 
    $form['#node']->{'webform'}['components']['1'] = '[email protected]'; 
} 

但是,當我看數據庫中的結果時,常規的,未覆蓋的值被存儲。你能幫助讓我知道我做錯了什麼嗎?

最後我想根據提供的內容獲取輸入值並輸出一個電子郵件地址(例如,24轉成[email protected])但我想我可以自己弄清這部分。

回答

3

您應該首先提交您的提交。

array_unshift(
     $form['actions']['submit']['#submit'], 
     'mos_contact_us_submit' 
); 

但是,如果你想改變form_state中的一些變量,你應該使用自定義_valadate函數。

+0

custom_validate是否引用了[Webform Validation Module](http://drupal.org/project/webform_validation)或drupal/webform標準中的其他函數?感謝您的回覆,我會看到我在array_unshift中獲得的位置。 – 2011-04-06 16:15:22

+0

嗨@dobeerman,array_unshift給了我這個錯誤。 _Warning:array_unshift()預計參數1是陣列,在mos_form_alter空給出()(行... module_ 新代碼 '函數mos_form_alter(&$形式,&$ form_state,$ form_id){ 如果24 ( 'webform_client_form_43' == $ form_id){ \t \t array_unshift( \t \t $形式[ '動作'] [ '提交'] [ '#提交'], \t \t 'mos_check_email' \t); } } 函數mos_check_email(&$ form,&$ form_state,$ form _id){' – 2011-04-06 17:26:05

+0

$ form ['actions'] ['submit'] ['#submit'] = array('mos_contact_us_submit'); – dobeerman 2011-04-06 20:00:24

0

我明白了! BIG感謝@dobeerman指引我朝着正確的方向發展。這裏是結束了工作代碼:

function mos_form_alter(&$form, &$form_state, $form_id) { 
    if ('webform_client_form_43' == $form_id) { 
    //dsm($form); 
    $form['#validate'][] = 'mos_check_email'; 
    } 
} 

function mos_check_email(&$form, &$form_state, $form_id) { 
    $emailVal = $form_state['values']['submitted']['to']; 
    switch($emailVal) { 
     case 1: $emailVal = '[email protected]'; break; 
     case 2: $emailVal = '[email protected]'; break; 
     case 3: $emailVal = '[email protected]'; break; 
       ...... 
    } 
    $form_state['values']['submitted']['to']=$emailVal; 
    //dpm($form_state); 
} 

這樣我可以保持電子郵件地址私有,但仍然傳遞變量與_GET形式。一種奇怪的情況......但我們正試圖保持一些現有的代碼完好無損,所以它似乎是最好的路線。

我意外地搞砸了我的帳戶創建,所以我不能給你信用dobeerman,但我發送了管理員的電子郵件,希望我會得到它理順給你一些代表!

+0

現在他們合併了。 – Dori 2011-04-06 22:02:52

+0

我不知道爲什麼,但是當我改變$ form_state中的值時,在出現錯誤時它們在表單中沒有改變 – Nealv 2012-03-18 22:48:50

+0

很難說,沒有看到代碼。但我的第一個猜測是你的自定義驗證函數永遠不會運行。在上面的示例中,我將函數添加到驗證數組中,這意味着它在驗證完成後運行。如果以前的某個驗證功能沒有完成(錯誤),我認爲後面的驗證功能甚至不會執行。 – 2012-03-19 17:57:29