Wydajny import produktów w Sitecore – część 2

W poprzedniej części poradnika stworzyliśmy podstawowy importer produktów z zewnętrznego systemu Product Information Management (PIM), który zapisuje produkty jako item’y w Sitecore. Implementacja może być ulepszona poprzez użycie Sitecore item bucket i indeksów wyszukiwania, co pozwoli poprawić wydajność w razie większej ilości danych.

Aby lepiej odzwierciedlić strukturę produktów  w systemie PIM zastosujemy niestandardową strukturę bucket’u w Sitecore. Repozytorium produktów podzielimy na:

  • Active (aktywne produkty)
    • A (wszystkie produkty, których nazwa zaczyna się na A)
    • B (wszystkie produkty, których nazwa zaczyna się na B)
  • Inactive (nieaktywne produkty)
    • A (wszystkie produkty, których nazwa zaczyna się na A)
    • B (wszystkie produkty, których nazwa zaczyna się na B)

Rozszerzenie modelu danych

Zakładamy że status produktu (active vs inactive) jest flagą importowaną z systemu PIM. Rozszerzmy nasz model, stworzony w poprzedniej części, dodając nowe pole typu Checkbox:

Dodajemy odpowiadającą właściwość w klasie naszego modelu:

Zmiana repozytorium produktów na Item Bucket

Po wybraniu item’u “standard values” template’u naszego produktu (“Product”), zaznaczamy w nim pola:

Ustawienie “Bucketable” oznacza że wszystkie produkty oparte o template “Product” mogą być umieszczone w item bucket. Zaznaczamy również “Lock child relationship”, które zastosujemy później.

Domyślnie Sitecore tworzy itemy w strukturze bucket’u, używając daty utworzenia item’u. Chcemy to zmienić, żeby zbliżyć naszą strukturę do tej użytej w systemie PIM. Możemy to zrobić tworząc nową akcję reguły tworzącej bucket poprzez dodanie itemu pod /sitecore/system/Settings/Rules/Definitions/Elements/Bucketing. Uzupełniamy pole “Text”, gdzie wpisujemy przyjazny, dla edytujących treść komunikat oraz pole “Type”, gdzie wskazujemy na klasę w naszym projekcie.

Stwórzmy teraz naszą klasę RuleAction we wskazanym wcześniej miejscu. Klasa musi posiadać metodę “Apply”, która definiuje każdy poziom struktury item bucket’u. Dla pierwszego poziomu, użyjemy właściwości “Active” (status produktu). Drugi poziom stworzymy na podstawie pierwszej litery nazwy produktu:

Aby połączyć akcję z itemami naszych produktów edytujemy systemowy item /sitecore/system/Settings/Buckets/Item Bucket Settings. Wybieramy regułę “where the new bucketable item is based on the … template”, wybieramy template “Product” i przypisujemy akcję stworzoną w poprzednich krokach:

Teraz możemy zmienić nasze repozytorium produktów w item bucket. Robimy to klikając na przycisk “Bucket” w zakładce “Configure”, mając wybrany item repozytorium produktów w drzewku content editor’a. Jeśli mamy już jakieś produkty w repozytorium, możemy nacisnąć teraz przycisk  “Sync”, który ustawi je w odpowiedniej strukturze.

Item bucket w importerze produktów

Ponieważ mamy dużo produktów do zaimportowania, chcemy poprawić wydajność mechanizmu importu. Możemy to osiągnąć podmieniając wyszukiwanie produktów bezpośrednio w bazie danych Sitecore, wyszukiwaniem za pomocą indeksu. Bierzemy indeks z item’u bucket’u, budujemy predykat i wykonujemy wyszukiwanie:

Potrzebujemy także metody, która przebuduje domyślną strukturę bucket’u, tak żeby każdy stworzony item był umieszczony w odpowiednim miejscu, według początkowych założeń:

Użyjmy teraz nowych metod w kodzie importera. Zamieniamy wyszukiwanie istniejących produktów z metodą “SearchBucket” i dodajemy wywołanie metody “SyncBucket” pod koniec importu. Robimy to tylko w wypadku jeśli są jakieś zmienione produkty:

Musimy także zmienić trochę metodę “Map”, tak aby obsłużyć dodatkową flagę statusu produktu:

Po zakończeniu działania scheduled task’a powinniśmy widzieć nasze produkty w odpowiedniej strukturze item bucket’u:

W jednym z poprzednich kroków zaznaczyliśmy w standard values template’u naszego produktu pole “Lock child relationship”. Pozwala to nam na stworzenie itemów poniżej itemu, który jest “bucketable”, przykładowo możemy dodać tam warianty naszych produktów:

Dla itemów poniżej nie musimy zaznaczać opcji “Bucketable” i “Lock child relationship”.