单击链接时使用ajax保存大型多维表单


Saving large, multidimensional forms with ajax when a link is clicked

我在网上商店设置ajax调用时遇到了很多麻烦。

整个订单系统相当庞大。收藏被划分为类别,类别被划分为产品。产品分为三种尺寸:S、M和L。

对于每个集合,订单形式如下(简化):

echo '<form name="input" action="processing.php" method="POST">';
foreach ($categories as $category) {
    foreach ($productids as $productid) {
        echo '<input type="text" name="input['.$productid.'][s]" />';
        echo '<input type="text" name="input['.$productid.'][m]" />';
        echo '<input type="text" name="input['.$productid.'][l]" />';
    }
}
echo '</form>';

像这样设置表单非常方便,因为所有的输入都在$_POST['input']数组中。

在页面顶部,有几个指向不同收藏的链接。当用户单击链接时,我希望通过ajax将当前集合的输入字段的所有数据传递到php文件,以便将其保存到数据库中。

链接的标记:

<a href="index.php?action=order&collection=2" class="changecoll">Collection 2</a>

我有两个问题:

  1. 如何通过jquery.ajax调用将这么多输入传递给processing.php?在数据参数中放入什么
  2. 单击链接时触发jquery.ajax调用是否是解决此问题的正确方法

您可能会执行以下操作:

PHP:

echo '<form name="input" action="processing.php" method="POST">';
foreach ($categories as $category) {
    foreach ($productids as $productid) {
        echo '<input type="text" name="input_'. $productid .'_s" />';
        echo '<input type="text" name="input_'. $productid .'_m" />';
        echo '<input type="text" name="input_'. $productid .'_l" />';
    }
}
echo '</form>';

HTML/JS:

<a href="index.php?action=order&collection=2" class="changecoll">Collection 2</a>
<script type="text/javascript">
<!--
    $(".changecoll").click(function(e) {
        e.preventDefault();
        var data = {};
        $("input[name^='input']").each(function(i, el) {
            var tmp = el.split("_");
            data[tmp[1] +"_" + tmp[2]] = $(el).val();
        });
        $.ajax({
            type: "POST",
            url: "save.php",
            data: {
                input: JSON.stringify(data)
            },
            success: function() {
                document.location.href = $(this).attr("href");
            }
        });
    });
-->
</script>

首先,在您给出的示例中,您希望转义s、m和l周围的单引号,因为这会导致错误。

你为什么要拯救一切?如果用户可以重新访问它,那么在没有明确请求的情况下,它真的值得保存吗?

jQuery.ajax()中的数据参数很简单,只需给表单一个id,然后像一样获取数据

var formData = $('form#formId').serialize();

现在,在您的ajax调用中,只需将formData传递给数据即可。

然而,我仍然很好奇这些表单到底包含什么,以及为什么需要保存它。