Как добавить новую ассоциацию в продукт Shopware? - PullRequest
1 голос
/ 10 мая 2019

Я разрабатываю плагин для Shopware 5.5.8 «Запчасти», который будет расширять продукты (статьи в магазине). Я добавил FieldSet в Crosselling Tab и заставил его работать. Но я не могу найти, как получить добавленные продукты в функции onSaveArticle в Ext.define ('Shopware.apps.MyPlugin.controller.Detail', {.

Я также искал, как расширить модель Article в PHP и ExtJs и обнаружил, что расширение основных моделей вообще невозможно. Но я создал свою модель для Spareparts - эта таблица похожа на аналогичные продукты. Но чтобы код работал, мне нужно добавить поле в Article. Может быть, этого достаточно, чтобы переопределить model / article.js, но я не могу найти, как.

модель / main.js

Ext.define('Shopware.apps.MyPlugin.model.Main', {
    extend: 'Shopware.data.Model',

    configure: function () {
        console.log('Shopware.apps.MyPlugin.model.Main : configure');
        return {
            controller: 'MyPlugin',
            detail: 'Shopware.apps.MyPlugin.view.detail.Container'
        };
    },

    fields: [
        {name: 'id', type: 'int'},
        {name: 'name', type: 'string'},
        {name: 'number', type: 'string', mapping: 'mainDetail.number'}
    ],
});

магазин / main.js

Ext.define('Shopware.apps.MyPlugin.store.Main', {
    extend: 'Shopware.store.Listing',

    /**
     * Fields of the store records
     * @array
     */
    fields: ['id', 'name', 'number'],

    configure: function () {
        console.log('store/main.js:configure');
        return {
            controller: 'MyPlugin'
        };
    },
    model: 'Shopware.apps.MyPlugin.model.Main'
});

контроллер / main.js

Ext.define('Shopware.apps.MyPlugin.controller.Main', {
    override: 'Shopware.apps.Article.controller.Crossselling',

    init: function () {
        var me = this;
        console.log('controller/main.js:init');

        me.control({
            'article-detail-window article-crossselling-base': {
                addSparepartArticle: me.onAddSparepartArticle,
                removeSparepartArticle: me.onRemoveSparepartArticle
            },
        });

        // me.callParent will execute the init function of the overridden controller
        me.callParent(arguments);
    },

    onAddSparepartArticle: function (form, grid, searchField) {
        console.log('controller/main.js:onAddSparepartArticle');
        var me = this,
            selected = searchField.returnRecord,
            store = grid.getStore(),
            values = form.getValues();

        if (!form.getForm().isValid() || !(selected instanceof Ext.data.Model)) {
            return false;
        }
        var model = Ext.create('Shopware.apps.MyPlugin.model.Main', values);
        model.set('id', selected.get('id'));
        model.set('name', selected.get('name'));
        model.set('number', selected.get('number'));

        //check if the article is already assigned
        var exist = store.getById(model.get('id'));
        if (!(exist instanceof Ext.data.Model)) {
            store.add(model);
            form.getForm().reset();
        } else {
            Shopware.Notification.createGrowlMessage(me.snippets.existTitle, Ext.String.format(me.snippets.ersatzteil.exist, model.get('number')), me.ersatzteil.growlMessage);
        }
    },

    onRemoveSparepartArticle: function (grid, record) {
        console.log('controller/main.js:onRemoveSparepartArticle');
        var me = this,
            store = grid.getStore();

        if (record instanceof Ext.data.Model) {
            store.remove(record);
        }
    }
});

контроллер / detail.js

Ext.define('Shopware.apps.MyPlugin.controller.Detail', {
    override: 'Shopware.apps.Article.controller.Detail',

    onSaveArticle: function (win, article, options) {
        console.log('controller/detail.js:onSaveArticle');
        var me = this,
            originalCallback = options.callback,
            mainWindow = me.getMainWindow(),
            form;

        if (Ext.isEmpty(win)) {
            mainWindow = me.getMainWindow();
        } else {
            mainWindow = win;
        }

        form = mainWindow.detailForm;

        var customCallback = function (newArticle, success) {
            Ext.callback(originalCallback, this, arguments);

            /* Ext.Ajax.request({
                  method: 'POST',
                  url: '{url controller=MyPlugin action=saveData}',
                  params: {
                      _foreignKey: newArticle.get('mainDetailId'),
                      _table: 's_plugin_myplugin_sparepart',
                      __attribute_my_column: me.getBaseFieldSet().sparepart.getValue()
                  }
             });*/
        };

        if (!options.callback || options.callback.toString() !== customCallback.toString()) {
            options.callback = customCallback;
        }

        me.callParent([win, article, options]);
    },
});
...