フィルターに基づいてカテゴリーのレイアウトを動的に変更する


7

あらすじ

私が取り組んでいるMagentoストアによって、グループ化された製品と関連する単純な製品を使用するように構成されているという問題があります。これらの製品は、管理者で設定された製品の属性/値でフィルタリングできます。

現在の行動

  • 単純な製品の可視性は、「個別非表示」に設定されています
  • 検索された単純な製品は、グループ製品ごとに表示されます。

エンドユーザーが製品の結果を色(たとえば、red)でフィルターすると、グループ化された製品で、赤のの属性値を持つ単純な関連製品が表示されます。

予想される動作(カスタマイズ後)

  • 単純な製品の可視性は、「個別非表示」に設定されています
  • 検索された単純な製品は、グループ製品ごとに表示されます。

エンドユーザーが製品の結果を(のみ)でフィルターすると、グループ化された製品が表示される代わりに、その単純な製品が表示されます。

私のロジックは-リクエストパラメーターを通してフィルターを検出することができました。カラーフィルターが設定されている場合、製品の結果を何とか上書きします。

どういう意味かというと、これが簡単な問題の解決に苦労している部分です。この問題を解決するにはどうすればよいですか?

結論/試み

以下は、私が問題を完全に解決しないか、まったく問題を解決しないことを見つけるために私が考え、試した試みのリストです。

を観察してくださいcatalog_controller_category_init_before

この_initCategory()方法を確認したところ、レイアウトをオーバーライドして、グループ化された製品ではなく単純な製品を表示するようにMagentoの構成を変更できる可能性があると考えました。

しかし、それ$this->loadLayout()は決して呼び出されないように見えるので、getLayoutまたは自体のviewActionメソッドをオーバーライドする必要がありCategoryControllerます。

レイアウトの変更を実装するには、CategoryControllerを明示的にオーバーライドします。

上記を元に戻し、機能をオーバーライドする2番目のオプションを追求することにしました。Mage_Catalog_CategoryControllerコントローラーの拡張から始めます。

私の最初のトライアルはをオーバーライドすることでしたが、loadLayoutこれが呼び出されないことを知った後getLayout、この時点でをオーバーライドすることを決定しました。

をオーバーライドしMage_Catalog_Block_Product_Listます。

私は、モデルとコレクションが必要な実際のブロックを拡張することをお勧めしました。ブロック内でgetProductsListHtmlメソッドをオーバーライドすると、HTML全体が既に解析、実行、生成されていることがすぐにわかります。

だから私は簡単にはできませんでした。

  • 聞いてください$this->getRequest()->getParams()
  • グループ化された製品を反復処理して、フィルターに一致する関連製品を取得します。

catalog_product_collection_load_afterイベントを観察します。

今回は、モデルコレクションを観察し、フィルターを設定したときに結果を変更するようにクエストを変更できると思いました。これ$observer->getEvent()->getCollection()により、フィルターに基づいてクエリを取得および更新します。

グループ化された製品を削除できるのでこれは機能しませんが、可視性のために単純な製品は表示されません。

回答:


0

これは明確な解決策を提供するものではありませんが、現在、この答えは私の目標を達成するために私が行ったものです。

私は本質的ににオブザーバーを作成しましたcatalog_product_collection_load_after。次に、クエリを再作成して、必要なデータのみを収集します。

$event      = $observer->getEvent();
$collection = $event->getCollection();
$select     = $collection->getSelect();

// Adapter is the database resource adapter (an example, probably not the best)
$adapter = Mage::getResource('core/resource');

// Reset the entire query (using the Zend reset method).
$select->reset();

$select->from([ 'main_table' => $adapter->getTableName('catalog/product') ], [
    // stuff to get
])

// inner joins and things.

0

完全なコードサンプルはありませんが、カスタムモジュールの作成とオーバーライドについてはMage_Catalog_Model_Layer->prepareProductCollection()どうですか?を使用Mage::app->->getRequest()->getParams()して、使用したい属性が存在するかどうかを確認し、存在する場合は実行しないでくださいMage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection)

例:

public function prepareProductCollection($collection)
{
    if (!in_array(Mage::app->->getRequest()->getParams(), 'colour')) {
        return parent::prepareProductCollection($collection);
    }

    $collection
        ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
        ->addMinimalPrice()
        ->addFinalPrice()
        ->addTaxPercents()
        ->addUrlRewrite($this->getCurrentCategory()->getId());

    Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection);
    // Don't filter by "visible in catalog" if filtering by colour
    // Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection);

    return $this;
}

これで少なくともあなたが近くなればいいのですが。


0

お客様の要件によると、フィルターの選択で単純な製品を表示するのは適切ではありません。私が観察できる限り、あなたは構成可能なリストされた製品でも達成できるそのカラー製品のイメージを表示しようとしています。リストをレンダリングするときに関連する製品の詳細を設定できます。フラグをトリガーして、製品の構成に使用されるフィルターが選択されているかどうかを確認し、選択されている場合はそれぞれの画像を取得します。完全な構造を再構築しても意味がありません。単純な製品をレンダリングするブロックファイルを作成し、フィルター選択でブロックレンダリングを切り替えます。しかし、私は最初のオプションを好むでしょう。任意のクエリに書き込みます。

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