Возможно ли программно перевести состояние заказа в обработку из полного?
Я пытаюсь перевести состояние заказа в обработку из полного. вот код
class TempName_HelloWorld_IndexController extends Mage_Core_Controller_Front_Action
{
public function indexAction()
{
$this->loadLayout(array('default'));
$this->renderLayout();
$order = Mage::getModel('sales/order');
$order->loadByIncrementId(100000041);
$order->setState(Mage_Sales_Model_Order::STATE_PROCESSING, true, 'Gateway has authorized the payment.');
$order->save();
}
}
?>
Приведенный выше код может обновить состояние заказа от ожидающего/ожидающего платежа до обработки, но я не могу обновить состояние заказа от завершения до обработки. Кто-нибудь может, в чем проблема?
1 answers
По умолчанию вы не можете настроить состояние заказа, когда он завершен. Это происходит потому, что это государство защищено.
Более пристальный взгляд на код объясняет нам, почему:
При вызове setState в классе Mage_Sales_Model_Order
запускается следующее.
public function setState($state, $status = false, $comment = '', $isCustomerNotified = null)
{
return $this->_setState($state, $status, $comment, $isCustomerNotified, true);
}
Который, как вы можете видеть, пузырится прямо до _setState
.
protected function _setState($state, $status = false, $comment = '',
$isCustomerNotified = null, $shouldProtectState = false)
{
// attempt to set the specified state
if ($shouldProtectState) {
if ($this->isStateProtected($state)) {
Mage::throwException(
Mage::helper('sales')->__('The Order State "%s" must not be set manually.', $state)
);
}
}
$this->setData('state', $state);
// add status history
if ($status) {
if ($status === true) {
$status = $this->getConfig()->getStateDefaultStatus($state);
}
$this->setStatus($status);
$history = $this->addStatusHistoryComment($comment, false); // no sense to set $status again
$history->setIsCustomerNotified($isCustomerNotified); // for backwards compatibility
}
return $this;
}
, в котором все переданные состояния проверяются с помощью метода isStateProtected
.
Проверьте, что этот метод сообщает нам, что "полное" состояние защищено. Таким образом блокируется для дальнейших обновлений.
public function isStateProtected($state)
{
if (empty($state)) {
return false;
}
return self::STATE_COMPLETE == $state || self::STATE_CLOSED == $state;
}
Когда заказ завершен, обычно ему выставляется счет, он отправляется и т.д. Так почему же вы хотите изменить состояние обратно на "обработку"? Это означало бы, что заказ больше не отправляется, в то время как отгрузка, вероятно, уже создана. Это, вероятно, доставит вам некоторые проблемы в дальнейшем.
Теперь, по крайней мере, вы знаете, почему не можете изменить порядок. Надеюсь, это поможет вам!