不使用“管理”面板。我希望能够在产品页面上更改OpenCart中项目的价格。
基本上我有一个名为Bespoke/Custom:
的选项,它是一个文本字段。如果客户在这里输入任何内容,我希望能够通过jQuery更改我已经做过的价格,然后我想要价格的新隐藏字段覆盖此客户订单的购物车价格
这可能吗?是否有扩展,我可以允许客户输入自己的价格然后我可以隐藏此字段并通过jQuery等更新
这是对其他一些帖子Using an alternate price field in OpenCart的引用,也是关于此模型链接http://forum.opencart.com/viewtopic.php?t=36052的参考,它显示了主要oop功能的位置,但是这样做是非常广泛的
答案 0 :(得分:6)
好的,指出正确的方向,这就是我要这样做的方式:
<强> 1。隐藏的输入渲染
您可能知道,在catalog/view/theme/default/template/product/product.php
中有AJAX请求将产品添加到购物车中:
$('#button-cart').bind('click', function() {
$.ajax({
url: 'index.php?route=checkout/cart/add',
type: 'post',
data: $('.product-info input[type=\'text\'], .product-info input[type=\'hidden\'], .product-info input[type=\'radio\']:checked, .product-info input[type=\'checkbox\']:checked, .product-info select, .product-info textarea'),
dataType: 'json',
// ...
});
});
如果您查看data
参数您将看到.product-info
div中存在的所有输入,选择,textareas等已填充并发布到PHP。
因此我将自定义价格值的隐藏输入呈现到.product-info
div中,而不必修改AJAX请求。假设输入的名称将是custom_price
。
<强> 2。 checkout/cart/add
打开catalog/controller/checkout/cart.php
并搜索add
方法。这里应该完成所有的魔法。在这部分代码之后:
if (isset($this->request->post['option'])) {
$option = array_filter($this->request->post['option']);
} else {
$option = array();
}
我想补充一下:
if(isset($this->request->post['custom_price']) && $this->isCustomPriceValid($this->request->post['custom_price'])) {
$custom_price = $this->request->post['custom_price'];
} else {
$custom_price = false;
}
实施isCustomPriceValid()
方法以满足您的要求...并进入上一次编辑 - 更改此行:
$this->cart->add($this->request->post['product_id'], $quantity, $option);
为:
$this->cart->add($this->request->post['product_id'], $quantity, $option, $custom_price);
第3。购物车
现在打开此文件:system/library/cart.php
并再次搜索add
方法。您必须将方法的定义更改为此方法:
public function add($product_id, $qty = 1, $option = array(), $custom_price = false) {
在此方法的最后一行代码之前,添加另一行代码:
(此代码由于OP的评论而被编辑)
// ...
if($custom_price) {
if(!isset($this->session->data['cart']['custom_price'])) {
$this->session->data['cart']['custom_price'] = array();
}
$this->session->data['cart']['custom_price'][$key] = $custom_price;
}
$this->data = array(); // <- last line
}
最后一次编辑应该在方法getProducts()
内,因为这个编辑正在加载来自数据库的所有数据,并将它们转发到其他控制器以进行显示。
现在我不知道您的自定义价格是否应该覆盖价格+期权价格或仅覆盖价格,因此会选择价格,因此我会坚持使用第二种选择,因为它更具描述性,而且第一选择可以很容易地从我的例子中得出。
搜索
行$price = $product_query->row['price'];
,然后添加
if(isset($this->session->data['cart']['custom_price'][$key])) {
$price = $this->session->data['cart']['custom_price'][$key];
}
现在应该用自定义价格覆盖价格。进一步检查产品的价格后来设置为:
$this->data[$key] = array(
// ...
'price' => ($price + $option_price),
// ...
);
因此,如果您想使用自定义的价格覆盖整个价格,请在该数组之后添加该条件(而不是$price = ...;
之后):
if(isset($this->session->data['cart']['custom_price'][$key])) {
$this->data[$key]['price'] = $this->session->data['cart']['custom_price'][$key];
}
这应该是它。我没有测试代码,它可能会或可能不会稍作修改。我正在使用OC 1.5.5.1。这应该只指向正确的方向(同时认为完成不是那么远)。
享受!
答案 1 :(得分:2)
- “这应该只指向正确的方向(虽然认为结束不是那么远)。来自@shadyyx”
谢谢@shadyyx - 显示正确的方法......我设法让它运转起来就是这样:
if(isset($this->session->data['cart']['custom_price'][$key])) {
$this->data[$key]['price'] = $this->session->data['cart']['custom_price'][$key];
}
应该是:
if(isset($this->session->data['custom_price'][$key])) {
$this->data[$key]['price'] = $this->session->data['custom_price'][$key];
}
再次感谢你,我希望有人觉得这很有用。