sắp xếp các mục giỏ hàng theo 'update_at'


15

Đây là cách tôi nhận được các mặt hàng giỏ hàng:

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

Tôi muốn làm một cái gì đó như thế này:

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

Cách magento thích hợp để làm điều này là gì?

Tôi muốn làm một cái gì đó như thế này:

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

Tuy nhiên, tôi cần phải tạo ra một loạt các đối tượng dateTime để dễ dàng so sánh các giá trị này và đây có vẻ là một hoạt động rườm rà tính toán.


Bạn đã thử à?
Marius

1
@Marius có, trang dừng hiển thị tại thời điểm này.
Easymoden00b

kiểm tra var / log để tìm lỗi hoặc cho phép báo cáo lỗi.
Marius

@Marius Tôi đang nhận được sự bất thường: a: 5: {i: 0; s: 59: "Khóa đăng ký pháp sư" _singleton / core / resource "đã tồn tại"; i: 1; s: 763: "# 0 /opt/magento/app/Mage.php(225): Mage :: throwException ('Mage registry k ...') ..
Easymoden00b

1
Trả lời cập nhật. Xin vui lòng kiểm tra.
Amit Bera

Câu trả lời:


3

Không có chức năng sắp xếp theo

bởi vì getAllItemsđến từ arrayđối tượng và theo tôiconcept you cannot sort this by field.

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

Trong trường hợp này, bạn có thể sử dụng getItemsCollection().sau đó sử dụng sắp xếp chức năng seOrder theo bất kỳ Trường nào

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

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

Biên tập:

Viết lại lớp Mage_Sales_Model_Quote

Nó sẽ tốt hơn để viết lại lớp Mage_Sales_Model_Quote. Trong cuộc gọi này magento là called getAllItems()chức năng và g etItemsCollection() functionđáp ứng chính để có được tất cả các mục.

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

Viết lại lớp:

<?php
class StackExchange_Magento65343_Model_Sales_Quote extends Mage_Sales_Model_Quote
{
}

Sử dụng hàm setOrder () để Sắp xếp:

Hàm setOrder () sắp xếp bộ sưu tập mục theo các trường

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

}

Lỗi nghiêm trọng: Gọi đến phương thức không xác định Mage_Sales_Model_Resource_Quote_Item_Collection :: addAttributionToSort () ...
Easymoden00b

chờ tôi sẽ kiểm tra
Amit Bera

Tôi muốn làm một cái gì đó như [xem câu trả lời được cập nhật] nhưng đó chỉ là một mớ nhiều mã hơn, hơi khó sử dụng và không thân thiện với magento.
Easymoden00b

0

Giải pháp:

Viết lại phương thức của bạn Mage_Sales_Model_Quote::getAllVisibleItemsvới 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;
}

Viết sớm:

Có lẽ đó không phải là giải pháp tốt trong tình huống này, nhưng hãy ghi nhớ nó. (Magento có nhiều nơi như vậy có thể hữu ích)

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

    return $items;
}

Bên trong phương thức getData () đặt bất kỳ trường nào bạn muốn sắp xếp. Trong trường hợp của bạn nó có thể được updated_at. Trong trường hợp chèn updated_attốt hơn chèn dấu thời gian của nó.


theo dấu thời gian Tôi giả sử bạn có nghĩa là khởi tạo một đối tượng DateTime (trong đó các bộ so sánh hoạt động theo)?
Easymoden00b

Bạn cần thử nghiệm. Có lẽ nó có thể sắp xếp khi bạn đặt ở đó
update_at

Được rồi, tôi sẽ thử ... bây giờ, niềm vui bắt đầu khi tạo một mô-đun phức tạp chỉ để sử dụng một chức năng trong một tệp mẫu duy nhất .. đôi khi magento rất ngu ngốc: c như 5 tệp cho một lệnh gọi ..
Easymoden00b

Theo mô hình này, tôi đã sắp xếp các loại trong menu. Chạy như đồng hồ
zhartaunik

nếu hai mục có cùng thời gian cập nhật thì chúng sẽ ghi đè lên nhau.
Easymoden00b
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.