Einkaufswelt Widget Felder hinzufügen

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?

Hallo,

um ein Einkaufswelten - Widget zu erstellen, gibt es eine ausführliche Dokumentation von Shopware: 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

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 …

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 :slight_smile:

 

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 ^^

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

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

3 „Gefällt mir“

 

Danke simkli!!!

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

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

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?

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

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.

@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

2 „Gefällt mir“