ウィザードのようにしたいですか?もしそれがあなたが望むなら、それはあなたがすでにいくつのステップがあるかを知っているので、ウィザードの各ステップごとに実際に異なるフォームをレンダリングすることを意味します。あなたはまだそれがデータを追跡する必要があります。
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やswitchを使用して、現在のステップに応じてフォームのフィールドを変更することができます。このアイデアは、ウィザードのステップを簡単にナビゲートして、日付と最後のステップを保存しておくことです。あなたが最後のステップを知っていることを考慮すると、ステップ番号を渡す代わりに、ちょうど後ろを渡すことができます(意味:最後のステップを減らすか、または最後のステップを増やすことを意味する)。
これが役に立ちます。
あなたが何をする必要があるかによって異なりますが、登録用紙には最大で3つのステップが必要です。
なぜ一時的なテーブルにそれらを保存しないのですか?はるかに簡単です。imo – yoda
これをより良い方法で強調表示して申し訳ありませんが、申し訳ありませんが、私のアプリケーションの後ろにデータベースはありません。後で追加する必要があるかもしれませんが、残念ながら、この時点ではPHPだけに頼るしかありません。 –