所有 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 /> 节点。
<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>。这指定将被实例化以处理 sales_order 命名空间中的任何 API 调用的对象。
接下来,我们将在<methods/> 节点中查找方法list。
<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());
}
}
}
在该方法的最后,您可以看到该方法将遍历每个参数并尝试将其用作集合上的过滤器。键是字段,值是搜索的值。如果您检查该方法的其余部分,您会发现参数与集合交互以添加任何类型的分页或限制没有其他方式。
所以,这给您留下了三个选择。首先是给find a set of values传入
$collection->addFieldToFilter($field, $value);
这将限制您的收藏。我的建议是使用array('from'=>'10','to'=>'20') 语法的某种日期过滤器。
您的第二个选择是为 Mage_Sales_Model_Order_Api::items 创建一个类重写,它会进行一些额外的过滤。
您的第三个选择是研究创建一个添加自定义 API 方法供您调用的模块。