Một điều bạn cần lưu ý khi nhận bộ sưu tập sản phẩm tùy chỉnh là cách bạn lọc bộ sưu tập để có một giá trị bạn cần được gọi ở mặt trước. Bạn nói rằng bạn có một trang tùy chỉnh, vì vậy tôi sẽ cho rằng bạn cũng đang tạo một bộ sưu tập tùy chỉnh.
Khi bạn làm bạn phải lọc ra những gì bạn sẽ cần. Bên trong lớp khối, bạn sẽ cần một cái gì đó như thế này:
<?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;
}
}
Hãy lưu ý rằng chúng tôi có $collection->addFieldToSelect('small_image');
một trường để chọn. Nếu bạn không làm điều này, khi bạn chuyển cuộc gọi đến getImage()
đối tượng sản phẩm sẽ không có url hình ảnh (và điều này rất khó thấy vì các đối tượng m2 rất lớn và khó thực hiện var_dump
). Vì vậy, bạn sẽ kết thúc với một giá trị NULL
quay trở lại khi bạn gọi cho url hình ảnh.
Sau đó, trong mẫu của bạn, bạn có thể sử dụng:
<?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; ?>