Drupal Features
Jeśli zajmujesz się tworzeniem serwisów internetowych opartych o system Drupal i kiedykolwiek miałeś problemy z przenoszeniem funkcjonalności pomiędzy wersja deweloperska a produkcyjna serwisu to ten artykuł jest dla Ciebie. Z artykułu dowiesz się jak zarządzać ustawieniami Drupala, które są zapisywane w bazie danych. Po przeczytaniu tekstu będziesz wiedział jak szybko i sprawnie wdrożyć nową funkcjonalność lub ewentualnie przywrócić poprzednią wersje funkcjonalności w serwisie.
Istnieją moduły pozwalające na eksport ustawień do tablicy, którą można później zaimportować w innym serwisie. Jednak takie rozwiązanie jest czasochłonne, ponieważ ustawienia każdego modułu trzeba osobno eksportować. Trudno tez sprawdzać czy od ostatniego eksportu zostały zmienione ustawienia.
Rozwiązaniem tych (i nie tylko tych) problemów jest użycie modułu Features (http://drupal.org/project/features) wraz z modułami Context (http://drupal.org/project/context), Strongarm (http://drupal.org/project/strongarm) oraz Chaos Tools (http://drupal.org/project/ctools)
Moduł Features pozwala na zapisywanie funkcjonalności do specjalnych modułów. Moduł typu „feature” jest kolekcja ustawień, które razem tworzą konkretną funkcjonalność.
Żeby lepiej zrozumieć zasadę działania modułu przedstawię przykład użycia. Będzie to blog z powiązaną galerią zdjęć.
Potrzebne moduły
Zaczniemy od instalacji potrzebnych modułów. Oprócz wyżej wymienionych będą potrzebne także inne moduły, m.in Views oraz CCK. Moduły kopiujemy do katalogu sites/all/modules/contrib.
Pełna lista modułów wraz z wersjami użytymi w przykładzie:
- Features 6.x-1.0-beta11
- Context 6.x-3.0-beta7
- Strongarm 6.x-2.0-rc1
- Diff 6.x-2.0
- Chaos Tools 6.x-1.7
- CCK 6.x-2.7
- FileField 6.x-3.7
- ImageField 6.x-3.7
- ImageCache 6.x-2.0-beta10
- LightBox2 6.x-1.9
- Administration menu 6.x-1.5
- Views 6.x-2.11

Rysunek 1. Lista modułów w sites/all/modules/contrib
Rodzaje zawartości
Po instalacji modułów należy utworzyć rodzaje zawartości. Do przykładu wykorzystamy dwa nowe rodzaje zawartości: blog oraz image. Blog utworzymy jako rodzaj zawartości z polem tytułu i treści – to co oferuje standardowa funkcjonalność Drupala.
Rodzaj zawartości „Image” będzie składał się z pola „Nazwa” oraz pola wysyłania pliku z grafiką. Pole do wysyłania grafiki utworzymy za pomocą modułu ImageField. Dodamy także pole typu nodereference aby zachować powiązanie zdjęcia z wpisem w blogu. Nie będę tu przedstawiał dokładnych opisów jak skonfigurować rodzaje zawartości, nie taki jest cel tego tekstu. Na końcu artykułu są do pobrania plik zapisem wszystkich konfiguracji, które można uruchomić na własnej instalacji Drupala.

Rysunek 2. Rodzaje zawartości

Rysunek 3. Pola w rodzaju zawartości Image
Widoki
Mamy rodzaje zawartości, należy teraz utworzyć odpowiednie widoki wyświetlające dane. Pierwszym będzie widok pokazujący listę wpisów w blogu posortowaną wg daty oraz według liczby wyświetleń strony.

Rysunek 4. Widok wyświetlający wpisy w blogach.

Rysunek 5. Widok - najczęściej czytane wpisy.

Rysunek 6. Widok – zdjęcia powiązane z wpisem w blogu.
Context
Po utworzeniu widoków należy umieścić w odpowiednich miejscach bloki. Zostanie to zrobione za pomocą modułu Context. Moduł ten pozwala m.in. na wyświetlanie bloków zależnie od kontekstu. W tym przypadku utworzymy dwa konteksty – jeden wyświetlający blok na stronie rodzaju zawartości „blog”, drugi wyświetlający blok na wszystkich stronach serwisu.

Rysunek 7. Kontekst wyświetlający blok na stronach rodzaju zawartości Blog.
Feaures
Mamy już całą funkcjonalność. Jednak jest ona zapisana jako ustawienia w bazie danych. Przeniesienie tej całej funkcjonalności do innego serwisu wymaga ponownego wyklikania lub eksportu ustawień poszczególnych elementów. Jest to czasochłonne zadanie. Można jednak to przyśpieszyć za pomocą modułu Features.
Po instalacji modułu Features przchodzimy do strony admin/build/features/create aby utworzyć nowy moduł typu feature.

Rysunek 8. Tworzenie modułu typu „features”.
Przy tworzeniu modułu wybieramy z listy „Edit components” następujące elementy:
- context: (all_site_blocks, blog) – utworzone konteksty
- Imagecache Presets – utworzone presety
- Content types – rodzaje zawartości blog oraz image
- Views – widoki blog, blog_popular, image

Rysunek 9. Wybrane opcje przy tworzeniu modułu typu „features”.
Po zaznaczeniu wszystkich wymaganych opcji klikamy na „Download feature”. Otrzymamy spakowany plik, który zawiera moduł z odpowiednimi ustawieniami. Moduł po rozpakowaniu kopiujemy do sites/all/modules/custom. Po skopiowaniu modułu będzie on widoczny na liście admin/build/features – należy go włączyć.

Rysunek 10. Panel zarządzania modułu Features

Rysunek 11. Status modułu po dokonaniu zmian w widoku (Views)
Przy każdym module są dwa odnośniki:
- default: informuje o stanie modułu. Jeśli zmienimy ustawienia w serwisie, np ustawienia rodzaju zawartości to zmieni się status modułu.
- Recreate: pozwala na ponowne utworzenie modułu, gdy np chcemy dodać nowe elementy lub zapisać zmiany w istniejących elementach
Tak utworzony moduł możemy przenieść do innego serwisu, będzie on widoczny na liście modułów. Po włączeniu zostaną odtworzone wszystkie ustawienia – rodzaje zawartości, widoki, presety imagecache i inne zapisane ustawienia.

Rysunek 12. Moduł blog_feature na liście modułów.
Podsumowanie
Wykorzystanie modułu Features ułatwia pracę programistom tworzącym serwisu w Drupalu. Nie ma już problemu ze zmianami w widokach, rodzajach zawartości, itp. Wszystko jest zapisane w plikach, można więc to zapisać w systemie wersjonowania (np. SVN) i w każdej chwili powrócić do wcześniejszych wersji.
Moduł Features jest dynamicznie rozwijany, coraz więcej modułów ma wsparcie dla Features. Można także pisać rozszerzenia do własnych modułów aby były wspierane przez Features (więcej informacji w pliku API.txt http://drupalcode.org/viewvc/drupal/contributions/modules/features/API.t... )
Features posiada także wsparcie dla Drush'a (http://drupal.org/project/drush). Dzięki temu można łatwo wdrożyć nowe wersje modułów typu features na serwer produkcyjny. Wystarczy dwie czynności: skopiowanie nowych wersji modułów na serwer oraz uruchomienie polecenia "drush features-revert-all". Można ten proces zautomatyzować za pomocą odpowiednich skryptów i mieć mechanizm automatycznego wdrażania nowych funkcjonalności na wersję produkcyjną serwisu.
Zalecam także przy tworzeniu nowej wersji modułu typu „feature” nadawanie mu kolejnego numeru wersji (np 6.x-1.2,6.x-1.3, 6.x-1.4, itd) oraz zachowywanie tych wersji na dysku komputera. W każdej chwili będzie można odtworzyć wcześniejszą wersje funkcjonalności.
















