Magento SOAP API Список продуктов Пагинация - PullRequest
6 голосов
/ 30 марта 2012

Я пытаюсь прочитать список продуктов Magento через SOAP API (V2) и попытаться выполнить какой-либо / любой тип нумерации страниц.

Простой сценарий:

var filters = new filters();
var products = catalogProductList(out pe, Connection.Session, filters, null);

Это сбивает Magento с: "Allowed memory size of 1073741824 bytes exhausted (tried to allocate 72 bytes."

Я попытался добавить нумерацию страниц, указав два сложных фильтра для product_id:

filters.complex_filter = new complexFilter[]
{
    new complexFilter()
    {
        key = "product_id",
        value = new associativeEntity()
        {
            key = "gt",
            value = "400"
        }
    },
    new complexFilter()
    {
        key = "product_id",
        value = new associativeEntity()
        {
            key = "lt",
            value = "1000"
        }
    }
};

Однако в этом случае применяется только второй фильтр, первый игнорируется.

Я думал о том, чтобы прочитать дерево категорий и затем назначенные продукты, но есть много продуктов, которые не назначены ни одной категории или нескольким категориям, поэтому я либо пропущу их, либо получу их несколько раз.

Есть ли способ прочитать список продуктов, используя какой-либо тип нумерации страниц, чтобы я не прочитал полный список сразу? (Примечание: запрос увеличения памяти на самом деле не вариант)

Ответы [ 4 ]

2 голосов
/ 23 сентября 2015

Я придумал довольно хорошее решение для этого. Надеюсь, это кому-нибудь поможет.

$in = array();
for ($i = ($page * $size) - $size; $i < ($page * $size); $i++) {
    $in[] = $i + 1;
}
$complexFilter = array('complex_filter' => 
    array(
        array(
            'key' => 'product_id',
            'value' => array(
                'key' => 'in', 
                'value' => join(",", $in)
            )
        )
    )
);
1 голос
/ 14 ноября 2014

Похоже, что ответ, который вам нужен, описан в https://stackoverflow.com/a/22874035/2741137

По-видимому, вы можете использовать PRODUCT_ID с заглавной буквы в одном из двух условий фильтра, чтобы обойти ограничение Magento, которое предотвращает два условия фильтра для одного и того жеключ.

1 голос
/ 17 мая 2012

Я успешно сделал следующее в PHP:

$filters = new StdClass();
$filters->complexFilter = array(
    array( 'key' =>'sku', 'value' => array('lt'=>'03969999')),
    array( 'key' => 'sku', 'value' => array('gt'=>'03969000')),
);

Хотя, согласно

<complexType name="filters"><all><element name="filter" type="typens:associativeArray" minOccurs="0"/><element name="complex_filter" type="typens:complexFilterArray" minOccurs="0"/></all></complexType>

Может быть, это должно быть "$ filters-> complex_filter = array ();"? Первый код, похоже, сработал для меня.

0 голосов
/ 23 мая 2012

Гадкий, но работает на меня:

public catalogProductEntity[] GetProducts()
{
    int storeId;
    catalogProductEntity[] catalogEntity;
    List<catalogProductEntity> res = new List<catalogProductEntity>();
    Client.catalogProductCurrentStore(out storeId, SessionId, null);

    var filters = new filters();
    filters.complex_filter = new complexFilter[1];
    filters.complex_filter[0] = new complexFilter();
    complexFilter filter = filters.complex_filter[0];
    filter.key = "name";
    filter.value = new associativeEntity();
    associativeEntity assoc = filter.value;
    assoc.key = "like";

    //A to Z.
    for (char i = 'A'; i <= 'Z'; i++)
    {          
        assoc.value = i + "%";
        Client.catalogProductList(out catalogEntity, SessionId, filters, null);
        res.AddRange(catalogEntity);                               
    }

    //Starts with #.
    assoc.value = "#%";
    Client.catalogProductList(out catalogEntity, SessionId, filters, null);
    res.AddRange(catalogEntity);

    //0 to 9
    for (int i = 0; i <= 9; i++)
    {             
        assoc.value = i + "%";
        Client.catalogProductList(out catalogEntity, SessionId, filters, null);
        res.AddRange(catalogEntity);                
    }

    return res.ToArray();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...