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.