Хранилища
Основное назначение модуля simai.storage – создание хранилища динамических данных для информационных решений компании SIMAI. Данный модуль является заменой инфоблоков и highload блоков 1С-Битрикс.
Особенности решения
1. Хранилища могут поддерживать работу с несколькими языками.
2. Сами хранилища при создании не имеют свойств. Свойства добавляются при настройке хранилища. Значения свойств для хранилища и элементов хранятся в одной таблице хранилища.
3. При добавлении полей сразу же определяется порядок их вывода в административном интерфейсе. Порядок задается индексом сортировки.
4. Нет отдельного понятия раздела. Каждый элемент может выступать в качестве записи или раздела. Это задается настройками данного элемента. При этом набор свойств для режима раздела и для режима записи может быть различным.
5. Можно группировать хранилища и элементы в наборы. Наборы можно использовать как объекты для работы и вывода данных. Для этого используется понятие набор данных. Например,набор хранилищ может быть объединен по теме, набор элементов для представления товарных предложений.
Можно задавать уровень доступа как для хранилища, так и для каждого элемента.
Основные понятия
В модуле хранилища используются сущности: Хранилище, Элемент, Свойство, Набор.
Хранилище – это область хранения элементов одного типа (новость, фотография, документ и т.д.). Концепция хранилищ предполагает, что информация имеет привязку к языку. Каждое хранилище имеет набор свойств, которое может использоваться как для самого хранилища, так и для элементов. Свойства для хранилища имеют ELEMENT_ID равный 0. Для каждого свойства можно задать где оно будет использоваться: Хранилище, Элемент, Раздел. Свойства хранилища могут иметь несколько языковых представлений. Хранилища могут быть объединены в набор хранилищ. Одно и тоже хранилище может находится в нескольких наборах хранилищ.
Каждое хранилище имеет уникальный код. В качестве кода хранилища могут использоваться только английские строчные (маленькие) буквы, цифры и знак «_» (в качестве пробела). Код всегда должен начинаться с буквы. Общая длина кода не должна превышать 16 знаков. Хранилище не обязательно содержит элементы. Хранилище без элементов может использоваться для хранения настроек где требуется хранить всего лишь одно значение.
Элемент – это объект, содержащий информацию согласно набору свойств хранилища (предназначенных для элементов). Элемент может иметь несколько языковых представлений в рамках хранилища. Сам элемент может иметь одно из двух представлений – в виде записи (item) или раздела (section). Элементы могут быть объединены в набор элементов. Каждый элемент может находится в нескольких наборах элементов.
Свойства – способ хранения разнородной информации для хранилищ и элементов. Свойство имеет описание типа хранимой информации и механизм работы с ней (для вывода и изменения). Механизм работы свойств для хранилища и элементов единый. Свойство может быть мультиязычным или нет. От этого меняются методы работы со свойством.
Каждое свойство имеет код. Код свойства может содержать ПРОПИСНЫЕ (большие) английский буквы, цифры и знак «_» (в качестве пробела). Код свойства должен начинаться с буквы, например, «TITLE_2». Общая длина кода не должна превышать 32 знака.
Для каждого свойства указывается, используется ли оно в режиме хранилища, раздела и записи.
Набор – это объединение объектов одного типа в единый пакет. Механизм работы с наборами для хранилищ и элементов единый. Для отличая принадлежности свойства к хранилищу или элементам используется поле OBJECT, которое может принимать значение S или E (STORAGE или ELEMENT).
Таблицы
Для таблиц модуля используется префикс sf_ (сокращенное от simai.framework).
Для каждого хранилища создается своя таблица с данными. В качестве названия используется код хранилища. Например, таблицы хранилища с кодом «code» будет называться sf_storage_code. Код хранилища может содержать строчные английские символы, цифры и знак «_» и должно быть уникально.
В модуле используются таблицы двух типов – служебные и таблицы хранилищ. Служебные таблицы используются для работы всех хранилищ. Таблицы хранилища создаются для каждого хранилища и содержат все данные связанные с этим хранилищем.
Служебные таблицы:
Таблица |
Описание |
sf_storage |
Реестр хранилищ.В данной таблице содержится информация о хранилищах. |
sf_storage_property |
Реестр свойств. Содержит языконезависимую информацию о свойствах, используемых в модуле. |
sf_storage_property_lan |
Таблица для хранения языкового представления информации о свойствах. |
sf_storage_set |
Таблица для хранения информации по наборам. |
sf_storage_set_lan |
Таблица для хранения языкового представления информации о наборах. |
Таблицы хранилища (на примере хранилища с кодом code):
Таблица |
Описание |
sf_storage_code |
Таблица с данными по свойствам хранилища и элементов. |
sf_storage_code_element |
Таблица со списком элементов хранилища. |
Структура данных таблиц
sf_storage
Поле |
Описание |
Тип |
Обяз. |
Умолч. |
STORAGE_ID |
Код хранилища. Уникален. |
String |
Да |
|
ACTIVE |
Флаг активности (Y|N). |
String |
Да |
Y |
SORT |
Индекс сортировки хранилища. |
Int |
Да |
500 |
SITE_ID |
Сериализованый массив с привязанными сайтами. |
Text |
Да |
|
ACCESS |
Сериализованый массив с параметрами доступа к хранилищу. |
Text |
Да |
|
ELEMENT_ACCESS |
Флаг использования уровня доступа для каждого элемента (Y|N). |
Char(1) |
Да |
N |
LOG |
Флаг ведения логов при операциях с хранилищем (Y|N) |
Char(1) |
Да |
N |
sf_storage_property
Поле |
Описание |
Тип |
Обяз. |
Умолч. |
PROPERTY_ID |
ID свойства. |
Int |
Да |
|
STORAGE_ID |
Код хранилища. |
String |
Да |
|
CODE |
Символьный код свойства |
String |
Да |
|
TYPE |
Код типа свойства (integer, string и т.д.) |
String |
Да |
|
SETTING |
Сериализованый массив с параметрами свойства. |
Text |
Да |
|
MULTIPLE |
Множественность (Y|N). |
Char(1) |
Да |
N |
SERIALIZE |
Флаг сериализации значения свойства (Y|N). |
Char(1) |
Да |
N |
MULTILANGUAGE |
Флаг мультиязычности значения свойства (Y|N). |
String |
Да |
N |
SORT |
Индекс сортировки свойства. |
Int |
Да |
500 |
STORAGE_USE |
Флаг использования в режиме хранилище (Y|N). |
String |
Да |
N |
SECTION_USE |
Флаг использования в режиме раздел (Y|N). |
String |
Да |
N |
ITEM_USE |
Флаг использования в режиме запись(Y|N). |
String |
Да |
Y |
SYSTEM |
Флаг системного свойства (эти свойства удалить нельзя. Они создаются автоматически для каждого хранилища.) (Y|N). |
String |
Да |
Y |
sf_storage_property_lan
Поле |
Описание |
Тип |
Обяз. |
Умолч. |
ID |
ID записи. |
Int |
Да |
|
PROPERTY_ID |
ID свойства. |
Int |
Да |
|
LANGUAGE_ID |
Код языка. |
String |
Да |
|
NAME |
Название свойства. |
String |
Да |
sf_storage_set
Поле |
Описание |
Тип |
Обяз. |
Умолч. |
SET_ID |
ID набора. |
String |
Да |
|
OBJECT |
Типобъекта (S|E). S – storage, E – element. |
Char(1) |
Да |
|
SORT |
Индекс сортировки набора. |
Int |
Да |
500 |
SET |
Сериализованый массив набора. |
Text |
Да |
sf_storage_set_lan
Поле |
Описание |
Тип |
Обяз. |
Умолч. |
ID |
ID записи. |
Int |
Да |
|
SET_ID |
ID набора. |
String |
Да |
|
LANGUAGE_ID |
Код языка. |
String |
Да |
|
NAME |
Название набора. |
String |
Да |
sf_storage_(код хранилища)
Поле |
Описание |
Тип |
Обяз. |
Умолч. |
ID |
ID записи. |
Int |
Да |
|
ELEMENT_ID |
ID элемента. Для записей относящихся к хранилищу равно 0 |
Int |
Да |
|
LANGUAGE_ID |
Код языка. |
String |
Да |
|
PROP_(код свойства) Таких колонок может быть много |
Значение свойства. |
От свойства |
sf_storage_(код хранилища)_element
Поле |
Описание |
Тип |
Обяз. |
Умолч. |
ELEMENT_ID |
ID элемента. |
Int |
Да |
|
ACTIVE |
Активность элемента (Y|N). |
Char(1) |
Да |
Y |
SORT |
Показатель сортировки. |
Int |
Да |
500 |
TYPE |
Тип элемента (S|I). S – section, I–item. |
Char(1) |
Да |
I |
PARENT_ID |
ID родительского раздела |
Int |
0 |
|
PARENT_IDS |
Несколько ID родительских разделов в строковой форме. Для типа Item их здесь может быть несколько, для типа Section – только один. |
Text |
||
LEFT_MARGIN |
Левый отступ (используется только для разделов) |
Int |
0 |
|
RIGHT_MARGIN |
Правый отступ (используется только для разделов) |
Int |
0 |
|
DEPTH_LEVEL |
Глубина вложенности (используется только для разделов) |
Int |
0 |
|
GROUP_(ид группы) Таких колонок может быть много (по числу групп). Используются только в хранилищах, где ELEMENT_ACCESS='Y' |
Права доступа для группы |
String |
||
SEARCH_(код языка) Таких колонок может быть много (по числу языков). |
Поисковые поля |
Text |
||
(код языка)_PROP_(код свойства) Таких колонок может быть много (число языков, умноженное на число свойств хранилища). |
Поля сортировки по знаечниям свойств |
От свойства |
Сущности и подпространство имен
Для определения классов задано общее подпространство имен SIMAI\Storage.
Все классы первого и второго уровня определены в этом подпространстве имен.
Классы первого уровня, такие как StorageTable, PropertyTable, PropertyLanTable и т.д. в основном наследуются от Bitrix\Main\Entity\DataManager с некоторыми дополнениями, поэтому к ним применимы стандартные приемы работы с ORM в ядре D7.
Учебный курс по ORM можно найти по ссылке https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&CHAPTER_ID=05748
В целом, ситуацию можно рассматривать примерно так:
- класс первого уровня StorageTable – это класс, наследуемый от Bitrix\Main\Entity\DataManager и опирающийся на таблицу со списком хранилищ. К этому классу добавлены специальные методы модуля хранилищ;
- класс второго уровня Storage построен на использовании методов класса StorageTable, в его методы добавлена проверка прав и другие дополнительные действия.
Большинство классов первого уровня работают непосредственно с сущностями, за исключением UserAccess и PropertyType.
Классы 1 уровня (в основном опираются на Bitrix\Main\Entity\DataManager):
\SIMAI\Storage\UserAccess \SIMAI\Storage\PropertyType \SIMAI\Storage\StorageTable \SIMAI\Storage\PropertyTable \SIMAI\Storage\PropertyLanTable \SIMAI\Storage\SetTable \SIMAI\Storage\SetLanTable |
Классы 2 уровня (используют классы 1 уровня):
\SIMAI\Storage\Storage \SIMAI\Storage\Element \SIMAI\Storage\Property \SIMAI\Storage\Set \SIMAI\Storage\Search \SIMAI\Storage\Export \SIMAI\Storage\Import |
Об этих классах и их методах можно прочесть в соответствующих разделах документации.
В общем случае следует всегда использовать классы второго уровня, классы первого уровня – по необходимости.
Страницы в административной панели
Административное меню модуля simai.storage располагается во вкладке «Контент».
Страница «Все наборы хранилищ» позволяет управлять наборами хранилищ, создавать новые и редактировать существующие, помещая в них существующие хранилища.
Страницы наборов хранилищ – возможность перейти на страницу каждого набора и увидеть хранилища набора в списке. Это раскрывающиеся меню, подпунктами которых являются ссылки на страницы хранилищ, относящихся к данным наборам.
Страница «Все хранилища» – выводится список всех хранилищ с возможностью добавить новое хранилище. Это раскрывающееся меню, подпунктами которого являются ссылки на страницы всех хранилищ.
Страницы хранилищ присутствуют в приведенных выше меню наборов и пункте «Все хранилища».
Это раскрывающиеся меню по образцу инфоблоков, где можно сразу увидеть структуру разделов хранилища.
Кроме того, для каждого хранилища присутствует отдельный подпункт «Наборы элементов», через который можно управлять наборами элементов внутри хранилища.
На странице хранилища можно увидеть список элементов хранилища с возможностью перейти к редактированию элементов или добавить новые.
Кроме того, с этой страницы можно перейти к редактированию самого хранилища.
Также на этих страницах присутствует кнопка «Обновление поиска», позволяющая обновить внутренний поисковой индекс элементов хранилища.
Страница создания/редактирования хранилища позволяет задать все основные параметры хранилища – код (для новых хранилищ), сортировку, доступ, а также свойства хранилищ. Также тут можно задать значения свойств, относящихся к самому хранилищу.
Страница создания/редактирования элемента хранилища позволяет создать новый элемент или отредактировать существующий со всеми его свойствами. Если при редактировании меняется тип элемента (раздел/запись), то соотвественно меняется набор доступных свойств. Запись позволяет множественную привязку к род. разделам, а раздел – только единичную.
Большинство элементов управления и редактирования в админ-панели используют модуль «Универсальные свойства» (simai.property) с шаблонами .default
Компоненты для публичной части
Все компоненты, устанавливаемые модулем, относятся к пространству имен simai.
Вывод значений свойств, фильтров, а также редактирование записей происходят посредством модуля «Универсальные свойства» (simai.property).
Компонент simai:storage – основной комплексный компонент, позволяющий объединить большинство других компонентов модуля в единую систему. По структуре подобен компоненту bitrix:news.
Есть страница общего списка записей, страница раздела и страница детального просмотра для записей. Поддерживается ЧПУ.
Имеется возможность установить язык вывода – при его смене все языковые свойства будут выводить значения соотв. языка. Подписи также будут выводиться на нужном языке (если для него есть языковые файлы).
Компонент simai: storage.section.list выводит список разделов хранилища. В целом аналогичен bitrix:catalog.section.list.
Компонент simai:storage.item.filter предназначен для совместного использования с компонентом списка simai:storage.item.list. Работает примерно аналогично bitrix:catalog.filter, но результат (массив фильтра) передается не в глобальный массив, а в сериализованную строку, которую можно передать в simai:storage.item.list.
Компонент simai:storage.item.list в целом аналогичен bitrix:news.list. Имеет встроенную систему добавления новых элементов через публичный раздел.
Компонент simai:storage.item.grid может использоваться вместо simai:storage.item.list. Список записей выводится в виде грида. Использует собственную систему «фильтр+поиск», с компонентом simai:storage.item.filter несовместим.
Компонент simai: storage.item.detail – детальный просмотр записи. В целом схож с bitrix:news.detail.
Имеет двойную систему встроенного редактирования записей – полное редактирование записи и быстрое редактирование отдельных свойств.
Компонент simai:storage.search – комплексный компонент поиска, объединяющий компоненты storage.search.query (вывод строки поиска) и storage.search.result (вывод результатов поиска).
Используется собственная внутренняя система поиска модуля, поисковый индекс битрикс не задействуется.
Компонент storage.menu.sections позволяет создать динамическое меню на основе структуры разделов хранилища. В целом аналогичен bitrix:menu.sections.
Компоненты simai:main.ui.filter и simai:main.ui.grid заменяют собой системные компоненты гридов для компонента simai:storage.item.grid.
Компонент simai: pagenavigation заменяет собой системный компонент постраничной навигации.