Magento类别的排序顺序将存储在cookies中。假设默认排序顺序是按名称升序排序。如果用户将其按降序进行更改,则所有后续页面也将具有此排序顺序。
如何更改此设置,以便用户在下一个类别中看到默认排序顺序?
发布于 2015-04-02 02:53:40
这是一个老问题,但作为谷歌搜索"Magento sort by cookie“的第一个结果出现。所以,本着这样的精神,让我们来回答这个问题!
首先,我们必须做一些调查,但首先我们需要知道我们的假设是什么。
假设
从哪里开始?
当在Magento中遇到这种情况时,请从前端开始,在那里您的输出是可见的。
如果我们查看\app\design\frontend\<your_package>\<your_theme>\template\catalog\product\list\toolbar.phtml
我们可以看到,当"Sort By“选择框改变时,下面的代码会处理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)">部分感兴趣。那么当调用这个方法时会发生什么呢?
再往下看!setLocation在\js\varien\js.js中定义在第30行附近。
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中的几乎任何操作。
然而,为了节省你和我的一些时间,我们也可以假设cookie在任何给定的web框架中都不是经常设置的。在('core/cookie')的Magento目录上运行grep将返回14个文件中的23个命中。这就把范围缩小了,好吧!
在23次命中中,只有4次使用了('core/cookie')->set()方法。在使用set()方法的4种方法中:
\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是Magento中Sales模块的一部分,也是loadValidOrder()方法的一部分,因此它不太可能处理产品列表排序。这给我们留下了一个选择,那就是:
\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框架的标准实践!;)。我们的一个基本假设是不正确的!
DR Answer
按首选项排序保存在该客户机的Magento服务器端会话中,并在用户带着存储在cookie中的ID返回时调用。
为了使Magento不保存它,我们必须执行以下操作:
Magento 'Sort By' - How to make Magento forget which option was selected
我想,不只是链接答案,我会解释如何从你的思路到答案,这是更有价值的,因为现在你知道为什么答案是正确的。享受和快乐的编码。
更新
由于我链接的接受答案的SO线程并不真正遵循Magento XML协议,但答案上的评论确实遵循,因此我将其发布在这里,并将其归功于评论的作者:
您需要使用以下xml对您希望Magento“忘记”排序顺序的页面应用布局更新:
<reference name="product_list_toolbar">
<action method="disableParamsMemorizing" />
</reference>SO User Giel Berkers创建的
发布于 2012-11-10 21:22:00
我想你做不到。如果用户试图改善他们的体验,这只会影响他们,那么cookie将被更新,并且在此cookie过期之前,排序顺序将始终显示为他们所选择的。
您可以在每次单击分页时清除cookie,但如果用户登录,这可能会导致其他问题。
不仅如此,它还会删除可能已添加到其篮子中的产品。
我建议接受用户是有责任的,因为他们希望查看列表,或者简单地删除选项“排序顺序是按名称升序”,这样他们就不能选择它。
https://stackoverflow.com/questions/13322314
复制相似问题