Почему не показывается значение комбобокса при загрузке грида extJs?

Всем привет!

Понадобилось соорудить в админке таблицу кастомного компонента для калькулятора. Накидал каркас, всё выводит нормально — 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';

Что я мог пропустить, направьте, пожалуйста.
Alexey
06 мая 2022, 16:54
modx.pro
682
0

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

Роман
11 мая 2022, 10:10
0
Я думаю, что проблема с самим comboBox, у меня иногда в minishop2 в таблицах не выводится производитель. И вы правы, что совершенно бессистемно.
    Alexey
    12 мая 2022, 15:12
    0
    Роман, так понимаю, вендор не выводится тоже в каких-то кастомных таблицах? Не могу сообразить, где в админке по дефолту это может быть.

    Я спросил одного очень уважаемого разработчика, тот ответил, что «Это глюки работы самого комбобокса в гриде, в основном как я понял из-за того что данные в него не успевают вовремя подгрузиться».

    Наверно, в этом есть своя логика: при формирования строки таблицы идет запрос к процессору, а из комбобокса параллельно летят запросы в другие процессоры и непонятно, какой из запросов вернется первый. Получается, что решением будет по возможности избегать в гриде комбобоксов со сторонних таблиц? То есть, в форме редактирования — пожалуйста, а в гриде — просто текущее значение выводим.

    Это только мои размышления вслух, в extJs я совсем «по верхам» работаю — в стиле «скопировал, поправил, проверил»)) Возможно, я ошибаюсь в самой логике запросов — пусть меня поправят старшие товарищи.
      Роман
      12 мая 2022, 16:13
      0
      Просто extjs уже 7.5, а мы все еще ковыряемся в 3.4. Может стоит как-то настройки поменять в Ext.form.ComboBox. Если заменить на обычный селект, изменится ли что-то?
        Alexey
        15 мая 2022, 17:48
        0
        В качестве эксперимента поменял конфиг комбобокса, который подтягивает данные с процессора, на локальный:

        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
          Роман
          15 мая 2022, 18:19
          0
          Правильно ли я понял, что данные не успевают загрузится, а грид уже сформировался?
            Alexey
            15 мая 2022, 19:22
            0
            Получается, что так. Но с другой стороны, почему всегда стопроцентно загружаются всё поля, когда кликаешь тут — skrinshoter.ru/s/150522/s76QqLsq? Ещё одна непонятка.
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    6