Frage

Zusammenfassung

Ich habe ein Problem, in dem in einem Magento -Store, an dem ich arbeite, für die Verwendung gruppierter Produkte mit zugehörigen einfachen Produkten konfiguriert wurde. Diese Produkte können von den Produktattributen/Werten im Administrator gefiltert werden.

Aktuelles Verhalten

  • Die Sicht der einfachen Produkte sind auf Nicht einzeln sichtbar.
  • Die einfachen Produkte beim Durchsuchen werden von ihren angezeigt Gruppe Produkt.

Wenn der Endbenutzer die Produkte filtert Farbe und zum Beispiel rot, die gruppierten Produkte mit einfachen zugehörigen Produkten, die einen Attributwert haben Farbe von rot sind angezeigt.

Erwartetes Verhalten (nach Anpassung)

  • Die Sicht der einfachen Produkte sind auf Nicht einzeln sichtbar.
  • Die einfachen Produkte beim Durchsuchen werden von ihren angezeigt Gruppe Produkt.

Wenn der Endbenutzer die Produkte filtert Farbe (nur) dass anstelle der gruppierten Produkte dieses einfache Produkt angezeigt werden sollte.

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

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

Schlussfolgerung / Versuche

Im Folgenden finden Sie die Liste der Versuche, an die ich gedacht habe und mit denen ich festgestellt habe, dass sie mein Problem nicht vollständig lösen oder mein Problem einfach nicht lösen.

Beobachte catalog_controller_category_init_before:

Ich dachte, wenn ich das beobachte _initCategory() Methode Ich könnte das Layout insofern überschreiben, da ich die Magento -Konfiguration potenziell ändern könnte, um einfache Produkte und nicht gruppierte Produkte anzuzeigen.

Wie auch immer es erscheint $this->loadLayout() wird nie angerufen, also muss ich das außer Kraft setzen getLayout oder viewAction Methoden auf der CategoryController selbst.

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

Ich kehrte die oben genannten zurück und beschloss, meine zweite Option zu verfolgen, die Funktionalität zu überschreiben. Beginnend mit der Ausweitung der Mage_Catalog_CategoryController Regler.

Mein erster Versuch bestand darin, die außer Kraft zu setzen loadLayout, Nach dem Erlernen wird nie genannt. Ich habe mich dann entschlossen, das außerordentlich zu überschreiben getLayout Zu diesem Zeitpunkt war ich mir nicht sicher, was ich tun würde.

Überschreiben die Mage_Catalog_Block_Product_List:

Ich entschied, dass die bessere Option darin bestand, den tatsächlichen Block mit den erforderlichen Modellen und Sammlungen zu erweitern. Innerhalb meines Blocks überschreibe ich das getProductsListHtml Methode, ich lerne schnell, dass die gesamte HTML bereits analysiert, ausgeführt und generiert wurde.

Also konnte ich nicht einfach.

  • Hören Sie auf die $this->getRequest()->getParams();
  • Iterieren Sie die gruppierten Produkte, um ihre damit verbundenen Produkte zu erhalten, die meinem Filter entsprechen.

Beobachte catalog_product_collection_load_after Veranstaltung:

Dieses Mal fand ich es gut, ich konnte die Modellsammlung beobachten und die Quest ändern, um die Ergebnisse zu verändern, wenn meine Filter festgelegt wurden. Wobei ich bekomme $observer->getEvent()->getCollection() und aktualisieren Sie die Abfrage basierend auf meinen Filtern.

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

War es hilfreich?

Lösung

Obwohl dies nicht explizit eine Lösung bietet, ist diese Antwort derzeit das, was ich getan habe, um mein Ziel zu erreichen.

Ich habe im Wesentlichen einen Beobachter geschaffen catalog_product_collection_load_after. Ich habe dann die Abfrage neu erstellt, um nur die von mir gewünschten Daten zu sammeln.

$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.

Andere Tipps

Ich habe kein vollständiges Code -Beispiel zur Verfügung, aber was ist mit dem Erstellen eines benutzerdefinierten Moduls und überschrieben Mage_Catalog_Model_Layer->prepareProductCollection()? Du könntest benutzen Mage::app->->getRequest()->getParams() Um herauszufinden, ob das Attribut, das Sie verwenden möchten, vorhanden ist, und wenn dies der Fall ist, laufen Sie nicht aus Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection) Das ist jetzt da.

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 zumindest näher.

Nach Ihren Anforderungen finde ich es nicht geeignet, einfaches Produkt bei der Auswahl der Filter zu zeigen. So viel wie ich kann, wie ich beobachtet kann, dass Sie das Bild dieses Farbprodukts zeigen möchten, das Sie auch in konfigurierbarem Produkt erzielen können. Sie können Produktdetails beim Rendern der Liste zugeordnet haben. Lösen Sie einfach die Flags aus, um zu überprüfen, ob der Filter ausgewählt ist oder nicht, welche zum Konfigurieren des Produkts verwendet werden, falls ausgewählt, und holen Sie das jeweilige Bild. Das Wiederaufbau der vollständigen 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 Frage.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top