Странно, проблема вроде бы типовая, но почему-то решения нигде нет.
Пользователь решает тест. Каждый вопрос выводится на новой странице. Под вопросом есть форма с текстбоксом "введите ответ" и тремя кнопками "назад", "отправить" и "вперед". На всех страницах кроме первого вопроса и последнего нужны все эти четыре поля (может с терминологией что-то путаю, но я называю все это вместе формой, а каждый элемент полем). Когда пользователь переходит на первый вопрос, не должно быть кнопки "назад", а когда на последний, соответственно "вперед". Вопрос - как реализовать подобное?
Была идея сделать что-то вроде такого:
<?php
function my_form($var) {
if (
$var = 1) {
$form['nazad'] = array(
'#type' => 'submit',
'#value' => 'назад',
);
}
if ($var = 2) {
$form['vpered'] = array(
'#type' => 'submit',
'#value' => 'вперед',
);
}
$form['otvet'] = array(
'#title' => 'Введите ответ',
'#type' => 'textfield',
);
$form['otpravit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
return
$form;
}
?>
А потом во время рендеринга формы задавать нужное мне значение $var, что-то вроде:
<?php
if (страница является первой) {
$var = 2
}
?>
Но, что-то не получилось. Может быть в function my_form($var) нельзя ничего передавать.
Можно конечно сделать несколько форм, для каждой кнопки свою, но это уже крайний вариант, хотелось бы более правильного и изящного решения. Что скажете?
p.s. webform не предлагать
Комментарии
http://xandeadx.ru/blog/drupal/892
В https://www.drupal.org/project/field_group есть Multipage steps + для ajax https://www.drupal.org/project/field_group_ajaxified_multipage
Olegars, интересная штука, но мне нужно чтобы каждое конкретное задание было на отдельной странице, а там, как я понял, используется технология AJAX.
Я думал есть какое-то простое решение, без использования сторонних модулей. Вот такая идея у меня появилась. В функцию, вызывающую форму пишем все как обычно, без всяких переменных и условий:
<?php
function my_form() {
$form['nazad'] = array(
'#type' => 'submit',
'#value' => 'назад',
);
}
$form['vpered'] = array(
'#type' => 'submit',
'#value' => 'вперед',
);
$form['otvet'] = array(
'#title' => 'Введите ответ',
'#type' => 'textfield',
);
$form['otpravit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
return
$form;}
?>
Когда вызываем эту функцию, из массива формы удаляем ненужные при необходимости:
<?php
if (страница является первой) {
$a = drupal_get_form('formexample_nameform');
unset($a['nazad']); //удаляем из массива формы поле nazad
}
?>
Потом рендерим все это
return drupal_render ($a);
В принципе все работает, я только не уверен, что не получу каких-нибудь неожиданных проблем потом. Что скажете? Понятно что код кривой, но в принципе можно так делать, не будет каких-нибудь проблем потом?
Пример реализации мультистеповой формы http://drupal.org/project/examples
Делать надо через $form_state