php – 控制Magento API调用的结果数
我有一个程序,我们用于通过API将我们的Magento商店连接到我们的后端库存控制系统.目前它的作用是查询Magento API中的所有订单处于待处理状态,将其插入后端系统,然后将其状态设置为Magento中的处理.由于我们的库存系统的限制,我们只能一次插入有限数量的订单.我们通过如下所示的if循环运行整个过程来控制它(FYI,代码已被编辑,仅显示此问题的关键部分):
//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循环开销,并使程序运行更有效率,因为它只获取所需的数据. 有谁知道如何应用这种类型的过滤器?我看到的一切都表明,只有当你知道订单号码并且基于此设定限制时,你才能做到这一点.谢谢你的帮助!!!
所有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 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); 接下来,打开你的模型文件并查看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); 这将限制您的收藏.我的建议是使用数组(‘from’=> ’10’,’to’=> ’20’)语法的某种日期过滤器. 您的第二个选择是为Mage_Sales_Model_Order_Api :: items创建一个类重写,该进程进行一些额外的过滤. 您的第三个选择是调查创建一个添加自定义API方法以供调用的模块. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |