如何在Drupal 7中取消Webform提交?


8

我尝试使用hook_form_alter()hook_node_view()在自定义模块中更改Webform呈现,以便在某处添加“ #ajax”。

有人在D6或D7上使用Webform和Ajax已有经验吗?我猜对于D6和D7来说逻辑是一样的,只是实现有所改变。


1
D6和D7具有非常不同的Ajax框架。
杰里米·法兰西

是的,他们这样做,但这不是问题。我遇到的真正问题是我找不到钩子来更改Webform表单并通过Drupal表单API添加ajax事件。
E. de Saint Chamas

您有关于Ajax的特定问题吗?这听起来像是对话。另外,仅供参考:api.drupal.org/api/drupal/includes--ajax.inc/group/ajax/7
Citricguy 2012年

我真的不喜欢发布答案,只是带有指向“如何”博客文章的链接,而没有我自己的任何解释,因此,我将其添加为注释:envisioninteractive.com/drupal / ...-如果最终奏效,我们可以考虑将其添加为答案。看来这就是您可能需要的。
丹尼·英格兰

Answers:


8

阿贾克斯模块对我的作品在Drupal 6。

对于Drupal 7:

function mymodule_form_alter(&$form, &$form_state, $form_id) {
      // see if webform_client_form_ is in the form_id
      if(strstr($form_id, 'webform_client_form_')) {
        // get the nid so we can use it in the wrapper value
        $nid = $form['#node']->nid;
        // add the ajax properties to the submit button
        $form['actions']['submit']['#ajax'] = array(
          'callback' => 'mymodule_webform_js_submit',
          'wrapper' => 'webform-client-form-' . $nid,
          'method' => 'replace',
          'effect' => 'fade',
        );
      }
    }

function mymodule_webform_js_submit($form, $form_state) {
      // define the $sid variable (submission id from webform)
      $sid = $form_state['values']['details']['sid'];
      // if we have a sid then we know the form was properly submitted, otherwise, we'll just return the existing $form array
      if ($sid) {
        // first we have to load up the webform node object
        $node = node_load($form_state['values']['details']['nid']);
        // create an array up with the confirmation message, retreived from the webform node
        $confirmation = array(
          '#type' => 'markup',
          '#markup' => check_markup($node->webform['confirmation'], $node->webform['confirmation_format'], '', TRUE),
        );
        // return the confirmation message
        return $confirmation;
      }
      else {
        // return the form
        return $form;
      }
    }

这段代码到底应该做什么?我将其添加到主题中(更改了挂钩的名称以匹配主题后),但没有发现任何影响。
John Slegers 2014年

它进入主题中的自定义模块。
neelmeg

0

如果您只想对特定表单进行ajaxify,最简便的方法之一就是添加jquery表单插件。它非常简单。

将以下代码添加到template.php文件中的页面预处理功能。

  1. 首先使用以下代码添加jquery插件。

    drupal_add_js(drupal_get_path('theme','your_theme')。“ /js/jquery.form.js”);

  2. 然后添加以下代码,替换#your_form_ID为您的表单ID

    drupal_add_js('

                (function($){ 
    $(document).ready(function() { 
    
                $("#your_form_ID").ajaxForm(function() { 
                    alert("Thank you for your comment!"); 
                }); 
    });     }(jQuery));;
    
           ', 'inline');

这就是您要做的全部。也许您想考虑只加载所需页面的脚本。


我一直在考虑。现在,我正在考虑将其配置为带有配置页面的模块,以便所有人都能受益。有没有类似的东西?
esafwan 2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.