Глобальные настройки
Глобальные настройки — это контент, не привязанный к конкретной странице: контакты, 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 Page | global_field_pages | Раздел в админке («Контакты», «Header & Footer», «SEO») |
| Settings Section | global_field_sections | Группа полей внутри страницы («Социальные сети» в «Контактах») |
| Global Field | global_fields | Конкретное поле (phone, email, twitter_url) |
| Field Value | global_field_values | Значение поля (для repeater'ов — несколько значений) |
| Translation | global_field_value_translations | Перевод значения на конкретный язык |
Колонки global_fields
| Колонка | Назначение |
|---|---|
key | Идентификатор поля (snake_case) — попадает в $global['key'] |
name | Отображаемое название в админке |
type | Тип поля (те же 18 типов, что у блоков — см. Поля) |
default_value | Значение по умолчанию |
data | JSON тип-специфичной конфигурации |
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.
<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/пустая строка) |
number | int или float |
checkbox | bool |
select | Строка (single) или массив (multiple) |
link | Массив {url, target} (декодированный JSON) |
img, file | ID файла (int), не модель File! |
array (repeater) | Массив объектов с дочерними ключами |
page, user | ID (int) |
Примеры
Простой текст
<a href="tel:{{ $global['phone'] }}">
Позвонить: {{ $global['phone'] }}
</a>Ссылка (тип link)
<a href="{{ $global['cta_link']['url'] }}" target="{{ $global['cta_link']['target'] }}">
Подробнее
</a>Или через встроенный компонент:
<x-cms::link :value="$global['cta_link']">Подробнее</x-cms::link>Изображение (тип img)
В отличие от полей блоков, в $global лежит ID файла, а не модель File. Чтобы отрендерить — нужно загрузить модель вручную:
@php
$logo = \Templite\Cms\Models\File::find($global['header_logo']);
@endphp
@if ($logo)
<x-cms::image :file="$logo" size="navbar" />
@endifRepeater (тип array)
<ul class="social-links">
@foreach ($global['social_links'] as $link)
<li>
<a href="{{ $link['url'] }}" target="_blank">
{{ $link['name'] }}
</a>
</li>
@endforeach
</ul>Создание глобальных настроек
Через UI
- Меню Структура настроек (
/cms/settings-structure) → создать Settings Page (например, «Контакты»). - В Settings Page добавить Section («Социальные сети») — опционально.
- Добавить Field в Section (или прямо в Page): задать
key,name,type, опции. - Перейти в Глобальные настройки (
/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.
Ручная очистка:
docker exec templite-app php artisan cms:cache-clearЛокализация
Значения глобальных полей могут переводиться на разные языки через global_field_value_translations. Структура: global_field_value_id + lang + value.
При запросе на не-дефолтном языке GlobalFieldsMiddleware::mergeTranslations() накладывает переводы поверх дефолтных значений. Для пустых переводов используется дефолтное значение.
Подробнее — Локализация и города.
Программный доступ из 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-маршрутах middlewareGlobalFieldsMiddlewareне подключается. Это специально — админка не зависит от глобальных настроек.- Кэш привязан к языку. При переключении дефолтного языка или массовом изменении переводов — обязательно
cms:cache-clear, иначе старые значения будут показываться до следующего изменения. - Не путать с CmsConfig (
/cms/core-settings). Это разные таблицы. Если в коде нужны параметры самой CMS (admin_url, two_factor_mode) — используйтеCmsConfig::getValue('key', $default), а не$global.
Связанные разделы
- Поля — типы полей и их доступ через
FieldValueCaster - Локализация и города — переводы глобальных настроек
- Файлы и медиа — модель
Fileи<x-cms::image> - MCP — Tools — управление настройками через AI