Benutzerdefinierte nicht auf Attributen basierende geschichtete Navigation. Ist dies der einzige Weg, dies zu tun?

8

Heute habe ich eine mehrschichtige Navigationsoption aufgerufen, die nicht auf einem Attribut basiert. Es ist für Bewertungen, damit das Frontend schöne glänzende Sterne zeigen kann.

Dazu habe ich:

  1. Modul erstellt
  2. Katalog_block_layer_view neu geschrieben

    <blocks>        
      <catalog>
        <rewrite>
          <layer_view>Bob_Catalog_Block_Layer_View</layer_view>
         </rewrite>                
       </catalog>
    </blocks>
  3. Erstellt eine Klasse namens Bob_Catalog_Block_Layer_View, die Mage_Catalog_Block_Layer_View erweitert

  4. Erstellt _initBlocks (), getFilters () und _prepareLayout (), um die übergeordneten Klassenmethoden zu überschreiben. Diese alle rufen die übergeordnete Klasse irgendwann auf und stellen dann zusätzliche Daten entweder voran oder hängen sie an das zurück, was zurückgegeben wird.
  5. Erstellen Sie einen Filterblock Bob_Catalog_Block_Layer_Filter_Rating, der Mage_Catalog_Block_Layer_Filter_Abstract um einen Konstruktor erweitert, der den filterModelName festlegt und dessen übergeordnetes Element aufruft. Anschließend legt er eine benutzerdefinierte Vorlage fest, wie es scheint.
  6. Erstellen Sie ein Modell Bob_Catalog_Model_Layer_Filter_Rating, das Mage_Catalog_Model_Layer_Filter_Abstract erweitert und apply (), getName (), _getItemsData () implementiert.

Das alles funktioniert gut. Die schönen glänzenden Sterne zeigen sich im geschichteten Navi.

Ich habe das Gefühl, dass mir etwas fehlt, weil ich bei der Vorlage für den Ebenenstatus eine Bedingung einfügen musste, um den benutzerdefinierten Bewertungsfilter zu übernehmen und das Layout zu ändern. Auch einige der Dinge, die ich tun musste (Klonen der Produktkollektion, damit das Ladeereignis die Anzahl der Sammlungen bei der Paginierung nicht beeinträchtigt), geben mir das Gefühl, bergauf zu schwimmen.

Die Frage ist also, ob jemand von Ihnen bessere Vorschläge (oder vielleicht ein Augenzwinkern für einen Blog-Beitrag ) zum Erstellen eines benutzerdefinierten, nicht von Attributen unterstützten mehrschichtigen Navigationsfilters hat.

Danke fürs Lesen,

Si

Si Griffiths
quelle
Ich muss es in den nächsten Tagen tun und ich dachte, es so zu machen.
Fabian Blechschmidt

Antworten:

5

Es gibt noch eine andere Möglichkeit: Sie können Ihrem Produkt ein normales Attribut hinzufügen, nämlich die Bewertung. Verwenden Sie dann einen Beobachter (ich weiß nicht, wie diese Bewertung gebildet wird), um das Produktattribut zu aktualisieren. Wenn ein Beobachter keine Option ist, verwenden Sie möglicherweise einen Cronjob, der dieses Attribut für jedes Produkt alle x Minuten aktualisiert, je nachdem, wie schwer das Skript ist.

Auf diese Weise ist kein Umschreiben und Ändern von Magento erforderlich, alle Navigationsmodule funktionieren weiterhin und die Wartung ist einfacher.

Die Frage ist natürlich, ist dies eine Option für Sie? Woher kommen die Bewertungen?

BEARBEITEN Sie müssten die Sterne mit Javascript formatieren oder den Attributnamen in der Vorlage überprüfen.

Rick Kuipers
quelle
Ich denke, das deckt so ziemlich alle Optionen ab. Der Beobachtervorschlag ist eine interessante Idee.
Si Griffiths
Wenn ich mich recht erinnere, ist das Standard-Stern-Styling nur eine CSS-Breite, die auf einer durchschnittlichen Bewertung von 5 basiert. 1/5 = 20% Breite, 4,3 / 5 = 86% Breite usw. Ich bezweifle, dass sich dies ändern muss ... aber Das Aktualisieren des Attributwerts über ein Cron-Skript ist ziemlich clever. +1
pspahn
2

Ich habe mich in den Code vertieft und kein Ereignis gefunden. Ohne zusätzliche Attribute gibt es nichts zu tun<rewrite>

Sie müssen Ihren Block \Mage_Catalog_Block_Layer_View::_prepareLayout()vor dem hinzufügen apply()(wenn nicht, könnten Sie verwenden core_block_abstract_prepare_layout_after.

Und Sie müssen es hinzufügen \Mage_Catalog_Block_Layer_View::getFilters()und es gibt auch kein Ereignis.

Fabian Blechschmidt
quelle
Genau das habe ich gefunden. Es scheint auch keine Möglichkeit zu geben, die Vorlage state.phtml zu umgehen. Es scheint, dass ein bedingter Zweig erforderlich ist, um die Ausgabe zu ändern.
Si Griffiths
Ich habe umgeschrieben catalog/layer_filter_category, catalog/layer_filter_attributeund catalog_resource/layer_filter_attributeum die Optionen die ganze Zeit zu zeigen, ohne die state.phtmlzu verwenden, gibt es im Moment keine Möglichkeit, die Filter zu entfernen: - /
Fabian Blechschmidt
Meine Arbeit hatte ein if ($ _filter-> getName () === 'Whatever') {}, um das Anzeigen des benutzerdefinierten HTML-Status zu umgehen. Es ist keine großartige Lösung, aber es ist trotzdem eine Lösung. Ps. Ich hoffe, es geht Ihnen gut, seit wir uns das letzte Mal bei MDP getroffen haben.
Si Griffiths