J'essaie d'obtenir l'intégralité de la collection de produits magento, sans aucun filtre ni restriction, mais je n'arrive pas à obtenir tous les produits.
J'ai déjà essayé différentes méthodes, mais elles me donnent toutes une sélection très limitée de produits. Disons que le magasin contient 5000 produits, mais il n'en montre que 500. Lorsque je vérifie le catalogue -> les produits me montrent la liste complète.
Mage::getModel('catalog/product')->getCollection();
Mage::getResourceModel('catalog/product_collection')->addAttributeToSelect('*');
Mage::getModel("catalog/product")->getResourceCollection()->load();
Ils retournent tous le même montant (500), alors que je m'attends à ce qu'il me donne 5000 produits. Je préférerais ne pas utiliser Zend ou PHP et simplement m'en tenir à la manière Magento pour les obtenir.
Quelqu'un sait-il vraiment obtenir TOUS les produits ou peut-il m'indiquer dans la bonne direction pourquoi cela ne fonctionne pas?
La chaîne de sélection renvoyée est:
SELECT 1 AS `status`, `e`.`entity_id`, `e`.`type_id`, `e`.`attribute_set_id` FROM `catalog_product_flat_4` AS `e`
Plusieurs possibilités ici: 1. Quelques limitations internes, comme 500 du tout. 2. Quelques limitations de pagination. Produits par page (dans le résumé db) 3. Quelques limitations de lazyload.
Peut-être, il y a un problème, mais je pense que c'est une limite intérieure.
//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 />';
}
Et quelque chose comme ça:
$products = Mage::getModel('catalog/product')->getCollection();
foreach($products as $prod) {
$product = Mage::getModel('catalog/product')->load($prod->getId());
}
Avec cette méthode j'obtiens plus de 500 mais tout mon produit ...
Désactivez votre flat_catalog_product dans admin> système> configuration> catalogue> catalogue. Après cela, vous obtiendrez une collection complète de produits. Même s'il s'agit d'une solution de contournement, cela m'a aidé à atteindre ce que j'avais besoin de réaliser.
Vous utilisez peut-être la structure de produit du catalogue plat. Cela crée une table distincte pour chaque vue de magasin.
Utilisez le code ci-dessous pour imprimer la requête SQL. vous verrez que la collection vient d'une table plate comme
catalog_product_flat_38
echo Mage::getModel('catalog/product')->getCollection()->getSelect();