Meny

Lukk

Utvidelse av Magento Order API

Magento tilbyr et svært fleksibelt rammeverk for å bygge APIer i din nettbutikk. 

Endepunktene som eksponeres fra Magento er enkle å integrere mot fordi de automatisk støtter flere protokoller, inkludert XMLRPC, SOAP, SOAP v2, SOAP v2 med WSI. 

API-rammeverket i Magento er bygget med tanke på å redusere duplisering av kode. Du trenger bare å skrive din forretningslogikk én gang, så sørger rammeverket for å eksponere det via tilgjengelige protokoller. 

Tar du utgangspunkt i offisielle guidelines er det svært enkelt å lage egne API endepunkter. Å utvide kjerne-API derimot er knapp så enkelt. I denne blogpost vil jeg derfor dele en oppskrift på hvordan du kan legge til egendefinerte felt til kjerne-API. 

La oss si at vi trenger å eksponere ut to tilpassede attributter “custom_code_value” og “custom_table_value” via sales_order.info og sales_order.list resources. 

Kolonnen “custom_table_value” er allerede laget i tabellen sales_flat_ordermens “custom_code_value” trenger å bli generert on-the-fly, muligens kombinert med andre verdier.

Vi starter med å opprette en ny modul for å holde attributt-spesifikk kode isolert. La oss kalle den Mycompany_Mymodule. 

Trinn 1 – Registrere event observers

Dette trinnet er kun nødvendig for kode-genererte felt, du trenger ikke eksplisitt å velge tilpassede kolonneverdier.

<adminhtml>
   <events>
       <sales_order_load_after>
           <observers>
               <mycompany_mymodule>
                   <type>singleton</type>
                   <model>mycompany_mymodule/observer</model>
                   <method>addCustomFieldsToOrder</method>
               </mycompany_mymodule>
           </observers>
       </sales_order_load_after>
       <sales_order_collection_load_after>
           <observers>
               <mycompany_mymodule>
                   <type>singleton</type>
                   <model>mycompany_mymodule/observer</model>
                   <method>addCustomFieldsToOrderCollection</method>
               </mycompany_mymodule>
           </observers>
       </sales_order_collection_load_after>
   </events>
</adminhtml>

Deretter oppretter vi observer-modell og setter faktiske tilpassede attributtverdier:

 class Mycompany_Mymodule_Model_Observer
{
   public function addCustomFieldsToOrder(Varien_Event_Observer $observer)
   {
       /** @var Mage_Sales_Model_Order $order */
       $order = $observer->getOrder();
 
       $value = md5($order->getProtectCode()); // whatever you need here
       $order->setData('custom_code_value', $value);
   } 

    public function addCustomFieldsToOrderCollection(Varien_Event_Observer $observer)
    {
        /** @var Mage_Sales_Model_Resource_Order_Collection $collection */
        $orderCollection = $observer->getOrderCollection();
 
        foreach ($orderCollection as $order) {
            $value = md5($order->getProtectCode()); // whatever you need here
            $order->setData('custom_code_value', $value);
        }
 
        return $this;
    }
}

Trinn 2 – Definere nye felt

Nå er det på tide å la omverdenen få vite om de nye attributter og deres typer. I din moduls etc/wsdl.xml: 

<?xml version="1.0" encoding="UTF-8" ?>
<definitions xmlns:typens="urn:{{var wsdl.name}}"
mlns:xsd="http://www.w3.org/2001/XMLSchema"
mlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
            xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
mlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/"
            name="{{var wsdl.name}}" targetNamespace="urn:{{var wsdl.name}}">
   <types>
       <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:Magento">
           <import namespace="http://schemas.xmlsoap.org/soap/encoding/"
chemaLocation="http://schemas.xmlsoap.org/soap/encoding/" />
           <complexType name="salesOrderEntity">
               <all>
                   <element name="custom_code_value" type="xsd:string" minOccurs="0" />
                   <element name="custom_table_value" type="xsd:string" minOccurs="0" />
               </all>
           </complexType>
           <complexType name="salesOrderListEntity">
               <all>
                   <element name="custom_code_value" type="xsd:string" minOccurs="0" />
                   <element name="custom_table_value" type="xsd:string" minOccurs="0" />
               </all>
           </complexType>
       </schema>
   </types>
</definitions>

Det samme gjelder for wsi.xml

<?xml version="1.0" encoding="UTF-8" ?>
<wsdl:definitions xmlns:typens="urn:{{var wsdl.name}}"
                 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                 xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
                 xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
                 xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                 name="{{var wsdl.name}}"
                 targetNamespace="urn:{{var wsdl.name}}">
   <wsdl:types>
       <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:{{var wsdl.name}}">
           <xsd:complexType name="salesOrderEntity">
               <xsd:sequence>
                   <xsd:element name="custom_code_value" type="xsd:string" minOccurs="0" />
                   <xsd:element name="custom_table_value" type="xsd:string" minOccurs="0" />
               </xsd:sequence>
           </xsd:complexType>
           <xsd:complexType name="salesOrderListEntity">
               <xsd:sequence>
                   <xsd:element name="custom_code_value" type="xsd:string" minOccurs="0" />
                   <xsd:element name="custom_table_value" type="xsd:string" minOccurs="0" />
               </xsd:sequence>
           </xsd:complexType>
       </xsd:schema>
   </wsdl:types>
</wsdl:definitions>  

Oppsummering

Jeg har sett andre eksempler foreslå å override metoder på resource models og legge data inn der. Selv syns jeg eksempelet over er mye renere, da det basert på events og lar et ubegrenset antall moduler komplementere datasettet.