Дополнительные поля пользователя без редактирования системных файлов

Благодаря этой заметке я смог добавить несколько новых полей, например orgname. И в админке они успешно сохраняются.
Но, как и у некоторых комментаторов этой ветки, эти поля никак не выводятся. Ни при использовании {$_modx->user.orgname} ни просто в чанке Office.
Я нашел вариант как сделать чтобы эти поля работали — редактировать системные файлы, но…

Я нашел вариант как сделать чтобы эти поля работали можно изменить файлы /core/model/schema/modx.mysql.schema.xml /core/model/modx/mysql/moduser.map.inc.php, но это же не правильно и при обновлении они могут затереться.
Так вот вопрос: Как еще можно указать MODX'у, что нужно подключить эти поля, и чтобы они участвовали во всех процессах, без редактирования системных файлов?
Спасибо
Ivan
02 августа 2024, 16:02
modx.pro
134
0

Комментарии: 8

Ivan
02 августа 2024, 16:25
0
То есть я на onmodxinit вешаю
$modx->map['modUser']['fields']['orgname'] = '';
        $modx->map['modUser']['fieldMeta']['orgname'] = [
            'dbtype' => 'varchar',
            'precision' => '255',
            'phptype' => 'string',
            'null' => true,
            'default' => ''
        ];
и далее поле все равно не доступно
    Ivan
    02 августа 2024, 16:51
    0
    В общем это решение мне не нравится, но оно работает
    switch ($modx->event->name) {
        case "OnMODXInit":
            $fields = [
                'ur' => 0,
                'orgname' => '',
                'inn' => '',    
            ];
            
            $fieldsMeta = [
                'ur' => array(
                    'dbtype' => 'tinyint',
                    'precision' => '1',
                    'phptype' => 'boolean',
                    'attributes' => 'unsigned',
                    'null' => false,
                    'default' => 0,
                ),
                'orgname' => array(
                    'dbtype' => 'varchar',
                    'precision' => '255',
                    'phptype' => 'string',
                    'null' => false,
                ),
                'inn' => array(
                    'dbtype' => 'varchar',
                    'precision' => '255',
                    'phptype' => 'string',
                    'null' => false,
                ),
            ];
            
            $modx->map['modUser']['fields'] = array_merge($modx->map['modUser']['fields'], $fields);
            $modx->map['modUser']['fieldMeta'] = array_merge($modx->map['modUser']['fieldMeta'], $fieldsMeta);
                
            if ($modx->user->get('id') > 0) {
                if ($user = $modx->getObject('modUser', $modx->user->get('id'))) {
                    $modx->user->set('orgname', $user->get('orgname'));
                    $modx->user->set('ur', $user->get('ur'));
                    $modx->user->set('inn', $user->get('inn'));
                }
            }
            break;
    }
    vit
    vit
    02 августа 2024, 21:15
    0
    Установите это и проблема решится сама собой
      Артур Шевченко
      02 августа 2024, 21:49
      +1
      ExtraFields тебе в помощь.
        Ivan
        02 августа 2024, 21:53
        0
        Круто. Посмотрю тогда код компонента как там это реализовано.
          Артур Шевченко
          02 августа 2024, 23:00
          +1
          Скучно тебе, да?
            Ivan
            03 августа 2024, 11:08
            0
            Ну так хочется понять почему не работает)
            Посмотрел. Там используется класс moduserprofile, а не moduser. мб в это дело) А так выполняется абсолютно такой же код…
          vit
          vit
          02 августа 2024, 22:37
          0
          Тоже самое написал. Но сейчас увидел ссылка не вставилась)
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        8