de_DEus

Nutzung von Events in IntegerNet_Solr – ein Beispiel

Vor Kurzem trat einer unserer Kunden mit der folgenden Frage an uns:

Ich hab gesehen, dass man die Priorität von Attributen und Produkten anpassen kann. Wir haben ein Attribut mit verschiedenen Optionen. Ist es möglich, einem bestimmten Attributwert ein stärkeres Gewicht zu geben anstatt das gesamte Attribut mit einer höheren Priorität auszustattet?

Das ist eine wirklich gute Frage. Unser Modul unterstützt keine Hervorhebung von Produkten basierend auf einzelnen Attributwerten, was bedeuten würde, dass Produkte mit einem bestimmten Wert eine höhere Position in den Suchergebnissen einnehmen könnten. Man kann zwar Produkte stärker gewichten, allerdings ist diese Lösung wenig flexibel und bringt auch viel manuelle Arbeit mit sich, wenn Hunderte Produkte angepasst werden müssen.

Events zum Optimieren der Suchergebnisse nutzen

Für Fälle wie diesen ist IntegerNet_Solr mit eigenen Events ausgestattet, die von anderen Modulen in Form von Observers genutzt werden können – ein bekanntes Konzept in der Magento-Entwicklung. Durch die Nutzung dieser Events gewinnen Shop-Betreiber viel Flexibilität, weil sie das Verhalten des Solr-Moduls verändern können, sowohl während der Indizierung als auch während der Suche.

Zurück zu unserem Beispiel. Um einen flexiblen Boost für Produkte mit einem bestimmten Attributwert zu realisieren, kann das Event “integernet_solr_product_collection_load_after” verwendet werden. Dieses Event liefert die Objekte, die gefunden wurden. In diesem Fall ist es nur eins:

  • ‘collection’ – die Produkt-Collection , die für die Indizierung genutzt wird.

Das Modul kann mit einem Observer überwacht werden, indem der folgende Teil in die config.xml eines Moduls eingefügt wird:

Dabei muss beachtet werden, dass Namen (Namespace und Modulname) an die eigenen Gegebenheiten angepasst werden muss. Nicht verändert werden darf allerdings der Name des Events “integernet_solr_product_collection_load_after”.

Anschließend kann eine Observer-Klasse erstellt werden. Der Name der zugehörigen Methode ist definiert in der config.xml:

Dadurch werden die rohen Produktdaten in der Datei var/log/system.log hinterlegt. Ein Auszug aus den Ergebnissen:

Abhängig von den Anforderungen wollen wir den Attributwert “solr_boost” abhängig von einem anderen Attribut anpassen. In unserem Beispiel wollen wir den Boost duplizieren, wenn der Wert des Herstellers “Sony” ist. Das erreichen wir durch den folgenden Observer-Code:

Dieses funktionierende Beispielmodul kann hier heruntergeladen werden.

Vollständige Liste aller Events:

integernet_solr_get_product_data

Parameter:

  • product: das Magento-Produkt-Objekt
  • product_data: die Daten, die für die Indizierung in Solr vorbereitet werden. Kann modifiziert werden.

Zweck:

Anpassen der Daten, die direkt zu Solr gehen. Dieses Event hätte ebenfalls für das oben genannte Beispiel benutzt werden können.

integernet_solr_update_query_text

Parameter:

  • tranport: ein Transport-Objekt, das die Anfrage enthält, die für die Suche benutzt wird.

Zweck:

Anpassen der Suchworte mit diesem Event. Zum Beispiel kann hier eine eigene Austausch-Funktion ansetzen.

integernet_solr_before_search_request

Parameter:

  • transport: ein Transport-Objekt, das alle Teile der Suchanfrage enthält, zum Beispiel die Suchanfrage selbst oder die Parameter.

Zweck:

Die volle Kontrolle über die Suchanfrage, die zu Solr geschickt wird.

integernet_solr_after_search_request

Parameter:

  • result: das komplette Suchergebnis, wie es von Solr übertragen wird

Zweck:

Anpassen der Suchergebnisse, zum Beispiel für eine eigene Sortierung.

integernet_solr_product_collection_load_before

Parameter:

  • collection: die Proukt-Kollektion, wie sie für die Indizierung benutzt wird

Zweck:

Anspassen der Produkt-Kollektion, bevor sie geladen wird, zum Beispiel durch Hinzufügen weiterer Attribute oder Filter.

integernet_solr_product_collection_load_after

Parameter:

  • collection: die Produkt-Kollektion, wie sie für die Indizierung benutzt wird

Zweck:

Anpassen der Produkt-Kollektion, nachdem sie geladen wurde, zum Beispiel zum Anpassen der Produktdaten, siehe oben beschriebenen Anwendungsfall.

integernet_solr_can_index_product

Parameter:

  • product: das Magento-Produkt

Zweck:

Ausschließen von Produkten aus der Indizierung. Dafür wird einfach $product->setSolrExclude(true) zum Ausschließen des Produkts aus dem Index gesetzt.

Die Vorteile von Events

Obwohl der Anwendungsfall, den unser Kunde angesprochen hat, von den Funktionen des Moduls nicht abgedeckt wird, zahlt sich die Implementierung der Events aus: Sie ebnen den Weg für eine einfache, individuelle Anpassung der Suchergebnisse. Es ist eins unserer Ziele ein Magento-Modul zu schaffen, dass auch ohne Programmierkenntnisse angepasst werden kann. Auf der anderen Seite wollen wir es jedoch auch nicht mit Funktionen überlasten, die nur für eine kleine Gruppe unserer Kunden von Interesse sind. Die goldene Mitte hier zu finden ist nicht immer einfach. Events sind für uns an dieser Stelle das richtige Mittel der Wahl.

Andreas von Studnitz

Autor: Andreas von Studnitz

Andreas von Studnitz ist Diplom-Informatiker, Magento-Entwickler und Geschäftsführer von integer_net. Seine Schwerpunkte sind Schnittstellenentwicklung, Backendentwicklung, Beratung und Entwicklerschulungen. Seit 2011 ist er Magento Certified Developer, seit 2014 Magento Certified Solution Specialist.

Mehr Informationen

Dieser Beitrag hat 0 Kommentare

Einen Kommentar hinterlassen