Pierwsze urodziny i wersja 1.3.3

Pierwsze urodziny i wersja 1.3.3

Dziś mija dokładnie rok odkąd światło dzienne ujrzała pierwsza wersja Batflata! Z tej okazji przygotowaliśmy kolejną aktualizację, która wprowadza kilka interesujących nowości. Zacznijmy jednak od krótkiej historii naszego CMS.

Krótka lekcja historii

Nie możemy pisać o Batflacie nie wspominając o jego protoplaście, czyli o LekkiCMS. Lekki był projektem hobbystycznym, który został opublikowany we wrześniu 2012 roku. Spakowany ważył zaledwie 20 KB i zawierał 20 plików. Główną ideą, która kryła się podczas jego tworzenia była prostota użycia przez niedoświadczonych webmasterów. Podpięcie własnego szablonu HTML/CSS trwało kilka minut i składało się z kilku tagów.

Rok później pojawiła się druga wersja Lekkiego, napisana całkowicie od nowa. Zmieniło się wiele, lecz główne założenia pozostały. CMS nadal był lekki, prosty i szybki. Nikt z nas nie spodziewał się, że będzie zapotrzebowanie na tego typu rozwiązania przy ogromnej liczbie już istniejących.

W 2015 roku postanowiliśmy zbudować trzecią wersję CMS-a. Proces tworzenia bardzo się przeciągał i dopiero w 2016 roku projekt zyskał pożądaną architekturę. Chcieliśmy zachować elementy charakterystyczne dla Lekkiego, ale również wprowadzić istotne zmiany, które docenią bardziej zaawansowani deweloperzy. Ostatecznie projekt zmienił swoją nazwę na "Batflat". Pierwszy człon nazwy nawiązuje do Batmana - ulubionego superbohatera jednego z twórców, zaś drugi odnosi się do tego, że CMS jest oparty na plikach (flat-file). Żółty kolor logo również ma swoje znacznie, ale jak łatwo się domyślić, on również ma związek z alter ego Bruce Wayne'a.

Naprawione błędy

Wystarczy historii na dziś. Co zostało poprawione w wersji 1.3.3? Panel administracyjny został dostosowany do przeglądarki Internet Explorer 11, moduł Bloga zlicza już poprawnie liczbę wpisów dla paginacji, a z nawigacji został wyeliminowany błąd dodawania klasy "active" do elementów zagnieżdżonych. Coś więcej? Dashboard nie pokazuje modułów, które nie posiadają nawigacji, moduł Pages lepiej rozpoznaje brak podstrony dla złożonych adresów, zaś QueryBuilder posiada ulepszoną metodę grupowania warunków. Przejdźmy do nowości.

Klasa obserwatora

Wiecie czym są zdarzenia w JavaScript lub jQuery? Z czegoś podobnego można skorzystać w Batflacie, czyli z klasy "Event". Mogą one zastąpić tzw. system hooków, który rozszerza funkcjonalność istniejących rozwiązań. Nowa klasa "obserwuje" dodane zdarzenia, aby następnie je wykonać w odpowiednim miejscu i czasie. Przykład:

\Inc\Core\Lib\Event::add('do', function() { echo "Foo!"; });
\Inc\Core\Lib\Event::add('do', function() { echo "Bar!"; });
\Inc\Core\Lib\Event::call('do');

Klasa widgetów

Działa praktycznie tak samo jak klasa obserwatora, ale różni się tym, że pod uwagę brana jest również zwracana treść.

\Inc\Core\Lib\Widget::add('foo', function() { echo "Bar!"; });
\Inc\Core\Lib\Widget::call('foo');

Metoda zakończenia działania modułu

Moduły mogą skorzystać z nowej metody o nazwie finish(), która wykonuje się dopiero po załadowaniu wszelkich innych modułów. Metoda ta została wykorzystana do budowy przydatnego narzędzia dla deweloperów, o którym za chwilę.

Narzędzie debugowania

Debug bar

Zupełnie nowy moduł, który może okazać się niezwykle przydatny podczas tworzenia nowych rozszerzeń dla Batflata. Jest on domyślnie instalowany wraz z nową wersją CMS i uaktywnia się, gdy włączymy tryb dewelopera w pliku inc/core/defines.php. Debug bar, bo tak brzmi jego oryginalna nazwa, pozwala zapoznać się z czasem wykonania skryptu, liczbą zapytań, zawartością zmiennych globalnych czy informacjami o zmiennych przekazanych przez funkcję dump().

Nowe metody QueryBuilder

isNull(), isNotNull(), orIsNull(), orIsNotNull() to nazwy nowych metod, które znalazły się w klasie konstruktora zapytań do bazy danych. Umożliwiają one wybranie wierszy, których określone kolumny są lub nie są puste. Przykład:

$this->core->db('table')->isNotNull('column');

Zmienne jako anonimowe funkcje

Zmienna systemu szablonów może zostać od teraz zdeklarowana jako anonimowa funkcja. Dzięki takiemu rozwiązaniu, zawartość zmiennej nie będzie niepotrzebnie generowana, gdy nigdzie się z niej nie korzysta. Za przykład weźmy moduł "Contact". Zmienna {$contact.form} jest używana zazwyczaj wyłącznie na jednej podstronie, a zatem ładowanie jej zawartości na podstronach, gdzie nie wyświetlamy formularza kontaktowego jest pozbawione sensu. Stosując funkcję anonimową w łatwy sposób optymalizujemy działanie modułu, gdyż kod funkcji wykona się dopiero po użyciu zmiennej szablonu. Przykład:

$this->tpl->set('contact', function() {
    return ['form' => $this->_insertForm()];
});

Kolorowanie składni w edytorze

Edytor HTML potrafi już kolorować składnię języka HTML, CSS, JavaScript oraz Markdown. Kolorowanie działa wyłącznie w przeglądarkach opartych o Chromium i Firefox.

Przeszukiwanie rozwijalnej listy

Searchable select

Gdy CMS posiada wiele podstron, elementów nawigacji czy innych rzeczy zawartych w rozwijalnych listach, ręczne przeszukiwanie konkretnego elementu może być nieco denerwujące. Aby przyspieszyć ten proces wprowadziliśmy możliwość wyszukiwania wśród elementów obiektu <select>. Jeżeli chcesz zastosować wyszukiwarkę w widoku swojego modułu, to do obiektu listy dodaj atrybut data-use-search="true".