Magento類別排序順序接口存儲在cookie中。 可以說默認排序或按名稱升序。如果用戶在降序中更改此值,則所有下一頁也將具有此排序順序。Magento 1.4.1.1存儲在cookie中的類別排序順序
我該如何改變這種情況,以便用戶在下一個類別中看到默認的排序順序?
Magento類別排序順序接口存儲在cookie中。 可以說默認排序或按名稱升序。如果用戶在降序中更改此值,則所有下一頁也將具有此排序順序。Magento 1.4.1.1存儲在cookie中的類別排序順序
我該如何改變這種情況,以便用戶在下一個類別中看到默認的排序順序?
我不認爲你可以。如果用戶試圖改進他們隻影響他們的體驗,那麼cookie會被更新,直到這個cookie過期,排序順序將始終顯示爲他們已經選擇。
你可以清除每次點擊分頁時的Cookie,但如果用戶登錄,這可能會導致其他問題。
不僅如此,它會刪除並可能已被添加到他們的購物籃的產品。
我建議接受用戶對他們希望查看列表作出響應,或者乾脆刪除「按名稱升序排序」選項,以便他們無法選擇它。
這是一個古老的問題,但作爲第一個谷歌結果「Magento按餅乾排序」出現。所以,本着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
在\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.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>
哇,什麼答案!謝謝 – grindking
但這沒有意義的用戶體驗。 –
可能你需要更詳細地解釋,但是從我收集的內容來看,如果用戶希望以某種方式顯示搜索項目,那就是他們的選擇。再次,如果一個Cookie存儲它,你必須刪除頁面加載的cookie或不給用戶在第一個地方 – GarytheWorm