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

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

if ($ availableDiscountAmount> 0) {

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

Вероятно, это неправильный способ применить скидку. Прошло некоторое время с тех пор, как я погрузился в Magento, но насколько я помню, вы должны иметь возможность добавлять скидки в своем собственном модуле, не мешая ядру. Не могли бы вы подробнее объяснить, чего вы пытаетесь достичь?

Kodaloid 18.12.2018 17:37

Привет @Kodaloid, Спасибо за ответ. Я пытаюсь получить отрицательную скидку как фиксированную скидку для всей корзины. Как вы можете видеть здесь screenshots.firefox.com/4XPDOcQ2VHYWxgdj/demostore.work, я добавил «-25» в качестве платы за дизайн. Я сделал модуль с предпочтением, он работает в течение секунды, когда мы переходим в корзину, см. screenshots.firefox.com/haAJZmGaTgaX3Iog/demostore.work Но моя проблема в том, что он автоматически обновляется через секунду, и после этого он исчез, я считаю, что первое предпочтение вызывается, но после этого вызывается файл ядра .

Rex 19.12.2018 18:19

Если вы хотите просмотреть его в действии, посетите здесь demostore.work/Designer/custom-bar-mitzvah-bencher-75

Rex 19.12.2018 18:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
731
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

code/Magento/* any name or module you need from core file If you need some more details let me know it is just like Magento 1 but only folder is changed

Привет, @Muhammad Naseem. До свидания, я думаю, это невозможно, не могли бы вы показать мне, как заставить его работать? Я пытаюсь отредактировать / переопределить этот основной файл vendor / magento / module-sales-rule / Model / Rule / Action / Discount / ‌ CartFixed.php

Rex 19.12.2018 18:25
Ответ принят как подходящий

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

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

  1. В di.xml вы можете добавить эталонную конфигурацию:

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

  1. Создайте Training \ Test \ Model \ Rule \ Action \ Discount \ CartFixed.php:

    • @author Бах Ли * /

    пространство имен Обучение \ Тест \ Модель \ Правило \ Действие \ Скидка;

    используйте 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 строка * / частный статический $ DiscountType = 'CartFixed'; / ** * @var DeltaPriceRound * / частный $ 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

С Уважением

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

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

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

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

Сначала добавьте папки Приложение / Код / Magento / SalesRule / модель / папка / file.php

И благодарим за использование «setup: upgrade» для обновления файлов. Затем выполните команду «setup: di: compile».

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

Другие вопросы по теме