2

/app/design/frontend/default/[theme]/template/catalog/product/list.phtmlに、 $_productCollectionの内容をループして表示する次のスニペットがあります。

<?php $_collectionSize = $_productCollection->count() ?>
<?php $_columnCount = $this->getColumnCount(); ?>
<?php $i=0; foreach ($_productCollection as $_product): ?>
...
<?php endif; ?>

私が知りたいのは、$_productCollectionを製品タイプでソートする方法です。最終的に私が望んでいるのは、構成可能な製品を最初に表示し、次に単純な製品を表示することです。

助けていただければ幸いです。

乾杯!

4

1 に答える 1

2

カテゴリビューの製品コレクションをカスタマイズするのが非常に面倒な理由の1つは、ツールバー、階層化されたナビゲーション、実際のリスト表示、さらにはイベントオブザーバーにコレクションMage_Reviewを明示的にロードするモジュールとの結合です。

最初は、一般的なコレクションユーティリティ(例)を使用して条件を追加できるようですが、コレクションデータが既に読み込まれているaddAttributeToSort()ため、これはテンプレートレベルでは機能しないことがわかります。名前が付けられているコレクションゲッターメソッドは、コアチームからのヒントだと思います。getLoadedProductCollection()

Magentoコレクションの遅延読み込みの実装では、一度load()(直接または間接的に)編集されると、明示的に強制されることなく再読み込み(つまり、データベースとのトランザクション)を行いません。

したがって、コレクションをロードする前に、コレクションに順序付けパラメーターを設定する必要があります。メソッドをトレースすると、getLoadedProductCollection()メソッドにすばやくMage_Catalog_Block_Product_List::_getProductCollection()アクセスできます。メソッドは、ブロックが製品ページにあるかどうかを判断する場所です(レジストリをチェックすることで)。_beforeToHtml()呼び出しスタックを介してコレクションの状態を追跡すると、ブロックのメソッドまでロードされていないと判断できます。出力からトレースバックすると、コレクションがcatalog_block_product_list_collectionイベントを消費するMage_Reviewオブザーバーによって明示的にロードされていることがわかります(を参照Mage_Review_Model_Observer::catalogBlockProductCollectionBeforeToHtml())。これにより、開始点と終了点が得られます。

うまくいけば、後で解決策があるはずです。

于 2012-04-28T15:06:11.190 に答える