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

请注意,在帖子中发送所有这些数据,也可能会导致查询字符串过长错误

另一个最佳解决方案也可以通过ajax来完成,因为如果列表很长,您可以在保存循环内向用户反馈一个进度条。

该列表可以很容易地拆分为几组,在 Json 中编码并在登录页面中获取 json 数据。您可以举个例子,在一个$.eachjQuery 中,里面有一个 max item 变量。

Ajax 调用可以很容易地用 jQuery$.getJson或普通的$.ajax

如果您认为此解决方案可以提供帮助,我们可以添加更多信息,但网络已完整记录

于 2012-08-21T14:47:51.063 回答
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 回答