Obtenir la collection de produits à partir d'un identifiant de catégorie

18

J'essaie d'obtenir une collection de produits à partir d'un identifiant de catégorie. Quelques choses que j'ai essayées sont dans le bloc:

 $category = Mage::getModel('catalog/category')->load(123)
        ->getProductCollection();

et

    $category = Mage::getModel('catalog/category')->load(123);
    $products = $category->getProductCollection()->addCategoryFilter($category)
                         ->addAttributeToFilter('type_id', 'simple')
                         ->addAttributeToSelect('*');

a également essayé de le faire à partir du phtml

$oCatId = Mage::getModel('catalog/category')->load(769); 
        $products->addCategoryFilter($oCatId);

Rien de tout cela fonctionne mais je ne vois aucune erreur non plus. J'ai vu un autre article qui ressemble à la même question: Magento - Obtenir des produits d'une catégorie spécifique, mais cette méthode n'a pas fonctionné pour moi non plus. Merci pour toute aide!

Zac
la source

Réponses:

32

Essaye ça:

$products = Mage::getModel('catalog/category')->load($category_id)
 ->getProductCollection()
 ->addAttributeToSelect('*') // add all attributes - optional
 ->addAttributeToFilter('status', 1) // enabled
 ->addAttributeToFilter('visibility', 4) //visibility in catalog,search
 ->setOrder('price', 'ASC'); //sets the order by price

Source: http://overlycaffeinated.com/blog/2011/02/get-all-sale-products-from-a-category-in-magento/

Cela devrait fonctionner car il ajoute le filtre de catégorie pour vous, car la catégorie est déjà chargée:

Mage_Catalog_Model_Category

public function getProductCollection()
{
    $collection = Mage::getResourceModel('catalog/product_collection')
        ->setStoreId($this->getStoreId())
        ->addCategoryFilter($this);
    return $collection;
}

Attendez, ça ne marche toujours pas!

Ok, donc vous pouvez avoir des problèmes plus importants, vraisemblablement un écrasement getProductCollection. Essayons donc de contourner cette méthode pratique:

$category = Mage::getModel('catalog/category')->load($category_id);
$products = Mage::getResourceModel('catalog/product_collection')
        ->setStoreId(Mage::app()->getStore()->getId())
        ->addCategoryFilter($category);
philwinkle
la source
Merci de votre aide! Je me sens plus proche mais je patauge encore. En utilisant votre dernière méthode, j'ai ajouté foreach ($products as $product) { echo $product->getId(); }et j'obtiens une série d'identifiants. Cependant quand je n'essaye echo $product->getName();rien. J'ai essayé d'ajouter ->addAttributeToSelect('*')aussi mais non. Merci pour toute aide supplémentaire.
Zac
@philwinkle Existe-t-il un moyen d'obtenir tous les produits d'une catégorie? J'ai du mal à obtenir ceux qui sont désactivés. J'utiliseMage::getResourceModel('catalog/product_collection')->setStoreId(Mage::app()->getStore()->getId())->addCategoryFilter($category)->addAttributeToSelect('sku');
Nick Rolando
9

Comment charger une collection de produits avec toutes les données dont vous avez généralement besoin pour les listes de produits dans le frontend:

$_categoryId = 123;
$category = Mage::getModel('catalog/category')->load($_categoryId );
$productCollection = $category->getProductCollection();
$productCollection
        ->addStoreFilter()
        ->setVisibility(Mage::getSingleton('catalog/product_visibility')->getVisibleInCatalogIds())
        ->addMinimalPrice()
        ->addFinalPrice()
        ->addTaxPercents()
        ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
        ->addUrlRewrite();

Cela prépare la collection de produits à charger les données nécessaires pour afficher les prix, le lien du produit et tous les attributs configurés comme "utilisés dans la liste des produits", mais pas plus.

Fabian Schmengler
la source
Comment puis-je limiter les résultats? ->limit(5)n'a pas fonctionné.
Pedram Behroozi
->setPageSize(5)
Fabian Schmengler
@fschmengler vous manquez ;après le $category = Mage::getModel('catalog/category')->load(123)code
Murtuza Zabuawala
5

Ce code ci-dessous vous donnera la collection de produits de la catégorie id 10.

$categoryId = 10;    
$products = Mage::getSingleton('catalog/category')->load($categoryId)
            ->getProductCollection()
            ->addAttributeToSelect('*');
Anshu Mishra
la source
3

Code pour obtenir la collection de produits à partir d'un ID de catégorie particulier:

$productCollection = Mage::getResourceModel('catalog/product_collection')
                       ->addCategoryFilter($category);
Deepak Kumar
la source
parfait!!! +1 :)
SagarPPanchal
où $ category = $ categoryId?
lorakeen
2

Le morceau de code ci-dessous est beaucoup plus simple et efficace que le chargement de la collection de produits et le filtrage à l'aide de ses attributs,

$categoryId = 32; // Replace with your category

$category = Mage::getModel('catalog/category')
                 ->setStoreId(Mage::app()->getStore()->getId())
                 ->load($categoryId);

Mage::register('current_category', $category);

$products = Mage::getSingleton('catalog/layer')->getProductCollection();

echo $products->getSize();
Vinoth
la source
0

Dans Magento 2, essayez cette collection de catégories à l'aide de l'ID de catégorie

  $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
  $subCategory =  $objectManager->create('Magento\Catalog\Model\Category')-> 
         load('categorey_id');
  foreach($subCategory as $subcat)
   { 
        print_r($subcat->getData();
  }
nirali
la source
-2
<?php

$categoryid = 123; // Category Id

$category = new Mage_Catalog_Model_Category();
$category->load($categoryid);
$collection = $category->getProductCollection();
$collection->addAttributeToSelect('*'); 

foreach ($_productCollection as $_product) { ?>
    <div class="pr_section">
        <div class="pr_desc">
            <a href="<?php echo $_product->getProductUrl(); ?>"><?php echo $_product->getName(); ?></a>
            <?php echo $this->getReviewsSummaryHtml($_product, false, true); // Reviews ?>
                <?php echo $this->getPriceHtml($_product, true) ?>
                <?php echo $_product->getShortDescription();?>

                <?php if(!$_product->canConfigure() && $_product->isSaleable()): ?>
                    <p><button type="button" title="<?php echo Mage::helper('core')->quoteEscape($this->__('Add to Cart')) ?>" class="button btn-cart" onclick="setLocation('<?php echo $this->getAddToCartUrl($_product) ?>')"><span><span><?php echo $this->__('Add to Cart') ?></span></span></button></p>
                <?php elseif($_product->getStockItem() && $_product->getStockItem()->getIsInStock()): ?>
                    <p><a title="<?php echo $this->__('View Details') ?>" class="button btn-cart" href="<?php echo $_product->getProductUrl() ?>"><?php echo $this->__('View Details') ?></a></p>
                <?php else: ?>
                    <p class="availability out-of-stock"><span><?php echo $this->__('Out of stock') ?></span></p>
                <?php endif; ?>
        </div>
        <div class="pr_img">
                <a href="<?php echo $_product->getProductUrl() ?>"><img src="<?php echo $this->helper('catalog/image')->init($_product, 'small_image')->resize(200); ?>" width="200" height="200" alt="" /></a> 
        </div>
<?php } ?>

Obtenez la collection de produits avec des détails. J'espère que ce sera utile.

Vinod Kumar
la source
1
Je pense que le nécropostage n'était pas nécessaire car il y a suffisamment de réponses à cette question. De plus, votre utilisation de new Mage_Catalog_Model_Category()est discutable.
Julien Lachal