Я разрабатываю плагин для 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]);
},
});