Une chose que vous devez garder à l'esprit lorsque vous obtenez une collection de produits personnalisée est la façon dont vous filtrez la collection pour avoir des valeurs que vous devez appeler en amont. Vous dites que vous avez une page personnalisée, je suppose donc que vous créez également une collection personnalisée.
Lorsque vous le faites, vous devez filtrer ce dont vous aurez besoin. À l'intérieur de votre classe de blocs, vous aurez besoin de quelque chose comme ceci:
<?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;
}
}
Prenez note que nous avons $collection->addFieldToSelect('small_image');
un champ à sélectionner. Si vous ne le faites pas, lorsque vous passez l'appel à getImage()
l'objet produit, l'URL de l'image n'aura pas (et c'est difficile à voir car les objets m2 sont énormes et difficiles à atteindre var_dump
). Vous vous retrouvez donc avec une valeur de NULL
retour lorsque vous appelez l'URL de l'image.
Ensuite, dans votre modèle, vous pouvez utiliser:
<?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; ?>