カスタムの非属性ベースの階層化ナビゲーション。これが唯一の方法ですか?


8

今日、私は属性に基づいていないレイヤードナビゲーションオプションを使用しています。これは評価用なので、フロントエンドは素敵な光沢のある星を表示できます。

これを行うには私が持っています:

  1. モジュールを作成しました
  2. catalog_block_layer_viewを書き直しました

    <blocks>        
      <catalog>
        <rewrite>
          <layer_view>Bob_Catalog_Block_Layer_View</layer_view>
         </rewrite>                
       </catalog>
    </blocks>
  3. Mage_Catalog_Block_Layer_Viewを拡張するBob_Catalog_Block_Layer_Viewというクラスを作成しました

  4. _initBlocks()、getFilters()および_prepareLayout()を作成して、親クラスのメソッドをオーバーライドしました。これらはすべて、ある時点で親クラスを呼び出し、返されたデータの前に追加データを追加または追加します。
  5. フィルターブロックBob_Catalog_Block_Layer_Filter_Ratingを作成します。このフィルターブロックは、Mage_Catalog_Block_Layer_Filter_Abstractを、filterModelNameを設定し、その親を呼び出し、次にカスタムテンプレートを設定するコンストラクターで拡張します。
  6. Mage_Catalog_Model_Layer_Filter_Abstractを拡張し、apply()、getName()、_ getItemsData()を実装するモデルBob_Catalog_Model_Layer_Filter_Ratingを作成します。

これはすべて正常に動作します。素敵な光沢のある星がレイヤードナビゲーションに表示されます。

レイヤーステートテンプレートに関しては、カスタム評価フィルターを取得してレイアウトを変更するためにそこに条件を配置する必要があったため、何かが足りないという直感があります。また、私がする必要があるいくつかのこと(loadイベントがページネーションのコレクション数を台無しにしないように製品コレクションを複製する)は、私が丘を泳いでいるように感じさせます。

したがって、問題は、カスタムの非属性ベースのレイヤードナビゲーションフィルターを構築する方法について、より良い提案(またはおそらくブログ投稿wink)を得たかどうかです。

読んでくれてありがとう、

Si


翌日にやらなければならないので、こうやってやろうと思った。
Fabian Blechschmidt 2013年

回答:


5

それを行う別の方法があります、あなたはあなたの製品に評価となる通常の属性を追加することができます。次に、オブザーバーを使用して(この評価がどのように形成されるのかわかりません)、製品の属性を更新します。または、オブザーバーがない場合は、スクリプトの負荷に応じて、すべての製品の属性をx分ごとに更新するcronjobを使用します。

この方法では、Magentoの書き換えや変更は行われず、すべてのナビゲーションモジュールが引き続き機能し、メンテナンスが容易になります。

もちろん問題は、これはあなたのためのオプションですか?評価はどこから来ますか?

編集 JavaScriptを使用して星のスタイルを設定するか、テンプレートの属性名を確認する必要があります。


これはほとんどすべてのオプションをカバーしていると思います。オブザーバーの提案は興味深いアイデアです。
Siグリフィス

覚えていると思いますが、標準のスタースタイルは、5からの平均評価に基づくCSS幅にすぎません。1/ 5 = 20%の幅、4.3 / 5 = 86%の幅など。 cronスクリプトを使用して属性値を更新するのはかなり賢い方法です。+1
pspahn 2013年

2

コードを調べたところ、イベントは見つかりませんでした。追加の属性を追加せずに、作成するものはありません<rewrite>

\Mage_Catalog_Block_Layer_View::_prepareLayout()前にブロックを追加するapply()必要があります(使用できない場合は、を使用できます)core_block_abstract_prepare_layout_after

そして、それを追加する必要\Mage_Catalog_Block_Layer_View::getFilters()があり、イベントもありません。


これはまさに私が見つけたものです。また、state.phtmlテンプレートを回避する方法がないようです。出力のいずれかを変更するには、条件付きブランチが必要なようです。
Siグリフィス

私が書き直しcatalog/layer_filter_categorycatalog/layer_filter_attributeおよびcatalog_resource/layer_filter_attribute使用せずに、オプションのすべての時間を表示するようにstate.phtmlフィルタを削除する方法はありません現時点では: - /
ファビアンBlechschmidt

私の仕事はif($ _filter-> getName()=== 'whatever'){}カスタム状態のHTMLの表示を回避するためにありました。それは素晴らしい解決策ではありませんが、それでもなお解決策です。Ps。私たちが最後にMDPで会って以来、あなたが元気であることを願っています。
Siグリフィス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.