сортировка товаров по корзине «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 для того, чтобы легко сравнивать эти значения, и это кажется немного трудоемкой вычислительной операцией.

easymoden00b
источник
Вы пробовали это?
Мариус
1
@Marus Да, на этом этапе страница перестает отображаться.
easymoden00b
проверьте var / log на наличие ошибок или включите отчет об ошибках.
Мариус
@Marius Я получаю очень аномальное: a: 5: {i: 0; s: 59: «ключ реестра Mage» _singleton / core / resource «уже существует»; i: 1; s: 763: «# 0 /opt/magento/app/Mage.php(225): Mage :: throwException ('Mage registry 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
подожди, я проверю.
Амит Бера
Я испытываю желание сделать что-то вроде [см. Обновленный ответ], но это всего лишь несколько больше кода, который немного громоздкий и не очень благоприятный для magento.
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лучше вставить свою метку времени.

zhartaunik
источник
под временной отметкой я предполагаю, что вы имеете в виду создание экземпляра объекта DateTime (над которым работают компараторы)?
easymoden00b
Вам нужно экспериментировать. Может быть, это можно отсортировать, когда вы там поставили updated_at
Жартауник
Хорошо, я попробую ... теперь начинается забавное создание сложного модуля для использования одной функции в одном файле шаблона. Иногда magento настолько глуп: c 5 файлов для одного вызова функции ...
easymoden00b
Следуя этой схеме, я отсортировал категории в меню. Работает как по маслу
жартауник
если два элемента имеют одинаковое время обновления, они будут перезаписывать друг друга.
easymoden00b