我正在开发一种形式,人们可以通过托盘系统订购餐饮服务(通过尝试大小,中型和大型订购食品),我无法弄清楚如何做到这一点。我的第一个想法是像这样编码:
<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 $ _POSTs来获取整个菜单和电子邮件我将发送将必须包含列表中的所有项目,即使他们没有订购。是否有更简单的方法来制作我正在做的表格或者是我的第一种方法?
答案 0 :(得分: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 ...
}
}
}
简而言之,如果您正确构建表单,无论有多少字段都可以,您仍然可以使用非常少的代码开销自动处理它们。
答案 1 :(得分: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 }
答案 2 :(得分:0)
请注意,在帖子中发送所有这些数据也可能会导致查询字符串过长错误
另一个最佳解决方案也可以通过 ajax 来实现,因为如果列表太长,您可以在保存循环内向用户反馈进度条。
列表可以很容易地分成一些串,在Json中编码并在登陆页面中获取json数据。您可以通过示例,在$.each
jQuery中使用max item变量。
使用jQuery $.getJson
或普通$.ajax
如果您认为此解决方案可以提供帮助,我们可以添加更多信息,但网络已完整记录