Magento:Bundle产品中“Price as Configured”的bundle.js中的Tier Pricing'Bug'

时间:2014-03-06 23:52:33

标签: javascript php magento

我很难搞清楚如何让Bundle页面的“Price as Configured”部分与层级定价一起更新。

现在,如果我在捆绑产品中选择了复选框,并单击复选框将其添加到捆绑包中,则“已配置价格”会更新产品的全价而非层级定价(默认值)选择的数量在等级定价领域内。)

现在我正在浏览/skin/frontend/base/default/js/bundle.js文件,在selectionPrice方法下,我看到以下内容:

selectionPrice: function(optionId, selectionId) {

.................

    if (this.config.priceType == '0') {
        price = this.config.options[optionId].selections[selectionId].price;
        tierPrice = this.config.options[optionId].selections[selectionId].tierPrice;

        for (var i=0; i < tierPrice.length; i++) {
            if (Number(tierPrice[i].price_qty) <= qty && Number(tierPrice[i].price) <= price) {
                price = tierPrice[i].price;
            }
        }
    } else {
        selection = this.config.options[optionId].selections[selectionId];
        if (selection.priceType == '0') {
            price = selection.priceValue;
        } else {
            price = (this.config.basePrice*selection.priceValue)/100;
        }
    }

到目前为止,我可以说它可以设置:

price = this.config.options[optionId].selections[selectionId].price

现在通常,如果tierPrice返回一个对象,它应该能够遍历它并找到层价(至少这是代码似乎要做的事情)。但是,它永远不会进入实际设置等级价格的for循环。在控制台中,我可以直接访问层级价格:

bundle.config.options['301'].selections['1066'].tierPrice['32000-5']

但是,Magento代码依赖于能够调用..... tierPrice [0]而不是.... tierPrice ['32000-5']来获取每个单独的层定价对象。调用.... tierPrice [0]返回undefined,tierPrice.length返回undefined。

为什么我不能使用for循环访问嵌套数组?我有什么选择?

谢谢!

3 个答案:

答案 0 :(得分:1)

作为基于JavaScript的解决方案的替代方案,遗憾的是需要替换核心文件bundle.js我有一个基于PHP的解决方案

问题首先在于这个对象根本不应该是一个对象。我们可以介入JSON生成并确保它实际上是一个数组。

为此,必须使用以下方法覆盖类Mage_Catalog_Model_Product_Type_Price

public function getTierPrice($qty = null, $product)
{
    $tierPrice = parent::getTierPrice($qty, $product);
    if (is_array($tierPrice)) {
        return array_values($tierPrice);
    }
    return $tierPrice;
}

getTierPrice()方法不会在任何地方使用,其中字符串键与我所见的相关,因此这比将生成的JSON分开并重新创建它更优雅。

我写了一个小扩展,将其与另一个捆绑层定价错误一起修复,您可以从https://github.com/sgh-it/bundletierprices

获取它

进一步阅读: http://www.schmengler-se.de/en/2014/10/magento-buendelprodukte-staffelpreise-der-einfachen-produkte-nutzen/

答案 1 :(得分:0)

我主要使用Magento 1.7和:

[跳到下面的更新我的回答。摘要:我们学到了什么?我想你正在使用Magento 1.5。但即便是Magento 1.7还不够好。在Magento 1.8之前,您尝试使用的功能并未完全修复。]

我打算在这里帮助你,因为我知道使用捆绑包的复杂程度。我没有使用层级定价,因此我在开发服务器上进行了设置,并开始逐步完成上面列出的bundle.js函数。

我发现了两件令我困惑的事情:

a)我的tierPrice[] 一个索引为0,1,2的数组(我通过Magento管理员设置了三层): tierPrice object is an array object

这里为您提供的帮助是我的捆绑JSON对象定义的片段,即来自app/design/frontend/themename/default/template/bundle/catalog/product/view/type/bundle/bundle.phtml

 <script type="text/javascript">
  //<![CDATA[
      var bundle = new Product.Bundle(<?php echo $this->getJsonConfig() ?>);
  //]]>
 </script>

段:

var bundle = new Product.Bundle({"options":{"837":{"selections":{"4205":{"qty":1,"customQty":"1","price":52,"priceInclTax":52,"priceExclTax":52,"priceValue":0,"priceType":"0","tierPrice":[{"price_id":"4","website_id":"0","all_groups":"1","cust_group":32000,"price":29.99,"price_qty":"2.0000","website_price":"29.9900"},{"price_id":"5","website_id":"0","all_groups":"1","cust_group":32000,"price":18.88,"price_qty":"3.0000","website_price":"18.8800"},{"price_id":"6","website_id":"0","all_groups":"1","cust_group":32000,"price":7.77,"price_qty":"4.0000","website_price":"7.7700"}], ...

你看起来像这样吗?

b)因此,在上面的for循环之后,我的开发服务器上bundle.js已经正确识别了层级价格稍后在代码中根据显示的价格(包括税)重置变量价格或不含税,即此代码:

//file: skin/frontend/theme/default/js/bundle.js
//function: selectionPrice()
//...
selection = this.config.options[optionId].selections[selectionId];
if (selection.priceInclTax !== undefined) {
    priceInclTax = selection.priceInclTax;
    price = selection.priceExclTax !== undefined ? selection.priceExclTax : selection.price;
} else {
    priceInclTax = price;
}
//...

因此,最后,我的“配置价格”最终不正确

你怎么看?你能弄清楚你的包对象为什么而不是tierPrice['32000-5']而不是tierPrice[0]吗?当bundle.js尝试应用包含税或不含税的显示价格时,您的等级价格会被覆盖吗?

(并且似乎没有默认方式知道tierPrice是否包含税或不含税。我在这里闻到了一个错误。)

实际上这个错误报告可能是您感兴趣的。http://www.magentocommerce.com/bug-tracking/issue?issue=11477(需要登录)]并且some other bugs tracked on tier pricing有助于解释Magento 1.8中的代码更新

更新:我指的是来自Magento 1.7的bundle.js

我可以在Magento 1.8中看到bundle.js已经改进,考虑到tierPrice和tierPrice包括和不包括税 - 但这也必须伴随着一个不同的捆绑JSON对象(以保存{{1的字段和值) }和tierPrice[i].priceInclTax;

所以,我们现在可能有一个答案:

a)升级到Magento 1.8

b)在文件'app / core / Mage / Bundle中,使用tierPrice[i].priceExclTax; Magento 1.8 中的代码手动更新主题的bundle.js。 /Block/Catalog/Product/View/Type/Bundle.php',通过1.7和1.8之间的检查,

Magento 1.7

bundle.js

Magento 1.8

//file app/core/Mage/Bundle/Block/Catalog/Product/View/Type/Bundle.php
//class Mage_Bundle_Block_Catalog_Product_View_Type_Bundle
//function getJsonConfig()
//...
                $tierPrices = $_selection->getTierPrice();
                foreach ($tierPrices as &$tierPriceInfo) {
                    $tierPriceInfo['price'] = $coreHelper->currency($tierPriceInfo['price'], false, false);
                }
                unset($tierPriceInfo); // break the reference with the last element
//...

因此,如果您手动更新旧版本的Magento,则需要扩展课程//file app/core/Mage/Bundle/Block/Catalog/Product/View/Type/Bundle.php //class Mage_Bundle_Block_Catalog_Product_View_Type_Bundle //function getJsonConfig() //... $tierPrices = $_selection->getTierPrice(); foreach ($tierPrices as &$tierPriceInfo) { $tierPriceInfo['price'] = $coreHelper->currency($tierPriceInfo['price'], false, false); $tierPriceInfo['priceInclTax'] = $taxHelper->getPrice($_selection, $tierPriceInfo['price'], true); $tierPriceInfo['priceExclTax'] = $taxHelper->getPrice($_selection, $tierPriceInfo['price']); } unset($tierPriceInfo); // break the reference with the last element //... ,并使用此更新的Mage_Bundle_Block_Catalog_Product_View_Type_Bundle

创建您自己的新bundle.php

我没有在1.7和1.8这些文件之间运行差异,这是值得做的,看看是否还有其他变化。

所有这些假设你可以深入了解为什么你有tierPrice ['32000-5'],正如我上面提到的,将我的捆绑JSON对象声明与你的比较或粘贴你的其他人进行检查。

我们学到了什么?我想你正在使用Magento 1.5。但即便是Magento 1.7还不够好。在Magento 1.8之前,您尝试使用的功能并未完全修复。

马拉奇。

答案 2 :(得分:0)

这是我回答我自己的问题!

所以我弄清楚它为什么不起作用。 Magento代码尝试使用:

遍历对象
var(i=0;i<object.length;i++)

这不适用于对象。我更改了代码,用 selectionPrice:function(optionId,selectionId)方法中的for(键入对象)遍历对象:

if (this.config.priceType == '0') {
        price = this.config.options[optionId].selections[selectionId].price;
        tierPrice = this.config.options[optionId].selections[selectionId].tierPrice;

        // Ensures that tierPrice is set 
        // If a selection has no tier pricing it would return an empty array

        if (tierPrice.length != 0){

        // Iterate through tier Pricing until you reach correct quantity break
        // then set price.    

        for (key in tierPrice){
          if (tierPrice.hasOwnProperty(key)){
            if(tierPrice[key].price_qty <= qty && tierPrice[key].price <= price) {
                price = tierPrice[key].price;

            }
        }
        }
        }

然后在方法的底部,您需要将条件 tierPrice.length == 0 ,否则您的等级定价会再次被覆盖:

// Check that priceInclTax AND tierPrice are not set
    if (selection.priceInclTax !== undefined && tierPrice.length == 0) {

        priceInclTax = selection.priceInclTax;
        price = selection.priceExclTax !== undefined ? selection.priceExclTax : selection.price;

    }

    else {
        priceInclTax = price;
    }

这似乎对我有用 - 它现在成功更新“按配置价格”来计算等级定价,并且仍然成功更新所有其他定价。如果你有一个具有weee模块/税收规则的Magento商店,那么它可能会大惊小怪,但对于我的商店配置,它很有用。

希望有所帮助!