我想在OpenCart 2.0.1.1中用2个加号和减号按钮替换添加到购物车,现在我无法正确编码减号按钮。
我在catalog/view/theme/*/template/module/featured.tpl
添加了加号和mius按钮,并在catalog/controller/api/cart.php
和common.js
中进行了调用我已将网址设为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]
答案 0 :(得分:1)
为了减少您的产品数量,您需要product_id
及其数量。要递减,我们需要检查qty是否大于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 } ?>
在这里,我已经使用javascript ajax调用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');
}
}
});
}
现在我们从ajax调用上面调用的url是我们的控制器checkout和函数减量的路径。这是
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}
现在你注意到我们通过传递qty和1来调用库函数decrement_product_quantity
。这里的key只是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,则检查购物车是否会减少,否则将删除整个产品。 希望您理解,如果您有任何疑问,请告诉我。也希望你也可以做增量。祝你好运
答案 1 :(得分:0)
这里的问题是标准的opencart自2.0以来,忽略了索引超过64个字符的发布字段(在某些系统上,至少对我的客户而言)。
因此,如果您的产品没有选项,则邮寄请求会收到字段数量[index],因为索引小于64个字符。但如果产品有选项,则索引大于64个字符,在帖子请求中没有收到该字段(通过ajax或不通过ajax)。
我的客户提供商不想在共享服务器上更改此问题,我的解决方案是在旧版本的opencart中查看它是如何工作的(我认为它仅用于程序/系统/库/ cart.php)并在2.0中完成它并且您的问题已经解决..旧版本中的索引较短..因为并非所有字段都用于base64_encode ..
查看购物车的html代码并找到字段数量[..]并计算索引的字符..对于我来说,当超过64个字符(例如使用的产品选项)时,不再收到字段一个帖子请求(通过ajax或不通过)..
也许当你有自己的服务器时,你就没有这个问题..