এক চেকআউট বা অর্ডার বিভাজনে একাধিক ক্রম Magento


10

স্টোর পণ্যগুলি বিভিন্ন বিক্রেতাদের কাছ থেকে সরবরাহ করা হয়। একটি চেকআউট করার সময় কার্টে তার পণ্যগুলির ভিত্তিতে প্রতিটি বিক্রেতার জন্য একাধিক অর্ডার তৈরি করা প্রয়োজন। এই কাজটি অর্জন করার জন্য কি কোনও এক্সটেনশন রয়েছে বা আমি কাস্টম চেকআউট মডিউলটি বিকাশ করা শুরু করব? ম্যাজেন্টোর অভিজ্ঞ বিকাশকারীদের এই জাতীয় এক্সটেনশন ভিশন তৈরি করার জন্য গরম পয়েন্টগুলি সম্পর্কে কী বলা যায়? আপনি কি আমাকে সংক্ষিপ্ত চেকআউট ফ্লো আর্কিটেকচার ম্যাজেন্টো বন্ধুত্বপূর্ণ (কোড স্তর হিসাবে সম্ভব) ব্যাখ্যা করতে পারেন? আরও অনেক ধন্যবাদ!


মাল্টিশিপিংয়ের দিকে একবার নজর দিন যা কোন ম্যাজেন্টো বাক্সের বাইরে অফার করে। এবং ড্রপশিপ আছে তবে এটি ভাল কিনা বা এটি করতে সক্ষম তা আমার কোনও ধারণা নেই। unirgy.com/products/udropship
Fabian

@ এমমেজউজ, আপনি কি উত্তরটির নিচে কাজ করেছেন ?. এটা আমার জন্য কাজ করে না .. আপনার কোড পোস্ট করতে পারেন?
মনোজ কুমার

@ মনোজকুমার, হ্যাঁ আমি ইতিমধ্যে মাল্টাড্রেস চেকআউট যুক্তি ব্যবহার করে অর্ডার বিভাজন বাস্তবায়িত করেছি, আমি নিশ্চিত যে নীচে প্রদত্ত যুক্তিও পুরোপুরি কার্যকরভাবে কাজ করে।
mageUz

@ এমএমজেউজ, এই কোডটি ব্যবহার করার সময় শপিং কার্ট খালি দেখাচ্ছে .. কোনও পরামর্শ ..
মনোজ কুমার

হাই যে বাজারে বিভক্ত কার্ট মডিউল ব্যবহার করা যাবে না store.webkul.com/Magento-Marketplace-Split-Cart.html । ধন্যবাদ
ওয়েবকুল

উত্তর:


9

এটি checkout/type_onepageমডেলের পুনর্লিখনের সাহায্যে বেশ সহজেই করণীয় ।
এই শ্রেণিতে saveOrder()পদ্ধতিটি নিম্নরূপে ওভাররাইড করুন :

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;
}

তবে সচেতন থাকবেন যে ম্যাজেন্টোতে কোনও অর্থ প্রদান একটি চালানের সাথে সম্পর্কিত এবং প্রতিটি চালান একটি অর্ডারের সাথে যুক্ত।

ফলস্বরূপ এর অর্থ হ'ল আপনার একাধিক আদেশ হওয়ার সাথে সাথে আপনি অর্থ প্রদানগুলিও বিভক্ত করবেন । সুতরাং যদি কেবলমাত্র পেমেন্ট পদ্ধতিতে অর্থ প্রদানের সময় ব্যবহারকারীর ইন্টারঅ্যাকশন প্রয়োজন না হয় তবে এটি কেবল সম্ভব।

আপডেট : অরজিনাল উত্তর হ'ল parent::save()যা হ'ল parent:saveOrder()। এটি এখন উদাহরণ কোডে স্থির হয়েছে।


আপনি যদি আমার অনুরূপ প্রশ্নটি একবার দেখতে পারেন তবে প্রশংসা করি! magento.stackexchange.com/questions/6974/…
ক্যাটলিনহ্যাভনার

উপরের কোড ব্যবহার করে আপনি কি অর্ডারকে বিভক্ত করতে পেরেছিলেন, আমি যেমন করার চেষ্টা করছি তবে কোনও ভাগ্য ছাড়াই নয়
দীপক মল্লাহ

1
রায়, অবশ্যই সেখানে পিতামাত হওয়ার জন্য আপনাকে মূল ক্লাসটি প্রসারিত করতে হবে, তবে এটি সহজ পিএইচপি, ম্যাজেন্টোর সাথে এর কোনও যোগসূত্র নেই। পদ্ধতিটি saveOrderএখনও ম্যাজেন্টো সিই ১.৯-তে ঠিক যেমন রয়েছে তেমনটি এখনও রয়েছে active
বিনাই

3
আমার এই স্নিপেটে সমস্যা ছিল কারণ 2 টি অর্ডারে গ্র্যান্ডটোটাল এবং সাবটোটাল পুরো ক্রমের সমান। ডিবাগিংয়ের পরে আমি জানতে পেরেছি যে এমনকি আইটেমগুলি সরিয়ে এবং পুনরায় যুক্ত করার পরে, এটি ঠিকানাটি সম্পূর্ণ ফর্ম সংগ্রহ করার পরে ঠিক ঠিকানা ক্যাশেড আইটেমগুলি ব্যবহার করবে ... প্রতিটি ঠিকানার জন্য আইটেম ক্যাশে এটি পরিষ্কার করার জন্য সমাধান করুন: $ ঠিকানা-> আনসেটডেটা (' cached_items_all '); $ ঠিকানা-> unsetData ( 'cached_items_nominal'); $ ঠিকানা-> unsetData ( 'cached_items_nonnominal');
ডায়োগো সান্টিয়াগো

1
@ বিনাই $ উক্তি-> অ্যাড আইটেম ($ আইটেম); এই কোডটি কাজ করছে না। আইটেম যুক্ত করার পরে আমি ফোরচ লুপের সাহায্যে $ quotes-> getAllItems () প্রতিধ্বনিত করি। কিন্তু কোন আইটেম ছিল না। আপনি এই আমাকে সাহায্য করতে পারেন দয়া করে?
অমিত বেরা

1

নিম্নলিখিত সিই ভের 1.9.0.x পরীক্ষিত হয়

/**
 * Overwrite core
 */
class Vendor_Module_Model_Checkout_Type_Onepage extends Mage_Checkout_Model_Type_Onepage
{
    protected $_oriAddresses = array();

    /**
     * Prepare order from quote_items  
     *
     * @param   array of Mage_Sales_Model_Quote_Item 
     * @return  Mage_Sales_Model_Order
     * @throws  Mage_Checkout_Exception
     */
    protected function _prepareOrder2($quoteItems)
    {
        $quote = $this->getQuote();
        $quote->unsReservedOrderId();
        $quote->reserveOrderId();

        // new instance of quote address
        $quote->setIsMultiShipping(true); // required for new instance of Mage_Sales_Model_Quote_Address
        $address = Mage::getModel('sales/quote_address');
        $weight = 0;
        $addressType = 'billing';
        foreach ($quoteItems as $quoteItem) {
            $address->addItem($quoteItem, $quoteItem->getQty());
            $weight += $quoteItem->getWeight();
            if (!$quoteItem->getIsVirtual()) {
                $addressType = 'shipping';
            }
        }
        // get original shipping address that contains multiple quote_items
        if (!isset($this->_oriAddresses[$addressType])) {
            $this->_oriAddresses[$addressType] = Mage::getResourceModel('sales/quote_address_collection')
                ->setQuoteFilter($quote->getId())
                ->addFieldToFilter('address_type', $addressType)
                ->getFirstItem();
        }
        Mage::helper('core')->copyFieldset('sales_convert_quote_address', 'to_customer_address', $this->_oriAddresses[$addressType], $address);
        Mage::helper('core')->copyFieldset('sales_convert_quote_address', 'to_order', $this->_oriAddresses[$addressType], $address);
        $address->setQuote($quote)
            ->setWeight($weight)
            ->setSubtotal(0)
            ->setBaseSubtotal(0)
            ->setGrandTotal(0)
            ->setBaseGrandTotal(0)
            ->setCollectShippingRates(true)
            ->collectTotals()
            ->collectShippingRates()        
            ;

        $convertQuote = Mage::getSingleton('sales/convert_quote');
        $order = $convertQuote->addressToOrder($address);
        $order->setBillingAddress(
            $convertQuote->addressToOrderAddress($quote->getBillingAddress())
        );

        if ($address->getAddressType() == 'billing') {
            $order->setIsVirtual(1);
        } else {
            $order->setShippingAddress($convertQuote->addressToOrderAddress($address));
        }

        $order->setPayment($convertQuote->paymentToOrderPayment($quote->getPayment()));
        if (Mage::app()->getStore()->roundPrice($address->getGrandTotal()) == 0) {
            $order->getPayment()->setMethod('free');
        }

        foreach ($quoteItems as $quoteItem) {
            $orderItem = $convertQuote->itemToOrderItem($quoteItem);  // use quote_item to transfer is_qty_decimal
            if ($quoteItem->getParentItem()) {
                $orderItem->setParentItem($order->getItemByQuoteItemId($quoteItem->getParentItem()->getId()));
            }
            $order->addItem($orderItem);
        }

        return $order;
    }

    /**
     * Overwrite core function
     */
    public function saveOrder()
    {
        $quote = $this->getQuote();
        if ($quote->getItemsCount() > 1) {
            $items = $quote->getAllVisibleItems();
            $group = array();
            $split = array();
            foreach ($items as $item) {
                if (Mage::helper('vendor')->checkSku($item->getSku())) {
                    $split[] = array($item); // one item per order
                } else {
                    $group[] = $item; // all other items in one order
                }
            }
            if (count($split)) {
                if (count($group)) {
                    $split[] = $group;
                }
                return $this->_splitQuote($split);
            }
        }
        return parent::saveOrder();
    }

    /**
     * Split quote to multiple orders
     * 
     * @param array of Mage_Sales_Model_Quote_Item
     * @return Mage_Checkout_Model_Type_Onepage
     */
    protected function _splitQuote($split)
    {
        $this->validate();
        $isNewCustomer = false;
        switch ($this->getCheckoutMethod()) {
            case self::METHOD_GUEST:
                $this->_prepareGuestQuote();
                break;
            case self::METHOD_REGISTER:
                $this->_prepareNewCustomerQuote();
                $isNewCustomer = true;
                break;
            default:
                $this->_prepareCustomerQuote();
                break;
        }
        if ($isNewCustomer) {
            try {
                $this->_involveNewCustomer();
            } catch (Exception $e) {
                Mage::logException($e);
            }
        }

        $quote = $this->getQuote()->save();
        $orderIds = array();
        Mage::getSingleton('core/session')->unsOrderIds();
        $this->_checkoutSession->clearHelperData();

        /**
         * a flag to set that there will be redirect to third party after confirmation
         * eg: paypal standard ipn
         */
        $redirectUrl = $quote->getPayment()->getOrderPlaceRedirectUrl();

        foreach ($split as $quoteItems) {
            $order = $this->_prepareOrder2($quoteItems);
            $order->place();
            $order->save();
            Mage::dispatchEvent('checkout_type_onepage_save_order_after',
                array('order'=>$order, 'quote'=>$quote));
            /**
             * we only want to send to customer about new order when there is no redirect to third party
             */
            if (!$redirectUrl && $order->getCanSendNewEmailFlag()) {
                $order->sendNewOrderEmail();
            }
            $orderIds[$order->getId()] = $order->getIncrementId();
        }

        Mage::getSingleton('core/session')->setOrderIds($orderIds);

        // add order information to the session
        $this->_checkoutSession
            ->setLastQuoteId($quote->getId())
            ->setLastSuccessQuoteId($quote->getId())
            ->setLastOrderId($order->getId())
            ->setRedirectUrl($redirectUrl)
            ->setLastRealOrderId($order->getIncrementId());

        // as well a billing agreement can be created
        $agreement = $order->getPayment()->getBillingAgreement();
        if ($agreement) {
            $this->_checkoutSession->setLastBillingAgreementId($agreement->getId());
        }

        // add recurring profiles information to the session
        $service = Mage::getModel('sales/service_quote', $quote);
        $profiles = $service->getRecurringPaymentProfiles();
        if ($profiles) {
            $ids = array();
            foreach ($profiles as $profile) {
                $ids[] = $profile->getId();
            }
            $this->_checkoutSession->setLastRecurringProfileIds($ids);
            // TODO: send recurring profile emails
        }

        Mage::dispatchEvent(
            'checkout_submit_all_after',
            array('order' => $order, 'quote' => $quote, 'recurring_profiles' => $profiles)
        );

        return $this;
    }
}

গুরুত্বপূর্ণ আপনি উদ্ধৃতি থেকে গ্র্যান্ড টোটালটি পুনরুদ্ধার করতে আপনার প্রদানের পদ্ধতিগুলি কাস্টমাইজ করতে হবে।


এটা কাজ করছে। ধন্যবাদ। বিক্রেতার দ্বারা কার্টের উদ্ধৃতি কীভাবে গ্রুপ করবেন? অন্যথায় "// অর্ডার অনুসারে একটি আইটেম" ..
সৈয়দ ইব্রাহিম

1
$group[] = $item; // all other items in one orderঅর্ডার অনুযায়ী একাধিক আইটেম ধরে রাখতে পারে, আপনি প্রতিটি বিক্রেতার নিজস্ব রয়েছে এমন সহজেই সংশোধন করতে পারেন $group
কেটিং

আপডেট হয়েছে এবং এটি কাজ করছে। তবে অর্থ প্রদান কেবলমাত্র শেষ আদেশের জন্য ধরা পড়ে (যদি আমরা একাধিক ক্রম বিভক্ত করি)। কীভাবে আমাদের এটি আপডেট করতে হবে? আমার সম্মিলিত পেমেন্ট মোট সংগ্রহ করতে হবে।
সৈয়দ ইব্রাহিম

মোট পরিমাণ উদ্ধৃতি অবজেক্টে রয়েছে, আপনি এটি দিয়ে লোড করতে পারেন $quote->Mage::getModel('sales/quote')->load($lastOrder->getQuoteId())। তারপর অনেক মোট তোমার কাছ থেকে উদ্ধার করতে পারেন হয় $quote, যার মধ্যে অন্যতম$quote->getGrandTotal()
kiatng
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.