Скрытие способа доставки для текущего вошедшего в систему/гостя, если метод условия
Я использую Magento 2.1. В настоящее время у меня есть два способа доставки. Один из них - UPS, а другой - плоский. Если атрибут моего продукта возвращает значение true, я хочу скрыть метод доставки с фиксированной скоростью только для внешнего интерфейса, для вошедшего/Гостя пользователя, и если атрибут продукта возвращает значение false, я должен скрыть метод доставки UPS. Как я могу написать код для того же самого в своем пользовательском модуле.
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;
}
}
Но имейте в виду, что я не тестировал код, поэтому следите за опечатками.