Có thể thêmStatusHistoryVer để đặt hàng mà không cần gọi $ order-> save ()?


7

Tôi cần điều này bởi vì tôi không muốn gửi các sự kiện $ order-> save (). Tôi muốn làm một cái gì đó như$order->_getResource()->saveAttribute($order, 'statusHistoryComment');

Tôi sẽ vui mừng với bất kỳ suy nghĩ :)

CẬP NHẬT: Có vẻ như chỉ saveAttributelàm việc với mô hình EAV. Còn căn hộ thì sao?

Câu trả lời:


5

Nếu đơn hàng đã tồn tại trong hệ thống, bạn có thể bắt chước hành vi cốt lõi và gọi save()hoặc trên bộ sưu tập lịch sử trạng thái đơn hàng hoặc chính mô hình lịch sử trạng thái.

// just some random order object
$order = Mage::getModel('sales/order')->load(2);

$message = 'Add status history comment!';

/** @var Mage_Sales_Model_Order_Status_History $history */
$history = Mage::getModel('sales/order_status_history')
    ->setOrder($order)
    ->setStatus($order->getStatus())
    ->setComment($message)
    ->setData('entity_name', Mage_Sales_Model_Order::HISTORY_ENTITY_NAME);

// EITHER model save
$history->save();

// OR collection save
$historyCollection = $order->getStatusHistoryCollection();
$historyCollection->addItem($history);
$historyCollection->save();

thứ tự lịch sử trạng thái bình luận được thêm vào lập trình

save()Phương thức của lệnh không được gọi và do đó không có sự kiện nào được gửi đi.


1

Không. Bạn phải gọi saveđối tượng đặt hàng để nó tồn tại trong cơ sở dữ liệu.

Điều này là do loại lịch sử trạng thái đơn hàng được trừu tượng hóa từ các loại lịch sử trạng thái khác - và mô hình đơn hàng tìm kiếm các thay đổi đối với lịch sử trạng thái để lưu từ bộ sưu tập lịch sử trạng thái khi bạn gọi save.

Đọc qua nguồn Magento 1.x để xem cách họ sử dụng phần này trong lõi - nó luôn được theo sau bởi một cuộc gọi đến save.

Mong rằng sẽ giúp.


Cảm ơn bạn, có một cái gì đó để suy nghĩ .. chúng tôi buộc phải tiếp tục sử dụng một core_write xấu xí.
spiil

Phil, bạn thực sự nên xem xét cập nhật / xóa câu trả lời này, nó gây hiểu nhầm. Như với bất kỳ đối tượng tổng hợp nào trong magento, một cuộc gọi lưu trên đối tượng chính không phải lúc nào cũng được yêu cầu. Việc họ làm như thế này trong mã lõi không có nghĩa là nó không thể được thực hiện khác nhau, như mam08ixo đã chỉ ra ở trên. Người ta có thể lưu mô hình lịch sử hoặc bộ sưu tập và nó hoạt động tốt. Trên thực tế, tôi muốn nói rằng nó thậm chí còn tốt hơn theo cách này - Tôi luôn không thích gọi điện đặt hàng-> save () cho những thứ không thực sự cần nó.
Cristi

@Cristi tôi không ở trên là sai hoặc thực tế không chính xác. Một câu trả lời tốt hơn xứng đáng nhận được nhiều hơn. Đánh giá cao các thông tin phản hồi.
philwinkle

0

Có: Nếu logic của bạn cho phép bạn nghe sales_convert_quote_to_ordersự kiện.

Ví dụ về addSalesRuleNameToOrderđịnh nghĩa trong Mage / SalesRule / Model / Observer.php

    $order->setCouponRuleName($ruleModel->getName());

    return $this;

Không có cuộc gọi đến $order->save();

Tôi đã sử dụng thành công điều này trong một mô-đun tùy chỉnh. Phương pháp quan sát của tôi chỉ là:

public function addCustomCommentToOrder(Varien_Event_Observer $observer)
{
    # conveniently, Mage/Sales/Model/Convert/Quote.php gives us both the order and the quote
    $order = $observer->getEvent()->getOrder();

    # ...
    $custom_comment = 'some useful comment'; 

    $order->addStatusHistoryComment($custom_comment)
        ->setIsVisibleOnFront(True) # change this to hide it from frontend
        ->setIsCustomerNotified(False) # change this to email the customer or not
    ;
    # no call to $order->save(); !
}

Hy vọng rằng có thể giúp đỡ ;-)

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.