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!

Felix Schönherr
sumber
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.

Sony
sumber
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

Saya membuat cuplikan yang memungkinkan Anda mengubah harga. Sebenarnya, itu mengubah harga setelah Anda menambahkan produk di keranjang Anda. Dengan kata lain, itu mengubah harga barang Anda dalam penawaran Anda. https://gist.github.com/0-Sony/d9d2ea792b5533bfeaff28827e6f207a

Semoga ini bisa membantu.

Sony
sumber
Maaf itu tidak membantu, saya tidak bisa menggunakan pengamat, saya perlu menggunakan controller saya
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.

coderGeek
sumber
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

Arunprabakaran M
sumber
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();
?>
Ketan Borada
sumber
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 ... !!!

Balwant Singh
sumber
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