Magento 2-list.phtmlによるカスタム製品コレクションのレンダリング


15

カテゴリページ(フロントエンド)の製品グリッドは、catalog_category_view.xmlのレイアウトを介してレンダリングされます。

カスタム製品コレクションがあるとしましょう

ProductRepositoryInterface::getList($searchCriteria) method

カスタムブロッククラスで、このコレクションをレンダリングしたい。レンダリングされた結果は、フロントエンドに製品グリッドとして表示される必要があります(カテゴリページと同様)。

これはどのように行うことができますか?

調査catalog_category_view.xmlすると、製品コレクションのレンダリングを担当する2つの重要な行があります。

<block class="Magento\Catalog\Block\Category\View" name="category.products" template="Magento_Catalog::category/products.phtml">
<block class="Magento\Catalog\Block\Product\ListProduct" name="category.products.list" as="product_list" template="Magento_Catalog::product/list.phtml">

これらのテンプレートファイルにカスタム製品コレクションを提供して、コレクションをレンダリングするにはどうすればよいですか?

私がこれについて間違っている場合、私を修正してください。

これは私のブロックコードがどのように見えるかです:

<?php
namespace Mod\Mod1\Block;
use Magento\Framework\View\Element\Template;
class Main extends Template
{
protected $_filterBuilder;
protected $_filterGroupArray;
protected $_filterGroupBuilder;
protected $_searchCriteriaBuilder;
protected $_productRepository;
protected $_productFactory;
protected $_list;

public function __construct(
    \Magento\Framework\View\Element\Template\Context $context,
    \Magento\Catalog\Api\ProductRepositoryInterface $productRepository,
    \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder,
    \Magento\Framework\Api\Search\FilterGroupBuilder $filterGroupBuilder,
    \Magento\Framework\Api\FilterBuilder $filterBuilder,
    \Magento\Catalog\Model\ProductFactory $productFactory,
    array $data = [])
{
    $this->_productRepository = $productRepository;
    $this->_searchCriteriaBuilder = $searchCriteriaBuilder;
    $this->_filterGroupBuilder = $filterGroupBuilder;
    $this->_filterBuilder = $filterBuilder;
    parent::__construct($context, $data);
}

public function getLoadedProductCollection(){
    $searchCrit = $this->buildSearchCriteria('','','','','','5-',1);
    $list = $this->_productRepository->getList($searchCrit);
    return $list;
}
public function buildSearchCriteria(...){
....
return $searchCriteria;
}
}

1
カテゴリページの製品を置き換える方法や、基本的にカテゴリコントローラーの別のバージョンを使用する方法を尋ねていますか?
ジョシュダベンポート

list.phtmlまたは対応するブロックでコレクションを編集すると、ページネーションとレイヤーナビゲーションが正しく機能しなくなります。したがって、あなたが受け入れている答えが上記の両方のことを行うことを確認してください。
ビベッククマール

回答:


0

これを試すことができます:

catalog_category_view.xmlを更新します

<block class="Magento\Catalog\Block\Product\ListProduct" name="category.products.list" as="product_list" template="Magento_Catalog::product/list.phtml">
<block class="Your(Mod)\Namespace(Mod1)\Block\YourBlockFileName(Main)" name="your.category.products.list" template="Magento_Catalog::product/yourFile.phtml" />
</block>

そしてproduct / list.phtmlのyourFile.phtmlを呼び出します:

<?php echo $this->getChildHtml('your.category.products.list'); ?>

これで、yourfile.phtmlの関数を次のように使用できます。

$block->yourfunction();

例:

$block->getLoadedProductCollection();

これがあなたを助けることを願っています。


0

最善のアプローチは次のとおりです。

あなたを更新catalog_category_view.xmlして置き換えるMagento\Catalog\Block\Product\ListProductMod\Mod1\Block\Main

前:

<block class="Magento\Catalog\Block\Product\ListProduct" name="category.products.list" as="product_list" template="Magento_Catalog::product/list.phtml">

後:

block class="Mod\Mod1\Block\Main" name="category.products.list" as="product_list" template="Magento_Catalog::product/list.phtml">

あなたのMainクラスは、拡張する必要がありますMagento\Catalog\Block\Product\ListProduct

次に、メソッドgetLayer()を独自に書き換える必要があります。

参考:クラスにMod\Mod1\Block\Mainはリファクタリングが必要です。

コレクションLayerを拡張しMagento\Catalog\Model\Layerたり、コレクションを操作したりする独自の新しいクラスを作成します。

/**
 * Retrieve current layer product collection
 *
 * @return \Magento\Catalog\Model\ResourceModel\Product\Collection
 */
public function getProductCollection()

そして

/**
 * Initialize product collection
 *
 * @param \Magento\Catalog\Model\ResourceModel\Product\Collection $collection
 * @return \Magento\Catalog\Model\Layer
 */
public function prepareProductCollection($collection)

0

基本的に、最初にコントローラーまたは基本的なCMSページを作成して、コレクションを表示するページを作成します。

そこから、list.phtmlテンプレートファイルと組み合わせてコレクションを作成するカスタムブロックを使用して、ページに製品をレンダリングできます。

{{block class="Vendor\Module\Block\ProductCollection" template="Magento_Catalog::product/list.phtml" name="specialproducts"}} 

上記のxmlを追加します。Vendor \ Module \ Block \ ProductCollectionは、そのページのxmlにコレクションが作成されるカスタムブロックコードです。

list.phtmlファイルには、コードの行の下にあなたのブロックからコレクションを収集します。

$_productCollection = $block->getLoadedProductCollection();

ブロックに製品のコレクションを返すgetLoadedProductCollection()関数がある限りlist.phtmlファイルはコレクション内の各製品をループし、デフォルトのMagento製品グリッドにレンダリングします。

ブロックコードについては、以下の行を更新してgetItems()を含めてください

$list = $this->_productRepository->getList($searchCrit)->getItems();

あなたが言ったように私はやった。私のブロックには「ProductRepositoryInterface :: getList()」を返す「getLoadedProductCollection()」関数があります。しかし、エラーが発生します:Uncaught Error:Undefined method Magento \ Framework \ Api \ SearchResults :: count()in ...これは正しいアプローチではないようです。
シャヒアhajir

更新後のを参照してください
シャヒアhajir

$ list = $ this-> _ productRepository-> getList($ searchCrit)-> getItems();を変更してみてください。
ハリ

@shahirhajir getItemsで試しましたか?
ハリ

動作していません。$ list = $ this-> _ productRepository-> getList($ searchCrit)-> getItems(); ProductInterface []配列を返し、この配列にはcount()関数はありません。不明なエラー:我々 list.phtmlで22行目のライン22上の... \ list.phtmlでアレイ上のメンバー関数count()への呼び出しは、持っている:$ _productCollection->数()
シャヒアhajir

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.