Самый простой способ сделать это - использовать $ form_state. В вашем методе formBuild () у вас есть if / else или переключатель, основанный на чем-то подобном, $form_state['step']
и отображающий различные элементы формы. Затем у вас будет то же самое в обратном вызове отправки или несколько обратных вызовов отправки, которые что-то делают с объектом в $ form_state, который вы строите, измените шаг и установите $form_state['rebuild']
флаг в значение ИСТИНА.
У этого подхода есть несколько недостатков, поэтому (среди прочих причин) был создан мастер форм ctools. Это может усложниться, если у вас есть несколько шагов и вам нужно определить все это в одной функции / классе формы, и все происходит в запросах POST.
Мастер форм ctools выполняет группирование нескольких отдельных форм и управление навигацией от одной к другой. Вы также используете кеш объекта ctools для хранения вашего объекта вместо $ form_state, потому что он больше не распределяется между вашими формами.
Несмотря на то , что система еще не существует, CTools объект кэша был перенесен на 8.x и теперь называется пользователем tempstore, доступны в качестве услуги: \Drupal::service('user.private_tempstore')
(до 8,0-beta8 называется user.tempstore
). Это слой поверх хранимого значения ключа хранилища, который представляет владение хранящимися в нем данными. Так что это то, что поддерживает известное сообщение в представлениях, что другой пользователь в настоящее время редактирует это представление, и по этой причине оно заблокировано. Еще одним преимуществом использования $ _SESSION для этого является то, что ваши данные должны загружаться только при необходимости, когда вы редактируете 3 представления, тогда использование $ _SESSION будет означать, что вам придется загружать и переносить их при каждом запросе страницы.
Если вам это не нужно, то вы можете рассчитывать на сеанс или также напрямую помещать его в хранилище значений ключей с истекающим сроком действия (здесь также хранится $ form_state, а не псевдокэш, как это было в 7.x).
Однако система конфигурации не очень подходит. Это не предназначено для пользовательского контента (или контента вообще), так как он не масштабируется для хранения тысяч или десятков тысяч записей и может делать некоторые предположения для предварительной загрузки всего, что может понадобиться для данного запроса страницы ( пока нет, но есть проблема, чтобы это произошло)
Обычно вы можете хранить значения форм между шагами, используя кеш объектов cTools (аналогично многоступенчатым формам в Drupal 7 ) или через
$form_state
(согласно этому уроку ).В Drupal 8 вы можете наследовать
FormBase
класс для создания нового многошагового класса.В статье Как создавать многошаговые формы в Drupal 8 вы можете найти простой способ создания многошаговой формы в Drupal 8.
Прежде всего, вам нужно создать базовый класс, который будет отвечать за внедрение необходимых зависимостей.
Вот демонстрационный код (для
MultistepFormBase.php
файла):Затем вы можете создать реальный класс форм внутри файла с именем
MultistepOneForm.php
:И обновите файл маршрутизации в демонстрационном модуле (
demo.routing.yml
):Наконец, создайте вторую форму (
MultistepTwoForm
):источник
Упомянутый вами многошаговый мастер уже интегрирован с CTools, см .: Поддержка мастера для 8.x-3.x , так что вы можете рассмотреть возможность его расширения
your_module.services.yml
, например:затем расширить класс в
src/Controller/MyWizardForm.php
:источник
Tests/Wizard/CToolsWizard*
файлах, где можно найти некоторые тесты (напримерtestWizardSteps
).