Схемы и их устройство

Что такое схема

Схема — это структура данных, основываясь на которой некая абстрактная сущность выполняет набор действий, заданных этой схемой. Например, exim (экспорт-импорт) не привязан к какой-либо сущности (продукты, страницы и т.п.) — все данные, которые он может экспортировать/импортировать описаны с помощью схемы.

Типы схем

Существует 3 типа схем. Типы нельзя смешивать между собой (например описывать данные и в этом же скрипте — функции)

  • Массив данных — схема возвращает массив. Например:

    app/schemas/permissions/admin.php
    ----
    <?php
    return array(...)
    ?>
    
  • XML-структура — схема является обычным текстовым файлом, содержимое которого считывается через fn_get_contents:

    app/schemas/menu/menu.xml
    ----
    <menu>
        <items>
            ....
        </items>
    </menu>
    
  • Набор функций — в схеме описаны функции.

    В большинстве случаев схема с функциями является дополнением схемы с массивом данных. Тогда такую схему нужно подключать через include_once в начале файла с данными, и отдельно вызывать ее не надо.

    В случае же, если такая схема является самостоятельной (например actions и variants у settings), то такую схему подключаем как обычно, например fn_get_schema("settings", "actions.functions"):

    app/schemas/exim/products.functions.php
    ----
    <?php
    function fn_exim_products()
    {
    ...
    }
    ?>
    

Расширение схем

C помощью модулей

Чтобы расширить схему с помощью модуля, нужно создать в каталоге модуля ту же структуру каталогов и файлов схемы, добавив к имени файла суффикс ”.post”. Например:

Основной файл
-------------
app/schemas/permissions/admin.php

Файл расширения
---------------
app/addons/seo/schemas/permissions/admin.post.php

При подключении схемы расширения в нее передается переменная $schema, которая содержит данные, расширяемой схемой. Работать нужно с этой переменной и в конце скрипта вернуть ее. Например:

<?php
// в $schema уже есть данные, которые вернула родительская схема
$schema['news'] = array(
    'modes' => array(
        'manage' => array(
            'permissions' => 'manage_news'
        )
    )
);

return $schema;

C помощью тегов редакции

Теги редакции нужны, чтобы сформировать нужные данные в схеме в зависимости от редакции (ULTIMATE, MULTIVENDOR). Чтобы расширить схему с помощью тега редакции, нужно создать в каталоге со схемой файл вида schema_[PRODUCT_EDITION]. Например:

Основной файл
-------------
app/schemas/permissions/admin.php

Файл тега редакции
---------------
app/schemas/permissions/admin_ultimate.php

Сюда также передается переменная $schema, которая содержит данные, расширяемой схемой. Работать нужно с этой переменной и в конце скрипта вернуть ее.

Получение схемы

Данные схемы получаются (или подключаются функции) с помощью функции fn_get_schema:

function fn_get_schema($schema_dir, $name, $type = 'php', $force_addon_init = false)
  • $schema_dir — подкаталог со схемой относительно каталога schemas, например permissions, settings.
  • $name — имя файла со схемой, без расширения, например admin, schema. Если тип схемы — функция, то имя пишется в таком виде: actions.functions, variants.functions.
  • $type — тип схемы (по сути расширение файла) — php или xml.
  • $force_addon_init — указывает, что при подключении схемы нужно подключить так же отключенные аддоны и их файлы func.php.

На текущий момент кеширование реализовано для списка подключаемых файлов.