Формы и jQuery UI (форма в модальном диалоге)

Главные вкладки

Аватар пользователя phantomazz phantomazz 8 апреля 2013 в 1:48

Всем привет!
Большая просьба помочь в решении такой проблемы.

У меня есть задача показать форму в popup-окне из другой формы по нажатию на кнопку. С показом я справился - в ajax-callback'е кнопки показываю с помощью jquery.ui.dialog:

<?php
function ajax_test_callback($form$form_state)
{
    
drupal_add_library('system''ui.dialog');

    

$form node_add('some_content_type');
    
$form['actions']['preview']['#access'] = false;

    

$commands = array();
    
$commands[] = ajax_command_append('body''<div id="popup" title="Test!"></div>');
    
$commands[] = ajax_command_html('#popup'render($form));
    
    
$commands[] = ajax_command_invoke('#popup''dialog', array(
        array(
'autoOpen' => false),
        array(
'width' => 'auto'),
        array(
'height' => 'auto'),
        array(
'modal' => true),
        )
    );

    

$commands[] = ajax_command_invoke('#popup''dialog', array("open"));

    return array(

'#type' => 'ajax''#commands' => $commands);
}
?>

Вот только ума не приложу, каким образом эту самую форму в popup'е засабмитить и, самое главное, в первой форме узнать, что (например, nid) засабмитилось. При нажатии на кнопку "Сохранить" происходит редирект на 'system/ajax', и ничего не сохраняется.

Буду благодарен, если кто подскажет типовые решения данной проблемы или поделится личным опытом.

Заранее спасибо!

Комментарии

Аватар пользователя ser_house ser_house 8 апреля 2013 в 13:45

В jQuery после вывода второй формы перехватываете клик на кнопке отправления и по нему отсылаете её на сервер по своему адресу (jQuery.ajax(), форматом .serialize() или .serializeArray()).

Там формируете $form_state из этих данных и делаете drupal_form_submit() (ошибки формы можно получить с помощью form_get_errors().

Затем отсюда же отправляете что надо обратно в скрипт (drupal_json_output()).

Теперь Ваш скрипт знает, что нода добавлена (или не добавлена) и её nid.

ajax_command_* конечно хорошие штуки, но в этом случае, имхо, лучше обойтись без них и сделать всё скриптом.