Что ж, я не смогу предоставить полное решение, потому что, если честно, решение потребует немало времени и тестирования, но я предоставлю исчерпывающую информацию, которая поможет вам в правильном направлении. .
По сути, аванс - нет возможности сделать это в Magento по умолчанию.
Итак, вместо этого мы собираемся переписать определенную модель с именем Mage_Checkout_Model_Type_Multishipping
. Если вы не знаете, как правильно переписать модель, прочитайте этот пост Inchoo .
Но если вы ленивы и ищете быстрый способ переписать, то, пожалуйста, скопируйте весь файл app/code/core/Mage/Checkout/Model/Type/Multishipping.php
в app/code/local/Mage/Checkout/Model/Type/Multishipping.php
После того, как вы закончили любое из двух выше, вы можете переписать то, что нам нужно, в этот класс. Проверьте функцию около line 498
:
public function createOrders()
{
$orderIds = array();
$this->_validate();
$shippingAddresses = $this->getQuote()->getAllShippingAddresses();
$orders = array();
if ($this->getQuote()->hasVirtualItems()) {
$shippingAddresses[] = $this->getQuote()->getBillingAddress();
}
try {
foreach ($shippingAddresses as $address) {
$order = $this->_prepareOrder($address);
$orders[] = $order;
....
}
foreach ($orders as $order) {
$order->place();
$order->save();
...
}
....
Mage::dispatchEvent('checkout_submit_all_after', array('orders' => $orders, 'quote' => $this->getQuote()));
return $this;
} catch (Exception $e) {
Mage::dispatchEvent('checkout_multishipping_refund_all', array('orders' => $orders));
throw $e;
}
}
Таким образом, мы ясно видим, что он пытается создать заказ для каждого адреса, а затем (наиболее важная часть) запускает событие checkout_submit_all_after
, которое отслеживается платежными модулями (информация о заказе и котировках передается всем доступных / активных модулей оплаты и метода оплаты, указанного в предложении, определит, сможет ли определенный модуль оплаты, получивший отправленное событие, обработать его или нет).
Имея это в виду, вы можете иметь несколько вариантов:
1.) Если вы можете жить только с одним заказом, попробуйте переписать подпрограмму createOrders
, чтобы просто снова объединить все элементы в один заказ, ->place()
это, а затем перейти к dispatchEvent для хорошей меры.
2.) Если вам нужно несколько заказов, хорошо - это то, где это становится запутанным, так как есть небольшой шанс, что вы можете сделать одно из следующих действий:
- сначала создайте платеж, затем свяжите его с заказами (это практически невозможно)
- создайте заказы и другой «комбинированный» заказ, в котором вы перейдете в dispatchEvent. звучит грязно и / или неправильно, так что не беспокойтесь, может быть?
Так что, да, вы, ребята, здесь очень много просите, поэтому лучшее, что я могу сделать, это пролить свет на то, где вы можете сначала нанести серьезный ущерб. Я бы сделал это сам, но здесь он выше моей зарплаты.
Некоторые дополнительные указатели:
- Следите за методами сеанса сразу после создания заказа, знайте, куда они тоже ведут
- Также будьте осторожны со всеми отправленными событиями. У всех них есть цель, почему они там и где они находятся.
Удачи!