sortowanie przedmiotów w koszyku według „updated_at”

15

W ten sposób otrzymuję przedmioty z koszyka:

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

Chciałbym zrobić coś takiego:

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

Jaki jest właściwy sposób, aby to zrobić?

Kusi mnie, aby zrobić coś takiego:

$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
}

Musiałbym jednak utworzyć kilka obiektów dateTime, aby łatwo porównać te wartości, co wydaje się trochę skomplikowane obliczeniowo.

easymoden00b
źródło
Próbowałeś?
Marius
1
@Marius tak, strona przestaje się renderować w tym momencie.
easymoden00b
sprawdź var / log pod kątem błędów lub włącz raportowanie błędów.
Marius
@Marius Dostaję coraz bardziej anomalne: a: 5: {i: 0; s: 59: „Klucz rejestru maga” _singleton / core / resource "już istnieje"; i: 1; s: 763: "# 0 /opt/magento/app/Mage.php(225): Mage :: throwException ('Mage register k ...') ..
easymoden00b 30.04.2015
1
odpowiedź zaktualizowana. proszę sprawdzić.
Amit Bera

Odpowiedzi:

3

Brak funkcji sortowania według

ponieważ getAllItemspochodzą z arrayprzedmiotu i zgodnie z moimconcept you cannot sort this by field.

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

W takim przypadku możesz użyć getItemsCollection().funkcji sortowania seOrder według dowolnego pola

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

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

Edytować:

Przepisz klasę Mage_Sales_Model_Quote

Będzie to lepszy pomysł, aby przerobić klasę Mage_Sales_Model_Quote.W to wezwanie Magento jest called getAllItems()funkcja i g etItemsCollection() functiongłówny czuły dla uzyskać wszystkie elementy.

  <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>

Przepisz klasę:

<?php
class StackExchange_Magento65343_Model_Sales_Quote extends Mage_Sales_Model_Quote
{
}

Użyj funkcji setOrder () do sortowania:

Funkcja setOrder () sortuje kolekcję przedmiotów według pól

<?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;
    }

}
Amit Bera
źródło
Błąd krytyczny: wywołanie niezdefiniowanej metody Mage_Sales_Model_Resource_Quote_Item_Collection :: addAttributeToSort () ...
easymoden00b
czekaj sprawdzę.
Amit Bera
Kusi mnie, aby zrobić coś takiego [zobacz zaktualizowaną odpowiedź], ale to tylko o wiele więcej kodu, który jest nieco nieporęczny i niezbyt przyjazny dla magento.
easymoden00b
0

Rozwiązanie:

Przepisz Mage_Sales_Model_Quote::getAllVisibleItemsz nim swoją metodę :

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;
}

Napisane wcześnie:

Prawdopodobnie nie jest to bardzo dobre rozwiązanie w tej sytuacji, ale pamiętaj o tym. (Magento ma wiele takich miejsc, w których może to być przydatne)

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

    return $items;
}

Wewnątrz metody getData () umieść dowolne pole, które chcesz posortować. W twoim przypadku może być updated_at. W przypadku wstawiania updated_atlepiej wstaw jego znacznik czasu.

zhartaunik
źródło
przez znacznik czasu Zakładam, że masz na myśli instancję obiektu DateTime (na którym działają komparatory)?
easymoden00b
Musisz eksperymentować. Może da się to uporządkować, kiedy tam zostaniesz updated_at
zhartaunik
Dobra, spróbuję ... teraz zaczyna się zabawa w tworzenie złożonego modułu, aby użyć tylko jednej funkcji w jednym pliku szablonu. Magento jest czasem tak głupie: jak 5 plików dla jednego wywołania funkcji ..
easymoden00b
Zgodnie z tym wzorcem posortowałem kategorie w menu. Działa jak w zegarku
zhartaunik
jeśli dwa elementy mają ten sam zaktualizowany czas, wówczas zostaną nadpisane.
easymoden00b