Przegląd Concrete5 dla programistów

Przegląd budowy i możliwości bloków i stron stosowanych w Concrete5 dla programistów.

Możliwości Concrete5, które można wymienić to:
  • Edycja na stronie - nie trzeba przechodzić do oddzielnego panelu admina. Wystarczy włączyć tryb edycji i zaznaczyć element strony do edycji.
  • Pełna kontrola wersji
  • Szczegółowy system uprawnień
  • Użytkownicy i grupy
  • Możliwość dostosowania metadanych dla modułów stron i użytkowników.
  • Raporty i statystyki
  • Automatycznie generowane formularze
  • WYSIWYG
  • Struktura bloków i stron
Concrete5 to także framework aplikacji posiadający szereg funkcjonalności:
  • Wykorzystuje (przestarzałe) ADODB - Concrete działa z MySQL, lecz powinien także działać z innymi bazami danych jak PostgreSQL. Schemat tabel definiowany poprzez ADOXMLS. Keszowanie zapytań. Prosty wzorzec ActiveRecord.
  • Wbudowany system autoryzacji użytkowników i uprawnień (także OpenID)
  • Rozszerzalny system metadanych o użytkownikach, stronach i plikach do wykorzystania od strony kodu lub do wystawienia na stronie.
  • Rozbudowany menedżer plików
  • Twórz typy bloków dla małych elementów unikalnej zawartości, twórz typy stron dla różnych szablonów i strony statyczne dla jednorazowych podstron. Łącz je w paczki Concrete5
  • Strony statyczne, czy zwykłe strony mogą wykorzystywać wzorzec MVC co ułatwia dodawanie i zarządzanie logiką znacznie prostsze.
  • Rozbudowane API obejmujące tworzenie użytkowników, stron, bloków, typów bloków i dodawanie ich do stron
  • Funkcje pomocnicze do m.in. wysyłania emaili, walidacji danych

Typy stron, pojedyncze strony i bloki można budować korzystające ze "składni" MVC (określenie z dokumentacji...). Za pomocą tego wzorca łatwo oddzielić logikę aplikacji od warstwy prezentacyjnej (wyglądu). Wszystko opisane jest w dokumentacji.

Bloki

Bloki to najmniejsze jednostki warstwy prezentacyjnej w Concrete5. Bloki mają być dodawane do strony i składać się głównie z widocznej zawartości.

Za każdym razem, gdy blok jest dodawana do strony tworzony jest obiekt Block. Ten sam obiekt bloku może być przypisany do różnych stron i różnych ich wersji.

Każdy blok ma typ określony przez przypisany obiekt BlockType, który informuje system o typie danych jakie ten blok przechowuje. Każdy blok musi mieć typ (np. galeria, ankieta, tekst).

Każdy blok może posiadać dane specyficzne dla instancji bloku. Dla bloku wyświetlającego klip z YouTube adres URL do klipu będzie danymi specyficznymi dla danej instancji bloku.

Pliki bloków umieszczone mogą być w katalogach:
  • concrete/blocks/
  • packages/some_package/blocks/
  • blocks/

Każdy plik umieszczony w pierwszych dwóch lokacjach może zostać nadpisany takim samym plikiem w trzeciej lokacji.

Bloki zawierają luźną implementację wzorca MVC. Metody zawarte w controller.php można wykorzystać do przesyłania danych do różnych szablonów. Każda klasa definiująca blok muszą mieć zdefiniowane zmienne:
  • $btTable: główna tabela bloków, do której będą zapisywane dane. Większość bloków będzie potrzebować tylko tej tabeli
  • $btInterfaceWidth i $btInterfaceHeight: zmienne określające w pikselach długość i wysokość w pikselach bloku gdy jest dodawany lub edytowany.
Opcjonalnie także:
  • $btIncludeAll: jeżeli chcesz by blok istniał na wszystkich wersjach strony (poza kontrolą wersji CMSa) to ustaw wartość zmiennej na 1
Klasa kontrolera bloku posiada także metody:
  • $controller->add(): funkcja wywoływana gdy blok jest używany w trybie dodawania. Można wykorzystać tą metodę w połączeniu z metodą set() lub addHeaderItem().
  • $controller->on_start(): funkcja wykonywana przy próbie interakcji z blokiem. Zastępuje konstruktor i jest wykonywana tylko gdy jest to potrzebne.
  • $controller->on_page_view(): funkcja wywoływana gdy blok jest wyświetlany ze strony. Z tej metody można dodać elementy do nagłówka strony (addHeaderItem).
  • $controller->view(): funkcja wywoływana gdy blok jest wyświetlana. Można łączyć z set().
  • $controller->edit(): funkcja wywoływana przy edycji bloku.
  • $controller->save($args): gdzie $args to tablica asocjacyjna i zazwyczaj zawiera dane z tablicy $_POST. Dopasowuje i zapisuje dane do tabeli i zazwyczaj nie trzeba będzie jej nadpisywać.
  • $controller->set($key, $value): przyjmuje napisowy $key i wartość mieszanego typu $value. Tworzy zmienną o podanej nazwie dostępną w widoku bloku lub w szablonie edycji. Zazwyczaj używane z funkcjami add(), edit(), view().
  • $controller->render($view): Zwraca podany widok z folderu bloku (nazwa pliku). Nie wymaga stosowania rozszerzenia .php
  • $bp = $controller->getPermissionsObject(): Zwraca uprawnienia dla tego kontrolera bloku
  • $controller->duplicate($newBlockID): funkcja wykonywana gdy blok jest duplikowany. Można ją wykorzystać gdy chcemy dodać funkcjonalność zależną od duplikacji bloku (np. gdy aktualizowany jest blok w zatwierdzonej wersji strony).
  • $controller->delete(): usuwa dane z tabeli bloków gdy dany jest kasowany. Jeżeli potrzebne są dodatkowe operacje można nadpisać tą metodę.
  • $controller->addHeaderItem($file): Dodaje wskazany plik CSS lub JS i automatycznie dodaje go do strony.
  • $controller->getBlockTypeName(): zwraca nazwę typu bloku
  • $controller->getInterfaceWidth() i $controller->getInterfaceHeight(): zwraca długość i wysokość bloku jaka powinna być przy dodawaniu i edycji
  • $controller->getBlockTypeDescription(): zwraca opis typu bloku

Strony

Struktura treści w Concrete5 wygląda mniej więcej tak:
  • Bloki to najmniejsza ilość widzialnej treści
  • Obszary zawierają bloki
  • Obszary zawarte są w Wersjach Kolekcji
  • Atrybuty Kolekcji przypisane zostają do Wersji Kolekcji
  • Wersje Kolekcji zawierają się w Kolekcjach
  • Strony dziedziczą Kolekcje zamieniając je w coś widocznego z poziomu front-endu
  • Strony mogą mieć określony typ lub być strona pojedynczymi
By uzyskać dostęp do obecnie wyrenderowanej strony wystarczy:
<?php
$page = Page::getCurrentPage();
Można też pobrać stronę po ID czy ścieżce:
<?php
$page = Page::getByPath('/path/to/page', $version = 'RECENT');
$page = Page::getByID($pageID, $version = 'RECENT');

Gdzie $version może być 'recent' (najnowsza wersja), 'active' (wersja zatwierdzona), lub numeryczne ID wersji. Obiekt strony ma też wiele swoich metod, opisanych w dokumentacji.

Concrete5 nie wymusza stosowania modeli, lecz zaleca się stosowanie oddzielnych plików dla klas operujących głównie na danej tabeli w bazie danych. Pliki z modelami umieszczamy w katalogu "models". Strony mają także kontrolery, które są prostymi skryptami automatycznie ładowanymi gdy strona jest renderowana. Skrypty te mogą zawierać metody, które są wykonywane w określonych sytuacjach.

Proste strony (simple pages) umieszczamy w katalogu "controllers" na tym samym poziomie zagnieżdżenia jaki chcemy mieć na stronie. Jeżeli chcemy stronę pod adresem /dashboard/widgets/search/ to tworzymy kontroler controllers/dashboard/widgets/search.php. Kontrolery prostych stron powinny w nazwie zawierać ścieżkę i dziedziczyć klasę Controller. Dla powyższego przykładu kontroler powinien nazywać się "DashboardWidgetsSearchController".

Typy stron także mogą mieć kontrolery. Będą one użyte gdy renderowana będzie strona danego typu. Kontrolery takie tworzymy w "controllers/page_types/nazwaTypu.php". Klasy tych konstruktorów muszą dziedziczyć klasę Controller i być nazywane wg. schematu "NazwaTypuPageTypeController".

Kontrolery pozwalają programistom na wydzielenie różnych części funkcjonalności strony do różnych metod i automatyczne ich wykonywanie przy różnych zdarzeniach. W szablonie strony możemy umieścić taki kod:
<a href="<?=$this->action('activate_widget')?>">Aktywuj Widżet</a>

Gdy link zostanie kliknięty - strona zostanie ponownie wyrenderowana oraz metoda "activate_widget" zostanie wykonana.

Pewne metody będą wykonywane automatycznie jeżeli będą istnieć w klasie kontrolera:
  • view(): metoda wykonywana gdy strona jest wyświetlana, a żadna inna metoda nie została wywołana.
  • on_start(): metoda wykonywana na starcie. Zastępuje konstruktor.
  • on_before_render(): metoda wykonywana po wykonaniu metody kontrolera a przed renderowaniem widoku.
Mamy do dyspozycji także inne użyteczne metody:
  • $this->addHeaderItem($string): dodaje element do nagłówka strony
  • $var = $this->post('string');: zwraca wartość zmiennej 'string' z tablicy $_POST
  • $this->set('key', $value);: tworzy zmienną o podanej wartości dostępną w widoku strony
Widoki to proste szablony wykonywane przez CMSa przy renderowaniu stron czy bloków. W widokach można stosować kod PHP, jak i używać dostępnych metod:
  • $path = $this->getStyleSheet($stylesheet): zwraca arkusze CSS z aktywnej skórki.
  • $themeHandle = $this->getThemeHandle(): zwraca uchwyt do aktywnej skórki.
  • $path = $this->getViewPath(): zwraca ścieżkę użytą do wywołania bieżącego widoku
  • $this->inc($file, $args = array()): dołącza plik ze ścieżki bieżącej skórki. Ma on takie same możliości i dane jak bieżący widok.
  • $this->url($path, $task, $arguments): generuje URLe do wywoływania innych stron. np:
    <a href="<?=$this->url("/dashboard/widgets", "add_widget", "type1", "type2", "type3")?>">URL</a>
    
    Wygeneruje URL "http://www.mysite.com/dashboard/widgets/add_widget/type1/type2/type3/", który po kliknięciu wykona metodę "add_widget($arg1, $arg2, $arg3)" klasy "DashboardWidgetsController".
  • $this->action($task, $arguments): jak url(), tyle że przekaże obecną ścieżkę do funkcji.
  • $r = $this->section($url): sprawdza czy jesteś w sekcji strony (górny poziom)
  • $items = $this->getHeaderItems(): zwraca listę wszystkich elementów nagłówka strony
blog comments powered by Disqus

Kategorie

Strony