这是我需要的: 在文件 vendor/magento/module-sales-rule/Model/Rule/Action/Discount/CartFixed.php 中有一个公共函数计算我想在这个函数中注释一个 If 条件而不修改这个核心文件.
if ($availableDiscountAmount > 0) {
我在自定义模块中创建了一个首选项,但它没有按预期工作。如果有人可以帮助我,我真的很感激。
这是我需要的: 在文件 vendor/magento/module-sales-rule/Model/Rule/Action/Discount/CartFixed.php 中有一个公共函数计算我想在这个函数中注释一个 If 条件而不修改这个核心文件.
if ($availableDiscountAmount > 0) {
我在自定义模块中创建了一个首选项,但它没有按预期工作。如果有人可以帮助我,我真的很感激。
要自定义 Magento 核心文件,您可以使用 Preference 或Plugin。更多细节在这里
在您的情况下,您可以按照以下步骤使用首选项:
<preference for="Magento\SalesRule\Model\Rule\Action\Discount\CartFixed" type="Training\Test\Model\Rule\Action\Discount\CartFixed" />
创建 Training\Test\Model\Rule\Action\Discount\CartFixed.php:
命名空间 Training\Test\Model\Rule\Action\Discount;
使用 Magento\Framework\App\ObjectManager;使用 Magento\Framework\Pricing\PriceCurrencyInterface;使用 Magento\SalesRule\Model\DeltaPriceRound;使用 Magento\SalesRule\Model\Validator;使用 Magento\SalesRule\Model\Rule\Action\DiscountFactory;
类 CartFixed 扩展 \Magento\SalesRule\Model\Rule\Action\Discount\CartFixed { /** * @var string */ 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/composer-patches来编辑核心 Magento 文件
问候
应用程序/代码/Magento/SalesRule/模型/ *
请这样使用
像这样使用
code/Magento/* 核心文件中您需要的任何名称或模块如果您需要更多详细信息,请告诉我它就像 Magento 1 一样,但仅更改了文件夹
它对我有用,它也对你有用
首先添加文件夹 App/Code/Magento/SalesRule/model/folder/file.php
并感谢使用“设置:升级”来更新文件。比命令“setup:di:compile”。
问候纳西姆
添加后请使用编译命令