//The maximum number of orders to download $iMaxCount = 10 ; try { $proxy = new SoapClient($wsdl_url); } catch (Exception $e) { echo 'Caught exception: ',$e->getMessage(),"\n"; } $sessionId = $proxy->login($login,$password); //fetch the pending orders from the site $field = array(array('status'=>array( 'pending') )); $arr = $proxy->call($sessionId,'sales_order.list',$field); $iCnt = 0; foreach($arr as $key => $value){ //only down up to the max count if ($iCnt < $iMaxCount) { [... Do the updating and insertion part of the program ...] $iCnt++; } //End of looping through orders
这样做的明显垮台是,即使我将只与其中的10个一起工作,我仍然必须拖曳所有待定的订单.即如果我有200个待处理订单,API将返回所有200个进程,进程10,然后跳过其余的.我想要做的是修改API调用的过滤器,以便在状态处理时仅拉取10个订单.这将允许我删除if循环开销,并使程序运行更有效率,因为它只获取所需的数据.
有谁知道如何应用这种类型的过滤器?我看到的一切都表明,只有当你知道订单号码并且基于此设定限制时,你才能做到这一点.谢谢你的帮助!!!
第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 translate="title" module="sales"> <title>Retrieve list of orders by filters</title> <method>items</method> <acl>sales/order/info</acl> </list>
该节点告诉我们,对sales_order.list的调用对应于方法项.结合上面的信息,我们现在知道API调用sales_order.list将运行等效于以下的PHP代码
$m = Mage::getModel('sales/order_api'); $results = $m->items($args);
#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);
这将限制您的收藏.我的建议是使用数组(‘from’=> ’10’,’to’=> ’20’)语法的某种日期过滤器.
您的第二个选择是为Mage_Sales_Model_Order_Api :: items创建一个类重写,该进程进行一些额外的过滤.