alışveriş sepeti öğelerini 'updated_at' ile sıralama


15

Ben sepeti öğeleri bu şekilde alıyorum:

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

Böyle bir şey yapmak istiyorum:

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

Bunu yapmanın uygun eflatun yolu nedir?

Ben böyle bir şey yapmak için cazip:

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

Ancak ben kolayca bu değerleri karşılaştırmak için bir demet dateTime nesneleri oluşturmak gerekir ve bu hesaplamalı olarak hantal bir işlem biraz gibi görünüyor.


Onu denedin mi?
— Marius

1
@Marius evet, sayfa bu noktada oluşturulmayı durduruyor.
— easymoden00b

var / log hatalarını kontrol edin veya hata raporlamayı etkinleştirin.
— Marius

@Marius Hiç bu kadar anormal hale geliyorum: a: ​​5: {i: 0; s: 59: "Mage kayıt defteri anahtarı" _singleton / core / resource "zaten var"; i: 1; s: 763: "# 0 /opt/magento/app/Mage.php(225): Mage :: throwException ('Mage kayıt defteri k ...') ..
— easymoden00b

1
cevap güncellendi. lütfen kontrol edin.
— Amit Bera

Yanıtlar:


3

Sıralama ölçütü işlevi yok

nedeniyle getAllItemsgelen arraynesnenin ve uygun benimconcept you cannot sort this by field.

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

Bu durumda, getItemsCollection().herhangi bir alana göre seOrder işlev sıralamasını kullanabilirsiniz.

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

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

Düzenle:

Sınıfı yeniden yazma Mage_Sales_Model_Quote

Bu olacak fikrini daha iyi için yeniden sınıfını Mage_Sales_Model_Quotebu çağrı magento olduğu .in called getAllItems()fonksiyonu ve g etItemsCollection() functiontüm öğeleri almak için duyarlı ana.

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

Sınıfı yeniden yazma:

<?php
class StackExchange_Magento65343_Model_Sales_Quote extends Mage_Sales_Model_Quote
{
}

Sırala için setOrder () işlevini kullanın:

SetOrder () sıralama işlevi alanlara göre madde toplama

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

}

Önemli hata: Tanımlanmamış yönteme çağrı Mage_Sales_Model_Resource_Quote_Item_Collection :: addAttributeToSort () ...
— easymoden00b

bekle kontrol edeceğim.
— Amit Bera

[Güncel cevaba bakınız] gibi bir şey yapmak için cazipim ama bu sadece biraz hantal ve çok eflatun dostu olmayan bir sürü kod daha.
— easymoden00b

0

Çözüm:

Yönteminizi Mage_Sales_Model_Quote::getAllVisibleItemsonunla yeniden yazın :

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

Erken yazılmıştır:

Muhtemelen bu durumda çok iyi bir çözüm değildir, ancak aklınızda bulundurun. (Magento'nun yararlı olabileceği birçok yer var)

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

    return $items;
}

İçinde getData () yöntemi sıralamak istediğiniz herhangi bir alan koymak. Sizin durumunuzda olabilir updated_at. Takılması durumunda updated_atzaman damgasını daha iyi yerleştirin.


timestamp ile Bir DateTime nesnesinin (hangi karşılaştırıcılar üzerinde çalışır) örnekleme demek istediğinizi varsayalım?
— easymoden00b

Denemeniz gerekiyor. Belki o zaman sıralayabilir o zaman updated_at
— zhartaunik

Tamam, ben bir deneyin ... şimdi eğlenceli sadece tek bir şablon dosyası içinde tek bir işlevi kullanmak için karmaşık bir modül oluşturma başlar .. magento bazen çok aptalca: c gibi bir işlev çağrısı için 5 dosya ..
— easymoden00b

Bu modeli izleyerek menüdeki kategorileri sıraladım. Clockwork gibi çalışır
— zhartaunik

iki öğe aynı güncellenmiş süreye sahipse, birbirlerinin üzerine yazarlar.
— easymoden00b
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.