2011-02-01 1 views
1

ご挨拶、私の質問があります:私のwebapplicationは同じフォームを与えられた回数だけ表示し、そうであるように、フォームは必要になるまで何度も繰り返し呼びます。これらの別個のコンパイルからのデータは、提出されたすべてのデータセットに対して有効なPDFテンプレートを記入し、結果を出力するために使用されます。私は現在、PDFフォームがコンパイルされたデータセットを格納するためにセッション配列を使用しています。PHP:同じフォームのページを複数回繰り返し、ブラウザのナビゲーション全体で各バージョンを永続的に識別する

私が達成する必要があるのは、生成された個々のアレイを識別することです。ユーザーが生成する必要があるドキュメントの数が先験的に分からないため、さまざまなデータセットが徐々にカウントされます。

私が考えているのは、適切な配列のタブを維持し、その名前を動的に生成するためにカウンタ変数を使用することです(${$arrName.$i} = $foo);)。しかし、ユーザーが戻るボタンを押して、以前に入力されたフォームデータを他のすべてのページに保持するので、上向きのカウンターを持つことはできません。つまり、以前の配列への参照が失われることになります。$_GET変数を使用してフォーム番号をURLに渡すことで、残りのページとは独立して要求されたバージョンのページをすべて認識できるようになりますが、これは私の心のように思えますが、これは後続の配列コード - と、並べ替え私のためのものを容易にする。

私はこの方法について意見を持っているかもしれません。アプリケーションはそれ自身に依存しているだけであり、交換ポイントとして使用するデータベースはありませんので、やや容易になります。建設的な対応に感謝します。

+0

なぜ一時的なテーブルにそれらを保存しないのですか?はるかに簡単です。imo – yoda

+0

これをより良い方法で強調表示して申し訳ありませんが、申し訳ありませんが、私のアプリケーションの後ろにデータベースはありません。後で追加する必要があるかもしれませんが、残念ながら、この時点ではPHPだけに頼るしかありません。 –

答えて

1

ウィザードのようにしたいですか?もしそれがあなたが望むなら、それはあなたがすでにいくつのステップがあるかを知っているので、ウィザードの各ステップごとに実際に異なるフォームをレンダリングすることを意味します。あなたはまだそれがデータを追跡する必要があります。

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つのステップが必要です。

+0

ありがとう、これは役に立ちます。私が整理したことは、要求されたデータセットがあるのと同じくらい多くのセッション配列を動的に設定していることです。これは実際には同じステップですが、より良い選択肢のように思えます。このクラスが私の目的のために必要とするのは、ユーザーが元に戻り、次のステップで保存されたデータがもはや関連性がなく、簡単に処理できるなど、プロセスの不要なステップの削除を処理するメソッドです。多くのおかげで、これはまさに私が探していたものです。 –

関連する問題