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.