0

Magento 类别排序顺序接缝存储在 cookie 中。假设默认排序顺序是按名称升序。如果用户将其更改为降序,则所有下一页也将具有此排序顺序。

如何更改此设置,以便用户在下一个类别中看到默认排序顺序?

4

2 回答 2

2

这是一个老问题,但作为“Magento 按 cookie 排序”的第一个 Google 结果出现。所以,本着 SO 的精神,让我们来回答吧!

首先,我们必须进行一些调查,但首先我们需要知道我们的假设是什么。

假设

  • 按状态排序存储在 cookie 中
  • 更改选择排序时更新 Cookie

从哪儿开始?

如果在 Magento 中遇到这种情况有疑问,请从可以查看输出的前端开始。

如果我们看\app\design\frontend\<your_package>\<your_theme>\template\catalog\product\list\toolbar.phtml

我们看到,当“排序依据”选择框发生更改时,以下处理了 javascript 操作。

<div class="sort-by">
    <label><?php echo $this->__('Sort By') ?></label>
    <select onchange="setLocation(this.value)">
    <?php foreach($this->getAvailableOrders() as $_key=>$_order): ?>
        <option value="<?php echo $this->getOrderUrl($_key, 'asc') ?>"<?php if($this->isOrderCurrent($_key)): ?> selected="selected"<?php endif; ?>>
            <?php echo $this->__($_order) ?>
        </option>
    <?php endforeach; ?>
    </select>
    <?php if($this->getCurrentDirection() == 'desc'): ?>
        <a href="<?php echo $this->getOrderUrl(null, 'asc') ?>"><img src="<?php echo $this->getSkinUrl('images/sort_desc_arrow.gif') ?>" alt="<?php echo $this->__('Set Ascending Direction') ?>" class="v-middle" /></a>
    <?php else: ?>
        <a href="<?php echo $this->getOrderUrl(null, 'desc') ?>"><img src="<?php echo $this->getSkinUrl('images/sort_asc_arrow.gif') ?>" alt="<?php echo $this->__('Set Descending Direction') ?>" class="v-middle" /></a>
    <?php endif; ?>
</div>

特别是,我们对这<select onchange="setLocation(this.value)">部分感兴趣。那么当这个方法被调用时会发生什么呢?

我们去更深的洞!在第 30 行左右setLocation定义。\js\varien\js.js

function setLocation(url){
    window.location.href = url;
}

所以这很简单,它只是您基本的 Javascript 新位置指令。

<select>更改后,我们将被发送到带有一些参数的新 URL 。这是 cookie 设置的最可能位置。

同样,我们特别对 url 参数感兴趣?dir=<asc OR desc>&order=<whatever_metric_you_are_sorting_by>。让我们试一试,猜测该order参数导致“setCookie”方法或类似的东西被调用。

我们在哪里可以找到这个?嗯,这很简单:请求上的所有 Magento 操作都可以从index.php最终的前端渲染开始,所以它必须在此过程中的某个地方发生!您可以使用此方法追踪 Magento 中的任何操作。

但是,为了节省您和我一些时间,我们还可以假设在任何给定的 Web 框架中可能不会经常设置cookie。grep在 Magento 目录上运行 a以('core/cookie')返回 14 个文件中的 23 个命中。这缩小了范围,非常臭!

在 23 次点击中,只有 4 次使用了该('core/cookie')->set()方法。4个使用set()方法:

\app\code\core\Mage\Persistent\Model\Observer\Session.php - line 79 \app\code\core\Mage\Sales\Helper\Guest.php - line 100 \app\code\core\Mage\XmlConnect\controllers\ConfigurationController.php - line 112 \app\code\core\Mage\XmlConnect\controllers\Adminhtml\Connect\ConfigController.php - line 101

在这 4 个中,只有 2 个将直接与您的最终用户打交道,即Session.phpGuest.php。由于Guest.phpSalesMagento 中模块的一部分和loadValidOrder()方法的一部分,它不太可能处理产品列表排序。这给我们留下了 1 个选项,那就是:

\app\code\core\Mage\Persistent\Model\Observer\Session.php - line 79

检查这段代码告诉我们什么?

// Set new cookie
if ($sessionModel->getId()) {
    Mage::getSingleton('core/cookie')->set(
        Mage_Persistent_Model_Session::COOKIE_NAME,
        $sessionModel->getKey(),
        $persistentLifeTime
    );
}

所有 cookie 都存储的是服务器的会话 ID!这几乎就像是现代 Web 框架的标准做法或其他东西!;)。我们的一个基本假设是不正确的!

TL;DR 答案

按偏好排序保存在该客户端的 Magento 服务器端会话中,并在用户返回 cookie 中存储的 ID 时调用。

为了使 Magento 不保存它,我们必须执行以下操作:

Magento 'Sort By' - 如何让 Magento 忘记选择了哪个选项

我想不是仅仅将答案联系起来,我会解释如何从你的思路到答案,这更有价值,因为现在你明白了为什么答案是正确的。享受和快乐的编码。

更新

由于我链接接受的答案的 SO 线程并没有真正遵循 Magento XML 协议,但是对答案的评论确实如此,我将把它贴在这里,感谢评论的作者:

您需要使用以下 xml 为您希望 Magento “忘记”排序顺序的页面应用布局更新:

<reference name="product_list_toolbar">
  <action method="disableParamsMemorizing" />
</reference>
于 2015-04-01T18:53:39.560 回答
-1

我不认为你可以。如果用户试图改善只影响他们的体验,那么 cookie 会更新,并且在此 cookie 过期之前,排序顺序将始终显示为他们选择的内容。

您可以在每次单击分页时清除 cookie,但如果用户登录,这可能会导致其他问题。

它不仅会删除可能已添加到他们购物篮中的产品。

我建议接受用户对他们希望查看列表的责任,或者简单地删除选项“排序顺序是按名称升序”,例如,他们无法选择它。

于 2012-11-10T13:21:59.920 回答