Data Import Handler jest bardzo miłym i rozbudowanym narzędziem. Poniżej opis problemu (i rozwiązania) w którym spotkałem się ostatnio.
Opis Problemu
Do zaindeksowania jest pewna lista produktów. Produkty jednak mogą być łączone w grupy. Dodatkowo w grupie, w kolejnych elementach mogą być pominięte te dane, które w elemencie wcześniej zostały zdefiniowane. Przykładowa struktura (nieistotne informacje pominąłem dla czytelności):
<products>
<product>
<id>1</id>
<name>Product 1</name>
</product>
<product>
<id>2</id>
<name>Product 2</name>
</product>
<group>
<product>
<id>3</id>
<name>Product 3 and 4</name>
</product>
<product>
<id>4</id>
</product>
</group>
</products>
Rozwiązanie
Rozwiązanie polega na zdefiniowaniu – jak zawszę – elementu „entity” w sposób następujący:
<entity processor="XPathEntityProcessor"
forEach="/products/product | /products/group/product">
<field column="id" xpath="//id" />
<field column="name" xpath="//name" commonField="true" />
</entity>
Wyjaśnienie
Dzięki takiej konstrukcji „forEach” do przetworzenia dostaną się zarówno produkty nie należące do grupy, jak i te w grupach. Istotnym atrybutem pola jest „commonField”. Informuje on DIH, że jeśli w danym rekordzie nie jest zdefiniowane to pole, należy je pobrać z rekordu poprzedniego.
Podane rozwiązanie ma parę ograniczeń, np. pierwszy element w grupie powinien mieć zdefiniowane pole „name” oraz ważna jest kolejność produktów, natomiast w moim przypadku pokrywało się to dokładnie ze specyfikacją dostarczonego pliku importu.