Skip to content

Plugin-Integration

Diese Seite beschreibt, wie eigene Shopware-Plugins kompatibel mit dem Guppy-Theme entwickelt werden, ohne die Vererbungs-Kette zu brechen oder spätere Updates des Themes zu blockieren.

Goldene Regeln

RegelWarum
Niemals DmfGuppyTheme direkt patchenUpdates werden unmöglich. Eigener Code gehört in ein eigenes Plugin oder Child-Theme.
Twig immer mit sw_extends überschreibensw_replace bricht die Inheritance-Kette für nachfolgende Plugins.
SCSS via overrides.scss und base.scssDirekter Zugriff auf Bootstrap-Build wäre brüchig.
Variablen mit !default markierenDamit Child-Themes weiter überschreiben können.
theme.json-Inheritance nicht verändern["@Storefront", "@DmfGuppyTheme"] ist fixe Reihenfolge.

Composer-Setup

Eigenes Plugin als reguläres shopware-platform-plugin paketieren:

json
{
  "name": "acme/guppy-extension",
  "type": "shopware-platform-plugin",
  "license": "proprietary",
  "require": {
    "shopware/core": "~6.7.0",
    "dmf/sw6-guppy-theme": "^2.0"
  },
  "autoload": {
    "psr-4": {
      "Acme\\GuppyExtension\\": "src/"
    }
  },
  "extra": {
    "shopware-plugin-class": "Acme\\GuppyExtension\\AcmeGuppyExtension"
  }
}

Lokales Path-Repo

Wer im Monorepo entwickelt, hängt das Plugin per Composer-path-Repository ein, siehe Lokale Einrichtung.

SCSS-Integration

Eigene Styles via Theme-Pipeline

Plugins, die als shopware-storefront-plugin markiert sind und einen @Plugins-Eintrag im Theme bekommen, werden automatisch in der Compile-Reihenfolge berücksichtigt:

text
overrides.scss

@StorefrontBootstrap

@Plugins   ← hier landet dein Plugin-CSS

skin/shopware/base.scss

base.scss

Plugin-Struktur:

text
src/Resources/app/storefront/src/scss/
└── base.scss        # einziger Entry-Point, wird vom Theme-Compiler eingebunden

base.scss:

scss
.acme-component {
    background-color: $sw-color-gray-100;
    border-radius: $border-radius;
    padding: $spacer;

    @include media-breakpoint-up(md) {
        padding: $spacer * 2;
    }

    &:focus-visible {
        @include focus-style;
    }
}

Bootstrap-Variablen erst ab base.scss verfügbar

Im Plugin selbst kannst du keine Variablen vor Bootstrap setzen (kein overrides.scss-Hook). Wer Variablen umsetzen muss, gehört in ein Child-Theme, siehe Child Theme manuell entwickeln.

Funktionen und Mixins des Themes nutzen

Plugins können die Theme-Mixins ohne extra Imports nutzen, theme:compile löst sie aus dem Guppy-Theme auf:

scss
@include focus-style;
@include line-height(1.4);
@include button-adaptive-hover($primary);

Vollständige Liste: Variablen & Tokens.

Twig-Integration

Templates überschreiben

Plugin-Templates landen unter:

text
src/Resources/views/storefront/...

Beispiel: Custom-Block in der Header-Logo-Komponente:

twig
{# src/Resources/views/storefront/layout/header/logo.html.twig #}
{% sw_extends '@Storefront/storefront/layout/header/logo.html.twig' %}

{% block layout_header_logo %}
    {{ parent() }}
    <span class="acme-logo-suffix">Powered by Acme</span>
{% endblock %}

sw_extends statt sw_replace

sw_replace bricht die Inheritance-Kette für nachfolgende Plugins. Nutze immer sw_extends.

Theme-Konfig in Plugin-Templates

Plugins können theme_config() lesen, egal ob das Feld vom Guppy-Theme oder einem anderen Plugin definiert ist:

twig
{% if theme_config('guppy-header') == 'extended' %}
    {# Acme-spezifisches Verhalten bei extended Header #}
{% endif %}

Eigene Twig-Extension registrieren

php
// src/Twig/AcmeExtension.php
namespace Acme\GuppyExtension\Twig;

use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;

class AcmeExtension extends AbstractExtension
{
    public function getFunctions(): array
    {
        return [
            new TwigFunction('acmeFormat', [$this, 'acmeFormat']),
        ];
    }

    public function acmeFormat(string $value): string
    {
        return strtoupper($value);
    }
}
xml
<!-- src/Resources/config/services.xml -->
<service id="Acme\GuppyExtension\Twig\AcmeExtension">
    <tag name="twig.extension"/>
</service>

Storefront-JS-Integration

Eigenes Plugin als reguläres Shopware-Storefront-Plugin schreiben, Pattern und Beispiele siehe Storefront-JS.

Auf Splide-Slider aufsetzen

Statt einen eigenen Slider zu schreiben, DmfSplideSlider einbinden:

html
<div class="splide" data-splide-slider-plugin="true">
    <div class="splide__track">
        <ul class="splide__list">
            {# Slides #}
        </ul>
    </div>
</div>

Detail: DmfSplideSlider.

CMS-Integration

Eigene Blöcke und Elemente registrieren: siehe Eigene CMS-Blöcke.

Wiederverwendung von Blöcken (Linked-Blocks, JSON-Import/Export): DmfCmsBlockLibrary.

Asset-Pipeline

Plugin-Assets gehören unter src/Resources/app/storefront/dist/assets/ und werden vom Theme-Compiler ausgeliefert. Pfade in SCSS/Twig:

scss
background-image: url("#{$app-css-relative-asset-path}/acme/banner.png");
twig
<img src="{{ asset('bundles/acmeguppyextension/assets/acme/banner.png') }}" alt="">

Migrationen und Custom-Fields

Eigene Migrationen leben unter src/Migration/. Custom-Fields-Definitionen via services/custom-fields.xml, analog zu DmfGuppyTheme's Custom-Fields-Setup.

Versions-Kompatibilität

Pflicht-Constraint im Plugin:

json
"require": {
  "dmf/sw6-guppy-theme": "^2.0"
}

^2.0 lässt MINOR- und PATCH-Updates des Themes zu, blockiert MAJOR-Updates (siehe Changelog).

Validierung

Vor Release prüfen:

CheckBefehl
Plugin lädtbin/console plugin:list | grep AcmeGuppyExtension
Theme kompiliert ohne Fehlerbin/console theme:compile
Storefront rendert ohne JS-ErrorsBrowser-Konsole prüfen
Lintermake lint (falls vorhanden)
Upgrade-Scan kompatibelbin/console guppy:upgrade:scan

Verwandt