Почему этот загруженный файл веб-формы через ajax выдает ошибку в Drupal 7?

У меня есть веб-форма и мой модуль, который ее изменяет. В веб-форме есть поле 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 ложно, кнопка для загрузки файла через 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 не помогло.

Спасибо!


person Alex    schedule 03.12.2013    source источник


Ответы (2)


Конструктор форм (и любые изменения хуков) будут запускаться при проверке формы, что происходит при #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 действительно доступен вам, чтобы вы не перезаписали его пустыми данными, когда построитель форм снова запускается в будущем.

person Charlie Schliesser    schedule 12.12.2013
comment
Я это попробую. я удалил все перенаправления и теперь это работает, но все же мне интересно, как это исправить - person Alex; 12.12.2013

Когда я работал с ajax в drupal 6, символ решетки в URL-адресе или запросе каждый раз вызывал ошибку..... поэтому я заменил URL-адрес этим

         data.url.replace(/%2523/, '%23');        
person Sachin9    schedule 12.12.2013