Skip to content

Глобальные настройки

Глобальные настройки — это контент, не привязанный к конкретной странице: контакты, header, footer, SEO-defaults, фирменные цвета. Доступны во всех Blade-шаблонах через переменную $global.

В админке управление — раздел Глобальные настройки (/cms/settings). Структура и поля — раздел Структура настроек (/cms/settings-structure).

Не путать с Core Settings

Глобальные настройки (GlobalField) — это контент сайта (контакты, тексты footer). Настройки ядра (CmsConfig, /cms/core-settings) — это системные параметры CMS (admin_url, two_factor_mode и т.п.). Это разные таблицы и разные сущности. Эта страница только про первое.

Структура

Глобальные настройки имеют трёхуровневую иерархию для UI и единый плоский namespace ключей в Blade.

Уровни

УровеньТаблицаНазначение
Settings Pageglobal_field_pagesРаздел в админке («Контакты», «Header & Footer», «SEO»)
Settings Sectionglobal_field_sectionsГруппа полей внутри страницы («Социальные сети» в «Контактах»)
Global Fieldglobal_fieldsКонкретное поле (phone, email, twitter_url)
Field Valueglobal_field_valuesЗначение поля (для repeater'ов — несколько значений)
Translationglobal_field_value_translationsПеревод значения на конкретный язык

Колонки global_fields

КолонкаНазначение
keyИдентификатор поля (snake_case) — попадает в $global['key']
nameОтображаемое название в админке
typeТип поля (те же 18 типов, что у блоков — см. Поля)
default_valueЗначение по умолчанию
dataJSON тип-специфичной конфигурации
parent_idДля вложенности (внутри repeater'а)
global_field_page_id, global_field_section_idПривязка к UI
orderПорядок

Уникальность ключа

key глобального поля уникален в рамках parent_id. Для корневых полей (без parent_id) — глобально уникален. Это значит, что все глобальные настройки сидят в одном плоском namespace — нельзя иметь два разных поля phone в разных Settings Pages.


Доступ в Blade

Глобальные настройки загружаются на каждом публичном запросе middleware GlobalFieldsMiddleware и делаются доступными как:

  • $global — переменная во всех Blade-шаблонах (через view()->share).
  • app('global_fields') — массив в контейнере (для PHP-кода).

Структура — плоский ассоциативный массив key => value. Никаких префиксов по page/section.

blade
<a href="tel:{{ $global['phone'] }}">{{ $global['phone_label'] }}</a>
<address>{{ $global['address'] }}</address>

TIP

Helper-функции cms_setting() не существует. Все обращения идут только через $global (в шаблоне) или app('global_fields') (в PHP).

Типы значений

Значения проходят через Templite\Cms\Support\FieldValueCaster::cast() и попадают в $global уже приведёнными к типу:

Тип поляЧто лежит в $global['key']
text, textfield, editor, tiptap, html, color, date, datetime, radioСтрока (или null/пустая строка)
numberint или float
checkboxbool
selectСтрока (single) или массив (multiple)
linkМассив {url, target} (декодированный JSON)
img, fileID файла (int), не модель File!
array (repeater)Массив объектов с дочерними ключами
page, userID (int)

Примеры

Простой текст

blade
<a href="tel:{{ $global['phone'] }}">
    Позвонить: {{ $global['phone'] }}
</a>
blade
<a href="{{ $global['cta_link']['url'] }}" target="{{ $global['cta_link']['target'] }}">
    Подробнее
</a>

Или через встроенный компонент:

blade
<x-cms::link :value="$global['cta_link']">Подробнее</x-cms::link>

Изображение (тип img)

В отличие от полей блоков, в $global лежит ID файла, а не модель File. Чтобы отрендерить — нужно загрузить модель вручную:

blade
@php
    $logo = \Templite\Cms\Models\File::find($global['header_logo']);
@endphp
@if ($logo)
    <x-cms::image :file="$logo" size="navbar" />
@endif

Repeater (тип array)

blade
<ul class="social-links">
    @foreach ($global['social_links'] as $link)
        <li>
            <a href="{{ $link['url'] }}" target="_blank">
                {{ $link['name'] }}
            </a>
        </li>
    @endforeach
</ul>

Создание глобальных настроек

Через UI

  1. Меню Структура настроек (/cms/settings-structure) → создать Settings Page (например, «Контакты»).
  2. В Settings Page добавить Section («Социальные сети») — опционально.
  3. Добавить Field в Section (или прямо в Page): задать key, name, type, опции.
  4. Перейти в Глобальные настройки (/cms/settings) — заполнить значения.

Через MCP

  • create_settings_page — создать Settings Page.
  • create_settings_section — создать Section.
  • create_settings_field — добавить поле.
  • update_settings — изменить значения.
  • get_settings — получить текущие значения.

См. MCP — Tools.


Кэширование

Глобальные настройки кэшируются на запрос языка:

  • Ключ кэша: global_fields (для default lang) или global_fields_<lang> (для других).
  • GlobalFieldsMiddleware сначала пробует загрузить из кэша через CacheManager::getGlobalFieldsByKey().
  • Кэш инвалидируется при сохранении любого GlobalField или GlobalFieldValue.

Ручная очистка:

bash
docker exec templite-app php artisan cms:cache-clear

Локализация

Значения глобальных полей могут переводиться на разные языки через global_field_value_translations. Структура: global_field_value_id + lang + value.

При запросе на не-дефолтном языке GlobalFieldsMiddleware::mergeTranslations() накладывает переводы поверх дефолтных значений. Для пустых переводов используется дефолтное значение.

Подробнее — Локализация и города.


Программный доступ из PHP

php
$global = app('global_fields');

$phone = $global['phone'] ?? '';
$logo = isset($global['header_logo'])
    ? \Templite\Cms\Models\File::find($global['header_logo'])
    : null;

WARNING

app('global_fields') работает только в контексте публичного запроса — там, где отработал GlobalFieldsMiddleware. В консольных командах и admin-маршрутах нужно либо запустить middleware вручную, либо загрузить значения напрямую из моделей (GlobalField::with('values')->get()).


Подводные камни

Подводные камни

  • Helper cms_setting() не существует. Доступ только через $global в Blade или app('global_fields') в PHP.
  • img / file в $global — это ID, не модель File. Для рендера через <x-cms::image> нужно сначала File::find($id).
  • Уникальность ключа глобальная. В глобальных настройках нельзя иметь два поля phone в разных Settings Pages — это нарушит unique-индекс по (parent_id, key).
  • $global доступен только на публичных маршрутах. На admin-маршрутах middleware GlobalFieldsMiddleware не подключается. Это специально — админка не зависит от глобальных настроек.
  • Кэш привязан к языку. При переключении дефолтного языка или массовом изменении переводов — обязательно cms:cache-clear, иначе старые значения будут показываться до следующего изменения.
  • Не путать с CmsConfig (/cms/core-settings). Это разные таблицы. Если в коде нужны параметры самой CMS (admin_url, two_factor_mode) — используйте CmsConfig::getValue('key', $default), а не $global.

Связанные разделы

Распространяется под лицензией MIT.