[РЕШЕНО] Неверный рендер комбобокса с мультиселектом
        Всем привет! 
Пытаюсь в кастомном компоненте создать комбобокс мультиселект, который получает список пользователей: поля 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
===================
Вот код комбобокса:
Метод setValueEx подсмотрел в минишопе для поля тегов.
Понимаю, что нужно верно рендер прописать, но не сображу, где именно. Не понимаю, почему при добавлении нового юзера нормально рендерится, а если загружаю страницу — то ерунда выходит.
Просьба подсказать, что я делаю не так? Заранее благодарю.
    
    
                                                                                
            Пытаюсь в кастомном компоненте создать комбобокс мультиселект, который получает список пользователей: поля 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 подсмотрел в минишопе для поля тегов.
Понимаю, что нужно верно рендер прописать, но не сображу, где именно. Не понимаю, почему при добавлении нового юзера нормально рендерится, а если загружаю страницу — то ерунда выходит.
Просьба подсказать, что я делаю не так? Заранее благодарю.
Комментарии: 4
                Если нужны прям юзеры MODx, то достаточно использовать готовый
                    xtype: 'modx-combo-user'            
                И он прямо мультиселект выдаёт?
С одиночным списком-то проблем нет
                    С одиночным списком-то проблем нет
                Нет, виноват, невнимательно прочитал            
                    
                После раздумий на свежую голову, допер наконец-то, что данные, которые прилетают в комбобокс из базы при открытии модального окна, нужно смотреть в общем процессоре get.class.php, а не процессоре, который в комбобокс отдает список пользователей. Разумеется, из процессора get приходит массив айдишников юзеров — skrinshoter.ru/s/261122/swgV0bFJ, а нужен массив, соответствующий комбобоксу — skrinshoter.ru/s/261122/OUfflCjn. Остальное дело техники, добавил нужный код в метод cleanup:
из кода самого комбика выкинул лишее:
Всё завелось — skrinshoter.ru/s/261122/6GN8iS6i.
В который раз убеждаюсь, что нельзя упираться надолго, если не получается найти решение, только мозг закипает… Голову проветрил и сразу дело пошло.
                    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.
В который раз убеждаюсь, что нельзя упираться надолго, если не получается найти решение, только мозг закипает… Голову проветрил и сразу дело пошло.
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.