Magento - 通过布局更新为一个类别设置自定义排序依据和排序方向

Magento - set custom sort by and order direction with Layout Updates for just one category

我想做的事情看起来很简单...但由于某种原因我还没有弄明白。

我想做的是——仅针对一个特定类别——通过 Magento 后端更改按属性排序和排序顺序方向。也就是说,我认为最好的办法是使用自定义布局更新 XML。在互联网上广泛搜索后,我似乎一辈子都找不到答案(我希望这个答案也会对其他人有所帮助)。

非常简单,我已针对一个特定类别尝试了以下自定义布局更新 XML:

<reference name="product_list_toolbar">
    <action method="setDefaultOrder"><string>created_at</string></action>
    <action method="setDefaultDirection"><string>desc</string></action>
</reference>

而且根本行不通! (它在我的自定义主题和默认的 RWD 主题中什么都不做。)

我想做的事情是不可能的吗?看起来很简单!

提前致谢。

注意:我使用的是 Magento 版本 1.9.1.1

由于某些原因,自定义布局方法在 Magento 1.9 及更高版本中不起作用。这可能是由于 Magento 用 local.xml 中的 <catalog_category_default> 标签覆盖了它 我找到的唯一解决方案是打开您的主题 local.xml,然后插入以下内容;

<CATEGORY_24>
     <reference name="product_list_toolbar">
        <action method="setDefaultDirection"><string>desc</string></action>
    </reference>
</CATEGORY_24>

其中 <CATEGORY_24> 替换为类别 ID。

经过大量的反复试验找到了这个。

为了更改排序顺序,我使用了 Ricky 的代码,并使用 Magento 后端将其添加为该类别的布局更新XML:
(类别 > 自定义设计 > 自定义布局更新)

<reference name="product_list_toolbar">
    <action method="setDefaultDirection"><string>desc</string></action>
</reference>

添加按项目排序,需要扩展 Mage_Catalog_Model_Config class,例如:
(具体改写函数getAttributeUsedForSortByArray()

public function getAttributeUsedForSortByArray()
{
    $options = array(
        'position'  => Mage::helper('catalog')->__('Position'), // ADD TRAILING COMMA
        // ADD ADDITIONAL ATTRIBUTES BELOW
        'created_at'  => Mage::helper('catalog')->__('Date')
    );
    foreach ($this->getAttributesUsedForSortBy() as $attribute) {
        /* @var $attribute Mage_Eav_Model_Entity_Attribute_Abstract */
        $options[$attribute->getAttributeCode()] = $attribute->getStoreLabel();
    }

    return $options;
}

这对我有用:

<reference name="product_list">
    <action method="setDefaultDirection"><string>desc</string></action>
    <action method="setSortBy"><string>sku</string></action>
</reference>
<reference name="product_list_toolbar">
    <action method="setDefaultDirection"><string>desc</string></action>
    <action method="setSortBy"><string>sku</string></action>
    <action method="setDefaultGridPerPage"><limit>260</limit></action>
    <action method="setDefaultListPerPage"><limit>260</limit></action>
</reference>