Respostas:
Se o pedido já existir no sistema, você poderá imitar o comportamento principal e chamar save()
a coleção do histórico de status do pedido ou o próprio modelo do histórico de status.
// 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();
O save()
método da ordem não é chamado e, portanto, nenhum evento é despachado.
Não. Você deve chamar save
o objeto de pedido para que ele persista no banco de dados.
Isso ocorre porque o tipo de histórico de status do pedido é abstraído de outros tipos de histórico de status - e o modelo de pedido procura alterações no histórico de status para salvar da coleção do histórico de status quando você liga save
.
Leia a fonte Magento 1.x para ver como eles usam isso no núcleo - é sempre imediatamente seguido por uma chamada para save
.
Espero que ajude.
sales_convert_quote_to_order
evento.Exemplo de addSalesRuleNameToOrder
definido em Mage / SalesRule / Model / Observer.php
$order->setCouponRuleName($ruleModel->getName());
return $this;
Nenhuma chamada para $order->save();
Eu usei isso com sucesso em um módulo personalizado. Meu método observador é apenas:
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(); !
}
Esperando que isso possa ajudar ;-)