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.


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

}

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.