Хранилища

Основное назначение модуля 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 заменяет собой системный компонент постраничной навигации.