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

时间:2012-11-10 13:07:57

标签: magento

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

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

2 个答案:

答案 0 :(得分:2)

这是一个老问题,但是作为“Magento by 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)">部分感兴趣。那么调用这个方法会发生什么呢?

深入我们去的洞! 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.phpGuest.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,但如果用户已登录,则可能会导致其他问题。

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

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