カテゴリビューの製品コレクションをカスタマイズするのが非常に面倒な理由の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()
)。これにより、開始点と終了点が得られます。
うまくいけば、後で解決策があるはずです。