Как добавить префикс в код заказа в magento с помощью способов оплаты
Мне нужно добавить префикс в номер заказа в magento.
Например, если заказ основан на наложенном платеже, то номер заказа не должен быть похожим...
код 12332434343....
если заказ оплачен.. тогда он должен быть
pre12323233223.... вот так
Если заказ - это чек/денежный заказ, то так и должно быть.... cmo12121212121. кмо121212121..... Для этого я хочу знать, что....как добавить префикс в номер заказа magento....перед созданием заказа....и сохраненный в базе данных.....
2 answers
Идентификатор приращения заказа генерируется классом Mage_Eav_Model_Entity_Increment_Numeric
(см. таблицу eav_entity_type
столбец increment_model
), который вызывается при заказе перед сохранением через Mage_Eav_Model_Entity_Type::fetchNewIncrementId
.
Теперь более поздний не знает, для чего он на самом деле отображает идентификатор приращения. Где я обычно предлагаю использовать другой increment_model
( как описано в Atwix) это не сработает.
Лучшим решением в этом случае, вероятно, было бы использовать наблюдателя. В этом случае вы хотите сделать это до того, как объект будет зафиксирован в базу данных, чтобы мы могли использовать $this->_eventPrefix.'_save_before'
, вызванный Mage_Core_Model_Abstract::_beforeSave
.
Префикс события моделей порядка равен sales_order
, так что событие, которое вы хотите наблюдать, будет sales_order_save_before
.
Связав все это вместе, мы получим нечто подобное в вашем собственном пользовательском модуле
config.xml
[...]
<global>
<events>
<sales_order_save_before>
<observers>
<[namespace]_[module]_sales_order_save_before>
<type>singleton</type>
<class>[Namespace]_[Module]_Model_Observer</class>
<method>salesOrderSaveBefore</method>
</[namespace]_[module]_sales_order_save_before>
</observers>
</sales_order_save_before>
[...]
</events>
[...]
</global>
[Namespace]/[Module]/Model/Observer.php
class [Namespace]_[Module]_Model_Observer
{
public function salesOrderSaveBefore($o)
{
$this->_generateOrderId($o);
return $this;
}
protected function _generateOrderId($o)
{
$_object = $o->getDataObject();
if ($_object->isObjectNew !== true) // only set the increment of a new order
return;
$incrementId = $_object->getIncrementId(); // get original increment ID
$payment = $order->getPayment();
/**
* Do some magic with payment methods
* to format the $incrementID
*/
$_object->setIncrementId($incrementId); // set the new increment ID to be saved
}
}
Отказ от ответственности: это непроверенный код, и, возможно, потребуется немного нежной любви и настройки, прежде чем вы развернете его в реальной среде.
Это не сработает, если вы используете какого-либо поставщика платежных услуг, например PayPal и т.д., потому что вас направляют к поставщику услуг, а затем обратно в магазин. в этом процессе у вас есть идентификатор зарезервированного заказа, идентификатор последнего увеличения и т.д. которые разошлись.