Я делаю новый способ доставки, и мне нужно добавить новый столбец, чтобы проверить стоимость доставки. Данные будут поступать из пользовательских настроек способа доставки, например, описание метода. Или какое-то поле ввода, в которое клиент может добавить информацию (данные, вероятно, будут сохранены в цитате, а затем по порядку).
Вероятно, самая простая часть всего - реализовать шаблон с помощью
Magento_Checkout/web/template/shipping.html
Это просто нужно
<div data-bind="text: method.description"></div>
Проблема в том, что я не могу понять, как добавить пользовательские данные. Недостаточно добавить это:
public function collectRates(RateRequest $request)
{
if (!$this->isActive()) return false;
$method = $this->rateMethodFactory->create();
$method->setData('carrier', $this->getCarrierCode());
$method->setData('carrier_title', $this->getConfigData('title'));
$method->setData('method_title', $this->getConfigData('title'));
$method->setData('method', $this->getCarrierCode());
$method->setPrice($this->_price);
$method->setData('cost', $this->_price);
// custom
$method->setData('description', $this->getConfigData('description'));
$result = $this->rateResultFactory->create();
$result->append($method);
return $result;
}
Данные для html поступают из js rate (), которая получает данные из API:
<route url="/V1/carts/:cartId/shipping-methods" method="GET">
<service class="Magento\Quote\Api\ShippingMethodManagementInterface" method="getList"/>
<resources>
<resource ref="Magento_Cart::manage" />
</resources>
</route>
После этого есть много шагов, в то время как что-то действительно собирается. я нашел
Magento \ Цитата \ Модель \ Корзина \ ShippingMethodConverter modelToDataObject ()
это выглядело многообещающе, но если я попытаюсь добавить свой атрибут, ничего не произойдет.
Таким образом, мой вопрос, есть ли способ добавить новые данные к стоимости доставки? В М1 это было возможно. Было бы сумасшествием, если бы М2 это было невозможно.
Есть много причин, почему это должно быть возможно. Например, если я хотел сделать метод «забрать в магазине» с выпадающим списком нескольких магазинов или что-то подобное.
источник
Ответы:
Вы должны сделать это, добавив описание в качестве атрибута расширения, как показано ниже:
/etc/extension_attributes.xml должен выглядеть следующим образом:
В файле etc / di.xml добавьте плагин для переопределения modelToDataObject () в Magento \ Quote \ Model \ Cart \ ShippingMethodConverter, как показано ниже:
Файл плагина Vendor \ module \ Plugin \ Carrier \ Description.php должен выглядеть следующим образом:
После всего этого вы получите это описание на сайте, как показано ниже:
источник
Ответ с самым высоким рейтингом не работает, потому что он забыл установить значение "description" внутри класса \ Magento \ Quote \ Model \ Quote \ Address \ Rate . Если мы не создадим плагин для установки значения Description для этого класса, то $ rateModel-> getMethodDescription () всегда будет возвращать пустое значение. Вот полная версия решения:
[Продавец] / [Модуль] /etc/extension_attributes.xml
[Продавец] / [Модуль] /etc/di.xml
[Продавец] / [Модуль] /Plugin/Carrier/Description.php
И наконец:
[Продавец] / [Модуль] /Plugin/Quote/Address/Rate.php
Не забудьте запустить установку bin / magento: di: compile, иначе расширенный атрибут не будет сгенерирован.
Вы можете привязать данные к вашему шаблону, используя это:
Или как комментарий, как это:
Также не забудьте использовать $ method-> setDescription («Ваше пользовательское описание здесь») или $ method-> setData («description», «Ваше пользовательское описание здесь») внутри вашего собственного расширения Carrier (посмотрите на оригинальный вопрос для ссылка).
источник
Вам необходимо объявить имена методов в файле интерфейса, путь к этому файлу
Пример:
объявить константу сверху
затем определите метод следующим образом
Затем вам нужно присвоить значения следующему файлу
следующее
источник