Структура данных и БДОсновная идея и вообще
Система разработана для того, чтобы получить удобный интерфейс для управления нужной структурой данных. Мы указываем тип блока данных (дерево, список, множество), указываем из каких полей какого типа состоит этот блок - и получаем интерфейс для редактирования.
- Дерево (tree) - это когда у пунктов есть подпункты (страницы на сайте).
- Список (list) - подпунктов нет, но есть порядок следования (у дерева тоже есть), т.е. мы указываем, какой пункт идет первым, какой вторым и т.д.
- Множество (set) - неупорядоченный список. Упорядочивается при выборке, например, по алфавиту или дате (новости).
Еще у нас можно в одном блоке хранить записи/элементы/пункты (это синонимы) разных типов, указав для полей, какому из типов элементов они принадлежат.
И еще есть встроенная поддержка многоязычности - мы можем указать, что какое-то поле у нас является многоязычным, а какое-то - нет. И соответствующим образом будет построен интерфейс - с переключалкой языков у многоязычных полей.
Как все это хранится в БД
Блок может состоять из одной или нескольких таблиц в зависимости от его сложности. Таблицы именуются так: префикс_название_блока__суффикс. Префикс нужен для того, чтобы не путать таблицы системы с чужеродными таблицами, если мы их всех храним в одной базе данных. По умолчанию префикс - ss_ (пусть будет site system, а вообще это по историческим причинам. К Shutzstaffel отношения не имеет). При описании префикс опустим, чтоб не загромождать.
Название блока - это понятно, суффикс - это дополнительный маркер, обозначающий смысл данной таблицы. Лучше будет видно на примере:
У нас есть блок "новости". Представляет собой множество. Пусть для простоты там есть всего 2 поля: "дата" и "текст". Причем поле "текст" может быть на разных языках, а дата - нет.
Тогда будут такие таблицы: news и news__ml. Здесь news - основная таблица, а news_ml - таблица для хранения многоязычных полей. Структура таблиц такая:
news:
_id идентификатор, первичный ключ (auto_increment)
_disabled "запись отключена". 0 или 1. Запись словно удаляется, но может быть восстановлена
date дата новости (пользовательские данные)
news_ml:
_node_id идентификатор записи в основной таблице (_id)
_language_id идентификатор языка
text текст новости (пользовательские данные)
Служебные поля, чтобы не путать их с пользовательскими, начинаются с "_".
Если блок подчинен другому, добавляется поле _master_id - какой записи блока-господина принадлежат записи этого блока.
Для упорядоченных блоков (список, дерево) добавляются дополнительные служебные поля:
Список:
_number порядковый номер для сортировки.
Дерево:
_parent id родительского узла
_number
_children_count количество потомков. Используется движком для ускорения выборок.
Блоки, состоящие записей разных типов, устроены так:
table главная таблица, общие поля
table__type1 поля для первого типа
table__type2 поля для второго типа
В главной таблица добавляется поле _node_type - там хранится id типа записи.
Остальные таблицы имею поле _node_id для связки с главной таблицей.
Многоязычные таблицы выглядят так: table__type__ml
Служебные блоки
Блоки
struct_blocks
Хранит в себе собственно описания блоков. Состоит из записей двух типов - Блок и Категория. Категория - это папка для помещения туда блоков для облегчения навигации. Из полей имеет только name (см далее). Категория может иметь детей, а Блок - нет.
Структура:
- keyword
Ключевое слово. Используется для именования таблиц в БД.
- name
Название (многоязычное - ml)
- type
Тип. Выбор из set, list и table - множество, список и таблица
- display
Показ в интерфейсе. list или table. В первом случае интерфейс работы с блоком будет такой - слева список, справа редактирование. Во втором - сверху таблица с возможностью сортировать по столбцам (только у set)
- display_table
Показ таблицы. Перечисление через запятую полей, которые показывать в таблице блока (в нужном порядке)
- display_items
Показ списка. SQL-выражение, задающее правила отображения элементов в списке. Например, name или concat(number, ' - ', name)
- sort_by
Выражение для сортировки. Если указано, то сортировка осуществляется по нему. Если не указано - по полю "Показ списка"
- sorting
Направление сортировки. asc или desc
- engine
Встроенный (служебный). Редактирование его структуры не рекомендуется.
- nodes_have_owner
Элементы имеют владельца.
- master_block_id
Какому блоку подчинен.
Поля
struct_fields
Описание полей, из которых состоят блоки. Подчинен блоку "Блоки". Типы записей: Поле и Вкладка. Вкладка - это тоже типа папка для группировки Полей.
Структура:
- keyword
Ключевое слово. Для именования столбцов в БД
- name
Имя.
- comment
Комментарий. Текст для помощи
- type_id
Тип поля. Ссылка на элемент блока "Типы полей". Определяет внешний вид и поведение.
- block_slave
Подчиненный блок. Для полей типа "ссылка". На кого ссылаемся.
- localizable
Многоязычное (локализируемое). Поле позволяет хранить разные значения для разных языков
- node_type
Тип элемента, которому принадлежит поле (если блок может содержать элементы разных типов).
- validation
Валидация. Регулярное выражение, дающее истину при допустимом значении поля (preg_match). Пока не реализовано
- default_value
Значение по умолчанию, задается на языке MySQL. Например, CURDATE() или "Unknown". (Будет вызван select $default_value)
Типы полей
struct_fieldtypes
Структура:
- essence
Поведение. Выбор из списка:
- string строка
- text многострочный текст
- html wysiwyg-редактор
- checkbox флажок
- password пароль (****)
- enum перечисление (enum в MySQL)
- set набор (set в MySQL)
- date дата
- time время
- datetime дата и время
- file файл с кнопкой "обзор" и превьюшкой
- directory папка. Много файлов можно хранить
- link ссылка на элемент в другом (или в этом же) блоке
- link_multiple ссылки на много элементов (чекбоксами)
- script_mysql автогенерящееся нередактируемое поле, MySQL-выражение
- script_php то же самое, но php-выражение. Автогенерящиеся поля предназначены только для показа, без возможности редактирования.
- sql
SQL-определение
- store_in_fs
Хранить файлом (в противоположность хранению в БД).
- validation
Условие валидности (пока не реализовано)
- built_in
Встроенное (в противоположность добавленному пользователем). Пока игнорируется.
- name
Имя.
Типы элементов
struct_nodetypes
- keyword
Ключевое слово (для именования таблиц в БД)
- can_have_children
Может иметь детей
- display_style
Стиль для отображения, чтобы отличать элементы разных типов. font-weight:bold и пр.
- name
Название
- name_multiple
Название в множественном числе
|