Ответ 1
Все вызовы API, в конечном счете, просто исполняются PHP-кодом. Там будет один метод PHP, который принимает аргументы, переданные через вызов API, поэтому лучше всего отслеживать, где выполняется этот PHP-код.
Шаг 1 - найти конфигурацию вызова API. В современных версиях Magento конфигурации API хранятся в файлах с именем api.xml
$ find app/code/core/Mage/ -name 'api.xml'
app/code/core/Mage/Api/etc/api.xml
app/code/core/Mage/Catalog/etc/api.xml
app/code/core/Mage/CatalogInventory/etc/api.xml
app/code/core/Mage/Checkout/etc/api.xml
app/code/core/Mage/Customer/etc/api.xml
app/code/core/Mage/Directory/etc/api.xml
app/code/core/Mage/GiftMessage/etc/api.xml
app/code/core/Mage/Sales/etc/api.xml
Как только вы найдете все файлы api.xml
, выполните поиск через них, чтобы настроить, какой из них "пространство имен api верхнего уровня" (неуверенный, что это действительно вызвано внутренними разработчиками).
$ find app/code/core/Mage/ -name 'api.xml' | xargs grep sales_order
app/code/core/Mage/Sales/etc/api.xml: <sales_order translate="title" module="sales">
app/code/core/Mage/Sales/etc/api.xml: </sales_order>
app/code/core/Mage/Sales/etc/api.xml: <sales_order_shipment>
app/code/core/Mage/Sales/etc/api.xml: </sales_order_shipment>
app/code/core/Mage/Sales/etc/api.xml: <sales_order_invoice>
app/code/core/Mage/Sales/etc/api.xml: </sales_order_invoice>
app/code/core/Mage/Sales/etc/api.xml: <order>sales_order</order>
app/code/core/Mage/Sales/etc/api.xml: <order_shipment>sales_order_shipment</order_shipment>
app/code/core/Mage/Sales/etc/api.xml: <order_invoice>sales_order_invoice</order_invoice>
Похоже, что app/code/core/Mage/Sales/etc/api.xml
- это файл, который мы хотим, так как он имеет тег <sales_order />
. Затем откройте файл и посмотрите на <sales_order />
node.
<sales_order translate="title" module="sales">
<model>sales/order_api</model>
<title>Order API</title>
<acl>sales/order</acl>
<methods>
<list translate="title" module="sales">
<title>Retrieve list of orders by filters</title>
<method>items</method>
<acl>sales/order/info</acl>
</list>
<info translate="title" module="sales">
<title>Retrieve order information</title>
<acl>sales/order/info</acl>
</info>
Первый node, нас интересует <model>sales/order_api</model>
. Это указывает объект, который будет создан для обработки любого вызова API в пространстве имен sales_order
.
Далее мы рассмотрим метод list
в <methods/>
node.
<list translate="title" module="sales">
<title>Retrieve list of orders by filters</title>
<method>items</method>
<acl>sales/order/info</acl>
</list>
Этот node говорит нам, что вызов sales_order.list
соответствует методу items
. Объединив это с информацией, найденной выше, теперь мы знаем, что вызов API sales_order.list
будет запускать PHP-код, эквивалентный следующему
$m = Mage::getModel('sales/order_api');
$results = $m->items($args);
Затем откройте файл модели и посмотрите на метод items
#File: app/code/core/Mage/Sales/Model/Order/Api.php
public function items($filters = null)
{
//..a bunch of code to instantiate a collection object..
if (is_array($filters)) {
try {
foreach ($filters as $field => $value) {
if (isset($this->_attributesMap['order'][$field])) {
$field = $this->_attributesMap['order'][$field];
}
$collection->addFieldToFilter($field, $value);
}
} catch (Mage_Core_Exception $e) {
$this->_fault('filters_invalid', $e->getMessage());
}
}
}
В конце этого метода вы увидите, что метод будет проходить через каждый аргумент и попытаться использовать его в качестве фильтра в коллекции. Ключ - это поле, значение - это поиск значения. Если вы проверите оставшуюся часть метода, вы не увидите другого способа взаимодействия с сборщиками, чтобы добавить какой-либо пейджинг или лимиты.
Итак, это оставляет вам три варианта. Первый - найти набор значений для перехода в
$collection->addFieldToFilter($field, $value);
который ограничит вашу коллекцию. Мое предложение было бы каким-то фильтром даты, используя синтаксис array('from'=>'10','to'=>'20')
.
Вторым вариантом будет создание перезаписи класса для Mage_Sales_Model_Order_Api::items
, которая выполняет некоторую дополнительную фильтрацию.
Третий вариант заключается в том, чтобы исследовать создание модуля, который добавляет настраиваемый метод API для вызова.