Magento \\ OfflineShipping \\ Model \\ SalesRule \\ Calculator Magento 2の$ rulesApplier引数に指定された無効なパラメーター構成

2020-05-20 parameters arguments magento2

このルールは、applyRules()を使用してルールを適用する前に、RulesApplierクラスのSalesRuleモジュールをカスタムモジュールに書き換えて、追加の検証を追加するときに発生しました。

私のdi.xml

  <type name="Magento\SalesRule\Model\Validator">
    <arguments>
        <argument name="rulesApplier" xsi:type="array">Custom\SalesRule\Model\RulesApplier</argument>
    </arguments>
</type>

私のクラス

namespace Custom\SalesRule\Model;

use Magento\SalesRule\Model\Rule\Action\Discount\CalculatorFactory;
use Magento\Framework\Event\ManagerInterface;
use Magento\SalesRule\Model\Utility;
use Magento\SalesRule\Model\Quote\ChildrenValidationLocator;
use Magento\SalesRule\Model\Rule\Action\Discount\DataFactory;
use Magento\SalesRule\Api\Data\RuleDiscountInterfaceFactory;
use Magento\SalesRule\Api\Data\DiscountDataInterfaceFactory;


class RulesApplier extends \Magento\SalesRule\Model\RulesApplier 
{

/**
 * custom validation before applying rule
 * 
 * @param \Magento\SalesRule\Model\Rule\Action\Discount\CalculatorFactory\CalculatorFactory $calculatorFactory
 * @param \Magento\Framework\Event\ManagerInterface $eventManager
 * @param \Magento\SalesRule\Model\Utility $utility
 * @param \Magento\SalesRule\Model\Quote\ChildrenValidationLocator|null $childrenValidationLocator
 * @param DataFactory|null $discountDataFactory
 * @param RuleDiscountInterfaceFactory|null $discountInterfaceFactory
 * @param DiscountDataInterfaceFactory|null $discountDataInterfaceFactory
 */
public function __construct(
    CalculatorFactory $calculatorFactory, 
    ManagerInterface $eventManager, 
    Utility $utility, 
    ChildrenValidationLocator $childrenValidationLocator = null,
    DataFactory $discountDataFactory = null,
    RuleDiscountInterfaceFactory $discountInterfaceFactory = null,
    DiscountDataInterfaceFactory $discountDataInterfaceFactory = null
) {
    parent::_construct(
        $calculatorFactory, 
        $eventManager, 
        $utility, 
        $childrenValidationLocator,
        $discountDataFactory,
        $discountInterfaceFactory,
        $discountDataInterfaceFactory
    );
}

/**
 * Apply rules to current order item
 *
 * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item
 * @param \Magento\SalesRule\Model\ResourceModel\Rule\Collection $rules
 * @param bool $skipValidation
 * @param mixed $couponCode
 * @return array
 * @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
public function applyRules($item, $rules, $skipValidation, $couponCode) 
{
    $address = $item->getAddress();
    $appliedRuleIds = [];
    /* @var $rule \Magento\SalesRule\Model\Rule */
    foreach ($rules as $rule) {
        if (!$this->validatorUtility->canProcessRule($rule, $address)) {
            continue;
        }

        if (!$skipValidation && !$rule->getActions()->validate($item)) {
            if (!$this->childrenValidationLocator->isChildrenValidationRequired($item)) {
                continue;
            }
            $childItems = $item->getChildren();
            $isContinue = true;
            if (!empty($childItems)) {
                foreach ($childItems as $childItem) {
                    if ($rule->getActions()->validate($childItem)) {
                        $isContinue = false;
                    }
                }
            }
            if ($isContinue) {
                continue;
            }
        }

        $this->applyRule($item, $rule, $address, $couponCode);
        $appliedRuleIds[$rule->getRuleId()] = $rule->getRuleId();

        if ($rule->getStopRulesProcessing()) {
            break;
        }
    }

    return $appliedRuleIds;
}

実際には、カートに適用できる制限数量をカートに適用するルールなどのカスタム検証で検証したいです。

顧客がカートに5つの製品を追加し、管理者がクーポンごとに顧客ごとに3つだけ割引できると仮定すると、クーポンを3つの最低価格アイテムのみに適用するカスタムの取り組みを追加する必要があります。

誰かが私が間違っているところを私に案内できますか?

ありがとう ハッピーコーディング!!

Answers

引数を深く検索した後、投稿されたコードの小さな変更によって解決された問題を最終的に理解します。

注入された引数は配列ではなくクラスオブジェクトであるため、xsi:type = "array"をxsi:type = "object"に置き換えます。

交換する

<argument name="rulesApplier" xsi:type="array">Custom\SalesRule\Model\RulesApplier</argument>

沿って

 <argument name="rulesApplier" xsi:type="object">Custom\SalesRule\Model\RulesApplier</argument>

これが皆さんに役立つことを願っています!!

ハッピーコーディング

Related