При получении настраиваемой коллекции продуктов следует помнить одну вещь: как фильтровать коллекцию, чтобы получить значения, которые необходимо вызывать в интерфейсе. Вы говорите, что у вас есть пользовательская страница, поэтому я предполагаю, что вы также создаете пользовательскую коллекцию.
Когда вы делаете, вы должны отфильтровать то, что вам нужно. Внутри вашего блочного класса вам понадобится что-то вроде этого:
<?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;
}
}
Обратите внимание, что у нас $collection->addFieldToSelect('small_image');
есть поле для выбора. Если вы не сделаете этого, при передаче вызова getImage()
объекту продукта не будет URL-адреса изображения (и это трудно увидеть, поскольку объекты m2 огромны и трудны для понимания var_dump
). Таким образом, вы получите значение NULL
возврата, когда будете вызывать URL-адрес изображения.
Тогда в вашем шаблоне вы можете использовать:
<?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; ?>