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.


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

}

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.