2010-12-30 14 views
6

PHPの初心者はここで、私の以前の仕事のほとんどはASP.NETでした。私は現在、PHPプロジェクトに取り組んでいます。私が直面した最初の岩は、ポストバックの価値を保持しています。PHP - ポストバック全体でフォームの値を保持するベストプラクティス

最もシンプルで現実的な例では、10個のドロップダウンがあります。それらは私の次のステップであるので、まだデータバインドされていません。それらは単純なドロップダウンです。

私は全ページをタグで囲んでいます。各ドロップダウンのonclick()イベントは、ドロップダウンの選択された値で、腐食したドロップダウンの隠れ要素を埋めるjavascript関数を呼び出します。次に、ページの再読み込み時に、その隠し値が空でない場合、私は選択されたオプション=それを私の隠された値に設定します。

これは、単一のポストバックに最適です。ただし、別のドロップダウンが変更された場合、元の1番目のドロップダウンはその腐食に対応する隠れた値がその値を失うため、その値を失います!

これは、クエリ文字列、セッション、またはその他のアイデアを使用して調べます。

私の状況で誰かが正しい方向に向いていますか?私はPHPの初心者ですが、自分のスキルレベルでかなり激しいことをする必要があるので、私はフレキシブルで使いやすいものがほしいと思います。

ありがとうございます!

-----編集私の質問に-----

もう少し明確に:)

i「はポストバック」と言うとき、私は提出されているページ/フォームを参照しています。コントロールがサーバーに戻され、HTML/PHPコードが再度実行されます。

ヒドンズについては、「選択した値」または「選択したインデックス」を保持するために隠れ変数を使用した理由は、ページが送信されるときに、以前の選択肢でドロップダウンリストを再描画できるようにするためです最初のインデックスにデフォルト設定するのではなく、 $ _POST []コマンドを使用すると、名前でドロップダウンリストを取得できませんが、名前で隠し値を取得できます。これがドロップダウン変更されたイベントでは、ドロップダウンから選択した値をその腐食性の隠れたものに設定するjavascriptを呼び出します。

--------もう一度編集-------- 申し訳ありませんが、私はステップwayyyを取り戻し、全体的な目標を説明する必要があることがわかります:)私は非常にされていないことをお詫び申し上げますまずは明確にする。

私の最終的なデザインは、ユーザーが当社の部門を選択してデータを表示できるページになります。その部門が選択されると(ドロップダウンから)、色、サイズ、仕入先、スタイル、日付、店舗番号などのより具体的なデータ選択ドロップダウンが表示されます。この時点で、選択された部門。任意の色、サイズなどを選択すると、新しい条件を満たすために販売データの結果が更新されます

---------編集---------- 私は提供できません私の例への外部からのアクセスですが、ここではexplinationを使ったsceenshotです。下の画像では、ユーザーはDepartmentドロップダウンを展開して部門を選択します。この時点で、以下の販売データはその部門に従って更新されます。次に、ユーザーは「ストア」などの「グループ化」オプションを選択し、ページ/データをリフレッシュしてストアごとにグループ化されたデータを表示します。次に、私の例では黒などの色を選択することができ、選択した部門および色の売上が店舗別にグループ化されたデータが表示されます。しかし、すべてこれを行うために

は、ページが自動ポストバックへのネイティブな方法はありません

alt text

+1

興味深いトピックです。しかし、あなたは[ポストバック](http://en.wikipedia.org/wiki/Postback)が何を意味するのかを説明する必要があります。これはASP用語で、PHPの土地では未知です。また、ドロップダウンを再表示する必要がある場合や、隠しフォームフィールドで値を渡すだけで十分である場合には、さらに情報を追加してください。 – mario

+0

なぜ選択の値を格納するための別の隠しフィールドがありますか? selectは自身の値を格納します。私は非常に混乱しています。いくつかのコードを見て、あなたが達成しようとしていることを説明することができますか? – dqhendricks

+0

実例へのリンクを提供できますか正確なプロセスを理解できます – RobertPitt

答えて

4

...部門、色、およびグループのドロップダウン選択すべてのリフレッシュ/ポストを保持する必要があります、あなたはとても似の$ _POST配列からデータをエコーする必要があります。

<input name="id" value="<?php isset($_POST['id']) ? (int)$_POST['id'] : "" ?>" /> 

これを行うための別の方法をされて、動的にあなたのための入力などを作成するフォームヘルパーを作成し、ポストの配列をチェックしますキー、e例:

class FormHelper 
{ 
    public function input($name,$type = "text",$default_value = "",$postback = false) 
    { 
     return '<input name="' . $name . '" type="' . $type . 'value="' . $this->_postback($name,$default_value) . '" />'; 
    } 

    //More Methods 


    private function _postback($key,$default = "") 
    { 
     return isset($_REQUEST[$key]) ? htmlentities($_REQUEST[$key]) : $default; 
    } 
} 

を追加して、以前の値が含まれるはずのフォームを作成できるようになります。

あなたはそうのようなフォームを作成します。

<form> 
    <?php echo FormHelper::getInstance()->input("id","text","Enter Id",true); ?> 
</form> 

がObviuslyシングルトンメソッド getInstance()

あなたを助けるかもしれないいくつかのリンクを作成します。

  1. Form validation using PHP
  2. PHP/CSS Form validation
  3. PHP Form Validation

あなたの更新の後、私はあなたもあなたのポストを理解するのは難しいと思った何を意味するか知っているかもしれません。

イム権利は次の操作を実行したい場合:

  • は、ページ上のフォーム
  • は、ユーザーがクリックする
    • を送る送信すると、ユーザーがフォーム
    • に必要事項を記入してみましょう表示
    • ユーザーが入力した情報を処理します。
    • 新しいフォームを生成します。エラー
    • で古い形式を再生成上記が正しい場合には、新たに生成された1

で古い形式を置き換える、古いフォームを取り外し

  • ページへのパイプの下戻っフォームを送信これはPHPのための特別な機能ではなく、主にJavaScriptをベースにしています

    <html> 
        <!-- Head, Meta, Etc--> 
        <body> 
         <?php $this->template->load("templates/forms/specific_form.php"); ?> 
        </body> 
    </html> 
    

    これは通常、ページが読み込まれる方法ですが、クリックするとフォームがajax経由で送信されます。これはjQueryを組み込むことになります。

    フォームはそうのように次のようになります。

    <form rel="__postback" ... > 
    </form> 
    

    そしてjQueryの中には、次の操作を行います。

    $(document).ready(function(){ 
        $("form[rel*=__postback]").each(function(){ 
         var Form = $(this); 
    
         //Send the form with ajax, bin the __PostbackComplete() 
         function __PostbackComplete(server_data) 
         { 
          //Overwite the form using jQuery LIVE!!!! 
         } 
        }); 
    }); 
    

    PHP内で使用すると、テンプレートからデータおよび担当者のプロセスフォームを分析しますセクション。

    これが役に立ちます。

  • +0

    ちょうど私の元の記事をより詳細に更新しました。お時間を割いていただきありがとうございます! – Adam

    0

    私はあなたの質問が正しい場合は、問題は実際にあなたのjavascriptソリューションと思う。

    なぜ選択したフィールドのみを送信しますか?多くのフォームがありますか?つまり、すべてのドロップダウンが1つのフォーム内にある場合は、入力が変更されたときに完全なフォームを送信する必要があります。はい、以前のドロップダウン値を再度送信しますが、それは$ _POSTでその値を取得する方法です。

    +0

    複数の隠しオブジェクトに腐食対応ドロップダウン値を含めるのではなく、私は私のフォームからすべてのHTMLを含む単一の隠しオブジェクトを持っている必要がありますか?そして、ドロップダウンの選択された値を取得するために、myがsubmit/reloadされたときに$ _POST []を使って解析します。それが事実なら、私に例を教えてもらえますか?ありがとうございました:) – Adam

    +0

    あなたのhtmlやjavascriptのビットを表示する場合、簡単になることができます。私が言っていたことは、投稿されたデータを常に処理し、出力を行うだけでなく、すべてのオプションをチェックして、@ RobertPittのようなソリューションを使用することでした。 – Dave

    0

    正しい値があらかじめ入力されているので、フォームフィールドを再出力する必要があるようです。

    たとえば、ドロップダウンこのようにしたいと言う:

    <select name="department"> 
        <option value="s">Sales</option> 
        <option value="m">Marketing</option> 
    </select> 
    

    フォームを送信すると、値は$ _POST [「部署」]としてPHPを利用できるようになります。これで、正しい部門が選択された状態でフォームを再度出力します。

    あなたは(これは単に速いスケッチである)このような機能が必要になります:

    function outputSelect($name, $values, $currentValue) { 
        echo '<select name="'.htmlspecialchars($name).'">'; 
        foreach ($values as $value => $text) { 
        if ($value === $currentValue) { 
         echo '<option value="'.htmlspecialchars($value).'" selected>'.htmlspecialchars($text).'</option>'; 
        } else { 
         echo '<option value="'.htmlspecialchars($value).'">'.htmlspecialchars($text).'</option>'; 
        } 
        } 
        echo '</select>'; 
    } 
    

    メニューを表示したいときは、それを呼び出すと思います。通常、これは、HTMLテンプレート内からです:

    <?php outputSelect("department", array("s" => "Sales", "m" => "Marketing"), $_POST["department"]) ?> 
    

    あなたは最後に、あなたは、再利用可能な関数のライブラリになってしまいます..テキストフィールド、隠しフィールド、ラジオボタンなどのために同様の機能が必要になりますフォームフィールドを出力します。

    上記のように、HTMLタグの属性またはコンテンツの周りにhtmlspecialcharsを使用することを忘れないでください。これは、XSS攻撃を防ぐためにユーザーが入力したデータを表示する場合に特に重要ですが、データの送信元に関係なく実行する必要があります。

    関連する問題