2010-09-16 2 views
1

У меня есть трехэтапная форма, где каждый шаг отправляется на свое собственное действие. Действие перенаправляется на следующий шаг. Данные хранятся в области сеанса. У меня есть фильтр, который запрещает пользователю получать доступ к обработчикам формы через что-либо, кроме почтового запроса.Каковы некоторые лучшие практики для многоступенчатых форм в Coldfusion?

Однако ничто не мешает кому-либо вручную вводить текст в адресе шага. Чтобы справиться с этой проблемой, я устанавливаю в текущей переменной currentStep.

<!--- Some data is processed here ---> 
<cfset session.currentStep = "stepTwo"> 

А на втором этапе я хотел бы проверить на structkey:

<cfif NOT session.currentStep = "stepTwo"> 
<!--- redirect to #session.currentStep# ---> 

Этот подход работает, но имеет существенный недостаток: пользователь не может нажать кнопку возврата в окне браузера, или редактировать любые данные, которые он или она уже ввели.

Каковы наилучшие методы реализации многоступенчатой ​​формы? Могу ли я улучшить свой процесс, чтобы включить функциональные возможности кнопок?

+0

использование JS: http://www.coldfusionjedi.com/index.cfm/2010/5/27/Turning-a-form-into-a-multistep-process-with-jQuery, к счастью, этот не поддерживает Назад, но вы можете добавить его. – Henry

+0

Генри, я думал об этом, но я думаю, что это усложняет ситуацию. Тогда выполнение проверки на стороне сервера становится проблемой. Например, как вы указываете пользователю верный шаг? – Mohamad

ответ

2

Вместо использования переменной сеанса, чтобы разрешить им доступ к текущему шагу, разрешить им доступ к текущим или предыдущим шагам. Выберите флаг «как далеко вы можете пойти».

Теперь добавьте ссылки на предыдущие шаги, например, тротуар.

Наконец, используйте поиск в постоянном хранилище (db, session, xml, bag of hold и т. Д.) Для данных, уже введенных для этой формы. Создайте пустой набор данных формы, перепишите его на что-нибудь, найденное в постоянном хранилище, а затем перепишите его с помощью чего-либо из области формы. Что-то вроде:

populate = structNew(); // this is the data to populate your form with on load 
populate.someValue = ""; 
structappend(populate, dataFromStorage); 
structappend(populate, form); // from things submitted from the form scope, in case validation fails 
<input type="text" name="someValue" value="#variables.populate.someValue"> 

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

2

Вы можете оставаться в режиме сеанса, если хотите.

Чтобы решить свой главный недостаток, вы можете немного изменить свою логику.

На последнем шаге убедитесь, что данные всех шагов найдены в сеансе. Если нет, перенаправите пользователя на первый незаполненный шаг? Не должно быть слишком сложно.