SIMAI-SF4: Портал образовательных организаций (для разработчиков)
Описание
Данный портал предназначен для создания сайтов. Основанный на базе битрикс он позволяет одновременное ведение многих сайтов, без доступа к административной части.База данных

Все данные размещены в инфоблоках и highloadblock. Рассмотрим типы инфоблоков
- Контент - там содержатся данные самого портала (новости, баннеры и т.п.)
- Домены - содержит единственный инфоблок, в котором находятся домены сайтов
- Организации - данные настроек сайтов (детские сады, школы, допы) и служебные (Типы - содержат настройки для типов сайтов, Ведомства - нужны для разделения доступов модераторов)
- Школы, Детские сады и прочее - инфоблоки содержащие данные сайтов
Хайлоадблоки:

- Журнал действий - записи добавления, удаления, изменения элементов
- Задание - фоновое задание, которое выполняется через крон
- Задача - список задач со скриптами для заданий
- Структуры разделов - содержат разделы сайтов
Домены
Данный инфоблок содержит домены, сами домены заносятся в поле название, через привязку "организация" определяется к какому сайту они относятся. У одного сайта возможны несколько доменов, также допустимы отдельные домены не являющиеся поддоменами портала.
Сайт
Для каждого типа сайтов: школы, детские сады, допы есть отдельный ифоблок, в котором 1 элемент инфоблока это 1 сайт.
- Название сайта
- Администраторы, редакторы сайтов
- Статус
- Степень заполнения в мониторинге
- В детальном описании - сериализованный массив пунктов меню

- настройки сайта, соответствуют настройкам сайта sf4 (контакты, макет, цвета и прочее)
- привязки к разделам - это в карточке элемента не выводится, по соображению безопасности.
Привязки к разделам

Контент содержится в инфоблоках, они полностью соответствуют инфоблокам решений на sf4, за небольшой разницей.

У каждого сайта есть корневой раздел, название раздела такое же как ид элемента сайта, внутри этого раздела, администратор может создавать свои разделы и свои элементы. У каждого элемента есть свойство organization привязка к элементу инфоблока сайта.
Структура сайта
Структуры сайта размещена
1 элемент хайлоадблока это 1 раздел/страница сайта.

- Название раздела/пункта меню
- Символьный код - код раздела /sveden/
- Сортировка - расположение относительно других пунктов меню, чем меньше число тем раньше
- Базовый раздел - если стоит галочки удалить и переименовать раздел нельзя, устанавливается при создании сайта
- Страница - если стоит галочка то будет /sveden.php, устарело не используется
- Тип меню - в каком меню пункт выведется, доступно: основное, верхнее, нижнее. Если ничего не выбрано выведется в основном.
- Скрывать пункт меню - если стоит галочка в меню отображаться не будет

- Компоненты - компоненты на странице (новости, форма обратной связи и тп)
- Параметры - настройки компонентов в сериализованном виде (раздел, число элементов, заголовок)

- Описание - html текст который выводится на странице/разделе

- привязка к элементу сайта
- родительский раздел - элемент хайлоадблока, который является родительским разделом, для элемента common это sveden
Типы

Инфоблок нужен для связи других инфоблоков и папок
- инфоблок - ид инфоблока с элементами сайтов
- путь к файлам - папка в публичной части портала в которой размещена структура сайта
- тип инфоблоков - инфоблоки с контентом
- ид структуры - ид хайлоадблока структуры
Фоновые задачи
Задачи которые нельзя выполнить за 1 запуск скрипта на сервере, выполняются в кроне. Логика следующая:Есть задачи, название, путь к скрипту который её выполняет

Есть хайлоадблок заданий, у него привязка к элементу задачи, статус, данные.

Раз в 3 минуты, крон проверяет нет ли невыполненных заданий, если они есть, то запускается скрипт задачи которому передаются данные из поля данные, скрипт сам проверяет время и прерывает себя при его превышении, обычно стоит 5 секунд, до прерывания он сохраняет текущий статус и служебные данные в поле "данные". Когда он завершает действия то переходит в статус "Выполнено".
Структура сайта
Подсайты работают на 404 ошибке, если путь не найден, то чпу передаёт запрос на /index.php где размещён компонент simai:coordinator
У каждого подсайта есть своя папка со статичными файлами, они во многом повторяют структуру сайта решения на sf4

simai:coordinator
Предназначен, для подключения нужной страницы исходя из адреса, если не находит то кидает 404 ошибку. Структуру сайта мы получаем так:$settings = \SIMAI\Main\Subsite\Coordinate::GetCashe(str_replace(array("www.",".".SITE_SERVER_NAME), "", $_SERVER["SERVER_NAME"]));
$settings["SITE_STRUCTURE"] - содержит древовидную структуру меню
Мы получили пункт меню
- Есть в базовой структуре - к примеру /sveden/common/

- Динамический пункт меню - если страницы нет в структуре папок, то обращаем к /school/urlrewrite.php там правила работают точно также как и в обычном urlrewrite.php

Подключаем файл /school/life/news/detail.php

- В чпу нет, в структуре нет, но есть в пунктах меню. Компонент просто выводит страницу

- Нет в структуре пунктов меню - редирект на /404/

Папки
Служебные файлыРазмещены в /school/.params/ они нужны при создании сайта
- .default.params.php - настройки сайта по умолчанию(макет, цвет и т.п.)
- .section.params.php - обязательные подразделы (раздел "Родителям" в новостях и т.п.)
- .site.structure.php - структура разделов сайта по умолчанию
Страницы сайта

Обычные вызовы компонентов, но всегда в параметрах указывается корневой раздел, доступ к настройкам сайта осуществляется через функцию Property::getValue
\SIMAI\Main\Configuration\Property::getValue(SF_SITE_DIR, "news");
Настройки
Настройки инфоблоков - /simai.data/config/.iblock.config.php ничем не отличаются от стандартных в sf4Настройки сайта
- для школ: /simai.data/config/.school.config.php
- для доу: /simai.data/config/.detsad.config.php
Апи
Для подключения апи нужно подключить модуль simai.mscoreВызовы:
//получить все настройки сайта
$settings = \SIMAI\Main\Subsite\Coordinate::GetCashe(str_replace(array("www.",".".SITE_SERVER_NAME), "", $_SERVER["SERVER_NAME"]));
//сбросить кеш настроек сайта
\SIMAI\Main\Subsite\Coordinate::GetCashe(str_replace(array("www.",".".SITE_SERVER_NAME), "", $_SERVER["SERVER_NAME"]),true);
//получить дерево разделов пунктов меню сайта
$tree_content = \SIMAI\Main\Subsite\Tree::Get($settings["ID"]);
//проверка доступа к редактированию сайта
\SIMAI\Main\Subsite\Verification::Check()