Magento 2 : Controller에서 제품 가격 변경이 현재 작동하지 않습니다!


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

안녕하세요 소니, 아니오 버튼을 클릭하면 제품이 장바구니에 추가되는 경우가 아니라 가격을 변경하고 싶습니다. 지금은 테스트를 위해 모든 제품의 가격을 100 $로 변경하고 싶습니다. 코드를 더 보여주기 위해 질문을 업데이트하겠습니다.
Felix Schönherr

죄송합니다, 당신이 무엇을 시도하는지 이해하지 못합니다. 코드를 살펴보면 바구니에있는 품목의 가격을 변경하려고합니다. 실제로을 (를)에서 호출하고 quote있습니다 checkoutSession. 약간 혼란 스러워요.
Sony

예, 장바구니에있는 품목의 가격을 변경하고 싶습니다. 나는 이것을 달성하기 위해 다른 것들도 시도했으며 마지막으로 시도한 것은 인용 부호가있는 현재 코드입니다.
Felix 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()메소드 의 끝에서 호출되는 이벤트에서 가격을 변경 하고 마 젠토는 마지막에 카트를 저장합니다. 따라서 귀하의 경우 컨트롤러에 견적을 저장해야합니다.


좋아, 가격이 지금 변경되었습니다 (업데이트 된 질문을보십시오). 소계가 변경되지 않습니다.
Felix Schönherr

또한 결제를 클릭하면 가격이 다시 동일합니다
Felix Schönherr

인용 모델, 특히 collectTotals () 메소드를 살펴 봐야한다고 생각합니다. 다시 계산하려면 Magento에 요청하는 $ this-> setTotalsCollectedFlag (false) 플래그를 설정해야합니다.
Sony

불행히도 이것은 나를 위해 작동하지 않았다 :(
Felix Schönherr

많은 다른 방법으로 시도했지만 결코 효과가 없었습니다.
Felix Schönherr


3

당신은 행 전체가 아닌 부분 합계, 사용 방법을 업데이트 할 $item->setRowTotal()$item->setBaseRowTotal(). 또한 $item->save()루프가 끝나기 전에 추가하는 것이 좋습니다 .

소계는 차수 / 장 소계입니다.


불행히도 이것은 아무것도 바뀌지 않았습니다. 그러나 귀하의 답변을 주셔서 감사합니다
펠릭스 Schönherr

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

참고 : 코드 테스트


당신을 위해 일했지만 나를 위해 일하지 않았습니다.
Felix Schönherr

이 for 루프 외부에서 이것을 시도 했습니까 ($ subTotal = $ cart-> getQuote ()-> setSubtotal ($ subtotalprice);)
Arunprabakaran M

그래, 내가 이런 짓을 당신은 말했다 정확히
펠릭스 Schönherr

setSubtotal이 작동하지 않습니다. 옳은? 다른 set 메소드는 setprice와 같이 잘 작동합니까? 옳은?
Arunprabakaran M

네 맞습니다 ....
Felix Schönherr

3

Upadate 카트 가격의 경우 모델 카트 대신 결제 세션을 사용해야합니다. 장바구니에서 항목을로드하고 업데이트하십시오.

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

사실은 미안 작동하지 않습니다
펠릭스 Schönherr

그것은 내 작업 코드입니다, 내가 모든 모듈이 될 Work.may합니다 API.It하여 사용자 지정 가격 견적을 만드는거야 당신의 측면을 충돌
케탄 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;
    }

참고 : magento 코어 파일을 수정하지 마십시오. 이를위한 플러그인을 만듭니다.

나는 그것이 도움이되기를 바랍니다 ... !!!


그러나이 상점과 동일한 상점에서 실행되는 다른 확장 프로그램에 대한 플러그인을 작성하면 Validator.php의 플러그인도 작성됩니다. 하나만 작동합니다. 진실?
Felix Schönherr

@felix : 아니요, validator.php 파일의 프로세스 기능을 위해 플러그인을 만들어야합니다. 모든 상점에서 실행됩니다. 먼저 코어 파일을 변경하고 요구 사항이 충족되는지 확인하십시오. 이 수정으로 모두 괜찮다면 플러그인을 만든 후.
Balwant Singh

좋아, 내일 이것을 시도하고 당신에게 대답을 줄 것이다.
Felix Schönherr '

이것은 카트 요약에서 가격 만 변경했지만 제품 가격은 그대로 유지됩니다.
Felix Schönherr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.