Ich muss meine Bestellungen für jeden Artikel aufteilen (da ich für jeden einzelnen Artikel in meinem Warenkorb einen Bestellstatus und einen Lieferschein benötige).
Ich habe versucht, dies anhand der folgenden Ressourcen zu tun:
Magento2 Split Order basierend auf dem Anbieter
So teilen Sie die Reihenfolge in Magento 2
Magento Mehrfachbestellung an einer Kasse oder Auftragsaufteilung
Aber ich kann es nicht zum Laufen bringen, die erste Bestellung wird erstellt und die zweite stürzt ab. (Onepage-Checkout aktiviert)
Was mache ich falsch?
Magento / Quote / Model / QuoteManagement.php
public function placeOrder($cartId, PaymentInterface $paymentMethod = null)
{
$quote = $this->quoteRepository->getActive($cartId);
if ($paymentMethod) {
$paymentMethod->setChecks([
\Magento\Payment\Model\Method\AbstractMethod::CHECK_USE_CHECKOUT,
\Magento\Payment\Model\Method\AbstractMethod::CHECK_USE_FOR_COUNTRY,
\Magento\Payment\Model\Method\AbstractMethod::CHECK_USE_FOR_CURRENCY,
\Magento\Payment\Model\Method\AbstractMethod::CHECK_ORDER_TOTAL_MIN_MAX,
\Magento\Payment\Model\Method\AbstractMethod::CHECK_ZERO_TOTAL,
]);
$quote->getPayment()->setQuote($quote);
$data = $paymentMethod->getData();
$quote->getPayment()->importData($data);
}
if ($quote->getCheckoutMethod() === self::METHOD_GUEST) {
$quote->setCustomerId(null);
$quote->setCustomerEmail($quote->getBillingAddress()->getEmail());
$quote->setCustomerIsGuest(true);
$quote->setCustomerGroupId(\Magento\Customer\Api\Data\GroupInterface::NOT_LOGGED_IN_ID);
}
$this->eventManager->dispatch('checkout_submit_before', ['quote' => $quote]);
$tempQuote = $quote;
foreach($tempQuote->getAllItems() as $tempItem) {
foreach($quote->getAllItems() as $item) {
$quote->getItemsCollection()->removeItemByKey($item->getId());
}
$quote->getItemsCollection()->addItem($tempItem);
$quote->setTotalsCollectedFlag(false)->collectTotals();
$order = $this->submit($quote);
$orders[] = $order;
$quote = $tempQuote;
if (null == $order) {
throw new LocalizedException(
__('An error occurred on the server. Please try to place the order again.')
);
}
$this->checkoutSession->setLastQuoteId($quote->getId());
$this->checkoutSession->setLastSuccessQuoteId($quote->getId());
$this->checkoutSession->setLastOrderId($order->getId());
$this->checkoutSession->setLastRealOrderId($order->getIncrementId());
$this->checkoutSession->setLastOrderStatus($order->getStatus());
}
$this->eventManager->dispatch('checkout_submit_all_after', ['orders' => $orders, 'quote' => $quote]);
return $orders;
}
Ich habe die Kerndateien nur zum Testen bearbeitet. Ich werde ein Plugin oder ein Überschreiben für die placeOrder-Methode erstellen, sobald es funktioniert.
magento2
onepage-checkout
TrytoFly
quelle
quelle
Antworten:
Ich habe dies auf meiner eigenen lokalen Implementierung von Magento 2.2 Enterprise überprüft und es funktioniert folgendermaßen:
Bitte lassen Sie mich wissen, ob dies das Problem für Sie behebt oder ob Sie einen Fehler erhalten haben.
quelle
Call to a member function getData() on null
auf$data = $paymentMethod->getData();
.Mit Multentipping, das mit Magento 2 geliefert wird und die separate Bestellung für jedes Artikelprodukt im Warenkorb ermöglicht, können Sie dies problemlos tun. Wenn Sie es auch für die normale Kaufabwicklung implementieren möchten, müssen Sie nur das Plugin auf die
Magento\Quote\Model\Quote\Item
Klasse und ihre RepresentProduct-Funktion anwenden . Fügen Sie diesen Code in Ihr eindi.xml
Und im Plugin dh Item.php folgenden Code einfügen
Alles erledigt. Sie können mich gerne anrufen, wenn Sie ein anderes Problem haben.
quelle