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

(編集)新しいコードでは価格は変わりますが、小計は変わりません!あなたがここで見ることができるように: ここに画像の説明を入力してください

前もって感謝します!


こんにちは、詳しく説明していただけますか?どのコントローラーを使用していますか、そしてあなたの仕事は何ですか?顧客がカートに商品を追加したときに価格を変更しますか?
ソニー

こんにちはソニー、いいえ、商品がカートに追加されるのではなく、ボタンがクリックされた場合、価格を変更したくありません。今のところ、テストのためにすべての製品の価格を100ドルに変更したいと思います。質問を更新して、さらにコードを表示します
FelixSchönherr'28

申し訳ありませんが、何をしようとしているのか理解できません。コードを見ると、バスケットに入っている商品の価格を変更したいと思っています。実際、quoteからを呼び出していcheckoutSessionます。私は少し混乱しています。
ソニー

はい、バスケットの商品の価格を変更したいのですが。これを達成するために他の方法も試しましたが、最後に試したのは現在のコードと引用符です。
FelixSchönherr19年

価格変更は、プラグインまたはオブザーバーを使用する必要があるコントローラーを使用して機能しません。
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()メソッドの最後に呼び出されるイベントから価格を変更すると、Magentoは最後にカートを保存します。したがって、あなたのケースでは、コントローラーに見積もりを保存する必要があります。


OK、価格は変更されました(私の更新された質問を見てください)が、小計は変更されません。
FelixSchönherr19年

また、チェックアウトをクリックしても、価格は同じです
FelixSchönherr'28

特にCollectTotals()メソッドで、見積もりモデルを確認する必要があると思います。Magentoに再計算を依頼するフラグ$ this-> setTotalsCollectedFlag(false)を設定する必要があります。
ソニー

残念ながら、これは私にはうまく
いき

さまざまな方法で試してみましたが、うまくいきませんでした。
FelixSchönherr19年

3

価格を変更できるスニペットを作成しました。実際、バスケットに商品を追加すると、価格が変更されます。言い換えると、見積もりの​​アイテムの価格を変更します。 https://gist.github.com/0-Sony/d9d2ea792b5533bfeaff28827e6f207a

それが役に立てば幸い。


申し訳ありませんが、それは助け、私はオブザーバを使用しカントはありません、私は私のコントローラを使用する必要がある
フェリックスSchönherr

3

小計ではなく行の合計を更新するには、メソッド$item->setRowTotal()またはを使用します$item->setBaseRowTotal()。また、$item->save()ループが終了する前に追加すると役立つ場合があります。

小計は注文/カートの小計です。


残念ながら、これは何も変わりませんでした。しかし、あなたの答えをありがとう
FelixSchönherr19年

3

@felix、setSubtotal()見積もりを設定する必要があります。fの外側に小計を設定し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();

注:コードテスト済み


あなたのために働くかもしれませんが、私のためではありません。
FelixSchönherr19年

これを試してみましたか($ subTotal = $ cart-> getQuote()-> setSubtotal($ subtotalprice);)このforループ外
Arunprabakaran M

はい、私はあなたが言ったとおりにこれを行いました
FelixSchönherr'19 / 09/05

setSubtotalが機能しないだけです。正しい?他のsetpriceのようにうまく機能するsetメソッド?正しい?
Arunprabakaran M

はい、正解です...
FelixSchönherr19年

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

実際には機能していません。申し訳ありません
FelixSchönherr19年

これは、任意のモジュールでWork.may必要がありますあなたの側競合私はAPI.Itことにより、カスタム価格で見積もりを作成しています、私の作業コードだ
Ketan Borada

0

以下のコードを試してください:

process()要件に合わせて機能を変更する必要があります。

vendor / magento / module-sales-rule / 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;
    }

注: magentoコアファイルは変更しないでください。このためのプラグインを作成します。

それが役に立てば幸い... !!!


しかし、これと同じストアで実行される他の1つの拡張機能のプラグインを作成すると、Validator.phpのプラグインも作成され、1つだけが機能します。ほんと?
FelixSchönherr19年

@felix:いいえ、validator.phpファイルのプロセス関数用のプラグインを作成する必要があります。すべてのストアで実行されます。最初にコアファイルに変更を加え、要件が満たされているかどうかを確認しますか?この変更で問題がなければ、プラグインを作成してください。
Balwant Singh

明日、これを試して、返信します。
フェリックスSchönherr

これはカートの概要の価格のみを変更しましたが、製品の価格は同じままです
FelixSchönherr'19
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.