[РЕШЕНО] Неверный рендер комбобокса с мультиселектом
Всем привет!
Пытаюсь в кастомном компоненте создать комбобокс мультиселект, который получает список пользователей: поля 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.
В который раз убеждаюсь, что нельзя упираться надолго, если не получается найти решение, только мозг закипает… Голову проветрил и сразу дело пошло.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.