Magento 类别排序顺序接缝存储在 cookie 中。假设默认排序顺序是按名称升序。如果用户将其更改为降序,则所有下一页也将具有此排序顺序。
如何更改此设置,以便用户在下一个类别中看到默认排序顺序?
Magento 类别排序顺序接缝存储在 cookie 中。假设默认排序顺序是按名称升序。如果用户将其更改为降序,则所有下一页也将具有此排序顺序。
如何更改此设置,以便用户在下一个类别中看到默认排序顺序?
这是一个老问题,但作为“Magento 按 cookie 排序”的第一个 Google 结果出现。所以,本着 SO 的精神,让我们来回答吧!
首先,我们必须进行一些调查,但首先我们需要知道我们的假设是什么。
假设
从哪儿开始?
如果在 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.php
和Guest.php
。由于Guest.php
是Sales
Magento 中模块的一部分和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>
我不认为你可以。如果用户试图改善只影响他们的体验,那么 cookie 会更新,并且在此 cookie 过期之前,排序顺序将始终显示为他们选择的内容。
您可以在每次单击分页时清除 cookie,但如果用户登录,这可能会导致其他问题。
它不仅会删除可能已添加到他们购物篮中的产品。
我建议接受用户对他们希望查看列表的责任,或者简单地删除选项“排序顺序是按名称升序”,例如,他们无法选择它。