【问题标题】:limit number of results using magento API V2使用 magento API V2 限制结果数量
【发布时间】:2012-01-19 11:24:39
【问题描述】:

您好,我已经在网站上搜索了我的问题,但没有找到简单的解决方案,我认为这个问题非常基本。

我正在使用 Api V2,所以现在可能有解决方案。我来了,这是我的代码:

$api_soap_url = 'http://localhost/magento/api/v2_soap?wsdl=1';

$client = new SoapClient($api_soap_url);
$session_id = $client->__soapCall('login',array($user, $pw));

$data = array($session_id);
$result = $client->__soapCall('customerCustomerList', $data);

这会返回所有结果,我需要限制结果数量,所以我尝试使用过滤器和其他解决方案,但没有运气。

唯一没试过的就是这个:

Control the number of results from a Magento API call

但是按日期过滤并不能解决我的问题,重写类对于这种简单的需求来说是一个非常复杂的解决方案。

提前致谢

【问题讨论】:

  • 我还没有找到一种方法来做到这一点。我抓取了一个仅包含产品编号的列表,然后逐一浏览我想要的每个产品并获取完整数据。

标签: api magento numbers limit


【解决方案1】:

我不确定过滤器是否可以限制结果数量,但您可以试试这个:

$complexFilter = array(
    'complex_filter' => array(
        array(
            'key' => 'created_at',
            'value' => array('key' => 'gt', 'value' => '2012-05-13 06:11:00')
            // where created_at is greater than 2012-05-13 06:11:00
            // For example: eq (equals), neq (not equals), gt (greater than), lt (less than), etc.
        )
    )
);
$result = $client->customerCustomerList($session, $complexFilter);

【讨论】:

  • 有什么方法可以使用 API 实现限制功能吗?我遇到了一种获取订单的方式,我希望每次响应都有 20 个订单。当我在移动应用程序中使用它时,数据速度会受到限制,如果我一次获取大约 100-200 个订单时间,需要更多时间。最好的问候。
  • 你应该在这种情况下使用分页。可以根据您的需要进行限制。
  • 是的,但是对于分页,如何创建过滤器以使其仅获取特定数量的订单(假设我只想获取最后 20 个订单)。如果你知道在 php 中创建过滤器,那么你能在这里分享代码吗,我会把它翻译成我的 Java 代码。
  • 你可以使用 $products = Mage::getModel('catalog/category')->load($id)->getProductCollection()->setPageSize($rows)->setCurPage($page )
  • 我说的是通过使用 API 来获取订单,这需要一个过滤器,现在有没有办法设计一个过滤器,使其只获取有限数量的订单?如果您没有收到我的问题,请告诉我。如果是,我会提供一个简短的想法。
【解决方案2】:

我最终覆盖了 app/code/core/Mage/Sales/Model/Order/Api.php,添加了一个名为“collection.limit”的“特殊魔法”字段。你的旅费可能会改变;我对 Magento 安装和访问 Magento 安装的程序(在本例中为一组 C# 程序)都有严格的控制。

我的调用者只是使用“魔法字段”作为键/值对,类似这样(请再次测试,我是从 C# 调用的,所以这个 php 应该被认为是可疑的):

$collectionLimitClause = array (
  'key' => 'collection.limit',
  'value' => array('key' => 'eq', 'value' => '10')
);

在我的 Magento 安装中(这部分已经过测试、实时和运行),我在本地命名空间中创建了一个 Sales/Model/Order/Api.php 并覆盖了 items 函数。在该函数的第 32 行左右,您会看到:

    $apiHelper = Mage::helper('api');
    $filters = $apiHelper->parseFilters($filters, $this->_attributesMap['order']);
    try {
        foreach ($filters as $field => $value) {
            $orderCollection->addFieldToFilter($field, $value);
        }
    } catch (Mage_Core_Exception $e) {
        $this->_fault('filters_invalid', $e->getMessage());
    }

相反,我在这里用 strncmp “捕捉”我自己的魔法限制器,在 foreach 中使用 if-else:

    $apiHelper = Mage::helper('api');
    $filters = $apiHelper->parseFilters($filters, $this->_attributesMap['order']);
    try {
        foreach ($filters as $field => $value) {
            if( !strncmp($field,"collection.limit",16) ) {
                $orderCollection->getSelect()->limit($value['eq']);
            }
            else {
                $orderCollection->addFieldToFilter($field, $value);
            }
        }
    } catch (Mage_Core_Exception $e) {
        $this->_fault('filters_invalid', $e->getMessage());
    }

我对此并不过分兴奋,但是,我认为它非常安全并且有效。

【讨论】:

  • 顺便说一下,这个collection.limit 实现专门用于响应从Magento 安装中收集大量订单而不会陷入困境。所以我们基本上会一次抓取 10 个“待处理”订单,并不断处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-30
  • 2015-08-11
  • 1970-01-01
  • 2011-05-12
相关资源
最近更新 更多