Статьи

Создание пользовательского API в Magento: часть первая

Для любой успешной платформы жизненно важно не отставать от передовых особенностей и предоставить им, чтобы конкурировать на рынке. Предоставление API для вашей платформы — это одна из важных функций, которая позволяет интегрироваться со сторонними системами, открывая двери для более широкого сообщества. Magento, являясь одной из самых успешных платформ электронной коммерции, предоставляет множество полезных функций и утилит, что доказывает, что это действительно платформа корпоративного уровня.

Разоблачение API для ваших ресурсов выгодно во многих отношениях. Одним из наиболее очевидных является то, что он делает ваши ресурсы доступными на разных платформах, что делает их независимыми от платформы, благодаря таким протоколам, как XML-RPC / SOAP, что позволяет вам рационализировать свои ресурсы. Мы будем использовать SOAP для нашего пользовательского модуля.

В этом уроке мы создадим пользовательский модуль «Customapimodule». Я предполагаю, что вы знакомы с базовым процессом создания модулей в Magento. Вот хорошая статья, объясняющая основы создания пользовательских модулей.

Вот список файлов, необходимых для желаемой настройки:

  • app / etc / modules / Envato_All.xml: это файл, используемый для включения нашего пользовательского модуля.
  • app / code / local / Envato / Customapimodule / etc / config.xml: это файл конфигурации модуля.
  • app / code / local / Envato / Customapimodule / etc / api.xml: это файл, который объявляет API, предоставляемые нашим модулем.
  • app / code / local / Envato / Customapimodule / etc / wsdl.xml: в этом файле мы определим методы API в соответствии с соглашениями WSDL.
  • app / code / local / Envato / Customapimodule / Helper / Data.php: это файл, используемый системой перевода Magento.
  • app / code / local / Envato / Customapimodule / Model / Product / Api.php: это файл модели, который реализует логику наших методов API.
  • app / code / local / Envato / Customapimodule / Model / Product / Api / V2.php: Это файл для поддержки API Magento v2.

Для начала мы создадим файл включения модуля. Создайте файл «app / etc / modules / Envato_All.xml» и вставьте следующее содержимое в этот файл. Мы использовали «Envato» в качестве пространства имен нашего модуля и «Customapimodule» в качестве имени нашего модуля. По умолчанию будет включен наш модуль «Customapimodule».

1
2
3
4
5
6
7
8
9
<?xml version=»1.0″?>
<config>
  <modules>
    <Envato_Customapimodule>
      <active>true</active>
      <codePool>local</codePool>
    </Envato_Customapimodule>
  </modules>
</config>

Далее нам нужно создать файл конфигурации модуля. Создайте «app / code / local / Envato / Customapimodule / etc / config.xml» и вставьте следующее содержимое в этот файл.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
<?xml version=»1.0″?>
<config>
  <modules>
    <Envato_Customapimodule>
      <version>1.0</version>
    </Envato_Customapimodule>
  </modules>
  <global>
    <models>
      <customapimodule>
        <class>Envato_Customapimodule_Model</class>
      </customapimodule>
    </models>
    <helpers>
      <customapimodule>
        <class>Envato_Customapimodule_Helper</class>
      </customapimodule>
    </helpers>
  </global>
</config>

Ничего необычного здесь — мы только что объявили классы «Модель» и «Помощник» в соответствии с соглашениями Magento.

В дальнейшем создайте «app / code / local / Envato / Customapimodule / etc / api.xml» и вставьте следующее содержимое в этот файл. Файл api.xml используется для объявления методов API, предоставляемых вашим модулем.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?xml version=»1.0″?>
<config>
  <api>
    <resources>
      <customapimodule_product translate=»title» module=»customapimodule»>
        <model>customapimodule/product_api</model>
        <title>Demo Custommoduleapi API</title>
        <acl>customapimodule/product</acl>
        <methods>
          <list translate=»title» module=»customapimodule»>
            <title>List of products</title>
            <method>items</method>
          </list>
        </methods>
      </customapimodule_product>
    </resources>
    <resources_alias>
      <product>customapimodule_product</product>
    </resources_alias>
    <v2>
      <resources_function_prefix>
         <product>customapimoduleProduct</product>
      </resources_function_prefix>
    </v2>
    <acl>
      <resources>
        <customapimodule translate=»title» module=»customapimodule»>
          <title>Products</title>
          <sort_order>5</sort_order>
          <product translate=»title» module=»customapimodule»>
            <title>Product data</title>
          </product>
        </customapimodule>
      </resources>
    </acl>
  </api>
</config>

Начнем с <resources> , который оборачивает все ресурсы, объявленные вашим модулем. Вы можете думать о «ресурсе» как о сущности, используя которую вы хотели бы классифицировать ваши методы API.

В нашем примере мы только что объявили единственный ресурс с именем <customapimodule_product> . Вы можете называть его как угодно, если это уникальный идентификатор. В <customapimodule_product> ресурса <customapimodule_product> мы объявили <model> чтобы связать файл модели «Magento», где мы определим определения метода API. Методы для наших ресурсов обернуты тегом <methods> . В нашем случае мы определили только один метод «items» в <list> , который предоставит список продуктов.

Кроме того, <acl> разделе <customapimodule_product> используется для обеспечения контроля доступа к нашим ресурсам. Значение, определенное в <acl> «customapimodule / product», ссылается на определение в нижней части файла.

Внизу файла вы можете видеть, что мы объявили отдельный <acl> который определяет «customapimodule / product». Короче говоря, он используется для контроля доступа к нашим ресурсам, чтобы к ним могли обращаться определенные «роли API», если они определены таким образом в бэкэнде Magento. Мы обсудим это более подробно в следующей части этого урока.

На данный момент поддерживаются две версии API Magento, v1 и v2, с помощью которых вы можете создавать и предоставлять API. В нашем примере мы увидим оба метода. Тег <resources_alias> используется для определения псевдонима ресурса, по которому будет вызываться наш метод. Мы определили его как <product> , поэтому всякий раз, когда вы хотите вызвать метод API с использованием Magento v1 API, вы будете использовать «product» в качестве префикса ресурса. Таким же образом <v2> определяет псевдоним ресурса для API Magento v2, поэтому префикс ресурса будет «customapimoduleProduct». Эти вещи станут понятнее, когда мы увидим, как вызывать наши API в следующем уроке.

Далее, давайте создадим файл «app / code / local / Envato / Customapimodule / etc / wsdl.xml» и вставим следующее содержимое.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?xml version=»1.0″ encoding=»UTF-8″?>
<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/» 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/» schemaLocation=»http://schemas.xmlsoap.org/soap/encoding/» />
      <complexType name=»fieldInfo»>
        <sequence>
          <element name=»entity_id» type=»xsd:string»/>
          <element name=»name» type=»xsd:string»/>
        </sequence>
      </complexType>
      <complexType name=»fieldInfoArray»>
        <complexContent>
          <restriction base=»soapenc:Array»>
            <attribute ref=»soapenc:arrayType» wsdl:arrayType=»typens:fieldInfo[]» />
          </restriction>
        </complexContent>
      </complexType>
    </schema>
  </types>
  <message name=»customapimoduleProductListRequest»>
    <part name=»sessionId» type=»xsd:string» />
  </message>
  <message name=»customapimoduleProductListResponse»>
    <part name=»products» type=»typens:fieldInfoArray» />
  </message>
  <portType name=»{{var wsdl.handler}}PortType»>
    <operation name=»customapimoduleProductList»>
      <documentation>List of products</documentation>
      <input message=»typens:customapimoduleProductListRequest» />
      <output message=»typens:customapimoduleProductListResponse» />
    </operation>
  </portType>
  <binding name=»{{var wsdl.handler}}Binding» type=»typens:{{var wsdl.handler}}PortType»>
    <soap:binding style=»rpc» transport=»http://schemas.xmlsoap.org/soap/http» />
    <operation name=»customapimoduleProductList»>
      <soap:operation soapAction=»urn:{{var wsdl.handler}}Action» />
      <input>
        <soap:body namespace=»urn:{{var wsdl.name}}» use=»encoded» encodingStyle=»http://schemas.xmlsoap.org/soap/encoding/» />
      </input>
      <output>
        <soap:body namespace=»urn:{{var wsdl.name}}» use=»encoded» encodingStyle=»http://schemas.xmlsoap.org/soap/encoding/» />
      </output>
    </operation>
  </binding>
  <service name=»{{var wsdl.name}}Service»>
    <port name=»{{var wsdl.handler}}Port» binding=»typens:{{var wsdl.handler}}Binding»>
      <soap:address location=»{{var wsdl.url}}» />
    </port>
  </service>
</definitions>

Файл «wsdl.xml» используется для определения определений метода API согласно синтаксису SOAP. Мы увидим некоторые важные теги в этом файле в контексте этого урока.

Сначала мы определили сложный тип fieldInfo, который содержит два элемента: entity_id и name. Кроме того, мы определили комплексный тип fieldInfoArray, который является производным от комплексного типа fieldInfo. Это массив сложного типа «fieldInfo».

Проще говоря, мы определили свойства объекта, которые будут возвращены в ответе на вызов метода API. В нашем случае мы вернем массив продуктов. Каждый элемент массива будет иметь два свойства: «entity_id» и «name» продукта. Вы можете определить больше свойств в соответствии с вашими требованиями.

Далее, под <message> «customapimoduleProductListRequest» мы определили входные параметры, необходимые с помощью <part> . Таким же образом, под <message> «customapimoduleProductListResponse» мы определили тип выходных объектов. Когда мы вызываем метод API, нам нужно передать «sessionId», и ответ метода API будет содержать массив продуктов. Остальные теги приведут к появлению нашего метода при вызове http: // yourmagentostore / api / v2_soap? Wsdl = 1 .

Далее нам нужно создать файл «app / code / local / Envato / Customapimodule / Helper / Data.php», чтобы убедиться, что система перевода Magento работает правильно. Это почти пустой файл, но должен быть там в соответствии с соглашениями!

1
2
3
4
<?php
class Envato_Customapimodule_Helper_Data extends Mage_Core_Helper_Abstract
{
}

Далее, давайте создадим файл модели «app / code / local / Envato / Customapimodule / Model / Product / Api.php».

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
<?php
// app/code/local/Envato/Customapimodule/Model/Product/Api.php
class Envato_Customapimodule_Model_Product_Api extends Mage_Api_Model_Resource_Abstract
{
  public function items()
  {
    $arr_products=array();
    $products=Mage::getModel(«catalog/product»)
      ->getCollection()
      ->addAttributeToSelect(‘*’)
      ->setOrder(‘entity_id’, ‘DESC’)
      ->setPageSize(5);
 
    foreach ($products as $product) {
      $arr_products[] = $product->toArray(array(‘entity_id’, ‘name’));
    }
 
    return $arr_products;
  }
}

Напомним, что ранее в файле «api.xml» мы определили метод «items», заключенный в <list> . Итак, в приведенном выше классе модели мы только что это реализовали.

В этом методе мы просто выбираем пять последних продуктов и перебираем каждый из элементов, чтобы подготовить массив продуктов со свойствами «entity_id» и «name». Так что теперь вы, вероятно, должны понять причину сложного типа, созданного в «wsdl.xml»!

Кроме того, нам также необходимо создать файл модели для поддержки API Magento v2. Давайте создадим файл модели «app / code / local / Envato / Customapimodule / Model / Product / Api / v2.php» со следующим содержимым.

1
2
3
4
5
<?php
//app/code/local/Envato/Customapimodule/Model/Product/Api/V2.php
class Envato_Customapimodule_Model_Product_Api_V2 extends Envato_Customapimodule_Model_Product_Api
{
}

Как видите, это просто расширение класса модели, определенного ранее в файле «app / code / local / Envato / Customapimodule / Model / Product / Api.php».

Вот и все, что касается настройки файла для реализации пользовательского API. Если вам интересно, включите модуль из серверной части и очистите кеш. Теперь, когда вы посещаете страницу http: // yourmagentostore / api / v2_soap? Wsdl = 1 , вы должны увидеть, что наш метод «customapimoduleProductList» указан вместе с другими API!

В следующей части мы пойдем дальше и увидим, как создать пользователя API и роль API, и, конечно, как использовать наш пользовательский метод API, определенный в этом руководстве!