mengurutkan item keranjang berdasarkan 'updated_at'

15

Beginilah cara saya mendapatkan item keranjang:

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

Saya ingin melakukan sesuatu seperti ini:

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

Apa cara magento yang tepat untuk melakukan ini?

Saya tergoda untuk melakukan sesuatu seperti ini:

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

Namun saya perlu membuat banyak objek dateTime untuk dengan mudah membandingkan nilai-nilai ini dan ini tampaknya sedikit operasi yang rumit secara komputasi.

easymoden00b
sumber
Apakah kamu sudah mencobanya?
Marius
1
@Marius ya, halaman berhenti render pada titik ini.
easymoden00b
periksa var / log untuk kesalahan atau aktifkan pelaporan kesalahan.
Marius
@Marius Saya mendapatkan yang sangat aneh: a: 5: {i: 0; s: 59: "Kunci registri mage" _singleton / core / resource "sudah ada"; i: 1; s: 763: "# 0 /opt/magento/app/Mage.php(225): Mage :: throwException ('Mage registry k ...') ..
easymoden00b
1
jawab yang diperbarui. harap periksa.
Amit Bera

Jawaban:

3

Tidak ada fungsi untuk mengurutkan berdasarkan

karena getAllItemsberasal dari arrayobjek dan menurut sayaconcept you cannot sort this by field.

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

Dalam hal ini, Anda dapat menggunakan getItemsCollection().lalu menggunakan fungsi sortir berdasarkan bidang apa pun

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

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

Edit:

Tulis ulang kelas Mage_Sales_Model_Quote

Akan lebih baik untuk menulis ulang kelas Mage_Sales_Model_Quote. Dalam panggilan ini magento called getAllItems()berfungsi dan etItemsCollection() functionresponsif utama untuk mendapatkan semua item.

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

Kelas menulis ulang:

<?php
class StackExchange_Magento65343_Model_Sales_Quote extends Mage_Sales_Model_Quote
{
}

Gunakan fungsi setOrder () untuk Sortir:

Fungsi setOrder () mengurutkan koleksi item berdasarkan bidang

<?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
sumber
Kesalahan fatal: Panggil ke metode tak terdefinisi Mage_Sales_Model_Resource_Quote_Item_Collection :: addAttributeToSort () ...
easymoden00b
tunggu aku akan periksa.
Amit Bera
Saya tergoda untuk melakukan sesuatu seperti [lihat jawaban yang diperbarui] tetapi itu hanya banyak kode yang sedikit sulit digunakan dan tidak terlalu ramah-magento.
easymoden00b
0

Larutan:

Tulis ulang metode Anda Mage_Sales_Model_Quote::getAllVisibleItemsdengan itu:

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

Ditulis lebih awal:

Mungkin ini bukan solusi yang sangat baik dalam situasi ini, tetapi ingatlah itu. (Magento memiliki banyak tempat seperti itu di mana itu bisa berguna)

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

    return $items;
}

Di dalam metode getData () masukkan bidang apa saja yang ingin Anda urutkan. Dalam kasus Anda itu bisa updated_at. Dalam hal memasukkan updated_atlebih baik masukkan stempel waktunya.

zhartaunik
sumber
oleh timestamp Saya anggap Anda maksud Instantiation objek DateTime (yang komparator bekerja pada)?
easymoden00b
Anda perlu bereksperimen. Mungkin itu bisa disortir ketika Anda menaruh
pembaruan_at di
Oke, saya akan mencobanya ... sekarang kesenangan dimulai dengan membuat modul yang kompleks hanya untuk menggunakan satu fungsi dalam satu file templat .. magento terkadang sangat bodoh: c seperti 5 file untuk satu panggilan fungsi ..
easymoden00b
Mengikuti pola ini, saya mengurutkan kategori dalam menu. Berjalan seperti jarum jam
zhartaunik
jika dua item memiliki waktu pembaruan yang sama maka mereka akan saling menimpa.
easymoden00b