Magento2: обновление строки кода в основном файле

Вот что мне нужно:
В файле vendor / magento / module-sales-rule / Model / Rule / Action / Discount / CartFixed.php есть открытая функция рассчитать
Я хочу прокомментировать условие If внутри этой функции без изменения этого файла ядра.

if ($ availableDiscountAmount> 0) {

Я создал предпочтение внутри пользовательского модуля, но он не работает должным образом. Я действительно ценю, если кто-нибудь может помочь мне в этом.

0

Решение

Чтобы настроить основной файл Magento, вы можете использовать Preference или Plugin. Более подробно здесь

В вашем случае вы можете использовать предпочтения в качестве следующих шагов:

  1. В di.xml вы можете добавить справочный конфиг:

<preference for="Magento\SalesRule\Model\Rule\Action\Discount\CartFixed" type="Training\Test\Model\Rule\Action\Discount\CartFixed" />

  1. Создать Обучение \ Тест \ Модель \ Правило \ Действие \ Скидка \ CartFixed.php:

    • @author Бах Ли
      * /

    Тренировка пространства имен \ Test \ Model \ Rule \ Action \ Discount;

    использовать Magento \ Framework \ App \ ObjectManager;
    использовать Magento \ Framework \ Pricing \ PriceCurrencyInterface;
    use Magento \ SalesRule \ Model \ DeltaPriceRound;
    использовать Magento \ SalesRule \ Model \ Validator;
    использовать Magento \ SalesRule \ Model \ Rule \ Action \ DiscountFactory;

    класс CartFixed extends \ Magento \ SalesRule \ Model \ Rule \ Action \ Discount \ CartFixed
    {
    / **
    * строка @var
    * /
    private static $ discountType = ‘CartFixed’;
    / **
    * @var DeltaPriceRound
    * /
    private $ deltaPriceRound;

    /**
    * @param Validator $validator
    * @param DataFactory $discountDataFactory
    * @param PriceCurrencyInterface $priceCurrency
    * @param DeltaPriceRound $deltaPriceRound
    */
    public function __construct(
    Validator $validator,
    DataFactory $discountDataFactory,
    PriceCurrencyInterface $priceCurrency,
    DeltaPriceRound $deltaPriceRound = null
    ) {
    $this->deltaPriceRound = $deltaPriceRound ?: ObjectManager::getInstance()->get(DeltaPriceRound::class);
    
    parent::__construct($validator, $discountDataFactory, $priceCurrency, $deltaPriceRound);
    }
    
    /**
    * @param \Magento\SalesRule\Model\Rule $rule
    * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item
    * @param float $qty
    * @return \Magento\SalesRule\Model\Rule\Action\Discount\Data
    * @throws \Magento\Framework\Exception\LocalizedException
    */
    public function calculate($rule, $item, $qty)
    {
    /** @var \Magento\SalesRule\Model\Rule\Action\Discount\Data $discountData */
    $discountData = $this->discountFactory->create();
    
    $ruleTotals = $this->validator->getRuleItemTotalsInfo($rule->getId());
    
    $quote = $item->getQuote();
    $address = $item->getAddress();
    
    $itemPrice = $this->validator->getItemPrice($item);
    $baseItemPrice = $this->validator->getItemBasePrice($item);
    $itemOriginalPrice = $this->validator->getItemOriginalPrice($item);
    $baseItemOriginalPrice = $this->validator->getItemBaseOriginalPrice($item);
    
    /**
    * prevent applying whole cart discount for every shipping order, but only for first order
    */
    if ($quote->getIsMultiShipping()) {
    $usedForAddressId = $this->getCartFixedRuleUsedForAddress($rule->getId());
    if ($usedForAddressId && $usedForAddressId != $address->getId()) {
    return $discountData;
    } else {
    $this->setCartFixedRuleUsedForAddress($rule->getId(), $address->getId());
    }
    }
    $cartRules = $address->getCartFixedRules();
    if (!isset($cartRules[$rule->getId()])) {
    $cartRules[$rule->getId()] = $rule->getDiscountAmount();
    }
    
    $availableDiscountAmount = (float)$cartRules[$rule->getId()];
    $discountType = self::$discountType . $rule->getId();
    
    $store = $quote->getStore();
    if ($ruleTotals['items_count'] <= 1) {
    $quoteAmount = $this->priceCurrency->convert($availableDiscountAmount, $store);
    $baseDiscountAmount = min($baseItemPrice * $qty, $availableDiscountAmount);
    $this->deltaPriceRound->reset($discountType);
    } else {
    $ratio = $baseItemPrice * $qty / $ruleTotals['base_items_price'];
    $maximumItemDiscount = $this->deltaPriceRound->round(
    $rule->getDiscountAmount() * $ratio,
    $discountType
    );
    
    $quoteAmount = $this->priceCurrency->convert($maximumItemDiscount, $store);
    
    $baseDiscountAmount = min($baseItemPrice * $qty, $maximumItemDiscount);
    $this->validator->decrementRuleItemTotalsCount($rule->getId());
    }
    
    $baseDiscountAmount = $this->priceCurrency->round($baseDiscountAmount);
    
    $availableDiscountAmount -= $baseDiscountAmount;
    $cartRules[$rule->getId()] = $availableDiscountAmount;
    if ($availableDiscountAmount <= 0) {
    $this->deltaPriceRound->reset($discountType);
    }
    
    $discountData->setAmount($this->priceCurrency->round(min($itemPrice * $qty, $quoteAmount)));
    $discountData->setBaseAmount($baseDiscountAmount);
    $discountData->setOriginalAmount(min($itemOriginalPrice * $qty, $quoteAmount));
    $discountData->setBaseOriginalAmount($this->priceCurrency->round($baseItemOriginalPrice));
    $address->setCartFixedRules($cartRules);
    
    return $discountData;
    }
    

    }

Или вы можете использовать cweagans / композитор-пластыри следующий этот вопрос редактировать основные файлы Magento

С уважением

1

Другие решения

Используйте как это

код / ​​Magento / * любое имя или модуль, который вам нужен из основного файла
Если вам нужно больше деталей, дайте мне знать, что это похоже на Magento 1, но изменяется только папка

0

Приложение / Код / Magento / SalesRule / модель / *

Пожалуйста, используйте это так

0

После добавления используйте команду compile

0

Это работает для меня, это будет работать для вас также

Сначала добавьте папки
App / код / ​​Magento / SalesRule / модель / папка / file.php

И спасибо использовать настройки: оценка
Чем команда setup: di: compile

С уважением
Насим

0
По вопросам рекламы [email protected]