Вы здесь

Как осуществить интерактивный process bar в multistep form

0

Добрый день, коллеги!

Столкнулся с задачей, есть многошаговая форма

function test_menu() {
    $items = array();
    $items['test'] = array(
        'title' => 'title',
        'page callback' => 'drupal_get_form',
        'page arguments' => array('test_form'),
        'access callback' => TRUE,
    );
    return $items;
}

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

    if ($step < 5) {
        $form['actions']['next'] = array(
            '#type' => 'submit',
            '#value' => 'Следующий шаг',
            '#ajax' => array(
                'wrapper' => 'wr',
                'callback' => 'test_form_ajax_callback',
            ),
        );
    }

    if ($step > 1 && $step < 6 ) {
        $form['actions']['prev'] = array(
            '#type' => 'submit',
            '#value' => 'Предыдущий шаг',
            '#limit_validation_errors' => array(),
            '#submit' => array('test_form_submit'),
            '#ajax' => array(
                'wrapper' => 'wr',
                'callback' => 'test_form_ajax_callback',
            ),
        );
    }

    return $form;

но никак не вдупляю как подступиться к написанию интерактивных шагов, какой должен быть принцип? Поделитесь опытом, пожалуйста.

Версия Drupal: 
7.x
Категория: 
Form API
Вопрос задан 14.08.2016 - 12:47
Аватар пользователя im
im
32

например, есть 5ть шагов форме, я могу откатываться на любой из шагов(уже заполненных) кликая по соответствующей кнопке.

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

в submit callback устанавливайте номер шага, в чём сложность?

Комментарий оставлен 14.08.2016 - 15:39

у меня два callback, первый основной, который работает на отправку каждой формы, воторой для интерактивных шагов, и оба callback'a по разному себя ведут в одних и тех же условиях, например:

~~~php
$current_step = 'step' . $form_state['storage']['step'];
drupal_set_message("recovery " . $current_step);

~~~

основной callback выведет предыдущий шаг при сабмите, что позволят в хранилище поместить новые значения, а второй callback дает шаг на который мы перешли и данные соответственно теряются, в это и проблема

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

Ответы