Magento 2: कंट्रोलर में प्रोडक्ट की कीमत बदलने का काम फिलहाल नहीं!


9

मैंने अपने उत्पादों की कीमत इस तरह बदलने की कोशिश की:

Controller.php:

[संपादित करें]

   <?php

namespace MassiveArt\ShoppingCart\Controller\Index;

use Magento\Catalog\Model\ProductFactory;
use Magento\Checkout\Model\Cart;
use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
use Magento\Framework\Controller\Result\JsonFactory;
use Magento\Framework\Data\Form\FormKey;

class Index extends Action
{
    /**
     * @var FormKey
     */
    protected $formKey;

    /**
     * @var Session
     */
    protected $checkoutSession;

    /**
     * @var Cart
     */
    protected $cart;

    /**
     * @var ProductFactory
     */
    protected $productFactory;

    /**
     * Constructor.
     *
     * @param Context                         $context
     * @param \Magento\Checkout\Model\Session $checkoutSession
     * @param \Magento\Customer\Model\Session $customerSession
     * @param JsonFactory                     $resultJsonFactory
     * @param FormKey                         $formKey
     * @param Cart                            $cart
     * @param ProductFactory                  $productFactory
     */
    public function __construct(
        Context $context,
        \Magento\Checkout\Model\Session $checkoutSession,
        \Magento\Customer\Model\Session $customerSession,
        JsonFactory $resultJsonFactory,
        FormKey $formKey,
        Cart $cart,
        ProductFactory $productFactory
    ) {
        $this->checkoutSession = $checkoutSession;
        $this->customerSession = $customerSession;
        $this->formKey = $formKey;
        $this->resultJsonFactory = $resultJsonFactory;
        $this->cart = $cart;
        $this->productFactory = $productFactory;
        parent::__construct($context);
    }

    public function execute()
    {
        try {

            // Set result data and pass back
            $result = $this->resultJsonFactory->create();


            $allItems = $this->checkoutSession->getQuote()->getAllVisibleItems();
            foreach ($allItems as $item) {
                $item = ( $item->getParentItem() ? $item->getParentItem() : $item );
                $price = 100; //set your price here
                $item->setCustomPrice($price);
                $item->setOriginalCustomPrice($price);
                $item->setSubtotal($price);
                $item->getProduct()->setIsSuperMode(true);
            }
            $this->checkoutSession->setTotalsCollectedFlag(false);
            $this->checkoutSession->getQuote()->save();
            $this->checkoutSession->getQuote()->setTotalsCollectedFlag(false);
            $this->setTotalsCollectedFlag(false);

            $result->setData(['message' => __("Products added succesfully")]);

            return $result;
        } catch (\Exception $e) {
            $result->setData(['error' => __($e->getMessage())]);
            return $result;
        }
    }
}

(EDIT) नए कोड के साथ मूल्य में परिवर्तन होता है, लेकिन उप-योग नहीं! जैसा कि आप यहाँ देख सकते हैं: यहां छवि विवरण दर्ज करें

अग्रिम में धन्यवाद!


नमस्ते, क्या आप विस्तृत कर सकते हैं? आप किस नियंत्रक का उपयोग करते हैं, और आपका कार्य क्या है? क्या आप उस मूल्य को बदलना चाहते हैं जब कोई ग्राहक कार्ट में उत्पाद जोड़ता है?
सोनी '

हैलो सोनी, नहीं, मैं कीमत बदलना चाहता हूं, अगर एक बटन क्लिक किया जाता है, न कि अगर कोई उत्पाद कार्ट में जोड़ा जा रहा है। अभी के लिए मैं सिर्फ परीक्षण के लिए सभी उत्पादों की कीमत 100 डॉलर में बदलना चाहता हूं। मैं आपको कुछ और कोड दिखाने के लिए अपने प्रश्न को अपडेट करूंगा
फेलिक्स शॉनहेर

क्षमा करें, मुझे यह समझने में डर नहीं है कि आप क्या प्रयास कर रहे हैं। जब मैं आपके कोड को देखता हूं, तो आप उन वस्तुओं की कीमतों को बदलना चाहते हैं जो आपकी टोकरी में हैं। दरअसल आप बुला रहे हैं quoteसे checkoutSession। मैं थोड़ा असमंजस में हूँ।
Sony

हां मैं अपनी टोकरी में वस्तुओं की कीमतों में बदलाव करना चाहता हूं। मैंने इसे प्राप्त करने के लिए कुछ अन्य सामान की कोशिश की और मैंने जो आखिरी कोशिश की वह उद्धरण के साथ वर्तमान कोड है।
फेलिक्स शॉनहेर

मूल्य परिवर्तन उस नियंत्रक का उपयोग करके काम नहीं करेगा जिसके लिए आपको प्लगइन या पर्यवेक्षक का उपयोग करने की आवश्यकता है।
आसिम गोरिया

जवाबों:


5

मैं इसे प्राप्त करता हूं, मुझे लगता है कि आप सही तरीके से हैं, लेकिन मुझे लगता है कि आपको उद्धरण को बचाना होगा। यदि आप इस वर्ग पर एक नज़र डालें: \Magento\Checkout\Controller\Cart\Add आप लाइन 114 पर देख सकते हैं:

$this->cart->addProduct($product, $params);
            if (!empty($related)) {
                $this->cart->addProductsByIds(explode(',', $related));
            }

            $this->cart->save();

मैं उस घटना से कीमत बदल देता हूं जिसे addProduct()विधि के अंत में कहा जाता है , और Magento अंत में गाड़ी बचाता है। तो आपके मामले में, आपको अपने नियंत्रक में बोली को सहेजना होगा।


ठीक है, अब मूल्य बदल जाता है (मेरे अपडेट किए गए प्रश्न को देखें), लेकिन उप-विषयक परिवर्तन नहीं होगा, कोई विचार?
फेलिक्स शॉनहेर

इसके बाद भी अगर आप चेकआउट पर क्लिक करते हैं, तो कीमत फिर से वही है
फेलिक्स शॉनहेर

मुझे लगता है कि आपको उद्धरण मॉडल पर एक नज़र डालनी होगी, खासकर कलेक्टोटल्स () पद्धति पर। आपको झंडा $ इस सेट करना होगा-> setTotalsCollectedFlag (झूठा) जो Magento को फिर से गणना करने के लिए कहता है।
सोनी

दुर्भाग्य से यह मेरे लिए काम नहीं किया :(
फेलिक्स शॉनहेर

इसे बहुत सारे तरीकों से आज़माया और इसने कभी काम नहीं किया।
फेलिक्स शोनहेर

3

मैंने एक स्निपेट किया जो आपको कीमत बदलने की अनुमति देता है। दरअसल, यह आपकी टोकरी में उत्पाद जोड़ने के बाद कीमत में बदलाव करता है। दूसरे शब्दों में, यह आपकी वस्तुओं की कीमतों को आपकी बोली में बदलता है। https://gist.github.com/0-Sony/d9d2ea792b5533bfeaff28827e6f207a

आशा है ये मदद करेगा।


खेद है कि यह मदद नहीं करता है, मैं एक पर्यवेक्षक का उपयोग नहीं कर सकता, मुझे अपने नियंत्रक का उपयोग करने की आवश्यकता है
फेलिक्स शॉनहेर

3

आप कुल पंक्ति को अद्यतन करना चाहते हैं न कि उप-योग, विधि $item->setRowTotal()या का उपयोग करना $item->setBaseRowTotal()। इसके अलावा, यह $item->save()लूप के अंत से पहले जोड़ने में मदद कर सकता है ।

सबटोटल ऑर्डर / कार्ट सबटोटल है।


दुर्भाग्य से यह कुछ भी नहीं बदला। लेकिन आपके उत्तर के लिए धन्यवाद
फेलिक्स शॉनहेर

3

@ फेलिक्स, आपको setSubtotal()एक उद्धरण के लिए सेट करने की आवश्यकता है । सबटोटल सेट च के बाहर or loop

$subTotal = $cart->getQuote()->setSubtotal($price);
$this->checkoutSession->getQuote()->save();

इस तरह

foreach ($allItems as $item) {
                $item = ( $item->getParentItem() ? $item->getParentItem() : $item );
                $price = 100; //set your price here
                $item->setCustomPrice($price);
                $item->setOriginalCustomPrice($price);
                $item->getProduct()->setIsSuperMode(true);
            }
            $subtotalprice=100;
            $subTotal = $cart->getQuote()->setSubtotal($subtotalprice);
            $this->checkoutSession->setTotalsCollectedFlag(false);
            $this->checkoutSession->getQuote()->save();

नोट: कोड परीक्षण किया गया


आपके लिए काम कर सकता हूं, लेकिन मेरे लिए नहीं।
फेलिक्स शॉनहेर

क्या आपने यह कोशिश की ($ सबटोटल = $ कार्ट-> getQuote () -> सेटसुबोटल ($ सबटोटलप्रिस);) लूप के लिए इसके बाहर
अरुणप्रबकरन एम।

हां, मैंने ठीक यही किया है कि आपने कैसे कहा
फेलिक्स शॉनहेर

सेटसुबोटल केवल काम नहीं कर रहा है। सही बात? अन्य सेट तरीके सेटप्राइस की तरह ठीक काम कर रहे हैं? सही बात?
अरुणप्रभाकरन एम।

जी हाँ सही ....
फेलिक्स शॉनहेर

3

उपाध्याय कार्ट मूल्य के लिए आपको चेकआउट सत्र के बजाय मॉडल कार्ट का उपयोग करना होगा। आइटम को कार्ट से लोड करें और उसे अपडेट करें।

<?php 
$items = $this->cart->getQuote()->getAllItems(); //Magento\Checkout\Model\Cart $cart
foreach($items as $item) {

    $item = $this->cart->getQuote()->getItemById($item->getId());
    if (!$item) {
      continue;
    }

    $price = 100;
    $item->setCustomPrice($price);
    $item->setOriginalCustomPrice($price);
    $item->getProduct()->setIsSuperMode(true);
    $item->save();           
}
$this->cart->save();
?>

वास्तव में यह काम नहीं कर रहा है, खेद है
फेलिक्स शॉनहेर

यह मेरा काम कोड है, मैं एपीआई द्वारा कस्टम मूल्य से उद्धरण बना रहा हूँ। यह होना चाहिए। किसी भी मॉड्यूल अपने पक्ष का सामना करना होगा
केतन बोरदा

0

कोड के नीचे आज़माएं:

आपको process()अपनी आवश्यकता के लिए फ़ंक्शन को संशोधित करने की आवश्यकता है।

विक्रेता / Magento / मॉड्यूल बिक्री के नियम / मॉडल / Validator.php

/**
     * Quote item discount calculation process
     *
     * @param AbstractItem $item
     * @return $this
     */
    public function process(AbstractItem $item)
    {
        $item->setDiscountAmount(0);
        $item->setBaseDiscountAmount(0);
        $item->setDiscountPercent(0);
        $itemPrice = $this->getItemPrice($item);
        if ($itemPrice < 0) {
            return $this;
        }

        $appliedRuleIds = $this->rulesApplier->applyRules(
            $item,
            $this->_getRules($item->getAddress()),
            $this->_skipActionsValidation,
            $this->getCouponCode()
        );
        $this->rulesApplier->setAppliedRuleIds($item, $appliedRuleIds);
        /*Your custom code START here*/
        $item = ( $item->getParentItem() ? $item->getParentItem() : $item );
        $price = 499; //set your price here
        $item->setCustomPrice($price);
        $item->setOriginalCustomPrice($price);
        $item->getProduct()->setIsSuperMode(true);
        //echo "sku: ".$item->getSku()."=== Name: ".$item->getName();die;
        /* Your custom code END here */
        return $this;
    }

नोट: Magento की कोर फ़ाइलों को संशोधित न करें। इसके लिए प्लगइन बनाएं।

मुझे उम्मीद है इससे मदद मिलेगी...!!!


लेकिन अगर मैं इसके लिए एक प्लगइन बनाता हूं और एक अन्य एक्सटेंशन, जो एक ही स्टोर पर चलता है, तो भी Validator.php का एक प्लगइन बनाता है केवल एक ही काम करेगा। सच?
फेलिक्स शॉनहेर

@felix: नहीं, आपको बस validator.php फ़ाइल के प्रोसेस फंक्शन के लिए प्लगइन बनाने की आवश्यकता है। यह आपके सभी स्टोर के लिए चलेगा। यदि आप बस कोर फाइल में बदलाव करते हैं और एक बार अपनी आवश्यकता पूरी होने या नहीं होने की जांच करते हैं? यदि इस संशोधन के साथ सभी ठीक हैं, तो इसके बाद आप इसके लिए प्लगइन बनाएं।
बलवंत सिंह

ठीक है, कल यह कोशिश करेंगे और फिर आपको जवाब देंगे।
फेलिक्स शॉनहेर

इसने केवल कार्ट के सारांश में मूल्य को बदल दिया, लेकिन उत्पादों की कीमत बस एक ही है
फेलिक्स शोनहेर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.