Magento类别排序顺序接缝存储在cookie中。 让我们说默认排序oder是按名称升序。如果用户以降序更改此设置,则所有下一页也将具有此排序顺序。
如何更改此设置,以便用户在下一个类别中看到默认排序顺序?
答案 0 :(得分:2)
这是一个老问题,但是作为“Magento by 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)">
部分感兴趣。那么调用这个方法会发生什么呢?
深入我们去的洞! setLocation
在第30行的\js\varien\js.js
中定义。
function setLocation(url){
window.location.href = url;
}
这很简单,它只是你的基本Javascript新位置指令。
更改此<select>
后,我们会发送一个包含某些参数的新网址 。这是cookie设置的最可能位置。
我们再次特别感兴趣的是url参数?dir=<asc OR desc>&order=<whatever_metric_you_are_sorting_by>
。让我们走出困境,猜测order
参数导致“setCookie”方法或类似的东西被调用。
虽然我们在哪里找到这个?嗯,这很简单:对请求的所有Magento操作都可以从index.php
跟到最后的前端渲染,所以它必须发生在路上的某个地方!您可以使用此方法跟踪Magento中的任何操作。
但是,为了节省您和我一段时间,我们还可以假设在任何给定的Web框架中,Cookie可能都不会 。在grep
的Magento目录上运行('core/cookie')
会在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()
方法的一部分,因此它不太可能处理产品列表排序。这让我们留下了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' - How to make Magento forget which option was selected
我想的不是仅仅链接答案,我会解释如何从你的思路到答案,这更有价值,因为现在你明白为什么答案是正确的。享受和快乐的编码。
<强>更新强>
由于我链接的SO线程接受了答案并不真正遵循Magento XML协议,但是答案的评论,我将在此处发布,并将其归功于评论的作者:
您需要使用以下xml对您希望Magento“忘记”排序顺序的页面应用布局更新:
<reference name="product_list_toolbar">
<action method="disableParamsMemorizing" />
</reference>
答案 1 :(得分:-1)
我认为你不能。如果用户试图改善他们只影响他们的体验,那么cookie会更新,直到此cookie过期,排序顺序将始终显示为他们选择的。
您可以在每次点击分页时清除Cookie,但如果用户已登录,则可能会导致其他问题。
它不仅会删除可能已添加到其购物篮中的产品。
我建议接受用户对他们希望查看列表的责任,或者只是删除“按名称升序排序”选项,以便他们无法选择它。