Magento 2: Mengubah Harga Produk di Kontroler tidak berfungsi saat ini!


9

Saya mencoba mengubah Harga Produk saya seperti ini:

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

(EDIT) Dengan kode baru perubahan harga, tetapi subtotal tidak! Seperti yang Anda lihat di sini: masukkan deskripsi gambar di sini

Terima kasih sebelumnya!


Hai, bisakah Anda menjelaskan? controller mana yang Anda gunakan, dan apa tugas Anda? Apakah Anda ingin mengubah harga saat pelanggan menambahkan produk ke troli?
Sony

Halo Sony, tidak, saya ingin mengubah harga, jika tombol diklik, tidak jika suatu produk ditambahkan ke troli. Untuk saat ini saya hanya ingin mengubah harga semua produk menjadi $ 100 untuk pengujian. Saya akan memperbarui pertanyaan saya untuk menunjukkan kepada Anda beberapa kode lagi
Felix Schönherr

Maaf, saya takut tidak mengerti apa yang Anda coba. Ketika saya melihat kode Anda, Anda ingin mengubah harga barang-barang yang ada di keranjang Anda. Memang Anda memanggil quotedari checkoutSession. Saya sedikit bingung.
Sony

Ya, saya ingin mengubah harga barang di keranjang saya. Saya mencoba beberapa hal lain juga untuk mencapai ini dan yang terakhir saya coba adalah kode saat ini dengan kutipan.
Felix Schönherr

Perubahan harga tidak akan berfungsi menggunakan pengontrol yang Anda butuhkan untuk menggunakan plugin atau pengamat untuk itu.
Aasim Goriya

Jawaban:


5

Saya mengerti, saya pikir Anda berada di jalan yang benar, tetapi saya pikir Anda harus menyimpan kutipannya. Jika Anda melihat kelas ini: \Magento\Checkout\Controller\Cart\Add Anda dapat melihat di Baris 114:

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

            $this->cart->save();

Saya mengubah harga dari acara yang disebut di akhir addProduct()metode, dan Magento menyimpan keranjang di akhir. Jadi dalam kasus Anda, Anda harus menyimpan kutipan di controller Anda.


Oke, Harga berubah sekarang (lihat Pertanyaan saya yang diperbarui), tetapi subtotalnya tidak berubah, ada ide?
Felix Schönherr

juga jika Anda kemudian mengklik checkout, harganya sama lagi
Felix Schönherr

Saya pikir Anda harus melihat pada Model Kutipan, terutama pada metode collectTotals (). Anda harus mengatur flag $ this-> setTotalsCollectedFlag (false) yang meminta Magento untuk menghitung lagi.
Sony

Sayangnya ini tidak berhasil untuk saya :(
Felix Schönherr

Mencobanya dalam banyak cara yang berbeda dan tidak pernah berhasil.
Felix Schönherr


3

Anda ingin memperbarui total baris dan bukan subtotal, gunakan metode $item->setRowTotal()atau $item->setBaseRowTotal(). Juga, mungkin membantu menambahkan $item->save()sebelum akhir dari loop.

Subtotal adalah urutan / cart subtotal.


Sayangnya ini tidak mengubah apa pun. Tetapi terima kasih atas jawaban Anda
Felix Schönherr

3

@ felix, Anda perlu mengatur setSubtotal()penawaran. Atur Subtotal di luar f or loop.

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

seperti ini

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

Catatan: Kode Diuji


Mungkin bekerja untukmu, tapi tidak untukku.
Felix Schönherr

Apakah Anda mencoba ini ($ subTotal = $ cart-> getQuote () -> setSubtotal ($ subtotalprice);) di luar ini untuk loop
Arunprabakaran M

ya, saya melakukan ini persis seperti yang Anda katakan
Felix Schönherr

setSubtotal tidak berfungsi. benar? metode set lain bekerja dengan baik seperti setprice? benar?
Arunprabakaran M

Ya benar ....
Felix Schönherr

3

Untuk harga keranjang Upadate, Anda harus menggunakan kereta Model alih-alih checkout. Muat item dari keranjang dan perbarui.

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

Sebenarnya itu tidak berfungsi, maaf
Felix Schönherr

Ini kode kerja saya, saya membuat Kutipan oleh harga khusus oleh API. Ini harus Work.may menjadi modul apa pun yang bertentangan dengan Anda
Ketan Borada

0

Coba kode di bawah ini:

Anda perlu memodifikasi process()fungsi untuk kebutuhan Anda.

vendor / magento / modul-aturan penjualan / Model / 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;
    }

CATATAN: Jangan modifikasi file inti magento. Buat plugin untuk ini.

Saya harap ini akan membantu ... !!!


Tetapi jika saya membuat plugin untuk ini dan satu ekstensi lainnya, yang berjalan di toko yang sama, juga membuat plugin dari Validator.php hanya satu yang akan berfungsi. benar?
Felix Schönherr

@ Feliks: Tidak, Anda hanya perlu membuat plugin untuk fungsi proses dari file validator.php. itu akan berjalan untuk semua store.first Anda baru saja membuat perubahan pada file inti dan memeriksa setelah kebutuhan Anda terpenuhi atau tidak? Jika semua setuju dengan modifikasi ini maka setelah Anda membuat plugin untuk ini.
Balwant Singh

Ok, akan coba ini besok dan kemudian akan memberi Anda balasan.
Felix Schönherr

Ini hanya mengubah Harga dalam ringkasan keranjang, tetapi harga produk tetap sama
Felix Schönherr
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.