製品のカスタムコレクションを取得する際に留意する必要があることの1つは、コレクションをフィルター処理して、フロントエンドで呼び出す必要がある値を取得する方法です。あなたはあなたがカスタムページを持っていると言うので、私はあなたもカスタムコレクションを作成していると仮定します。
その際、必要なものを除外する必要があります。ブロッククラスの内部では、次のようなものが必要になります。
<?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; ?>