Konfiguration für Plugins > 5.2

Hallo,

Weiß jemand wie man die Config für Plugins nach dem 5.2 Schema anlegt? Ist es über das XML möglich?

Danke & LG

Hallo,

hier bin ich auch gerade dran. Die Doku ist hier leider nocht etwas dürftig.
Für die Plugin-Struktur musst du folgende Verzeichnisebene anlegen: 

  • custom/plugins/VENDORPluginName
  • custom/plugin/VENDORPluginName/Resources

In das Verzeichnis Resources kannst du dann eine config.xml-Datei kopieren und deine Plugin-Konfugration vornehmen. 

Folgende möglichen Typen habe ich bisher rausgefunden: 

    Slogan Config New
    Meine Beschreibung
    
        
            elementText
            Textelement
            
            Beschreibung Textelement
        
        
            elementPassword
            Passworttextfeld
            
            Beschreibung Passwortfeld
        
        
            elementTextarea
            Textarea Feld 
        
        
            elementBoolean
            Boolean Feld 
            true
            Beschreibung Booleanfeld
        
        
            colorElement
            Farbauswahl
            Beschreibung Farbauswahl
        
        
            elementDate
            Date Feld
        
        
            elementDatetime
            Datetime Feld
        
        
            elementTime
            Time Feld
        
        
            elementInterval
            Interval Feld
        
        
            elementHtml
            HTML Eingabefeld
            
        
        
            elementMedia
            Media Selection Feld
        
        
            elementNumber
            Number Feld

Hier fehlt mir lediglich noch der Typ select oder combo

Hier habe ich aktuell keine Ahnung wie der sauber zu konfigurieren ist.

Liebe Grüße

Kevin

Hi,

Habe hier alles festgehalten - die weiteren Datentypen findest Du im .xsd des XML files:
https://synonymous.rocks/neue-pluginstruktur-ab-shopware-5-2/

Viel Spass…

Hallo,

mir haben hier folgende Links geholfen:

http://talks.benjamin-cremer.de/scd2016_plugin/#/

https://developers.shopware.com/developers-guide/plugin-system/ (Example plugins am Ende)

Danke euch für die Informationen. 

Mittlerweile schaffe ich es alle Datentypen anzusprechen - außer den Typ select.

Hier kann ich persönlich auch aus der .xsd-Datei nicht ableiten, wie ich dort ein Array mit Werten übergeben soll in der config.xml. Mit dem „alten“ Plugin-System hat das ja noch bequem über die Bootstrap.php funktioniert. 

ich würde eigentlich nur gerne folgendes Beispiel in die config.xml bekommen. 

        $this->Form()->setElement(
            'select',
            'font-size',
            array(
                'label' => 'Font size',
                'store' => array(
                    array(12, '12px'),
                    array(18, '18px'),
                    array(25, '25px')
                ),
                'value' => 12
            )
        );

Hat von euch jemand eine Idee wie man das abbildet?

lg

Kevin

        Select Box
        Textelement
        Beschreibung Textelement
        
            Test 1
            Test 2

Du hast recht, ist im XSD nicht im Detail spezifiziert. Aber ich würde mal etwas wie oben versuchen. Die Options sind im XSD allerdings geht mir für die Options der entsprechende Value als Attribut ab… Ich habe es hier einfach mal mit „value“ versucht.

Ich habe die Konfiguration direkt einmal probiert: 

            elementSelect
            Select Box
            Beschreibung Selectbox 
            
                Test 1
                Test 2

Das einzige was dann passiert im Backend ist folgendes: 

Eine Selectbox ohne Werte :slight_smile:

Liebe Grüße

Kevin

Dann versuchs mal ohne value…

So, habe gerade die Info erhalten, dass das in der aktuellen Version noch nicht geht… also musst Du hier beim Array bleiben.

1 Like

Musst du über die Install lösen like that. Ist noch nicht möglich via xml

$element = Shopware()->Models()->getRepository(Element::class)->findOneBy(['name' => 'elementSelect']);
        $element->setOptions(['store' => [
            [1, "LOL"],
            [2, "LOL2"]
        ]]);
        Shopware()->Models()->persist($element);
        Shopware()->Models()->flush();

 

5 Likes

Danke, dass ist wenigstens eine Information mit der man arbeiten kann :slight_smile:

Das mit dem Array werde ich mir dann mal anschauen, wobei ich aktuell noch nicht genau weiß was damit gemeint ist. Aber wie heißt es so schön. Aller Anfang ist schwer. Danke dir für deine Bemühungen. 

lg

Kevin

 

 

@Shyim schrieb:

Musst du über die Install lösen like that. Ist noch nicht möglich via xml

$element = Shopware()->Models()->getRepository(Element::class)->findOneBy([‘name’ => ‘elementSelect’]);
$element->setOptions([‘store’ => [
[1, “LOL”],
[2, “LOL2”]
]]);
Shopware()->Models()->persist($element);
Shopware()->Models()->flush();

 

Dankeschön für den Hinweis. Diesen werde ich doch direkt einmal ausprobieren und Bescheid geben ob es geklappt hat. 

 

Nach ein paar Versuchen habe ich festgestellt, dass man die Funktion recht leicht „nachrüsten“ kann. ‚Einfach‘ in der Datei 

engine\Shopware\Components\Plugin\XmlConfigDefinitionReader.php

die Funktion parseElement wie folgt austauschen:

    /**
     * @param \DOMElement $entry
     * @return array
     */
    private function parseElement(\DOMElement $entry)
    {
        $element = [];

        $isRequired = ($entry->getAttribute('required')) ? XmlUtils::phpize($entry->getAttribute('required')) : false;
        $type = ($entry->getAttribute('type')) ? $entry->getAttribute('type') : 'text';

        $scope = ($entry->getAttribute('scope')) ? $entry->getAttribute('scope') : 'locale';
        if ($scope === 'locale') {
            $scope = 0;
        } elseif ($scope === 'shop') {
            $scope = 1;
        } else {
            throw new \InvalidArgumentException(sprintf("Invalid scope '%s", $scope));
        }

        $element['isRequired'] = $isRequired;
        $element['type'] = $type;
        $element['scope'] = $scope;

        if ($position = $this->getChildren($entry, 'name')) {
            $element['name'] = $position[0]->nodeValue;
        }

        if ($position = $this->getChildren($entry, 'store')) {
            $element['store'] = $position[0]->nodeValue;
        }

        if ($position = $this->getChildren($entry, 'value')) {
            $element['value'] = XmlUtils::phpize($position[0]->nodeValue);
        } else {
            $element['value'] = null;
        }

        foreach ($this->getChildren($entry, 'description') as $label) {
            $lang = ($label->getAttribute('lang')) ? $label->getAttribute('lang') : 'en';
            $element['description'][$lang] = $label->nodeValue;
        }

        foreach ($this->getChildren($entry, 'label') as $label) {
            $lang = ($label->getAttribute('lang')) ? $label->getAttribute('lang') : 'en';
            $element['label'][$lang] = $label->nodeValue;
        }

        $element['options'] = [];
        foreach ($this->getChildren($entry, 'options') as $option) {
            foreach ($option->childNodes as $node) {
                if (!$node instanceof \DOMElement) {
                    continue;
                }
                if ($type=='select') {
                        $element['store'][] = array($node->getAttribute('value'),XmlUtils::phpize($node->textContent));
                } else {
                        $element['options'][$node->nodeName] = XmlUtils::phpize($node->textContent);
                }
            }
        }

        return $element;
    }

Geändert habe ich quasi nur die letzten Zeilen, 

                if ($type==‚select‘) {
                        $element[‚store‘] = array($node->getAttribute(‚value‘),XmlUtils::phpize($node->textContent));
                } else {
                        $element[‚options‘][$node->nodeName] = XmlUtils::phpize($node->textContent);
                }

wobei der Else-Zweig das Original darstellt. Auf diese Weise kann man mit folgendem Code in der XML-Datei die bisherige Funktion aus den Forms direkt nachstellen:

            TestVar
            Testinhalt
            testconten
            
                    Testvariable 1
                    Testvariable 2

Ist zwar nicht Update-sicher, aber vielleicht bringen es ja die Shopware-Programmierer einfach in ihr System mit ein, damit man hier die ‚alten‘ Zöpfe abschneiden kann.

Hey 

danke für deinen guten Beitrag.

Letztens beim Stöbern auf github habe ich entdeckt,  dass die Funktionalität in Form eines PR während der Papercuts bearbeitet wurde. Wurde soweit ich das sehen könnte auch angenommen und sollte daher bald in den Core wandern :slight_smile:

Liebe Grüße

Kevin

Bin gerade durch google hierauf gestoßen. Vielleicht sollte man in diesem Thread darauf hinweisen, dass die akzeptierte Antwort oben nicht mehr aktuell ist.

Hey ho,

was ist denn die aktuelle Lösung? Auch die Erklärung im Buch ist mehr als nur unvollständig. Die Basics, auf die man selbst kommen kann werden erklärt. Elementare Fragen zum wirklichen Arbeiten mit der Struktur werden wiederum nicht erläutert.

Folgender Code jedenfalls gibt nur ein leeres Select. Habe dann auch mal versucht Übersetzungen hineinzumachen.

            loremIpsum
            loremIpsum
            BloremIpsum
            Lorem ipsum
            Lorem ipsum
            
                lorem
                lorem
                ipsum
                ipsum

Was mir auch aufgefallen ist: Man kann keinen Value setzen, wenn man einen scope angegeben hat.

            activate
            Enable
            Aktivieren
            Lorem
            Ipsum
            1

Und sowas hier ist auch nicht erlaubt:

            activate
            Enable
            Aktivieren
            Lorem
            Ipsum
            1
            1

//EDIT: 

Für die Options habe ich was gefunden: 

                    1
                    DE 1
                    EN 1
                
                
                    TWO
                    DE 2
                    EN 2
                
                
                    3
                    Test
                
                
                    4
                    Test default
                    Test

 

@KevinS86 schrieb:

… Die Doku ist hier leider nocht etwas dürftig.

Für die Plugin-Struktur musst du folgende Verzeichnisebene anlegen: 

  • custom/plugins/VENDORPluginName
  • custom/plugin/VENDORPluginName/Resources

In das Verzeichnis Resources kannst du dann eine config.xml-Datei kopieren und deine Plugin-Konfugration vornehmen. 

Hallo,

ich versuche auch gerade aus einem statischen Template-Part ein Plugin zu erstellen. Die reinen Template-Parts .tpl, .css und .js klappen mittlerweile auch schon.
Nun wollte ich einige statische oder als Textbausteine erstellte Teile durch im Plugin eingefügte Konfig-Felder ersetzen. Der Beschreibung im Buch nach hörte sich das auch recht einfach an. config.xml erstellen, und per smarty direkt im Template einsetzen.

Ich sitze heute schon den ganzen Tag dran und habe es noch nicht hinbekommen auch nur das eine Text-Feld aus dem Buch zu erzeugen.
Laut https://developers.shopware.com/developers-guide/plugin-system/#plugin-resources funktioniert es nur, wenn die Reihenfolge der Elemente der im Schema entspricht.
Der im Buch genannte code hat schon keine Namespace-Definition für xsi, um das XML valide zu machen. An anderer Stelle stand, dass der value nur angegeben werden darf, wenn scope nicht auf shop gesetzt wird.

In allen Beispielen wird der Pfad immer relativ zum Resources angegeben. Deshalb frage ich mich gerade ob der Pfad oben mit dem /plugin/ statt /plugins/ ein neu anzulegender ist? Wobei andere Plugins den Pfad /custom/plugins/VENDORPluginName/Resources/config.xml nutzen. Der Pfad oben würde aber auch keinen Sinn ergeben, denn dann wäre das Plugin ja wieder zweigeteilt.
Selbst wenn ich die config.xml aus einem anderen (funktionierenden) Plugin einsetze erhalte ich keine Config-Felder in der Seite meines Plugins im Plugin-Manager und in Grundeinstellungen > Weitere Einstellungen.

Habe ich etwas übersehen und muss die Verwendung der config.xml noch an einer anderen Stelle angemeldet/initialisiert werden?
 

Für hilfreiche Tipps schon jetzt mein Dank
Hartmut

@HSchoepke schrieb:

Hallo,

ich versuche auch gerade aus einem statischen Template-Part ein Plugin zu erstellen. Die reinen Template-Parts .tpl, .css und .js klappen mittlerweile auch schon.
Nun wollte ich einige statische oder als Textbausteine erstellte Teile durch im Plugin eingefügte Konfig-Felder ersetzen. Der Beschreibung im Buch nach hörte sich das auch recht einfach an. config.xml erstellen, und per smarty direkt im Template einsetzen.

Ich sitze heute schon den ganzen Tag dran und habe es noch nicht hinbekommen auch nur das eine Text-Feld aus dem Buch zu erzeugen.
Laut https://developers.shopware.com/developers-guide/plugin-system/#plugin-resources funktioniert es nur, wenn die Reihenfolge der Elemente der im Schema entspricht.
Der im Buch genannte code hat schon keine Namespace-Definition für xsi, um das XML valide zu machen. An anderer Stelle stand, dass der value nur angegeben werden darf, wenn scope nicht auf shop gesetzt wird.

In allen Beispielen wird der Pfad immer relativ zum Resources angegeben. Deshalb frage ich mich gerade ob der Pfad oben mit dem /plugin/ statt /plugins/ ein neu anzulegender ist? Wobei andere Plugins den Pfad /custom/plugins/VENDORPluginName/Resources/config.xml nutzen. Der Pfad oben würde aber auch keinen Sinn ergeben, denn dann wäre das Plugin ja wieder zweigeteilt.
Selbst wenn ich die config.xml aus einem anderen (funktionierenden) Plugin einsetze erhalte ich keine Config-Felder in der Seite meines Plugins im Plugin-Manager und in Grundeinstellungen > Weitere Einstellungen.

Habe ich etwas übersehen und muss die Verwendung der config.xml noch an einer anderen Stelle angemeldet/initialisiert werden?
 

Für hilfreiche Tipps schon jetzt mein Dank
Hartmut 

hi

habe die gleiche Problem getroffen und es funktioniert in neue Plugin-system bei mir so:

MyPlugin/Subscriber/Frontend.php: 

  1. in method __construct():

        $this->configReader = Shopware()->Plugins()->Application()->Config()->get(‘eKomiId’);

  1. in subscribed function onFrontendPostDispatch():

        $controller = $args->getSubject();
        $view = $controller->View();
        $view->addTemplateDir($this->path . ‘/Resources/Views/’);
        $view->assign(‘eKomiId’, $this->configReader);

Hoffe es etwa Hilfe mitbringen kann.

VG

chuuuing