ম্যাজেন্টো 2: কন্ট্রোলারে পণ্যের দাম পরিবর্তন এই মুহুর্তে কাজ করে না!


9

আমি আমার পণ্যগুলির দামটি এভাবে পরিবর্তন করার চেষ্টা করেছি:

Controller.php:

[Edit]

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

(সম্পাদনা) নতুন কোডের সাথে দামের পরিবর্তন হয় তবে সাবটোটাল হয় না! আপনি এখানে দেখতে পারেন: এখানে চিত্র বর্ণনা লিখুন

আগাম ধন্যবাদ!


হাই, আপনি বিস্তারিত বলতে পারেন? আপনি কোন নিয়ামক ব্যবহার করেন এবং আপনার কাজটি কী? যখন কোনও গ্রাহক কার্টে একটি পণ্য যুক্ত করেন আপনি কি দাম পরিবর্তন করতে চান?
সোনি

হ্যালো সনি, না আমি দাম পরিবর্তন করতে চাই না, যদি একটি বোতাম ক্লিক করা হয়, তবে কোনও পণ্য কার্টে যুক্ত হচ্ছে কিনা। আপাতত আমি পরীক্ষার জন্য সমস্ত পণ্যের দামকে 100 to এ পরিবর্তন করতে চাই। আমি আপনাকে আরও কিছু কোড দেখাতে আমার প্রশ্নটি আপডেট করব
ফেলিক্স শ্নেরার

দুঃখিত, আপনি কী চেষ্টা করছেন তা বুঝতে না পেরে আমি ভীত। আমি যখন আপনার কোডটি দেখি, আপনি আপনার ঝুড়িতে থাকা আইটেমের দাম পরিবর্তন করতে চান। প্রকৃতপক্ষে আপনি প্রভুর quoteকাছ থেকে কল করছেন checkoutSession। আমি একটু বিভ্রান্ত।
সনি

হ্যাঁ আমি আমার ঝুড়ির আইটেমের দাম পরিবর্তন করতে চাই। এটি অর্জনের জন্য আমি কিছু অন্যান্য জিনিসও চেষ্টা করেছিলাম এবং সর্বশেষে চেষ্টা করেছি হ'ল উদ্ধৃতি সহ বর্তমান কোড।
ফেলিক্স শ্নেরার

দামের পরিবর্তনটি আপনার জন্য যে কোনও প্লাগইন বা পর্যবেক্ষক ব্যবহার করতে হবে সেই নিয়ামক ব্যবহার করে কাজ করবে না।
আসিম গোরিয়া

উত্তর:


5

আমি এটি পেয়েছি, আমি মনে করি আপনি সঠিক পথে আছেন তবে আমি মনে করি আপনাকে উদ্ধৃতিটি সংরক্ষণ করতে হবে। আপনি যদি এই শ্রেণিতে একবার দেখে থাকেন: \Magento\Checkout\Controller\Cart\Add আপনি লাইন 114 এ দেখতে পারেন:

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

            $this->cart->save();

addProduct()পদ্ধতির শেষে বলা হওয়া ইভেন্ট থেকে আমি দামটি পরিবর্তন করি এবং ম্যাজেন্টো শেষে কার্টটি সংরক্ষণ করে। সুতরাং আপনার ক্ষেত্রে, আপনাকে আপনার নিয়ামকের উদ্ধৃতি সংরক্ষণ করতে হবে।


ঠিক আছে, দাম এখন পরিবর্তিত হবে (আমার আপডেট হওয়া প্রশ্নটি দেখুন), তবে উপমোটাল বদল হবে না, কোনও ধারণা?
ফেলিক্স শানহের

এছাড়াও আপনি যদি চেকআউটটিতে ক্লিক করেন তবে দাম আবার একই
ফেলিক্স শ্নেরার

আমি মনে করি আপনাকে উদ্ধৃতি মডেলটি বিশেষত কালেক্টটটালস () পদ্ধতিতে দেখে নিতে হবে। আপনাকে পতাকাটি সেট করতে হবে - এই>> সেটটোটালস কালেক্টফ্লেগ (মিথ্যা) যা ম্যাগেন্টোকে আবার গণনা করতে বলে।
সনি

দুর্ভাগ্যক্রমে এটি আমার পক্ষে কার্যকর হয়নি :(
ফেলিক্স শ্নেরার

এটি বিভিন্ন উপায়ে চেষ্টা করেছেন এবং এটি কখনও কার্যকর হয়নি।
ফেলিক্স শ্নেরার

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();
?>

আসলে এটি কাজ করছে না, দুঃখিত
ফেলিক্স শ্নেরার

এটি আমার ওয়ার্কিং কোড, আমি এপিআই দ্বারা কাস্টম প্রাইস দ্বারা উদ্ধৃতি তৈরি করছি t এটি অবশ্যই কাজ করবে maআপনার পক্ষে কোনও মডিউল বিবাদ করতে পারে
কেতন বোরাদা

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

দ্রষ্টব্য: ম্যাজেন্টো কোর ফাইলগুলি সংশোধন করবেন না। এর জন্য প্লাগইন তৈরি করুন।

আমি আশা করি এটি সাহায্য করবে ... !!!


তবে যদি আমি এটির জন্য এবং অন্য একটি এক্সটেনশনের জন্য একটি প্লাগইন তৈরি করি, যা একই দোকানে চালিত হয়, এছাড়াও Validator.php এর একটি প্লাগইন তৈরি করে কেবল একটিই কাজ করবে। সত্য?
ফেলিক্স শ্নেরার

@ ফেলিক্স: না, আপনাকে কেবল বৈধতা.পিএফপি ফাইলের প্রক্রিয়া ফাংশনের জন্য প্লাগইন তৈরি করতে হবে। এটি আপনার সমস্ত স্টোরের জন্য চলবে fi প্রথমটি আপনি কেবলমাত্র মূল ফাইলটিতে পরিবর্তন করেন এবং একবার আপনার প্রয়োজনীয়তাটি পূরণ হয় কিনা তা পরীক্ষা করে দেখুন? যদি এই পরিবর্তনটির সাথে সমস্ত ঠিক থাকে তবে আপনি এর জন্য প্লাগইন তৈরি করার পরে।
বলওয়ন্ত সিং

ঠিক আছে, আগামীকাল এটি চেষ্টা করে দেখুন এবং তারপরে আপনাকে একটি উত্তর দেবে।
ফেলিক্স শানহির

এটি কেবল কার্টের সারাংশের
দামকেই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.