Скрытие способа доставки для текущего вошедшего в систему/гостя, если метод условия


Я использую Magento 2.1. В настоящее время у меня есть два способа доставки. Один из них - UPS, а другой - плоский. Если атрибут моего продукта возвращает значение true, я хочу скрыть метод доставки с фиксированной скоростью только для внешнего интерфейса, для вошедшего/Гостя пользователя, и если атрибут продукта возвращает значение false, я должен скрыть метод доставки UPS. Как я могу написать код для того же самого в своем пользовательском модуле.

Author: Marius, 2017-02-21

1 answers

Предположим, что код атрибута называется attribute_code, поэтому имя получателя getAttributeCode().

Вам необходимо создать плагин arround для модели flatrate carrier и модели UPS carrier, где вы можете проверить свои условия и вернуть или не вернуть результат по тарифу доставки.

Вам нужно создать модуль и добавить его в файл di.xml

<type name="Magento\OfflineShipping\Model\Carrier\Flatrate">
    <plugin name="[module]-flatrate" type="[Vendor]\[Module]\Plugin\Flatrate" />
</type>

<type name="Magento\Ups\Model\Carrier">
    <plugin name="[module]-ups" type="[Vendor]\[Module]\Plugin\Ups" />
</type>

Затем создайте файл [Vendor]/[Module]/Plugin/Flatrate.php

<?php 

namespace [Vendor]\[Module]\Plugin;

class Flatrate
{
    public function arroundCollectRates(
        \Magento\OfflineShipping\Model\Carrier\Flatrate $subject,
        \Closure $proceed,
        Magento\Quote\Model\Quote\Address\RateRequest $request
    ) {
        $items = $request->getAllItems();
        foreach ($items as $item) {
            if ($item->getProduct()->getAttributeCode()) {
                 //if your attribute value is true don't show this method
                 return false;
            }
        }
        return $proceed();
    }
}

И этот класс плагинов, который обрабатывает способ доставки ИБП [Vendor]/[Module]/Plugin/Ups.php

<?php 

namespace [Vendor]\[Module]\Plugin;

class Ups
{
    public function arroundCollectRates(
        \Magento\OfflineShipping\Model\Carrier\Ups $subject,
        \Closure $proceed,
        Magento\Quote\Model\Quote\Address\RateRequest $request
    ) {
        $items = $request->getAllItems();
        foreach ($items as $item) {
            if ($item->getProduct()->getAttributeCode()) {
                 //if one attribute value is true show the method
                 return $proceed();
            }
        }
        //if all the products had the value false don't show UPS.
        return false;
    }
}

Но имейте в виду, что я не тестировал код, поэтому следите за опечатками.

 3
Author: Marius, 2017-02-21 14:57:16