É possível adicionarStatusHistoryComment para fazer o pedido sem chamar $ order-> save ()?

7

Preciso disso porque não quero enviar eventos $ order-> save (). Eu quero fazer algo como$order->_getResource()->saveAttribute($order, 'statusHistoryComment');

Ficarei feliz em quaisquer pensamentos :)

UPD: Parece que saveAttributefunciona apenas com o modelo EAV. E o apartamento?

spiil
fonte

Respostas:

5

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();

comentário do histórico de status do pedido adicionado programaticamente

O save()método da ordem não é chamado e, portanto, nenhum evento é despachado.

mam08ixo
fonte
1

Não. Você deve chamar saveo 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.

philwinkle
fonte
Obrigado, há algo em que pensar .. somos forçados a continuar usando um feio core_write.
Spiil 9/08/16
Phil, você realmente deve considerar atualizar / remover esta resposta, é enganador. Como em qualquer objeto composto no magento, nem sempre é necessária uma chamada para salvar no objeto principal. O fato de eles fazerem isso assim no código principal não significa que isso não possa ser feito de maneira diferente, como mam08ixo apontou acima. Pode-se salvar o modelo ou coleção de histórico e ele funciona muito bem. Na verdade, eu diria que é ainda melhor assim - sempre não gostei de chamar order-> save () para coisas que realmente não precisam.
Cristi 13/10
@Cristi, eu não estou acima de estar errado ou factualmente impreciso. Uma resposta melhor merece mais votos. Aprecie o feedback.
philwinkle
0

Sim: se sua lógica permitir que você escute o sales_convert_quote_to_orderevento.

Exemplo de addSalesRuleNameToOrderdefinido 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 ;-)

nicolallias
fonte