Iată cum obții o colecție de produse într-un bloc Magento 2.
Bună practică: folosește Dependency Injection (metoda 1). Evită
ObjectManager::getInstance()în cod de producție — este un anti-pattern, acceptabil doar pentru testare rapidă.
Metoda recomandată (Dependency Injection)
Injectează CollectionFactory și Visibility în constructorul blocului:
namespace Vendor\Module\Block;
use Magento\Framework\View\Element\Template;
use Magento\Framework\View\Element\Template\Context;
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
use Magento\Catalog\Model\Product\Visibility;
class ProductList extends Template
{
private $collectionFactory;
private $productVisibility;
public function __construct(
Context $context,
CollectionFactory $collectionFactory,
Visibility $productVisibility,
array $data = []
) {
$this->collectionFactory = $collectionFactory;
$this->productVisibility = $productVisibility;
parent::__construct($context, $data);
}
public function getProductCollection()
{
$collection = $this->collectionFactory->create();
$collection->addAttributeToSelect('*')
->addWebsiteFilter()
->addStoreFilter()
->setVisibility($this->productVisibility->getVisibleInSiteIds())
->setPageSize(5);
return $collection;
}
}
În template (.phtml)
<?php foreach ($block->getProductCollection() as $product): ?>
<?= $block->escapeHtml($product->getName()) ?><br/>
<?php endforeach; ?>