Sortierung der Warenkorbartikel nach 'updated_at'

15

So erhalte ich die Warenkorbartikel:

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

Ich würde gerne so etwas machen:

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

Was ist der richtige Weg, dies mit Magento zu tun?

Ich bin versucht, so etwas zu tun:

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

Allerdings müsste ich eine Reihe von dateTime-Objekten erstellen, um diese Werte leicht vergleichen zu können, und dies scheint eine etwas rechenintensive Operation zu sein.

easymoden00b
quelle
Hast Du es versucht?
Marius
1
@Marius ja, die Seite wird an dieser Stelle nicht mehr gerendert.
easymoden00b
Überprüfen Sie das var / log auf Fehler oder aktivieren Sie die Fehlerberichterstattung.
Marius
@Marius Ich bekomme das noch so anormale: a: 5: {i: 0; s: 59: "Magier-Registrierungsschlüssel" _singleton / core / resource "existiert bereits"; i: 1; s: 763: "# 0 /opt/magento/app/Mage.php(225): Mage :: throwException ('Mage-Registrierung k ...') ..
easymoden00b
1
Antwort aktualisiert. Bitte überprüfen.
Amit Bera

Antworten:

3

Es gibt keine Funktion zum Sortieren nach

wegen des getAllItemsKommens vom arrayGegenstand und gemäß meinemconcept you cannot sort this by field.

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

In diesem Fall können Sie die getItemsCollection().Funktion sort by any Field verwenden

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

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

Bearbeiten:

Schreiben Sie die Klasse Mage_Sales_Model_Quote um

Es ist besser , die Klasse umzuschreiben.Mage_Sales_Model_Quote In diesem Aufruf ist magento called getAllItems()function und g etItemsCollection() functionmain responsive, um alle Items zu bekommen.

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

Klasse umschreiben:

<?php
class StackExchange_Magento65343_Model_Sales_Quote extends Mage_Sales_Model_Quote
{
}

Verwenden Sie die Funktion setOrder () für Sortieren:

Die Funktion setOrder () sortiert die Elementauflistung nach Feldern

<?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
quelle
Schwerwiegender Fehler: Aufruf der undefinierten Methode Mage_Sales_Model_Resource_Quote_Item_Collection :: addAttributeToSort () ...
easymoden00b
warte ich werde nachsehen
Amit Bera
Ich bin versucht, etwas wie [siehe aktualisierte Antwort] zu tun, aber das ist nur eine Menge mehr Code, der etwas unhandlich und nicht sehr magento-freundlich ist.
easymoden00b
0

Lösung:

Schreiben Sie Ihre Methode Mage_Sales_Model_Quote::getAllVisibleItemsdamit um:

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

Früh geschrieben:

Wahrscheinlich ist es in dieser Situation keine sehr gute Lösung, aber denken Sie daran. (Magento hat viele solche Orte, an denen es nützlich sein kann)

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

    return $items;
}

In die getData () -Methode wird ein beliebiges Feld eingefügt, das sortiert werden soll. In deinem Fall kann es sein updated_at. Beim Einfügen updated_atbesser seinen Zeitstempel einfügen.

zhartaunik
quelle
Unter Zeitstempel verstehe ich die Instanziierung eines DateTime-Objekts (woran arbeiten die Komparatoren?).
easymoden00b
Sie müssen experimentieren. Vielleicht kann es sortieren, wenn Sie dort 30.04.15
zhartaunik
Okay, ich werde es versuchen ... jetzt beginnt der Spaß, ein komplexes Modul zu erstellen, nur um eine einzelne Funktion in einer einzelnen Vorlagendatei zu verwenden. Magento ist manchmal so dumm: c wie 5 Dateien für einen Funktionsaufruf.
easymoden00b
Nach diesem Muster habe ich die Kategorien im Menü sortiert. Läuft wie am
Schnürchen
Wenn zwei Elemente dieselbe Aktualisierungszeit haben, überschreiben sie sich gegenseitig.
easymoden00b