Uma coisa que você precisa ter em mente ao obter uma coleção personalizada de produtos é como você filtra a coleção para ter valores que precisam ser chamados no front-end. Você diz que possui uma página personalizada, portanto, assumirei que você está criando uma coleção personalizada também.
Quando você tiver que filtrar o que precisará. Dentro da sua classe de bloco, você precisará de algo como isto:
<?php
namespace Vendor\Namespace\Block;
use Magento\Catalog\Model\Product;
class Custompage extends \Magento\Framework\View\Element\Template {
public function __construct(
\Magento\Framework\View\Element\Template\Context $context,
\Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory,
\Magento\Catalog\Model\Product\Visibility $catalogProductVisibility,
array $data = []
){
$this->_productCollectionFactory = $productCollectionFactory;
$this->_catalogProductVisibility = $catalogProductVisibility;
parent::__construct($context, $data);
}
public function getProductCollection() {
$attrId = $this->getAttrId();
$collection = $this->_productCollectionFactory->create();
$collection->setVisibility($this->_catalogProductVisibility->getVisibleInCatalogIds());
$collection->addFieldToSelect('name');
$collection->addFieldToSelect('price');
$collection->addFieldToSelect('small_image');
return $collection;
}
}
Observe que temos $collection->addFieldToSelect('small_image');
como um campo para seleção. Se você não fizer isso, quando passar a chamada para getImage()
o objeto do produto não terá o URL da imagem (e isso é difícil de ver, pois os objetos m2 são enormes e difíceis de fazer var_dump
). Então, você acabaria NULL
voltando ao chamar o URL da imagem.
Em seguida, no seu modelo, você pode usar:
<?php $productCollection = $block->getProductCollection(); ?>
<?php $imageBlock = $block->getLayout()->createBlock('Magento\Catalog\Block\Product\ListProduct'); ?>
<?php if (count($productCollection)): ?>
<?php foreach ($productCollection as $product): ?>
<?php $productImage = $imageBlock->getImage($product, 'category_page_grid'); ?>
<a href="<?php /* @escapeNotVerified */ echo $product->getProductUrl() ?>" class="product photo product-item-photo" tabindex="-1"><?php echo $productImage->toHtml(); ?></a>
<?php endforeach; ?>
<?php endif; ?>