2012-03-29 21 views
6

Estoy tratando de leer la lista de productos de Magento sobre la API de SOAP (V2) y tratar de hacer algo/cualquier tipo de paginación.Magento de SOAP API Lista de producto paginación

escenario simple:

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

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

He intentado añadir paginación especificando dos filtros complejos en la 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" 
     } 
    } 
}; 

Sin embargo en este escenario solo se aplica el segundo filtro, el primero se ignora.

Estaba pensando en leer el árbol de categorías y luego los productos asignados, pero hay muchos productos que no están asignados a ninguna categoría ni a múltiples categorías, así que los extrañaré o los recibiré varias veces.

¿Hay una manera de leer la lista de los productos que utilizan algún tipo de paginación de modo que no leo la lista completa a la vez? (Nota: Solicitud para aumentar la memoria no es realmente una opción)

+0

¿Qué idioma es el lado del cliente de su solicitud? ¿Java? – Alex

+0

¿Alguna vez ha hecho algún progreso en esto? – ehime

+0

Tiene el mismo problema que usted. El filtro "gt" es ignorado por alguna razón –

Respuesta

1

que he hecho con éxito el siguiente en PHP:

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

Aunque, de acuerdo con

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

Tal vez sea necesario ser "$ filters-> complex_filter = array();"? El primer código parece haber funcionado para mí.

0

feo como el infierno, pero funciona para mí:

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

Parece que la respuesta que necesita se describe en https://stackoverflow.com/a/22874035/2741137

Al parecer, se puede sacar provecho PRODUCT_ID en una de las dos condiciones de filtro para trabajar alrededor de la limitación de Magento que previene dos condiciones de filtro en la misma clave.

2

He encontrado una solución bastante buena para esto. Espero que esto ayude a alguien.

$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) 
      ) 
     ) 
    ) 
); 
Cuestiones relacionadas