langnickellangnickel MitgliedKommentare: 183 Danke erhalten: 25 Mitglied seit: April 2017

Gibt es irgendwo eine Doku wie ich per Plugin ein bestehendes Emotion-Widget erweitern kann, sprich dem Banner Widget um ein zusätzliches Feld erweitern um Text zu hinterlegen?

Alternativ, kann ich ein eigenes Shopping-World Element erzeugen und als Basis das Banner-Widget angeben?

2 Antworten

  • sschreiersschreier MitgliedKommentare: 2557 Danke erhalten: 667 bearbeitet 11. Januar Mitglied seit: August 2014

    Hallo,

    um ein Einkaufswelten - Widget zu erstellen, gibt es eine ausführliche Dokumentation von Shopware: https://developers.shopware.com/developers-guide/custom-shopping-world-elements/ .

    Dich bei dem Banner-Widget von Shopware selbst "einzuklinken", wird wahrscheinlich schwieriger werden, "einfacher" und sicherer wäre es, einfach selbst die ganze Funktion umzusetzen, so wie du es brauchst.

    Beste Grüße

    Sebastian

    Zitieren
    Akzeptierte Antwort
  • simklisimkli MitgliedKommentare: 1230 Danke erhalten: 433 bearbeitet 25. Januar Mitglied seit: Februar 2014

    Hier ein Beispiel wie man weitere Felder hinzufügen kann. Aber Achtung! Ihr müsst sie beim Deinstallieren auch wieder selbständig entfernen.

    <?php
    /* [...] */
        /**
         * @inheritdoc
         */
        public function install(InstallContext $context)
        {
            // 1. Bestehendes EKW-Element holen (z.B. den Banner Slider. )
            // siehe Hilfsmethode weiter unten
            // z.B. mit dem xtype (dieser steht u.A. in s_core_library_components )
            $slider = $this->getEmotionComponent('emotion-components-banner-slider');
            if ($slider == null) {
                return false;
            }
    
            // Jetzt können wir wie unter https://developers.shopware.com/developers-guide/custom-shopping-world-elements/#adding-configuration-fields-to-the-element
            // beschrieben neue Felder hinzufügen.
    
            // Beispiel:
            // $slider->createTextField( ... )
    
        }
    
        /**
         * returns an emotion component by xtype
         * @param $xtype
         * @return null|object
         */
        private function getEmotionComponent($xtype)
        {
            $models = $this->container->get('models');
            $repository = $models->getRepository('Shopware\Models\Emotion\Library\Component');
    
            $component = $repository->findOneBy([
                'xType' => $xtype,
            ]);
    
            if (!$component instanceof \Shopware\Models\Emotion\Library\Component) {
                return null;
            }
            return $component;
        }
    /* [...] */

    In diesem Beispiel in der install-Methode eures Plugins.

    Viele Grüße

    Zitieren
    Akzeptierte Antwort
  • Akzeptierte Antworten

Antworten

  • sschreiersschreier MitgliedKommentare: 2557 Danke erhalten: 667 bearbeitet 11. Januar Mitglied seit: August 2014

    Hallo,

    um ein Einkaufswelten - Widget zu erstellen, gibt es eine ausführliche Dokumentation von Shopware: https://developers.shopware.com/developers-guide/custom-shopping-world-elements/ .

    Dich bei dem Banner-Widget von Shopware selbst "einzuklinken", wird wahrscheinlich schwieriger werden, "einfacher" und sicherer wäre es, einfach selbst die ganze Funktion umzusetzen, so wie du es brauchst.

    Beste Grüße

    Sebastian

    Zitieren
    Akzeptierte Antwort
  • Stephan_GrassStephan_Grass MitgliedKommentare: 26 Danke erhalten: 1 Mitglied seit: Februar 2017

    Hast Du eine Lösung gefunden?
    Das Banner-Widget nachzubauen erscheint mir recht kompliziert zu sein.

    Ich weiß z.B. nicht, wie man an die Bildbreite und -höhe des Bildes kommt und wie man Bilder für die responsive Darstellung generieren kann.

    Im Template componemt_banner.tpl gibt es {$Data.thumbnails}. Woher kommt das?

     Fragen über fragen ...

  • langnickellangnickel MitgliedKommentare: 183 Danke erhalten: 25 bearbeitet 25. Januar Mitglied seit: April 2017

    Ich bin die letzten Tage nich dazu gekommen das weiter zu Verfolgen. Ich habe zur Zeit das notwendigste mit css Überschreibungen umgesetzt welche modular in das css textfeld kommt. Ich bräuchte zwar noch eine Lösung um zusätzlichen Text per Emotion-Widget zu hinterlegen. Ich glaube ich schaue die Tage nochmal etwas genauer. Zur not eben per Brechstange :)

     

    Das Data kannst du per 

    'Shopware_Controllers_Widgets_Emotion_AddElement'

    modifizieren. Beispiel:

    public function onModifyFrontendEmotionElement(\Enlight_Event_EventArgs $args) {
            $element = $args->get('element');
            $data = $args->getReturn();
    
            if ($element['component']['xType'] !== 'emotion-components-...') {
                return $data;
            }
    
            $data['my_value'] = 'Test';
    
            return $data;
        }

    Sprich ich müsste das Template überschreiben, was kein Problem sein sollte. Ich müsste meine zusätzliche Daten in die View bekommen (was mit obigen Methode geht). Jetzt brauch ich nurnoch ne möglichkeit wie ich die zusätzlichen Daten in der Datenbank persistieren kann. Man könnte ein Custom-Model per Plugin registrieren. welches ne OneToOne auf nen bestehendes Emotion-Widget hat und dann im obigen Beispiel nen query machen und die zusätzlichen Daten einfügen. Dann per überschrieben Template anzeigen. Jetzt ist die Frage wie man diese Daten eingibt. Idealerweise in der Standard Backend Form vom Emotion widget neue Felder einfügen. Zur not halt über nen eigenes ExtJS Fenster. Irgendwie gehts bestimmt, muss halt mal schauen ^^

  • simklisimkli MitgliedKommentare: 1230 Danke erhalten: 433 bearbeitet 25. Januar Mitglied seit: Februar 2014

    Hier ein Beispiel wie man weitere Felder hinzufügen kann. Aber Achtung! Ihr müsst sie beim Deinstallieren auch wieder selbständig entfernen.

    <?php
    /* [...] */
        /**
         * @inheritdoc
         */
        public function install(InstallContext $context)
        {
            // 1. Bestehendes EKW-Element holen (z.B. den Banner Slider. )
            // siehe Hilfsmethode weiter unten
            // z.B. mit dem xtype (dieser steht u.A. in s_core_library_components )
            $slider = $this->getEmotionComponent('emotion-components-banner-slider');
            if ($slider == null) {
                return false;
            }
    
            // Jetzt können wir wie unter https://developers.shopware.com/developers-guide/custom-shopping-world-elements/#adding-configuration-fields-to-the-element
            // beschrieben neue Felder hinzufügen.
    
            // Beispiel:
            // $slider->createTextField( ... )
    
        }
    
        /**
         * returns an emotion component by xtype
         * @param $xtype
         * @return null|object
         */
        private function getEmotionComponent($xtype)
        {
            $models = $this->container->get('models');
            $repository = $models->getRepository('Shopware\Models\Emotion\Library\Component');
    
            $component = $repository->findOneBy([
                'xType' => $xtype,
            ]);
    
            if (!$component instanceof \Shopware\Models\Emotion\Library\Component) {
                return null;
            }
            return $component;
        }
    /* [...] */

    In diesem Beispiel in der install-Methode eures Plugins.

    Viele Grüße

    Zitieren
    Akzeptierte Antwort
  • Stephan_GrassStephan_Grass MitgliedKommentare: 26 Danke erhalten: 1 Mitglied seit: Februar 2017

     

    Danke simkli!!!!

    Das ist es doch! Die neuen Felder stehen schön im Template zur Verfügung. Top!!!

  • langnickellangnickel MitgliedKommentare: 183 Danke erhalten: 25 Mitglied seit: April 2017

    Dankeschön :) Auf die Iddee wäre ich um ehrlich zu sein nicht gekommen oO

  • Stephan_GrassStephan_Grass MitgliedKommentare: 26 Danke erhalten: 1 Mitglied seit: Februar 2017

    Doch noch ne Frage.
    Wenn man die Felder wie beschrieben anlegt und das Plugin deinstalliert und wieder installiert, muss man die Felder ja löschen, damit das neue Feld nicht mehrfach angelegt wird. Dann sind natürlich alle Daten futsch.

    Wie kann man prüfen, ob es ein Feld schon gibt?
    Man kann die Felder mit $slider->getFields() ja holen. Aber was wird da zurückgegeben? Man kann das bei der Installation einen Plugins ja nicht debuggen. Oder?

  • Stephan_GrassStephan_Grass MitgliedKommentare: 26 Danke erhalten: 1 Mitglied seit: Februar 2017

    Ok. Erledigt. Hab's mit ner foreach durchlaufen und auf den Namen geprüft.

  • shwoshshwosh MitgliedKommentare: 2 Danke erhalten: 0 Mitglied seit: 13. Februar

    Moin,
    kannst du (oder jemand anders, der es weiß) ein Beispiel posten, wie du die Felder wieder deinstallierst? Wäre super nett. Ich hänge hier gerade fest. Sonst klappt es soweit.

  • simklisimkli MitgliedKommentare: 1230 Danke erhalten: 433 bearbeitet 13. Februar Mitglied seit: Februar 2014

    @shwosh‍ : Du holst dir einfach wieder das entsprechende Einkaufsweltelement, iterierst über alle Felder und löscht dein eigenes. In etwa so:

    function uninstall() {
        // EntityManager z.B. via DependencyContainer holen
        $models = $this->container->get('models');
    
        // Einkaufsweltelement über die zuvor definierte Helfer-Methode holen 
        // (Helfer-Methode siehe vorherigen Beitrag von mir)
        $slider = $this->getEmotionComponent('emotion-components-banner-slider');
        if ($slider == null) {
            return false;
        }
    
        // Über alle Felder iterieren und ggf. dein Feld löschen
        foreach($slider->getFields() as $field) {
            if ($field->getName() == 'name_deines_feldes') {
                $models->remove($field);
            }
        }
        $models->flush();
    
    }

    Alternativ könntest du dir auch die Repository von den Einkaufswelt-Feldern holen und dort nach deinem Feld suchen und es dann löschen.

    Viele Grüße

    Danke von 1shwosh
Anmelden oder Registrieren, um zu kommentieren.