Я пытаюсь создать модуль в magento2, который позволит добавить пользовательское сообщение для носителя или конкретного метода. Я успешно создал раздел администратора с сеткой и формой. Сейчас я работаю над отображением этого на веб-интерфейсе. Я создал js и файл шаблона, который хорошо работает, если данные находятся в результате оценки-доставки-методов. Я подумал, что проще всего добавить это сообщение в модель оценки. Я создал плагин
<type name="Magento\Quote\Model\ShippingMethodManagement">
<plugin name="hatimeria_shippingrateinfo_add_message_to_rates"type="Hatimeria\ShippingRateInfo\Plugin\ShippingMethodManagement"sortOrder="10"disabled="false"/>
</type>
Который выбирает сообщения для текущих ставок и добавляет их в модель. Все работает хорошо, но эти данные не выводятся в результат json. Как я выяснил, magento не просто выводит все данные в модели, но возвращает только те, которые определены ShippingMethodInterface
,
Затем я заметил, что существует нечто, называемое extension_attributes, и согласно документам это должно позволить мне добавить свое сообщение к результату. Итак, глядя на документы и модуль Magento_ProductVideo я сделал следующее:
в etc/extension_attributes.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Api/etc/extension_attributes.xsd">
<extension_attributes for="Magento\Quote\Api\Data\ShippingMethodInterface">
<attribute code="rate_info" type="Hatimeria\ShippingRateInfo\Api\Quote\Data\ShippingMethodInterface" />
</extension_attributes>
в etc/di.xml
Я добавил предпочтения для моего интерфейса
<preference for="Hatimeria\ShippingRateInfo\Api\Quote\Data\ShippingMethodInterface" type="Hatimeria\ShippingRateInfo\Model\Rate\RateInfo" />
теперь класс, первый интерфейс в Hatimeria\ShippingRateInfo\Api\Quote\Data\ShippingMethodIntarface.php
namespace Hatimeria\ShippingRateInfo\Api\Quote\Data;
use Magento\Framework\Api\ExtensibleDataInterface;
/**
* Shipping Rate Info data interface
*
* @api
*/
interface ShippingMethodInterface extends ExtensibleDataInterface
{
const RATEINFO = 'rate_info';
/**
* Retrieve rate info message
*
* @return string
*/
public function getRateInfo();
/**
* Set rate info message
*
* @param string $rateInfo
* @return $this
*/
public function setRateInfo($rateInfo);
}
и класс, который на самом деле реализует это в Hatimeria\ShippingRateInfo\Model\Rate\RateInfo.php
namespace Hatimeria\ShippingRateInfo\Model\Rate;
use Hatimeria\ShippingRateInfo\Api\Quote\Data\ShippingMethodInterface;
use Magento\Framework\Model\AbstractExtensibleModel;
class RateInfo extends AbstractExtensibleModel implements ShippingMethodInterface
{
/**
* Retrieve rate info message
*
* @return string
*/
public function getRateInfo()
{
return $this->getData(self::RATEINFO);
}
/**
* Set rate info message
*
* @param string $rateInfo
* @return $this
*/
public function setRateInfo($rateInfo)
{
return $this->setData(self::RATEINFO, $rateInfo);
}
}
И это не работает. Когда тарифы генерируются, никакие дополнительные расширения не возвращаются моделью тарифа. Любая помощь будет оценена.
$ bin/magento setup:di:compile
чтобы генерировать ShippingMethodExtensionInterface
и класс, который реализует это (это не делается для каждого запроса, даже с отключенным кешем)Magento\Quote\Api\Data\ShippingMethodExtension
и добавить данные к этому объекту, а затем весь объект добавить к объекту с $entity->setExtensionAttributes($extensionModel)
Других решений пока нет …