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.