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

Posted

技术标签:

【中文标题】如何更改 OpenCart 产品页面上的原始价格?【英文标题】:How can I change the original price on OpenCart product page? 【发布时间】:2013-08-16 02:44:17 【问题描述】:

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

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

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

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

【问题讨论】:

如果我理解你是对的 你想让用户插入他自己的价格并使用这个价格进行计算和结帐过程吗?我建议然后逐步完成结帐过程(手动遵循代码或使用例如 XDebug 和 Netbeans)以了解何时以及如何加载价格,以便您可以覆盖该逻辑并使用自定义价格(如果提供)。我建议关注 add-to-cart 部分,因为产品及其数据(选项、价格)存储在会话中 - 因此您应该在将产品添加到购物车之前为其设置自定义价格。 我在页面上有一个隐藏字段,其中包含“销售”自定义价格。基本上,当他们添加或更改页面时,此隐藏字段值会更新为新价格。当他们按添加到结帐时,它应该像往常一样结帐并添加到购物车。 “正常结账并加入购物车”是指原价不变?还是应该用隐藏输入的价格来改变原来的价格?如果您想通过隐藏输入更改与该产品一起销售的产品价格,那么我会非常乐意在那家商店购物;-) 我希望能够使用隐藏的输入来更改价格。隐藏的输入值是安全的,这是我们需要设置的东西..你能建议吗?到目前为止欣赏建议 那么您将检查从隐藏输入中设置的值是否是应该设置的值?我相信我不必提到这一点,例如FireBug 我可以更改隐藏输入的值,因此可以将价格设置为例如$1... 正如我在第一条评论中提到的那样 - 完成将产品设置到购物车的过程,因为所有数据(和价格)都存储在会话中 - 这就是您应该为产品。 【参考方案1】:

-“这应该只将你指向正确的方向(虽然相信终点并不远)。通过@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];

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

【讨论】:

$key 是在哪里定义的?【参考方案2】:

好的,为了给你指明正确的方向,我会这样做:

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 中的所有输入、选择、文本区域等都已填充并发布到PHP。

因此,我将带有自定义价格值的隐藏输入呈现到 .product-info div 中,根本不必修改 AJAX 请求。假设该输入的名称为 @987654326 @。

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 获取所有详细信息,但它不起作用。如果您可以实际测试和构建它,我将不胜感激,也有兴趣在我的站点中将其商业安装 - 或者作为一个 mod 但能够通过核心添加它 - 请!到目前为止非常感谢,但我的价格并没有体现出来! @M1th 由于我们编辑并添加了所有应该在会话中设置自定义价格的逻辑,因此您可以随时调用方法system/library/cart.php::getProducts()(或者换句话说,您通常会看到它像$this-&gt;cart-&gt;getProducts()) - 会话中所有已定制价格的产品都将被退回。尽管您经常会以这种方式找到该站点,但它并非始终提供开箱即用 解决方案 - 有时答案只会以正确的方式推动您。这也是您自学的最佳方式。什么实际上不适合你? 价格行不通。新价格会在购物车页面上显示,但不会显示该商品的新价格。你能准确地展示你在$price = ...); 之后放置的东西吗?这是因为有不止一组数组选项,我认为这就是它不更新购物车或价格的原因.. 问题出在getProducts 中的system/library/cart.php - 此函数内部的任何地方都不能调用会话,因为它带来了:Notice: Undefined index: custom_price 就像我想调用$this-&gt;session-&gt;data['cart']['custom_price'][$key] 一样 @TheBlackBenzKid 然后,首先创建该索引 - 在 system/library/cart::add() 内的某个位置定义它,例如:if(!isset($this-&gt;session-&gt;data['cart']['custom_price'])) $this-&gt;session-&gt;data['cart']['custom_price'] = array(); - 这应该足以不引起通知。无论如何,通知只是说索引不存在,但它仍然会被创建和使用......除了headers already sent 警告......检查我编辑的答案 - 第部分。购物车 - 添加...

以上是关于如何更改 OpenCart 产品页面上的原始价格?的主要内容,如果未能解决你的问题,请参考以下文章

如何在opencart的同一页面上两次使用相同脚本中的脚本?

如何在OpenCart中创建自定义SEO友好的URL?

opencart 换了模版之后前台页面运行很慢?急!!!!!!!!!!!

在 Woocommerce 存档页面上的产品价格后添加图标

使用 WooCommerce 选择变体时更新产品页面上的价格

子域上的 Opencart 2.x 多商店维护模式页面