Ändern Sie das Kategorielayout dynamisch basierend auf Filtern

7

Zusammenfassung

Ich habe ein Problem, bei dem ein Magento Store, an dem ich arbeite, so konfiguriert wurde, dass gruppierte Produkte mit zugehörigen einfachen Produkten verwendet werden. Diese Produkte können nach den im Administrator konfigurierten Produktattributen / -werten gefiltert werden.

Aktuelles Verhalten

  • Die Sichtbarkeit der einfachen Produkte ist auf Nicht einzeln sichtbar eingestellt .
  • Die einfachen Produkte werden bei der Suche nach ihrem Gruppenprodukt angezeigt .

Wenn die Endbenutzer die Produkte Ergebnisse durch Filter Farbe und zum Beispiel rot , die gruppierten Produkte mit einfachen zugehörigen Produkten , die einen Attributwert für haben Farbe von rot angezeigt.

Erwartetes Verhalten (nach Anpassung)

  • Die Sichtbarkeit der einfachen Produkte ist auf Nicht einzeln sichtbar eingestellt .
  • Die einfachen Produkte werden bei der Suche nach ihrem Gruppenprodukt angezeigt .

Wenn der Endbenutzer die Produktergebnisse (nur) nach Farbe filtert , sollte anstelle der angezeigten gruppierten Produkte dieses einfache Produkt angezeigt werden.

Meine Logik war - ich konnte die Filter anhand der Anforderungsparameter erkennen. Wenn der Farbfilter eingestellt wurde, überschreibe ich die Produktergebnisse irgendwie .

Wenn ich irgendwie sage, was ich meine, ist dies der Teil, in dem ich Probleme habe, mein einfaches Problem zu lösen. Wie kann ich dieses Problem lösen?

Schlussfolgerung / Versuche

Unten finden Sie eine Liste der Versuche, an die ich gedacht und mit denen ich herumgespielt habe, um festzustellen, dass sie mein Problem nicht vollständig oder einfach überhaupt nicht lösen.

Beachten Sie catalog_controller_category_init_before:

Ich dachte, wenn ich die _initCategory()Methode beobachte , könnte ich das Layout überschreiben, indem ich möglicherweise die Magento-Konfiguration ändern könnte, um einfache Produkte und keine gruppierten Produkte anzuzeigen.

Es scheint $this->loadLayout()jedoch nie aufgerufen zu werden, daher muss ich die getLayoutoder viewActionMethoden auf sich CategoryControllerselbst überschreiben .

Überschreiben Sie den CategoryController explizit, um Layoutänderungen zu implementieren:

Ich habe das oben Gesagte rückgängig gemacht und mich entschlossen, meine zweite Option zum Überschreiben der Funktionalität fortzusetzen. Beginnen Sie mit der Erweiterung des Mage_Catalog_CategoryControllerControllers.

Mein erster Versuch war, das zu überschreiben loadLayout. Nachdem ich erfahren hatte, dass dies nie genannt wird, entschied ich mich, das zu überschreiben. Zu getLayoutdiesem Zeitpunkt war ich mir nicht sicher, was ich tun würde.

Überschreiben Sie die Mage_Catalog_Block_Product_List:

Ich entschied, dass die bessere Option darin bestand, den eigentlichen Block zu erweitern, der die erforderlichen Modelle und Sammlungen enthält. Innerhalb meines Blocks überschreibe ich die getProductsListHtmlMethode, ich erfahre schnell, dass der gesamte HTML-Code bereits analysiert, ausgeführt und generiert wurde.

Also konnte ich nicht einfach.

  • Hören Sie auf die $this->getRequest()->getParams();
  • Durchlaufen Sie die gruppierten Produkte, um die zugehörigen Produkte zu erhalten, die meinem Filter entsprechen.

Beobachten Sie das catalog_product_collection_load_afterEreignis:

Dieses Mal dachte ich, ich könnte die Modellsammlung beobachten und die Suche ändern, um die Ergebnisse zu ändern, wenn meine Filter eingestellt wurden. Wobei ich $observer->getEvent()->getCollection()die Abfrage basierend auf meinen Filtern erhalte und aktualisiere.

Dies funktioniert nicht, da ich die gruppierten Produkte entfernen kann, die einfachen Produkte jedoch aufgrund der Sichtbarkeit nicht angezeigt werden.

Asche
quelle

Antworten:

0

Obwohl dies keine explizite Lösung darstellt, habe ich diese Antwort derzeit getan, um mein Ziel zu erreichen.

Ich habe im Wesentlichen einen Beobachter dazu geschaffen catalog_product_collection_load_after. Anschließend erstelle ich die Abfrage neu, um nur die gewünschten Daten zu erfassen.

$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.
Asche
quelle
0

Ich habe kein vollständiges Codebeispiel zur Verfügung, aber was ist mit dem Erstellen eines benutzerdefinierten Moduls und dem Überschreiben Mage_Catalog_Model_Layer->prepareProductCollection()? Sie können verwenden, Mage::app->->getRequest()->getParams()um festzustellen, ob das Attribut, das Sie verwenden möchten, vorhanden ist. Wenn dies der Fall ist, führen Sie das Attribut nicht aus Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection), das jetzt vorhanden ist.

Ein Beispiel:

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;
}

Ich hoffe, das bringt dich wenigstens näher.

Tyler V.
quelle
0

Entsprechend Ihrer Anforderung finde ich es nicht geeignet, bei der Auswahl der Filter ein einfaches Produkt zu zeigen. Soweit ich das beurteilen kann, möchten Sie das Bild dieses Farbprodukts zeigen, das Sie auch in einem konfigurierbaren aufgelisteten Produkt erzielen können. Sie können beim Rendern der Liste Produktdetails zuordnen. Lösen Sie einfach die Flags aus, um zu überprüfen, ob ein Filter ausgewählt ist oder nicht, der zum Konfigurieren des Produkts verwendet wird. Wenn dieser Filter ausgewählt ist, rufen Sie das entsprechende Bild ab. Der Wiederaufbau der gesamten Struktur macht keinen Sinn. Erstellen Sie entweder eine Blockdatei, um die einfachen Produkte zu rendern, und wechseln Sie das Block-Rendering bei der Filterauswahl. Aber ich werde die erste Option bevorzugen. Schreiben Sie für jede Anfrage.

Aman Srivastava
quelle