House to jedna z najbardziej znanych na rynku marek ubrań dla młodzieży, której właścicielem jest firma Artman.
Firma, w której pracuję otrzymała po raz czwarty zlecenie realizacji kolejnej edycji strony. Strona w większości została zrealizowana w postaci animacji Flash i moim zadaniem było dostarczenie danych w postaci XML oraz oprogramowanie części HTML. Na początku zająłem się katalogiem ubrań. Proces importu danych jest miał być zrealizowany kilkustopniowo: najpierw należało przeiterować listę zdjęć produktów i na podstawie ich nazwy przydzielić do odpowiedniej kategorii, płci, rodzaju zdjęcia oraz wygenerować miniatury. Skorzystałem z funkcji napisanych przy okazji poprzednich edycji, ale i tak musiałem wprowadzić sporo zmian (m.in. raportowanie o plikach, których nazwy nie pasują do określonego wzorca). W drugim etapie konieczne było zaimportowanie pliku z danymi (kolory, nazwy kategorii) w formacie Excela. Przekonwertowałem plik na format CSV i napisałem funkcję importującą obsługiwaną po stronie systemu CMS. Ostatnim etapem były zmiany wprowadzane ręcznie przez pracowników firmy Artman (ceny, produkty podobne). Tutaj moja praca sprowadziła się do przygotowania i oprogramowania odpowiedniego interfejsu po stronie systemu CMS.
Mogąc wczytać katalog przystąpiłem do generowania XML’a potrzebnego po stronie frontendu. Napisałem metodę, która dla przekazanej, określonej struktury generowała kod XML (z zagnieżdżeniami). W poprzednich edycjach tworzenie XML’a odbywało się przez sklejanie łańcuchów znaków. Zastanowiło mnie, czy jest to najlepsze i najszybsze rozwiązanie, ale z braku czasu na testy zrobiłem tak samo. Aby za każdym razem nie generować wszystkiego od nowa, gotowy XML buforowałem przy pomocy biblioteki PEAR::CacheLite. Jeśli ktoś wprowadził jakąś zmianę w katalogu po stronie CMS’a, plik bufora z danymi był automatycznie unieważniany i przy najbliższym żądaniu tworzony od nowa. Dużo później pomyślałem, że warto byłoby zastosować odpowiednie nagłówki HTTP, tak by przeglądarka pobierała plik XML tylko wtedy, gdy zmienił się on od ostatniego pobrania.
Podobny mechanizm unieważniania bufora po jakiejś zmianie zastosowałem w innych miejscach, gdzie konieczne było przekazywanie danych XML do animacji Flash. Część HTML była dość prosta i sprowadzała się do prezentacji treści z modułu Artykułów. Jedynie sekcja Klub wymagała trochę więcej pracy. Zrobiłem mechanizm dwustopniowej rejestracji z weryfikacją adresu e-mail zgodnie z wytycznymi. Zapisanie się do Klubu było nagradzane możliwością wydrukowania kuponu rabatowego. Zastanawiając się nad sposobem generowania numerów kuponów wpadłem na pomysł, by użyć w tym celu kodu kreskowego EAN13. Okazało się, że specjalnie na potrzeby kuponów zarezerwowano prefiksy od 050 do 059. Skorzystałem z biblioteki PEAR::Image_Barcode i wkrótce na kuponie pojawiał się ładny kod kreskowy. Niestety, sprzedawcy weryfikujący kupony w sklepie musieli i tak wpisać numer ręcznie. Na szczęście mogłem wykorzystać algorytm generowania sumy kontrolnej, by sprawdzić, czy zrobili to poprawnie.
Ciekawym zagadnieniem było opracowanie techniki udostępniania filmów tworzonych przez użytkowników w ramach sekcji „Nagi instynkt”. Miało to być coś na kształt YouTube. Poszperałem w sieci i znalazłem program ffmpeg. Pozwala on m.in. na konwersję filmów z różnych formatów do formatu FLV obsługiwanego przez Flash. Niestety, wersja instalowana z paczki binarnej nie posiadała wkompilowanej obsługi mp3. Cóż poradzić, poszukałem dobrego samouczka, ściągnąłem źródła lame, skompilowałem, ściągnąłem źródła ffmpeg i również skompilowałem. Po wykonaniu polecenia:
ffmpeg -i film.mpg -b 480000 -s 320x240 -acodec mp3 -ab 64 -ar 22050 film.flv
mogłem obejrzeć film przy pomocy Riva FLV Player. Ostatecznie stanęło na tym, że użytkownicy nie będą sami dodawać filmów, lecz wysyłać na podany adres, a my zajmiemy się konwersją i umieszczeniem filmów na stronie. Na koniec Marek przygotował ładny odtwarzacz do osadzenia na stronie.
Ważnym elementem, nad którym pracowałem z przerwami od dłuższego czasu był moduł rozsyłania biuletynów. Istniejący moduł nie posiadał kilku dość ważnych opcji (podglądu w trakcie edycji, zliczania kliknięć, komponowania z dowolnych elementów) oraz używał XML+XSLT jako szablonów, więc za każdym razem w Dominik miał sporo roboty.
Nowy moduł umożliwia stosowanie wielu różnych szablonów, w ramach których można osadzać różnego rodzaju elementy w dowolnej kolejności. Gdy zachodzi potrzeba dodania nowego typu elementów, to wystarczy dopisać klasę dziedziczącą po klasie bazowej, nadpisać kilka metod, dodać w konfiguracji i gotowe. W każdym momencie tworzenia biuletynu można zrobić jego podgląd w wersji HTML i tekstowej, by przekonać się, jak wygląda.
Po zapisaniu można rozesłać go do grupy testowej, poprawić ewentualne błędy i zaplanować rozsyłanie. Biuletyn może być rozesłany o zadanej dacie i czasie. W czasie rozsyłania można śledzić ilość wysłanych e-maili a także ilość odebranych oraz ilość kliknięć na każdym elemencie biuletynu.
Aby ukryć lokalizację skryptu rozsyłającego w treści wiadomości (nadpisywanie nagłówków nie pomagało) zdecydowałem się zrezygnować z używania wget i przerobiłem skrypt tak, by można go było uruchamiać z linii poleceń przy pomocy php-cgi.
Strona została uruchomiona 16 września 2006 roku.
Użyte technologie: PHP 5, MySQL 4.1, Smarty, PEAR, XML, FLV