php – 控制Magento API调用的结果数

前端之家收集整理的这篇文章主要介绍了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&gt ;.这将指定要实例化的对象来处理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方法以供调用的模块.

原文链接:https://www.f2er.com/php/132921.html

猜你在找的PHP相关文章