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

(แก้ไข) ด้วยรหัสใหม่การเปลี่ยนแปลงราคา แต่ผลรวมย่อยไม่ได้! คุณสามารถดูได้ที่นี่: ป้อนคำอธิบายรูปภาพที่นี่

ขอบคุณล่วงหน้า!


สวัสดีคุณอธิบายได้ไหม คุณใช้คอนโทรลเลอร์ตัวใดและงานของคุณคืออะไร คุณต้องการเปลี่ยนราคาเมื่อลูกค้าเพิ่มสินค้าลงในตะกร้าหรือไม่
Sony

สวัสดี Sony, ฉันไม่ต้องการเปลี่ยนราคา, ถ้ามีการคลิกปุ่ม, ไม่ว่าจะมีการเพิ่มสินค้าลงในรถเข็นหรือไม่ ตอนนี้ฉันแค่ต้องการเปลี่ยนราคาของผลิตภัณฑ์ทั้งหมดเป็น 100 $ สำหรับการทดสอบ ฉันจะอัปเดตคำถามของฉันเพื่อแสดงรหัสเพิ่มเติมให้กับคุณ
Felix Schönherr

ขออภัยฉันกลัวที่จะไม่เข้าใจสิ่งที่คุณพยายาม เมื่อฉันดูรหัสของคุณคุณต้องการเปลี่ยนราคาสินค้าที่อยู่ในตะกร้าของคุณ อันที่จริงคุณกำลังเรียกจากquote checkoutSessionฉันสับสนเล็กน้อย
Sony

ใช่ฉันต้องการเปลี่ยนราคาสินค้าในตะกร้าของฉัน ฉันลองสิ่งอื่น ๆ เช่นกันเพื่อให้บรรลุสิ่งนี้และสิ่งสุดท้ายที่ฉันลองคือรหัสปัจจุบันที่มีเครื่องหมายคำพูด
เฟลิกซ์Schönherr

การเปลี่ยนแปลงราคาจะไม่ทำงานโดยใช้ตัวควบคุมที่คุณต้องใช้ปลั๊กอินหรือผู้สังเกตการณ์
Aasim Goriya

คำตอบ:


5

ฉันเข้าใจแล้วฉันคิดว่าคุณอยู่ในแนวทางที่ถูกต้อง แต่ฉันคิดว่าคุณต้องรักษาคำพูดไว้ ถ้าคุณดูที่คลาสนี้: \Magento\Checkout\Controller\Cart\Add คุณสามารถดูบรรทัดที่ 114:

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

            $this->cart->save();

ฉันเปลี่ยนราคาจากเหตุการณ์ที่เรียกว่าตอนท้ายของaddProduct()วิธีการและวีโอไอพีจะบันทึกรถเข็นตอนท้าย ดังนั้นในกรณีของคุณคุณต้องบันทึกใบเสนอราคาในคอนโทรลเลอร์ของคุณ


ตกลงราคาได้รับการเปลี่ยนแปลงแล้ว (ดูคำถามที่อัปเดตของฉัน) แต่ผลรวมย่อยจะไม่เปลี่ยนแปลงความคิดใด ๆ
เฟลิกซ์Schönherr

และถ้าคุณคลิกที่เช็คเอาต์ราคาก็จะเหมือนเดิมอีกครั้ง
Felix Schönherr

ฉันคิดว่าคุณต้องดูที่โมเดลการอ้างอิงโดยเฉพาะอย่างยิ่งที่วิธี collectTotals () คุณต้องตั้งค่าสถานะ $ this-> setTotalsCollectedFlag (false) ซึ่งขอให้ Magento คำนวณอีกครั้ง
Sony

น่าเสียดายที่นี่ใช้งานไม่ได้สำหรับฉัน :(
Felix Schönherr

พยายามในหลายวิธีและมันก็ไม่เคยทำงาน
เฟลิกซ์Schönherr

3

ฉันทำตัวอย่างเพื่อให้คุณเปลี่ยนราคา ที่จริงแล้วมันจะเปลี่ยนแปลงราคาหลังจากที่คุณเพิ่มผลิตภัณฑ์ในตะกร้าของคุณ กล่าวอีกนัยหนึ่งมันเปลี่ยนแปลงราคาสินค้าของคุณในใบเสนอราคาของคุณ https://gist.github.com/0-Sony/d9d2ea792b5533bfeaff28827e6f207a

หวังว่ามันจะช่วย


ขออภัยมันไม่ได้ช่วยฉันไม่สามารถใช้ผู้สังเกตการณ์ฉันต้องใช้ตัวควบคุมของฉัน
Felix Schönherr

3

คุณต้องการที่จะปรับปรุงการรวมแถวและไม่ได้ผลรวมย่อยใช้วิธีหรือ$item->setRowTotal() $item->setBaseRowTotal()นอกจากนี้อาจช่วยเพิ่ม$item->save()ก่อนสิ้นสุดลูป

ผลรวมย่อยคือผลรวมย่อยการสั่งซื้อ / รถเข็น


น่าเสียดายที่นี่ไม่มีอะไรเปลี่ยนแปลง แต่ขอบคุณสำหรับคำตอบของคุณ
Felix Schönherr

3

@ felix คุณต้องตั้งค่า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();

หมายเหตุ: รหัสผ่านการทดสอบ


อาจใช้ได้ผลกับคุณ แต่ไม่ใช่สำหรับฉัน
เฟลิกซ์Schönherr

คุณลองสิ่งนี้ ($ subTotal = $ cart-> getQuote () -> setSubtotal ($ subtotalprice);) ข้างนอกนี้สำหรับ loop
Arunprabakaran M

ใช่ฉันทำสิ่งนี้อย่างที่คุณพูด
Felix Schönherr

setSubtotal ไม่ทำงาน แก้ไข? วิธีการชุดอื่น ๆ ทำงานได้ดีเช่น setprice? แก้ไข?
Arunprabakaran M

ใช่ถูกต้อง ....
Felix Schönherr

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

จริงๆแล้วมันใช้งานไม่ได้ขอโทษ
Felix Schönherr

มันเป็นรหัสการทำงานของฉันฉันกำลังสร้างใบเสนอราคาตามราคาที่กำหนดเองโดย API.It ต้อง Work.may เป็นโมดูลใด ๆ ที่ขัดแย้งกับคุณ
Ketan Borada

0

ลองรหัสด้านล่าง:

คุณจำเป็นต้องปรับเปลี่ยนprocess()ฟังก์ชั่นสำหรับความต้องการของคุณ

ผู้ขาย / วีโอไอพี / โมดูลการขายกฎ / รุ่น / 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 เพียงอันเดียวเท่านั้นที่จะใช้งานได้ จริงหรือไม่?
เฟลิกซ์Schönherr

@felix: ไม่คุณเพียงแค่ต้องสร้างปลั๊กอินสำหรับฟังก์ชั่นกระบวนการของไฟล์ validator.php มันจะทำงานสำหรับร้านค้าทั้งหมดของคุณก่อนอื่นคุณต้องทำการเปลี่ยนแปลงในไฟล์ core และตรวจสอบเมื่อความต้องการของคุณเป็นจริงหรือไม่? หากทั้งหมดไม่เป็นไรกับการปรับเปลี่ยนนี้หลังจากนั้นคุณสร้างปลั๊กอินสำหรับสิ่งนี้
Balwant Singh เมื่อ

ตกลงจะลองวันพรุ่งนี้แล้วจะตอบกลับ
เฟลิกซ์Schönherr

สิ่งนี้เปลี่ยนราคาในบทสรุปของรถเข็นเท่านั้น แต่ราคาของผลิตภัณฑ์ยังคงเหมือนเดิม
Felix Schönherr
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.