2012-03-29 18 views
6

Próbuję odczytać listę produktów z Magento nad interfejsem API SOAP (V2) i spróbować wykonać/niektóre typy stronicowania.Magento SOAP API Lista produktów Pagina

Prosty scenariusz:

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

to wywala Magento z: "Allowed memory size of 1073741824 bytes exhausted (tried to allocate 72 bytes."

Próbowałem dodać stronicowanie określając dwa złożone filtry na 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" 
     } 
    } 
}; 

Jednak w tym Scenariusz dotyczy tylko drugiego filtra, pierwszy jest ignorowany.

Myślałem o przeczytaniu drzewa kategorii, a następnie przypisanych produktów, ale istnieje wiele produktów, które nie są przypisane do żadnej kategorii ani do wielu kategorii, więc albo ich nie dostanę, albo otrzymam wiele razy.

Czy istnieje sposób na odczytanie listy produktów przy użyciu pewnego rodzaju paginacji, aby nie czytać kompletnej listy naraz? (Uwaga: Żądanie, aby zwiększyć pamięć nie jest to opcja)

+0

Który język jest Twoją stroną docelową? Jawa? – Alex

+0

Czy kiedykolwiek robiłeś postępy w tej sprawie? – ehime

+0

Masz ten sam problem co Ty. Filtr "gt" jest z jakiegoś powodu zignorowany. –

Odpowiedz

1

Mam powodzeniem zrobić następujących w PHP:

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

Chociaż, zgodnie z

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

Może to musi be "$ filters-> complex_filter = array();"? Wydaje się, że pierwszy kod zadziałał u mnie.

0

brzydki jak cholera, ale działa dla mnie:

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(); 
} 
1

Wygląda na to odpowiedź trzeba opisano w https://stackoverflow.com/a/22874035/2741137

Podobno można wykorzystać PRODUCT_ID w jednym z dwóch warunków filtracyjnych do pracy wokół ograniczenia Magento, które zapobiega dwóm warunkom filtra na tym samym klawiszu.

2

Znalazłem całkiem niezłe rozwiązanie. Mam nadzieję, że to pomaga komuś.

$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) 
      ) 
     ) 
    ) 
); 
Powiązane problemy