我很难搞清楚如何让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循环访问嵌套数组?我有什么选择?
谢谢!
答案 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
获取它答案 1 :(得分:0)
我主要使用Magento 1.7和:
[跳到下面的更新我的回答。摘要:我们学到了什么?我想你正在使用Magento 1.5。但即便是Magento 1.7还不够好。在Magento 1.8之前,您尝试使用的功能并未完全修复。]
我打算在这里帮助你,因为我知道使用捆绑包的复杂程度。我没有使用层级定价,因此我在开发服务器上进行了设置,并开始逐步完成上面列出的bundle.js
函数。
我发现了两件令我困惑的事情:
a)我的tierPrice[]
是一个索引为0,1,2的数组(我通过Magento管理员设置了三层):
这里为您提供的帮助是我的捆绑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商店,那么它可能会大惊小怪,但对于我的商店配置,它很有用。
希望有所帮助!