2012-11-10 69 views

回答

-1

我不認爲你可以。如果用戶試圖改進他們隻影響他們的體驗,那麼cookie會被更新,直到這個cookie過期,排序順序將始終顯示爲他們已經選擇。

你可以清除每次點擊分頁時的Cookie,但如果用戶登錄,這可能會導致其他問題。

不僅如此,它會刪除並可能已被添加到他們的購物籃的產品。

我建議接受用戶對他們希望查看列表作出響應,或者乾脆刪除「按名稱升序排序」選項,以便他們無法選擇它。

+0

但這沒有意義的用戶體驗。 –

+0

可能你需要更詳細地解釋,但是從我收集的內容來看,如果用戶希望以某種方式顯示搜索項目,那就是他們的選擇。再次,如果一個Cookie存儲它,你必須刪除頁面加載的cookie或不給用戶在第一個地方 – GarytheWorm

1

這是一個古老的問題,但作爲第一個谷歌結果「Magento按餅乾排序」出現。所以,本着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\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中的任何操作。

    但是,爲了節省您和我一些時間,我們還可以假設在任何給定的Web框架中cookie可能不會被設置爲,即。在Magento目錄上運行grep('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.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> 
    
  • +0

    哇,什麼答案!謝謝 – grindking