Wie können agile UX-Design Projekte nah am Kunden durchgeführt werden?

Agile U Design Projekte comspace UandI Workshop

Agile U Design Projekte comspace UandI Workshop
Wie lassen sich agile Entwicklung und User Experience Design (UX) miteinander verbinden? Darüber kann man Blogbeiträge und ganze Bücher schreiben. Und außerdem sollte man sich diese Frage als Agentur regelmäßig neu stellen. Und am besten die  Antworten auch gleich ausprobieren. Damit man das nicht direkt am Kunden tun muss, experimentiert man einfach mit einer befreundeten Agentur.
Und wir wären nicht comspace, wenn wir nicht gleich noch ein Spende dein Talent-Event daraus machen würden, so wie es unsere Clara und Liane von U+I gemacht haben. Und das ging so:

Agil zu entwickeln bedeutet

vor allem, inkrementell und iterativ vorzugehen. Auf Deutsch: In kleinen Schritten immer weitere Verbesserungen und neue Features am Prototypen einbauen. Die Arbeitsweise in kleinen Schritten ermöglicht eine schnelle und flexible Anpassung an Veränderungen von außen. Seien es Kundenwünsche, Learnings aus dem Projekt oder Marktveränderungen.
Eigentlich ist es schon fast selbstverständlich moderne Produktentwicklung agil und mit Hilfe von UX-Design durchzuführen. So lässt sich die höchste Kundenzufriedenheit erreichen, denn das höchste UX-Ziel ist immer:

User Centricity

Die Nutzer_innen stehen im Mittelpunkt aller Überlegungen und es wird ein Produkt geschaffen, das ihren Bedürfnissen entspricht. Beziehungsweise: Wenn die Nutzer ihr Bedürfnis noch gar nicht kennen, wird ein Produkt geschaffen, das ein typisches Problem der Nutzer löst.
Die Vorgehensweise im UX sieht so aus und wird iterativ durchgeführt:

  1. Nutzenkontext analysieren
  2. Anforderungen definieren
  3. Konzeption und Design durchführen
  4. Ergebnisse evaluieren

Wie arbeitet man eigentlich möglichst anti-agil?

Zur besseren Annäherung an das Thema haben sich die Teilnehmer Gedanken darüber gemacht, was eigentlich anti-agiles Arbeiten bedeutet. Es kam eine stattliche Anzahl Punkte zusammen – hauptsächlich gespeist aus der (manchmal sicherlich leidvollen) Projekterfahrung der anwesenden Projektleiter, Entwickler und UXler. Hier nur eine kleine Auswahl:

  • Das Konzept muss genauso umgesetzt werden, wie es am Anfang geplant war
  • Sich mit keinem abstimmen
  • Getrennte Teams / Design und Entwicklung laufen separat
  • Keine neuen oder aktualisierten Anforderungen berücksichtigen können
  • Alles auf einmal und dann mal gucken, ob es funktioniert
  • Keine Vision
  • Die Technologie definiert den Rahmen.

Man könnte noch viele weitere Faktoren aufzählen, die einem erfolgreichen Projektverlauf und -ergebnis entgegenstehen. Aber die Teams sollten sich ja darauf konzentrieren, wie sie ein solches Arbeiten vermeiden können – zum Nutzen der Auftraggeber und deren Kunden.

Die Workshop-Aufgabe

Entwickelt ein Brettspiel, das die Strategie und den Ablauf eines interdisziplinären, agilen Projekts mit allen relevanten Beteiligten (UX, IT, Projektleitung, Kunde…) abbildet.

Das schöne an Spielen ist ja: Man kann grundsätzlich nichts falsch machen. Ist ja alles ein Spiel. Zunächst einmal sollten sich die Teams die wichtigen Fragen stellen:
Wer ist am Spiel eigentlich beteiligt und agiert wann mit wem? Welche Spieler_innen treffen wann welche Entscheidungen und welche Informationen und Ergebnisse werden benötigt? Danach ging es an Details wie: Welche Spielbestandteile gibt es: Würfel, Spiel-Karten, Spielpläne, Figuren und Mechaniken, wie das Spiel funktioniert wurden gestaltet: Kann im Spiel gekauft werden? Müssen Spieler Dinge sammeln, aneinander legen, eine bestimmte Strecke zurücklegen und welchem Umfang soll das Spiel haben, wieviele Spieler können mitmachen und wie lange dauert eine Spielrunde.
Eine der wichtigsten Fragen ist natürlich bei jedem Spiel: Was ist das Ziel und wann gibt es einen Gewinner? Erreicht man das Ziel dadurch, dass man schneller ist oder mehr Punkte sammelt? Soll Strategie eine Rolle spielen oder pures Glück?

Der wichtigste Tipp:

Anfangen! Nicht zu kompliziert denken, sondern einen ersten Entwurf machen, testen und verbessern. Ungereimtheiten beseitigen und weitere Features hinzufügen. So lange Veränderungen einführen, bis alles zusammenpasst.

Die Erkenntnisse des agilen UX-Workshops

  • Alle Disziplinen müssen von Anfang an zusammenarbeiten. Hürden können nur gemeinsam gemeistert werden.
  • Philosophische Grundfrage: gegen wen spielen wir denn dann eigentlich?
  • Vertrauen ist King. Die Vision einer agilen Arbeitsweise über alle Disziplinen muss von allen Beteiligten – von der Akquise bis zum Test – verinnerlicht werden.
  • Ein agiler Prozess bedeuten für beide Seiten erstmal eine Unsicherheit (was ist das Endergebnis, wie teuer wird das…?).
  • Agile Entwicklung ist flexibler, man kann auf neue Anforderungen und geänderte Rahmenbedingungen besser und schneller eingehen.
  • Alle Disziplinen bringen jederzeit ihr Wissen ein und können die weitere Entwicklung positiv beeinflussen.
  • Letztendlich ist das agil entwickelte Produkt näher am Nutzer und zielorientierter.

Und welche Spiele sind nun entstanden?

Die Frage brennt sicherlich einigen unter den Nägeln ? Hier ein paar Eindrücke der großartigen Spiele, die innerhalb weniger Stunden als Produkte der 4 Teams entstanden sind. Sie tragen so epische Namen wie „Unexpected Journey“, „Der Sprintkönig“, „Crunch Time“ und „Die Rache des Agilitators“.
Hier ein paar Eindrücke:

Content as a Service: Was ist das eigentlich?

content as a service (caas)

Einmal einen Inhalt schaffen, sofort und ohne Mehrarbeit quer über alle Kanäle & Touchpoints einsetzen; das ist der Traum vieler Web-Redakteure in aller Welt. Kein Anpassen, umformen, Bilder verändern. Diese Vision teilen auch viele Entscheider. Schnelle Time-to-Market mit neuen Sites und schnelle Integration von Touchpoints sind die Lockstoffe. „Content as a Service: Was ist das eigentlich?“ weiterlesen

10 Erkenntnisse zur Digitalisierung von der re:publica 2017

Als wir unser gemeinsames comspace-Fazit zur re:publica 2017 zogen, kamen wir zu dem Schluss: Die re:publica wird immer stärker kommerzialisiert, hochspannende Themen-Hihglights werden seltener und das Niveau in den meisten Vorträgen ist nur im letzten Drittel wirklich spannend. Zuviele Speaker versuchen in den ersten zwei Dritteln, möglichst jedes einzelne Mitglied des Publikums auf den gleichen Kenntnisstand zu bekommen.

Eine Bahnfahrt mit intensivem Nachdenken und einige Nächte über 3 Tage voller Vorträge schlafen, haben dennoch zu folgenden Erkenntnissen über die Digitalisierung geführt, die die Reise absolut wert waren.

„10 Erkenntnisse zur Digitalisierung von der re:publica 2017“ weiterlesen

10 Talks an Tag 1 der re:publica 2017 #rp11

LOL: LOVE OUT LOUD! ist das Motto der elften re:publica. Aus laughing out loud – also lautem Lachen wurde Lieben. Liebe für die digitale Gesellschaft, digitale Kultur und digitales Arbeiten.

Zitat von den Gründern Andreas, Johnny, Markus und Tanja:

Seit Gründung der re:publica sind Respekt und der Wunsch nach Vielfalt die Grundlage unseres Tuns; positives Nach-vorne-Denken, Neugierde und Offenheit bestimmen seither den Spirit der Veranstaltung. Mit „Love Out Loud!“ möchten wir daran erinnern, wofür die re:publica noch immer steht.

Einige Empfehlungen aus dem Fahrplan der #rp11

„10 Talks an Tag 1 der re:publica 2017 #rp11“ weiterlesen

Lebensmittel online einkaufen – für Geschäftskunden sehr praktisch

REWE Einkauf Shoppingliste Geschäftskunden

REWE Einkauf Shoppingliste Geschäftskunden

Es gibt so Dinge, die bekommt man immer nur so nebenbei mit. So kam eben im Standup-Meeting auf, dass unsere Sylvia seit einiger Zeit den REWE Online-Einkauf nutzt, um comspace alltäglich und bei Events mit leckeren Sachen zu versorgen. Wissen schon: Für’s leibliche Wohl ist gesorgt.

Für unser Montags-Frühstück müssen bsw. regelmäßig Brötchen, Aufschnitt, Brotaufstriche und was man sonst so braucht gekauft werden. Wenn Teams ein kleines Grillen zum Projektabschluss oder eine Launchparty schmeißen oder wenn unser internes Barcamp c42 zum Wissensaustausch stattfindet, werden immer wieder Lebensmittel gebraucht, für die unsere Kollegin Sylvia im Office-Management bis vor kurzem noch 1-3 Stunden einkaufen fahren musste.

„Lebensmittel online einkaufen – für Geschäftskunden sehr praktisch“ weiterlesen

Treffen der Java User Group Bielefeld bei comspace

Unterschiede zwischen Java und #C

Vor kurzem fand das Treffen der Java User Group (JUG) Bielefeld in unseren Geschäftsräumen statt. Beim vorherigen Stammtisch der JUG hatte ich mich bereit erklärt, einen vergleichenden Vortrag über Java und C# zu halten. Und da die Vortragsveranstaltungen nach einem ungeschriebenen Gesetz immer in den Büroräumen des Vortragenden stattfinden, habe ich die JUG nach Absprache mit unserem Geschäftsführer Andreas Kämmer und im Namen von comspace gerne zu uns eingeladen.

Was ist und macht die Java User Group Bielefeld?

Die JUG Bielefeld wurde vor ca. 4 Jahren von Daniel Rosowski, Geschäftsführer der Smartsquare GmbH, gegründet und ist eine lose Gruppe von Java Entwicklern (und solchen, die es werden wollen), in der man sich über neue Java Technologien austauscht, Vorträge hält und hört oder einfach nur in Ruhe gemeinsam ein Bierchen trinkt. Die Treffen der JUG Bielefeld finden immer am zweiten Mittwoch eines Monats statt, wobei im Wechsel Stammtische in der Gaststätte Siekerfelde und Vorträge stattfinden.

Ich selber bin seit ca. 1 Jahr Mitglied der JUG Bielefeld und habe auf dem letzten Stammtisch im Februar erzählt, dass ich nun seit Dezember 2016 nicht mehr als Java-, sondern als C#-Entwickler bei comspace tätig bin. Im Anschluss an die Diskussion habe ich mich dann bereit erklärt – nachdem ich mich bereits 1 Jahr erfolgreich davor gedrückt habe 😉 -, einen Vortrag zu halten, und zwar über einen Vergleich von C# und Java und über meine Erfahrungen mit dem Wechsel von der einen zur anderen Programmiersprache. Bei der anschließenden Abstimmung über das Vortragsthema wurde mein Vorschlag ausgewählt.

Die Veranstaltung startete um 19 Uhr mit einer kurzen Begrüßung durch unseren Geschäftsführer, der in wenigen Sätzen comspace vorstellte. Nachdem sich die Teilnehmer an unserem reichhaltigen Buffet mit Snacks und Getränken versorgt hatten, so dass keiner hungrig oder durstig lauschen musste, startete ich mit meinem Vortrag.

Vortrag Java versus #C - Java User Group Bielefeld

Vortrag “C# versus Java”

In meinem ca. einstündigen Vortrag habe ich allerlei Gemeinsamkeiten und Unterschiede von C# und Java skizziert und kommentiert. Sachkundige Beiträge aus dem Publikum haben meine Ausführungen immer wieder ergänzt. Obwohl es sich um einen technischen Vortrag handelte, lag das Hauptaugenmerk nicht auf einem vollumfänglichen, objektiven Vergleich, sondern auf meiner persönlichen Einschätzung der Thematik. Neben syntaktischen Gesichtspunkten wurden auch Themen wie das Umfeld, die Historie, Sponsoren für die Weiterentwicklung und eine mögliche Zukunft der beiden Sprachen betrachtet.

Unter anderem habe ich dargestellt:

  • wo die Probleme im “Type Erasure” Generics Ansatz von Java liegen und wie die CLR hingegen in der Lage ist, Typinformationen von Generics zur Laufzeit auszunutzen.
  • wie das Propertysystem von C# funktioniert und wie es sich von Gettern und Settern in Java unterscheidet.
  • wie das “var” Keyword in C# die Lesbarkeit von Sourcecode durch Typinferenz erhöht und dass ein solches Konstrukt auch in Java sehr nützlich wäre.

Unterschiede zwischen Java und #C

In der persönlichen Einschätzung der einzelnen Themen kam C# im Allgemeinen besser weg, was zu den erhofften, kritischen Fragen aus dem fachkundigen Publikum führte. Die anschließende offene Fragerunde führte zu interessanten, sehr oft detaillierten Gesprächen. So wurden zum Beispiel die Ökosysteme der beiden Sprachen diskutiert oder Detailfragen zum Generics System von C# gestellt. Die wohl wichtigste Frage, war die nach Schwierigkeiten des Wechsels von Java auf C#. Ich habe bei meinem Wechsel zu comspace und der darauf folgenden Einarbeitung in C# festgestellt, dass mir das Umsteigen von Java auf C# leichter fiel als anfangs gedacht. Während ich zwar das umfangreiche Tooling und das ausgereifte Ökossytem von Java vermisse, fiel mir das Aneignen der neuen Syntax jedoch sehr leicht und ich möchte die “Quality of Life” Features, die C# so bereitstellt, nicht mehr missen.

Ausklang der Veranstaltung

Nach dem Vortrag kam es bei Bier und Essen noch zu einem interessanten persönlichen Austausch. Viele der Teilnehmer schlossen sich einer Führung durch die comspace-Büroräume an, die unsere People & Culture-Managerin Sarah Biendarra spontan anbot. Gegen 21:30 Uhr endete die Veranstaltung mit zufriedenen, gut gesättigten Teilnehmern und einem erleichterten Vortragenden ;).

Wer auch zur Java User Group stoßen will, ist herzlich willkommen! Hier geht es zu den Terminen und Themen der JUG Bielefeld.

Rückblick auf das 3. e-Spirit Usergroup Treffen

Einblick in die CMS-Zukunft durch e-Spirit

In der vergangenen Woche nahmen vier unserer FirstSpirit-Entwickler_innen am dritten Treffen der e-Spirit Usergroup statt. Die Veranstaltung fand hervorragenden Zulauf: Rund 50 Teilnehmer_innen, bestehend aus e-Spirit Lösungs- und Implementierungspartnern sowie Kollegen von e-Spirit und dem DAM-Hersteller CELUM, fanden sich am 7. Februar im Sheraton Airport Conference Center in Frankfurt ein.

Begrüßung und Agenda

Dirk Langenheim von Intentive, Mitgründer und Vorstandsmitglied der e-Spirit Usergroup, eröffnete die Veranstaltung mit einer Begrüßung und einem “Warm-up”Auftakt, in dem er anhand einiger Kundenaussagen die allgemeine Situation in Kundenprojekten umriss. Die bestehenden und oft nicht so flexiblen Infrastrukturen bei vielen Kunden beschrieb er bspw. als eine Hürde für den Wechsel auf ein neues Content Management System. CMS-Projekte auf der “grünen Wiese” sind eben so gut wie ausgestorben.

Im Folgenden standen dann diese Vorträge auf der Agenda:

  • TranslationStudio bzw. Übersetzungsmanagement – Dr. Patrick Sandmann von ID-Media
  • Vorstellung CELUM und CELUM Connect – Gerd Laski von CELUM
  • MondayWebforms & Pinuts Universal Messenger – von Monday Consulting und Pinuts
  • Zukünftige Rolle eines CMS – Lars Onasch von e-Spirit
  • CaaS Case Studies – Lars Onasch / Sebastian Glock von e-Spirit
  • Role Specific View Architecture – Sebastian Glock von e-Spirit

Übersetzungsprozesse optimieren mit dem TranslationStudio

Dr. Patrick Sandmann, CEO von ID-Media, stellte das FirstSpirit Modul “TranslationStudio” vor. Das Übersetzungsmanagement-System organisiert einen effizienten und kostenoptimierten Übersetzungsprozess für Website-Inhalte, indem es das FirstSpirit CMS über einen Connector mit dem verwendeten Translation Management Systemen wie Across oder Trados verbindet.

Der Redakteur wählt die zu übersetzenden Inhalte oder auch ganze Projekte im FirstSpirit aus, exportiert sie und übergibt sie dem TranslationStudio. Der Content wird dort in die vorgegebene Zielsprache übersetzt, automatisiert wieder ins FirstSpirit importiert und kann dann publiziert werden.    

Damit bietet das Modul besonders für Website-Projekte mit vielen Länder- und Sprachvarianten eine deutliche Vereinfachung und Zeitersparnis.

Vorstellung CELUM DAM und Integration in FirstSpirit

Der Vortrag von Gerd Laski, Partnermanager der CELUM GmbH, startete mit der Vorstellung des CELUM DAM. Das professionelle Digital Asset Management System verwaltet und organisiert alle Mediendateien eines Unternehmens unter Berücksichtigung von Rollen- und Berechtigungskonzepten und verteilt diese aktuell und im passenden Format aufbereitet in die verschiedenen Marketing- und Vertriebskanäle.

Vorstellung CELUM DAM
Vorstellung des CELUM DAM

Gerd Laski stellte außerdem das CELUM Ökosystem vor, dass eine Reihe von CELUM Produktvarianten umfasst, die komplette Inhaltssysteme wie Social Media Management, Markenportale und Content Integration optimieren.

Der anschließende Video-Einblick in den von uns entwickelten CELUM Connector, der das CELUM DAM in das FirstSpirit CMS integriert, stieß auf breites Interesse. Die Anbindung von CELUM an das CMS ermöglicht den Redakteuren den direkten Zugriff auf die im DAM abgelegten Mediendateien, ohne die FirstSpirit-Benutzeroberfläche verlassen zu müssen. Dies reduziert u.a. den Arbeitsaufwand und die Fehleranfälligkeit bei der Website-Pflege.    

Was haben MondayWebforms und der Universal Messenger miteinander zu tun?

Monday Consulting und Pinuts gaben in ihrer gemeinsamen Live-Demo einen Überblick über MondayWebforms, einem mächtigen Formularmanager von Monday Consulting, und dessen enges Zusammenspiel mit dem Universal Messenger von Pinuts, einem Tool für den optimierten Kundendialog bspw. via E-Mail-Marketing.

Webforms integriert eine neue Eingabekomponente in FirstSpirit, mit der Redakteure jede Art von Formularen, auch mit komplexen Anforderungen, einfach und intuitiv erstellen können.

Der Universal Messenger von Pinuts, der an das FirstSpirit CMS angebunden wird, verarbeitet Anfragen, die über solche Formulare generiert werden und wertet diese aus.

Zwischen Webforms und dem Universal Messenger gibt es jetzt eine Schnittstelle, welche das Mapping der Benutzer-Eingabe zu der dahinterliegenden Datenbank möglich macht. Diese Schnittstelle erlaubt dem Redakteur auch ein automatisches Mapping, sowie Einbindung von Vorgabewerten wie z.B. Werte für Anrede oder Abteilung.

Quo vadis CMS?

Nach einer Mittagspause mit Zeit zum Austauschen und Netzwerken leitete Lars Onasch von e-Spirit mit ein paar Überlegungen zur Zukunft des CMS das Nachmittagsprogramm ein.

Einblick in die CMS-Zukunft durch e-Spirit
Einblick in die CMS-Zukunft durch Sebastian Glock von e-Spirit

Welche Rolle wird ein CMS in den nächsten Jahren spielen und wie wandeln sich seine Aufgaben und Funktionen? Als mögliches Szenario wurde skizziert, dass ein CMS nur noch der reinen Bereitstellung von Content für verschiedene Endgeräte dienen wird, ohne ein konkretes Layout zu definieren. Die Inhalte werden dann von den Devices, zu denen zunehmend smarte Geräte zählen werden, abgerufen, User-individuell konfiguriert und ausgespielt.  

Case Studies zur Content-as-a-Service-Lösung (CaaS)

Zu diesen Gedanken passte der nächste Beitrag von Sebastian Glock und Lars Onasch gut: Sie stellten anhand einiger Case Studies den Einsatz der e-Spirit Content-as-a-Service-Lösung (CaaS) vor. Diese wurde auf der dmexco 2016 erstmals präsentiert und trägt der zunehmenden Digitalisierung und der stetig größeren Zahl an Touchpoints Rechnung. Diese müssen mit entsprechenden Mengen Content “gefüttert” werden. Mit der Content-Everywhere-Lösung können Inhalte CMS-unabhängig über eine API von verschiedenen Geräten abgerufen werden. Dazu müssen die Ausgabekanäle nicht vorher im Backend programmiert werden.  

Die unterschiedlichen Case Studies zeigten, dass die CaaS-Lösung sehr vielseitig und flexibel zu nutzen ist: Sie wurde bisher von jedem Kunden auf eine andere Weise und für andere Anforderungen, aber jedes Mal erfolgreich eingesetzt.

Role Specific View Architecture

In einem letzten Beitrag stellte Sebastian Glock die e-Spirit-Pläne zum Umbau des FirstSpirit Serversystems vor. Vorgesehen ist ein Baukasten-System für einzelne Komponenten, so dass es zukünftig viele kleine Microservices statt eines großen Servers geben soll. Außerdem ist ein separater Delivery Server für die Ausgabe der Webseiten geplant. Diese Änderungen sollen es Administratoren ermöglichen, einen Client zielgerichteter nach ihren Bedürfnissen zusammen zu stecken. Die Redaktion bekommt dann nur die Funktionen angezeigt, die auch wirklich benötigt werden.

Diskussionsrunden

Im Anschluss an die Vorträge gab es verschiedene Diskussionsrunden zu den bisher gehörten Themen, die mehr oder weniger gut besucht waren.

Mit den Vertretern von e-Spirit wurden u.a. Lizenzthemen diskutiert. Außerdem regten die Teilnehmer an, die Möglichkeiten für ein Distributed Development besser zu optimieren. Immer das Ziel im Blick, dass mehrere Entwickler effizienter zeitgleich an einem Projekt arbeiten können.

Enablement war ein weiteres wichtiges Thema. Um seine Partner-Agenturen noch besser im Projektgeschäft zu unterstützen, sind für die Zukunft mehr Webinare, WebEx-Meetings und Techinare speziell für Entwickler geplant. Einige haben in den letzten 4 Monaten schon stattgefunden, wie z.B. eins zum Thema “Neue Eingabekomponenten und DataAccessPlugins“. Einer unserer Themenwünsche in dem Zusammenhang ist die Vorschau eines hybris-Fensters bei der Integration der E-Commerce-Shopsoftware in FirstSpirit.

In einer Diskussionsrunde zum Projekt- und Modul-Entwicklungsprozess, die unsere FirstSpirit-Entwicklerin Mareike angestoßen und moderiert hat, fand ein gelungener Austausch zu den eingesetzten Technologien und Vorgehensweisen statt. Der Agentur-übergreifende Austausch wurde als sehr positiv empfunden.

Unser Fazit

Für uns war dieses Usergroup Treffen ein sehr interessanter Tag mit viel wertvollem Input und neuen Bekanntschaften. Selten haben wir sonst die Gelegenheit zu einem solch intensiven Austausch mit anderen FirstSpirit-Entwicklern.

Die nächste e-Spirit Usergroup ist bereits in Planung und das ist gut so, denn das Interesse an einem regelmäßigen Austausch ist groß. Unser Wunsch für zukünftige Treffen ist, dass die Beiträge noch stärker und konkreter in die Tiefen technischer Themen gehen. Wir freuen uns auf die nächsten Veranstaltungen!

Übrigens: Nähere Informationen zur e-Spirit Usergroup, seiner Gründung und seinen Zielen finden Sie auch hier:

1 Jahr e-Spirit Usergroup – ein Rückblick
Mitgründer Andreas Kämmer im Interview: Die wichtigsten Erkenntnisse aus einem Jahr e-Spirit Usergroup

How to: Sitecore Content Search – Globale LINQ Filter anwenden

Sitecore Global Linq Filter

Seit der Sitecore Version 7.2. ist es möglich, für die Content Search LINQ Filter zu implementieren, die automatisch bei jedem LINQ Query angewendet werden. Dadurch können “statische” Filter wie z.B. die Einschränkung nach Kontextsprache einmalig angegeben werden und brauchen somit nicht bei jeder Abfrage berücksichtigt zu werden.

Um globale LINQ Filter einzubinden, muss die Pipeline <contentSearch.getGlobalLinqFilters> erweitert werden:

Achtung: Das folgende Beispiel ist bis einschließlich der Sitecore Version 8.1 möglich.

[xml]
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">;
<sitecore>
<pipelines>
<contentSearch.getGlobalLinqFilters>
<processor type="Comspace.Demo.GlobalLinqFilter.ContextLanguageLinqFilter, Comspace.Demo.GlobalLinqFilter"/>
</contentSearch.getGlobalLinqFilters>
</pipelines>
</sitecore>
</configuration>
[/xml]

Die Klasse ContentLanguageLinqFilter erbt von der bereitgestellten Basisklasse ApplyGlobalLinqFilters, welche zwei überschreibbare Funktionen bereitstellt:

  • Process(QueryGlobalFiltersArgs args)
  • GetQuery(QueryGlobalFiltersArgs args)

Um nun nach der aktuellen Sprache zu filtern, muss die Query angepasst werden. Hierfür wird die Funktion GetQuery überschrieben:

[csharp]
namespace Comspace.Demo.GlobalLinqFilter
{
public class ContextLanguageLinqFilter : ApplyGlobalLinqFilters
{
protected override object GetQuery(QueryGlobalFiltersArgs args)
{
var query = (IQueryable<SearchResultItem>)args.Query;
return query.Where(i => i["_language"].Equals(Sitecore.Context.Language.Name));
}
}
}
[/csharp]

In diesem Beispiel wird das Objekt args.Query in den Typen IQueryable<SearchResultItem> umgewandelt.

GlobalLinqFilter ab Sitecore Version 8.2

Mit der Sitecore Version 8.2 ändert sich die Verwendung von Queries im Sitecore, sodass ein allgemeines Casting in den Typen IQueryable<SearchResultItem> nicht mehr möglich ist. Wird ein GlobalLinqFilter wie oben beschrieben eingesetzt, wirft Sitecore bereits bei der Initialisierung bzw. beim Öffnen des Sitecore Content Editors eine Exception:

[text]
Das Objekt des Typs "Sitecore.ContentSearch.Linq.Parsing.GenericQueryable`2[Sitecore.ContentSearch.SearchTypes.SearchResultItem,Sitecore.ContentSearch.Linq.Solr.SolrCompositeQuery]" kann nicht in Typ "System.Linq.IQueryable`1[Sitecore.Social.Search.SearchItem]" umgewandelt werden.

[/text]

Und jetzt?

Zu der Verwendung von GlobalLinqFilter existiert keine nennenswerte Dokumentation. Auch Google liefert nur ein mageres Beispiel von Coveo, das aber nicht für Sitecore ab Version 8.2 geeignet ist.

Der daher konsultierte Sitecore Support stellt folgende Lösung zur Verfügung:

[csharp]
public override void Process(QueryGlobalFiltersArgs args)
{
if ((args != null) && (args.Query != null))
{
Type queryElementType = args.QueryElementType;
if (queryElementType == typeof(SearchResultItem))
{
args.Query = this.GetQuery&lt;SearchResultItem&gt;(args);
}
}
}

protected object GetQuery<T>(QueryGlobalFiltersArgs args) where T : IObjectIndexers
{
var query = (IQueryable<T>)args.Query;

return query.Where(i => i["_language"].Equals(Sitecore.Context.Language.Name));
}
[/csharp]

In diesem Beispiel wird nicht mehr die überschreibbare Funktion GetQuery verwendet, sondern eine eigene, generische Funktion implementiert. Ziel ist es, die Query, die im GlobalLinqFilter als Typ object übergeben wird, in den Zieltypen umzuwandeln. Hierfür liefern die QueryGlobalFiltersArgs auch die QueryElementType-Eigenschaft mit.

Problem: Ein Objekt lässt sich nicht mithilfe einer Variablen typisieren.

Lösung: Um GlobalLinqFilter trotzdem anwenden zu können, muss nun also die Process Methode überschrieben werden. Darin wird der übergebene Typ geprüft und anschließend mit einer expliziten Typisierung die GetQuery<T> Funktion aufgerufen.

Vorteil:

  • Es werden nur solche Queries eingeschränkt, die auch erwünscht sind, da die Abfrage explizit in der Process Methode angegeben muss.

Nachteil:

  • Werden mehrere spezielle Typen von SearchResultItem implementiert, z.B. ExtendedSearchResultItem, DateSearchResultItem, etc. muss für jeden dieser Typen eine Abfrage im GlobalLinqFilter eingerichtet werden.

Der Nachteil äußert sich in der Implementierung dann folgendermaßen:

[csharp]
public override void Process(QueryGlobalFiltersArgs args)
{
if ((args != null) && (args.Query != null))
{
Type queryElementType = args.QueryElementType;
if (queryElementType == typeof(SearchResultItem))
{
args.Query = this.GetQuery<SearchResultItem>(args);
}
if (queryElementType == typeof(ExtendedSearchResultItem))
{
args.Query = this.GetQuery<ExtendedSearchResultItem>(args);
}
}
}
[/csharp]

Zusammenfassung

GlobalLinqFilter sind ein probates Mittel, um Queries standardmäßig nach bestimmten Kriterien zu filtern. Kriterien können neben der hier gezeigten Sprache auch Sicherheitskriterien, Templates oder Sites sein. Wenn nicht exzessiv spezielle SearchResultItem Typen implementiert wurden und somit der oben beschriebene Nachteil eher überwiegt, ist die Nutzung von GlobalLinqFilter zu empfehlen.

Übrigens: Wen das Thema Sitecore Content Search interessiert, findet hier einen Einstieg in das Thema Sitecore Solr Content Search – Facettensuche richtig anwenden.

 

Sitecore Solr Content Search – Facettensuche richtig anwenden

Sitecore Solr Content Search

Eine Facettensuche eignet sich insbesondere für folgende Anwendungsfälle:

  • Ermittlung von Kategorien
  • Implementierung einer Sortierungsfunktion
  • Implementierung eines Filterelements auf einer Suchseite

Wie eine Facettensuche implementiert wird, ist in der Sitecore Dokumentation zu finden. Darin wird folgendes Beispiel gegeben:

[csharp]
var results = queryable.FacetOn(d => d.Name);
var facets = results.GetFacets();
foreach (var category in facets.Categories)
{
Console.WriteLine(category.Name);
   foreach (var facetValue in category.Values) {
       Console.WriteLine("{0}: {1}", facetValue.Name, facetValue.Aggregate);
   }
}
[/csharp]

Als Ergebnis erhält man eine Auflistung einer Kategorie (category.Name) aller zugewiesenen Werte des Feldes „Name“ (d.Name).

Beispiel: Produkte nach Serien filtern

Ein Beispiel: Es existiert ein Index mit Produkten. Diese Produkte sind einer Serie zugeordnet. Als Feature möchte man nun alle Produkte einer bestimmten Serie filtern können. Um einen Filter zu implementieren, kann eine Facettensuche wie im oben zu sehenden Beispiel verwendet werden. Es ist lediglich eine Änderung erforderlich:

[csharp]
var results = queryable.FacetOn(d => d[“Serie”]);
[/csharp]

Die Suche ermittelt somit alle Inhalte, die an indizierten Produkten im Feld “Serie” enthalten sind. Das Ergebnis kann anschließend in ein Benutzersteuerelement eingefügt werden.

Facettensuche mit Solr

Wenn eine Facettensuche auf einem Objekt vom Typ Queryable angewendet wird, die zuvor bereits einen Filter enthält, z.B.

[csharp]
queryable.Where(d => d.Language.Equals("en")
[/csharp]

funktioniert die Facettensuche mit Solr nicht mit dem oben angegebenen Beispiel (anders als bei einer Facettensuche mit Lucene), da hier als Ergebnis immer alle Facetten zurückgegeben werden, unabhängig von der Einschränkung durch den Filter.

Solr Hint: Facet.mincount Parameter

Der Grund: Standardmäßig werden bei einer Solr Facettensuche alle Facetten zurückgegeben. Verantwortlich ist hierfür der Facet.mincount Parameter, der als defaultValue “0” zurückgibt. Somit werden auch Facetten zurückgegeben, zu denen der Filter keine Ergebnisse zurückgibt.

Um dieselbe Funktionalität wie bei einer Facettensuche mit Lucene herzustellen, muss der Facet.mincount Parameter überschrieben werden, wie im folgenden Beispiel zu sehen ist:

[csharp]
var results = queryable.FacetOn(d => d[“Serie”], 1);
[/csharp]

Der zweite Parameter der FacetOn() Methode gibt den minimumResultCount an, welcher dem Facet.mincount Parameter entspricht. Gibt man hier beispielsweise den Wert “1” an, wird bei einer Facettensuche nur ein Ergebnis zurückgegeben, dessen Elemente mindestens einmal in einer Suche mit entsprechenden Filtern vorkommen. Im vorherigen Beispiel werden somit nur Elemente aufgelistet, die in der Sprache “en” vorliegen.

Trivia

Der für diesen Anwendungsfall konsultierte Sitecore Support hat das unterschiedliche Verhalten der Facettensuche mit Lucene bzw. Solr als Bug in der Sitecore Version 8.2. rev. 161115 (Update 1) eingestuft und unter der Public reference number 95560 eingeordnet. Als Hotfix wird die Angabe des minimumResultCount wie zuvor beschrieben empfohlen.

Wenn Sie neben der Facettensuche auch noch Ihre LINQ Abfragen verschlanken möchten, finden Sie hier einen weiteren Tipp: How to: Sitecore Content Search – Globale LINQ Filter anwenden