В основе серверной части ComStarter'a лежит быстрый и очень гибкий микрофреймворк Fat-Free, предоставляющий свою систему роутинга, автозагрузчик классов, шаблонизатор (используется в модификации), валидатор, юнит-тестирование, логирование и ряд других полезных подсистем, образующих прочный фундамент для ComStarter'a.
Также в ComStarter со стандатным пакетом компонентов входит:
Важно отметить, что фреймворк изначально ориентирован на поддержку мультиязычности и по умолчанию работает с кодировкой UTF-8.
Подробная информация:
Данный фреймворк позволяет создавать произвольное количество конфигурационных файлов с теми или иными общими настройками для определённых групп компонентов. Это позволяет легко и быстро вносить необходимые изменения в настройки компонентов путём подключения/отключения необходимых файлов конфигурации. Например, вы можете создать единый конфигурационный файл с используемыми в проекте css файлами и подключить его ко всем страницам сайта. При этом есть два особых конфигурационных файла, без которых работа фреймворка невозможна:
GET @index: /page/@code = comMainPage->index
, где
@index
- имя маршрута,
/page/@code
- URL страницы без основного домена сайта (в данном примере передаёт в контроллер значение переменной "code", полученное из URL),
comMainPage->index
- название компонента и метод, ответственный за отображение главной страницы (контроллер).
На сегодняшний день данный фреймворк "из коробки" поддерживает 2 возможных источкика данных: MySQL и CSV. При необходимости Вы свободно можете реализовать поддержку иных типов баз данных. Компоненты фреймворка могут работать с любыми моделями (классами), реализующими интерфейс iModel, т.е. следующие методы:
Название метода | Входные параметры | Результат | Описание |
---|---|---|---|
log | string | Служит для логирования SQL команд. Обычно используется в целях профилирования. | |
getAllData | $fields=null - возвращаемые поля (все, если null)$ordering=null - порядок сортировки (нет, если null)
|
array | Читает все записи из связанной сущности (таблицы) и возвращает их в виде массива ассоциативных массивов, где ключи - имена полей. |
getDataByKey | $key - значение первичного ключа |
array | null | Возвращает запись с указанным значением первичного ключа в виде ассоциативного массива, либо null, если запись не может быть найдена. |
getPrimaryKey | string | Возвращает имя поля БД, являющегося первичным ключом. | |
getSchema | string | Возвращает ассоциативный массив - схему данных данной сущности (таблицы). См. Схема данных. | |
getSelectedData | $where - условное выражение, служащее фильтром$args - массив подставляемых значений вместо знаков "?" в выражении $where$ordering=null - порядок сортировки (нет, если null). В случае сортировки по множеству полей -
ассоциативный массив, где ключи - имена полей, а значения - направление (ASC или DESC).
|
array | Возвращает записи, соответсвующие условию $where, в виде массива ассоциативных массивов, где ключи - имена полей. |
getTitle | $field - имя поля в модели, для которого требуется определить заголовок |
array | Возвращает заголовок указанного поля с учётом текущего языка локализации. |
countData | $where=null - условное выражение, служащее фильтром (если null - без условий)$args=null - массив подставляемых значений вместо знаков "?" в выражении $where |
array | Возвращает количество записей, соответсвующих условию $where. |
addRecord | $data - добавляемая запись в виде ассоциативного массива, где ключи - названия полей |
array | Добавляет запись в таблицу. |
saveRecord | $data - новая запись в виде ассоциативного массива, где ключи - названия полей$where - условное выражение, определяющее, какая запись будет заменена на $data$args - массив подставляемых значений вместо знаков "?" в выражении $where |
array | Изменяет определённую запись в таблице. |
protected $file = '../files/topics.csv'; // путь к csv-файлу, связанному с моделью protected $delimiter = "\t"; // разделитель между столбцами (по умолчанию TAB) protected $fields = array( // поля csv-файла, о которых известно модели, и требования к ним (правила валидации) 'sid' => array( 'rules'=>'required|snake_case|maxlen[20]' ), 'parent_sid' => array( 'rules'=>'required|snake_case|maxlen[20]' ), 'menu_sid' => array( 'rules'=>'required|snake_case|maxlen[20]' ), 'order' => array( 'rules'=>'required|number' ), 'menu_order' => array( 'rules'=>'required|number' ) );В целом, описание полей таблицы данных строится посредством ассоциативного массива со следующими возможными ключами:
'model_field' => array( 'field'=>'...', // название поля в таблице данных (если отличается от имени ассоциативного ключа model_field) 'rules'=>'...', // ключевые слова для описания накладываемых ограничений на значения данного поля 'title'=>'...' // заголовок или ключ перевода при отображении данных для пользователя ),
Для перевода интерфейса на различные языки в системе существует специальный каталог (по умолчанию, app/locales), в котором создаются языковые ini-файлы поддерживаемых языков с необходимыми парами ключ-перевод.
Например, данная фраза находится в файле ru.ini и имеет ключ T_ARCHITECTURE_2. Для её отображения на текущем языке достаточно написать в требуемом месте шаблона [[*T_ARCHITECTURE_2*]]
.
Текущим считается язык, указанный в конфигурационной переменной LANGUAGE, и это значение должно совпадать с именем языкового ini-файла (без расширения). Также обратите внимание, что парсинг не осуществляется внутри переводов и соответственно вложение конструкций вида [[*TRANSLATE_KEY*]]
друг в друга не допускается.
Для организации переключения между различными языками вы можете использовать соответствующий визуальный компонент.
Чтобы предотвратить исполнение html-тегов в переводах, используйте дополнительные квадратные скобки, т.е. [[[*T_ARCHITECTURE_2*]]]
.
Файлы шаблонов играют в ComStarter особую роль, поскольку именно в них происходит создание и базовая настройка большинства компонентов!
По умолчанию все шаблоны ханятся в поддиректориях views и имеют расширение html. Каждый визуальный компонент, как правило, имеет свой файл шаблона, отвечающий за его прорисовку на web-странице посредством HTML и JS кода.
Comstarter имеет удобный шаблонизатор, поддерживающий следующий синтаксис:
[[ @.component_var ]]
- подстановка значения переменной компонента 'component_var'.[[ @global_var ]]
- подстановка значения глобальной переменной 'global_var', видимой для всех компонентов. Фреймворк содержит ряд стандартных глобальных переменных окружения, например, [[ @SITE_URL ]]
хранит URL-адрес сайта.[[* translation_key *]]
- подстановка перевода по ключу 'translation_key', см. подраздел Поддержка многоязычности.<foreach (@array_var as @key=>@item)>...\</foreach>
- конструкция, предназначенная для отображения 'global_var', видимой для всех компонентов. Фреймворк содержит ряд стандартных глобальных переменных окружения, например, [[ @SITE_URL ]]
хранит URL-адрес сайта.<if(condition)>...<else>...</if>
- условный оператор, где condition - некое выражение, в котором могут фигурировать как глобальные переменные, так и переменные данного компонента. Блок <else>
может отсутствовать.Но самая главная отосбенность данного шаблонизатора - это возможность расставлять на странице специальные теги для отображения готовых визуальных компонентов. См. Стандартные компоненты. и Созднание собственных компонентов.