首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >存储在cookie中的Magento 1.4.1.1类别排序顺序

问存储在cookie中的Magento 1.4.1.1类别排序顺序
EN

Stack Overflow用户
提问于 2012-11-10 21:07:57
回答 2查看 719关注 0票数 0

Magento类别的排序顺序将存储在cookies中。假设默认排序顺序是按名称升序排序。如果用户将其按降序进行更改,则所有后续页面也将具有此排序顺序。

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

EN

回答 2

Stack Overflow用户

发布于 2015-04-02 02:53:40

这是一个老问题,但作为谷歌搜索"Magento sort by cookie“的第一个结果出现。所以,本着这样的精神,让我们来回答这个问题!

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

假设

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

从哪里开始?

当在Magento中遇到这种情况时,请从前端开始,在那里您的输出是可见的。

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

我们可以看到,当"Sort By“选择框改变时,下面的代码会处理javascript操作。

代码语言: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行附近。

代码语言:javascript
复制
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

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

代码语言:javascript
复制
// 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“忘记”排序顺序的页面应用布局更新:

代码语言:javascript
复制
<reference name="product_list_toolbar">
  <action method="disableParamsMemorizing" />
</reference>

SO User Giel Berkers创建的

票数 2
EN

Stack Overflow用户

发布于 2012-11-10 21:22:00

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

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

不仅如此,它还会删除可能已添加到其篮子中的产品。

我建议接受用户是有责任的,因为他们希望查看列表,或者简单地删除选项“排序顺序是按名称升序”,这样他们就不能选择它。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13322314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档