【问题标题】:Using Hook_form_alter on webform submitted values在 webform 提交的值上使用 Hook_form_alter
【发布时间】:2011-04-06 00:19:39
【问题描述】:

Drupal 7. 网络表单 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)但我想我可以自己弄清楚这部分。

【问题讨论】:

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


    【解决方案1】:

    您应该先提交。

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

    但是,如果你想改变form_state中的一些变量,你应该使用自定义的_valadate函数。

    【讨论】:

    • custom_validate 是指 Webform Validation Module 还是 drupal/webform 标准中的其他函数?感谢您的回复,我会看看我在哪里可以使用 array_unshift。
    • 嗨@dobeerman,array_unshift 给了我这个错误。 警告:array_unshift() 期望参数 1 为数组,在 mos_form_alter() 中给出 null(...module 的第 24 行 新代码 function mos_form_alter(&$form, &$form_state, $form_id) { if ('webform_client_form_43' == $form_id) { array_unshift( $form['actions']['submit']['#submit'], 'mos_check_email' ); } } function mos_check_email(&$form, &$form_state, $form_id) {
    • $form['actions']['submit']['#submit'] = array('mos_contact_us_submit');
    • 这应该是 $form[#submit] 而不是 $form['actions']['submit']['#submit']
    【解决方案2】:

    我明白了!非常感谢@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 的功劳,但我给管理员发了电子邮件,希望我能把它理顺,让你得到一些代表!

    【讨论】:

    • 不知道为什么,但是当我在$form_state中更改值时,在出现错误时它们并没有在表单中更改
    • 不看代码很难说。但我的第一个猜测是您的自定义验证功能永远不会运行。在上面的示例中,我将函数添加到验证数组中,这意味着它在任何验证到位后运行。如果前面的验证函数之一没有完成(错误),我不相信后面的验证函数甚至不会执行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多