сортування елементів кошика за 'updated_at'


15

Ось як я отримую товари в кошику:

$quote = Mage::getModel('checkout/cart')->getQuote();
$items=$quote->getAllitems();

Я хотів би зробити щось подібне:

$items->sortBy('updated_at','desc');

Який правильний спосіб зробити це?

Мені спокуса зробити щось подібне:

$productArray=array();
foreach($items as $item){
    $product=$item->getProduct();
    array_push($productArray,$product);
}
$productArray = $this->sortArray($productArray);

protected sortArray($productArray){
    ...sort by updated date;
    return $sortedArray
}

Однак мені потрібно створити купу об’єктів dateTime, щоб легко порівняти ці значення, і це, здається, трохи обчислювально громіздка операція.


Ви пробували?
Маріус

1
@Marius так, сторінка припиняє відображення в цей момент.
easymoden00b

перевірте var / log на помилки або увімкніть повідомлення про помилки.
Маріус

@Marius Мені стає так аномально: a: 5: {i: 0; s: 59: "Ключ реєстру маг" _singleton / core / resource "вже існує"; i: 1; s: 763: "# 0 /opt/magento/app/Mage.php(225): Mage :: castException ('Mage register k ...') ..
easymoden00b

1
відповідь оновлена. перевірити.
Аміт Бера

Відповіді:


3

Немає жодної функції сортування за

через те, що getAllItemsйде від arrayоб'єкта і відповідно до могоconcept you cannot sort this by field.

  public function getAllItems()
    {
        $items = array();
        foreach ($this->getItemsCollection() as $item) {
            if (!$item->isDeleted()) {
                $items[] =  $item;
            }
        }
        return $items;
    }

У цьому випадку ви можете використовувати getItemsCollection().потім сортувати функцію seOrder у будь-якому полі

$items=$quote->getItemsCollection()->setOrder('updated_at', 'desc');

foreach ($items as $item) {
    if (!$item->isDeleted()) {
    //Do your code $item
    }
}

Редагувати:

Перепишіть клас Mage_Sales_Model_Quote

Це буде краще уявлення про те , щоб переписати клас Mage_Sales_Model_Quote.В цей виклик Magento є called getAllItems()функція і г etItemsCollection() functionосновний чуйним для отримання всіх елементів.

  <global>
    <models>
      <magento65343>
        <class>StackExchange_Magento65343_Model</class>
        <resourceModel>magento65343_mysql4</resourceModel>
      </magento65343>
            <sales>
                <rewrite>
                    <quote>StackExchange_Magento65343_Model_Sales_Quote</quote>
                </rewrite>
            </sales>
    </models>

Переписати клас:

<?php
class StackExchange_Magento65343_Model_Sales_Quote extends Mage_Sales_Model_Quote
{
}

Використовуйте функцію setOrder () для сортування:

Функція setOrder () сортує колекцію елементів за полями

<?php
class StackExchange_Magento65343_Model_Sales_Quote extends Mage_Sales_Model_Quote
{
     public function getItemsCollection($useCache = true)
    {
        if ($this->hasItemsCollection()) {
            return $this->getData('items_collection');
        }
        if (is_null($this->_items)) {
            $this->_items = Mage::getModel('sales/quote_item')->getCollection()->setOrder('updated_at', 'desc');
            $this->_items->setQuote($this);
        }
        return $this->_items;
    }

}

Фатальна помилка: виклик невизначеного методу Mage_Sales_Model_Resource_Quote_Item_Collection :: addAttributeToSort () ...
easymoden00b

зачекаю, я перевірю.
Аміт Бера

Мені спокуса зробити щось на кшталт [див. Оновлену відповідь], але це просто ще купон коду, який трохи непростий і не дуже магенто-привітний.
easymoden00b

0

Рішення:

Перепишіть свій метод за Mage_Sales_Model_Quote::getAllVisibleItemsдопомогою нього:

public function getAllVisibleItems()
{
    $items = array();
    foreach ($this->getItemsCollection() as $item) {
        if (!$item->isDeleted() && !$item->getParentItemId()) {
            $timeStamp = Mage::getModel('core/date')->timestamp($item->getData('updated_at'));
            $items[$timeStamp] =  $item;
        }
        ksort($items);
    }
    return $items;
}

Написано рано:

Напевно, це не дуже вдале рішення в цій ситуації, але пам’ятайте про це. (У Magento є багато таких місць, де це може бути корисним)

public function getAllItems()
{
    $items = array();
    foreach ($this->getItemsCollection() as $item) {
        if (!$item->isDeleted()) {
            $items[$item->getData('...')] =  $item;
        }
    }
    ksort($items)

    return $items;
}

Всередині методу getData () поставте будь-яке поле, яке ви хочете сортувати. У вашому випадку це може бути updated_at. У разі вставки updated_atкраще вставити її часову позначку.


під часовою позначкою Я припускаю, що ви маєте на увазі об'єкт DateTime (над яким працюють компаратори)?
easymoden00b

Вам потрібно експериментувати. Можливо, він може сортувати, коли ви помістите там updated_at
zhartaunik

Гаразд, я спробую ... зараз починається задоволення від створення складного модуля, просто з використання однієї функції в одному файлі шаблону. Магенто буває настільки дурним: c, як 5 файлів для одного виклику функції ..
easymoden00b

Дотримуючись цієї схеми, я сортував категорії в меню. Працює як годинниковий механізм
жартаунік

якщо два елементи мають однаковий оновлений час, вони замінять один одного.
easymoden00b
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.