จัดเรียงรายการในรถเข็นโดย 'updated_at'


15

นี่คือวิธีที่ฉันได้รับสินค้าในตะกร้า:

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

ฉันต้องการทำสิ่งนี้:

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

วีโอไอพีที่เหมาะสมในการทำเช่นนี้คืออะไร?

ฉันอยากทำสิ่งนี้:

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

อย่างไรก็ตามฉันจำเป็นต้องสร้างกลุ่มของวัตถุ DateTime เพื่อเปรียบเทียบค่าเหล่านี้ได้อย่างง่ายดายและดูเหมือนว่าเป็นการดำเนินการที่ยุ่งยาก


คุณลองหรือยัง
Marius

1
@Marius ใช่หน้าเว็บหยุดแสดงผล ณ จุดนี้
easymoden00b

ตรวจสอบข้อผิดพลาด var / log หรือเปิดใช้งานการรายงานข้อผิดพลาด
Marius

@Marius ฉันผิดปกติมาก: a: 5: {i: 0; s: 59: "Mage registry key" _singleton / core / resource "มีอยู่แล้ว"; i: 1; s: 763: "# 0 /opt/magento/app/Mage.php(225): Mage :: throwException ('Mage registry k ... ') ..
easymoden00b

1
คำตอบอัพเดท. โปรดตรวจสอบ
Amit Bera

คำตอบ:


3

ไม่มีฟังก์ชั่นในการจัดเรียง

เพราะgetAllItemsมาจากarrayวัตถุและตามฉันconcept you cannot sort this by field.

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

ในกรณีนี้คุณสามารถใช้getItemsCollection().จากนั้นใช้ฟังก์ชั่น seOrder เรียงตามฟิลด์ใด ๆ

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

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

แก้ไข:

เขียนคลาส Mage_Sales_Model_Quote

มันจะเป็นการดีกว่าถ้าคุณจะเขียน class ใหม่Mage_Sales_Model_Quoteใน magento การโทรนี้เป็นcalled getAllItems()ฟังก์ชั่นและetItemsCollection() functionตอบสนองหลักg สำหรับการรับไอเท็มทั้งหมด

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

เขียนซ้ำชั้น:

<?php
class StackExchange_Magento65343_Model_Sales_Quote extends Mage_Sales_Model_Quote
{
}

ใช้ฟังก์ชัน setOrder () เพื่อจัดเรียง:

setOrder ()ฟังก์ชั่นการจัดเรียงคอลเลกชันรายการจากสนาม

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

}

ข้อผิดพลาดร้ายแรง: การโทรไปยังวิธีที่ไม่ได้กำหนด Mage_Sales_Model_Resource_Quote_Item_Collection :: addAttributeToSort () ...
easymoden00b

รอฉันจะตรวจสอบ
Amit Bera

ฉันอยากทำอะไรบางอย่างเช่น [ดูคำตอบที่อัปเดตล่าสุด] แต่นั่นเป็นเพียงรหัสอีกจำนวนหนึ่งที่ค่อนข้างเทอะทะและไม่เป็นมิตรกับวีโอไอพี
easymoden00b

0

วิธีการแก้:

เขียนวิธีการของคุณใหม่Mage_Sales_Model_Quote::getAllVisibleItemsด้วย:

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

เขียนเร็ว:

อาจไม่ใช่วิธีแก้ปัญหาที่ดีมากในสถานการณ์นี้ แต่โปรดจำไว้ (วีโอไอพีมีสถานที่ดังกล่าวมากมายซึ่งสามารถใช้ได้เต็มรูปแบบ)

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

    return $items;
}

ในเมธอด getData () ให้คุณใส่ข้อมูลที่คุณต้องการเรียงลำดับ updated_atในกรณีของคุณก็สามารถ ในกรณีของการแทรกที่updated_atดีกว่าแทรกการประทับเวลาของมัน


โดยการประทับเวลาฉันคิดว่าคุณหมายถึงการสร้างอินสแตนซ์ของวัตถุ DateTime (ซึ่งตัวเปรียบเทียบทำงาน)
easymoden00b

คุณต้องทำการทดสอบ อาจจะสามารถเรียงลำดับเมื่อคุณใส่ที่นั่น updated_at
zhartaunik

โอเคฉันจะลองดู ... ตอนนี้ความสนุกเริ่มต้นขึ้นในการสร้างโมดูลที่ซับซ้อนเพียงแค่ใช้ฟังก์ชั่นเดียวภายในไฟล์เทมเพลตเดียว .. วีโอไอพีนั้นโง่มากในบางครั้ง: c เช่น 5 ไฟล์สำหรับการเรียกใช้ฟังก์ชั่นเดียว ..
easymoden00b

ตามรูปแบบนี้ฉันจัดเรียงหมวดหมู่ในเมนู ทำงานเหมือนเครื่องจักร
zhartaunik

หากสองรายการมีเวลาอัปเดตเหมือนกันพวกเขาจะเขียนทับกัน
easymoden00b
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.