Почему не показывается значение комбобокса при загрузке грида extJs?
Всем привет!
Понадобилось соорудить в админке таблицу кастомного компонента для калькулятора. Накидал каркас, всё выводит нормально — skrinshoter.ru/s/060522/r07oyB9n. В первых шести колонках добавил комбобоксы, которые выводят списки опций из других таблиц — skrinshoter.ru/s/060522/1OQgRoHh?a. Всё чин по чину, запросы в процессор улетают, тот отдаёт массив данных, которые выводятся в выпадающем списке комбобокса.
Столкнулся с непоняткой: при загрузке страницы админки с гридом иногда — совершенно бессистемно — выбранные в комбобоксах данные не отображаются — skrinshoter.ru/s/060522/fbasYeKp?a. Помогает только обновление грида — skrinshoter.ru/s/060522/qiJNEEiL
Вот сам комбобокс
вот его вызов в таблице:
вот процессор:
Что я мог пропустить, направьте, пожалуйста.
Понадобилось соорудить в админке таблицу кастомного компонента для калькулятора. Накидал каркас, всё выводит нормально — skrinshoter.ru/s/060522/r07oyB9n. В первых шести колонках добавил комбобоксы, которые выводят списки опций из других таблиц — skrinshoter.ru/s/060522/1OQgRoHh?a. Всё чин по чину, запросы в процессор улетают, тот отдаёт массив данных, которые выводятся в выпадающем списке комбобокса.
Столкнулся с непоняткой: при загрузке страницы админки с гридом иногда — совершенно бессистемно — выбранные в комбобоксах данные не отображаются — skrinshoter.ru/s/060522/fbasYeKp?a. Помогает только обновление грида — skrinshoter.ru/s/060522/qiJNEEiL
Вот сам комбобокс
CalcPackage.combo.TemplatePage = function (config) {
config = config || {};
Ext.applyIf(config, {
displayField: 'display',
hiddenName: 'display',
valueField: 'unit',
editable: false,
fields: ['unit','display'],
url: CalcPackage.config.connector_url,
triggerConfig: {
tag: 'span',
cn: [
{
tag: 'div',
cls: 'x-form-trigger',
trigger: ''
},
]
},
baseParams: {
action: 'mgr/calcprice/pagegetlist',
class: 'CalcPage',
combo: true,
empty: false
}
});
CalcPackage.combo.TemplatePage.superclass.constructor.call(this, config);
};
Ext.extend(CalcPackage.combo.TemplatePage, CalcPackage.combo.ComboBox);
Ext.reg('calcpackage-combo-template-page', CalcPackage.combo.TemplatePage);
вот его вызов в таблице:
{
header:_('calcpackage_calcprice_header_page_id'),
dataIndex: 'page_id',
sortable: true,
editor: {
xtype: 'calcpackage-combo-template-page',
renderer: true
},
}
вот процессор:
<?php
/**
* Get a list of calc options
*/
class PageGetListProcessor extends modObjectGetListProcessor {
public function process() {
$i = 0;
$props = $this->getProperties();
$class = $props['class'];
$arrTypes = [];
if($props['empty']) {
$arrTypes[0]['unit'] = 0;
$arrTypes[0]['display'] = '...';
$i++;
}
$q = $this->modx->newQuery($class);
$q->select(['id', 'name']);
if ($q->prepare() && $q->stmt->execute()) {
$pages = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
foreach($pages as $page) {
$arrTypes[$i]['unit'] = $page['id'];
$arrTypes[$i]['display'] = $page['name'];
$i++;
}
}
$count = count($arrTypes);
return $this->outputArray($arrTypes, $count);
}
}
return 'PageGetListProcessor';
Что я мог пропустить, направьте, пожалуйста.
Комментарии: 6
Я думаю, что проблема с самим comboBox, у меня иногда в minishop2 в таблицах не выводится производитель. И вы правы, что совершенно бессистемно.
Роман, так понимаю, вендор не выводится тоже в каких-то кастомных таблицах? Не могу сообразить, где в админке по дефолту это может быть.
Я спросил одного очень уважаемого разработчика, тот ответил, что «Это глюки работы самого комбобокса в гриде, в основном как я понял из-за того что данные в него не успевают вовремя подгрузиться».
Наверно, в этом есть своя логика: при формирования строки таблицы идет запрос к процессору, а из комбобокса параллельно летят запросы в другие процессоры и непонятно, какой из запросов вернется первый. Получается, что решением будет по возможности избегать в гриде комбобоксов со сторонних таблиц? То есть, в форме редактирования — пожалуйста, а в гриде — просто текущее значение выводим.
Это только мои размышления вслух, в extJs я совсем «по верхам» работаю — в стиле «скопировал, поправил, проверил»)) Возможно, я ошибаюсь в самой логике запросов — пусть меня поправят старшие товарищи.
Я спросил одного очень уважаемого разработчика, тот ответил, что «Это глюки работы самого комбобокса в гриде, в основном как я понял из-за того что данные в него не успевают вовремя подгрузиться».
Наверно, в этом есть своя логика: при формирования строки таблицы идет запрос к процессору, а из комбобокса параллельно летят запросы в другие процессоры и непонятно, какой из запросов вернется первый. Получается, что решением будет по возможности избегать в гриде комбобоксов со сторонних таблиц? То есть, в форме редактирования — пожалуйста, а в гриде — просто текущее значение выводим.
Это только мои размышления вслух, в extJs я совсем «по верхам» работаю — в стиле «скопировал, поправил, проверил»)) Возможно, я ошибаюсь в самой логике запросов — пусть меня поправят старшие товарищи.
Просто extjs уже 7.5, а мы все еще ковыряемся в 3.4. Может стоит как-то настройки поменять в Ext.form.ComboBox. Если заменить на обычный селект, изменится ли что-то?
В качестве эксперимента поменял конфиг комбобокса, который подтягивает данные с процессора, на локальный:
Проблема у соответствующего поля исчезла, как страницу контроллера не перезагружал, выбранное поле выводится.
Общие выводы:
в таблице БД, которую выводит грид, значение поля (на которое установлен комбобокс) хранится в цифровом виде. При загрузке страницы процессор дергает значение поля, затем комбобокс — для данного примера — обрабатывает ЛОКАЛЬНО это значение, подсовывая строку из массива — skrinshoter.ru/s/150522/fUKjGSB6.
Если же комбобокс настроен на работу со своим процессором, то — получив значение поля из процессора грида — он отправляет запрос к этому своему процессору, ждет и выводит ответ в гриде. И вот на этой дельте между получением значения из основного процессора, отправкой запроса и получением ответа от своего процессора всё плохое и происходит.
В итоге, так и непонятно, что делать в этом случае. Не будешь ведь добавлять js-костыль, который после полной загрузки страницы будет генерировать событие click по этой кнопке skrinshoter.ru/s/150522/s76QqLsq
CalcPackage.combo.TemplatePage = function (config) {
config = config || {};
Ext.applyIf(config, {
store: new Ext.data.ArrayStore({
id: 0
,fields: ['unit','display']
,typeAhead: true
,typeAheadDelay: 2000
,preventRender: true
,triggerConfig: {
tag: 'span',
cn: [
{
tag: 'div',
cls: 'x-form-trigger',
trigger: ''
},
]
}
,data: [
['1','listovki']
,['2','vizitki']
]
})
,mode: 'local'
,displayField: 'display'
,hiddenName: 'display'
,valueField: 'unit'
});
CalcPackage.combo.TemplatePage.superclass.constructor.call(this, config);
};
Ext.extend(CalcPackage.combo.TemplatePage, CalcPackage.combo.ComboBox);
Ext.reg('calcpackage-combo-template-page', CalcPackage.combo.TemplatePage);
Проблема у соответствующего поля исчезла, как страницу контроллера не перезагружал, выбранное поле выводится.
Общие выводы:
в таблице БД, которую выводит грид, значение поля (на которое установлен комбобокс) хранится в цифровом виде. При загрузке страницы процессор дергает значение поля, затем комбобокс — для данного примера — обрабатывает ЛОКАЛЬНО это значение, подсовывая строку из массива — skrinshoter.ru/s/150522/fUKjGSB6.
Если же комбобокс настроен на работу со своим процессором, то — получив значение поля из процессора грида — он отправляет запрос к этому своему процессору, ждет и выводит ответ в гриде. И вот на этой дельте между получением значения из основного процессора, отправкой запроса и получением ответа от своего процессора всё плохое и происходит.
В итоге, так и непонятно, что делать в этом случае. Не будешь ведь добавлять js-костыль, который после полной загрузки страницы будет генерировать событие click по этой кнопке skrinshoter.ru/s/150522/s76QqLsq
Правильно ли я понял, что данные не успевают загрузится, а грид уже сформировался?
Получается, что так. Но с другой стороны, почему всегда стопроцентно загружаются всё поля, когда кликаешь тут — skrinshoter.ru/s/150522/s76QqLsq? Ещё одна непонятка.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.