2012-03-29 18 views
6

Sto provando a leggere l'elenco di prodotti da Magento tramite l'API SOAP (V2) e provare a eseguire qualche/qualsiasi tipo di impaginazione.Magento API SOAP Elenco prodotti Paginazione

semplice scenario:

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

Questo blocca Magento con: "Allowed memory size of 1073741824 bytes exhausted (tried to allocate 72 bytes."

ho cercato di aggiungere l'impaginazione specificando due filtri complessi sul 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" 
     } 
    } 
}; 

Tuttavia, in questo scenario viene applicato solo il secondo filtro, il primo viene ignorato.

Stavo pensando di leggere l'albero delle categorie e quindi i prodotti assegnati, ma ci sono molti prodotti che non sono assegnati a nessuna categoria o a più categorie, quindi mi mancheranno o li otterrò più volte.

C'è un modo per leggere l'elenco dei prodotti utilizzando un tipo di impaginazione, quindi non leggo l'elenco completo in una sola volta? (Nota: Richiesta per aumentare la memoria non è realmente un'opzione)

+0

Quale lingua è il lato client della richiesta? Giava? – Alex

+0

Hai mai fatto progressi in questo? – ehime

+0

Avere lo stesso problema di te. Il filtro "gt" viene ignorato per qualche motivo –

risposta

1

che ho fatto con successo quanto segue in PHP:

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

Anche se, secondo

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

Forse ha bisogno di essere "$ filters-> complex_filter = array();"? Il primo codice sembrava aver funzionato per me.

0

brutto come l'inferno, ma funziona per me:

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

Sembra che la risposta che cerchi è descritto in https://stackoverflow.com/a/22874035/2741137

A quanto pare, è possibile sfruttare PRODUCT_ID in una delle due condizioni di filtro per lavorare attorno alla limitazione di Magento che impedisce a due condizioni di filtro sulla stessa chiave.

2

Ho trovato una soluzione abbastanza buona per questo. Spero che questo aiuti qualcuno.

$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) 
      ) 
     ) 
    ) 
); 
Problemi correlati