classificando itens do carrinho por 'updated_at'

15

É assim que estou recebendo os itens do carrinho:

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

Eu gostaria de fazer algo assim:

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

Qual é a maneira apropriada de fazer isso?

Estou tentado a fazer algo assim:

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

No entanto, eu precisaria criar um monte de objetos dateTime para comparar facilmente esses valores e isso parece ser um pouco de uma operação computacionalmente complicada.

easymoden00b
fonte
Você tentou?
Marius
11
@ Marius sim, a página para de renderizar neste momento.
precisa saber é o seguinte
verifique se há erros no var / log ou ative o relatório de erros.
Marius
@ Marius Estou ficando cada vez mais anômalo: a: 5: {i: 0; s: 59: "Chave de registro Mage" _singleton / core / resource "já existe"; i: 1; s: 763: "# 0 /opt/magento/app/Mage.php(225): Mage :: throwException ('Mage registry k ...') ..
easymoden00b
11
resposta atualizada. por favor, verifique.
Amit Bera

Respostas:

3

Não há função para classificar por

por causa da getAllItemsvinda de arrayde objeto e de acordo com minhaconcept you cannot sort this by field.

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

Nesse caso, você pode usar getItemsCollection().e usar a função seOrder classificar por qualquer campo

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

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

Editar:

Reescrever a classe Mage_Sales_Model_Quote

Vai idéia melhor para reescrever classe Mage_Sales_Model_Quote.Neste magento chamada é called getAllItems()função e g etItemsCollection() functionprincipal sensível para obter todos os itens.

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

Reescrever a classe:

<?php
class StackExchange_Magento65343_Model_Sales_Quote extends Mage_Sales_Model_Quote
{
}

Use a função setOrder () para Classificar:

A função setOrder () classifica a coleção de itens 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
fonte
Erro fatal: Chame para o método indefinido Mage_Sales_Model_Resource_Quote_Item_Collection :: addAttributeToSort () ...
easymoden00b
espere eu vou verificar.
Amit Bera
Estou tentado a fazer algo como [consulte a resposta atualizada], mas isso é apenas um monte de código que é um pouco pesado e não muito amigável ao magento.
Easyden00b
0

Solução:

Reescreva seu método Mage_Sales_Model_Quote::getAllVisibleItemscom ele:

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

Provavelmente não é uma solução muito boa nessa situação, mas lembre-se disso. (Magento tem muitos lugares onde pode ser útil)

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

    return $items;
}

Dentro do método getData (), coloque qualquer campo que você queira classificar. No seu caso, pode ser updated_at. No caso de inserir updated_atmelhor, insira seu carimbo de data / hora.

zhartaunik
fonte
por timestamp Suponho que você queira dizer a instanciação de um objeto DateTime (dos quais os comparadores trabalham)?
precisa saber é o seguinte
Você precisa experimentar. Talvez seja possível classificar quando você colocar lá updated_at
zhartaunik
Ok, vou tentar ... agora começa a diversão de criar um módulo complexo apenas para usar uma única função dentro de um único arquivo de modelo .. magento às vezes é tão estúpido: c como 5 arquivos para uma chamada de função ..
Easyden00b
Seguindo esse padrão, classifiquei as categorias no menu. Funciona como um relógio
zhartaunik
se dois itens tiverem o mesmo horário atualizado, eles se substituirão.
Easyden00b