Есть форма, вот код конструктора
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)?
Ответы
Оказалось, что дело было в jQuery версии 1.8, использую сейчас 1.10 и всё работает, как и планировалось.
Возможно, кому-то это поможет (:
Почему не используете обычный #ajax['callback']?
Как подружить ajax формы с валидацией писал у себя - http://xandeadx.ru/blog/drupal/822
привык задавать callback в hook_menu, ajax['callback'] попробовал, такой же расклад: не возвращается во wrapper форма.