Как получить атрибуты пользовательского заказа в ответе Api заказа по умолчанию в magento 2.3

#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;
}