【问题标题】:How to add a user input field to a URL如何将用户输入字段添加到 URL
【发布时间】:2021-11-21 20:28:20
【问题描述】:

我有一个 PHP 生成的产品链接列表,单击该列表会将产品添加到购物车中。目前,链接中有一定数量的“1”硬编码,例如

<a href="/shop/checkout?1[sku]=$sku&1[qty]=1"> Add To Cart </a>

我想为列表中的每个项目添加一个数量字段,以便客户可以将他们想要的数量添加到购物车中。

此列表不使用表单,那么如何引入用户输入数量字段并在每个链接中使用它?我的搜索一无所获,所以我认为它不能按照我现在设置的方式完成。无论我如何更改此列表,我都需要将一个数组传递给 /shop/checkout PHP 脚本。

我可能看错了,所以任何指针都将不胜感激。

谢谢!

编辑

这一定与我的产品列表在表格中这一事实有关。当我将您的示例更改为使用表格而不是 div 时,它会中断。这是一个示例:

<table class="products_list">
<tr class="product_list--item">
    <td> 12486XC4 </td>
    <td> Amount: <span class="item_display--1[qty]">1</span> &nbsp; </td>
    <td> <input class="item_qty" id="itm_qty" type="number" min="1" max="100" value="1" size="5" /> &nbsp; </td>
    <td> <a href="https://www.example.com/checkout/?1[sku]=12486XC4&1[qty]=1">Add to cart</a> </td>
</tr>
<tr class="product_list--item">
    <td> 13486XC5 </td>
    <td> Amount: <span class="item_display--1[qty]">1</span> &nbsp; </td>
    <td> <input class="item_qty" id="itm_qty" type="number" min="1" max="100" value="1" size="5" /> &nbsp; </td>
    <td> <a href="https://www.example.com/checkout/?1[sku]=13486XC5&1[qty]=1">Add to cart</a> </td>
</tr>
<tr class="product_list--item">
    <td> 14486XC6 </td>
    <td> Amount: <span class="item_display--1[qty]">1</span> &nbsp; </td>
    <td> <input class="item_qty" id="itm_qty" type="number" min="1" max="100" value="1" size="5" /> &nbsp; </td>
    <td> <a href="https://www.example.com/checkout/?1[sku]=14486XC6&1[qty]=1">Add to cart</a> </td>
</tr>
</table>

另外,1[sku]1[qty] 在链接中是不变的。它们用于此页面上每个产品的目标 PHP 脚本。 唯一从产品到产品的变化是 sku 的价值。

【问题讨论】:

    标签: php forms user-input


    【解决方案1】:

    您可以使用 javascript 来代替一个大表格和复杂的 php 代码。只需将每个链接放在带有&lt;input type="number"/&gt; 的包装器中,这将允许为您的产品添加数量。然后您可以更改URI 进行结帐。我在下面添加了如何使用 cmets 的工作示例。

    希望这会有所帮助!

    更新

    因为您没有展示您的代码,所以很难理解哪些内容对您不利。所以告诉我们你做了什么,让我们找出问题而不是指出问题;)

    我没有看到使用 php 呈现模板并将适当变量的值作为 html 属性值的任何问题。 您可以添加 name 属性,该属性可以等于您的 qty 数组名称以获得正确的 sku。示例

    &lt;input name="1[qty]" class="item_qty" type=number min="1" max="100" value="1" /&gt;.

    php 中它看起来像这样(这只是一个示例,说明如何实现结果

    &lt;input name="&lt;?="1[qty]={$qty}";?&gt;" class="item_qty" type=number min="&lt;?=$qty;?&gt;" max="100" value="1" /&gt;

    &lt;?=?&gt; 是一个回显标签。你可以替换成&lt;?php ?&gt;

    稍后您可以简单地使用 JS 获取属性的值并更新每个相应的结帐链接。此外,您的情况不起作用,因为在正则表达式中,[] 之类的符号应该被转义-> \[\]

    function addSlashes(string, vowels) {
      let length = vowels.length;
      let finalString = "";
      let startOffset = 0;
      let endOffset = 0;
      for (let i = 0; i < length; i++) {
        if ((endOffset = string.indexOf(vowels[i])) !== -1) {
          finalString += string.substring(startOffset, endOffset) + "\\";
          if (endOffset === string.length - 1) {
            finalString += string[string.length - 1];
          }
          startOffset = endOffset;
        }
      }
    
      return finalString;
    }
    
    function updateQueryStringParameter(uri, key, value) {
      let escapedKey = addSlashes(key, ["[", "]"]);
      let re = new RegExp("([?&])" + escapedKey + "=.*?(&|$)", "i");
      let separator = uri.indexOf('?') !== -1 ? "&" : "?";
      if (uri.match(re)) {
        return uri.replace(re, '$1' + key + "=" + value + '$2');
      } else {
        return uri + separator + key + "=" + value;
      }
    }
    
    function displayQuantityForProduct(element, text = "") {
      element.textContent = text;
    }
    
    const inputs = document.querySelectorAll(".product_list--item .item_qty");
    const length = inputs.length;
    
    for (let i = 0; i < length; i++) {
      inputs[i].addEventListener("input", function() {
        // also add check whenever input value is not an empty string and its an integer which is bigger or equal to 1
        if (this.value && parseInt(this.value) >= 1) {
          // selfName 
          let selfName = "1[qty]";
          let children = this.closest(".product_list--item").children;
          // children will consist of td elements from each tr with class product_list--item in your table
          // [0] first element of the array is sku (1) <td> 12486XC4 </td>
          // [1] second element of the array is amount with span (2)
          // [2] is input with qty (3)
          // [3] is Add to cart link (4) and so on...
          let displayQty = children[1].firstElementChild;
          let addToCartLink = children[3].firstElementChild;
          let newUri = updateQueryStringParameter(
            addToCartLink.getAttribute("href"),
            selfName,
            this.value
          );
          displayQuantityForProduct(displayQty, this.value);
          addToCartLink.setAttribute("href", newUri);
        }
      });
    }
    <table class="products_list">
      <tr class="product_list--item">
        <td> 12486XC4 </td>
        <td> Amount: <span class="item_display--1[qty]">1</span> &nbsp; </td>
        <td> <input class="item_qty" id="itm_qty" type="number" min="1" max="100" value="1" size="5" /> &nbsp; </td>
        <td> <a href="https://www.example.com/checkout/?1[sku]=12486XC4&1[qty]=1">Add to cart</a> </td>
      </tr>
      <tr class="product_list--item">
        <td> 13486XC5 </td>
        <td> Amount: <span class="item_display--1[qty]">1</span> &nbsp; </td>
        <td> <input class="item_qty" id="itm_qty" type="number" min="1" max="100" value="1" size="5" /> &nbsp; </td>
        <td> <a href="https://www.example.com/checkout/?1[sku]=13486XC5&1[qty]=1">Add to cart</a> </td>
      </tr>
      <tr class="product_list--item">
        <td> 14486XC6 </td>
        <td> Amount: <span class="item_display--1[qty]">1</span> &nbsp; </td>
        <td> <input class="item_qty" id="itm_qty" type="number" min="1" max="100" value="1" size="5" /> &nbsp; </td>
        <td> <a href="https://www.example.com/checkout/?1[sku]=14486XC6&1[qty]=1">Add to cart</a> </td>
      </tr>
    </table>

    【讨论】:

    • 谢谢,谢尔盖,但我无法让它工作。不过,我看到它在您的 sn-p 中有效。我注意到的一个区别是您使用了与我不同的变量 - sku & qty 而不是 1[sku] & 1[qty]。所以我更改了这部分脚本:let newUri = update_query_string_parameter( addToCartLink.getAttribute("href"), "1[qty]", this.value );,但这并没有帮助。如果之前不清楚,链接是由我的 PHP 脚本生成的,所以这可能是 qty 没有更新的原因。
    • 它生成如下输出:https://www.example.com/checkout/?1[sku]=2&amp;1[qty]=1&amp;1[qty]=2&amp;1[qty]=3&amp;1[qty]=4&amp;1[qty]=5,具体取决于单击增量按钮的次数。
    • 在上面添加了一些代码,只是将您的示例更改为使用表格破坏它。
    • 谢谢你,谢尔盖!这真太了不起了。我终于让它在我的设置上工作。它比我的示例复杂得多,但是您清晰的解释使我能够理解正在发生的事情并能够使其适应我的场景。再次感谢。你超越了。 :)
    • 嘿,谢尔盖 - 没关系。我想到了。我只是将您的代码包装在一个匿名函数中,然后在页面底部调用外部文件,它就可以工作了!我开始喜欢 JavaScript! ; ) 再次感谢!您的帖子非常有帮助。
    猜你喜欢
    • 2020-03-31
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 2018-06-15
    • 2016-07-06
    • 2020-06-27
    • 1970-01-01
    • 2018-06-11
    相关资源
    最近更新 更多