获取自定义产品集合时需要记住的一件事是如何过滤集合以使其具有需要在前端调用的值。您说您有一个自定义页面,因此我将假定您也正在创建一个自定义集合。
在执行此操作时,您必须过滤掉所需的内容。在您的块类内部,您将需要以下内容:
<?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()
product对象时,将没有图像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; ?>