如何在OpenCart产品页面上更改原始价格?

时间:2013-08-14 08:32:41

标签: php jquery mysql session opencart

不使用“管理”面板。我希望能够在产品页面上更改OpenCart中项目的价格。

基本上我有一个名为Bespoke/Custom:的选项,它是一个文本字段。如果客户在这里输入任何内容,我希望能够通过jQuery更改我已经做过的价格,然后我想要价格的新隐藏字段覆盖此客户订单的购物车价格

这可能吗?是否有扩展,我可以允许客户输入自己的价格然后我可以隐藏此字段并通过jQuery等更新

这是对其他一些帖子Using an alternate price field in OpenCart的引用,也是关于此模型链接http://forum.opencart.com/viewtopic.php?t=36052的参考,它显示了主要oop功能的位置,但是这样做是非常广泛的

2 个答案:

答案 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];
}

再次感谢你,我希望有人觉得这很有用。