Poradnik Joomla - wprowadzenie do nowego Joomla
Jeśli chcesz poznać Joomla oraz nauczyć się tworzenia rozszerzeń dla Joomla, to temu ma służyć ten przewodnik. Przewodnik w większości jest tłumaczeniem serii artykułów opublikowanych przez Astrid Guenther , a oryginalne treści znajdziesz pod tym adresem https://blog.astrid-guenther.de/en/joomla/0vorwort/ .
Wszystkie artykuły oraz przykłady kodu, odnoszą się do Joomla w wersji wyższej od 3.10.12, czyli min. Joomla 4 . Do zrozumienia treści, dobrze jest zapoznać się ze wzorcem projektowym MVC , który jest podstawą dla Joomla, w dowolnej wersji.
Oczywiście do nauki potrzebna jest działająca instalacja cms'a , którą można pobrać tutaj Joomla i zainstalować, w oparciu o filmy na kanale .
Można również skorzystać z serwisu i darmowej instalacji na lunch.joomla.org .
Co jest celem tego przewodnika ?
Przede wszystkim, po latach pracy z Joomla, uwazam, że brakuje takiego źródła wiedzy w języku polskim, a od dawna brak aktualnych publikacji na temat Joomla. To akurat wydaje się dosyc naturalne, ponieważ technologie zmieniają się dosyć szybko i w księgarniach, książki poświęcone IT stanowią coraz mniejszy udział.
Ten przewodnik, adresowany jest do programistów, ale może z niego skorzystać każdy, kto chciałby zrozumieć jak Joomla działa i jak samemu wykorzystać jego możliwości.
W trakcie wyjaśnień pojawi się kod, który nie jest dedykowany określonemu rozwiązaniu, ale może zostać wykorzystany do budowy indywidualnych rozwiazań, jako baza. Oczywiście będziemy bazować na kodzie, który został przygotowany przez Astrid Guenther .
Struktura przewodnika
Treść w przewodniku ułożona jest chronologicznie, w miarę powstawania kodu, ale nie ma przeciwskazań, żeby przejść do sekcji, którą jesteś bardziej zainteresowan(a)y. Nalezy pamiętać, że zrozumienie określonego rozdziału lub kodu, może wymagać wiedzy lub kodu, z rozdziałów poprzedzających. Oczywiście bedę starał się zachować strukturę treści zaproponowaną przez Astrid Guenther , ale nie będzie to forma 1:1.
Struktura wynika także z tego, że do przykładów bedziemy wykorzystywać istniejące komponenty Joomla, np:
- com_content
- com_banner
- com_tags
- com_contact
które jako całość są dosyć skomplikowane, ale mają w sobie fragmenty kodu, który wykorzystamy, aby zrozumieć niektóre elementy.
"Tworzenie komponentu to, w dużej mierze wykorzystanie istniejącego kodu, ponieważ korzystamy ze zdefiniowanych wcześniej klas i metod"
Podstawy
Joomla oferuje 5 typów rozszerzeń
- Komponenty - komponenty są częścią głównej treści strony i zwykle wykorzystują dane przechowywane w bazie danych. Istnieje wbudowana pozycja wyglądu strony opartej na Joomla, ktora nazywa się "component" i to w tej pozycji wyswietlana jest treść komponentu.
- Moduły - to dodatki do głównego widoku, które rozszerzają jej funkcjonalność. moduły mogą być wyswietlane w różnych miejscach na stronie i powiązane z różnymi elementami menu. Moduły to małe i eleastyczne rozszerzenia, które są uzupełnieniem dla głównej treści, z którą nie muszą być powiązane. Może to być np. moduł, który uzupełnia główną treść, o godziny otwarcia.
- Dodatki/Pluginy ( w polskiej wersji nie używamy określenia Plugin ) - dodatki to małe podprogramy, które zajmują się przygotowaniem treści, przed jej wyświetleniem. Dodatki zwykle, NIE są elementami, które samodzielnie są wyświetlane na stronie. Dodatek pobiera dane, przetwarza je i przygotowuje do wyświetlenia, w ramach modułu, szablonu lub komponentu. Dodatek pracuje w "tle" systemu Joomla.
- Języki - to najprostsze rozszerzenie, które składa się z klucza i treści klucza, w określonym języku. To zwykle pliki typu *.ini które przechowują zbiór kluczy z treścią, dla określonego języka.
- Szablony - to definicja układu i graficznego wyglądu strony, dla lepszego zrozumienia posłużyłbym się określeniem "szpalta"
Na Joomla składa się pięć aplikacji:
- Instalator - wykorzystywany jest do instalacji Joomla, a po zainstalowaniu Joomla, powinien zostać skasowany.
- Administrator - czyli tzw. zaplecze cms Joomla, służy do zarządzania treścią od strony administracyjnej systemu.
- Strona - czyli tzw. witryna, służy do prezentacji treści od strony dostępnej, dla internautów.
- CLI - czyli interfejs wiersza poleceń, który jak nazwa wskazuje, pozwala zarządzać Joomla, poprzez wiersz poleceń, np. zadaniami CRON'a.
- API - czyli programowalny interejs aplikacji, służący do wykorzystywania usług aplikacji internetowych, oferowanych przez Joomla
Wiedza podstawowa
Środowisko programistyczne
Mimo, że przewodnik poświęcony jest Joomla, to do tworzenia, analizy oraz testowania kodu, który, w dalszej części, będzie prezentowany, potrzebnych jest kilka narzędzi, czyli:
Środowisko testowe
Joomla jest przeznaczony do uruchomienia na serwerze internetowym, ale zanim to zrobisz, to dobrym rozwiazaniem jest, wykorzystanie lokalnego środowiska, które zapewni taką funkcjonalność. W naszej ocenie, dobrze jest skorzystać z Xampp'a , którego instalację i uruchomienie opisaliśmy, w filmie instruktażowym
.
Edytor kodu
Do pisania i edytowania samego kodu, potrzebne jest narzędzie, które w łatwy sposób pomoże budować kod, ułatwi jego czytanie oraz zaprezentuje sekcje zależnie, od stosowanego języka. Oto lista edytorów kodu https://en.wikipedia.org/wiki/List_of_text_editors . Edytor to dość indywidualna kwestia, więc należy popróbować i wybrać taki, który bedzie odpowiadał naszym preferencjom. Najczęsciej korzystamy z Notepad++ , ale uwzględniając dodatkowe elementy jak np. możliwość integracji z repozytoriami kodu, można pomysleć o innych rozwiązaniach (lista IDE).
Porównanie Joomla 3 z nowym Joomla
Nowe elementy w Joomla
Szablony oferowane wraz z Joomla są zgodne z wymaganiami dostępności, obowiązującymi organizacje publiczne, w Unii Europejskiej, czyli poziom AA of WCAG 2.1. Dodatkowo w nowej wersji Joomla, zintegrowano bibliotekę Bootstrap 5.
Zoptymalizowane narzędzia internetowe (Web Asssets)
Dzięki nowemu rozwiązaniu, poprzez pojedyncze wywołanie, można załadować złożone zestawy plików JavaScript i CSS, ale według określonego porządku. Określony porządek oznacza, że wywołania poprzez Web Asset Manager'a, mają pierwszeństwo przed np. wywołaniami stylów lub skryptów, typu HTMLHelper::_('stylesheet or script ...)
umieszczonych, w kodzie rozszerzeń. Przydatność tego rozwiązania sprawia, że raz załadowana biblioteka, nie musi być ładowana ponownie do rozszerzenia, a może być jedynie przywołana poprzez WebAssetManager'a. jeśli szablon ładuje np. Fontawesome, to w tworzonym module, wystarczy tylko skorzystać z tego, co zostało załadowane poprzez szablon.
Automatyzacja wymiany danych poprzez usługi sieciowe (Web Services)
Treść Joomla może być wykorzystywana i udostępniana poprzez zaimplementowane usługi sieciowe. W przypadku nowego Joomla, są to usługi oferowane poprzez REST API, które zostały zaimplementowane, w głównym kodzie Joomla.
Przepływ komunikacji (Workflow)
W nowej wersji Joomla został dołaczony komponent, który pozwala na budowanie własnych schematów przepływu pracy, z wykorzystaniem rozszerzeń oferowanych z Joomla, ale także rozszerzeń oferowanych przez strony trzecie.
Inne dodatki
Nowa wersja to m.in. zaimplementowanie rozwiązań zapobiegającym iniekcji kodu do bazy danych, poprawa struktury kodu bazodanowego, oczyszczenie kodu ze zbędnych klas i funkcji oraz dodanie obsługi Przestrzeni Nazw PHP.
Wsteczna zgodność z Joomla 3
Nowy Joomla posiada wiele zmian, które nie akceptują rozwiązań stosowanych, w wersjach poprzednich, dlatego przy problemie, warto zprawdzić zgodność wsteczną, zastosowanego kodu w rozszerzeniu, oto głowna lista https://docs.joomla.org/Potential_backward_compatibility_issues_in_Joomla_4
Podstawowe zasady
Nigdy nie zmieniaj plików źródłowych
Celem budowy Joomla poprzez rozszerzenia, jest stworzenie systemu, który może być rozszerzony o wymagane funkcjonalności.
Możliwe jest, że rozszerzenia w kodzie źródłowym, będę powstawać równolegle do rozszerzeń, które zdecydujesz się Ty utworzyć.
Jeśli Ty dokonasz zmiany plików źródłowych, niezależnie od zespołu Joomla, to może to skutkować nadpisaniem ich, przez kolejną aktualizację Joomla. W praktyce oznacza to utratę wykonanej pracy. Pamietaj, że Joomla jest systemem żywym, dlatego zmiany i aktualizacje pojawiają się dosyć systematycznie.
Jeśli sądzisz, że funkcjonalność, której oczekujesz, może zostać wykonana tylko poprzez zmianę plików źródłowych, to jesteś w błędzie ! Zawsze istnieje rozwiązanie, które pozwoli na osiągnięcie oczekiwanego efektu, bez ingerencji w pliki żródłowe Joomla.
Wzoruj się na kodzie źródłowym
Nie należy zmieniać kodu źródłowego, ale to nie oznacza, że nie można tego kodu podglądać, stosować i kopiować, wręcz przeciwnie. jeśli chcesz poznać zasady tworzenia kodu, dobre praktyki oraz wykorzystywać już napisany kod, to pliki źródłowe są świetnym materiałem do nauki. Jeśli napotykasz problem, przy tworzeniu własnego rozszerzenia, to pliki źródłowe będą idealnym rozwiązaniem, zwłaszcza, że nie wszystko jest dokumentowane, w zewnętrznych poradnikach/ źródłach.
Plik autoload_psr4.php
Nowym rozwiązaniem w Joomla jest plik, który tworzony jest w trakcie instalacji Joomla, czyli /administrator/ cache/autoload_psr4.php
. Jeśli napotkasz dziwne problemy, z funkcjonowaniem Joomla , to zanim rozpoczniesz radykalne kroki, najzwyczajniej usuń ten plik. Przy ponownym ładowaniu strony, plik autoload_psr4.php
zostanie ponownie utworzony, w sposób automatyczny. Prosta operacja usunięcia wskazanego pliku, czasami pomaga w rozwiązaniu problemów.
Przestrzenie nazw
Joomla jest rozwiązaniem budowanym w oparciu o programowanie obiektowe, w języku PHP. Wraz z rozwojem PHP, zmienia się także Joomla. Wraz z nowym Joomla, wprowadzono do stosowania przestrzenie nazw, które można zauważyć w zapisie każdego pliku php, w formie:
FooNamespace\ Component\Foos\Administrator\View\Foos;
i jako tag, w pliku manifestu:
<Namespace>FooNamespace\ Component\Foos</ Namespace>.
Jeśli umieszczasz pliki przetrzeni nazw, w podkatalogu SRC, to pamiętaj, aby dodać parametr path="src" , jest to standardowe rozwiązanie w Joomla oraz w tworzonych dla niego rozszerzeniach.
Po co stosować przetrzenie nazw ? Przestrzenie nazw pozwalają na zadeklarowanie wielu klas o takiej samej nazwie, wprowadzając pewien porządek i grupowanie. Dzięki przestrzeniom nazw, czytelność kodu jest lepsza, bowiem widać od razu, która klasa czego dotyczy. W jakich sytuacjach to się może przydać? Oczywiście, gdy tworzymy włane rozwiązanie dla Joomla i korzytamy z istniejących bibliotek kodu. Wszytkie klasy PHP, zorganizowane i zdefiniowane, w ten sposób, są ładowane automatycznie przez Classloader
's. Tym samym ContentModelArticles
staje się Joomla\Component\Content\ Administrator\Model\ArticlesModel
.
Znany z Joomla JLoader
może przetwarzać przetrzenie nazw automatycznie i rozróżnić klasy pomiędzy dedykowanymi witrynie i zapleczu. Pliki z przestrzeniami nazw, można zobaczyć tutaj /src .
Duże znaki w nazwach plików i folderów
Przy analizie folderów nowego Joomla, zauważysz, że niektóre pliki i foldery posiadają nazwy zaczynające się z dużej litery. Wród wielu zmian ta wydaje się mało czytelna, ale po tym wyjaśnieniu, zobaczysz, że ma to większy sens. Otóż obowiązuje zasada że:
- Foldery Joomla, które zaczynają się z dużej litery, to foldery, w których znajdują się klasy PHP, zdefiniowane jako przestrzenie nazw.
- Foldery z nazwą pisaną, małą literą, to foldery przechowujące pliki XML oraz szablony/widoki, nowego Joomla.
W strukturze znajduje się jeszcze niektóre foldery pisane małą literą, które nie pasują do tych reguł, ale to pozostałości, które wkrótce znikną, bowiem utrzymywane są, ze względu na zachowanie zgodności z Joomla 3. Najczęściej, dotyczy to plików typu helper.
Znaczenie Nazw Klas
Nowy Joomla, podobnie jak poprzedni, oparty jest na modelu MVC (Model View Controller), natomiast zmianie uległy nazwy klas i obecnie przypiano im bardziej czytelne nazewnictwo, np Kontrolery mają w nazwie przedrostek "controller" i tak:
FooNamespace\Component\Foos\ Administrator\Controller\Foos
będzie miał kontrukcję
FooNamespace\Component\Foos\ Administrator\Controller\FoosController
.
Dodatkowa zmiana dotyczy domyślnego kontrolera, który w Joomla 3 miał nazwę Controller
, a obecnie, aby było bardziej czytelnie do czego służy, ma nazwę DisplayController
.