Es factible con bastante facilidad con una reescritura del checkout/type_onepage
modelo.
En esa clase, anule el saveOrder()
método de la siguiente manera:
public function saveOrder()
{
$quote = $this->getQuote();
// First build an array with the items split by vendor
$sortedItems = array();
foreach ($quote->getAllItems() as $item) {
$vendor = $item->getProduct()->getVendor(); // <- whatever you need
if (! isset($sortedItems[$vendor])) {
$sortedItems[$vendor] = $item;
}
}
foreach ($sortedItems as $vendor => $items) {
// Empty quote
foreach ($quote->getAllItems() as $item) {
$quote->getItemsCollection()->removeItemByKey($item->getId());
}
foreach ($items as $item) {
$quote->addItem($item);
}
// Update totals for vendor
$quote->setTotalsCollectedFlag(false)->collectTotals();
// Delegate to parent method to place an order for each vendor
parent::saveOrder();
}
return $this;
}
Pero tenga en cuenta que en Magento un pago está asociado con una factura, y cada factura está asociada con un pedido.
En consecuencia, esto significa que tan pronto como tenga varios pedidos, también habrá dividido los pagos . Por lo tanto, esto solo es factible si el método de pago no requiere la interacción del usuario durante el pago.
ACTUALIZACIÓN : La respuesta original delegada a la parent::save()
que tenía que ser parent:saveOrder()
. Está arreglado en el código de ejemplo ahora.