Magento 2: Denetleyicideki Ürün Fiyatını Değiştirme şu anda çalışmıyor!


9

Ürünlerimin Fiyatını şu şekilde değiştirmeye çalıştım:

Controller.php:

[DÜZENLE]

   <?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) Yeni kodla birlikte fiyat değişiyor, ancak ara toplam değişmiyor! Burada görebileceğiniz gibi: resim açıklamasını buraya girin

Şimdiden teşekkürler!


Merhaba, biraz ayrıntı verebilir misin? hangi denetleyiciyi kullanıyorsunuz ve göreviniz nedir? Bir müşteri sepete bir ürün eklediğinde fiyatı değiştirmek ister misiniz?
Sony

Merhaba Sony, hayır, bir ürün sepete ekleniyorsa değil, bir düğme tıklanırsa fiyatı değiştirmek istiyorum. Şimdilik sadece test için tüm ürünlerin fiyatını 100 $ olarak değiştirmek istiyorum. Size daha fazla kod göstermek için sorumu güncelleyeceğim
Felix Schönherr

Üzgünüm, ne denediğini anlamıyorum. Kodunuza baktığımda, sepetinizdeki ürünlerin fiyatlarını değiştirmek istiyorsunuz. Gerçekten quotede checkoutSession. Biraz kafam karıştı.
Sony

Evet Sepetimdeki ürünlerin fiyatlarını değiştirmek istiyorum. Bunu başarmak için başka şeyler de denedim ve sonuncusu alıntı ile geçerli kod.
Felix Schönherr

Fiyat değişikliği, bunun için eklenti veya gözlemci kullanmanız gereken denetleyiciyi kullanarak çalışmaz.
Aasim Goriya

Yanıtlar:


5

Anladım, sanırım doğru yoldasın, ama sanırım teklifi saklamak zorundasın. Bu sınıfa bakarsanız: \Magento\Checkout\Controller\Cart\Add Line 114'te görebilirsiniz:

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

            $this->cart->save();

Fiyatı, addProduct()yöntemin sonunda çağrılan olaydan değiştiriyorum ve Magento sonunda arabayı kaydediyor. Yani sizin durumunuzda, teklifi kontrolörünüze kaydetmelisiniz.


Tamam, fiyat şimdi değişti (güncellenmiş soruma bakın), ama ara toplam değişmeyecek, herhangi bir fikir?
Felix Schönherr

Ayrıca ödeme tıklayın, fiyat yine aynı
Felix Schönherr

Sanırım Alıntı Modeli, özellikle collectTotals () yöntemine bir göz atmanız gerekir. Magento'dan tekrar hesaplamasını isteyen $ this-> setTotalsCollectedFlag (false) bayrağını ayarlamanız gerekir.
Sony

Ne yazık ki bu benim için işe yaramadı :(
Felix Schönherr

Çok farklı şekillerde denedim ve asla işe yaramadı.
Felix Schönherr


3

Ara toplamı değil alt toplamı güncellemek istediğiniz yöntemi $item->setRowTotal()veya yöntemini kullanın $item->setBaseRowTotal(). Ayrıca, $item->save()döngü bitmeden önce eklemek yardımcı olabilir .

Alt toplam, sipariş / alışveriş sepeti alt toplamıdır.


Ne yazık ki bu hiçbir şeyi değiştirmedi. Ama cevabınız için teşekkürler
Felix Schönherr

3

@ felix, setSubtotal()bir teklif ayarlamanız gerekiyor . Ara toplamı dışa ayarla f or loop.

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

bunun gibi

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

Not: Kod Test Edildi


Mayıs senin için çalıştı, ama benim için değil.
Felix Schönherr

Bunu bunun için denediniz mi ($ subTotal = $ cart-> getQuote () -> setSubtotal ($ subtotalprice);) bunun dışında döngü için
Arunprabakaran M

evet, tam olarak söylediğin gibi yaptım
Felix Schönherr

setSubtotal sadece çalışmıyor. doğru? setprice gibi iyi çalışan diğer set yöntemleri? doğru?
Arunprabakaran M

Evet doğru ....
Felix Schönherr

3

Güncel araba fiyatı için ödeme oturumu yerine Model sepeti kullanmanız gerekir. Ürünü alışveriş sepetinden yükleyin ve güncelleyin.

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

Aslında çalışmıyor, üzgünüm
Felix Schönherr

Bu benim çalışma kodum, API tarafından özel fiyat ile teklif oluşturuyorum.İş olmalı. Herhangi bir modül yanınızda çatışmalar olabilir
Ketan Borada

0

Aşağıdaki kodu deneyin:

İhtiyaçlarınız için process()işlevi değiştirmeniz gerekir .

satıcı / Magento / modül satış-kural / Modeli / 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;
    }

NOT: Magento çekirdek dosyalarını değiştirmeyin. Bunun için eklenti oluşturun.

Umarım yardımcı olur ... !!!


Ancak bu ve aynı mağazada çalışan başka bir uzantı için bir eklenti oluşturursam, Validator.php'nin bir eklentisini de oluşturur. doğru?
Felix Schönherr

@felix: Hayır, validator.php dosyasının işlem işlevi için eklenti oluşturmanız yeterlidir. tüm mağazalarınız için çalışacaktır. önce sadece çekirdek dosyada değişiklik yapın ve gereksiniminizi yerine getirip getirmediğini kontrol edin? Bu değişiklikle her şey yolundaysa, bunun için eklenti oluşturduktan sonra.
Balwant Singh

Tamam, yarın deneyecek ve size bir cevap vereceğim.
Felix Schönherr

Bu sadece sepetin özetinde Fiyatı değiştirdi, ancak ürünlerin fiyatı sadece aynı kalıyor
Felix Schönherr
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.