ajax - 为什么这个通过 ajax 上传的 webform 文件在 Drupal 7 中抛出错误?

标签 ajax drupal-7 url-redirection form-api

我有一个 webformmymodule 来改变它。网络表单有一个字段 stelle,它根据 url 查询 被填充。例如,如果 ?stelle=10 该字段由 nid 10 的节点 的标题填充。如果查询 ?stelle 不存在或后跟不存在的 nid(不是特定内容类型)或不包含特定字符串,则表单将重定向到 mynode?stelle=initiativ。该表单有 2 个字段可以通过 ajax 上传文件,到目前为止效果很好。这是我的代码:

<?php

/**
 * Altering the form! this will add class to the file upload/ remove buttons
 */
function mymodule_form_alter(&$form, &$form_state, $form_id) {
    $conf = mymodule_defaults();

    if ($form_id == 'webform_client_form_' . $conf['nid']) {
        if (isset($form['submitted']['field1'])) {
            $form['submitted']['field1']['#process'] = array('mymodule_my_file_element_process');
        }

        if (isset($form['submitted']['field2'])) {
            $form['submitted']['field2']['#process'] = array('mymodule_my_file_element_process');
        }

        $nid = $form['#node']->nid;
        $form['actions']['submit']['#ajax'] = array(
            'callback' => 'mymodule_webform_js_submit',
            'wrapper' => 'webform-client-form-' . $nid,
            'method' => 'replace',
            'effect' => 'fade',
        );

        $redirect_form = false;
        $maintenance = false;

        if (isset($form['submitted']['stelle']['#default_value']) && $form['submitted']['stelle']['#default_value'] !== '') {
            $hide_components = array(
                'einleitung_standard',
                'einleitung_initiativ',
            );
            $unhide_components = array();

            if ($form['submitted']['stelle']['#default_value'] == '') {
                $redirect_form = true;
            }
            elseif (is_numeric($form['submitted']['stelle']['#default_value'])) {
                $nid = $form['submitted']['stelle']['#default_value'];
                $node = node_load($nid);

                if ($node === false || (isset($node->type) && $node->type !== 'job')) {
                    $redirect_form = true;
                }
                else {
                    $type = $node->type;
                    if ($type == 'job') {
                        $form['submitted']['stelle']['#default_value'] = $node->title;
                        $form['submitted']['stelle']['#attributes']['disabled'] = 'disabled';
                        $form['submitted']['related']['#value'] = $nid;

                        $unhide_components = array(
                            'einleitung_standard'
                        );
                    }
                }
            }
            elseif ($form['submitted']['stelle']['#default_value'] == 'initiativ') {
                // unset($form['submitted']['stelle']);
                $form['submitted']['related']['#value'] = 'initiativ';
                $unhide_components = array(
                    'einleitung_initiativ'
                );
            }
        }
        else {
            // $redirect_form = true;
            // this causes an error

        }

这是奇怪的部分:

        $redirect_form = false;
        $maintenance = false;

        if (isset($form['submitted']['stelle']['#default_value']) && $form['submitted']['stelle']['#default_value'] !== '') {
        ...
        else {
            // $redirect_form = true;
            // this causes an error

        }

当 if 条件为 false 时,当我激活该行以重定向表单时,通过 ajax 上传文件的按钮会在单击时抛出错误警报(错误请参见底部)。 对我来说,这看起来像是在单击文件上传按钮时再次调用 form alter hook 而我的字段 stelle 不可用 - 是吗?如何解决这个问题?

现在模块的其余部分,基本上只是改变:

        else {
            // $redirect_form = true;
            // this causes an error

        }

        foreach ($unhide_components as $key => $component) {
            if (is_array($component)) {
                foreach ($component as $_key => $_component) {
                    $index = array_search($_component, $hide_components[$key]);
                    if ($index !== false) {
                        unset($hide_components[$key][$index]);
                    }
                }
            }
            else {
                $index = array_search($component, $hide_components);
                if ($index !== false) {
                    unset($hide_components[$index]);
                }   
            }
        }

        // hide
        foreach ($hide_components as $k=>$hc1){
            if (is_array($hc1)) {
                foreach ($hc1 as $hc2) unset($form['submitted'][$k][$hc2]);
            } else {
                unset($form['submitted'][$hc1]);
            }
        }


        if ($redirect_form) drupal_goto('node/'.$conf['nid'], array('query'=>array('stelle'=>'initiativ')), 301);
    }
}

function mymodule_my_file_element_process($element, &$form_state, $form) {
    $element = file_managed_file_process($element, $form_state, $form);
    $element['upload_button']['#attributes'] = array('class' => array('button'));
    $prefix = '<label class="browse-slave">';
    $prefix .= '<span class="button">' . t('Choose a file') . '</span>';
    $element['upload']['#prefix'] = $prefix;
    $element['upload_button']['#prefix'] = '</label>';


    $element['remove_button']['#attributes'] = array('class' => array('button'));
    $element['remove_button']['#prefix'] = '</label>';

    return $element;
}

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;
  }
}

The AJAX error is something like described here.更改服务器/php 设置没有帮助。

谢谢!

最佳答案

表单生成器(和任何钩子(Hook)改变)将在验证表单时运行,这发生在 #ajax 操作上。

我喜欢将静态自定义数据放入 $form['#someProperty'] 中,以便在构建、验证和提交函数中可用。像这样的东西应该可以帮助你:

function mymodule_form_alter(&$form, &$form_state, $form_id) {
  // ...
  if (isset($_GET['stelle'])) {
    $form['#stelle'] = $_GET['stelle']; // This will always be there.
  } 
  // ...
}

另一种选择是抛出您在表单中加载的 $node,例如 $form['#stelle_node'] = node_load(...) 和显然在 nid 对您实际可用时执行此操作,这样您就不会在将来再次运行表单构建器时用空数据覆盖它。

关于ajax - 为什么这个通过 ajax 上传的 webform 文件在 Drupal 7 中抛出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20346008/

相关文章:

在另一个 JS 完成后加载 Javascript CSS

javascript - 如何从 php 中检索 json 数据

javascript - 如何使用 jquery ajax 和 php 上传文件(无需单击任何提交按钮)

php - drupal的cron中的计划任务执行问题

html - Amazon s3 文件上传到存储桶成功后不重定向

grails - 参数 'id'是Grails重定向中的查询字符串

redirect - 301 重定向最佳实践 - 多个站点到单个站点

ajax - 最前沿的最佳 SEO 实践的最佳多语言 Wordpress 解决方案

javascript - 从我的 Drupal 站点上的自定义 PHP 文件调用模块之一中的函数

paypal - Drupal 7/PayPal 快速结账 : How to set delivery options based on address