Hallo zusammen. Leider habe ich zu diesem Thema im Forum keine umfassende Antwort finden können. Ich habe mir Informationen aus ein paar Beiträgen zusammengetragen, und nach einigem Ausprobieren und Rumgefrickel habe ich es endlich geschafft. Da es für einige andere interessant sein dürfte, teile ich hier mal meine Ergebniss mit euch. Los geht’s. Da die komplette Anleitung zu lang für einen Beitrag ist, muss ich das aufsplitten.
Ordner und Dateien
Hier ist die Strukturübersicht. Das Plugin wird natürlich etwas mehr machen, als nur Attribute anzulegen und auf einem separaten Reiter im Backend darzustellen. Daher dürfen die Ordner „Components“, „Controllers“ und „Models“ ignoriert werden. Ich werde auch nicht auf die Uninstaller-Klasse eingehen.
custom/plugins/FdIcecat/FdIcecat.php
Die Plugin-Basisdatei. Installation und Deinstallation sind in eigene Klassen ausgelagert.
container->get('models'),
$this->container->get('shopware_attribute.crud_service')
);
$installer->install();
}
/**
* {@inheritdoc}
* @throws \Exception
*/
public function uninstall(UninstallContext $context)
{
$uninstaller = new Uninstaller(
$this->container->get('models'),
$this->container->get('shopware_attribute.crud_service'),
$this->container->get('dbal_connection')
);
$uninstaller->uninstall($context->keepUserData());
$context->scheduleClearCache(UninstallContext::CACHE_LIST_ALL);
}
}
custom/plugins/FdIcecat/Setup/Installer.php
Die Installer-Klasse. Auf installModels() gehe ich nicht weiter ein, da die Funktion für diesen Thread nicht relevant ist. Der Installer legt vier neue Produktattribute an, die standardmäßig nicht im Backend angezeigt werden.
modelManager = $modelManager;
$this->attributeCrudService = $crudService;
}
/**
* @throws ToolsException
* @throws Exception
*/
public function install()
{
$this->installModels();
$this->installAttributes();
}
/**
* @throws ToolsException
*/
private function installModels() {
$tool = new SchemaTool($this->modelManager);
$classMetaData = [
$this->modelManager->getClassMetadata(Category::class),
$this->modelManager->getClassMetadata(FeatureGroup::class),
$this->modelManager->getClassMetadata(ProductFeature::class),
$this->modelManager->getClassMetadata(ProductFeatureValue::class),
];
$tool->createSchema($classMetaData);
}
/**
* @throws Exception
*/
private function installAttributes()
{
$this->attributeCrudService->update(
's_articles_attributes',
'fd_icecat_id',
'integer',
[
'label' => 'Icecat product id',
'position' => 20,
]
);
$this->attributeCrudService->update(
's_articles_attributes',
'fd_icecat_similar_id',
'integer',
[
'label' => 'Similar Icecat product id',
'position' => 20,
]
);
$this->attributeCrudService->update(
's_articles_attributes',
'fd_icecat_use_icecat_data',
'boolean',
[
'label' => 'Use Icecat data',
'helpText' => 'Activate this option to populate this article with data from Icecat',
'position' => 20
],
null,
false,
true
);
$this->attributeCrudService->update(
's_articles_attributes',
'fd_icecat_last_update',
'datetime',
[
'label' => 'Last Icecat update',
'position' => 20
]
);
}
}
Damit habe wir unsere neuen Attribute. Jetzt kümmern wir uns um das Backend.
custom/plugins/FdIcecat/Resources/views/backend/article_icecat/view/detail/window.js
//{block name="backend/article/view/detail/window" append}
Ext.define('Shopware.apps.ArticleIcecat.view.detail.Window', {
override: 'Shopware.apps.Article.view.detail.Window',
createMainTabPanel: function () {
var me = this;
me.callParent(arguments);
me.registerAdditionalTab(
{
'title': 'Icecat',
'contentFn': me.createIcecatTab,
'articleChangeFn': me.refreshIcecatTab,
'insertIndex': 1,
'tabConfig': {
autoscroll: true,
bodyPadding: 10
},
},
'Ext.form.Panel'
);
return me.mainTab;
},
createIcecatTab: function (article, stores, eOpts) {
var me = this;
me.icecatTab = Ext.create('widget.article-icecat');
eOpts.tab.add(me.icecatTab);
eOpts.tab.setDisabled(false);
me.refreshIcecatTab();
},
refreshIcecatTab: function () {
var me = this;
if (me.article.get('mainDetailId')) {
Ext.Ajax.request({
url: '{url controller=AttributeData action=loadData}',
params: {
_foreignKey: me.article.get('mainDetailId'),
_table: 's_articles_attributes'
},
success: function(responseData, request) {
var response = Ext.JSON.decode(responseData.responseText);
me.setIcecatFormValues(response.data);
}
});
}
},
setIcecatFormValues: function (data) {
var me = this;
me.icecatTab.icecatId.setValue(data['__attribute_fd_icecat_id']);
me.icecatTab.similarIcecatId.setValue(data['__attribute_fd_icecat_similar_id']);
me.icecatTab.useDataField.setValue(data['__attribute_fd_icecat_use_icecat_data']);
me.icecatTab.lastUpdate.setValue(data['__attribute_fd_icecat_last_update'])
}
});
//{/block}
Es wird die Standarddetailansicht der Artikel überschrieben. createMainTabPanel ist für das Erstellen der Reiter zuständig. Zunächst wird die Originalfunktion aufgerufen, danach füge ich meinen eigenen Reiter über registerAdditionalTab hinzu. Mit ‚insertIndex‘: 1 lege ich fest, dass dieser direkt nach dem Stammdaten-Reiter eingefügt werden soll. Ferner benutze ich als Typ ein Formular-Panel („Ext.form.Panel“), weil ich damit später im Controller die Feldwerte dieses Reiters bequem per getValues() abrufen kann. createIcecatTab instanziiert den Icecat-Reiter („widget.article-icecat“), der im nächsten Schritt definiert wird, fügt ihn in die Reiterliste ein, aktiviert ihn und lädt dann die Werte aus der Datenbank über refreshIcecatTab. refreshIcecatTab ist fast 1:1 aus dem Developer Guide übernommen, prüft aber noch auf das Vorhandensein eines Artikels, weil es sonst Probleme bei der Neuanlage gibt. Dieselbe Funktion wird ausserdem als Callback für ‚articleChangeFn‘ genutzt. Damit funktioniert das ganze auch in der SplitView.