Все вызовы 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 верхнего уровня".namespace "(не знаю, как это на самом деле называют внутренние разработчики)
$ 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 />
.
<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>
Первый интересующий нас узел - <model>sales/order_api</model>
.Это указывает на объект, который будет создан для обработки любого вызова API в пространстве имен sales_order
.
Далее мы будем искать метод list
в узле <methods/>
.
<list translate="title" module="sales">
<title>Retrieve list of orders by filters</title>
<method>items</method>
<acl>sales/order/info</acl>
</list>
Этот узел сообщает нам, что вызов 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 для вызова.