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`
6 Réponses :
Et quelque chose comme ceci: avec cette méthode, je reçois plus de 500 mais tout mon produit ... P> p>
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 () code> à 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.
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. P>
Peut-être, il y a un certain problème, mais je pense que c'est une limite intérieure. P>
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.
//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 />'; }
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 p>
catalogue_product_flat_38 p> blockQuote>
xxx pré> p>
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. P>
Des idées sur la récupération de la collection de produits complète, le catalogue plat activé?
Essayez d'utiliser
Mage::app()->setCurrentStore('0'); // same as Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
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 (); code> 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 code> SELECT CODE> que vous avez affichée sélectionne définitivement tous les enregistrements, mais pour
core_store.store_id == 4 code> seulement, bien sûr. Est-ce que
comptez (*) à partir de catalog_product_flat_4 code> 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.