3

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

<?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 上传文件的按钮会在单击时引发错误警报(有关错误,请参见底部)。对我来说,这看起来像在没有我的字段可用的情况下单击文件上传按钮时再次调用表单更改挂钩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;
  }
}

AJAX 错误类似于此处所述。更改服务器/php 设置并没有帮助。

谢谢!

4

2 回答 2

1

表单构建器(以及任何钩子更改)将在表单被验证时运行,这发生在#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 时才这样做,这样您就不会在表单构建器将来再次运行时用空数据覆盖它。

于 2013-12-12T03:45:48.050 回答
0

当我在 drupal 6 中使用 ajax 时,url 或请求中的哈希符号每次都会导致错误.....所以我用这个替换了 url

         data.url.replace(/%2523/, '%23');        
于 2013-12-12T10:40:57.517 回答