Przegląd Concrete5 dla programistów
- 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
- 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.
- $btIncludeAll: jeżeli chcesz by blok istniał na wszystkich wersjach strony (poza kontrolą wersji CMSa) to ustaw wartość zmiennej na 1
- $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
<?php
$page = Page::getCurrentPage();
<?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.
- $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
- $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:
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".
<a href="<?=$this->url("/dashboard/widgets", "add_widget", "type1", "type2", "type3")?>">URL</a>
- $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
Comment article