Magento产品列表排序问题

时间:2013-04-08 05:55:46

标签: magento

如果我想按名称Ascending对结果列表进行排序,Magento会记住此首选项并按名称Ascending对所有未来的“搜索”和“根类别”进行排序,即使这不适合搜索...您总是希望相关性是默认值。

这是如何改变的,所以Magento会忘记排序首选项?

1 个答案:

答案 0 :(得分:0)

Magento在目录会话中存储除页码之外的类别排序数据。应用类别排序时使用此会话数据和URL GET参数,如果存在GET个参数,则首选它们(然后更新记录的会话数据)。从会话中提取数据,如下所示:

Mage::getSingleton('catalog/session')->getSortOrder();
Mage::getSingleton('catalog/session')->getSortDirection();
Mage::getSingleton('catalog/session')->getDisplayMode();
Mage::getSingleton('catalog/session')->getLimitPage();

您还可以使用以下命令取消设置此会话数据:

Mage::getSingleton('catalog/session')->unsSortOrder();
Mage::getSingleton('catalog/session')->unsSortDirection();
Mage::getSingleton('catalog/session')->unsDisplayMode();
Mage::getSingleton('catalog/session')->unsLimitPage();

如果您在代码库中搜索这些命令,它会快速调出包含方法的工具栏类Mage_Catalog_Block_Product_List_Toolbar

getCurrentOrder()
getCurrentDirection()
getCurrentMode()
getLimit()

每个方法首先通过查看请求参数(所以GET参数)来提取相关的排序数据,如果失败则会查看会话,如果没有会话数据,最终会回退到默认排序设置。另请注意,如果找到的$this->_memorizeParam(...);参数不是该参数的默认排序,则会调用GET

对于核心功能的影响最小,我建议你的最佳方法是重写上述方法,并在新方法中调用上面相关的会话方法来取消设置该参数的会话数据,以及通过使用parent::调用父方法来完成。这样就永远不会找到会话数据,只会使用URL参数或默认排序。在模块config.xml文件中重写的示例如下:

<?xml version="1.0"?>
<config>
    <modules>
        <Namespace_ModuleName>
            <version>0.1.0</version>
        </Namespace_ModuleName>
    </modules>
    ....
    <global>
        ...
        <blocks>
            <catalog>
                <rewrite>
                    <product_list_toolbar>Namespace_ModuleName_Block_Product_List_Toolbar</product_list_toolbar>
                </rewrite>
            </catalog>
        </blocks>
    </global>
</config>

你重写的课程:

<?php
class Namespace_ModuleName_Block_Product_List_Toolbar extends Mage_Catalog_Block_Product_List_Toolbar
{
    public function getCurrentOrder()
    {
        Mage::getSingleton('catalog/session')->unsSortOrder();
        parent::getCurrentOrder();
    }

    public function getCurrentDirection()
    {
        Mage::getSingleton('catalog/session')->unsSortDirection();
        parent::getCurrentDirection();
    }

    public function getCurrentMode()
    {
        Mage::getSingleton('catalog/session')->unsDisplayMode();
        parent::getCurrentMode();
    }

    public function getLimit()
    {
        Mage::getSingleton('catalog/session')->unsLimitPage();
        parent::getLimit();
    }
}