0

トレー方式(お試しサイズ、中、大)でケータリングサービスを注文できる形で開発を進めているのですが、どうしたらいいのか分からず困っています。私の最初のアイデアは、次のようにコーディングすることでした。

<form id="tray" name="tray" method="post" action="send_mail_tray.php" onsubmit='return packageValidator()'>
<table>
    <tr>
        <td>Pork Fried Rice</td>
        <td>
            Med.:<br />
            Lg. :
        </td>
        <td>
            <input type="text" name="PorkFriedRiceMed" style="width: 20px; height: 15px" /><br />
            <input type="text" name="PorkFriedRiceLg" style="width: 20px; height: 15px" />
        </td>
        <td>Vegetable Spring Rolls</td>
        <td>
            Med.:<br />
            Lg. :
        </td>
        <td>
            <input type="text" name="VegetableSpringRollsMed" style="width: 20px; height: 15px" /><br />
            <input type="text" name="VegetableSpringRollsLg" style="width: 20px; height: 15px" />
        </td>
        <td>Beef w/ Broccoli</td>
        <td>
            Med.:<br />
            Lg. :
        </td>
        <td>
            <input type="text" name="Beefw/BroccoliMed" style="width: 20px; height: 15px" /><br />
            <input type="text" name="Beefw/BroccoliLg" style="width: 20px; height: 15px" />
        </td>
    </tr>
    <tr>
        <td>
            <input type="Submit" value="Submit" />
        </td>
    </tr>
</table>
</form>

この方法では、値とともに変数名を投稿できる必要があります。最初はこれが最善の方法だと思っていましたが、考えてみると、提供されている食品のリストは 150 を超えています。つまり、メニュー全体とメールを取得するには、300 以上の $_POST を作成する必要があるということです。送信には、注文されていない場合でも、リストにあるすべてのアイテムが含まれている必要があります。私がやっているフォームを作成するためのより簡単な方法はありますか、それとも私の最初の方法が最善の方法ですか?

4

3 に答える 3

3

これらの値はデータベースから取得されていますか? そうでない場合は、...または少なくとも、ある種のデータ構造からフォームを動的に生成する必要があります。

$menu = array(
   0 => array('name' => 'Vegetable Spring Rolls', 'sizes' => array('L', 'M', 'S')),
   1 => array('name' => 'foo', 'sizes' => array(...)),
   etc...
);

次に、フォームを作成します

foreach($menu as $key => $item) {

    echo <<<EOL
<input type="text" name="item_{$key}" value="{$item['name']}" />

EOL;
}

個々のアイテムのサイズではなく、アイテム名を出力しているだけであることに注意してください。これは、この例を簡潔にするためです。

フォームが送信されたら、別のループを実行できます。

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
   foreach ($menu as $key => $item) {
      if (isset($_POST["item_{$key}"]) && !empty($_POST["item_{$key}"])) {
        .... item has non-zero quantity specified ...
      }
   }
}

つまり、フォームを適切に作成すれば、フィールドの数に関係なく、コードのオーバーヘッドをほとんど抑えて自動的に処理できます。

于 2012-08-21T14:31:17.703 に答える
0

非常に多くの名前を持つことは、治療するのが苦痛になる可能性があります.

PHP 5 を使用すると、このような名前に影響を与えることができます

<input type="text" name="food[PorkFriedRice][med]"> ...
<input type="text" name="food[PorkFriedRice][lg]">

$_POST で取得する場合は、次のようにしてアクセスできます。

foreach ($_POST['food'] AS $piece => $sizes)
{
    $medSize = $sizes['med'];
    $lgSize = $sizes['lg'];
    ...
}

ヒント: HTML のサイズをいくらか節約するには、入力に CSS クラスを追加してスタイルを設定することをお勧めします。

#tray input { width:20px; height:15px }

于 2012-08-21T14:37:52.027 に答える
0

このすべてのデータをポストに送信すると、長すぎるクエリ文字列エラーが発生する可能性があることに注意してください

リストが非常に長い場合、保存ループ内の進行状況バーをユーザーにフィードバックできるため、別の最良の解決策はajaxでも実行できます。

リストは、Json でエンコードし、ランディング ページで json データを取得することで、いくつかの束に簡単に分割できます。たとえば、$.each内部に max item 変数を含む jQuery で実行できます。

$.getJsonAjax 呼び出しは jQueryまたは通常の方法で簡単に実行できます$.ajax

このソリューションが役立つと思われる場合は、関連する情報を追加できますが、Web は完全に文書化されています。

于 2012-08-21T14:47:51.063 に答える