ComboBox с данными из другой таблицы modExtra

27 сентября 2018, 21:09



При написании своего компонента на заготовке modExtra не редко встаёт задача сделать в какой-то таблицы возможность добавления данными через select из другой таблицы. На выходе у нас должно получиться что-то типа этого:



assets/components/extras/js/mgr/misc/combo.js — этот файл в нашей заготовке уже имеет пример добавления категории. Благодаря этому примеру я добавил в этом файле новый combobox элемент и его зарегистрировал:
Extras.combo.Repository = function (config) {
    config = config || {};

    Ext.applyIf(config, {
        name: 'repository_id',
        fieldLabel: _('repositories_' + config.name || 'repository'),
        hiddenName: 'repository_id',
        displayField: 'name',
        valueField: 'id',
        anchor: '99%',
        fields: ['name', 'id'],
        pageSize: 20,
        url: Extras.config['connector_url'],
        typeAhead: true,
        editable: true,
        allowBlank: true,
        emptyText: _('no'),
        minChars: 1,
        baseParams: {
            action: 'mgr/repository/getlist',
            combo: true,
            id: config.value,
        }
    });
    Extras.combo.Repository.superclass.constructor.call(this, config);
    this.on('expand', function () {
        if (!!this.pageTb) {
            this.pageTb.show();
        }
    });
};
Ext.extend(Extras.combo.Repository, MODx.combo.ComboBox);
а xtype в assets/components/extras/js/mgr/widgets/categories.window.js вышел такой:
{
            xtype: 'extras-combo-repository',
            fieldLabel: _('extras_category_repository'),
            anchor: '99%',
            allowBlank: true,
        },
Чтобы понимали, выкладываю код файла assets/components/extras/js/mgr/widgets/categories.window.js:
Extras.window.CreateCategory = function (config) {
    config = config || {};
    if (!config.id) {
        config.id = 'extras-category-window-create';
    }
    Ext.applyIf(config, {
        title: _('extras_category_create'),
        width: 550,
        autoHeight: true,
        url: Extras.config.connector_url,
        action: 'mgr/category/create',
        fields: this.getFields(config),
        keys: [{
            key: Ext.EventObject.ENTER, shift: true, fn: function () {
                this.submit()
            }, scope: this
        }]
    });
    Extras.window.CreateCategory.superclass.constructor.call(this, config);
};
Ext.extend(Extras.window.CreateCategory, MODx.Window, {

    getFields: function (config) {
        return [{
            xtype: 'textfield',
            fieldLabel: _('extras_category_name'),
            name: 'name',
            id: config.id + '-name',
            anchor: '99%',
            allowBlank: false,
        }, {
            xtype: 'extras-combo-repository',
            fieldLabel: _('extras_category_repository'),
            anchor: '99%',
            allowBlank: true,
        }, {
            xtype: 'xcheckbox',
            boxLabel: _('extras_category_active'),
            name: 'active',
            id: config.id + '-active',
            checked: true,
        }];
    },

    loadDropZones: function () {
    }

});
Ext.reg('extras-category-window-create', Extras.window.CreateCategory);


Extras.window.UpdateCategory = function (config) {
    config = config || {};
    if (!config.id) {
        config.id = 'extras-category-window-update';
    }
    Ext.applyIf(config, {
        title: _('extras_category_update'),
        width: 550,
        autoHeight: true,
        url: Extras.config.connector_url,
        action: 'mgr/category/update',
        fields: this.getFields(config),
        keys: [{
            key: Ext.EventObject.ENTER, shift: true, fn: function () {
                this.submit()
            }, scope: this
        }]
    });
    Extras.window.UpdateCategory.superclass.constructor.call(this, config);
};
Ext.extend(Extras.window.UpdateCategory, MODx.Window, {

    getFields: function (config) {
        return [{
            xtype: 'hidden',
            name: 'id',
            id: config.id + '-id',
        }, {
            xtype: 'textfield',
            fieldLabel: _('extras_category_name'),
            name: 'name',
            id: config.id + '-name',
            anchor: '99%',
            allowBlank: false,
        }, {
            xtype: 'extras-combo-repository',
            fieldLabel: _('extras_category_repository'),
            anchor: '99%',
            allowBlank: true,
        }, {
            xtype: 'xcheckbox',
            boxLabel: _('extras_category_active'),
            name: 'active',
            id: config.id + '-active',
        }];
    },

    loadDropZones: function () {
    }

});
Ext.reg('extras-category-window-update', Extras.window.UpdateCategory);


Чтобы в таблице Grid выводились не ID репозиториев, а их названия, то нужно в файле /core/components/extras/processors/mgr/category/getlist.class.php добавить в функцию leftJoin и select через API xPDO:

	public function prepareQueryBeforeCount(xPDOQuery $c)
	{
		$query = trim($this->getProperty('query'));

		$c->leftJoin('ExtrasRepositories', 'ExtrasRepositories', 'ExtrasRepositories.id = ExtrasCategories.repository_id');
		$c->select(array($this->modx->getSelectColumns('ExtrasCategories', 'ExtrasCategories')));
		$c->select(array('ExtrasRepositories.name as repository_name'));

		if ($query) {

			$c->where([
				'name:LIKE' => "%{$query}%",
				'OR:repository_id:LIKE' => "%{$query}%"
			]);
		}

		return $c;
	}
следующий код

		$c->leftJoin('ExtrasRepositories', 'ExtrasRepositories', 'ExtrasRepositories.id = ExtrasCategories.repository_id');
		$c->select(array($this->modx->getSelectColumns('ExtrasCategories', 'ExtrasCategories')));
		$c->select(array('ExtrasRepositories.name as repository_name'));
Андрей Копп
1    36    1
+4
    Загруженные файлы:
  • 2.png 58.75 kb

Комментарии ()

  1. Андрей Копп 02 октября 2018, 09:04 # +2
    Осталось разобраться как вывести в таблицу grid вместо id названия.

    Вы должны авторизоваться, чтобы оставлять комментарии.

    Топики

    Андрей Копп 03 октября 2018, 11:55
    Компоненты MODX Обзор компонента SEO Pro 0
    Андрей Копп 02 октября 2018, 11:18
    MODX Настройка MySQL 5.7 для работы pdoTools 0
    Андрей Копп 27 сентября 2018, 20:49
    MODX MinifyX в Fenom 0
    Андрей Копп 01 июля 2018, 15:13
    Другое Fenom в MODX (шпаргалки) 0

    Комментарии

    Андрей Копп 02 октября 2018, 09:04
    ComboBox с данными из другой таблицы modExtra 1
    Андрей Копп 08 сентября 2017, 20:24
    Всевозможная очистка кэша в Laravel 5 1