Дополнительные поля профиля юзера (не extended)



Разрабатываю проект, в котором необходимо было реализовать более простое редактирование дополнительных полей профиля, чем есть из коробки. К слову, неудобное редактирование — это не единственный минус нативного способа расширения профиля полями. Ни для кого не секрет, что фильтрацию по JSON полям нормально не осуществить, только костылями. Фактически, мне надо было получить решение, которое бы расширяло стандартный код MODX, не трогая исходники, дабы сохранить карму в порядке возможность обновления системы.
Пришёл к выводу, что буду расширять стандартную вкладку профиля «Общая информация». При желании можно чуть переписать код в событии OnUserFormPrerender и создать свою вкладку со своими полями.

Инструкция получения дополнительных полей, как на скриншоте выше

  1. Первым делом идём в phpMyAdmin (или что-то подобное) и создаём:
    • столбец new_checkbox в таблице modx_users:

      ALTER TABLE `modx_users` ADD `new_checkbox` TINYINT(1) UNSIGNED NOT NULL DEFAULT '1' ;
    • столбец new_field в таблице modx_user_attributes:

      ALTER TABLE `modx_user_attributes` ADD `new_field` VARCHAR(255) NOT NULL ;
     
  2. После этого нам осталось повесить плагин на события OnMODXInit и OnUserFormPrerender:
    switch ($modx->event->name) {
        case "OnMODXInit":
            $map = array(
                'modUser' => array(
                    'fields' => array(
                        'new_checkbox' => 1,
                    ),
                    'fieldMeta' => array(
                        'new_checkbox' => array(
                            'dbtype' => 'tinyint',
                            'precision' => '1',
                            'phptype' => 'boolean',
                            'attributes' => 'unsigned',
                            'null' => false,
                            'default' => 1,
                        ),
                    ),
                ),
                'modUserProfile' => array(
                    'fields' => array(
                        'new_field' => '',
                    ),
                    'fieldMeta' => array(
                        'new_field' => array(
                            'dbtype' => 'varchar',
                            'precision' => '255',
                            'phptype' => 'string',
                            'null' => false,
                        ),
                    ),
                ),
            );
    
            foreach ($map as $class => $data) {
                $modx->loadClass($class);
    
                foreach ($data as $tmp => $fields) {
                    if ($tmp == 'fields') {
                        foreach ($fields as $field => $value) {
                            foreach (array('fields', 'fieldMeta', 'indexes') as $key) {
                                if (isset($data[$key][$field])) {
                                    $modx->map[$class][$key][$field] = $data[$key][$field];
                                }
                            }
                        }
                    } elseif ($tmp == 'composites' || $tmp == 'aggregates') {
                        foreach ($fields as $alias => $relation) {
                            if (!isset($modx->map[$class][$tmp][$alias])) {
                                $modx->map[$class][$tmp][$alias] = $relation;
                            }
                        }
                    }
                }
            }
            break;
        
        case "OnUserFormPrerender":
            if (!isset($user) || $user->get('id') < 1) {
                return;
            }
    
            if (!$modx->getCount('modPlugin', array('name' => 'AjaxManager', 'disabled' => false))) {
                $data['new_checkbox'] = $user->new_checkbox ? 'true' : 'false';
                $data['new_field'] = htmlspecialchars($user->Profile->new_field);
    
                $modx->controller->addHtml("
                    <script type='text/javascript'>
                        Ext.ComponentMgr.onAvailable('modx-user-tabs', function() {
                            this.on('beforerender', function() {
                                // Получаем колонки первой вкладки
                                var leftCol = this.items.items[0].items.items[0].items.items[0];
                                var rightCol = this.items.items[0].items.items[0].items.items[1];
    
                                // Добавляем новое поле в левую колонку 4ым по счёту полем (перед полем 'Email')
                                leftCol.items.insert(4, 'modx-user-new-field', new Ext.form.TextField({
                                    id: 'modx-user-new-field',
                                    name: 'new_field',
                                    fieldLabel: 'Новое поле профиля',
                                    xtype: 'textfield',
                                    anchor: '100%',
                                    maxLength: 255,
                                    value: '{$data['new_field']}',
                                }));
    
                                // Добавляем чекбокс первым по счёту полем (перед чекбоксом 'Активный')
                                rightCol.items.insert(0, 'modx-user-new-checkbox', new Ext.form.Checkbox({
                                    id: 'modx-user-new-checkbox',
                                    name: 'new_checkbox',
                                    hideLabel: true,
                                    boxLabel: 'Новый чекбокс юзера',
                                    description: 'Описание нового чекбокса...',
                                    xtype: 'xcheckbox',
                                    inputValue: 1,
                                    listeners: {
                                        beforerender: function(that) {
                                            that.hiddenField = new Ext.Element(document.createElement('input')).set({
                                                type: 'hidden',
                                                name: that.name,
                                                value: 0,
                                            });
                                        },
                                        afterrender: function(that) {
                                            that.el.insertHtml('beforeBegin', that.hiddenField.dom.outerHTML);
                                        },
                                    },
                                    checked: {$data['new_checkbox']},
                                }));
                            });
                        });
                    </script>
                ");
            }
            break;
    }

Небольшое пояснение, что вообще делает этот плагин

В первом событии (OnMODXInit) происходит расширение модели классов системы нашими дополнительными полями.
Во втором событии (OnUserFormPrerender) мы, перед рендерингом формы юзера, встраиваем наши поля среди уже имеющихся полей профиля.

Итого

Мы получаем свои дополнительные поля данных, встроенные в стандартный MODX, без использования JSON извращения, которое мы имеем из коробки.
Павел Гвоздь
30 мая 2016, 22:36
modx.pro
114
19 552
+19
Поблагодарить автора Отправить деньги

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

Павел Гвоздь
31 мая 2016, 03:57
1
+2
Интересный момент в том, что эти поля можно вызывать во фронтенде, как обычные поля юзера:
[[+modx.user.id:userinfo=`new_checkbox`]]
[[+modx.user.id:userinfo=`new_field`]]
или
{0 | user : 'new_checkbox'}
{0 | user : 'new_field'}
    Александр
    31 мая 2016, 06:27
    0
    Здравствуйте! Возник вопрос: А если, допустим, необходимо добавление полей, но для одной категории юзеров одного набора, а для другой — другого. Например, для пациентов — номер карты, а для врачей — название специализации. Данный способ не подойдет?
      Павел Гвоздь
      31 мая 2016, 07:18
      0
      Что значит «категории юзеров»? Как их разделять будешь? По участию в группе «Пациенты», «Врачи»?
      Вообще можно, если так, но надо понимать, что при назначении группы, смены набора полей происходить не будет. Ибо при входе на страницу редактирования юзера в код будет подгружен один набор полей для нужной группы, либо не будет подгружен никакой вообще, т.к. юзер не состоит ни в той, ни в другой группе. И когда мы будем менять группу у юзера на вкладке «Права доступа», то нам нужно будет совершать перезагрузку страницы вручную, чтобы подгрузить нужный набор полей.
      Проще создать отдельную вкладку для всех новых полей и там разделить их между собой либо подвкладками, как это сделано в новой версии miniShop2, либо FieldSet-ами.
        Impulse
        08 декабря 2017, 08:09
        0
        Привет, наверное вопрос запоздал, но все же как присвоить каждой группе пользователей свои поля? Есть в этом необходимость. Спасибо за ранее
      Антон Пастухов
      31 мая 2016, 12:38
      0
      Меня смущает создание полей в БД вручную, без соответсвующего обновления классов xPDO
      Александр
      01 июня 2016, 05:27
      0
      А возможно ли в качестве x-type указать не 'textfield', а собственный комбобокс. Например, изменив код плагина, вот так?
      $modx->controller->addHtml("
                      <script type='text/javascript'>
                          MODx.combo.moSpecializations = function(config) {
                              config = config || {};
                              Ext.applyIf(config,{
                                  name: 'specialization'
                                  ,hiddenName: 'specialization'
                                  ,displayField: 'title'
                                  ,valueField: 'id'
                                  ,fields: ['title','id']
                                  ,pageSize: 20
                                  ,url: 'core/components/medOffice/processors/'
                                  ,baseParams: {
                                      action: 'mgr/specialization/getlist'
                                  }
                                  ,typeAhead: true
                                  ,editable: true
                              });
                              MODx.combo.moSpecializations.superclass.constructor.call(this,config);
                          };
                          Ext.extend(MODx.combo.moSpecializations,MODx.combo.ComboBox);
                          Ext.reg('modx-combo-specialization',MODx.combo.moSpecializations);
                          
                          Ext.ComponentMgr.onAvailable('modx-user-tabs', function() {
                              this.on('beforerender', function() {
                                  // Получаем колонки первой вкладки
                                  var leftCol = this.items.items[0].items.items[0].items.items[0];
                                  var rightCol = this.items.items[0].items.items[0].items.items[1];
      
                                  // Добавляем новое поле в левую колонку 4ым по счёту полем (перед полем 'Email')
                                  leftCol.items.insert(4, 'modx-user-new-field', new Ext.form.ComboBox({
                                      id: 'modx-user-new-field',
                                      name: 'specialization_id',
                                      fieldLabel: 'Специализация',
                                      xtype: 'modx-combo-specialization',
                                      anchor: '100%',
                                      maxLength: 255,
                                      value: '{$data['specialization_id']}',
                                  }));
      
                                  // Скрытое поле с нулевым значением, для корректной обработки чекбокса при сохранении
                                  ncb_hiddenField = new Ext.Element(document.createElement('input'));
                                  ncb_hiddenField.set({
                                      type: 'hidden',
                                      name: 'new_checkbox',
                                      value: 0,
                                  });
      
                                  // Добавляем чекбокс первым по счёту полем (перед чекбоксом 'Активный')
                                  rightCol.items.insert(0, 'modx-user-new-checkbox', new Ext.form.Checkbox({
                                      id: 'modx-user-new-checkbox',
                                      name: 'is_doctor',
                                      hideLabel: true,
                                      boxLabel: 'Доктор',
                                      description: 'Описание нового чекбокса...',
                                      xtype: 'xcheckbox',
                                      inputValue: 1,
                                      hiddenField: ncb_hiddenField,
                                      listeners: {
                                          afterrender: function(that) {
                                              that.el.insertHtml('beforeBegin', ncb_hiddenField.dom.outerHTML);
                                          }
                                      },
                                      checked: {$data['is_doctor']},
                                  }));
                              });
                          });
                      </script>
                  ");
        Павел Гвоздь
        01 июня 2016, 05:38
        +1
        А возможно проверить, а потом спрашивать, если что-то не получается и проблему не удаётся решить?) Тем более, для проверок есть замечательный хостинг с тестовым тарифом за 0 рублей.
          Александр
          01 июня 2016, 06:53
          0
          Сделал. Получил ошибку. Но не знаю в чем ее причина.
            Павел Гвоздь
            01 июня 2016, 07:01
            +2
            Возможно причина в том, что процессор getlist неправильно отдаёт данные для комбобокса. А возможно, что надо не
            new Ext.form.ComboBox
            а
            new MODx.combo.moSpecializations
            писать.
            Я не могу сказать точно, тебе будет проще всё это проверить самому. И вообще, неплохо почитать исходники компонентов, которые уже делают что-то подобное, например miniShop2 и сравнить со своим кодом. А также, читать документацию по ExtJS 3.4. И пробовать, пробовать, пробовать… У меня только так получается разобраться с ошибками при написании компонентов.
        Abu
        Abu
        05 июня 2016, 18:00
        0
        Таким же макаром получилось выводить extended поле в главном табе пользователя.

        if (!$modx->getCount('modPlugin', array('name' => 'AjaxManager', 'disabled' => false))) {
                    
                    $profile = $user->getOne('Profile');
                    $extended = $profile->get('extended');
                    $field= $extended['field'];
                    
                    $data['extended-field'] = htmlspecialchars($field);
        	    
        	   ....
        Вопрос: как сделать так, чтобы все нормально сохранялось в поле extended, если хочется без доп таблиц?
          Павел Гвоздь
          05 июня 2016, 18:04
          0
          Думаю возможно, но надо будет ещё вешать плагин на событие OnUserSave.

          если хочется без доп таблиц
          Тут нет доп таблиц, здесь ты расширяешь системную таблицу своими полями.
            Павел Гвоздь
            05 июня 2016, 18:08
            +2
            Что-то подобное, на мой взгляд, должно быть на событии OnUserSave:
            /* @var modUser $user */
            if (!isset($user) || $user->get('id') < 1) {
                return;
            }
            
            if ($_REQUEST['HTTP_MODAUTH']) {
                if ($_REQUEST['HTTP_MODAUTH'] == $modx->user->getUserToken($modx->context->get('key'))) {
                    // $modx->log(1, $this->modx->event->name .' '. print_r($_REQUEST,1));
                    
                    if (isset($_REQUEST['extended_field_1'])) {
                        // Здесь будет код, сохраняющий extended поле extended_field_1 в modUserProfile.extended
                    }
                }
            }
            Николай Загумённов
            07 июня 2016, 16:59
            -1
            Интересно? а можно ли как-то переопределить гриду в тикетс?
            Как ни пробую вставлять свой файл comments2.grid.js он все время расположен выше файлов тикетс. Как я понял, чтобы переопределение работало надо, чтобы свой файл подключался ниже файлов тикетс.
              Павел Гвоздь
              07 июня 2016, 18:12
              0
              На событии OnBeforeManagerPageInit проверяешь $action['controller'] на соответствие нужному тебе значению и вставляешь такой код:
              $modx->controller->addLastJavascript('/путь/до/js/файла.js);
                Николай Загумённов
                07 июня 2016, 20:17
                0
                Все равно файл выше проставляется:

                  Павел Гвоздь
                  07 июня 2016, 22:12
                  0
                  А почему у тебя файл в папке с файлами тикетс лежит?
                    Николай Загумённов
                    07 июня 2016, 22:47
                    0
                    Потому что проверяю. Я уж подумал, что есть разница в месте расположении файла и проверил переместив его в другое место))
                    Максим Кузнецов
                    07 июня 2016, 22:54
                    0
                    Возможно, стоит поэкспериментировать с параметром приоритета плагинов (вашего и tickets'a).
                Николай Загумённов
                08 июня 2016, 23:50
                4
                +2
                Спасибо Паше за помощь. Открыл для себя Ext.ComponentMgr.onAvailable.

                Вот такой плагин получился и не надо создавать никаких comments2.grid.js.
                <?php
                switch ($modx->event->name) {
                    case 'OnBeforeManagerPageInit':
                        
                        if ($action['namespace'] == 'tickets' && $action['controller'] == 'index') {
                            $modx->controller->addHtml("<script type='text/javascript'>
                                Ext.ComponentMgr.onAvailable('tickets-home-tabs', function() {
                                    // Тут можно переопределять все что угодно
                                });
                            </script>");
                        }
                        break;
                }
                Bluetenstadt
                16 июня 2016, 16:37
                0
                Дополнительные поля профиля юзера можно ли искать по ним как по простым tv? А то по extended не получается.
                  Павел Гвоздь
                  16 июня 2016, 19:21
                  0
                  Не понял вопроса. Где искать? Каким способом реализован поиск?
                    Воеводский Михаил
                    16 июня 2016, 21:36
                    +1
                    По ним можно будет искать так же, как по username или fullname.
                    stas
                    20 июля 2016, 07:13
                    0
                    С компонентом office не работает, начинаются глюки, при регистрации/авторизации офис начинает выдавать не те сообщения которые нужно, еще крашнулся емейл, отключил плагин, убрал поле из базы, но теперь не могу зарегить или войти через свой емейл, офис пишет что пользователь с таким емейлом уже существует, хотя всех пользователей удалил и у админа другой.
                      Павел Гвоздь
                      20 июля 2016, 08:11
                      0
                      А у меня работает. Почему именно в этом проблему видишь?
                        stas
                        20 июля 2016, 08:21
                        0
                        В общем понял следующее с емейлом разобрался, joxi.ru/12MD1VJI4zP4lm оказалось что из таблицы modx_users пользователь удалился а в таблицы modx_user_attributes пользователь остался, после удаления с емейлом все заработало, то есть с крашнутым емейлом все норм,
                        но в любом случае не понимаю как у вас работает, вот смотрите я включил ваш плагин и при регистрации выдает следующее joxi.ru/D2PDj6MId5Pdg2 хотя в пользователях его нет joxi.ru/ZrJXVE7h1BP962, после чего он добавляется joxi.ru/LmGEV7ktR0Pe5A, но сообщение на мыло не приходит и как можете заметить емейл добавляется не в поле емейл а в имя.
                        авторизация так же глючит я создал пользователя но мне выдает вот такое joxi.ru/D2PDj6MId5Ppg2
                          Павел Гвоздь
                          20 июля 2016, 08:28
                          0
                          Я не знаю, каким образом ты удалял пользователя, что он удалился только из таблицы _users, но точно каким-нибудь квадратно-гнездовым способом, не иначе. Интересно другое… почему ты до сих пор связываешь эти две проблемы? У меня стоит Office и на сайте внедрён этот способ. Всё великолепно работает и есть не просит… Возможно, ты что-то делаешь не так, где-нибудь в другом месте, что у тебя Office отрабатывает некорректно. Давай, ты попробуешь создать на modHost.pro тестовый сайт и воспроизведёшь данную проблему там, ткнув меня носом, что данный способ мешает работе пакета Office, а я утрусь и найду вариант решения проблемы? :)
                            stas
                            20 июля 2016, 08:49
                            0
                            я бы с радостью, но office платный, его можно развернуть там бесплатно? Когда ваш плагин включен не добавляется в таблицу modx_user_attributes пользователь, а в modx_users добавляется, вот что заметил
                              Павел Гвоздь
                              20 июля 2016, 08:53
                              0
                              Скинь доступ к сайту в личку, постараюсь выявить причину.
                                stas
                                20 июля 2016, 09:11
                                0
                                Вы получили доступы? Ответе пожалуйста, а то не понятно отправилось или нет
                                  Павел Гвоздь
                                  20 июля 2016, 09:14
                                  0
                                  Получил и причину, по всей видимости, уже нашёл. Плагин не будет работать корректно, если в базе нет какого-либо поля, используемого в плагине. В данном случае, не было поля new_field в таблице _user_attributes.
                                  Кстати, можно на «ты».

                                  — Обновлено
                                  Ну и как следствие, спокойно зарегистрировался на сайте со своим мылом через форму Office.
                                    stas
                                    20 июля 2016, 09:23
                                    0
                                    Все верно, добавил сюда это поле _user_attributes и заработало! спасибо за оперативность!!!
                                      Павел Гвоздь
                                      20 июля 2016, 09:24
                                      0
                                      Так, давай по порядку. Вижу ты зачем-то перенёс поле new_checkbox в таблицу _user_attributes практически прямо на моих глазах. Этого делать не нужно, по крайней мере, если хочешь, чтобы у тебя корректно всё работало. Перечитай пост о том, где нужно создавать new_checkbox, а где new_field. А потом сравни эту информацию с массивом $map, начинающимся со строки номер 4 данного плагина.

                                      спасибо за оперативность!!!
                                      Рад помочь.
                                        stas
                                        20 июля 2016, 09:30
                                        0
                                        Я вроде допер в чем была проблема, этот плагин рассчитан на то что я добавлю и чек бокс и фиелд, а мне нужен только чек бокс и я фиелд не добавлял, поэтому глючило так получается?
                                        Павел Гвоздь
                                        20 июля 2016, 09:33
                                        0
                                        Нет. Этот плагин расчитан быть развёрнутым в умелых руках. Ну, то есть, порог вхождения здесь определённый есть. По крайней мере, нужно понимать, что делаешь, добавляя эти строки плагина на сайт. Если нужно только одно поле, то нужно вырезать определённые части плагина и переименовать поле так, как нужно тебе.

                                        поэтому глючило так получается?
                                        Именно!
                                        stas
                                        20 июля 2016, 09:36
                                        0
                                        ок я понял, просто мой первый сайт на модиксе, пока не понимаю что добавляю и как работает плагин, учусь, спасибо еще раз!
                                        Павел Гвоздь
                                        20 июля 2016, 09:38
                                        0
                                        Если сайт на MODX первый и с PHP есть определённые трудности, то лучше не нужно использовать это решение, т.к. опять же повторюсь:
                                        порог вхождения здесь определённый есть
                                        Николаевич
                                        21 июля 2016, 21:42
                                        0
                                        Подскажите, пожалуйста, почему не работает
                                        <?php
                                        $user = $modx->getUser();
                                        echo $user->get('new_checkbox');
                                        Павел Гвоздь
                                        21 июля 2016, 23:33
                                        0
                                        Понятия не имею.
                                        Николаевич
                                        21 июля 2016, 23:52
                                        0
                                        т.е. в сниппете никак не получить значение 'new_checkbox'?
                                        Павел Гвоздь
                                        21 июля 2016, 23:53
                                        0
                                        Получить.
                    Алексей
                    19 августа 2016, 06:55
                    0
                    Доброго времени суток!
                    Поле типа minishop2-combo-autocomplete не показывает варианты выбора, пока не начнешь вводить первые буквы в поле ввода. Как сделать обычное поле select с несколькими статичными вариантами выбора?
                      Павел Гвоздь
                      19 августа 2016, 09:08
                      0
                      Насколько мне известно, данный тип предназначен точно не для профиля пользователя, а для ресурсов.
                      На счёт «как сделать» — присмотреться к КомбоБоксу. И вообще, почаще читать документацию той технологии, с которой работаешь. А также, смотреть на уже готовые решения, хотя бы в самом MODX Revolution.
                        Алексей
                        19 августа 2016, 09:42
                        0
                        Я извиняюсь, не знаю как так получилось — мой разум помутился и я промахнулся топиком :) Нужно больше спать. Поле товара минишоп мне нужно с вариантами выбора.
                      Максим
                      07 октября 2016, 06:49
                      1
                      0
                      Здравствуйте. Помогите разобраться. Мне нужно добавить 2 текстовых поля. На данный момент плагин выглядит так
                      <?php
                      switch ($modx->event->name) {
                          case "OnMODXInit":
                              $map = array(
                                  'modUser' => array(
                                      'fields' => array(
                                          'executor' => 1,
                                      ),
                                      'fieldMeta' => array(
                                          'executor' => array(
                                              'dbtype' => 'tinyint',
                                              'precision' => '1',
                                              'phptype' => 'boolean',
                                              'attributes' => 'unsigned',
                                              'null' => false,
                                              'default' => 1,
                                          ),
                                      ),
                                  ),
                                  'modUserProfile' => array(
                                      'fields' => array(
                                          'surname' => '',
                                          'patronymic' => '',
                                      ),
                                      'fieldMeta' => array(
                                          'surname' => array(
                                              'dbtype' => 'varchar',
                                              'precision' => '255',
                                              'phptype' => 'string',
                                              'null' => false,
                                          ),
                                      ),
                                      'fieldMeta' => array(
                                          'patronymic' => array(
                                              'dbtype' => 'varchar',
                                              'precision' => '255',
                                              'phptype' => 'string',
                                              'null' => false,
                                          ),
                                      ),
                                  ),
                              );
                      
                              foreach ($map as $class => $data) {
                                  $modx->loadClass($class);
                      
                                  foreach ($data as $tmp => $fields) {
                                      if ($tmp == 'fields') {
                                          foreach ($fields as $field => $value) {
                                              foreach (array('fields', 'fieldMeta', 'indexes') as $key) {
                                                  if (isset($data[$key][$field])) {
                                                      $modx->map[$class][$key][$field] = $data[$key][$field];
                                                  }
                                              }
                                          }
                                      } elseif ($tmp == 'composites' || $tmp == 'aggregates') {
                                          foreach ($fields as $alias => $relation) {
                                              if (!isset($modx->map[$class][$tmp][$alias])) {
                                                  $modx->map[$class][$tmp][$alias] = $relation;
                                              }
                                          }
                                      }
                                  }
                              }
                              break;
                          
                          case "OnUserFormPrerender":
                              if (!isset($user) || $user->get('id') < 1) {
                                  return;
                              }
                      
                              if (!$modx->getCount('modPlugin', array('name' => 'AjaxManager', 'disabled' => false))) {
                                  $data['executor'] = $user->executor ? 'true' : 'false';
                                  $data['surname'] = htmlspecialchars($user->Profile->surname);
                                  $data['patronymic'] = htmlspecialchars($user->Profile->patronymic);
                      
                                  $modx->controller->addHtml("
                                      <script type='text/javascript'>
                                          Ext.ComponentMgr.onAvailable('modx-user-tabs', function() {
                                              this.on('beforerender', function() {
                                                  // Получаем колонки первой вкладки
                                                  var leftCol = this.items.items[0].items.items[0].items.items[0];
                                                  var rightCol = this.items.items[0].items.items[0].items.items[1];
                      
                                                  // Добавляем новое поле в левую колонку 3ым по счёту полем (перед полем 'Email')
                                                  leftCol.items.insert(3, 'modx-user-new-field', new Ext.form.TextField({
                                                      id: 'modx-user-new-field',
                                                      name: 'surname',
                                                      fieldLabel: 'Фамилия',
                                                      xtype: 'textfield',
                                                      anchor: '100%',
                                                      maxLength: 255,
                                                      value: '{$data['surname']}',
                                                  }));
                                                  
                                                  leftCol.items.insert(4, 'modx-user-patronymic-field', new Ext.form.TextField({
                                                      id: 'modx-user-patronymic-field',
                                                      name: 'patronymic',
                                                      fieldLabel: 'Отчество',
                                                      xtype: 'textfield',
                                                      anchor: '100%',
                                                      maxLength: 255,
                                                      value: '{$data['patronymic']}',
                                                  }));
                      
                                                  // Скрытое поле с нулевым значением, для корректной обработки чекбокса при сохранении
                                                  ncb_hiddenField = new Ext.Element(document.createElement('input'));
                                                  ncb_hiddenField.set({
                                                      type: 'hidden',
                                                      name: 'executor',
                                                      value: 0,
                                                  });
                      
                                                  // Добавляем чекбокс первым по счёту полем (перед чекбоксом 'Активный')
                                                  rightCol.items.insert(0, 'modx-user-new-checkbox', new Ext.form.Checkbox({
                                                      id: 'modx-user-new-checkbox',
                                                      name: 'executor',
                                                      hideLabel: true,
                                                      boxLabel: 'Исполнитель',
                                                      description: 'Назначить пользователя исполнителем',
                                                      xtype: 'xcheckbox',
                                                      inputValue: 1,
                                                      hiddenField: ncb_hiddenField,
                                                      listeners: {
                                                          afterrender: function(that) {
                                                              that.el.insertHtml('beforeBegin', ncb_hiddenField.dom.outerHTML);
                                                          }
                                                      },
                                                      checked: {$data['executor']},
                                                  }));
                                              });
                                          });
                                      </script>
                                  ");
                              }
                              break;
                      }
                      Оба поля в профиле есть, но сохраняется только одно patronymic. Поле surname очищается после сохранения. Подскажите как сохранить оба этих поля?
                        Павел Гвоздь
                        07 октября 2016, 10:38
                        0
                        У вас в $map массиве ошибка. Там, где вы формируете поля для объекта modUserProfile в fieldMeta должен быть список всех полей, а у вас 2 fieldMeta, следовательно второй перезаписывает первого.

                        Проще говоря, вместо:
                        'fieldMeta' => array(
                            'surname' => array(
                                'dbtype' => 'varchar',
                                'precision' => '255',
                                'phptype' => 'string',
                                'null' => false,
                            ),
                        ),
                        'fieldMeta' => array(
                            'patronymic' => array(
                                'dbtype' => 'varchar',
                                'precision' => '255',
                                'phptype' => 'string',
                                'null' => false,
                            ),
                        ),
                        Надо так:
                        'fieldMeta' => array(
                            'surname' => array(
                                'dbtype' => 'varchar',
                                'precision' => '255',
                                'phptype' => 'string',
                                'null' => false,
                            ),
                            'patronymic' => array(
                                'dbtype' => 'varchar',
                                'precision' => '255',
                                'phptype' => 'string',
                                'null' => false,
                            ),
                        ),
                          Максим
                          07 октября 2016, 12:10
                          0
                          Большое спасибо. Все работает)
                        stas
                        25 октября 2016, 08:08
                        0
                        Здравствуйте мне нужно два чекбокс, проблем с текстовыми не возникло а чекбоксы не получается
                        <?php
                        switch ($modx->event->name) {
                            case "OnMODXInit":
                                $map = array(
                                    'modUserProfile' => array(
                                        'fields' => array(
                                            'checkbox_my' => 1,
                                            'new_checkboxMy' => 1,
                                        ),
                                        'fieldMeta' => array(
                                            'checkbox_my' => array(
                                                'dbtype' => 'tinyint',
                                                'precision' => '1',
                                                'phptype' => 'boolean',
                                                'attributes' => 'unsigned',
                                                'null' => false,
                                                'default' => 1,
                                            ),
                                            'new_checkboxMy' => array(
                                                'dbtype' => 'tinyint',
                                                'precision' => '1',
                                                'phptype' => 'boolean',
                                                'attributes' => 'unsigned',
                                                'null' => false,
                                                'default' => 1,
                                            ),
                                        ),
                                    ),
                                );
                        
                                foreach ($map as $class => $data) {
                                    $modx->loadClass($class);
                        
                                    foreach ($data as $tmp => $fields) {
                                        if ($tmp == 'fields') {
                                            foreach ($fields as $field => $value) {
                                                foreach (array('fields', 'fieldMeta', 'indexes') as $key) {
                                                    if (isset($data[$key][$field])) {
                                                        $modx->map[$class][$key][$field] = $data[$key][$field];
                                                    }
                                                }
                                            }
                                        } elseif ($tmp == 'composites' || $tmp == 'aggregates') {
                                            foreach ($fields as $alias => $relation) {
                                                if (!isset($modx->map[$class][$tmp][$alias])) {
                                                    $modx->map[$class][$tmp][$alias] = $relation;
                                                }
                                            }
                                        }
                                    }
                                }
                                break;
                            
                            case "OnUserFormPrerender":
                                if (!isset($user) || $user->get('id') < 1) {
                                    return;
                                }
                        
                                if (!$modx->getCount('modPlugin', array('name' => 'AjaxManager', 'disabled' => false))) {
                                    $data['checkbox_my'] = $user->Profile->checkbox_my ? 'true' : 'false';
                                    $data['new_checkboxMy'] = $user->Profile->new_checkboxMy ? 'true' : 'false';
                        
                                    $modx->controller->addHtml("
                                        <script type='text/javascript'>
                                            Ext.ComponentMgr.onAvailable('modx-user-tabs', function() {
                                                this.on('beforerender', function() {
                                                    
                                                    var leftCol = this.items.items[0].items.items[0].items.items[0];
                                                    var rightCol = this.items.items[0].items.items[0].items.items[1];
                                                    
                        
                                                    ncb_hiddenField = new Ext.Element(document.createElement('input'));
                                                    ncb_hiddenField.set({
                                                        id: 'check_hidden',
                                                        type: 'hidden',
                                                        name: 'checkbox_my',
                                                        value: 0,
                                                    });
                        
                        
                                                    rightCol.items.insert(0, 'modx-user-new-checkbox1', new Ext.form.Checkbox({
                                                        id: 'modx-user-new-checkbox1',
                                                        name: 'checkbox_my',
                                                        hideLabel: true,
                                                        boxLabel: 'Мой чекбокс юзера',
                                                        description: 'Описание нового чекбокса...',
                                                        xtype: 'xcheckbox',
                                                        inputValue: 1,
                                                        hiddenField: ncb_hiddenField,
                                                        listeners: {
                                                            afterrender: function(that) {
                                                                that.el.insertHtml('beforeBegin', ncb_hiddenField.dom.outerHTML);
                                                            }
                                                        },
                                                        checked: {$data['checkbox_my']},
                                                    }));
                                                    
                        
                                                    ncb_hiddenField = new Ext.Element(document.createElement('input'));
                                                    ncb_hiddenField.set({
                                                        id: 'check_hidden1',
                                                        type: 'hidden',
                                                        name: 'new_checkboxMy',
                                                        value: 0,
                                                    });
                        
                        
                                                    leftCol.items.insert(0, 'modx-user-new-checkbox2', new Ext.form.Checkbox({
                                                        id: 'modx-user-new-checkbox2',
                                                        name: 'new_checkboxMy',
                                                        hideLabel: true,
                                                        boxLabel: 'Левый мой чекбокс',
                                                        description: 'Описание нового чекбокса...',
                                                        xtype: 'xcheckbox',
                                                        inputValue: 1,
                                                        hiddenField: ncb_hiddenField,
                                                        listeners: {
                                                            afterrender: function(that) {
                                                                that.el.insertHtml('beforeBegin', ncb_hiddenField.dom.outerHTML);
                                                            }
                                                        },
                                                        checked: {$data['new_checkboxMy']},
                                                    }));
                                                });
                                            });
                                        </script>
                                    ");
                                }
                                break;
                        }
                        как я понял проблема тут
                        ncb_hiddenField = new Ext.Element(document.createElement('input'));
                                                    ncb_hiddenField.set({
                                                        id: 'check_hidden1',
                                                        type: 'hidden',
                                                        name: 'new_checkboxMy',
                                                        value: 0,
                                                    });
                        айдишник check_hidden заменяется check_hidden1 и получается два чекбокса с одним айди, как это исправить? или не в этом проблема?
                          Павел Гвоздь
                          25 октября 2016, 10:53
                          +2
                          Id там вообще не нужно указывать для скрытого поля. Поправил немного код плагина в посте, чтобы таких моментов не возникало больше. Вот код, который ставит на страницу 2 чекбокса — откорректируй под себя:
                          switch ($modx->event->name) {
                              case "OnMODXInit":
                                  $map = array(
                                      'modUserProfile' => array(
                                          'fields' => array(
                                              'cb1' => 1,
                                              'cb2' => 1,
                                          ),
                                          'fieldMeta' => array(
                                              'cb1' => array(
                                                  'dbtype' => 'tinyint',
                                                  'precision' => '1',
                                                  'phptype' => 'boolean',
                                                  'attributes' => 'unsigned',
                                                  'null' => false,
                                                  'default' => 1,
                                              ),
                                              'cb2' => array(
                                                  'dbtype' => 'tinyint',
                                                  'precision' => '1',
                                                  'phptype' => 'boolean',
                                                  'attributes' => 'unsigned',
                                                  'null' => false,
                                                  'default' => 1,
                                              ),
                                          ),
                                      ),
                                  );
                          
                                  foreach ($map as $class => $data) {
                                      $modx->loadClass($class);
                          
                                      foreach ($data as $tmp => $fields) {
                                          if ($tmp == 'fields') {
                                              foreach ($fields as $field => $value) {
                                                  foreach (array('fields', 'fieldMeta', 'indexes') as $key) {
                                                      if (isset($data[$key][$field])) {
                                                          $modx->map[$class][$key][$field] = $data[$key][$field];
                                                      }
                                                  }
                                              }
                                          } elseif ($tmp == 'composites' || $tmp == 'aggregates') {
                                              foreach ($fields as $alias => $relation) {
                                                  if (!isset($modx->map[$class][$tmp][$alias])) {
                                                      $modx->map[$class][$tmp][$alias] = $relation;
                                                  }
                                              }
                                          }
                                      }
                                  }
                                  break;
                              
                              case "OnUserFormPrerender":
                                  if (!isset($user) || $user->get('id') < 1) {
                                      return;
                                  }
                          
                                  if (!$modx->getCount('modPlugin', array('name' => 'AjaxManager', 'disabled' => false))) {
                                      $data['cb1'] = $user->Profile->cb1 ? 'true' : 'false';
                                      $data['cb2'] = $user->Profile->cb2 ? 'true' : 'false';
                          
                                      $modx->controller->addHtml("
                                          <script type='text/javascript'>
                                              Ext.ComponentMgr.onAvailable('modx-user-tabs', function() {
                                                  this.on('beforerender', function() {
                                                      var rightCol = this.items.items[0].items.items[0].items.items[1];
                          
                                                      rightCol.items.insert(0, 'modx-user-cb1', new Ext.form.Checkbox({
                                                          id: 'modx-user-cb1',
                                                          name: 'cb1',
                                                          hideLabel: true,
                                                          boxLabel: 'Новый чекбокс юзера 1',
                                                          description: 'Описание нового чекбокса...',
                                                          xtype: 'xcheckbox',
                                                          inputValue: 1,
                                                          listeners: {
                                                              beforerender: function(that) {
                                                                  that.hiddenField = new Ext.Element(document.createElement('input')).set({
                                                                      type: 'hidden',
                                                                      name: that.name,
                                                                      value: 0,
                                                                  });
                                                              },
                                                              afterrender: function(that) {
                                                                  that.el.insertHtml('beforeBegin', that.hiddenField.dom.outerHTML);
                                                              },
                                                          },
                                                          checked: {$data['cb1']},
                                                      }));
                                                      
                                                      rightCol.items.insert(0, 'modx-user-cb2', new Ext.form.Checkbox({
                                                          id: 'modx-user-cb2',
                                                          name: 'cb2',
                                                          hideLabel: true,
                                                          boxLabel: 'Новый чекбокс юзера 2',
                                                          description: 'Описание нового чекбокса...',
                                                          xtype: 'xcheckbox',
                                                          inputValue: 1,
                                                          listeners: {
                                                              beforerender: function(that) {
                                                                  that.hiddenField = new Ext.Element(document.createElement('input')).set({
                                                                      type: 'hidden',
                                                                      name: that.name,
                                                                      value: 0,
                                                                  });
                                                              },
                                                              afterrender: function(that) {
                                                                  that.el.insertHtml('beforeBegin', that.hiddenField.dom.outerHTML);
                                                              }
                                                          },
                                                          checked: {$data['cb2']},
                                                      }));
                                                  });
                                              });
                                          </script>
                                      ");
                                  }
                                  break;
                          }
                          Игорь Терентьев
                          29 октября 2016, 00:17
                          0
                          У вас там ошибка небольшая (в посте), из-за которой я около часа протупил :)
                          $data['new_checkbox'] = $user->new_checkbox ? 'true' : 'false';
                          А нужно:
                          $data['new_checkbox'] = $user->Profile->new_checkbox ? 'true' : 'false';
                            Павел Гвоздь
                            29 октября 2016, 21:53
                            +1
                            Да нет, в посте такого быть не должно… Может быть вы поменяли массив $map у себя, перенеся поле new_checkbox из modUser в modUserProfile, поэтому у вас такая ошибка была, но если почитаете код, который есть в посте, то там всё корректно.
                              Игорь Терентьев
                              29 октября 2016, 23:11
                              0
                              Точно!
                              На это не обратил внимания:) Спасибо за разъяснение.
                              А в чем принципиальная разница в какой таблице хранить данные? Я добавил все 6 полей в modUserProfile.
                                Павел Гвоздь
                                29 октября 2016, 23:16
                                +1
                                Разница только в их доступности из того или иного класса, на мой взгляд. Если вам проще доставать их из modUserProfile, не делая лишнего обращения к базе, то пожалуйста.
                            Гриборий
                            24 ноября 2016, 02:03
                            0
                            Приветствую. Было бы совсем здорово еще добавить новые поля в табличку на странице со всеми пользователями, с возможностью поиска и сортировки по ним.
                              Владимир Тельнов
                              17 марта 2017, 21:33
                              0
                              Подскажите, пожалуйста, каким образом можно внести изменения в поля new_checkbox и new_field из фронэнда?
                              В частности со страницы редактирования профиля Office и на странице создания заказа MiniShop?

                              Что то простое вида:
                              <input type="text" name="new_field" placeholder="" value="[[+modx.user.id:userinfo=`new_field`]]"/>/code>
                              Данные из новых полей отображаются, но перезаписать или задать новые данные не получается.
                              
                              Догадываюсь, что нужно плагин прикрепить к каким либо событиям, но не знаю к каким.
                              
                              Спасибо.
                                Владимир Тельнов
                                18 марта 2017, 01:58
                                2
                                0
                                Разобрался.

                                У меня стояла задача добавить поля «Дом» и «Номер квартиры» в профиль пользователя и отображать содержимое этих полей при создании нового заказа в miniShop2. Поля building и room — это единственные поля, которые не совпадают с полями в стандартном профиле пользователя, в результате чего при создании нового заказа приходится указывать номер дома и квартиры каждый раз в ручную.

                                Выполнил инструкцию из первого поста. После чего внес изменения в параметры сниппета officeProfile и в чанки tpl.msOrder (miniShop2), tpl.Office.profile.form (Office)

                                Для отображения нового поля в профиле в параметрах сниппета officeProfile, в раздел profileFields необходимо добавить поле new_field и соответствующее поле input
                                <input type="text" name="new_field" placeholder="" value="[[+modx.user.id:userinfo=`new_field`]]"/>
                                Для отображения нового поля при создании нового заказа в чанке tpl.msOrder отредактировал соответсвущий input
                                {foreach ['building'] as $field}
                                	<input type="text" id="{$field}" placeholder="{('ms2_frontend_' ~ $field) | lexicon}"
                                	name="{$field}" value="[[+modx.user.id:userinfo=`new_field`]]"
                                	class="form-control{($field in list $errors) ? ' error' : ''}">                      
                                {/foreach}
                                Dmitry L.
                                09 мая 2017, 13:37
                                0
                                Товарищи, разобрали как сделать текстовые поля и чек-боксы. Можно добавить изображение? Как «photo».
                                А то я сделал два поля, которые:
                                1) Не работают (ставлю галки на вкладке «Системные события» напротив OnMODXInit и OnUserFormPrerender у плагина — блок «Пользователи» не рендериться)
                                2) Просто текстовые

                                switch ($modx->event->name) {
                                    case "OnMODXInit":
                                        $map = array(
                                            'modUser' => array(
                                                'fields' => array(
                                                    'photo01' => '',
                                                ),
                                                'fieldMeta' => array(
                                                    'photo01' => array(
                                                        'dbtype' => 'varchar',
                                                        'precision' => '1',
                                                        'phptype' => 'string',
                                                        'null' => false,
                                                    ),
                                                ),
                                            ),
                                            'modUserProfile' => array(
                                                'fields' => array(
                                                    'photo02' => '',
                                                ),
                                                'fieldMeta' => array(
                                                    'photo02' => array(
                                                        'dbtype' => 'varchar',
                                                        'precision' => '255',
                                                        'phptype' => 'string',
                                                        'null' => false,
                                                    ),
                                                ),
                                            ),
                                        );
                                
                                        foreach ($map as $class => $data) {
                                            $modx->loadClass($class);
                                
                                            foreach ($data as $tmp => $fields) {
                                                if ($tmp == 'fields') {
                                                    foreach ($fields as $field => $value) {
                                                        foreach (array('fields', 'fieldMeta', 'indexes') as $key) {
                                                            if (isset($data[$key][$field])) {
                                                                $modx->map[$class][$key][$field] = $data[$key][$field];
                                                            }
                                                        }
                                                    }
                                                } elseif ($tmp == 'composites' || $tmp == 'aggregates') {
                                                    foreach ($fields as $alias => $relation) {
                                                        if (!isset($modx->map[$class][$tmp][$alias])) {
                                                            $modx->map[$class][$tmp][$alias] = $relation;
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                        break;
                                    
                                    case "OnUserFormPrerender":
                                        if (!isset($user) || $user->get('id') < 1) {
                                            return;
                                        }
                                
                                        if (!$modx->getCount('modPlugin', array('name' => 'AjaxManager', 'disabled' => false))) {
                                            $data['photo01'] = htmlspecialchars($user->Profile->photo01);
                                            $data['photo02'] = htmlspecialchars($user->Profile->photo02);
                                
                                            $modx->controller->addHtml("
                                                <script type='text/javascript'>
                                                    Ext.ComponentMgr.onAvailable('modx-user-tabs', function() {
                                                        this.on('beforerender', function() {
                                                            // Получаем колонки первой вкладки
                                                            var leftCol = this.items.items[0].items.items[0].items.items[0];
                                                            var rightCol = this.items.items[0].items.items[0].items.items[1];
                                
                                                            rightCol.items.insert(14, 'modx-user-photo01', new Ext.form.photo02({
                                                                id: 'modx-user-new-field',
                                                                name: 'photo02',
                                                                fieldLabel: 'Фото 02',
                                                                xtype: 'image',
                                                                anchor: '100%',
                                                                maxLength: 255,
                                                                value: '{$data['photo02']}',
                                                            }));
                                
                                                            rightCol.items.insert(13, 'modx-user-photo02', new Ext.form.photo01({
                                                                id: 'modx-user-new-checkbox',
                                                                name: 'photo01',
                                                                fieldLabel: 'Фото 01',
                                                                xtype: 'image',
                                                                anchor: '100%',
                                                                maxLength: 255,
                                                                value: '{$data['photo01']}',
                                                            }));
                                                        });
                                                    });
                                                </script>
                                            ");
                                        }
                                        break;
                                }
                                  Sergey
                                  16 мая 2017, 18:29
                                  0
                                  Всем доброго времени суток!
                                  У меня возникла необходимость вынести дополнительное поле в отдельную вкладку, но при добавлении параметра «value» она у меня почему-то не отображается, без этого параметра все выводиться, помогите пожалуйста разобраться в чем моя ошибка, вот так я добавляю новую вкладку и вывожу в ней дополнительное поле:

                                  $modx->regClientStartupHTMLBlock('
                                     <script type="text/javascript">
                                        MODx.on("ready",function() {
                                           MODx.addTab("modx-user-tabs",{
                                              title: "Доп. поля",
                                              width: "95%",
                                              items: [{
                                                 id: "modx-user-new-field",
                                                 name: "new_field",
                                                 fieldLabel: "Новое поле профиля",
                                                 xtype: "textfield",
                                                 anchor: "100%",
                                                 maxLength: 255,
                                                 value: "{$data["new_field"]}",
                                              }]
                                           });
                                        });
                                     </script>');
                                  За ранее благодарен за оказанную помощь.
                                    Sergey
                                    18 мая 2017, 17:53
                                    0
                                    Всем спасибо, удалось самостоятельно разобраться со своей проблемой, оказалось, что все дело было в синтаксисе, просто необходимо было заменить кавычки на апостроф, а апостроф на кавычки. :)
                                    Сергей Кузьмин
                                    11 июля 2017, 02:08
                                    0
                                    Хороший, быстрый и простой способ. Создал несколько текстовых полей и при создании пользователя они в админке есть. Но стоит только записать в них значения через api, из админки поля пропадают. Хотя значения в них записываются, и через api с ними работать можно.
                                      Павел Гвоздь
                                      11 июля 2017, 14:14
                                      +1
                                      Это констатация факта или просьба о помощи?) Если просьба, то весь код, который отвечает за поля, в студию!
                                      Сергей Кузьмин
                                      11 июля 2017, 18:27
                                      0
                                      switch ($modx->event->name) {
                                          case "OnMODXInit":
                                              $map = array(
                                                  
                                                  'modUserProfile' => array(
                                                      'fields' => array(
                                                          'firstname' => '',
                                                          'secondname' => '',
                                                          'cardid' => '',
                                                          'last4digit' => '',
                                                          'cardtype' => '',
                                                          'unqcardrefid' => '',
                                                          'cardholder' => '',
                                                          'bin' => '',
                                                          'expyear' => '',
                                                          'expmonth' => '',
                                                      ),
                                                      'fieldMeta' => array(
                                                          'firstname' => array(
                                                              'dbtype' => 'varchar',
                                                              'precision' => '255',
                                                              'phptype' => 'string',
                                                              'null' => false,
                                                          ),
                                                          'secondname' => array(
                                                              'dbtype' => 'varchar',
                                                              'precision' => '255',
                                                              'phptype' => 'string',
                                                              'null' => false,
                                                          ),
                                                          'cardid' => array(
                                                              'dbtype' => 'varchar',
                                                              'precision' => '50',
                                                              'phptype' => 'string',
                                                              'null' => false,
                                                          ),
                                                          'last4digit' => array(
                                                              'dbtype' => 'varchar',
                                                              'precision' => '25',
                                                              'phptype' => 'string',
                                                              'null' => false,
                                                          ),
                                                          'cardtype' => array(
                                                              'dbtype' => 'varchar',
                                                              'precision' => '255',
                                                              'phptype' => 'string',
                                                              'null' => false,
                                                          ),
                                                          'unqcardrefid' => array(
                                                              'dbtype' => 'varchar',
                                                              'precision' => '100',
                                                              'phptype' => 'string',
                                                              'null' => false,
                                                          ),
                                                          'cardholder' => array(
                                                              'dbtype' => 'varchar',
                                                              'precision' => '255',
                                                              'phptype' => 'string',
                                                              'null' => false,
                                                          ),
                                                          'bin' => array(
                                                              'dbtype' => 'varchar',
                                                              'precision' => '100',
                                                              'phptype' => 'string',
                                                              'null' => false,
                                                          ),
                                                          'expyear' => array(
                                                              'dbtype' => 'varchar',
                                                              'precision' => '100',
                                                              'phptype' => 'string',
                                                              'null' => false,
                                                          ),
                                                          'expmonth' => array(
                                                              'dbtype' => 'varchar',
                                                              'precision' => '100',
                                                              'phptype' => 'string',
                                                              'null' => false,
                                                          ),
                                                      ),
                                                  ),
                                              );
                                      
                                              foreach ($map as $class => $data) {
                                                  $modx->loadClass($class);
                                      
                                                  foreach ($data as $tmp => $fields) {
                                                      if ($tmp == 'fields') {
                                                          foreach ($fields as $field => $value) {
                                                              foreach (array('fields', 'fieldMeta', 'indexes') as $key) {
                                                                  if (isset($data[$key][$field])) {
                                                                      $modx->map[$class][$key][$field] = $data[$key][$field];
                                                                  }
                                                              }
                                                          }
                                                      } elseif ($tmp == 'composites' || $tmp == 'aggregates') {
                                                          foreach ($fields as $alias => $relation) {
                                                              if (!isset($modx->map[$class][$tmp][$alias])) {
                                                                  $modx->map[$class][$tmp][$alias] = $relation;
                                                              }
                                                          }
                                                      }
                                                  }
                                              }
                                              break;
                                          
                                          case "OnUserFormPrerender":
                                              if (!isset($user) || $user->get('id') < 1) {
                                                  return;
                                              }
                                      
                                              if (!$modx->getCount('modPlugin', array('name' => 'AjaxManager', 'disabled' => false))) {
                                                  
                                                  $data['firstname'] = htmlspecialchars($user->Profile->firstname);
                                                  $data['secondname'] = htmlspecialchars($user->Profile->secondname);
                                                  $data['cardid'] = htmlspecialchars($user->Profile->cardid);
                                                  $data['last4digit'] = htmlspecialchars($user->Profile->last4digit);
                                                  $data['cardtype'] = htmlspecialchars($user->Profile->cardtype);
                                                  $data['unqcardrefid'] = htmlspecialchars($user->Profile->unqcardrefid);
                                                  $data['cardholder'] = htmlspecialchars($user->Profile->cardholder);
                                                  $data['bin'] = htmlspecialchars($user->Profile->bin);
                                                  $data['expyear'] = htmlspecialchars($user->Profile->expyear);
                                                  $data['expmonth'] = htmlspecialchars($user->Profile->expmonth);
                                      
                                                  $modx->controller->addHtml("
                                                      <script type='text/javascript'>
                                                          Ext.ComponentMgr.onAvailable('modx-user-tabs', function() {
                                                              this.on('beforerender', function() {
                                                                  // Получаем колонки первой вкладки
                                                                  var leftCol = this.items.items[0].items.items[0].items.items[0];
                                                                  
                                      
                                                                  // Добавляем новое поле в левую колонку 4ым по счёту полем (перед полем 'Email')
                                                                  leftCol.items.insert(4, 'modx-user-firstname', new Ext.form.TextField({
                                                                      id: 'modx-user-firstname',
                                                                      name: 'firstname',
                                                                      fieldLabel: 'Имя',
                                                                      xtype: 'textfield',
                                                                      anchor: '100%',
                                                                      maxLength: 255,
                                                                      value: '{$data['firstname']}',
                                                                  }));
                                                                  
                                                                  leftCol.items.insert(5, 'modx-user-secondname', new Ext.form.TextField({
                                                                      id: 'modx-user-secondname',
                                                                      name: 'secondname',
                                                                      fieldLabel: 'Фамилия',
                                                                      xtype: 'textfield',
                                                                      anchor: '100%',
                                                                      maxLength: 255,
                                                                      value: '{$data['secondname']}',
                                                                  }));
                                                                  
                                                                  leftCol.items.insert(6, 'modx-user-cardid', new Ext.form.TextField({
                                                                      id: 'modx-user-cardid',
                                                                      name: 'cardid',
                                                                      fieldLabel: 'card - ref - id',
                                                                      xtype: 'textfield',
                                                                      anchor: '50%',
                                                                      maxLength: 50,
                                                                      value: '{$data['cardid']}',
                                                                  }));
                                                                  
                                                                  leftCol.items.insert(7, 'modx-user-last4digit', new Ext.form.TextField({
                                                                      id: 'modx-user-last4digit',
                                                                      name: 'last4digit',
                                                                      fieldLabel: 'Последние 4 цифры карты',
                                                                      xtype: 'textfield',
                                                                      anchor: '25%',
                                                                      maxLength: 25,
                                                                      value: '{$data['last4digit']}',
                                                                  }));
                                                                  
                                                                  leftCol.items.insert(8, 'modx-user-cardtype', new Ext.form.TextField({
                                                                      id: 'modx-user-cardtype',
                                                                      name: 'cardtype',
                                                                      fieldLabel: 'Тип карты',
                                                                      xtype: 'textfield',
                                                                      anchor: '100%',
                                                                      maxLength: 255,
                                                                      value: '{$data['cardtype']}',
                                                                  }));
                                                                  
                                                                  leftCol.items.insert(9, 'modx-user-unqcardrefid', new Ext.form.TextField({
                                                                      id: 'modx-user-unqcardrefid',
                                                                      name: 'unqcardrefid',
                                                                      fieldLabel: 'unq-card-ref-id',
                                                                      xtype: 'textfield',
                                                                      anchor: '50%',
                                                                      maxLength: 100,
                                                                      value: '{$data['unqcardrefid']}',
                                                                  }));
                                                                  
                                                                  leftCol.items.insert(10, 'modx-user-cardholder', new Ext.form.TextField({
                                                                      id: 'modx-user-cardholder',
                                                                      name: 'cardholder',
                                                                      fieldLabel: 'Владелец карты',
                                                                      xtype: 'textfield',
                                                                      anchor: '100%',
                                                                      maxLength: 255,
                                                                      value: '{$data['cardholder']}',
                                                                  }));
                                                                  
                                                                  leftCol.items.insert(11, 'modx-user-bin', new Ext.form.TextField({
                                                                      id: 'modx-user-bin',
                                                                      name: 'bin',
                                                                      fieldLabel: 'Идентификатор банка',
                                                                      xtype: 'textfield',
                                                                      anchor: '50%',
                                                                      maxLength: 100,
                                                                      value: '{$data['bin']}',
                                                                  }));
                                                                  
                                                                  leftCol.items.insert(12, 'modx-user-expyear', new Ext.form.TextField({
                                                                      id: 'modx-user-expyear',
                                                                      name: 'expyear',
                                                                      fieldLabel: 'Год действия карты',
                                                                      xtype: 'textfield',
                                                                      anchor: '25%',
                                                                      maxLength: 100,
                                                                      value: '{$data['expyear']}',
                                                                  }));
                                                                  
                                                                  leftCol.items.insert(13, 'modx-user-expmonth', new Ext.form.TextField({
                                                                      id: 'modx-user-expmonth',
                                                                      name: 'expmonth',
                                                                      fieldLabel: 'Месяц действия карты',
                                                                      xtype: 'textfield',
                                                                      anchor: '25%',
                                                                      maxLength: 100,
                                                                      value: '{$data['expmonth']}',
                                                                  }));
                                      
                                                                  
                                                              });
                                                          });
                                                      </script>
                                                  ");
                                              }
                                              break;
                                      }
                                        Павел Гвоздь
                                        13 июля 2017, 07:31
                                        0
                                        Что-то у вас на сайте не так… При создании юзера поля, априори, отображаться не могут, это в коде сказано строкой:
                                        if (!isset($user) || $user->get('id') < 1) {
                                            return;
                                        }
                                        Однако, после сохранения юзера на тестовом сайте modhost.pro, все отлично работает. И данные вводятся в поля, и редактировать их можно.
                                          Сергей Кузьмин
                                          13 июля 2017, 15:28
                                          0
                                          Я наверно не правильно выразился. С созданием все в порядке. После создания пользователя поля в админке видны и редактируются нормально. Но после выполнения скрипта с записью в эти поля, они пропадают из админки.
                                            Павел Гвоздь
                                            13 июля 2017, 17:34
                                            0
                                            А что это за
                                            скрипт с записью в эти поля
                                            ?
                                              Сергей Кузьмин
                                              13 июля 2017, 18:00
                                              0
                                              Сразу предупреждаю, что это мой первый сниппет, сильно прошу не пинать…
                                              часть снипета с записью в поля:
                                              $profile = $modx->user->getOne('Profile');
                                              $profile->set('cardid', $cardrefid);
                                              $profile->set('unqcardrefid', $unqcardrefid);
                                              $profile->set('cardholder', $cardholder);
                                              $profile->set('bin', $bin);
                                              $profile->set('last4digit', $last4digit);
                                              $profile->set('expyear', $expyear);
                                              $profile->set('expmonth', $expmonth);
                                              $profile->save();

                                              как то так
                                                Павел Гвоздь
                                                13 июля 2017, 18:05
                                                0
                                                Я не знаю, что вы там делаете, но у меня все работает, после записи таким образом, в эти новые поля, каких-либо данных.
                                                  Сергей Кузьмин
                                                  13 июля 2017, 18:44
                                                  0
                                                  Вот и не знаю в чем проблема… Но для меня это на данный момент не принципиально. Через фронтенд данные записываются и извлекаются, в бд хранятся. Редактирование их в админке,
                                                  не критично. Повторюсь сам метод мне понятен, прост и мне вполне подходит. Спасибо за него
                                                  Павлу.
                                        Илья И
                                        12 июля 2017, 14:03
                                        0
                                        Здравствуйте! Я добавил таким методом необходимые поля, и они отлично работают. Но теперь я пытаюсь импортировать большое количество пользователей их excel-файла с помощью приложения User Import 1.0.0-pl. И тут проблема: оно игнорирует все эти поля, и вместо них записывает данные в extended, как будто этих полей у пользователя нет. В чем может быть дело? Можно ли его как-то научить? Или может есть способ импортировать как-то иначе?
                                          Сергей Кузьмин
                                          12 июля 2017, 19:29
                                          0
                                          Проблема в том что User Import не знает о существовании добавленных полей. Импортировать наверно можно через самописный плагин заточенный на работу с твоими полями.
                                            Илья И
                                            14 июля 2017, 15:43
                                            0
                                            Именно так и оказалось, не знает. Решилась проблема до глупости просто: нашел, где у этого приложения прописываются поля, это всего один файл:
                                            core\components\userimport\model\userimport\importhandler.class.php
                                            Вписал туда соответствующие строки в двух местах, по образу и подобию уже имеющихся, и всё сработало, юзеры импортировались как надо. Просто когда в первый раз искал где оно прописано, по невнимательности пропустил этот файл, и решил что приложение берет список полей откуда-то еще.
                                            Сергей Кузьмин
                                            12 июля 2017, 19:30
                                            0
                                            Ну или через админку ручками забивать.
                                            Ksu
                                            Ksu
                                            19 июля 2017, 16:04
                                            0
                                            Подскажите по полю с датой (в примере добавляют 2 поля, а как добавить одно? Наверное нужно какие-то array убрать?)
                                            Добавляю копию поля dob и называю dov (Хочу добиться результата, чтобы в админке одинаково они вывелись)
                                            Получился плагин
                                            <?php
                                            switch ($modx->event->name) {
                                                case "OnMODXInit":
                                                    $map = array(
                                                        'modUserProfile' => array(
                                                            'fields' => array(
                                                                'dov' => '',
                                                            ),
                                                            'fieldMeta' => array(
                                                                'dov' => array(
                                                                    'dbtype' => 'int',
                                                                    'precision' => '10',
                                                                    'phptype' => 'integer',
                                                                    'null' => false,
                                                                    'default' => 0,
                                                                ),
                                                            ),
                                                        ),
                                                    );
                                            
                                                    foreach ($map as $class => $data) {
                                                        $modx->loadClass($class);
                                            
                                                        foreach ($data as $tmp => $fields) {
                                                            if ($tmp == 'fields') {
                                                                foreach ($fields as $field => $value) {
                                                                    foreach (array('fields', 'fieldMeta', 'indexes') as $key) {
                                                                        if (isset($data[$key][$field])) {
                                                                            $modx->map[$class][$key][$field] = $data[$key][$field];
                                                                        }
                                                                    }
                                                                }
                                                            } elseif ($tmp == 'composites' || $tmp == 'aggregates') {
                                                                foreach ($fields as $alias => $relation) {
                                                                    if (!isset($modx->map[$class][$tmp][$alias])) {
                                                                        $modx->map[$class][$tmp][$alias] = $relation;
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                    break;
                                                
                                                case "OnUserFormPrerender":
                                                    if (!isset($user) || $user->get('id') < 1) {
                                                        return;
                                                    }
                                            
                                                    if (!$modx->getCount('modPlugin', array('name' => 'AjaxManager', 'disabled' => false))) {
                                                        $data['dov'] = htmlspecialchars($user->Profile->new_field);
                                            
                                                        $modx->controller->addHtml("
                                                            <script type='text/javascript'>
                                                                Ext.ComponentMgr.onAvailable('modx-user-tabs', function() {
                                                                    this.on('beforerender', function() {
                                                                        // Получаем колонки первой вкладки
                                                                        var leftCol = this.items.items[0].items.items[0].items.items[0];
                                                                        var rightCol = this.items.items[0].items.items[0].items.items[1];
                                            
                                                                        // Добавляем новое поле в левую колонку 14ым по счёту полем (перед полем 'Email')
                                                                        leftCol.items.insert(14, 'modx-user-dov', new Ext.form.TextField({
                                                                            id: 'modx-user-dov'
                                                                ,name: 'dov'
                                                                ,fieldLabel: _('user_dov')
                                                                ,xtype: 'datefield'
                                                                ,width: 200
                                                                ,allowBlank: true
                                                                ,format: MODx.config.manager_date_formatid
                                                                ,value: '{$data['dov']}'
                                                                        }));
                                                                    });
                                                                });
                                                            </script>
                                                        ");
                                                    }
                                                    break;
                                            }
                                            Поле появляется там, где надо, но без кнопки с календарём и дата в unix формате вместо обычного.
                                              Ksu
                                              Ksu
                                              19 июля 2017, 17:05
                                              0
                                              Чтобы появился выбор с календарем, надо было заменить new Ext.form.TextField на new Ext.form.DateField
                                                Ksu
                                                Ksu
                                                19 июля 2017, 19:03
                                                0
                                                Всё хорошо, только дата не выводится в админке(а на сайте выводится уже
                                                [[+modx.user.id:userinfo=`dov`]]
                                                ) и похоже, не сохраняется.
                                                Если использовать textfield то выводится дата в unix, а если datefield, то ничего не выводится.
                                                Что надо написать, чтобы в админке дата нормально выводилась?

                                                <?php
                                                switch ($modx->event->name) {
                                                    case "OnMODXInit":
                                                        $map = array(
                                                            'modUserProfile' => array(
                                                                'fields' => array(
                                                                    'dov' => '',
                                                                ),
                                                                'fieldMeta' => array(
                                                                    'dov' => array(
                                                                        'dbtype' => 'int',
                                                                        'precision' => '10',
                                                                        'phptype' => 'integer',
                                                                        'null' => false,
                                                                        'default' => 0,
                                                                    ),
                                                                ),
                                                            ),
                                                        );
                                                
                                                        foreach ($map as $class => $data) {
                                                            $modx->loadClass($class);
                                                
                                                            foreach ($data as $tmp => $fields) {
                                                                if ($tmp == 'fields') {
                                                                    foreach ($fields as $field => $value) {
                                                                        foreach (array('fields', 'fieldMeta', 'indexes') as $key) {
                                                                            if (isset($data[$key][$field])) {
                                                                                $modx->map[$class][$key][$field] = $data[$key][$field];
                                                                            }
                                                                        }
                                                                    }
                                                                } elseif ($tmp == 'composites' || $tmp == 'aggregates') {
                                                                    foreach ($fields as $alias => $relation) {
                                                                        if (!isset($modx->map[$class][$tmp][$alias])) {
                                                                            $modx->map[$class][$tmp][$alias] = $relation;
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                        }
                                                        break;
                                                    
                                                    case "OnUserFormPrerender":
                                                        if (!isset($user) || $user->get('id') < 1) {
                                                            return;
                                                        }
                                                
                                                        if (!$modx->getCount('modPlugin', array('name' => 'AjaxManager', 'disabled' => false))) {
                                                            $data['dov'] = $user->Profile->dov;
                                                
                                                            $modx->controller->addHtml("
                                                                <script type='text/javascript'>
                                                                    Ext.ComponentMgr.onAvailable('modx-user-tabs', function() {
                                                                        this.on('beforerender', function() {
                                                                            // Получаем колонки первой вкладки
                                                                            var leftCol = this.items.items[0].items.items[0].items.items[0];
                                                                            var rightCol = this.items.items[0].items.items[0].items.items[1];
                                                
                                                                            // Добавляем новое поле в левую колонку 15ым по счёту полем (перед полем 'Email')
                                                                    leftCol.items.insert(15, 'modx-user-dov', new Ext.form.DateField({
                                                                    id: 'modx-user-dov',
                                                                    name: 'dov',
                                                                    fieldLabel: 'Дата 2',
                                                                    xtype: 'datefield',
                                                                    width: 200,
                                                                    allowBlank: true,
                                                                    format: MODx.config.manager_date_format,
                                                                    value: '{$data['dov']}',
                                                                            }));
                                                                        });       
                                                                    });
                                                                </script>
                                                            ");
                                                        }
                                                        break;
                                                }
                                                  Ksu
                                                  Ksu
                                                  20 июля 2017, 11:35
                                                  0
                                                  Если заменить
                                                  $data['dov'] = $user->Profile->dov;
                                                  на
                                                  $data['dov'] = date('Y-m-d',$user->Profile->dov);
                                                  то дата в админке выводится верно, но при изменении сохраняется в не правильном формате. И не вижу в коде плагина место, отвечающее за формат сохранения. Подскажите пожалуйста куда смотреть…
                                                    Павел Гвоздь
                                                    20 июля 2017, 11:41
                                                    0
                                                    Смотрите в сторону соответствующих событий плагинов. По-моему OnUserSave и OnBeforeUserSave…
                                                      Ксения
                                                      14 мая 2018, 12:23
                                                      0
                                                      Может есть какой-то пример по работе с датами? Сделала копию столбца dob и назвала dov. Все что ни делала приводит к тому, что если в phpmyadmin в одинаковых столбцах стоят 0, то в админке у пользователя в первом поле пусто, а в новом 1970-01-01. Что приводит к проблемам при сохранении (если сохранить пользователя у которого стоит в админке 1970-01-01 то в БД вместо 0 появится -10800, замкнутый круг) В остальном всё работает, только вот эти ноли.
                                                        Павел Гвоздь
                                                        15 мая 2018, 18:45
                                                        0
                                                        Эта проблема связана с TIMESTAMP. По сути по UNIX TIMESTAMP:
                                                        0 = 1970-01-01
                                                        Больше ничего подсказать не смогу, надо разбираться непосредственно с вашей проблемой. 1 час = 2к руб.
                                                    Ksu
                                                    Ksu
                                                    20 июля 2017, 11:51
                                                    0
                                                    Надо было заменить
                                                    'phptype' => 'integer',
                                                    на
                                                    'phptype' => 'date'
                                                    и всё заработало(((
                                                    (несмотря на то, что сам modx в схеме для dob использует 'phptype' => 'integer',)
                                                  Андрей
                                                  03 октября 2017, 08:38
                                                  0
                                                  Доброго времени суток, а каким образом сделать поле выпадающим списком когда в базе json массив?
                                                    Rootiys
                                                    21 февраля 2018, 07:14
                                                    0
                                                    Не получается вывести чекбокс на фронте в личном кабинете
                                                    <input type="checkbox" id="new_checkbox" name="new_checkbox" value="{0 | user : 'new_checkbox'}">
                                                    Всегда выводится пустой. При изменении, не сохраняется.
                                                    new_field выводится и сохраняется.
                                                    Как правильно вывести checkbox на фронте?
                                                      Владимир Тельнов
                                                      21 февраля 2018, 10:05
                                                      0
                                                      У меня была такая же проблема modx.pro/howto/8889/#comment-77917
                                                      Новые поля необходимо добавить в параметры сниппета officeProfile
                                                        Rootiys
                                                        21 февраля 2018, 10:13
                                                        0
                                                        Так и сделал, добавил в officeProfile new_checkbox. Чекбокс не выводится и не сохраняется.
                                                        С полем new_field все нормально.
                                                          Владимир Тельнов
                                                          21 февраля 2018, 10:23
                                                          0
                                                          В чанке tpl.Office.profile.form новые поля вывожу вот так?

                                                          <input type="text" name="kvartira" placeholder="кв. 87" value="[[+kvartira]]" class="form-control "/>
                                                          kvartira — новое поле
                                                            Rootiys
                                                            21 февраля 2018, 10:40
                                                            0
                                                            С текстовым полем у меня проблем нет. Проблема именно с чекбоксом. Не могу ни как завести его.
                                                              Павел Гвоздь
                                                              21 февраля 2018, 20:00
                                                              0
                                                              Прежде всего надо узнать, сохраняются ли данные чекбокса в базе. Если да, то надо бы вам подучить HTML, т.к. у input[type=checkbox] есть атрибут checked, который отвечает за «чекнутость» (простите) чекбокса.
                                                                Rootiys
                                                                22 февраля 2018, 06:12
                                                                0
                                                                В базе сохраняется, если в админке чекать.
                                                                Не подскажите, как правильно вывести на фронте?
                                                                  Дмитрий Иванов
                                                                  22 февраля 2018, 10:10
                                                                  -1
                                                                  Вам же сказали, нет никакого value у чекбокса, используйте атрибут checked
                                                                    Павел Гвоздь
                                                                    22 февраля 2018, 11:20
                                                                    0
                                                                    Не вводите в заблуждение людей, я не говорил, что у чекбокса нет value…
                                                                    Павел Гвоздь
                                                                    22 февраля 2018, 11:20
                                                                    0
                                                                    Примерно так:
                                                                    <input type="checkbox" id="new_checkbox" name="new_checkbox" value="1" {(0 | user : 'new_checkbox') ? 'checked' : ''}">
                                                                      Rootiys
                                                                      22 февраля 2018, 11:38
                                                                      0
                                                                      Спасибо! Но чекбокс сохраняется только когда ставлю его. Когда снимаю и сохраняю — в базу не записывается.
                                                                        Павел Гвоздь
                                                                        22 февраля 2018, 11:42
                                                                        +1
                                                                        Разве не очевидно? Значит не передаётся на сервер значение. Перед вашим чекбоксом прописываете скрытое поле с нулевым value, которое передастся, если чекбокс не чекнут.
                                                                          Rootiys
                                                                          22 февраля 2018, 11:46
                                                                          0
                                                                          Спасибо, добрый человек!
                                                                          Заработало.
                                                                          Николай
                                                                          06 февраля 2020, 15:11
                                                                          0
                                                                          А можно пример скрытого поля, а то как я его только не добавлял, не получается записать в БД 0 для чекбокса.
                                                      UDAV
                                                      04 апреля 2018, 13:20
                                                      0
                                                      А как тип textarea добавить? В базе поле типа text добавил. В плагине пробовал разные xtype но не помогает ничего… все равно инпут.
                                                        Павел Гвоздь
                                                        04 апреля 2018, 13:26
                                                        +1
                                                        Всё тут.
                                                        leftCol.items.insert(4, 'modx-user-new-field', new Ext.form.TextArea({
                                                            id: 'modx-user-new-field',
                                                            name: 'new_field',
                                                            fieldLabel: 'Новое поле профиля',
                                                            xtype: 'textarea',
                                                            anchor: '100%',
                                                            maxLength: 255,
                                                            value: '{$data['new_field']}',
                                                        }));
                                                          UDAV
                                                          04 апреля 2018, 13:36
                                                          0
                                                          Спасибо большое. Оказывается вот тут тип поля задается Ext.form.TextArea -)
                                                        Lori
                                                        11 октября 2018, 09:52
                                                        0
                                                        а как создать поле для хранения тэгов (т.е. array видимо) для юзера?
                                                        пробовал
                                                        ALTER TABLE `modx_user_attributes` ADD `user_tags` text[] NOT NULL;
                                                        , но в итоге вышла ошибка
                                                          Ислам Алиев
                                                          04 июля 2019, 14:51
                                                          0
                                                          Доброго времени суток!

                                                          А каким образом можно использовать текстовый редактор например TinyMCE вместо обычных полей?
                                                          Заранее благодарю за ответ.
                                                            Алексей
                                                            21 августа 2019, 11:55
                                                            0
                                                            Добрый день.
                                                            Подскажите как можно сделать чтобы checkbox по умолчанию был не отмеченным?

                                                            Уже исправил значения столбца по умолчанию в БД на DEFAULT '0'
                                                            и в плагине заменил
                                                            'fieldMeta' => array(
                                                                                'new_checkbox' => array(
                                                                                    'dbtype' => 'tinyint',
                                                                                    'precision' => '1',
                                                                                    'phptype' => 'boolean',
                                                                                    'attributes' => 'unsigned',
                                                                                    'null' => false,
                                                                                    'default' => 1,  <-- заменил на 0
                                                                                ),
                                                            и всё равно при регистрации нового пользователя у него по умолчанию отмечен checkbox.
                                                            А у пользователей которые были ранее зарегистрированны checkbox'ы не стоят.
                                                              Николай
                                                              05 февраля 2020, 17:45
                                                              0
                                                              А как созданные поля изменить из фронтенда без применения дополнения типа Office, В ЛК есть несколько вкладок на одной из них уже есть
                                                              [[!Office?
                                                                  &action=`Profile`
                                                                  &tplProfile=`Office.profile.form_tpl`
                                                                  &profileFields=`username,email,phone,dob,extended[insta]`
                                                              ]]
                                                              нужен похожий способ что бы внести изменения в новые поля.
                                                                Андрей
                                                                05 февраля 2020, 18:38
                                                                0
                                                                Можно написать свой сниппет, можно использовать UpdateProfile из набора компонента Login.
                                                                Николай
                                                                06 февраля 2020, 13:52
                                                                0
                                                                Все же не получается завести в форме Office checkbox
                                                                Добавил такое поле:
                                                                <input type="checkbox" id="spam_email" class="jqIgnore" name="spam_email" value="1" {(0 | user : 'spam_email') ? 'checked' : ''}>
                                                                Оно отображает текущее состояние чекбокса, но при изменении значения не меняет и в базу не сохраняет
                                                                где я что то упустил?
                                                                Если менять в бекенде то все меняется и в базу пишет нормально. И если менять в беке то и на фронте меняет значение.
                                                                  Николай
                                                                  06 февраля 2020, 14:36
                                                                  0
                                                                  UPD: добился того, что бы в базу записывало состояние checked, однако в бекенд состояние почему то не передается, то есть галочка не появляется в беке, потому, если Пользователя сохранить — состояние сбрасывается на 0 и в БД перезаписывается.
                                                                  мой вызов:
                                                                  <?php
                                                                  switch ($modx->event->name) {
                                                                      case "OnMODXInit":
                                                                          $map = array(
                                                                              'modUser' => array(
                                                                                  'fields' => array(
                                                                                      'spam_sms' => 1,
                                                                                      'spam_viber' => 1,
                                                                                      'spam_email' => 1,
                                                                                      'zak_email' => 1,
                                                                                      'zak_sms' => 1,
                                                                                      'zak_viber' => 1,
                                                                            
                                                                                  ),
                                                                                  'fieldMeta' => array(
                                                                                      'spam_email' => array(
                                                                                          'dbtype' => 'tinyint',
                                                                                          'precision' => '1',
                                                                                          'phptype' => 'boolean',
                                                                                          'attributes' => 'unsigned',
                                                                                          'null' => false,
                                                                                          'default' => 1,
                                                                                      ),
                                                                                      'spam_viber' => array(
                                                                                          'dbtype' => 'tinyint',
                                                                                          'precision' => '1',
                                                                                          'phptype' => 'boolean',
                                                                                          'attributes' => 'unsigned',
                                                                                          'null' => false,
                                                                                          'default' => 1,
                                                                                      ),
                                                                                      'spam_sms' => array(
                                                                                          'dbtype' => 'tinyint',
                                                                                          'precision' => '1',
                                                                                          'phptype' => 'boolean',
                                                                                          'attributes' => 'unsigned',
                                                                                          'null' => false,
                                                                                          'default' => 1,
                                                                                      ),
                                                                                      'zak_email' => array(
                                                                                          'dbtype' => 'tinyint',
                                                                                          'precision' => '1',
                                                                                          'phptype' => 'boolean',
                                                                                          'attributes' => 'unsigned',
                                                                                          'null' => false,
                                                                                          'default' => 1,
                                                                                      ),
                                                                                      'zak_sms' => array(
                                                                                          'dbtype' => 'tinyint',
                                                                                          'precision' => '1',
                                                                                          'phptype' => 'boolean',
                                                                                          'attributes' => 'unsigned',
                                                                                          'null' => false,
                                                                                          'default' => 1,
                                                                                      ),
                                                                                      'zak_email' => array(
                                                                                          'dbtype' => 'tinyint',
                                                                                          'precision' => '1',
                                                                                          'phptype' => 'boolean',
                                                                                          'attributes' => 'unsigned',
                                                                                          'null' => false,
                                                                                          'default' => 1,
                                                                                      ),
                                                                                  ),
                                                                              ),
                                                                          );
                                                                  
                                                                          foreach ($map as $class => $data) {
                                                                              $modx->loadClass($class);
                                                                  
                                                                              foreach ($data as $tmp => $fields) {
                                                                                  if ($tmp == 'fields') {
                                                                                      foreach ($fields as $field => $value) {
                                                                                          foreach (array('fields', 'fieldMeta', 'indexes') as $key) {
                                                                                              if (isset($data[$key][$field])) {
                                                                                                  $modx->map[$class][$key][$field] = $data[$key][$field];
                                                                                              }
                                                                                          }
                                                                                      }
                                                                                  } elseif ($tmp == 'composites' || $tmp == 'aggregates') {
                                                                                      foreach ($fields as $alias => $relation) {
                                                                                          if (!isset($modx->map[$class][$tmp][$alias])) {
                                                                                              $modx->map[$class][$tmp][$alias] = $relation;
                                                                                          }
                                                                                      }
                                                                                  }
                                                                              }
                                                                          }
                                                                          break;
                                                                      
                                                                      case "OnUserFormPrerender":
                                                                          if (!isset($user) || $user->get('id') < 1) {
                                                                              return;
                                                                          }
                                                                  
                                                                          if (!$modx->getCount('modPlugin', array('name' => 'AjaxManager', 'disabled' => false))) {
                                                                              $data['spam_email'] = $user->Profile->spam_email ? 'true' : 'false';
                                                                              $data['spam_sms'] = $user->Profile->spam_sms ? 'true' : 'false';
                                                                              $data['spam_viber'] = $user->Profile->spam_viber ? 'true' : 'false';
                                                                              $data['zak_email'] = $user->Profile->zak_email ? 'true' : 'false';
                                                                              $data['zak_sms'] = $user->Profile->zak_sms ? 'true' : 'false';
                                                                              $data['zak_viber'] = $user->Profile->zak_viber ? 'true' : 'false';
                                                                  
                                                                  
                                                                              $modx->controller->addHtml("
                                                                                  <script type='text/javascript'>
                                                                                      Ext.ComponentMgr.onAvailable('modx-user-tabs', function() {
                                                                                          this.on('beforerender', function() {
                                                                                              var rightCol = this.items.items[0].items.items[0].items.items[1];
                                                                  
                                                                                              rightCol.items.insert(0, 'modx-user-spam_email', new Ext.form.Checkbox({
                                                                                                  id: 'modx-user-spam_email',
                                                                                                  name: 'spam_email',
                                                                                                  hideLabel: true,
                                                                                                  boxLabel: 'Рассылка на Email',
                                                                                                  description: 'Пользователь отметил E-mail для рассылки рекламы',
                                                                                                  xtype: 'xcheckbox',
                                                                                                  inputValue: 1,
                                                                                                  listeners: {
                                                                                                      beforerender: function(that) {
                                                                                                          that.hiddenField = new Ext.Element(document.createElement('input')).set({
                                                                                                              type: 'hidden',
                                                                                                              name: that.name,
                                                                                                              value: 0,
                                                                                                          });
                                                                                                      },
                                                                                                      afterrender: function(that) {
                                                                                                          that.el.insertHtml('beforeBegin', that.hiddenField.dom.outerHTML);
                                                                                                      },
                                                                                                  },
                                                                                                  checked: {$data['spam_email']},
                                                                                              }));
                                                                                              
                                                                                              rightCol.items.insert(0, 'modx-user-spam_viber', new Ext.form.Checkbox({
                                                                                                  id: 'modx-user-spam_viber',
                                                                                                  name: 'spam_viber',
                                                                                                  hideLabel: true,
                                                                                                  boxLabel: 'Рассылка на Viber',
                                                                                                  description: 'Пользователь отметил Viber для рассылки рекламы',
                                                                                                  xtype: 'xcheckbox',
                                                                                                  inputValue: 1,
                                                                                                  listeners: {
                                                                                                      beforerender: function(that) {
                                                                                                          that.hiddenField = new Ext.Element(document.createElement('input')).set({
                                                                                                              type: 'hidden',
                                                                                                              name: that.name,
                                                                                                              value: 0,
                                                                                                          });
                                                                                                      },
                                                                                                      afterrender: function(that) {
                                                                                                          that.el.insertHtml('beforeBegin', that.hiddenField.dom.outerHTML);
                                                                                                      }
                                                                                                  },
                                                                                                  checked: {$data['spam_viber']},
                                                                                              }));
                                                                                              
                                                                                              rightCol.items.insert(0, 'modx-user-spam_sms', new Ext.form.Checkbox({
                                                                                                  id: 'modx-user-spam_sms',
                                                                                                  name: 'spam_sms',
                                                                                                  hideLabel: true,
                                                                                                  boxLabel: 'Рассылка на SMS',
                                                                                                  description: 'Пользователь отметил SMS для рассылки рекламы',
                                                                                                  xtype: 'xcheckbox',
                                                                                                  inputValue: 1,
                                                                                                  listeners: {
                                                                                                      beforerender: function(that) {
                                                                                                          that.hiddenField = new Ext.Element(document.createElement('input')).set({
                                                                                                              type: 'hidden',
                                                                                                              name: that.name,
                                                                                                              value: 0,
                                                                                                          });
                                                                                                      },
                                                                                                      afterrender: function(that) {
                                                                                                          that.el.insertHtml('beforeBegin', that.hiddenField.dom.outerHTML);
                                                                                                      }
                                                                                                  },
                                                                                                  checked: {$data['spam_sms']},
                                                                                              }));
                                                                                              
                                                                                              rightCol.items.insert(0, 'modx-user-zak_email', new Ext.form.Checkbox({
                                                                                                  id: 'modx-user-zak_email',
                                                                                                  name: 'zak_email',
                                                                                                  hideLabel: true,
                                                                                                  boxLabel: 'Оповещение о заказе на Email',
                                                                                                  description: 'Пользователь отметил E-mail для оповещения О поступлении',
                                                                                                  xtype: 'xcheckbox',
                                                                                                  inputValue: 1,
                                                                                                  listeners: {
                                                                                                      beforerender: function(that) {
                                                                                                          that.hiddenField = new Ext.Element(document.createElement('input')).set({
                                                                                                              type: 'hidden',
                                                                                                              name: that.name,
                                                                                                              value: 0,
                                                                                                          });
                                                                                                      },
                                                                                                      afterrender: function(that) {
                                                                                                          that.el.insertHtml('beforeBegin', that.hiddenField.dom.outerHTML);
                                                                                                      }
                                                                                                  },
                                                                                                  checked: {$data['zak_email']},
                                                                                              }));
                                                                                              
                                                                                              rightCol.items.insert(0, 'modx-user-zak_sms', new Ext.form.Checkbox({
                                                                                                  id: 'modx-user-zak_sms',
                                                                                                  name: 'zak_sms',
                                                                                                  hideLabel: true,
                                                                                                  boxLabel: 'Оповещение о заказе по SMS',
                                                                                                  description: 'Пользователь отметил SMS для оповещения О поступлении',
                                                                                                  xtype: 'xcheckbox',
                                                                                                  inputValue: 1,
                                                                                                  listeners: {
                                                                                                      beforerender: function(that) {
                                                                                                          that.hiddenField = new Ext.Element(document.createElement('input')).set({
                                                                                                              type: 'hidden',
                                                                                                              name: that.name,
                                                                                                              value: 0,
                                                                                                          });
                                                                                                      },
                                                                                                      afterrender: function(that) {
                                                                                                          that.el.insertHtml('beforeBegin', that.hiddenField.dom.outerHTML);
                                                                                                      }
                                                                                                  },
                                                                                                  checked: {$data['zak_sms']},
                                                                                              }));
                                                                                              
                                                                                              rightCol.items.insert(0, 'modx-user-zak_viber', new Ext.form.Checkbox({
                                                                                                  id: 'modx-user-zak_viber',
                                                                                                  name: 'zak_viber',
                                                                                                  hideLabel: true,
                                                                                                  boxLabel: 'Оповещение о заказе по Viber',
                                                                                                  description: 'Пользователь отметил Viber для оповещения О поступлении',
                                                                                                  xtype: 'xcheckbox',
                                                                                                  inputValue: 1,
                                                                                                  listeners: {
                                                                                                      beforerender: function(that) {
                                                                                                          that.hiddenField = new Ext.Element(document.createElement('input')).set({
                                                                                                              type: 'hidden',
                                                                                                              name: that.name,
                                                                                                              value: 0,
                                                                                                          });
                                                                                                      },
                                                                                                      afterrender: function(that) {
                                                                                                          that.el.insertHtml('beforeBegin', that.hiddenField.dom.outerHTML);
                                                                                                      }
                                                                                                  },
                                                                                                  checked: {$data['zak_viber']},
                                                                                              }));
                                                                                          });
                                                                                      });
                                                                                  </script>
                                                                              ");
                                                                          }
                                                                          break;
                                                                  }
                                                                  В ответе выше говорилось про скрытое поле перед checkbox, можно немного подробнее?
                                                                  unreal_serg
                                                                  03 марта 2020, 15:58
                                                                  0
                                                                  Непонятно, зачем чекбокс добавлять в таблицу modx_users, а не в modx_user_attributes. Добавил во вторую и все норм пашет!
                                                                    Alex Weber
                                                                    24 июня 2020, 21:57
                                                                    0
                                                                    Я правильно понимаю, что когда говорят «плагин» подразумевается pdoTools? Дефолтный код пытался дополнять, заменять, оставлять как есть — после каждого действия обновлял кеш — никакой реакции. Создавал новый плагин — тоже эффекта не наблюдается.

                                                                    У меня задача заключается в создании около 50-ти дополнительных полей для всех пользователей. В эти поля отдельным скриптом пишутся текущие характеристики пользователя и уже средствами MODx между ними производится пересчёт. Подскажите пожалуйста что я делаю не так и куда поместить код?
                                                                      SEQUEL.ONE
                                                                      25 июня 2020, 00:37
                                                                      +1
                                                                      Для начала нужно понять, что из себя представляет MODX и его архитектуру.

                                                                      Структура состоит из:
                                                                      — Шаблонов (шаблоны страниц);
                                                                      — Чанков (куски HTML-тэгов из которых состоит Шаблон);
                                                                      — TV-параметры (добавляемые поля, которые крепятся к шаблону, имеющие разные типы от чекбоксов до более сложных как MIGX);
                                                                      — Сниппет (PHP-код имеющий параметры и используемый на фронтенде);
                                                                      — Плагин (PHP-код имеющий события, на которые можно вешать любые действия в админпанели);
                                                                      — Категории (ярлыки для более удобного распределения вышеперечисленных элементов).

                                                                      Я правильно понимаю, что когда говорят «плагин» подразумевается pdoTools?
                                                                      Нет, pdoTools — это компонент (пакет), который из себя представляет список сниппетов для работы с базой данных через xPDO.
                                                                        Alex Weber
                                                                        25 июня 2020, 08:21
                                                                        0
                                                                        Спасибо, наверно я плохо сформулировал вопрос. Созданный мной в админке плагин userProfileExtendedFields с указанным в топике скриптом результата не принёс. Ошибок в логе тоже. Модификация OnMODXInit и OnUserFormPrerender в рабочем плагине pdoTools тоже результатов не дала. Поэтому вопрос, нужно ли ещё где-то вносить изменения?

                                                                        Я не хочу хардкодить поля шаблона в админке, но они нужны не только на фронтенде, где я могу их получить «в лоб», а хотелось бы грамотно организовать работу для админа с возможностью вносить корректировки через редактирование профиля.

                                                                        Для начала нужно понять, что из себя представляет MODX и его архитектуру.
                                                                        С этими понятиями я знаком с появления Revo, здесь тоже частый гость. Но раньше потребности вмешиваться в дефолтную админку не возникало.
                                                                      SEQUEL.ONE
                                                                      25 июня 2020, 12:31
                                                                      0
                                                                      Модификация OnMODXInit и OnUserFormPrerender в рабочем плагине pdoTools тоже результатов не дала.
                                                                      Причем здесь плагин pdoTools вообще? Вам нужно создать свой плагин и повесить его на события.
                                                                        Alex Weber
                                                                        25 июня 2020, 20:09
                                                                        0
                                                                        Хорошо, с этим разобрались. :) Я писал выше

                                                                        Созданный мной в админке плагин userProfileExtendedFields с указанным в топике скриптом результата не принёс. Ошибок в логе тоже.
                                                                        Вы это имеете ввиду, когда говорите «навесить события» или нужно где-то ещё внести какие-либо правки?
                                                                          SEQUEL.ONE
                                                                          25 июня 2020, 20:18
                                                                          +1
                                                                          В плагине вторая вкладка События. Ищите названия из статьи и ставите галочки. Сохраняете. Потом нужно сбросить кэш в админке и в браузере.
                                                                            Alex Weber
                                                                            25 июня 2020, 20:51
                                                                            0
                                                                            Супер, заработало! Спасибо.
                                                                        Кирилл
                                                                        20 июля 2020, 12:47
                                                                        0
                                                                        Спасибо вам огромнейшее!!!

                                                                        Вот честное слово была бы возможность я бы вам на ящик пива даже скинул.
                                                                        Современем потом найду этот топик и надеюсь скину позже

                                                                        Кому нежалко, отблагодарите человека за такое суперовое решение!!!
                                                                          Николай Савин
                                                                          20 июля 2020, 13:25
                                                                          +2
                                                                          Нормально вообще да!

                                                                          Мне помогли, я бы денег дал даже за помощь. Но не дам. Кому не жалко сами дайте.
                                                                          Кирилл
                                                                          20 июля 2020, 19:34
                                                                          0
                                                                          согласен, как будет возможность обязательно незабуду отблагодарить за данное решение
                                                                          данный топик у меня в избранных до лучших времён
                                                                            Кирилл
                                                                            26 июля 2020, 17:19
                                                                            0
                                                                            на пиво на данный момент скинуть пока нет возможности

                                                                            вот решение без cheeckbox

                                                                            во фронтенде

                                                                            музыка
                                                                            фотография
                                                                            автомобили
                                                                            чтение литературы

                                                                            Plugin: profileinteresi (дополнительное поле интересы пользователя)

                                                                            <?php
                                                                            switch ($modx->event->name) {
                                                                                    
                                                                                    case "OnMODXInit":
                                                                                        $map = array(
                                                                            
                                                                                            'modUserProfile' => array(
                                                                                                'fields' => array(
                                                                                                    'userinteresi' => '',
                                                                                                ),
                                                                                                'fieldMeta' => array(
                                                                                                    'userinteresi' => array(
                                                                                                        'dbtype' => 'varchar',
                                                                                                        'precision' => '255',
                                                                                                        'phptype' => 'string',
                                                                                                        'null' => false,
                                                                                                    ),
                                                                                                ),
                                                                                            ),
                                                                                        );
                                                                            
                                                                                        foreach ($map as $class => $data) {
                                                                                            $modx->loadClass($class);
                                                                            
                                                                                            foreach ($data as $tmp => $fields) {
                                                                                                if ($tmp == 'fields') {
                                                                                                    foreach ($fields as $field => $value) {
                                                                                                        foreach (array('fields', 'fieldMeta', 'indexes') as $key) {
                                                                                                            if (isset($data[$key][$field])) {
                                                                                                                $modx->map[$class][$key][$field] = $data[$key][$field];
                                                                                                            }
                                                                                                        }
                                                                                                    }
                                                                                                } elseif ($tmp == 'composites' || $tmp == 'aggregates') {
                                                                                                    foreach ($fields as $alias => $relation) {
                                                                                                        if (!isset($modx->map[$class][$tmp][$alias])) {
                                                                                                            $modx->map[$class][$tmp][$alias] = $relation;
                                                                                                        }
                                                                                                    }
                                                                                                }
                                                                                            }
                                                                                        }
                                                                                        break;
                                                                                    
                                                                                    case "OnUserFormPrerender":
                                                                                        if (!isset($user) || $user->get('id') < 1) {
                                                                                            return;
                                                                                        }
                                                                            
                                                                                        if (!$modx->getCount('modPlugin', array('name' => 'AjaxManager', 'disabled' => false))) {              
                                                                                            $data['userinteresi'] = htmlspecialchars($user->Profile->userinteresi);
                                                                            
                                                                                            $modx->controller->addHtml("
                                                                                                <script type='text/javascript'>
                                                                                                    Ext.ComponentMgr.onAvailable('modx-user-tabs', function() {
                                                                                                        this.on('beforerender', function() {
                                                                                                            // Получаем колонки первой вкладки
                                                                                                            var leftCol = this.items.items[0].items.items[0].items.items[0];
                                                                                                            var rightCol = this.items.items[0].items.items[0].items.items[1];
                                                                            
                                                                                                            // Добавляем новое поле в левую колонку 3ым по счёту полем (перед полем 'Email')
                                                                                                            leftCol.items.insert(4, 'modx-user-userinteresi-field', new Ext.form.TextField({
                                                                                                                id: 'modx-user-userinteresi-field',
                                                                                                                name: 'userinteresi',
                                                                                                                fieldLabel: 'интересы пользователя',
                                                                                                                xtype: 'textfield',
                                                                                                                anchor: '100%',
                                                                                                                maxLength: 255,
                                                                                                                value: '{$data['userinteresi']}',
                                                                                                            }));
                                                                                                            
                                                                                                        });
                                                                                                    });
                                                                                                </script>
                                                                                            ");
                                                                                        }
                                                                                        break;
                                                                                }

                                                                            System Events

                                                                            OnMODXInit
                                                                            OnUserFormPrerender
                                                                              Кирилл
                                                                              29 августа 2020, 00:09
                                                                              -1
                                                                              спасибо ещё раз за такое решение как custom profile fields

                                                                              надеюсь моя небольшая модернизация без checkbox равносильна пиву?

                                                                              буду признателен очень, если кто подскажет, как вывести дополнительные поля user profile во фронтенде
                                                                                Ivanov Alexandr
                                                                                12 сентября 2020, 08:50
                                                                                0
                                                                                Все сделал по инструкции.
                                                                                Плагин повесил на указанные события
                                                                                <?php
                                                                                switch ($modx->event->name) {
                                                                                        case "OnMODXInit":
                                                                                            $map = array(
                                                                                                'modUserProfile' => array(
                                                                                                    'fields' => array(
                                                                                                        'opisanie' => '',
                                                                                                        'sotrudnik' => '',
                                                                                                        'sertifikat' => '',
                                                                                                        'lico' => '',
                                                                                                    ),
                                                                                                    'fieldMeta' => array(
                                                                                                        'opisanie' => array(
                                                                                                            'dbtype' => 'varchar',
                                                                                                            'precision' => '100',
                                                                                                            'phptype' => 'string',
                                                                                                            'null' => true,
                                                                                                        ),
                                                                                                        'sotrudnik' => array(
                                                                                                            'dbtype' => 'varchar',
                                                                                                            'precision' => '100',
                                                                                                            'phptype' => 'string',
                                                                                                            'null' => true,
                                                                                                        ),
                                                                                                        'sertifikat' => array(
                                                                                                            'dbtype' => 'varchar',
                                                                                                            'precision' => '100',
                                                                                                            'phptype' => 'string',
                                                                                                            'null' => true,
                                                                                                        ),
                                                                                                        'lico' => array(
                                                                                                            'dbtype' => 'varchar',
                                                                                                            'precision' => '100',
                                                                                                            'phptype' => 'string',
                                                                                                            'null' => true,
                                                                                                        ),
                                                                                                        'oborot' => array(
                                                                                                            'dbtype' => 'varchar',
                                                                                                            'precision' => '100',
                                                                                                            'phptype' => 'string',
                                                                                                            'null' => true,
                                                                                                        ),                        
                                                                                                    ),
                                                                                                ),
                                                                                            );
                                                                                            foreach ($map as $class => $data) {
                                                                                                $modx->loadClass($class);
                                                                                                foreach ($data as $tmp => $fields) {
                                                                                                    if ($tmp == 'fields') {
                                                                                                        foreach ($fields as $field => $value) {
                                                                                                            foreach (array('fields', 'fieldMeta', 'indexes') as $key) {
                                                                                                                if (isset($data[$key][$field])) {
                                                                                                                    $modx->map[$class][$key][$field] = $data[$key][$field];
                                                                                                                }
                                                                                                            }
                                                                                                        }
                                                                                                    } elseif ($tmp == 'composites' || $tmp == 'aggregates') {
                                                                                                        foreach ($fields as $alias => $relation) {
                                                                                                            if (!isset($modx->map[$class][$tmp][$alias])) {
                                                                                                                $modx->map[$class][$tmp][$alias] = $relation;
                                                                                                            }
                                                                                                        }
                                                                                                    }
                                                                                                }
                                                                                            }
                                                                                            break;
                                                                                        case "OnUserFormPrerender":
                                                                                            if (!isset($user) || $user->get('id') < 1) {
                                                                                                return;
                                                                                            }
                                                                                            if ($user->get('id') > 0) {
                                                                                                $data['opisanie'] = htmlspecialchars($user->Profile->opisanie);
                                                                                                $data['sotrudnik'] = htmlspecialchars($user->Profile->sotrudnik);
                                                                                                $data['sertifikat'] = htmlspecialchars($user->Profile->sertifikat);
                                                                                                $data['lico'] = htmlspecialchars($user->Profile->lico);
                                                                                                $data['oborot'] = htmlspecialchars($user->Profile->oborot);
                                                                                                $modx->controller->addHtml("
                                                                                                    <script type='text/javascript'>
                                                                                                        Ext.ComponentMgr.onAvailable('modx-user-tabs', function() {
                                                                                                            this.on('beforerender', function() {
                                                                                                                // Получаем колонки первой вкладки
                                                                                                                var leftCol = this.items.items[0].items.items[0].items.items[0];
                                                                                                                // Добавляем новое поле в левую колонку 4ым по счёту полем (перед полем 'Email')
                                                                                                                leftCol.items.insert(15, 'modx-user-opisanie', new Ext.form.TextArea({
                                                                                                                    id: 'modx-user-opisanie',
                                                                                                                    name: 'opisanie',
                                                                                                                    fieldLabel: 'Описание компании',
                                                                                                                    xtype: 'textarea',
                                                                                                                    anchor: '100%',
                                                                                                                    value: '{$data['opisanie']}',
                                                                                                                }));
                                                                                                                leftCol.items.insert(16, 'modx-user-sotrudnik', new Ext.form.TextField({
                                                                                                                    id: 'modx-user-sotrudnik',
                                                                                                                    name: 'sotrudnik',
                                                                                                                    fieldLabel: 'Количество соттрудников',
                                                                                                                    xtype: 'textfield',
                                                                                                                    anchor: '100%',
                                                                                                                    maxLength: 255,
                                                                                                                    value: '{$data['sotrudnik']}',
                                                                                                                }));
                                                                                                                leftCol.items.insert(17, 'modx-user-sertifikat', new Ext.form.TextField({
                                                                                                                    id: 'modx-user-sertifikat',
                                                                                                                    name: 'sertifikat',
                                                                                                                    fieldLabel: 'Наличие сертификата',
                                                                                                                    xtype: 'varchar',
                                                                                                                    anchor: '100%',
                                                                                                                    maxLength: 255,
                                                                                                                    value: '{$data['sertifikat']}',
                                                                                                                }));
                                                                                                                leftCol.items.insert(18, 'modx-user-lico', new Ext.form.TextField({
                                                                                                                    id: 'modx-user-lico',
                                                                                                                    name: 'lico',
                                                                                                                    fieldLabel: 'Ответственное лицо',
                                                                                                                    xtype: 'varchar',
                                                                                                                    anchor: '100%',
                                                                                                                    maxLength: 255,
                                                                                                                    value: '{$data['lico']}',
                                                                                                                }));
                                                                                                                 leftCol.items.insert(19, 'modx-user-oborot', new Ext.form.TextField({
                                                                                                                    id: 'modx-user-oborot',
                                                                                                                    name: 'oborot',
                                                                                                                    fieldLabel: 'Годовой оборот компании',
                                                                                                                    xtype: 'varchar',
                                                                                                                    anchor: '100%',
                                                                                                                    maxLength: 255,
                                                                                                                    value: '{$data['oborot']}',
                                                                                                                }));                               
                                                                                                            });
                                                                                                        });
                                                                                                    </script>
                                                                                                ");
                                                                                            }
                                                                                            break;
                                                                                    }
                                                                                На странице редактирования профиля вывожу
                                                                                [[!officeProfile?
                                                                                	&HybridAuth=`0`
                                                                                	&tplProfile=`PrifileEdit`
                                                                                	&profileFields=`username:50,email:50,fullname:50,name:50,sotrudnik:50,lastname:50,phone:12,mobilephone:12,dob:10,
                                                                                	address,state,zip,fax,photo,website,opisanie,lico,sertifikat,oborot`
                                                                                ]]
                                                                                Пытаюсь отредактировать профиль а поля которые были созданы не сохраняются. При этом если в админке редактировать то поля сохраняются. А на сайте не хотят сохраняться. В чем может быть причина может что то не так сделал?

                                                                                Стандартные поля при этом изменить можно на сайте. Не получается только добавленные.
                                                                                  Ivanov Alexandr
                                                                                  12 сентября 2020, 09:16
                                                                                  0
                                                                                  Код плагина подправил
                                                                                  <?php
                                                                                  switch ($modx->event->name) {
                                                                                          case "OnMODXInit":
                                                                                              $map = array(
                                                                                                  'modUserProfile' => array(
                                                                                                      'fields' => array(
                                                                                                          'opisanie' => '',
                                                                                                          'sotrudnik' => '',
                                                                                                          'sertifikat' => '',
                                                                                                          'lico' => '',
                                                                                                          'oborot' => '',
                                                                                                      ),
                                                                                                      'fieldMeta' => array(
                                                                                                          'opisanie' => array(
                                                                                                              'dbtype' => 'varchar',
                                                                                                              'precision' => '100',
                                                                                                              'phptype' => 'string',
                                                                                                              'null' => true,
                                                                                                          ),
                                                                                                          'sotrudnik' => array(
                                                                                                              'dbtype' => 'varchar',
                                                                                                              'precision' => '100',
                                                                                                              'phptype' => 'string',
                                                                                                              'null' => true,
                                                                                                          ),
                                                                                                          'sertifikat' => array(
                                                                                                              'dbtype' => 'varchar',
                                                                                                              'precision' => '100',
                                                                                                              'phptype' => 'string',
                                                                                                              'null' => true,
                                                                                                          ),
                                                                                                          'lico' => array(
                                                                                                              'dbtype' => 'varchar',
                                                                                                              'precision' => '100',
                                                                                                              'phptype' => 'string',
                                                                                                              'null' => true,
                                                                                                          ),
                                                                                                          'oborot' => array(
                                                                                                              'dbtype' => 'varchar',
                                                                                                              'precision' => '100',
                                                                                                              'phptype' => 'string',
                                                                                                              'null' => true,
                                                                                                          ),                        
                                                                                                      ),
                                                                                                  ),
                                                                                              );
                                                                                              foreach ($map as $class => $data) {
                                                                                                  $modx->loadClass($class);
                                                                                                  foreach ($data as $tmp => $fields) {
                                                                                                      if ($tmp == 'fields') {
                                                                                                          foreach ($fields as $field => $value) {
                                                                                                              foreach (array('fields', 'fieldMeta', 'indexes') as $key) {
                                                                                                                  if (isset($data[$key][$field])) {
                                                                                                                      $modx->map[$class][$key][$field] = $data[$key][$field];
                                                                                                                  }
                                                                                                              }
                                                                                                          }
                                                                                                      } elseif ($tmp == 'composites' || $tmp == 'aggregates') {
                                                                                                          foreach ($fields as $alias => $relation) {
                                                                                                              if (!isset($modx->map[$class][$tmp][$alias])) {
                                                                                                                  $modx->map[$class][$tmp][$alias] = $relation;
                                                                                                              }
                                                                                                          }
                                                                                                      }
                                                                                                  }
                                                                                              }
                                                                                              break;
                                                                                          case "OnUserFormPrerender":
                                                                                              if (!isset($user) || $user->get('id') < 1) {
                                                                                                  return;
                                                                                              }
                                                                                              if ($user->get('id') > 0) {
                                                                                                  $data['opisanie'] = htmlspecialchars($user->Profile->opisanie);
                                                                                                  $data['sotrudnik'] = htmlspecialchars($user->Profile->sotrudnik);
                                                                                                  $data['sertifikat'] = htmlspecialchars($user->Profile->sertifikat);
                                                                                                  $data['lico'] = htmlspecialchars($user->Profile->lico);
                                                                                                  $data['oborot'] = htmlspecialchars($user->Profile->oborot);
                                                                                                  $modx->controller->addHtml("
                                                                                                      <script type='text/javascript'>
                                                                                                          Ext.ComponentMgr.onAvailable('modx-user-tabs', function() {
                                                                                                              this.on('beforerender', function() {
                                                                                                                  // Получаем колонки первой вкладки
                                                                                                                  var leftCol = this.items.items[0].items.items[0].items.items[0];
                                                                                                                  // Добавляем новое поле в левую колонку 4ым по счёту полем (перед полем 'Email')
                                                                                                                  leftCol.items.insert(15, 'modx-user-opisanie', new Ext.form.TextArea({
                                                                                                                      id: 'modx-user-opisanie',
                                                                                                                      name: 'opisanie',
                                                                                                                      fieldLabel: 'Описание компании',
                                                                                                                      xtype: 'textarea',
                                                                                                                      anchor: '100%',
                                                                                                                      value: '{$data['opisanie']}',
                                                                                                                  }));
                                                                                                                  leftCol.items.insert(16, 'modx-user-sotrudnik', new Ext.form.TextField({
                                                                                                                      id: 'modx-user-sotrudnik',
                                                                                                                      name: 'sotrudnik',
                                                                                                                      fieldLabel: 'Количество соттрудников',
                                                                                                                      xtype: 'varchar',
                                                                                                                      anchor: '100%',
                                                                                                                      maxLength: 255,
                                                                                                                      value: '{$data['sotrudnik']}',
                                                                                                                  }));
                                                                                                                  leftCol.items.insert(17, 'modx-user-sertifikat', new Ext.form.TextField({
                                                                                                                      id: 'modx-user-sertifikat',
                                                                                                                      name: 'sertifikat',
                                                                                                                      fieldLabel: 'Наличие сертификата',
                                                                                                                      xtype: 'varchar',
                                                                                                                      anchor: '100%',
                                                                                                                      maxLength: 255,
                                                                                                                      value: '{$data['sertifikat']}',
                                                                                                                  }));
                                                                                                                  leftCol.items.insert(18, 'modx-user-lico', new Ext.form.TextField({
                                                                                                                      id: 'modx-user-lico',
                                                                                                                      name: 'lico',
                                                                                                                      fieldLabel: 'Ответственное лицо',
                                                                                                                      xtype: 'varchar',
                                                                                                                      anchor: '100%',
                                                                                                                      maxLength: 255,
                                                                                                                      value: '{$data['lico']}',
                                                                                                                  }));
                                                                                                                   leftCol.items.insert(19, 'modx-user-oborot', new Ext.form.TextField({
                                                                                                                      id: 'modx-user-oborot',
                                                                                                                      name: 'oborot',
                                                                                                                      fieldLabel: 'Годовой оборот компании',
                                                                                                                      xtype: 'varchar',
                                                                                                                      anchor: '100%',
                                                                                                                      maxLength: 255,
                                                                                                                      value: '{$data['oborot']}',
                                                                                                                  }));                               
                                                                                                              });
                                                                                                          });
                                                                                                      </script>
                                                                                                  ");
                                                                                              }
                                                                                              break;
                                                                                      }
                                                                                  Все равно ничего не сохраняет на сайте.
                                                                                  alexandr.skyrda
                                                                                  11 декабря 2020, 15:32
                                                                                  0
                                                                                  подскажите пожалуйста, как добавить поле с типом «file», что бы пользователь мог прикреплять свои документы?
                                                                                    alexandr.skyrda
                                                                                    13 декабря 2020, 00:41
                                                                                    0
                                                                                    готов обсудить сотрудничество, очень нужен этот функционал
                                                                                  Lori
                                                                                  28 августа 2021, 10:08
                                                                                  0
                                                                                  У кого-нибудь встречалась такая проблема, что некоторые поля не работают как надо? Я создал сначала 4 поля, позже еще 2. Предыдущие 4 работают нормально, а вот последние 2 не хотят. Я их вывожу в форме Login, при редактировании и сохранении первые 4 поля сохраняются нормально, а 2 последних в extended. В чем может быть причина?

                                                                                  upd: проблема решилась очисткой кэша
                                                                                    Сuriosity
                                                                                    27 декабря 2021, 13:40
                                                                                    0
                                                                                    Все ваши новые поля поломаются, если, при внесении записи в это поле, вставить одинарную кавычку (апостроф).
                                                                                    Если следовать вашему примеру, то зайдя в профиль юзера, ​
                                                                                    в поле «Новое поле профиля» написать вместо:
                                                                                    Можно сохранять что угодно…
                                                                                    например
                                                                                    Можно сохранять что угод'но…

                                                                                    Сохраняем, заходим еще раз в профиль этого пользователя и вуаля… нового поля нет (а если было не одно новое поле, то и других бы тоже).

                                                                                    Неприятность находится здесь:
                                                                                    case "OnUserFormPrerender":
                                                                                            if (!isset($user) || $user->get('id') < 1) {
                                                                                                return;
                                                                                            }
                                                                                    
                                                                                            if (!$modx->getCount('modPlugin', array('name' => 'AjaxManager', 'disabled' => false))) {
                                                                                                $data['new_checkbox'] = $user->new_checkbox ? 'true' : 'false';
                                                                                                $data['new_field'] = htmlspecialchars($user->Profile->new_field);
                                                                                    Внесите в код правку:
                                                                                    $data['new_field'] = htmlspecialchars($user->Profile->new_field, ENT_QUOTES);
                                                                                    Или, как вариант, впихнуть какую-то регулярку…
                                                                                    Надеюсь, это кому-то поможет.
                                                                                      Vladimir
                                                                                      29 декабря 2022, 08:45
                                                                                      0
                                                                                      Добавил поле, однако оно дублируется, стоит самым первым, а так же 4м, 1 что стоит оно отключено и не возможно набрать, а последнее работает отлично, как убрать дубликат? В админке так же есть уже другие доп поля, сделанные не мной, такого плагина как тут не стояло там.

                                                                                      Мой плагин получился таким.
                                                                                      <?php
                                                                                      switch ($modx->event->name) {
                                                                                          case "OnMODXInit":
                                                                                              $map = array(
                                                                                                  'modUser' => array(
                                                                                                      'fields' => array(
                                                                                                          'regular_customer' => 1,
                                                                                                      ),
                                                                                                      'fieldMeta' => array(
                                                                                                          'regular_customer' => array(
                                                                                                              'dbtype' => 'tinyint',
                                                                                                              'precision' => '1',
                                                                                                              'phptype' => 'boolean',
                                                                                                              'attributes' => 'unsigned',
                                                                                                              'null' => false,
                                                                                                              'default' => 0,
                                                                                                          ),
                                                                                                      ),
                                                                                                  )
                                                                                              );
                                                                                      
                                                                                              foreach ($map as $class => $data) {
                                                                                                  $modx->loadClass($class);
                                                                                      
                                                                                                  foreach ($data as $tmp => $fields) {
                                                                                                      if ($tmp == 'fields') {
                                                                                                          foreach ($fields as $field => $value) {
                                                                                                              foreach (array('fields', 'fieldMeta', 'indexes') as $key) {
                                                                                                                  if (isset($data[$key][$field])) {
                                                                                                                      $modx->map[$class][$key][$field] = $data[$key][$field];
                                                                                                                  }
                                                                                                              }
                                                                                                          }
                                                                                                      } elseif ($tmp == 'composites' || $tmp == 'aggregates') {
                                                                                                          foreach ($fields as $alias => $relation) {
                                                                                                              if (!isset($modx->map[$class][$tmp][$alias])) {
                                                                                                                  $modx->map[$class][$tmp][$alias] = $relation;
                                                                                                              }
                                                                                                          }
                                                                                                      }
                                                                                                  }
                                                                                              }
                                                                                              break;
                                                                                          
                                                                                          case "OnUserFormPrerender":
                                                                                              if (!isset($user) || $user->get('id') < 1) {
                                                                                                  return;
                                                                                              }
                                                                                      
                                                                                              if (!$modx->getCount('modPlugin', array('name' => 'AjaxManager', 'disabled' => false))) {
                                                                                                  $data['regular_customer'] = $user->regular_customer ? 'true' : 'false';
                                                                                      
                                                                                                  $modx->controller->addHtml("
                                                                                                      <script type='text/javascript'>
                                                                                                          Ext.ComponentMgr.onAvailable('modx-user-tabs', function() {
                                                                                                              this.on('beforerender', function() {
                                                                                                                  // Получаем колонки первой вкладки
                                                                                                                  var rightCol = this.items.items[0].items.items[0].items.items[1];
                                                                                      
                                                                                                                  // Добавляем чекбокс первым по счёту полем (перед чекбоксом 'Активный')
                                                                                                                  rightCol.items.insert(0, 'modx-user-regular-customer', new Ext.form.Checkbox({
                                                                                                                      id: 'modx-user-regular-customer',
                                                                                                                      name: 'regular_customer',
                                                                                                                      hideLabel: true,
                                                                                                                      boxLabel: 'Постоянный покупатель',
                                                                                                                      description: 'Указывает что пользователь сделал более 5ти заказов.',
                                                                                                                      xtype: 'xcheckbox',
                                                                                                                      inputValue: 1,
                                                                                                                      listeners: {
                                                                                                                          beforerender: function(that) {
                                                                                                                              that.hiddenField = new Ext.Element(document.createElement('input')).set({
                                                                                                                                  type: 'hidden',
                                                                                                                                  name: that.name,
                                                                                                                                  value: 0,
                                                                                                                              });
                                                                                                                          },
                                                                                                                          afterrender: function(that) {
                                                                                                                              that.el.insertHtml('beforeBegin', that.hiddenField.dom.outerHTML);
                                                                                                                          },
                                                                                                                      },
                                                                                                                      checked: {$data['regular_customer']},
                                                                                                                  }));
                                                                                                              });
                                                                                                          });
                                                                                                      </script>
                                                                                                  ");
                                                                                              }
                                                                                              break;
                                                                                      }
                                                                                        Vladimir
                                                                                        05 января 2023, 08:30
                                                                                        0
                                                                                        Как позже можно обновить допустим чекбокс созданный вашим методом?
                                                                                        я пытался так, но не работает, Но текстовое поле обновляется, а вот чекбокс никак
                                                                                        $user = $modx->getObject('modUser', array('id' => $userId));
                                                                                        $profile->set('regular_customer', 1);
                                                                                        $profile->save();
                                                                                          Константин Ильин
                                                                                          05 января 2023, 09:01
                                                                                          +1
                                                                                          В вашем коде ошибка, вы получаете в $user, а потом пользуетесь $profile
                                                                                          <?
                                                                                          // Для начала, как минимум должно быть так.
                                                                                          $user = $modx->getObject('modUser', array('id' => $userId));
                                                                                          $user->set('regular_customer', 1);
                                                                                          $user->save();
                                                                                          ну и внимательно смотрите где это поле у вас в modUser или же в modUserProfile
                                                                                            Vladimir
                                                                                            05 января 2023, 09:44
                                                                                            0
                                                                                            Да, спасибо огромное, совсем забыл просто то куда я поставил поле.
                                                                                          Евгений Лазарев
                                                                                          04 июля 2023, 18:32
                                                                                          0
                                                                                          Подскажите пожалуйста почему поле может не получать данные после повторной перезагрузки страницы?
                                                                                          <?php
                                                                                          switch ($modx->event->name) {
                                                                                              case "OnMODXInit":
                                                                                                  $map = array(
                                                                                                      'modUserProfile' => array(
                                                                                                          'fields' => array(
                                                                                                              'building' => null,
                                                                                                              'layer' => null,
                                                                                                          ),
                                                                                                          'fieldMeta' => array(
                                                                                                              'building' => array(
                                                                                                                  'dbtype' => 'varchar',
                                                                                                                  'precision' => '255',
                                                                                                                  'phptype' => 'json',
                                                                                                                  'null' => true,
                                                                                                              ),
                                                                                                              'layer' => array(
                                                                                                                  'dbtype' => 'varchar',
                                                                                                                  'precision' => '255',
                                                                                                                  'phptype' => 'json',
                                                                                                                  'null' => true,
                                                                                                              ),
                                                                                                          ),
                                                                                                      ),
                                                                                                  );
                                                                                          
                                                                                                  foreach ($map as $class => $data) {
                                                                                                      $modx->loadClass($class);
                                                                                          
                                                                                                      foreach ($data as $tmp => $fields) {
                                                                                                          if ($tmp == 'fields') {
                                                                                                              foreach ($fields as $field => $value) {
                                                                                                                  foreach (array('fields', 'fieldMeta', 'indexes') as $key) {
                                                                                                                      if (isset($data[$key][$field])) {
                                                                                                                          $modx->map[$class][$key][$field] = $data[$key][$field];
                                                                                                                      }
                                                                                                                  }
                                                                                                              }
                                                                                                          } elseif ($tmp == 'composites' || $tmp == 'aggregates') {
                                                                                                              foreach ($fields as $alias => $relation) {
                                                                                                                  if (!isset($modx->map[$class][$tmp][$alias])) {
                                                                                                                      $modx->map[$class][$tmp][$alias] = $relation;
                                                                                                                  }
                                                                                                              }
                                                                                                          }
                                                                                                      }
                                                                                                  }
                                                                                                  break;
                                                                                              
                                                                                              case "OnUserFormPrerender":
                                                                                                  if (!isset($user) || $user->get('id') < 1) {
                                                                                                      return;
                                                                                                  }
                                                                                                  
                                                                                                  if (!$modx->getCount('modPlugin', array('name' => 'AjaxManager', 'disabled' => false))) {
                                                                                                      $buildings = [];
                                                                                                      $layers = [];
                                                                                                      if ($user->Profile->building){
                                                                                                          foreach (json_decode($user->Profile->building) as $id){
                                                                                                              if (!$scBuilding = $modx->getObject('scBuilding', ['id' => $id, 'active' => true])) continue;
                                                                                                              $buildings[] = (object)$scBuilding->toArray();
                                                                                                          }   
                                                                                                      }
                                                                                                      var_dump($user->Profile->email); var_dump($user->Profile->layer); die();
                                                                                          В данном случае при первой перезагрузке страницы выведется и email и layer, при повторной же emal выведется а свое поле будет null
                                                                                          B так каждый раз пока кэш не очистишь
                                                                                            Кирилл
                                                                                            13 ноября 2023, 14:26
                                                                                            0
                                                                                            Вот мое решение, может сразу упросит поиск по поводу datetime
                                                                                            Данные в БД храню в integer формате в unixtimestamp
                                                                                            Мне важно получить дату до какого времени оплачен доступ у юзера, потому условно дата 01/01/2023, то сохраняю 01/01/2023 23:59:59 (GMT+0000)
                                                                                            Ну и соответственно потом показываю по разному данную дату (в подписи к полю — в привычном порядке для СНГ — день/месяц/год), а в самом поле, как по умолчанию месяц/день/год.
                                                                                            И да, для сохранения заюзал еще одно системное событие OnBeforeUserFormSave

                                                                                            <?php
                                                                                            /* userFields */
                                                                                            switch ($modx->event->name) {
                                                                                                case "OnMODXInit":
                                                                                                    $map = array(
                                                                                                        'modUserProfile' => array(
                                                                                                            'fields' => array(
                                                                                                                'surname' => '',
                                                                                                                'patronymic' => '',
                                                                                                                'paid' => '',
                                                                                                            ),
                                                                                                            'fieldMeta' => array(
                                                                                                                'surname' => array(
                                                                                                                    'dbtype' => 'varchar',
                                                                                                                    'precision' => '100',
                                                                                                                    'phptype' => 'string',
                                                                                                                    'null' => false,
                                                                                                                    'default' => '',
                                                                                                                ),
                                                                                                                'patronymic' => array(
                                                                                                                    'dbtype' => 'varchar',
                                                                                                                    'precision' => '100',
                                                                                                                    'phptype' => 'string',
                                                                                                                    'null' => false,
                                                                                                                    'default' => '',
                                                                                                                ),
                                                                                                                'paid' => array(
                                                                                                                    'dbtype' => 'int',
                                                                                                                    'precision' => '10',
                                                                                                                    'phptype' => 'integer',
                                                                                                                    'null' => true,
                                                                                                                    'default' => null,
                                                                                                                ),
                                                                                                            ),
                                                                                                        ),
                                                                                                    );
                                                                                            
                                                                                                    foreach ($map as $class => $data) {
                                                                                                        $modx->loadClass($class);
                                                                                                        foreach ($data as $tmp => $fields) {
                                                                                                            if ($tmp == 'fields') {
                                                                                                                foreach ($fields as $field => $value) {
                                                                                                                    foreach (array('fields', 'fieldMeta', 'indexes') as $key) {
                                                                                                                        if (isset($data[$key][$field])) {
                                                                                                                            $modx->map[$class][$key][$field] = $data[$key][$field];
                                                                                                                        }
                                                                                                                    }
                                                                                                                }
                                                                                                            } elseif ($tmp == 'composites' || $tmp == 'aggregates') {
                                                                                                                foreach ($fields as $alias => $relation) {
                                                                                                                    if (!isset($modx->map[$class][$tmp][$alias])) {
                                                                                                                        $modx->map[$class][$tmp][$alias] = $relation;
                                                                                                                    }
                                                                                                                }
                                                                                                            }
                                                                                                        }
                                                                                                    }
                                                                                            
                                                                                                    break;
                                                                                            
                                                                                                case "OnUserFormPrerender":
                                                                                                    if (!isset($user) || $user->get('id') < 1) {
                                                                                                        return;
                                                                                                    }
                                                                                            
                                                                                                    if (!$modx->getCount('modPlugin', array('name' => 'AjaxManager', 'disabled' => false))) {
                                                                                                        $data['surname'] = htmlspecialchars($user->Profile->surname);
                                                                                                        $data['patronymic'] = htmlspecialchars($user->Profile->patronymic);
                                                                                                        $data['paid'] = date('m/d/Y', htmlspecialchars($user->Profile->paid));
                                                                                                        $dateRus = date('d.m.Y', htmlspecialchars($user->Profile->paid));
                                                                                            
                                                                                                        $modx->controller->addHtml("
                                                                                                            <script type='text/javascript'>
                                                                                                                Ext.ComponentMgr.onAvailable('modx-user-tabs', function() {
                                                                                                                    this.on('beforerender', function() {
                                                                                                                        var leftCol = this.items.items[0].items.items[0].items.items[0];
                                                                                                                        var rightCol = this.items.items[0].items.items[0].items.items[1];
                                                                                            
                                                                                                                        leftCol.items.insert(4, 'modx-user-surname', new Ext.form.TextField({
                                                                                                                            id: 'modx-user-surname',
                                                                                                                            name: 'surname',
                                                                                                                            fieldLabel: 'Фамилия',
                                                                                                                            xtype: 'textfield',
                                                                                                                            anchor: '100%',
                                                                                                                            maxLength: 255,
                                                                                                                            value: '{$data['surname']}',
                                                                                                                        }));
                                                                                            
                                                                                                                        leftCol.items.insert(5, 'modx-user-patronymic', new Ext.form.TextField({
                                                                                                                            id: 'modx-user-patronymic',
                                                                                                                            name: 'patronymic',
                                                                                                                            fieldLabel: 'Отчество',
                                                                                                                            xtype: 'textfield',
                                                                                                                            anchor: '100%',
                                                                                                                            maxLength: 255,
                                                                                                                            value: '{$data['patronymic']}',
                                                                                                                        }));
                                                                                            
                                                                                                                        rightCol.items.insert(0, 'modx-user-paid', new Ext.form.DateField({
                                                                                                                            id: 'modx-user-paid',
                                                                                                                            name: 'paid',
                                                                                                                            fieldLabel: 'Оплачено ДО конца этой даты rus: {$dateRus}',
                                                                                                                            xtype: 'datetime',
                                                                                                                            format: 'm/d/Y',
                                                                                                                            value: '{$data['paid']}',
                                                                                                                        }));
                                                                                            
                                                                                                                    });
                                                                                                                });
                                                                                                            </script>
                                                                                                        ");
                                                                                                    }
                                                                                            
                                                                                                    break;
                                                                                            
                                                                                                case "OnBeforeUserFormSave":
                                                                                                    $user->Profile->set('surname', $_POST['surname']);
                                                                                                    $user->Profile->set('patronymic', $_POST['patronymic']);
                                                                                                    $user->Profile->set('paid', strtotime($_POST['paid'].' 23:59:59'));
                                                                                            
                                                                                                    break;
                                                                                            }
                                                                                              Vit
                                                                                              Vit
                                                                                              15 марта 2024, 16:31
                                                                                              0
                                                                                              Здравствуйте.
                                                                                              Как адаптировать плагин под MODx 3?
                                                                                              Под MODx 3 не читает значения из полей пользователя, ни из modUser, ни из modUserProfile.

                                                                                              Получаются пустые значения, а при сохранении, в БД ничего не сохраняется :(
                                                                                                Ivan
                                                                                                02 августа 2024, 17:00
                                                                                                0
                                                                                                Я сделал так
                                                                                                Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                                                                                                137