Erweiterung Plugin durch Plugin (Extjs): TypeError: Cannot read property '$isClass' of null

Hallo.

Ich versuche gerade ein Addon für ein gekauftes Plugin zu schreiben. Das funktioniert soweit auch ganz gut jedoch erhalten ich den Fehler “TypeError: Cannot read property ‘$isClass’ of null” sobald ich probiert die ExtJs Klasse des Plugin mit override zu überschreiben. Anscheinend ist die zu überschreibende Klasse noch nicht vollständig instanziiert. In den Developer Tools sehe ich das meine Addon Klasse nach der zu überschreibenden Klasse eingebunden wird. Wieso klappt also der override nicht? Was mache ich falsch?

BACKEND SUBSCRIBER

// event
'Enlight_Controller_Action_PostDispatchSecure_Backend_Article' => array('onArticlePostDispatch', 110),

// erweiterung backend js
if ($arguments->get('request')->getActionName() === 'load') {
	$view->extendsTemplate('backend/master_plugin/addon/view/detail/window.js');
}

DEFINITION IM GEKAUFTEN PLUGIN

//{block name="backend/article/view/detail/window"}
// {$smarty.block.parent}
Ext.define('Shopware.apps.MasterPlugin.view.detail.Window', {
    override: 'Shopware.apps.Article.view.detail.Window',

DEFINITION IM ADDON FÜR DAS GEKAUFTE PLUGIN

//{block name="backend/article/view/detail/window"}
//{$smarty.block.parent}
Ext.define('Shopware.apps.MasterPlugin.Addon.view.detail.Window', {
    override: 'Shopware.apps.MasterPlugin.view.detail.Window',

FEHLER STACKTRACE

TypeError: Cannot read property '$isClass' of null
    at Object.override (https://shopurl/engine/Library/ExtJs/ext-all.js?201902250948:21:1642)
    at Object.classReady (https://shopurl/backend/base?file=bootstrap&loggedIn=1551772882:3272:5)
    at Object.onCreated (https://shopurl/engine/Library/ExtJs/ext-all.js?201902250948:21:47632)
    at Object.Manager.createOverride (https://shopurl/backend/base?file=bootstrap&loggedIn=1551772882:3283:4)
    at Object.define (https://shopurl/engine/Library/ExtJs/ext-all.js?201902250948:21:53280)
    at eval (/backend/Article/load/?f=m/Batch|m/PriceGroup|m/PropertyGroup|m/PropertyOption|m/Template|m/Category|m/Media|m/SeoCategory|m/Unit|m/Similar|m/Accessory|m/Article|m/Price|m/Detail|m/Link|m/Download|m/Esd|m/EsdFile|m/Statistic|m/Serial|m/Configurator|m/ConfiguratorGroup|m/ConfiguratorSet|m/ConfiguratorOption|m/ConfiguratorTemplate|m/Dependency|m/PriceVariation|m/Field|m/Stream|m/MediaMapping|m/MediaMappingRule|m/Property|v/detail/Toolbar|v/detail/Window|v/detail/Settings|v/detail/Properties|v/detail/Prices|v/detail/Base|v/category/Tree|v/category/Seo|v/category/List|v/category/DropZone|v/image/List|v/image/Info|v/image/DropZone|v/image/DataView|v/image/Mapping|v/image/NewRule|v/image/Progress|v/variant/List|v/variant/Configurator|v/variant/Detail|v/variant/NumberProgress|v/variant/Progress|v/variant/ImageRelationProcess|v/variant/configurator/Dependency|v/variant/configurator/Sets|v/variant/configurator/GroupEdit|v/variant/configurator/OptionEdit|v/variant/configurator/Mapping|v/variant/configurator/Template|v/variant/configurator/PriceVariation|v/variant/configurator/PriceVariationRule|v/esd/List|v/esd/Detail|v/esd/Serials|v/statistics/List|v/statistics/Chart|v/crossselling/Tab|v/crossselling/Base|v/crossselling/ProductStreams|v/resources/Links|v/resources/Downloads|store/Batch|store/Detail|store/CategoryPath|store/CategoryTree|store/Variant|store/Group|store/Option|store/Esd|store/EsdFile|store/Statistic|store/Serial|store/Variation|store/Dependency|store/ConfiguratorSet|store/MediaMapping|store/Property|c/Main|c/Detail|c/Category|c/Media|c/Variant|c/PriceVariation|c/Esd|c/Statistic|c/Crossselling&no-cache=1551772882+1+1:1598:5)
    at https://shopurl/engine/Library/ExtJs/ext-all.js?201902250948:21:5356
    at Object.Ext.globalEval (https://shopurl/engine/Library/ExtJs/ext-all.js?201902250948:21:5369)
    at Object.success (https://shopurl/backend/base?file=bootstrap&loggedIn=1551772882:3600:5)
    at Object.callback (https://shopurl/engine/Library/ExtJs/ext-all.js?201902250948:21:67496)

 

ist dein Override im javascript auch nach dem gekauften Plugin?

Hi Shyim.

Ja das kommt nach dem gekauften. Zumindest sehe ich das so in den Developer Tools. In den Subscribern ist die Ladereihenfolge auch korrekt festgelegt:

Gekauftes Plugin
‘Enlight_Controller_Action_PostDispatchSecure_Backend_Article’ => array(‘onArticlePostDispatch’, 100),

Addon für das Plugin
‘Enlight_Controller_Action_PostDispatchSecure_Backend_Article’ => array(‘onArticlePostDispatch’, 110),

Hallo Mike,

Dein override funktioniert so nicht, da du die Klasse des gekauften Plugins 
(‚Shopware.apps.MasterPlugin.view.detail.Window‘) versuchst zu überschreiben.

Beim Override spielt der Klassenname, in welcher der override gesetzt wird, absolut keine Rolle.
Nur die Klasse die überschrieben werden soll ist hier wichtig.

In Deinem Fall existiert zur Laufzeit keine Klasse ‚Shopware.apps.MasterPlugin.view.detail.Window‘.

Daher dann der „$isClass’ of null“ Fehler.

Das gekaufte Plugin könnte z.B auch so definiert worden sein:

//{block name="backend/article/view/detail/window"}
// {$smarty.block.parent}
Ext.define('Shopware.apps.DieserKlassenNameKannNichtOverridedWerden.view.detail.Window', {
    override: 'Shopware.apps.Article.view.detail.Window',

Sprich, um das Verhalten des gekauften Plugins zu ändern,
musst Du Dich auf den selben override beziehen:

//{block name="backend/article/view/detail/window"}
//{$smarty.block.parent}
Ext.define('Shopware.apps.MasterPlugin.Addon.view.detail.Window', {
    override: 'Shopware.apps.Article.view.detail.Window',

Wenn Dein Addon Plugin nach dem gekauften eingebunden wird, kannst Du
mit callParent(arguments) an den Rückgabewert (falls die Funktion einen hat) inkl. der Änderung des gekauften Plugins kommen
und diesen Wert dann manipulieren.

Es kommt halt darauf an, was Du genau vor hast.
Hoffe das hilft Dir schonmal weiter.

Hi MrMDeluxe.

Danke für Dein Feedback. Ich dachte vorher instanziierte Klassen können wieder überschrieben werden. So wie in deinem Beispiel habe ich es auch schon probiert und so funktioniert es „eigentlich“ auch. Im Masterplugin wird allerdings dem Artikelfenster ein neuer Tab hinzugefügt und dieser wurde dann gedoppelt. Ich habe aber erst jetzt bemerkt das ich diesen Code nicht zwangsläufig benötigen. So sollte ich denke ich es jetzt hinbekommen. Danke nochmal für deine Antwort und die Erleuchtung zum Thema override.

Gruß Mike