[РЕШЕНО] Неверный рендер комбобокса с мультиселектом

Всем привет!

Пытаюсь в кастомном компоненте создать комбобокс мультиселект, который получает список пользователей: поля id и username. Из процессора корректно передается массив — skrinshoter.ru/s/191122/9guQcb0X, в самом комбобоксе список выводится и позволяет выбрать, при сохранении в БД нормально заносится:

skrinshoter.ru/s/191122/KdYFNxWQ
skrinshoter.ru/s/191122/JgNBHWGa
skrinshoter.ru/s/191122/X8qrW3eP

но если заново открываю модальное окно, то показывается так (только id, без username):

skrinshoter.ru/s/191122/SlDXBg6s

===================
Вот код комбобокса:

RewardsPupil.combo.Options = function(config) {
    config = config  {};
    Ext.applyIf(config,{
        xtype:'superboxselect'
        ,allowBlank: true
        ,msgTarget: 'username'
        ,allowAddNewData: true
        ,addNewDataOnBlur : false
        ,resizable: true
        ,name: config.name  'properties'
        ,anchor:'100%'
        ,minChars: 2
        ,store:new Ext.data.JsonStore({
            id: (config.name || 'properties') + '-store'
            ,root:'results'
            ,autoLoad: true
            ,autoSave: false
            //,totalProperty:'total'
            ,fields:['id','username']
            ,url:RewardsPupil.config.connector_url
            ,baseParams: {
                action: 'mgr/user/getoptions'
                ,id: config.name
            }
        })
        ,mode: 'remote'
        ,displayField: 'username'
        ,displayFieldTpl: '{username} ({id})'
        ,valueField: 'id'
        ,triggerAction: 'all'
        ,extraItemCls: 'x-tag'
        ,expandBtnCls: 'x-form-trigger'
        ,clearBtnCls: 'x-form-trigger'
        ,renderTo: Ext.getBody()
        ,setValueEx : function (data) {
            if (this.rendered && this.valueField) {
                if (!Ext.isArray(data)) {
                    data = [data];
                }
                var values = [];
                Ext.each(data,function (value, i) {
                    if (typeof value == 'string' && value != '') {
                        value = {};
                        value[this.valueField] = data[i];
                    }
                    if (typeof value == 'object' && value[this.valueField]) {
                        values.push(value);
                    }
                },this);
                data = values;
            }

            this.constructor.prototype.setValueEx.apply(this, [data]);
        }
    });
    config.name += '[]';
    RewardsPupil.combo.Options.superclass.constructor.call(this,config);
};
Ext.extend(RewardsPupil.combo.Options,Ext.ux.form.SuperBoxSelect);
Ext.reg('rewardspupil-combo-options',RewardsPupil.combo.Options);

Метод setValueEx подсмотрел в минишопе для поля тегов.

Понимаю, что нужно верно рендер прописать, но не сображу, где именно. Не понимаю, почему при добавлении нового юзера нормально рендерится, а если загружаю страницу — то ерунда выходит.

Просьба подсказать, что я делаю не так? Заранее благодарю.
Alexey
22 ноября 2022, 14:57
modx.pro
579
0

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

Kirill A. Rusanov
22 ноября 2022, 19:26
0
Если нужны прям юзеры MODx, то достаточно использовать готовый
xtype: 'modx-combo-user'
    Alexey
    22 ноября 2022, 19:33
    0
    И он прямо мультиселект выдаёт?

    С одиночным списком-то проблем нет
    Kirill A. Rusanov
    22 ноября 2022, 19:44
    0
    Нет, виноват, невнимательно прочитал
      Alexey
      27 ноября 2022, 00:03
      0
      После раздумий на свежую голову, допер наконец-то, что данные, которые прилетают в комбобокс из базы при открытии модального окна, нужно смотреть в общем процессоре get.class.php, а не процессоре, который в комбобокс отдает список пользователей. Разумеется, из процессора get приходит массив айдишников юзеров — skrinshoter.ru/s/261122/swgV0bFJ, а нужен массив, соответствующий комбобоксу — skrinshoter.ru/s/261122/OUfflCjn. Остальное дело техники, добавил нужный код в метод cleanup:

      public function cleanup() {
          $array = $this->object->toArray();
          
          $tmp = [];
          foreach($array['properties'] as $key => $item) {
              if($tmp_user = $this->modx->getObject('modUser', $item)) {
                  $tmp[$key]['id'] = $item;
                  $tmp[$key]['username'] = $tmp_user->get('username');
              }
          }
          $array['properties'] = $tmp;
      
          return $this->success('', $array);
      }

      из кода самого комбика выкинул лишее:

      RewardsPupil.combo.Options = function (config) {
          config = config || {};
          Ext.applyIf(config, {
              xtype: 'superboxselect',
              allowBlank: true,
              allowAddNewData: true,
              addNewDataOnBlur: false,
              resizable: true,
              name: 'properties',
              anchor: '100%',
              minChars: 2,
              store: new Ext.data.JsonStore({
                  id: (config.name || 'properties') + '-store',
                  root: 'results',
                  autoLoad: true,
                  autoSave: false,
                  totalProperty: 'total',
                  fields: ['username','id'],
                  url: RewardsPupil.config.connector_url,
                  baseParams: {
                      action: 'mgr/user/getoptions',
                  }
              }),
              mode: 'remote',
              displayField: 'username',
              displayFieldTpl: '{username} ({id})',
              valueField: 'id',
              triggerAction: 'all',
              extraItemCls: 'x-tag',
              expandBtnCls: 'x-form-trigger',
              clearBtnCls: 'x-form-trigger',
              renderTo: Ext.getBody(),
          });
          config.name += '[]';
          RewardsPupil.combo.Options.superclass.constructor.call(this,config);
      };
      Ext.extend(RewardsPupil.combo.Options, Ext.ux.form.SuperBoxSelect);
      Ext.reg('rewardspupil-combo-options', RewardsPupil.combo.Options);

      Всё завелось — skrinshoter.ru/s/261122/6GN8iS6i.

      В который раз убеждаюсь, что нельзя упираться надолго, если не получается найти решение, только мозг закипает… Голову проветрил и сразу дело пошло.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        4