Вы здесь

Возврат статусных сообщений из AJAX callback в диалоговое окно

0

Есть форма, вот код конструктора

function dn_auth_form($form, &$form_state) {
    $form['messages'] = array(
        '#markup' => '<div class="abc"></div>',
    ); 
    $form['email'] = array(
        '#title' => 'E-mail',
        '#type' => 'textfield',

    );
    $form['actions'] = array(
        '#type' => 'actions',
    );
    $form['actions']['submit'] = array(
        '#type' => 'submit',
        '#value' => 'Отправить',
        '#weight' => 100,
        '#ajax' => array(
            'path' => 'dncb', 
            'progress' => array('type' => 'throbber'),
            'effect' => 'fade',
    ),      
    );
    return $form;    
}

$form['messages'] служит в качестве блока, в который callback запишет то, что вернёт.
на submit прицепляю AJAX согласно Form API

далее прописываю хук меню

function dn_auth_menu() {
    $items = array();
    $items['dncb'] = array(
        'page callback' => 'dn_auth_callback',
        'access callback' => TRUE,
        'type' => MENU_CALLBACK,
        'delivery callback' => 'ajax_deliver',
        'theme callback' => 'ajax_base_page_theme',
    );
    return $items;
}

callback

function dn_auth_callback() {
    list($form, $form_state) = ajax_get_form();
    drupal_process_form($form['#form_id'], $form, $form_state);
    $commands = array();
    $commands[] = ajax_command_html('.abc', theme('status_messages'));

    return array('#type' => 'ajax', '#commands' => $commands);
}

а теперь интересное. форма у меня находится в блоке.
при выполнении определенного условия подключаю скрипт через drupal_add_js()

вот что в скрипте

(function ($) {

  Drupal.behaviors.themeName= {
    attach:function (context, settings) {

      // Здесь указываем ID блока с логином.
      var $login_block = $('#dn-auth-form');
      //if ($login_block.length > 0) {


        $login_block.dialog({
          autoOpen: false,
          title: Drupal.t('E-mail'),
          resizable: false,
          modal: true,

          // Новые эффекты.
          show: 'slide',
          hide: 'explode'
        });

        // 
        $('#dn-form-button', context).ready(function() {
          $login_block.dialog('open');
          return false;
        });

     // }
    }
  };

})(jQuery);

UI Dialog цепляю в template.php
~~~php
function dn_theme_preprocess_page(&$vars) {
drupal_add_library('system', 'ui.dialog');
drupal_add_library('system', 'effects.explode');
drupal_add_library('system', 'effects.slide');

// }
}

Юзер наблюдает диалоговое окно, когда DOM построен.

Если форма не проходит валидацию, юзер не видит текст из form_set_error(), диалоговое окно остается на экране.
Если значение валидное, при сабмите вываливается

Возникла AJAX HTTP ошибка.
Полученный код HTTP: 200
Следует отладочная информация.
Путь: /dncb
Текст Состояния: OK
Текст Ответа: Сообщение пустое

При этом указанный в сабмите формы код выполняется.

Вопрос: как правильно возвратить статусные сообщения в форму, учитывая её нахождение в диалоговом окне (UI Dialog)?

Версия Drupal: 
7.x
Категория: 
AJAXForm APIJavascript
Вопрос задан 02.03.2016 - 19:31

привык задавать callback в hook_menu, ajax['callback'] попробовал, такой же расклад: не возвращается во wrapper форма.

Комментарий оставлен 03.03.2016 - 14:17

Ответы

0

Оказалось, что дело было в jQuery версии 1.8, использую сейчас 1.10 и всё работает, как и планировалось.
Возможно, кому-то это поможет (:

Ответ дан 04.03.2016 - 17:12