ordinamento degli articoli del carrello in base a 'updated_at'


15

Ecco come sto ottenendo gli articoli del carrello:

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

Mi piacerebbe fare qualcosa del genere:

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

Qual è il modo magento corretto per farlo?

Sono tentato di fare qualcosa del genere:

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

Tuttavia, avrei bisogno di creare un mucchio di oggetti dateTime per confrontare facilmente questi valori e questa sembra essere un'operazione un po 'complicata dal punto di vista computazionale.


Hai provato?
Marius

1
@ Mario sì, la pagina smette di essere visualizzata a questo punto.
easymoden00b

controllare var / log per errori o abilitare la segnalazione degli errori.
Marius

@Marius Sto diventando sempre così anomalo: a: 5: {i: 0; s: 59: "La chiave di registro del mago" _singleton / core / resource "esiste già"; i: 1; s: 763: "# 0 /opt/magento/app/Mage.php(225): Mage :: throwException ('Mage register k ...') ..
easymoden00b

1
rispondi aggiornato. per favore controlla.
Amit Bera

Risposte:


3

Non ci sono funzioni per ordinare il

a causa della getAllItemsprovenienza arraydell'oggetto e secondo il mioconcept you cannot sort this by field.

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

In questo caso, è possibile utilizzare getItemsCollection().quindi utilizzare l'ordinamento della funzione seOrder in qualsiasi campo

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

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

Modificare:

Riscrivi la classe Mage_Sales_Model_Quote

Sarà meglio idea di riscrivere la classe Mage_Sales_Model_Quote. In questa chiamata magento è la called getAllItems()funzione più etItemsCollection() functionimportante per ottenere tutti gli elementi.

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

Classe di riscrittura:

<?php
class StackExchange_Magento65343_Model_Sales_Quote extends Mage_Sales_Model_Quote
{
}

Utilizzare la funzione setOrder () per Ordinamento:

La funzione setOrder () ordina la raccolta degli articoli per campi

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

}

Errore irreversibile: chiamata al metodo indefinito Mage_Sales_Model_Resource_Quote_Item_Collection :: addAttributeToSort () ...
easymoden00b

aspetta controllerò.
Amit Bera

Sono tentato di fare qualcosa come [vedi risposta aggiornata] ma è solo un po 'più di codice che è leggermente ingombrante e non molto magento-friendly.
easymoden00b

0

Soluzione:

Riscrivi il tuo metodo Mage_Sales_Model_Quote::getAllVisibleItemscon esso:

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

Scritto in anticipo:

Probabilmente non è un'ottima soluzione in questa situazione, ma tienilo a mente. (Magento ha molti di questi posti dove può essere utile)

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

    return $items;
}

All'interno del metodo getData () inserisci tutti i campi che desideri ordinare. Nel tuo caso può essere updated_at. In caso di inserimento updated_atmeglio inserire la sua data e ora.


per timestamp suppongo che intendi l'istanza di un oggetto DateTime (di cui i comparatori lavorano)?
easymoden00b

Devi sperimentare. Forse può essere ordinato quando ci metti update_at
zhartaunik

Ok, ci proverò ... ora inizia il divertimento della creazione di un modulo complesso solo per usare una singola funzione all'interno di un singolo file modello .. Magento a volte è così stupido: c come 5 file per una chiamata di funzione ..
easymoden00b

Seguendo questo schema ho ordinato le categorie nel menu. Funziona come un orologio
zhartaunik

se due elementi hanno lo stesso tempo aggiornato, si sovrascriveranno l'un l'altro.
easymoden00b
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.