我遇到的问题是捆绑产品的子选项/产品在交易电子邮件中没有正确排序。
在这种情况下,排序顺序非常重要,因为产品型号是其中一个选项,需要先显示。
在 template / bundle / email / order / items / order / default.phtml 中,我们有视图逻辑来吐出产品详细信息:
<?php $_item = $this->getItem() ?>
<?php $_order=$this->getOrder() ?>
<?php $parentItem = $this->getItem() ?>
<?php $items = array_merge(array($parentItem), $parentItem->getChildrenItems()); ?>
<?php foreach ($items as $_item): ?>
// etc...
子产品的排序顺序,按照惯例,在管理员中定义,通常在产品视图,购物车,结账等中显示......但是在电子邮件显示期间订单会被提供。
奇怪的是,订单也不是按字母顺序排列的。事实上,它似乎有点武断 - 奇怪......
无论如何,我应该如何对$items
数组进行排序以匹配预期的排序顺序?
注意=这是 admin-&gt; catalog-&gt; product-&gt;捆绑商品 - &gt;位置中设置的值。
这是我最终确定的辅助方法:
/**
* @codepool Local
* @package Namespace
* @module Module
*/
class Namespace_Module_Helper_Product_Sort extends Mage_Core_Helper_Abstract
{
/*
* @param $item : bundle product
* @return array
*/
public function sortBundleChildrenByPosition( $item )
{
$sorted = array();
$sorted[] = $item;
//Mage::log('Namespace_Module_Helper_Product_Bundle::sortChildrenByPosition /n'.print_r($item->debug(), true));
// grab the product (bundle parent)
$_product = $item->getProduct();
// grab child order items
$_children = $item->getChildrenItems();
// grab sort order for options
$optionCollection = $_product->getTypeInstance(true)->getOptionsCollection($_product);
// iterate over options, comparing title / label, if they match, toss into return array
foreach ($optionCollection as $option){
//Mage::log('$option:'.print_r($option->debug(), true));
$title = $option['default_title'];
foreach ($_children as $child){
$prodOption = $child->getProductOptions();
$bundleSelectionAttributes = unserialize($prodOption['bundle_selection_attributes']);
//Mage::log('$_children=>$child:product_options[bundle_selection_attributes]'.print_r($bundleSelectionAttributes, true));
if ($bundleSelectionAttributes['option_label'] == $title){
//Mage::log('$bundleSelectionAttributes[option_label] == '.$title.'. $sorted[] ='. print_r($child->debug(), true) );
$sorted[] = $child;
continue;
}
}
}
return $sorted;
}
}
我在 template / bundle / email / order / items / order / default.phtml (或需要排序的捆绑包的地方)中调用它:
<?php
$_item = $this->getItem();
$_order=$this->getOrder();
$parentItem = $this->getItem();
//$items = array_merge( array($parentItem), $parentItem->getChildrenItems());
$items = $this->helper('Namespace_Module/Product_Sort')->sortBundleChildrenByPosition( $_item );
?>
...我有1000%肯定有一些内置方法可以做到这一点,而且可能更清洁。但经过几个小时的搜寻,我找不到它。
这很有效。就是这样。
答案 0 :(得分:2)
一种方法:
$items
并创建一个id为(作为键)和名称(作为值)的数组,假设它被称为$ sortedPrd。$sortedPrd
并使用它的密钥从$items
<强>更新强>
以下是获取捆绑选项(子产品)位置的一些代码:
$optionCollection = $_product->getTypeInstance(true)->getOptionsCollection($_product);
foreach ($optionCollection as $prdOptions){
$position = $prdOptions->getPosition();
}
有关详细信息,请参阅此问题:Magento: how to load product along its all data as it is used in admin