Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 控制Magento API调用的结果数_Php_Api_Magento - Fatal编程技术网

Php 控制Magento API调用的结果数

Php 控制Magento API调用的结果数,php,api,magento,Php,Api,Magento,我有一个程序,我们使用它通过API将我们的Magento商店连接到后端库存控制系统。目前,它所做的是在Magento API中查询所有处于挂起状态的订单,将其插入后端系统,然后将其状态设置为在Magento中处理。由于库存系统的限制,我们一次只能插入有限数量的订单。我们通过如下所示的if循环运行整个流程来控制这一点(仅供参考,代码已向下编辑,仅显示此问题的关键部分): //要下载的最大订单数 $iMaxCount=10; 试一试{ $proxy=newsoapclient($wsdl\uurl)

我有一个程序,我们使用它通过API将我们的Magento商店连接到后端库存控制系统。目前,它所做的是在Magento API中查询所有处于挂起状态的订单,将其插入后端系统,然后将其状态设置为在Magento中处理。由于库存系统的限制,我们一次只能插入有限数量的订单。我们通过如下所示的if循环运行整个流程来控制这一点(仅供参考,代码已向下编辑,仅显示此问题的关键部分):

//要下载的最大订单数
$iMaxCount=10;
试一试{
$proxy=newsoapclient($wsdl\uurl);
}捕获(例外$e){
回显“捕获的异常:”,$e->getMessage(),“\n”;
}
$sessionId=$proxy->login($login,$password);
//从站点获取挂起的订单
$field=array(数组('status'=>array('pending'));
$arr=$proxy->call($sessionId,'sales\u order.list',$field);
$iCnt=0;
foreach($arr作为$key=>$value){
//只下降到最大计数
如果($iCnt<$iMaxCount){
[…执行程序的更新和插入部分…]
$iCnt++;
}//通过订单的循环结束
这样做的明显缺点是,即使我只处理10个待处理订单,我仍然必须提取所有待处理订单。也就是说,如果我有200个待处理订单,API将返回所有200个订单,处理10个,然后跳过其余的订单。我要做的是修改API调用的过滤器,以便在状态为p时仅提取10个订单这将允许我消除if循环开销,使程序运行更高效,因为它只获取所需的数据


有人知道如何应用这种类型的过滤器吗?我所看到的一切都表明,只有知道订单号并根据订单号设置限制,您才能这样做。感谢您的帮助!!!

您应该能够使用setPage,它通过指定页码(一个索引)和每页记录数来设置查询限制子句

$collection->setPage($pageNum, $pageSize);
要选择第二组10个项目,请使用以下选项:

$collection->setPage(2, 10);

关于这个主题的更多信息可以在这里找到:

所有的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命名空间”(不确定内部开发人员真正调用的是什么)

我们感兴趣的第一个节点是
sales/order\u api
。它指定将实例化的对象,以处理
sales\u order
命名空间中的任何api调用

接下来,我们将在
节点中查找方法
列表

<list translate="title" module="sales">
    <title>Retrieve list of orders by filters</title>
    <method>items</method>
    <acl>sales/order/info</acl>
</list>
接下来,打开模型文件并查看
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);
我的建议是使用
数组('from'=>'10','to'=>'20')
语法进行某种日期筛选

您的第二个选项是为
Mage\u Sales\u Model\u Order\u Api::items
创建一个类重写,它执行一些额外的过滤


您的第三个选择是研究创建一个模块,添加自定义API方法供您调用。

设置限制的快速解决方案是找到app/code/core/Mage/Sales/Model/Order/API.php(并覆盖该类),然后:

更改方法签名以接受另一个参数$limit,使方法签名看起来像:

public function items($filters = null, $limit = null)
然后,在“foreach($orderCollection as$order){”之前添加以下行:

然后只需将限制作为额外参数传递给sales_order.list api调用


Booyah!

标准的Magento Sales\u Order API不允许直接通过限制。OP需要覆盖
Mage\u Sales\u Model\u Order\u API::items()
才能做到这一点。Alan,这是回溯API方法的优秀入门。我相信这将对许多用户非常有用(至少对那些真正在询问之前使用搜索的用户是如此).+1并添加到收藏夹中。优秀的教程,正是我所需要的,并帮助我将整个问题推向更好的解决方案。非常感谢!+1提出了一个措辞清晰的问题。我相信这个问题已经解决了,但值得一提的是,Magento的REST API支持分页和限制。
$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());
        }
    }        
}
$collection->addFieldToFilter($field, $value);
public function items($filters = null, $limit = null)
if( $limit ) $orderCollection->setPageSize( $limit );