Вы здесь

Как показать результат отправки формы в модальном окне?

0

Добрый день, уважаемые коллеги. Имеется свой модуль, в нем несложная форма из нескольких полей. Вопрос: Как с помощью Ajax правильно сохранить данные и вывести результат в модальное окно?
Пробовал решить проблему с помощью CTools, но либо получается сохранить данные, либо вывести модальное окно, вместе не получается подружить. Скорее всего, как-то неправильно передаю аргументы, но как правильно - непонятно.

function mymodule_menu()
{
    $items['test'] = array(
      'title' => 'Ajax Test',
      'page callback' => 'mymodule_test_main_form',
      'access arguments' => array('access content'),
        'weight' => 4,
    );
    $items['test/%ctools_js'] = array(
    'page callback' => 'mymodule_test_modal_callback2',
    'page arguments' => array(1),
    'access arguments' => TRUE,
    'weight' => 5,
  );

    return $items;
}
...
function mymodule_test_main_form() {
  // Load the modal library and add the modal javascript.
 //Загружаем необходимые подмодули .
  ctools_include('ajax');
  ctools_include('modal');
  ctools_modal_add_js();
//Делаем ссылку аякс ,для рабочего варианта нужен обязательный класс ctools-use-modal
  //$output = l('Load modal content', 'test/nojs', array('attributes' => array('class' => 'ctools-use-modal')));
   $form['title'] = array(
        '#type' => 'textfield',
        '#title' => t('Title:'),
        '#description' => t('Enter a title, please'),
        '#required' => TRUE,
      );

    $form['body'] = array(
        '#type' => 'textarea',
        '#title' => t('Body:'),
        '#size' => 4,
        '#description' => t('Enter a bode, please'),
        '#required' => TRUE,
    );
    $form['mail'] = array(
        '#type' => 'textfield',
        '#title' => t('Mail:'),
        '#description' => t('Enter a mail, please'),
        '#required' => TRUE,
      );
    $form['box'] = array(
        '#type' => 'markup',
        '#prefix' => '<div id="box">',
        '#suffix' => '</div>',
        '#markup' => '<h1>Initial markup for box</h1>',
      );
    $form['submit'] = array(
        '#type' => 'submit',
        '#ajax' => array(
          'callback' => 'mymodule_submit_driven_callback2',
          //'wrapper' => 'box',
        ),
        '#value' => t('Submit'),
      );
    return $form;
  //return $output;
}

function mymodule_test_modal_callback2($form, $form_state, $js = FALSE) {
$output = l('Load modal content', 'test/nojs', array('attributes' => array('class' => 'ctools-use-modal')));
    //1. Save to own table
    $q = db_insert('mymodule_test'); 
    $q->fields(array('title' => $form_state['values']['title'],'body' => $form_state['values']['body'], 'mail' => $form_state['values']['mail']));
    $res = $q->execute();
    //2. Try to use modal window
    if ($js) {
        ctools_include('ajax');
        ctools_include('modal');
        ctools_modal_render('Success', 'Insertion complited');
      }
  else {
       drupal_set_title($title);
       return $output;
      }
}

Что я делаю не так и как правильнее сделать?

Версия Drupal: 
7.x
Категория: 
AJAXForm API
Связанные проекты: 
Chaos tool suite (ctools)
Вопрос задан 21.03.2016 - 11:18

Ответы

1

http://xandeadx.ru/blog/drupal/490

Замените button на submit, а добавьте submit callback

Ответ дан 21.03.2016 - 11:45
Аватар пользователя xandeadx
xandeadx
1542

Отличное решение, мне помогло, но теперь не работает валидация: сообщение о ошибке приходят только после перезагрузки страницы. Можно ли как-то сохранить валидацию?

Комментарий оставлен 21.03.2016 - 13:43

Вот, все работает. Ещё раз спасибо!

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