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.


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

}

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.