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.


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

}

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.