Una cosa que debe tener en cuenta al obtener una colección personalizada de productos es cómo filtra la colección para tener los valores que necesita que se le llamen en el front-end. Dices que tienes una página personalizada, así que supondré que también estás creando una colección personalizada.
Cuando lo haga, debe filtrar lo que necesitará. Dentro de tu clase de bloques, necesitarás algo como esto:
<?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;
}
}
Tenga en cuenta que tenemos $collection->addFieldToSelect('small_image');
como un campo para seleccionar. Si no hace esto, cuando pase la llamada al getImage()
objeto del producto no tendrá la URL de la imagen (y esto es difícil de ver ya que los objetos m2 son enormes y difíciles de ver var_dump
). Por lo tanto, terminaría con un valor de NULL
regresar cuando solicite la URL de la imagen.
Luego, en su plantilla puede 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; ?>