Magento

Layered Navigation

Verstehen und Erweitern

von Tobias Vogt / @tobi_pb / www.code-x.de

Wer ich bin

Meine Magento-Welt

  • www.webguys.de
  • Vorträge
  • Artikel im PHP-Magazin, T3N, usw.
  • FireGento

Vorab

  • ein paar Vorkenntisse sind gut
  • nichts ist vollständig
  • gemeinsam mehr erreichen!
  • Quelltext kann man anfassen
  • Ziel: Ein grober Überblick :-)

Voraussetzungen

Im Admin-Panel

Attribute verwalten

Anker-Kategorie

Indizes

Konfiguration

Wie es funktioniert?

Der Layer

### Mage_Catalog_Block_Layer_Filter_Abstract ``` protected function _initFilter() { $this->_filter = Mage::getModel($this->_filterModelName) ->setLayer($this->getLayer()); $this->_prepareFilter(); } public function getName() // […] public function getItems() // […] public function getItemsCount() // […] ```

Also…

  • das Layout-XML fügt den Block catalog/layer_view ein
  • dieser Block erstellt selbstständig Kind-Blöcke je Filter
  • der Kategoriefilter ist hardcoded
  • alle Kind-Blöcke haben einen Namen bzw. Titel,
    mögliche Filterwerte (Items) und eine Anzahl an gefundenen Produkten

Genug Darstellung, auf zu den Daten

Mage_Catalog_Model_Layer

  • wird als Singleton angesprochen
  • Methoden
    • getProductCollection()
      -> Basis Collection der Suche oder Kategorie-Seite
    • getFilterableAttributes()

Mage_Catalog_Model_Layer_Filter_Attribute

  • je Attribut, welches filterbar ist, eine Instanz
  • Methoden
    • apply($request)
      -> den jeweiligen Filter auslesen & aktivieren
    • getItems()
      -> Filter-Items über Resource-Model holen

$request

http://demoshop.code-x.de/apparel/shirts.html?color=22

Also…

  • beim Erstellen fragen die Kind-Blöcke
    ihre Models nach den Filtermöglichkeiten
  • die Models nehmen die Basis-Product-Collection
    und testen ob sie Ergebnisse haben
  • bei einem aktiven Filter aktiviert der Block
    die Filterung der Model-Instanz
  • das verändert die Basis-Product-Collection
  • alle nicht aktiven Filter haben daraufhin
    eine andere Ergebnismenge

Möglichkeiten für Veränderungen

Schwierig, aber möglich

  • keine nutzbaren Events
  • vieles ist fest verdrahtet
  • bleibt nur ein Rewrite von Mage_Catalog_Block_Layer_View

Mage_Catalog_Block_Layer_View

  • meist reicht Anpassung prepareLayout + getFilters()
  • Problem, wenn mehrere Module Anpassungen machen

Webguys_Customlayer

  • wirft bei den Methoden einige Events,
    sodass nachträgliche Anpassungen möglich sind
  • am Mittwoch verfügbar unter www.webguys.de

DANKE!

Macht Spaß hier zu sein :-)

Euer tobi@webguys.de, @tobi_pb


P.S. Danke an reveal.js für das tolle Framework