ordenar los artículos del carrito por 'updated_at'

15

Así es como obtengo los artículos del carrito:

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

Me gustaría hacer algo como esto:

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

¿Cuál es la forma adecuada de hacer Magento?

Estoy tentado de hacer algo como esto:

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

Sin embargo, necesitaría crear un montón de objetos dateTime para comparar fácilmente estos valores y esto parece ser una operación computacionalmente engorrosa.

easymoden00b
fuente
¿Lo intentaste?
Marius
1
@ Mario, sí, la página deja de mostrarse en este momento.
easymoden00b
verifique el var / log para ver si hay errores o active el informe de errores.
Marius
@Marius Estoy obteniendo el siempre anómalo: a: 5: {i: 0; s: 59: "La clave de registro de Mage" _singleton / core / resource "ya existe"; i: 1; s: 763: "# 0 /opt/magento/app/Mage.php(225): Mage :: throwException ('Mage Registry k ...') ..
easymoden00b
1
respuesta actualizada .por favor verifique.
Amit Bera

Respuestas:

3

No hay función para ordenar el por

por getAllItemsprovenir arrayde un objeto y según miconcept you cannot sort this by field.

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

En este caso, puede usar y getItemsCollection().luego usar la función seOrder ordenar por cualquier campo

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

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

Editar:

Reescribir clase Mage_Sales_Model_Quote

Será mejor idea para reescribir la clase Mage_Sales_Model_Quote.En este Magento llamada es called getAllItems()función y getItemsCollection() function principal de respuesta para obtener todos los elementos.

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

Reescribir clase:

<?php
class StackExchange_Magento65343_Model_Sales_Quote extends Mage_Sales_Model_Quote
{
}

Use la función setOrder () para Ordenar:

La función setOrder () ordena la colección de elementos por campos

<?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
fuente
Error grave: llamada al método indefinido Mage_Sales_Model_Resource_Quote_Item_Collection :: addAttributeToSort () ...
easymoden00b
Espera, lo comprobaré.
Amit Bera
Estoy tentado a hacer algo como [ver respuesta actualizada] pero eso es solo un montón más de código que es poco manejable y no muy amigable con los magento.
easymoden00b
0

Solución:

Reescribe tu método Mage_Sales_Model_Quote::getAllVisibleItemscon él:

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

Escrito temprano:

Probablemente no sea una muy buena solución en esta situación, pero tenlo en cuenta. (Magento tiene muchos de esos lugares donde puede ser útil)

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

    return $items;
}

Dentro del método getData (), coloque cualquier campo que desee ordenar. En tu caso puede ser updated_at. En caso de insertar updated_atmejor inserte su marca de tiempo.

zhartaunik
fuente
por marca de tiempo, ¿supongo que te refieres a la creación de instancias de un objeto DateTime (sobre el que trabajan los comparadores)?
easymoden00b
Necesitas experimentar. Tal vez se pueda ordenar cuando pones allí updated_at
zhartaunik
Bien, lo intentaré ... ahora comienza la diversión de crear un módulo complejo solo para usar una sola función dentro de un solo archivo de plantilla ... magento es tan estúpido a veces: c como 5 archivos para una llamada de función ...
easymoden00b
Siguiendo este patrón, clasifiqué las categorías en el menú. Corre como un reloj
zhartaunik
Si dos elementos tienen la misma hora actualizada, se sobrescribirán entre sí.
easymoden00b