11
votes

Magento obtenir tous les produits

J'essaie d'obtenir toute la collection de produits Magento, sans filtres ni restrictions, mais je ne parviens pas à obtenir tous les produits.

J'ai déjà essayé diverses méthodes, mais elles me donnent tous une sélection très limitée de produits. . Disons que le magasin contient 5000 produits, mais il ne montre que 500. Lorsque je vérifie le catalogue -> Produits me montre la liste complète. P>

SELECT 1 AS `status`, `e`.`entity_id`, `e`.`type_id`, `e`.`attribute_set_id` FROM `catalog_product_flat_4` AS `e`


10 commentaires

Je présume que les produits "manquants" proviennent d'un magasin différent? Par défaut, les collections de catalogue filtrez par ID de magasin. Je ne suis pas sûr que vous puissiez remplacer cela, car les attributs peuvent être définis sur une base de magasin, voici comment il décide des éléments à retirer pour le modèle. En boucle dans vos magasins et récupérer les produits pour chacun est peut-être votre meilleure chance d'obtenir tous les produits.


En fait, ils ne sont pas tous ... quand je vais au catalogue des produits et que je filtre par magasin, j'ai encore plus de produits (disons 3000). Si je filtre également sur Activé / Désactivé, cela me donne 10 produits à partir du 500 retourné. Donc, je me manqure toujours 10 produits, même lorsque ces filtres sont définis par défaut.


Récupérer la requête de base de données avec echo (string) mage :: getmodel ('getmodel ("catalogue / produit") -> getCollection () -> getSelec t (); et ajouter cela à votre question, cela pourrait aider des choses.


J'ai ajouté la chaîne de sélection à la question de votre demande.


Dans quel contexte magasin s'agit-il de cela?


Pas le magasin par défaut, mais dans une autre vue en magasin.


L'instruction SELECT que vous avez affichée sélectionne définitivement tous les enregistrements, mais pour core_store.store_id == 4 seulement, bien sûr. Est-ce que comptez (*) à partir de catalog_product_flat_4 exécuté par une correspondance non-magento (par exemple PHPMYADMIN) ECHO compte (mage :: getmodel ("catalogue / produit") -> getcollection ()); / Code> Lorsqu'il est exécuté dans le contexte de store_id # 4?


C'est la même chose ... j'ai compris que ce sont des produits qui sont activés, mais j'aimerais une collection de tous les produits, activés ou désactivés à l'aide de Magento par défaut. Je suppose que ce n'est pas possible?


Était-ce résolu? IAM ayant la même chose, avec 320 produit renvoyé lorsque je filtre par configurable.


En quelque sorte, dans mon cas, c'était parce que je cherchais dans les tables plats, mais j'avais en fait besoin de tous les produits. Si vous avez besoin de la même chose, vous devez écrire une requête sur la table non plate pour ce dont vous avez besoin.


6 Réponses :


10
votes

Et quelque chose comme ceci: xxx

avec cette méthode, je reçois plus de 500 mais tout mon produit ...


3 commentaires

Même chose. Ce n'est pas que les produits ne soient pas chargés, c'est qu'ils ne sont pas présents dans la collection ... que ce qui n'est pas présent ne peut pas être chargé bien sûr :-).


N'est-ce pas une mauvaise pratique de charge () à l'intérieur d'une boucle?


Je peux difficilement vous répondre parce que je n'ai pas touché à Magento depuis plus d'un an. Comment voudriez-vous faire sinon? Peut-être que vous pouvez collecter tous les identifiants, puis demander cet ID, mais je ne me souviens pas si c'est possible. J'utilisais cette boucle pour un script interne. La question de la performance n'était donc pas importante dans mon cas.



5
votes

Plusieurs possibilités ici: 1. Une limite intérieure, comme 500 du tout. 2. une limitation de pagination. Produits par page (en DB Abstrait) 3. une limitation de la lazyload.

Peut-être, il y a un certain problème, mais je pense que c'est une limite intérieure.


1 commentaires

Ce n'est pas parce que le "500" était juste un nombre de fiction aux choses abstraites. En réalité, c'est quelque chose comme 334 ce qui n'est pas exactement un numéro de limitation. Merci de penser avec moi cependant :). Je pense que Alexandre est partiellement correct, mais il y a probablement plus de filtres par défaut appliqués.



15
votes
//to overwrite limit but you need first to increase your memory limit

 $collection = Mage::getModel('catalog/product')->getCollection()
->addAttributeToSelect('*') // select all attributes
->setPageSize(5000) // limit number of results returned
->setCurPage(1); // set the offset (useful for pagination)

// we iterate through the list of products to get attribute values
foreach ($collection as $product) {
  echo $product->getName(); //get name
  echo (float) $product->getPrice(); //get price as cast to float
  echo $product->getDescription(); //get description
  echo $product->getShortDescription(); //get short description
  echo $product->getTypeId(); //get product type
  echo $product->getStatus(); //get product status

  // getCategoryIds(); returns an array of category IDs associated with the product
  foreach ($product->getCategoryIds() as $category_id) {
      $category = Mage::getModel('catalog/category')->load($category_id);
      echo $category->getName();
      echo $category->getParentCategory()->getName(); // get parent of category
  }
  //gets the image url of the product
  echo Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA).
      'catalog/product'.$product->getImage();
  echo $product->getSpecialPrice();
  echo $product->getProductUrl();  //gets the product url
  echo '<br />';
}

0 commentaires

1
votes

Vous pouvez utiliser une structure de produit de catalogue plat. Ceci crée une table séparée pour chaque vue en magasin.

Utilisez le code ci-dessous pour imprimer la requête SQL. Vous verrez que la collection provient de la table plate comme

catalogue_product_flat_38 xxx


0 commentaires

2
votes

désactiver votre flat_catalog_product dans admin> Système> Configuration> Catalogue> Catalogue. Après cela, vous obtiendrez une collection complète de produits. Même si c'est une solution de contournement, cela m'a aidé à réaliser ce que j'avais besoin pour atteindre.


1 commentaires

Des idées sur la récupération de la collection de produits complète, le catalogue plat activé?



0
votes

Essayez d'utiliser

Mage::app()->setCurrentStore('0');
// same as 
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);


0 commentaires