Почему не показывается значение комбобокса при загрузке грида 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? Ещё одна непонятка.            
                    
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.