Magento 2: отримати колекцію продукту за допомогою ідентифікатора категорії


12

Як отримати всі продукти категорії за допомогою ідентифікатора категорії в magento 2?


ви хочете це в блоці або в моделі?
Маріус

Я хочу, щоб усі товари категорії були на домашній сторінці. я вже отримав ідентифікатор категорії, і виходячи з цього, я хочу отримати весь продукт категорії
Ракеш Єсадія

У мене є блок викликів для отримання колекції категорій, тому найкраще потрапити в клас блоків.
Ракеш Єсадія

@RakeshJesadiya Вибачте за публікацію тут, але мені потрібна ваша допомога з цього приводу magento.stackexchange.com/questions/293795/… будь ласка
Nagaraju K

Відповіді:


24

ви можете ввести у свій блок такий примірник \Magento\Catalog\Model\CategoryFactory:

protected $categoryFactory;
public function __construct(
    ....
    \Magento\Catalog\Model\CategoryFactory $categoryFactory,
    ...
){
    ...
    $this->categoryFactory = $categoryFactory;
    ...
}

Потім створіть цей метод у своєму блоці:

public function getCategory()
{
    $categoryId = $this->getCategoryId();
    $category = $this->categoryFactory->create()->load($categoryId);
    return $category;
}
public function getProductCollection()
{
     return $this->getCategory()->getProductCollection()->addAttributeToSelect('*'); 
}

Тоді ви можете використовувати в шаблоні це:

<?php foreach ($block->getProductCollection() as $product) : ?>
    <!-- do something with $product -->
<?php endforeach;?>

Ви повинні мати можливість просто додати це до вмісту домашньої сторінки

{{block class="Block\Class\Name\Here" category_id="5" template="path/to/template.phtml"}}

Втілюючи це рішення, я зіткнувся з тією ж проблемою, яку виклали тут: magento.stackexchange.com/questions/123374/… Я додаю це, щоб, якщо іншим потрібні додаткові роз'яснення щодо використання цього рішення, у них є одна зупинка.
колаз

@Marius чи є якийсь спосіб зробити це за допомогою шаблону сховища, тобто через договори на обслуговування, надані Magento?
Mathanagopal S


0

Я цим користуюся

echo '('.$subcat->getProductCollection()->count().')';

foreach ($subcats as $subcat) { 
    if ($subcat->getIsActive()) {
        $_category = $objectManager->create('Magento\Catalog\Model\Category')->load($subcat->getId());
        $_imgUrl = $_category->getImageUrl(); 
        $subcat_url = $subcat->getUrl();
        // echo $qty = $subcat->getQty(); exit;
        $subcat_img = $store->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA) . 'catalog/category/' . $subcat->getImage(); 
        $placeholder_img = "pub/media/placeholder.png";
        if($_imgUrl ==''){
            $_imgUrl = $store->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA)."catalog/category/placeholder.png";
        }
        ?>
        <div class="col-sm-2 item-two">
            <a href="<?php echo $subcat_url; ?>">
                <div class="item-two-img">
                    <img src="<?php echo $_imgUrl; ?>" class="img-responsive"/>
                </div>
                <p><?php echo $subcat->getName(); 
                    $subcat->getProductCollection()->count(); ?>
                    <span class="pro_quantity">
                        <?php echo '('.$subcat->getProductCollection()->count().')';?>
                    </span>
                </p>
            </a>
        </div>
        <?php
    }
}

Ніколи не використовуйте objectmanager у своєму коді. особливо не у ваших phtmls
Kay Int Veen

У чому причина не використовувати objectmanager у нашому коді?
Kowsigan Atsayam

0

Ви можете використовувати функцію addCategoriesFilter. За допомогою цієї функції ви фільтруєте за декількома ідентифікаторами категорії.

Спочатку вам потрібно ін'єкційний колекторFactory:

protected $_productCollectionFactory;

public function __construct(
    ....
    \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory,
    ...
){
    ...
    $this->_productCollectionFactory = $productCollectionFactory;
    ...
}

Потім десь у коді:

public function getCollectionByCategoryId($id)
{
    $ids = [$id];
    $collection = $this->_productCollectionFactory->create();
    $collection->addAttributeToSelect('*');
    $collection->addCategoriesFilter(['in' => ids]);

    return $collection;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.