.IM-CMS ver. 1.0

Koncepcja, geneza, motywacja

Pierwsze przemyślenia logiczno-funkcjonalne, pojawiły się podczas ustalania wymagań i projektowania specyfikacji (oczywiście za pomocą diagramów UML) nowego systemu CMS - było to w roku 2017. Główny cel projektowy systemu i sposób jego realizacji, wykreował się podczas realizacji jednego z projektów. Wymyśliłem następujące zależności, następujących struktur CMS-a. Podział całego ekosystemu na sekcje, obiekty, typy i właściwości. Cztery hermetyczne, abstrakcyjne definicje, wyizolowane w stopniu maksymalnym, działające osobno, niezależnie, ale powiązane naturalną relacją...
Od roku 2009, projektowałem własny system CMS, wdrażałem go przy wielu projektach. Zdobył on uznanie naprawdę wielu użytkowników (funkcjonalność, estetyka, UX). Poczynając od właścicieli księgarni (API), biura obrotu nieruchomościami, systemu doradczego, a kończąc na "zwykłych" stronach wizytówkowych, e-sklepach, itd. Po tych 10 latach zorientowałem się, że zacząłem za dużo poprawiać w bieżącym rdzeniu, "sklejać" funkcjonalności w sposób nienaturalny (który trochę nie przystoi profesjonalnemu programowaniu), jednym słowem zacząłem kombinować po to, aby mój CMS mógł sprostać coraz to większym wymaganiom...
W końcu powiedziałem: STOP. Pora na zmiany i to drastyczne...
Wróćmy do modelu: sekcje, obiekty, typy i właściwości, o którym wspomniałem wcześniej.
Otóż, zasada podczas projektowania serwisu internetowego jest następująca: każda strona/podstrona WWW jest w systemie tzw. "sekcją" (takich sekcji możemy definiować dowolną ilość i układać w dowolną hierarchię - rodzice i potomkowie). Każdy element na stronie (sekcji) jest tzw. obiektem, obiekt "aktualność", obiekt "slider główny", obiekt "menu", itd. - to my tworzymy te obiekty w dowolnej ilości...
I teraz, każdy taki obiekt musi mieć zdefiniowane właściwości, czyli być jakiegoś typu. Gdzie typ to właśnie zestaw określonych właściwości, np.: opis, zdjęcie, data, nazwa, odsyłacz relatywny (względny), odsyłacz absolutny (do zewnętrznego zasobu), itd. To my ustalamy jakie właściwości będzie miał dany typ, i w końcu to my definiujemy jakiego typu będzie dany obiekt(y), no a te obiekty podczepiamy do dowolnych sekcji...
Skomplikowane? Nic bardziej mylnego. Opisana koncepcja zapewnia niesamowitą elastyczność twórcy/administratora, logicznie wydziela każdy element składający się na budowę serwisu/portalu, daje czyste i klarowne podejście do pracy w panelu zarządzania treścią.
Jakby tego było mało to w to wszystko wplotłem jeszcze jedno ciekawe rozwiązanie, mianowicie: "wielodomenowość". Hmm? Jeżeli więcej niż jedna domena prowadzi do systemu (na poziomie root), to możemy utworzyć dedykowane katalogi w systemie dla każdej z tych domen. W takim katalogu zawiera się layout, pliki graficzne, parametry połączenia z bazą danych (każda domena w systemie może, ale nie musi, mieć inną bazę), pliki js czy less-css, pliki typu "public". Dodatkowo to w jednym, głównym panelu admina wybieramy jaką domeną zarządzamy w danym momencie.
Sam silnik pracuje tak samo dla każdej domeny, to katalog danej domeny definiuje dedykowane dane i preferowane zdarzenia po stronie klienta (tylko jeden katalog). Złota zasada programisty: DRY (nie powtarzaj się) zachowana jest w pełni.
Co jeszcze? Moduł tłumaczeń. W systemie jesteśmy w stanie przetłumaczyć wszystko co znajduje się w bazie danych. W jaki sposób? Silnik programu, aby przetłumaczyć dany tekst (z języka domyślnego), potrzebuje z bazy danych: nazwę tabeli, nazwę pola i nr id rekordu. IM-CMS uruchamiając moduł tłumaczeń ma te 3 elementy zdefiniowane, tak więc przetłumaczy wszystko. To administrator ustala jakie dane z bazy "pokryć" tłumaczeniem w wybranym języku, za pomocą trzech wspomnianych parametrów.
A teraz o motywacji krótko. Asumpt, który permanentnie wpływał na postępy i zaangażowanie w pracę kreowali tak naprawdę sami użytkownicy i ich pomysły, wymagania, cele...pomysły, które ja tak bardzo chciałem urzeczywistnić...czasami wpadałem w dziwny stan, w którym przestawałem myśleć o projekcie wprost, o tym jakie ma zadanie realizować, zaczynałem wtedy myśleć bardziej abstrakcyjnie. Myślałem o samych pojedynczych funkcjach i obliczu wyzwania jakie ze sobą niesie ich poprawne napisanie. Nie ważne czy był to projekt portalu społecznościowego, wizytówki czy sklepu. Ten stan zdeterminował to wszystko o czym powiedziałem wcześniej...
A teraz trochę technicznie...

Struktura silnika, kod źródłowy

Przebudowałem tu wszystko: model bazy danych, kod źródłowy, layout panelu administratora. Baza danych to tabele przechowujące dane na temat: sekcji, obiektów, typów i właściwości. Wszystko połączone odpowiednimi relacjami (tu też zasada DRY jest jak najbardziej na miejscu). Do tego zaprojektowałem jeszcze tabele, które przechowują dane na temat ustawień, tłumaczeń językowych, etykiet (każda sekcja ma etykiety, czyli miejsca w danej sekcji do którego podłącza się obiekty - położenie obiektu), kategorii (zastaw wyświetlanych obiektów jednego typu, przyczepionych do tej samej etykiety można zawęzić jeszcze poprzez wybór kategorii z listy rozwijanej.
Kod po stronie serwera to bardzo dużo obiektowości. Struktura fizyczna systemu CMS w skrócie: "systemy domenowe", klasa "obiekt" - serce, katalog z właściwościami, katalog na rozszerzenia "composer", katalog z modułami, katalog "ajax", katalog realizujący żądania po stronie serwera...
Czystość i logiczna izolacja...
Co zapewnia takie utrzymanie infrastruktury kodu:
  • Proces projektowania jest bardziej odporny na błędy,
  • Każde późniejsze zmiany są stosunkowo łatwe do wdrożenia,
  • Aktualizacja poszczególnych elementów odbywa się w sposób bezpieczny,
  • Prostota zarządzania.
Podstawowe technologie:
  • Komercyjne środowisko PhpStorm IDE z pakietami Composer.
  • Bootstrap 4.3.1.
  • Fontawesome PRO - 5.11.
  • LESS-CSS (kompilator lokalny).
  • Interpreter: PHP-OOP 7.x.
  • Relacyjna baza danych: MySQL 5.7.
  • Moduły: jQuery, Nice-Select, etc.
Moje marzenie, powoli się spełnia...

Live DEMO

Zapraszam do przetestowania.
Wersja sandbox: demo (demo@demo, demo)

2019 - Internet.Media - Damian Krawiec, Zielona Góra, Lubuskie
m(at)internet.media.pl