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>
我想做的事情看起来很简单...但由于某种原因我还没有弄明白。
我想做的是——仅针对一个特定类别——通过 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>