在webform提交的值上使用Hook_form_alter

时间:2011-04-06 00:19:39

标签: php drupal drupal-7 drupal-webform hook-form-alter

Drupal 7. Webforms 3.x。

我正在尝试修改提交时的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'] = 'working@mos.com';
}

但是,当我查看数据库中的结果时,会存储常规的,未覆盖的值。你能帮我告诉我我做错了吗?

最终我想取输入值并根据提供的内容输出一个电子邮件地址(例如.24转到bob@somewhere.com)但我想我可以自己解决这个问题。

2 个答案:

答案 0 :(得分:3)

您应该先提交提交。

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

但是,如果要更改form_state中的某些变量,则应使用自定义_valadate函数。

答案 1 :(得分:0)

我明白了!感谢@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@test.com'; break;
        case 2: $emailVal = 'email2@test.com'; break;
        case 3: $emailVal = 'email3@test.com'; break;
                ......
    }
    $form_state['values']['submitted']['to']=$emailVal;
    //dpm($form_state);
}

这样我可以将电子邮件地址保密,但仍然使用_GET将变量传递给表单。有点奇怪的情况......但是我们试图保留一些现有的代码,所以它似乎是最好的路线。

我不小心搞砸了我的帐户创建,所以我不能给你信用dobeerman但是我给管理员发了电子邮件,希望我能把它弄清楚,让你得到一些代表!