Работа с контактами
Контакты — это телефоны, почты, адреса, соцсети и мессенджеры, карты, реквизиты, время работы. Они хранятся отдельно от секций — в одном общем хранилище на весь сайт — и доступны на любой странице. Удобство в том, что один и тот же контакт (например, телефон) описывается один раз, а выводиться может в разных местах (шапка, подвал) со своим оформлением.
Эта страница — про модель данных контакта и его вывод. Как размечать контакты в вёрстке — в разделе Разметка вёрстки → Контакты.
Где хранятся
Все контакты сайта лежат в одной MIGX-TV contacts на ресурсе-хранилище:
- ресурс задаётся настройкой
mpc_contacts_page_id(его псевдоним выбирается в окне установки —mpc_contacts_page_alias, см. Начало работы); - имя TV —
mpc_contacts_tv_name(по умолчаниюcontacts); - контакты не дублируются: записи различаются по ключу (
ckey) и значению.
Заполняются они автоматически при нарезке из размеченной вёрстки — отдельно заводить их в админке не нужно.
Поля контакта
| Поле | Что это |
|---|---|
type | тип: phone, email, social, address, map, worktime, requisite, messenger |
value | само значение (телефон/e-mail/URL/адрес). Для phone хранится только цифрами |
fvalue | форматированное значение для показа. Для phone генерируется из value по настройкам mpc_phone_regexp / mpc_phone_format; для остальных типов равно value, если явно не задано |
caption | подпись («Горячая линия», «Звоните»…). Зависит от плейсмента |
attributes | доп. данные/класс иконки |
icon | путь к иконке (если задан) |
ckey | устойчивый ключ контакта (из data-mpc-key). По нему контакт адресуется в шаблоне |
placement | где выводится: header, footer, … (по умолчанию default) |
Как контакты попадают в вывод
Размечать контакты вручную плейсхолдерами обычно не нужно: вы размечаете блок атрибутами data-mpc-contact / data-mpc-cfield, а нарезка сама подставляет нужные плейсхолдеры. Но полезно понимать структуру, в которой контакты доступны на рендере.
mpc кладёт в область видимости каждой секции массив $contacts вида:
$contacts[<плейсмент>][<ckey>][<поле>]Например, телефон с data-mpc-contact="phone|header" и data-mpc-key="mainphone" будет доступен так:
{$contacts['header']['mainphone']['fvalue']} {* 8 (999) 888-77-66 *}
{$contacts['header']['mainphone']['caption']} {* Горячая линия *}Каждая запись содержит поля из таблицы выше:
$contacts = [
'header' => [
'mainphone' => [
'type' => 'phone',
'value' => '79998887766',
'fvalue' => '8 (999) 888-77-66',
'caption' => 'Горячая линия',
'attributes' => 'icon-phone',
'icon' => '',
'placement' => 'header',
],
],
'footer' => [ /* … */ ],
];Ручной вывод
Когда нужно вывести контакты «по-своему» (списком, в таблице), перебирайте нужный плейсмент. ?? [] страхует от отсутствующего плейсмента:
<ul class="contacts">
{foreach ($contacts['footer'] ?? []) as $contact}
<li class="contacts__item {$contact['attributes']}">
<span class="contacts__caption">{$contact['caption']}</span>
{if $contact['type'] == 'phone'}
<a href="tel:{$contact['value']}">{$contact['fvalue']}</a>
{elseif $contact['type'] == 'email'}
<a href="mailto:{$contact['value']}">{$contact['fvalue']}</a>
{else}
<span>{$contact['fvalue']}</span>
{/if}
</li>
{/foreach}
</ul>
## Сниппет mpcContacts
Для вывода контактов на фронте в комплекте идёт сниппет `mpcContacts`. Он берёт контакты со страницы «Контакты», отбирает нужные по типу, месту и ключу и либо выводит каждый через ваш чанк, либо отдаёт данные массивом.
Вызывать удобнее без кэша — с `!`: `{'!mpcContacts' | snippet:[…]}`.
### Что на вход (параметры)
| Параметр | По умолчанию | Описание |
| ------------------- | --------------- | ---------------------------------------------------------------------------------------------------------- |
| **type** | пусто — любые | Фильтр по типу контакта: `phone`, `email`, `social`, … |
| **placement** | пусто — любые | Фильтр по месту вывода (плейсменту) — то, что указано после `\|` в `data-mpc-contact="тип\|плейсмент"` |
| **key** | пусто — любые | Фильтр по ключу контакта — значение `data-mpc-key` (например, `instagram`) |
| **tpl** | пусто | Чанк для вывода одного контакта (имя чанка или `@INLINE …`). Если не задан — сниппет вернёт JSON-массив |
| **outputSeparator** | `''` | Разделитель между выведенными контактами |
| **limit** | `0` | Максимум контактов (`0` — без ограничения) |
| **toPlaceholder** | пусто | Если задано имя плейсхолдера — результат кладётся в него, а сниппет возвращает пустую строку |
### Что на выход (плейсхолдеры в `&tpl`)
Внутри чанка `&tpl` каждому контакту доступны:
| Плейсхолдер | Описание |
| --------------- | ------------------------------------------------------------------------------------- |
| `{$type}` | тип контакта (`phone`/`email`/`social`/…) |
| `{$value}` | значение (телефон цифрами, email, URL соцсети и т.д.) |
| `{$fvalue}` | отображаемое/форматированное значение (см. «Состав контактов») |
| `{$caption}` | подпись к контакту |
| `{$attributes}` | произвольные атрибуты (обычно класс иконки) |
| `{$icon}` | иконка контакта |
| `{$placement}` | место вывода этого контакта |
| `{$key}` | ключ контакта (`data-mpc-key`) |
Без `&tpl` сниппет возвращает JSON — массив объектов с теми же полями.
### Примеры
Соцсети в футере — каждая ссылкой с иконкой:
```fenom
{'!mpcContacts' | snippet:[
'type' => 'social',
'placement' => 'footer',
'tpl' => '@INLINE <a href="{$value}" class="socials__link" aria-label="{$caption}"><i class="{$attributes}"></i></a>'
]}Один конкретный контакт по ключу:
{'!mpcContacts' | snippet:[
'key' => 'mainphone',
'placement' => 'footer',
'tpl' => '@INLINE <a href="tel:{$value}">{$fvalue}</a>'
]}Без &tpl — получить данные массивом и разобрать самим:
{set $contacts = ('!mpcContacts' | snippet:['type' => 'phone']) | fromJSON}
{foreach $contacts as $c}
<a href="tel:{$c.value}">{$c.fvalue}</a>
{/foreach}Адрес или карту, выведенные одним конкретным блоком, удобнее доставать по ключу напрямую:
{$contacts['footer']['main_address']['value']}Телефоны: формат вывода
Для типа phone значение хранится только цифрами (79998887766), а человекочитаемый вид (fvalue) собирается из него:
mpc_phone_regexp— регулярное выражение, разбивающее номер на группы (по умолчанию/(\d)(\d{3})(\d{3})(\d{2})(\d{2})$/);mpc_phone_format— шаблон подстановки групп (по умолчанию8 (\2) \3-\4-\5).
Так из 79998887766 получается 8 (999) 888-77-66. В href подставляется «сырое» value (tel:79998887766), а в текст ссылки — fvalue.
Перевод контактов (мультиязычность)
Какие под-поля контакта переводятся, задаёт настройка mpc_contact_lexicon_fields. Запись поле переводит его у всех типов, тип:поле — только у контакта этого типа. Типичный случай «адрес зависит от страны, а соцсети и телефон общие»: caption, address:value, address:fvalue. На отдельном блоке набор переопределяет атрибут data-mpc-translate.
Подробный разбор перевода (логика ключей, плейсменты, точечное переопределение) — в разделе Разметка вёрстки → Перевод контактов и Лексиконы и мультиязычность.
