2012-04-27 15 views
2

/app/design/frontend/default/[theme]/template/catalog/product/list.phtml以下のスニペットがループして表示されます。 $ _productCollection内容Magento製品リスト - 製品タイプ別に並べ替え(設定可能なものからシンプルなもの)

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

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

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

乾杯!

答えて

2

、このような痛みをカスタマイズするには、カテゴリビューで製品のコレクションを作ることの一つは、ツールバー、階層ナビゲーション、実際のリスト表示、さらにはが明示的にイベントオブザーバでコレクションをロードMage_Reviewモジュールとの間の結合であります!

最初は、あなたがあなたの条件を追加するために、典型的な収集ユーティリティ(例えばaddAttributeToSort())を使うことができたように思いますが、あなたは収集データがすでににロードされ、これは、テンプレート・レベルで動作しないことがわかります。私はコレクションゲッターメソッドgetLoadedProductCollection()と命名されていることは、コアチームのヒントであると推測します。

Magentoのコレクションのレイジーロードの実装は、彼らがload()編されたら(直接的または間接的に)、彼らは明示的にそうすることを余儀なくされることなく(すなわち、データベースとの取引)リロードしないようなものです。

したがって、ロードする前にコレクションの注文パラメータを設定する必要があります。 getLoadedProductCollection()メソッドをトレースすると、Mage_Catalog_Block_Product_List::_getProductCollection()メソッドがすぐに取得されます。このメソッドは、ブロックが製品ページにあるかどうかを判断します(レジストリのyuckをチェックします)。コールスタックを通じたコレクションの状態を追跡すると、ブロックの_beforeToHtml()メソッドまでロードされていないと判断できます。出力からトレースバックすると、catalog_block_product_list_collectionイベント(Mage_Review_Model_Observer::catalogBlockProductCollectionBeforeToHtml()を参照)を消費するMage_Reviewオブザーバによってコレクションが明示的に読み込まれていることがわかります。それは出発点と終点を与える。

私はうまくいけば解決策を後で持っているはずです。

+0

ちょっと@benmarks、本当に感謝しています。私はすでにこのスレッドからロードされているコレクションの問題を控除しました:http://stackoverflow.com/questions/5280392/magento-load-only-configurable-products。しかし、それはコメントごとにクローンメソッドに関連する問題を提示します。 – EasyCo

+0

私はついに成功したようです。私は深くテストを終えていませんが、基本的にlist.phtmlの最初の行を置き換えています: '$ _productCollection = $ this-> getLoadedProductCollection() - > clear($ _productCollection = $ this-> getLoadedProductCollection() ) - > addAttributeToSort( 'type_id'、 'ASC') - > load(); '。これは私の階層化されたナビゲーションを維持するようだが、構成可能な単純な並べ替え。 – EasyCo

+0

ツールバーの並べ替えやページング、およびレビューでいくつかのテストを行う必要があります。私はこれらの両方がうまくいっていないと思う。 – benmarks

関連する問題