0

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

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

4

1 回答 1

0

Magento 在目录会话中存储类别排序数据,页码除外。GET应用类别排序时会使用此会话数据和 URL参数,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()

每个方法首先通过查看请求参数(soGET参数)来提取相关的排序数据,如果失败,它会查看会话,如果没有会话数据,则最后回退到默认排序设置。另请注意,$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();
    }
}
于 2013-04-08T10:15:37.987 回答