如何在Magento的分组产品中按cutom属性对相关产品进行排序,
我已将文件Grouped.php复制到:app / code / local / Mage / Catalog / Model / Product / Type / Grouped.php
并尝试在我的getAssociatedProducts函数中添加它:
->addAttributeToSort('my_attribute', 'DESC');
但它不起作用,任何人都可以帮忙吗?
[编辑]
我已经覆盖了文件“app / code / core / Mage / Catalog / Model / Product / Type / Grouped.php”,我试图通过修改集合来按照自定义属性对关联产品进行排序:< / p>
$collection = $this->getAssociatedProductCollection($product)
->addAttributeToSelect('*')
->addFilterByRequiredOptions()
->setPositionOrder()
->addStoreFilter($this->getStoreFilter($product))
->addAttributeToFilter('status', array('in' => $this->getStatusFilters($product)))
->addAttributeToSort('my_attribute', 'DESC');
但是没有改变!! :(
非常感谢您的帮助。
答案 0 :(得分:1)
您需要确保您的属性包含在select中,以便能够对其进行排序。我也做同样的事情来按entity_id订购产品。
public function getAssociatedProducts($product = null)
{
if (!$this->getProduct($product)->hasData($this->_keyAssociatedProducts)) {
$associatedProducts = array();
if (!Mage::app()->getStore()->isAdmin()) {
$this->setSaleableStatus($product);
}
$collection = $this->getAssociatedProductCollection($product)
->addAttributeToSelect('*')
->addFilterByRequiredOptions()
->setPositionOrder()
//MRD added to order by product id also.
->addAttributeToSort('entity_id', 'ASC')
//END MRD
->addStoreFilter($this->getStoreFilter($product))
->addAttributeToFilter('status', array('in' => $this->getStatusFilters($product)));
foreach ($collection as $item) {
$associatedProducts[] = $item;
}
$this->getProduct($product)->setData($this->_keyAssociatedProducts, $associatedProducts);
}
return $this->getProduct($product)->getData($this->_keyAssociatedProducts);
}
这在Magento 1.4.1.1中对我有用。请注意,您仍然按位置订购。所以你的查询会考虑到这一点。
答案 1 :(得分:1)
也许这会有所帮助:
$_associatedProducts = $this->getAssociatedProducts();
usort($_associatedProducts, function ($a, $b) {
if (intval($a->getCustomPosition())==intval($b->getExtraPosition())) {
return 0;
}
return intval($a->getExtraPosition())<intval($b->getExtraPosition()) ? -1 : 1;
});
答案 2 :(得分:0)
我也碰到了这类问题;广泛搜索,结果,我发现这个线程但没有答案..仍然没有答案!
不幸的是,getAssociatedProducts()似乎只返回一个关联树数组,而不是常规的ProductCollection,它有我们想要的那个方法(addAttributeToSort)。
这有点像hackish,但我所做的却是:
<?php
foreach($_associatedProducts as $_item) {
$index[$_item->getAttributeText('my_attribute')] = $_item;
}
ksort($index);
?>
这里的结果是我们将有一个按键排序的关联数组。然后我们可以使用它并继续显示相关产品:
<table class="data-table grouped-items-table" id="super-product-table">
<?php foreach($index as $_item) ?>
<tr>
<td><?= $_item->getName() ?></td>
<td><?= $this->getPriceHtml($_item, true) ?></td>
<!-- etc.... some other stuff you want to display-->
</tr>
<?php endforeach; ?>
</table>
虽然不是一个非常好的解决方案,但也不错。适合我!如果有人有更优雅的解决方案,我也很乐意看到它! :D欢呼。
答案 3 :(得分:0)
此解决方案很有效,直到您有多个具有相同“my-attribute”值的关联产品,如大小或价格。在这种情况下,它只选择其中一个选项并跳过其余选项。如果用于对产品进行排序的属性值具有相同的值,我会更改它们,添加一个递增的计数器变量,以便显示所有选项。不是最优雅的解决方案,但它对我有用。顺便说一下,您可以创建其中几个索引来自定义不同属性集的排序方法。
<?php $key_count = 1; ?>
<?php foreach($_associatedProducts as $_item) {
$index[$_item->getAttributeText('wheel_size') . "-" . $key_count] = $_item;
$key_count++;
}
ksort($index);
?>
此外,如果您的属性值是存储为文本的数字,可能会向ksort添加一个排序标志,将其更改为数字类型,仅用于排序目的,如ksort($ index,SORT_NUMERIC)