Skip to content
  1. Компоненты
  2. MigxPageConfigurator
  3. Работа с контактами

Работа с контактами

Контакты — это телефоны, почты, адреса, соцсети и мессенджеры, карты, реквизиты, время работы. Они хранятся отдельно от секций — в одном общем хранилище на весь сайт — и доступны на любой странице. Удобство в том, что один и тот же контакт (например, телефон) описывается один раз, а выводиться может в разных местах (шапка, подвал) со своим оформлением.

Эта страница — про модель данных контакта и его вывод. Как размечать контакты в вёрстке — в разделе Разметка вёрстки → Контакты.

Где хранятся

Все контакты сайта лежат в одной 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" будет доступен так:

fenom
{$contacts['header']['mainphone']['fvalue']}   {* 8 (999) 888-77-66 *}
{$contacts['header']['mainphone']['caption']}  {* Горячая линия *}

Каждая запись содержит поля из таблицы выше:

php
$contacts = [
  'header' => [
    'mainphone' => [
      'type'       => 'phone',
      'value'      => '79998887766',
      'fvalue'     => '8 (999) 888-77-66',
      'caption'    => 'Горячая линия',
      'attributes' => 'icon-phone',
      'icon'       => '',
      'placement'  => 'header',
    ],
  ],
  'footer' => [ /* … */ ],
];

Ручной вывод

Когда нужно вывести контакты «по-своему» (списком, в таблице), перебирайте нужный плейсмент. ?? [] страхует от отсутствующего плейсмента:

fenom
<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>'
]}

Один конкретный контакт по ключу:

fenom
{'!mpcContacts' | snippet:[
  'key' => 'mainphone',
  'placement' => 'footer',
  'tpl' => '@INLINE <a href="tel:{$value}">{$fvalue}</a>'
]}

Без &tpl — получить данные массивом и разобрать самим:

fenom
{set $contacts = ('!mpcContacts' | snippet:['type' => 'phone']) | fromJSON}
{foreach $contacts as $c}
  <a href="tel:{$c.value}">{$c.fvalue}</a>
{/foreach}

Адрес или карту, выведенные одним конкретным блоком, удобнее доставать по ключу напрямую:

fenom
{$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.

Подробный разбор перевода (логика ключей, плейсменты, точечное переопределение) — в разделе Разметка вёрстки → Перевод контактов и Лексиконы и мультиязычность.