Секции пользователя (PRO)
Свои поля на форме пользователя MODX: телефон, компания, роль в бизнесе — всё, чего нет в стандартном профиле.
Механизм тот же, что у полей ресурса — секция с полями, — только контекст пользовательский.
Секция
| Настройка | Что делает |
|---|---|
| Название | Заголовок вкладки или панели |
| Контекст | pbUser — секция относится к форме пользователя |
| Размещение | tab, panel или default |
| Описание | Текст над полями |
| Позиция | Порядок среди секций |
| Права | Какие пользователи и группы её видят |
| Опубликована | Неопубликованная секция не рисуется |
Где лежат значения
В modx_user_attributes.extended — JSON-колонке профиля, там же, где MODX держит свои расширенные данные профиля.
Поля пользователя читаются через профиль, а не через пользователя
В MODX в самой строке пользователя почти ничего нет, кроме логина. email, fullname и все свои поля живут в профиле:
$user->email; // пусто
$user->profile->email; // значениеНа этом спотыкаются все по одному разу. Список пользователей с пустыми ячейками — почти всегда это, а не отсутствующее значение.
Сохранение идёт после ядра, и это намеренно
Поля пишутся на OnUserSave — после того, как отработал процессор MODX.
Порядок не случаен. Процессор переписывает extended целиком из того, что прислала форма; запись до него означала бы запись в то, что ядро следом затрёт. Момент после — единственный, в который значение выживает.
Не «оптимизируйте» это на событие раньше
OnBeforeUserFormSave выглядит естественным местом и молча теряет все свои поля. Если добавляете собственный обработчик пользовательских данных — цепляйтесь к тому же событию и по той же причине.
Поля на фронте
Форма профиля на сайте — это обычный контроллер с формой: проверить и записать через профиль. Секция на форме менеджера и форма на сайте — два вида на одно и то же хранилище, отдельного механизма полей для фронта учить не нужно.