Plugin - Einkaufswelt - eigene ExtJS-Komponente

Hallo liebe Community, ich habe nun erflogreich ein eigenes Einkaufselement über ein Plugin realisiet. Das Einbinden der eigene ExtJS-Komponente musste ich aber leider direkt in den Core Dateien machen, da ich hier kein Anhalspunkte finde, wie ich dies per Plugin / Blöcke überschreiben kann. Folgende Änderungen habe ich direkt gemacht, welche ich aber später natürlich über das Plugin machen will. Hoffenlich habt ihr mir Tipps, wie ich dies realisieren kann. templates/_default/backend/emotion/app.js Das Laden von eigener View und Model hinzugefügt: /\*\* \*components.OttschoTest \*/ views: ['main.Window', 'list.Toolbar', 'list.Grid', 'detail.Window', 'detail.Designer', 'detail.Settings', 'components.SettingsWindow', 'components.Base', 'components.Banner', 'components.BannerMapping', 'components.Article', 'components.CategoryTeaser', 'components.fields.Article', 'components.fields.ArticleType', 'components.fields.CategoryImageType', 'components.fields.CategorySelection', 'components.Blog', 'components.BannerSlider', 'components.fields.SliderSelect', 'components.fields.ManufacturerType', 'components.ManufacturerSlider', 'components.fields.ArticleSliderType', 'components.ArticleSlider', 'components.OttschoTest'], /\*\* \*OttschoTest \*/ models: ['Emotion', 'EmotionElement', 'Component', 'Field', 'Attribute', 'BannerSlider', 'ManufacturerSlider', 'ArticleSlider', 'OttschoTest'], Eigene View erstellt: /templates/_default/backend/emotion/view/components/ottscho_test.js Eigenes Model erstellt: /templates/_default/backend/emotion/model/ottscho_test.js Backend Controller bearbeitet und eigene Funktion eingefügt /engine/Shopware/Controllers/Widgets/Emotion.php private function getArticleInfo($data, $category, $element) { foreach ($data['ottscho\_test'] as $key =\> $wert) { $articleID = Shopware()-\>Modules()-\>Articles()-\>sGetArticleIdByOrderNumber($data['ottscho\_test'][$key]['articleNumber']); $article = Shopware()-\>Modules()-\>Articles()-\>sGetArticleById($articleID); unset($data['ottscho\_test'][$key]['articleNumber']); $data['ottscho\_test'][$key]['article'] = $article; } return $data; } Wie bekomme ich dies nun alles schön in mein Plugin? Danke

Hat hierzu jemand eine Idee?

[quote=“ottscho”]Hat hierzu jemand eine Idee?[/quote] Irgendwie hat hier ja kaum noch einer ne Idee, und an Dokus gibts ja auch nicht wirklich was. Irgendwie ist das seit der 4er Version alles bescheiden geworden. :x

Da stimme ich dir voll zu :frowning: Vor allem habe ich es technische schon umgesetzt. Es fehlt mir nur die Methode, wie ich es direkt im Plugin umsetzen kann.

*schieb*

Heya, die templates/_default/backend/emotion/app.js kannst du direkt über den eigenen Block überschreiben: {block name=„backend/Emotion/app“} Für die Erweiterung der php-Klasse habe ich leider auch noch keine updatesichere methode gefunden…

Stück für Stück… :slight_smile:

Hallo, die app.js habe ich nun erfolgreich mit im Plugin. Aber wie sieht es mit den anderen Dateien aus? Es muss immer noch die neue VIEW und STORE Datei integriert werden. Und der Controller widgets/emotion.php angepasst mit einer eigenen Funktion. Shopware, bitte gebt mir einen Tipp. Daran sind sicher mehrere interessiert! :shopware:

*schieb* Mensch Jungs… das muss doch möglich sein! :thumbdown:

Hey @ottscho, ich habe mir deine Problematik einmal angeschaut und konnte eine Lösung erarbeiten, die du im Anhang findest. Generell basiert das angehängte Plugin auf folgenden beiden Tutorials: http://wiki.shopware.de/Experten-Eigene … 9_871.html http://wiki.shopware.de/Fortgeschritten … 1_871.html Folgende Dinge sind enthalten: [list] [*] Laden einer eigenen Komponente samt Store und Model[/*] [*] Installation der Komponente[/*] [*] Backend-Controller zum Laden der Daten für die eigene Komponente[/*][/list] Schau’ dir am Besten einfach mal das Plugin an, hier müsstest du alles finden. Ich hoffe, dass ich dir weiterhelfen konnte. Viele Grüße, Stephan Pohl :shopware:

1 Like

Hallo Stephan, viele vielen Dank. ich werde es mir anschauen und berichten :slight_smile:

Was mit auf die schnelle noch auffällt, dein Beispiel Element hat keine convert_function. Diese stehe ja im Emotion Controller (widgets/emotion.php) Wenn du dies noch berücksichtigen könntest bin ich dir sehr dankbar. // Insert component $this-\>Application()-\>Db()-\>query(" INSERT INTO `s_library_component` (`name`, `x_type`, `convert_function`, `description`, `template`, `cls`, `pluginID`) VALUES ( 'Eigenes Element', 'emotion-components-custom-element', NULL , '', 'component\_custom', 'custom-element', '1'); ");

Hey @ottscho, ich lade dir gleich eine aktualisierte Version hoch. //edit: Ich habe gerade noch einmal nachgeschaut. Du kannst dafür das Filter-Event „Shopware_Controllers_Widgets_Emotion_AddElement“ verwenden. $this-\>subscribeEvent( 'Shopware\_Controllers\_Widgets\_Emotion\_AddElement', 'onAddElement' ); //... public function onAddElement(Enlight\_Event\_EventArgs $args) { $return = $args-\>getReturn(); var\_dump($args); return $return; } Im Anhang findet du die aktualisierte Version. Viele Grüße, Stephan Pohl :shopware:

Ich habe nun deine neue Version mal installiert und versucht zu öffnen. Es kommt eine Fehlermeldung:

habe bisher damit leider auch nur eine fehlermeldung erzeugt… :frowning: und in verwandter topic: wie kann ich eine Combobox mit werten befüllen? - ich kriege entweder gar keine anzeige oder nur einen wert

Wenn ich das Beispiel Plugin (V2) auf meiner lokalen Testumgebung installiere & aktiviere, erscheint kein Frontend mehr. Dabei habe ich nicht mal das Element in einer Einkaufswelt platziert… Es wäre wirklich wünschenswert, wenn die Plugin-Anleitung für Einkaufswelten-Elemente online geht.

Hey, habe das Beispiel-Plugin gerade einmal erweitert, so dass das Element auch korrekt im Frontend angezeigt wird (Testausgabe Hallo Welt). Weitere Infos, wie Ihr Daten in der Element-Konfiguration im Backend speichern könnt finden sich unter http://wiki.shopware.de/Eigene-Einkaufs … 9_871.html Beispiel_Plugin im Anhang.

2 Likes

Ha, nun komme ich weiter, aber der folgende Code der Funktion „registerEmotionElement“ soll ja die ID des Elementes auslesen, um die Elemente in der Tabelle zuzuweisen: // Get the last entry to get the component Id $componentId = $this-\>Application()-\>Db()-\>query(" SELECT id FROM `s_library_component` ORDER BY id DESC LIMIT 1; "); // Insert hidden field which should be used for saving the configuration $this-\>Application()-\>Db()-\>query(" INSERT INTO `s_library_component_field` ( `componentID`, `name`, `x_type`, `value_type`, `allow_blank`) VALUES (?, 'custom\_field', 'hidden', 'json', '0'); ", array($componentId)); Da schreibt er bei mir immer eine „0“ in die „id“. Auch eine Andere Abfrage oder die Veränderung des INSERT hilft mir nicht… Zu lange nicht mit SQL gearbeitet… Hat da noch jemand einen Tipp für mich?

Ändere die Zeile einfach in: $componentId = $this-\>Application()-\>Db()-\>lastInsertId();

1 Like

So da möchte ich jetzt auch noch eine Frage zu dem Thema stellen. Es geht mir hierbei um das Event $this-\>subscribeEvent( 'Shopware\_Controllers\_Widgets\_Emotion\_AddElement', 'onAddElement' ); Meine aktuelle Funktion sieht wie folgt aus public function onAddElement(Enlight\_Event\_EventArgs $args) { $element = $args-\>getElement(); $return = $args-\>getReturn(); if ($element["component"]["cls"]=="cas-element"){ $view = $args-\>getSubject()-\>View(); $view-\>category\_selection=$return['cas\_category\_selection']; return $element; } } Meine Frage ist wie übergebe ich meine Variable $return[‚cas_category_selection‘] an die tpl Datei? Ich benötige dort die Werte die ich in der Einkaufswelt (Widget) definiert habe.