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.