Вы хотите сделать что-то вроде волшебника? Если это именно то, что вам нужно, это означает, что вы уже знаете, сколько шагов существует, поэтому вы фактически отображаете разные формы для каждого шага мастера. Отправка номера шага с помощью get является лучшим решением. Вам все еще нужно следить за его данными. Я думаю, я бы сделал что-то вроде этого:
class Wizard {
private $fromsData;/*array with forms*/
private $steps;
private $wizards;
private $lastStep;//last completed step
private function Wizard() {
$this->lastStep = 0;
}
public static function getInstance($name) {
if(isset($_SESSION["wizards"]["name"]) && !isset(self::wizards[$name])) {
self::wizards[$name] = unserialize($_SESSION["wizards"]["name"]);
unset($_SESSION["wizards"]["name"]);
}elseif(!isset(self::wizards[$name])) {
self::wizards[$name] = new Wizard();
}
return self::wizards[$name];
}
public static function commitWizard($name) {
$_SESSION["wizards"]["name"] = serialize(self::wizards[$name]);
}
public function addData($data,$step = null){
if(is_null($step)) {
$this->steps++;
$step = $this->steps;
}
$this->formsData[$step] = $data;
$this->lastStep = $step;
return $step+1;
}
public function getSteps() {
return $this->steps;
}
public function getData($step) {
return $this->formsData[$step];
}
}
Это класс, который может помочь вам управлять данными и шагами форм. Он сохраняет данные за шаг, сериализованные в сеансе, чтобы вы могли получить их позже, а также переходить между шагами.
использование может выглядеть так:
$wizardName = "sample";
$myWizard = Wizard::getInstance($wizardName);
$step = isset($_POST["step"]) ? $_POST["step"] : null;
if(isset($_POST["data"])) {
if(myValidationFor($_POST["data"]) {
$step = $myWizard->addData($_POST["data"],$step);
} else {
$step =$myWizard->getLastStep();
}
}
if(!is_null($step)) {
$dataForForm = $myWizard->getData($step);//data To Be Shown in the form
};
$showStep = $step+1;
Wizard::commitWizard($wizardName);//saves it into the session
}
Я не знаю, является ли это функциональным "как есть", но я думаю, что вы поймете основную идею для дальнейшего использования. В области template / html вы можете использовать ifs или переключатель, который изменяет поля формы в соответствии с вашим шагом. Идея состоит в том, чтобы легко перемещаться по шагам мастера с сохранением даты и последнего сохраненного шага. Учитывая, что вы знаете последний шаг, вместо того, чтобы передавать номер шага, вы можете просто пропустить его назад (то есть: уменьшить последний шаг или перейти вперед, то есть увеличить последний шаг).
Надеюсь, это поможет.
Хотя это зависит от того, что вам нужно сделать, вы должны знать, что регистрационная форма должна содержать не более 3 шагов.