J'aurais besoin d'arrêter de diminuer les stocks tout en passant une commande, J'ai besoin de faire cette activité seulement après un paiement réussi.
Réponses
Trop de publicités?Oui, nous pouvons désactiver cette diminution de la quantité de manière pragmatique.
Comment ?
Étendre le site Mage_Checkout_Model_Type_Onepage y Réécriture la méthode saveOrder
Changements
avant les lignes suivantes dans la méthode ci-dessus, sera autour de #740 à #742
$service = Mage::getModel('sales/service_quote', $this->getQuote());
$service->submitAll();
Ajouter
$quote = $this->getQuote();
# Ref: Mage_CatalogInventory_Model_Observer::subtractQuoteInventory
$quote->setInventoryProcessed(true);
Ceci informera Magento que nous ne traitons pas l'inventaire pour le devis, de sorte qu'il ne diminuera pas la quantité même s'il est configuré pour le faire.
Vous pourriez simplement désactiver la gestion des stocks dans l'administration, à moins que vous n'ayez une raison particulière de procéder de cette façon ?
Vous pouvez configurer un observateur qui sera ajouté à la Qté après le succès du paiement : Vous pouvez consulter ici la liste des événements Magento auxquels vous pouvez vous connecter : http://www.nicksays.co.uk/magento_events_cheat_sheet/
<events>
<sales_order_payment_pay>
<observers>
<my_observer>
<type>singleton</type>
<class>my/observer</class>
<method>addQty</method>
</my_observer>
</observers>
</sales_order_payment_pay>
</events>
Et ensuite votre observateur ajouterait la Qté en retour
<?php
class Company_My_Model_Observer
{
public function addQty($event)
{
$order = $event->getInvoice()->getOrder(); // Mage_Sales_Model_Order
$items = $order->getAllVisibleItems();
foreach($items as $item) {
$qty = $item->getQtyOrdered(); // Amount to add back on
$product = Mage::getModel('catalog/product')->load($item->getProductId());
/**
* Here you would load the product and add this amount back on
*/
}
return $this;
}
}
Ça ne marchera probablement pas tel quel, mais vous voyez l'idée. Vous devez faire attention aux événements liés à Magento et au type de paiement, car les différents modules de paiement peuvent gérer ces événements de manière légèrement différente.
Dans certains cas, vous pouvez utiliser ce qui suit :
config.xml
<frontend>
<routers>
<sales_model_service_quote_submit_after>
<observers>
<inventory>
<type>singleton</type>
<class>Vendor_Name_Model_Observer</class>
<method>revertQuoteInventory</method>
</inventory>
</observers>
</sales_model_service_quote_submit_after>
</events>
</frontend>
Observer.php
public function revertQuoteInventory(Varien_Event_Observer $observer)
{
$quote = $observer->getEvent()->getQuote();
$inventory = Mage::getModel('cataloginventory/observer');
$inventory->revertQuoteInventory($observer);
$inventory->reindexQuoteInventory($observer);
$quote->setInventoryProcessed(true);
}