Wie werden Assoziationen in einem Backend-Plugin richtig implementiert?

Hallo zusammen, ich kämpfe mich nun schon lange durch die Dokumentationen von ExtJS, Doctrine und Shopware, aber komme nicht auf einen grünen Zweig. Mir ist nicht ganz klar wie das Zusammenspiel von Backend Controllern und ExtJS funktioniert.

Ich möchte für ein (mMn) relativ simples Datenmodell Eingabemasken im Backend haben. Vereinfacht sieht das Modell so aus:

- Configuration:
  Article
  Categories

- Category:
  Configuration
  Elements

- Element:
  Category
  Article

Es besteht also jeweils eine 1:n Beziehung zwischen ConfigurationCategory und CategoryElement. Ich habe zuerst versucht dem Beispiel unter https://developers.shopware.com/developers-guide/backend-components/associations/ zu folgen. Dort ist derselbe Beziehungstyp zwischen ProductVariant vorhanden. Wenn man das Plugin dort jedoch mal installiert merkt man gleich, dass das dortige Beispiel nicht funktioniert. Beim Drücken auf “Hinzufügen” bei Variants passiert nichts.

Ich habe es hinbekommen, dass ich Records über ein assoziiertes Grid.Panel hinzufügen kann indem ich für jedes Model (Configuration, Category und Element) einen eigenen Backend Controller erstellt habe und diesen im ExtJS-Model in der Proxy-Eigenschaft hinterlege.

Blöderweise habe werden mit im assozierten Grid.Panel dann immer alle (und nicht nur die zugeordneten) Records angezeigt. Es findet sogar eine doppelte Speicherung statt wenn man z.B. eine zweite Category aufmacht, dieser keine Elements zuordnet und die (fälschlich) gelisteten Elements der ersten Category im Grid.Panel belässt bevor man die Category speichert.

Auch wird beim Hinzufügen einer Category zu einer Configuration (bzw. eines Elements zu einer Category) nicht die configuration.id als category.configurationId (bzw. category.id als element.categoryId) übernommen, sondern ich muss diese ID manuell eintragen (bzw. mittels Dropdown auswählen).

Ich bin mir sihcer das ich etwas grundlegend verkehrt verstanden haben muss, denn so kann das ganze ja nicht gedacht sein. Hatt jemand einen Denkanstoß / Hinweis wie man solch ein Datenmodell vernünftig mit Backend-Controllern austatttet und diese mit ExtJS vereint?

Hier ein paar Quellcode-Auzüge:

class Shopware_Controllers_Backend_MyConfigurator extends Shopware_Controllers_Backend_Application
{
    protected $model = 'Shopware\CustomModels\MyConfigurator\Configuration';
    protected $alias = 'configuration';
}

class Shopware_Controllers_Backend_MyConfiguratorCategory extends Shopware_Controllers_Backend_Application
{
    protected $model = 'Shopware\CustomModels\MyConfigurator\Category';
    protected $alias = 'category';
}

class Shopware_Controllers_Backend_MyConfiguratorElement extends Shopware_Controllers_Backend_Application
{
    protected $model = 'Shopware\CustomModels\MyConfigurator\Element';
    protected $alias = 'element';
}

Ext.define('Shopware.apps.MyConfigurator', {
    extend: 'Enlight.app.SubApplication',

    name: 'Shopware.apps.MyConfigurator',

    loadPath: '{url action=load}',
    bulkLoad: true,

    controllers: ['Configuration'],

    views: [
        'configuration.ListingWindow',
        'configuration.ListingGrid',
        'configuration.DetailWindow',
        'configuration.DetailContainer',

        'category.ListingGrid',
        'category.DetailWindow',
        'category.DetailContainer',

        'element.ListingGrid',
        'element.DetailWindow',
        'element.DetailContainer'
    ],

    models: ['Configuration', 'Category', 'Element'],

    stores: ['Configuration', 'Category', 'Element'],

    launch: function() {
        return this.getController('Configuration').mainWindow;
    }
});


Ext.define('Shopware.apps.MyConfigurator.store.Category', {

    extend:'Shopware.store.Association',

    model: 'Shopware.apps.MyConfigurator.model.Category',
 
    configure: function() {
        return {
            controller: 'MyConfiguratorCategory'
        };
    }
});

Ext.define('Shopware.apps.MyConfigurator.model.Category', {
    
    extend: 'Shopware.data.Model',
 
    configure: function() {
        return {
            controller: 'MyConfiguratorCategory',
            listing: 'Shopware.apps.MyConfigurator.view.category.ListingGrid',
            detail: 'Shopware.apps.MyConfigurator.view.category.DetailContainer'
        };
    },
 
    fields: [
        { name: 'id', type: 'int' },
        { name: 'configurationId', type: 'int' },
        { name: 'name', type: 'string' }
    ],

    associations: [
        // { relation: 'ManyToOne', field: 'configurationId', type: 'belongsTo', model: 'Shopware.apps.ImConfigurator.model.Configuration', name: 'getConfiguration', associationKey: 'configuration' },
        { relation: 'OneToMany', type: 'hasMany', model: 'Shopware.apps.ImConfigurator.model.Element', name: 'getElements', associationKey: 'elements', foreignKey: 'categoryId' }
    ],

    proxy: {
        type: 'ajax',
        api: {
            read: '{url controller="MyConfiguratorCategory" action="list"}',
            detail: '{url controller="MyConfiguratorCategory" action="detail"}',
            create: '{url controller="MyConfiguratorCategory" action="create"}',
            update: '{url controller="MyConfiguratorCategory" action="update"}',
            destroy: '{url controller="MyConfiguratorCategory" action="delete"}'
        },
        reader: {
            type: 'json',
            root: 'data',
            totalProperty: 'total'
        }
    }
});