添加 'plus' 'minus' 代替 opencart 中的 'add to cart'

Add 'plus' 'minus' in place of 'add to cart' in opencart

我想用 OpenCart 2.0.1.1 中的加号和减号两个按钮替换添加到购物车,现在我无法正确地为减号按钮编码。 我在 catalog/view/theme/*/template/module/featured.tpl 中添加了加号和 mius 按钮,并在 catalog/controller/api/cart.php 中进行了调用,在 common.js 中我将 url 设置为 url: 'index.php?route=checkout/cart/minus,其余代码如下

system/library/cart.php

public function minus($product_id, $qty)
{
    $this->data = array();
    $qnt1 = 1;
    $product['product_id'] = (int)$product_id;
    $key = base64_encode(serialize($product));
    if ((int)$qty && ((int)$qty > 0)) {
        if (!isset($this->session->data['cart'][$key])) {
            $this->session->data['cart'][$key]-= (int)$qty;
        }
        else {
            $this->remove($key);
        }
    }
}

[Image for plus minus button in place of "Add to cart" Button] [1]

为了减少您的产品数量,您需要 product_id 及其数量。要减少,我们需要检查数量是否大于 1,如果是,那么我们可以减少,否则如果数量仅为 1,我们需要删除整个产品。

您需要更改的是您的视图页面添加加号、减号图标,然后是控制器,然后是库,然后发送回 ajax 结果。我会尽量让它变得更简单。

让我们从查看页面开始,在我的例子中,它是 products.tpl 我为获得加减按钮而编写的代码是

  <table class="table scroll">
 <tbody>
   <?php foreach ($products as $product) { ?>
  <tr >
     <td >
       <input type="text" style="width: 20px; height: 20px;font-weight:700 " disabled="true" value="<?php echo $product['quantity']; ?>" class="text-center">
       </td>

       <td  class="text-left">
        <a href="<?php echo $product['href']; ?>">
          <b><?php echo $product['name']; ?></b>
        </a>
      </td>

      <td  style=" text-align:right">
        <i class="fa fa-minus-circle fa-2x" style="cursor: pointer;color:red;"  onclick="cart.remove('<?php echo $product['key']; ?>');"></i>
      </td>
    </tr>

    <tr>
      <td colspan="2" style="border:0 none;">
        <div class="btn-group form-inline" role="group">
            <button type="button" style="height:25px;width:25px" class="btn btn-default btn-xs " onclick="cart.decrement('<?php echo $product['product_id']; ?>');">
            <i  class="fa fa-minus"></i>
            </button>

            <button  type="button"  style="height:25px;width:25px" class="btn btn-default btn-xs" onclick="cart.add('<?php echo $product['product_id']; ?>');">
            <i class="fa fa-plus"></i>
            </button>
        </div>
      </td>
      <td  style="border:0 none;" class="text-right" >
        <b><?php echo $product['total']; ?></b>
      </td>
    </tr>

   <?php } ?>

这里我已经javascriptajax调用了onclick。那么让我们看看这个调用做了什么。如果您愿意,我已经在同一页中编写了您可以在任何 .js 文件中编写的内容。 script.js

'decrement': function(key) {
$.ajax({
url: 'index.php?route=checkout/cart/decrement',
type: 'post',
data: 'key=' + key,
dataType: 'json',
beforeSend: function() {
$('#cart > button').button('loading');
},
complete: function() {
$('#cart > button').button('reset');
},
success: function(json) {
// Need to set timeout otherwise it wont update the total
setTimeout(function () {
$('#cart > button').html('<span id="cart-total"><i class="fa fa-shopping-cart"></i> ' + json['total'] + '</span>');
}, 100);

if (getURLVar('route') == 'checkout/cart' || getURLVar('route') == 'checkout/checkout') {
location = 'index.php?route=checkout/cart';
} else {
$('#cart > ul').load('index.php?route=common/cart/info ul li');
}
}
});
}

现在我们从上面调用的 url ajax 调用是我们控制器检查和函数递减的路径。这是

controller.php

    public function decrement() {
    $this->load->language('checkout/cart');

    $json = array();

    // Remove
    if (isset($this->request->post['key'])) {
    $this->cart->decrement_product_quantity($this->request->post['key'],1);

    unset($this->session->data['vouchers'][$this->request->post['key']]);

    $this->session->data['success'] = $this->language->get('text_remove');
  // rest of the code keep same}

现在您是否注意到我们通过传递数量和 1 来调用库函数 decrement_product_quantity。这里的键只是 ajax 参数,即 product_id

现在库中的最终函数

public function  decrement_product_quantity($product_id, $qty = 1){
$this->data = array();
$product['product_id'] = (int)$product_id;
$key = base64_encode(serialize($product));

if ((int)$qty && ((int)$qty > 0)) {
if ($this->session->data['cart'][$key]>1) {
$this->session->data['cart'][$key] -= (int)$qty;
} else {
$this->remove($key);
}
}
}

这个检查购物车,如果数量大于 1,它将递减,否则移除整个产品。 希望您能理解,如果您有任何疑问,请告诉我。也希望你也能做增量。祝你好运

这里的问题是自 2.0 以来的标准 opencart,post 索引长度超过 64 个字符的字段被忽略(在某些系统上,至少对我的客户而言)。

因此,如果您的产品没有选项,则 post 请求会收到字段 quantity[index] 因为索引小于 64 characters.But 如果产品有选项,则索引大于 64 个字符,并且 post 请求中未收到该字段(通过 ajax 或不)。

我客户的提供商不想在共享服务器上更改它,我的解决方案是查看它在旧版本的 opencart 中的工作方式(我认为它仅在程序中使用 /system/library/cart .php) 并在 2.0 中接管它,你的问题就解决了.. 旧版本中的索引更短.. 因为并非所有字段都用于 base64_encode ..

查看购物车的 html 代码并找到字段数量 [..] 并计算索引的字符数 .. 当超过 64 个字符时(例如使用的产品选项) post 请求中不再接收字段(通过 ajax 或不)..

也许当你有自己的服务器时,你就没有这个问题..