#magento #magento2 #laravel-5.7 #magento-2.3
#magento #magento2 #laravel-5.7 #magento-2.3
Вопрос:
Я создал новый пользовательский атрибут заказа с именем delivery_date и отобразил его в таблице заказов на продажу, но я не получаю пользовательский атрибут в ответе Api заказа.
Ошибка, которую я получаю, является неустранимой ошибкой: неперехваченная ошибка: Вызов неопределенного метода Magento Sales Api Data OrderExtension::setTipAndTrickAttribute ()
Пожалуйста, помогите.
app/code/Amos/CustomOrder/etc/di.xml
<?xml version="1.0"?>
<!--
/**
* Copyright © 2013-2017 Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
<virtualType name="MagentoSalesModelResourceModelOrderGrid" type="MagentoSalesModelResourceModelGrid">
<arguments>
<argument name="columns" xsi:type="array">
<item name="delivery_date" xsi:type="string">sales_order.delivery_date</item>
<item name="no_of_days" xsi:type="string">sales_order.no_of_days</item>
<item name="no_of_crew" xsi:type="string">sales_order.no_of_crew</item>
</argument>
</arguments>
</virtualType>
</config>
app/code/Amos/CustomOrder/etc/events.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="sales_order_load_after">
<observer name="sales_order_load_delivery_date" instance="MagestoreTipAndTrickObserverSalesOrderLoadAfter" />
</event>
</config>
Amos/CustomOrder/etc/extension_attributes.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Api/etc/extension_attributes.xsd">
<extension_attributes for="MagentoSalesApiDataOrderInterface">
<attribute code="delivery_date" type="string" />
</extension_attributes>
</config>
Amos/CustomOrder/Observer/Sales/OrderLoadAfter.php
<?php
namespace AmosCustomOrderObserverSales;
use MagentoFrameworkEventObserverInterface;
class OrderLoadAfter implements ObserverInterface
{
public function execute(MagentoFrameworkEventObserver $observer)
{
$order = $observer->getOrder();
$extensionAttributes = $order->getExtensionAttributes();
if ($extensionAttributes === null) {
$extensionAttributes = $this->getOrderExtensionDependency();
}
$attr = $order->getData('delivery_date');
$extensionAttributes->setTipAndTrickAttribute($attr);
$order->setExtensionAttributes($extensionAttributes);
}
private function getOrderExtensionDependency()
{
$orderExtension = MagentoFrameworkAppObjectManager::getInstance()->get(
'MagentoSalesApiDataOrderExtension'
);
return $orderExtension;
}
}
Ответ №1:
Чтобы ответить на ваш вопрос об ошибке, вы используете неправильную функцию magic. Ваши волшебные функции для этого атрибута setDeliveryDate()
.
Вам также необходимо убедиться, что ваш events.xml имеет правильный класс для наблюдателя.
<observer name="sales_order_load_delivery_date" instance="MagestoreTipAndTrickObserverSalesOrderLoadAfter" />
В то время как ваш класс observer является: AmosCustomOrderObserverSalesOrderLoadAfter
При использовании материала примера постарайтесь не забыть изменить имена классов, пространства имен и функций, среди прочего, когда вам нужно. Вам также может понадобиться плагин хранилища заказов, чтобы фактически включить его в ответ API.
<type name="MagentoSalesApiOrderRepositoryInterface">
<plugin name="your_name_here_extension_attribute"
type="<Vendor><Module>PluginOrderRepositoryPlugin" />
</type>
Ответ №2:
Да, согласен с приведенным выше ответом, вам нужно будет написать плагин репозитория заказов с методами get и getlist, чтобы включить его в ответ API.
Ниже приведен фрагмент кода
public function afterGet(OrderRepositoryInterface $subject, OrderInterface $order)
{
$this->addDeliveryDate($order);
return $order;
}
public function afterGetList(OrderRepositoryInterface $subject, OrderSearchResultInterface $searchResult)
{
$orders = $searchResult->getItems();
foreach ($orders as $order) {
$this->addDeliveryDate($order);
}
return $searchResult;
}
private function addDeliveryDate($order)
{
$adddeliveryDate = $order->getData(self::DELIVERY_DATE);
$extensionAttributes = $order->getExtensionAttributes() ?: $this->extensionFactory->create();
$extensionAttributes->setDeliveryDate($adddeliveryDate);
$order->setExtensionAttributes($extensionAttributes);
return $order;
}