Es ist möglich, StatatusHistoryComment zur Bestellung hinzuzufügen, ohne $ order-> save () aufzurufen.

7

Ich brauche das, weil ich keine $ order-> save () -Ereignisse auslösen möchte. Ich möchte so etwas tun$order->_getResource()->saveAttribute($order, 'statusHistoryComment');

Ich freue mich über alle Gedanken :)

UPD: Es sieht so aus saveAttribute, als würde man nur mit dem EAV-Modell arbeiten. Was ist mit Wohnung?

spiil
quelle

Antworten:

5

Wenn die Bestellung bereits im System vorhanden ist, können Sie das Kernverhalten nachahmen und save()entweder die Bestellstatusverlaufssammlung oder das Statusverlaufsmodell selbst aufrufen .

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

Kommentar zum Bestellstatusverlauf programmgesteuert hinzugefügt

Die save()Methode der Bestellung wird nicht aufgerufen und somit werden keine Ereignisse ausgelöst.

mam08ixo
quelle
1

Nein. Sie müssen das Bestellobjekt aufrufen save, damit es in der Datenbank verbleibt.

Dies liegt daran, dass der Auftragsstatusverlaufstyp von anderen Statusverlaufstypen abstrahiert wird. Das Auftragsmodell sucht nach Änderungen am Statusverlauf, die beim Aufruf aus der Statusverlaufssammlung gespeichert werden save.

Lesen Sie die Magento 1.x-Quelle durch, um zu sehen, wie sie dies im Kern verwendet - es folgt immer sofort ein Aufruf von save.

Ich hoffe, das hilft.

philwinkle
quelle
Vielen Dank, es gibt etwas zu überlegen. Wir sind gezwungen, weiterhin ein hässliches core_write zu verwenden.
Spiil
Phil, du solltest wirklich darüber nachdenken, diese Antwort zu aktualisieren / zu entfernen, sie ist irreführend. Wie bei jedem zusammengesetzten Objekt in Magento ist nicht immer ein Sicherungsaufruf für das Hauptobjekt erforderlich. Die Tatsache, dass sie es im Kerncode so machen, bedeutet nicht, dass es nicht anders gemacht werden kann, wie mam08ixo oben ausgeführt hat. Man kann das Verlaufsmodell oder die Sammlung speichern und es funktioniert einwandfrei. Tatsächlich würde ich sagen, dass es auf diese Weise noch besser ist - ich mochte es immer nicht, order-> save () für Dinge aufzurufen, die es nicht wirklich brauchen.
Cristi
@Cristi Ich bin nicht über falsch oder sachlich ungenau. Eine bessere Antwort verdient mehr Gegenstimmen. Schätzen Sie das Feedback.
Philwinkle
0

Ja: Wenn Ihre Logik es Ihnen erlaubt, sales_convert_quote_to_orderEreignisse anzuhören .

Beispiel für addSalesRuleNameToOrderin Mage / SalesRule / Model / Observer.php definiert

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

    return $this;

Kein Anruf bei $order->save();

Ich habe dies erfolgreich in einem benutzerdefinierten Modul verwendet. Meine Beobachtermethode ist nur:

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

Hoffe das könnte helfen ;-)

nicolallias
quelle