Extjs Erweiterung des Resourcen-Tab

Hallo zusammen,

ich versuche im Backend den Resourcen-Tab in den Artikeldetails zu erweitern. Konkret möchte ich ein zusätzliches Inputfeld nach dem Namen bei den Downloads integrieren.

Jedoch scheitere ich bereits an dem einfachen Überschreiben der entprechenden Extjs-Datei. Die Artikeldetails lassen sich bei aktiven Plugin nicht mehr öffnen.

Auszug aus Bootstrap.php

/**
 * Registers all necessary events and hooks.
 */
private function registerEvents()
{
    $this->subscribeEvent(
        'Enlight_Controller_Action_PostDispatch_Backend_Article',
        'onArticlePostDispatch'
    );
}

public function onArticlePostDispatch(Enlight_Event_EventArgs $args)
{
    $controller = $args->getSubject();
    $view = $controller->View();
    $request = $controller->Request();

    $view->addTemplateDir( __DIR__. '/Views');

    //if the controller action name equals "load" we have to load all application components
    if ($request->getActionName() === 'load') {
        $view->extendsTemplate('backend/shop_aware_resources/article/view/resources/downloads.js');
    }
}

download.js

//{block name="backend/article/view/resources/downloads"}
Ext.define('Shopware.apps.ShopAwareResources.article.view.resources.Downloads', {
    override: 'Shopware.apps.Article.view.resources.Downloads'
});
//{/block}

Um mögliche Fehlerquellen zu vermeiden, mache ich nur einen einfaches Überschreiben und implementiere zunächst noch nicht das zusätzliche Inputfeld. Doch schon das schlägt anscheinend fehl.

Ich bin über jede Hilfe dankbar, da ich schon set mehreren Tagen dran sitze und absolut ratlos bin.

Ich hatte ein “append” vergessen.

downloads.js

//{block name="backend/article/view/resources/downloads" append}
Ext.define('Shopware.apps.ShopAwareResources.view.resources.Downloads', {
    override: 'Shopware.apps.Article.view.resources.Downloads'
});
//{/block}

Ich habe das Ganze um ein Inputfeld und das Zusatzattribut “ggShopIds” erweitert.

download_attribute.js

//{block name="backend/article/model/download_attribute/fields" append}
    { name: 'ggShopIds', type: 'string' },
//{/block}

downloads.js

//{block name="backend/article/view/resources/downloads" append}
Ext.define('Shopware.apps.ShopAwareResources.view.resources.Downloads', {
    override: 'Shopware.apps.Article.view.resources.Downloads',

    /**
     * Creates the form panel for the download container.
     * @return Ext.form.Panel
     */
    createDownloadForm: function() {
        var me = this;

        me.downloadFormElements = me.callParent(arguments);

        var shopField = {
            xtype: 'textfield',
            name: 'attribute[ggShopIds]',
            fieldLabel: 'Shoplimitierung',
            allowBlank: true
        };

        me.downloadFormElements.insert(2, shopField);

        return me.downloadFormElements;
    },

    /**
     * Creates the grid for the already assigned article downloads
     * @return Ext.grid.Panel
     */
    createDownloadGrid: function() {
        var me = this;

        me.downloadGridElements = me.callParent(arguments);

        var column = Ext.create('Ext.grid.column.Column', {
            text: 'ShopLimitierung',
            dataIndex: 'attribute[ggShopIds]'
        });

        me.downloadGridElements.headerCt.insert(
            me.downloadGridElements.columns.length - 1, // that's index column
            column
        );

        return me.downloadGridElements;
    }
});
//{/block}

Leider wird das Zusatzattrbut “ggShopIds” weder gespeichert noch im Grid angezeigt.

Hat jemand eine Idee, was hier schief geht?

Hallo,

für welche Shopware Version entwickelst du denn das Plugin? Für bis Version 5.1.6 oder ab Version 5.2.0?

Beste Grüße

Sebastian

Sorry, das habe ich vergessen zu schreiben. Die Version ist 5.1.6.

Die Darstellung des Extraattributes habe ich jetzt hinbekommen.

Auszug aus download.js:

/**
 * Creates the grid for the already assigned article downloads
 * @return Ext.grid.Panel
 */
createDownloadGrid: function() {
    var me = this;

    me.downloadGridElements = me.callParent(arguments);

    var column = Ext.create('Ext.grid.column.Column', {
        text: 'ShopLimitierung',
        dataIndex: 'attribute[ggShopIds]',
        renderer: function(value, metaData, record) {
            if (record && record.getAttributes() instanceof Ext.data.Store && record.getAttributes().getCount() > 0) {
                return record.getAttributesStore.data.items[0].data.ggShopIds;
            } else {
                return '';
            }
        }
    });

    me.downloadGridElements.headerCt.insert(
        me.downloadGridElements.columns.length - 1, // that's index column
        column
    );

    return me.downloadGridElements;
}

Das Speichern funktioniert leider noch nicht.

Ich hab nun eine Lösung für die Speicherung der Attribute gefunden. Dazu war es nötig ‘Shopware.apps.Article.controller.Detail’ zu überschreiben.

//{block name="backend/article/controller/detail" append}
Ext.define('Shopware.apps.ShopAwareResources.controller.Detail', {

    override: 'Shopware.apps.Article.controller.Detail',

    /**
     * Event listener function of the resources component.
     * Fired when the user clicks the add download button.
     *
     * @event
     * @param [Ext.grid.Panel] The download grid
     * @param [Ext.form.Panel] The download panel for the link
     */
    onAddDownload: function(grid, form) {
        var me = this, model,
            store = grid.getStore(),
            values = form.getValues();

        if (!form.getForm().isValid()) {
            return;
        }
        if (form.getForm().getRecord()) {
            model = form.getForm().getRecord();
            form.getForm().updateRecord(model);
        } else {
            model = Ext.create('Shopware.apps.Article.model.Download', values);
            var attrRecord = Ext.create('Shopware.apps.Article.model.DownloadAttribute');
            attrRecord.set('ggShopIds', values['attribute[ggShopIds]']);
            model.getAttributes().add(attrRecord);
        }

        store.add(model);
        form.getForm().reset();
    }

});
//{/block}

 

1 „Gefällt mir“