Shopware 5 Cheat-Sheet für Entwickler

Desktop creative mess

Die wichtigsten Funktionen als übersichtliches Cheat-Sheet für Shopware Entwickler zusammengefasst. Sollten Dir noch Funktionen abgehen, hinterlasse bitte einen Kommentar - gerne erweitere ich diese Liste.

Zugriff auf den Dependency Injection (DI-) Container

Der DI-Container ist der Dreh- und Angelpunkt im Shopware-System. Über ihn werden alle relevanten Services bereitgestellt. Der Zugriff darauf ist über folgende Wege möglich:

// Zugriff innerhalb eines Controllers
$this->Container();

// Zugriff im Plugin Bootstrap
$this->container;

// Zugriff aus einer allgemeinen Klasse über das Shopware Objekt
Shopware()->Container();

Zugriff auf den Entity-Manager und Entitäten

Der Doctrine Entity Manager und den Shopware Model Manager (der eine Ableitung des Entity Managers ist), kannst Du schnell und einfach auf persistierte Objekte zugreifen. Über folgende Wege kannst Du auf den Manager zugreifen:

// Zugriff aus dem Controller Weg 1
$article = $this->getModelManager()->getRepository( \Shopware\Models\Article\Article::class)->find(1);

// Zugriff aus dem Controller Weg 2
$article = $this->Container()->get('models')->getRepository( \Shopware\Models\Article\Article::class)->find(1);

// Zugriff aus einem konsumierten Event
public function onPostDispatchSecure(\Enlight_Event_EventArgs $args)
{
    /** @var \Enlight_Controller_Action $controller */
    $controller = $args->get('subject');
    $article = $controller->getModelManager()->getRepository( \Shopware\Models\Article\Article::class)->find(1);
}

Zugriff auf ein Shopware Plugin

Über den DI-Container lässt sich sehr bequem auf jedes bekannte Plugin zugreifen.

$plugin = Shopware()->Container()->get('kernel')->getPlugins()['PluginName'];
$path = $plugin->getPath();

Zugriff auf die Konfiguration eines beliebigen Plugins

Mit Version 5.2.2 wurde die Methode getPlugin() aus der Plugin-Klasse entfernt, was für den Zugriff einen Workaround notwendig macht.

// Ab Shopware 5.2.2 (Workaround)
$pluginConfig = Shopware()->Container()->get('shopware.plugin.config_reader')->getByPluginName('PluginName');

// Identer Zugriff über Cached Service (performanter)
$pluginConfig = Shopware()->Container()->get('shopware.plugin.cached_config_reader')->getByPluginName('PluginName');

Pfad eines Plugins ermitteln

Oft ist es notwendig den absoluten Pfad eines Plugins zu kennen. Dafür bietet das Plugin Objekt eine Methode getPath().

// Beispiel dass den Pad zu den Views eines Plugins ermittelt
$plugin = Shopware()->Container()->get('kernel')->getPlugins()['PluginName'];
$viewPath = $plugin->getPath() . '/Views';

Zugriff auf die UserID / Prüfen ob ein User eingeloggt ist

Über die User-Session lässt sich feststellen, ob ein Benutzer eingeloggt ist oder nicht. Die Member-Variable sUserId liefert bei einem eingeloggten User dessen User-Id oder NULL sollte der Benutzer nicht eingeloggt sein.

// Zugriff im globalen Kontext
$userId = Shopware()->Session()->sUserId

// Zugriff im Event Subscriber
/** @var \Enlight_Controller_Action $controller */
$controller = $args->get('subject');
$userId = $controller->get('session')->offsetGet('sUserId');

Environment im Command Line Interface (CLI) festlegen

Führt man Befehle über das CLI aus, greifen die Environment Settings von vHost Config und .htaccess nicht. Hier muss ein zusätzlicher Parameter beim Aufruf angegeben werden.

php bin/console --env=dev pluginname:do_command

Zugriff auf den Shop-Context

Sofern es sich nicht um eine CLI Anwendung handelt – bei der der Context manuell erstellt werden muss – kann über den StoreFrontBundle-Service „shopware_storefront.context_service“ auf den aktuellen Context zugegriffen werden.

/** @var \Shopware\Bundle\StoreFrontBundle\Service\ContextServiceInterface $context */
$context = $this->container->get('shopware_storefront.context_service')->getShopContext();

Shop- & Router-Context im Command Line Interface (CLI) erstellen

Mit nachfolgendem Snippet kannst Du den Shop-Context im CLI initialisieren.

// Context erstellen und initialisieren
$repository = Shopware()->Container()->get('models')->getRepository('Shopware\Models\Shop\Shop');
$shop = $repository->getActiveById(1);
$shop->registerResources();
$context =  \Shopware\Components\Routing\Context::createFromShop($shop, Shopware()->Container()->get('config'));

// Beispiel: Context dem Router zuweisen
Shopware()->Container()->get('router')->setContext($context);

// Beispiel: Zugriff auf den Shop-Context
$shopContext = $context->getShopContext();

Öffnen des Off-Canvas Warenkorbs per jQuery im Responsive Theme

Um das Off-Canvas Warenkorb Overlay einzublenden, kannst Du folgenden jQuery Call verwenden:

let cart = $('*[data-collapse-cart="true"]').data('plugin_swCollapseCart'); 
cart.loadCart(function() { cart.openMenu() });

Zugriff auf die Shopware Konfiguration / Config

Auf die Shopware-Config – das ist eine Collection an Parametern die sich aus den einzelnen config*.php Files im jeweiligen Shop-Context zusammensetzt – kannst Du auf folgendem Weg zugreifen.

// Zugriff aus einem Controller
$config = $this->get('config');

// Zugriff über das globale Shopware() Objekt
$config = Shopware()->Config();

Erstellen der SEO URL zu einem Element in einem Plugin

Häufig kommt es vor, dass Du für ein Element (Artikel, Kategorie o.ä.) die SEO URL benötigst. Zum Beispiel wenn Du Daten exportieren möchtest. Folgende Zeilen zeigen wie:

$router = Shopware()->Container()->get('router');
$assembleParams = array(
    'module' => 'frontend',
    'sViewport' => 'detail',
    'sArticle' => $article->getId()
);
$link = $router->assemble($assembleParams);

Abfragen der Login-Daten eines User der REST API

Sollte es nötig sein Daten wie Benutzername aus der HTTP Authorisierung bei einem Request an einen REST API Controller auszulesen, kann auf die AUTH Komponente des Shopware Frameworks zurückgegriffen werden:

// Auslesen des HTTP Auth Benutzernames
$username = Shopware()->Auth()->getStorage()->read()->username;

URL dynamisch im Smarty Template generieren

Mit der {url} Methode kannst Du URL´s innerhalb Deines Templates dynamisch generieren. Nachfolgend einige Beispiele.

{* Link zu einer Kategorie mit SEO URL*}
{url sViewport=cat sCategory=1246}

{* Link zum Blog (die Angabe des modules ist nicht zwingend erforderlich)*}
{url module=frontend controller=blog action=index}

{* Link zum Logout *}
{url controller='account' action='logout'}

{* Link zu einer statischen Seite *}
{url controller='custom' sCustom=50}

Snippets dynamisch im Template mit Smarty anzeigen

Oft ist es sinnvoll Texte abhängig von übergebenen ID´s oder Schlüsselwerten im Template anzuzeigen. Dazu ist es nötig, die Snippets anhand einer Variable auszulesen (Danke an @eikewarneke).

{* Smarty template code *}
{$text|snippet:$someObject->getKey():"snippet/namespace"}
{$text|escape}

{* Concatinate snippet name *}
{$snippetName = "prefix_"|cat:$someVariable|escape}
{$snippet|snippet:$snippetName:"snippet/namespace"}
{$snippet|escape}

Preise & Währungen in einer Klassenmethode formatieren

Um einen Preis direkt in einer Methode zu formatieren, kann der Currency-Service genützt werden (Zend_Currency). Ein umfangreicheres Beispiel dazu findest Du auch hier: Währungen in Shopware 5 mit Zend_Currency formatieren.

<!-- Beispiel: Injizieren des currency Services in der services.xml -->
<service id="demo.data_service" class="Demo\Services\DataService" public="true">
    .....
    <argument type="service" id="currency" />
</service>

/**
 * Returns a formatted price
 * @param $price
 * @return string
 */
public function getFormattedPrice($price) {
    $this->currency->add($price);
    return $this->currency->toString();
}
Hinweis: Wann immer es möglich ist solltest Du versuchen die Verwendung des globalen Shopware() Objektes zu vermeiden und stattdessen über einen an die Methode übergebenen Context an die Services zu gelangen.

Verwenden der Shopware Number-Factory (Nummernkreise)

Um fortlaufende Zähler abzubilden, kann die Shopware Number-Factory genützt werden. Der nächste gezogene Wert, kann in der Administration unter „Grundeinstellungen > Nummernkreise“ gesetzt werden. Das ziehen der nächsten Nummer ist wie folgt möglich

// Liefert die nächste Nummer des Kreises "Invoice" und erhöht den Zähler um den Wert 1
$numberRangeIncrementer = Shopware()->Container()->get('shopware.number_range_incrementer');
$number = $numberRangeIncrementer->increment('invoice');

Auslesen der Shopware Versionsnummer in einem Plugin

Wenn Du die aktuelle Shopware Version auslesen möchtest, ist das über den Controller und die hinterlegte Konfiguration möglich.

// Controller holen (hier beispielsweise in einem Event Subscriber)
/** @var \Enlight_Controller_Action $controller */
$controller = $args->get('subject');

// Auslesen der Shopware Version
$version = $controller->get('config')->get('version');
echo $version; // -> 5.3.2
Zusammenfassung
Shopware 5 Cheat-Sheet für Entwickler
Titel
Shopware 5 Cheat-Sheet für Entwickler
Beschreibung
Die wichtigsten Funktionen als übersichtliches Cheat-Sheet für Shopware Entwickler zusammengefasst. Sollten Dir noch Funktionen abgehen, hinterlasse bitte einen Kommentar - gerne erweitere ich diese Liste.
Autor
Publisher
synonymous.rocks
Logo

12 Kommentare

In diesem Beitrag kannst Du Kommentare verfassen.


  • Wie greift man vom Plugin aus auf Shopware eigene Konfigurationswerte zu, z.B. um zu prüfen ob die HTTP-Cache aktiviert ist oder nicht?

    Jürgen 2 Jahren ago Antworten


    • Hallo Jürgen! Das ist über $this->get(‚config‘); im Controller und über Shopware()->Config(); im globalen Kontext möglich. Ich habe das Cheatsheet um diese Information erweitert.

      synonymous 2 Jahren ago Antworten


  • Ich würde bei Plugin Config eher den Service shopware.plugin.cached_config_reader nutzen. Da die werte auch gecacht werden 🙂

    Shyim 2 Jahren ago Antworten


    • Danke Shyim, habe die Version mit dem cached Service aufgenommen 🙂

      synonymous 2 Jahren ago Antworten


  • Danke für das sehr hilfreiche Cheat-Sheat!
    Ich nutze das Partnerprogramm und möchte den sPartner aus dem Partnerlink weitergeben.
    Sprich, wenn der Besucher der über einen Partnerlink gekommen ist und dann später im Shop auf einen Banner zu einer externen Seite klickt, möchte ich den sPartner-Code an den Link anhängen.
    sPartner wird ja irgendwo in der Session gespeichert.
    Wie kann ich das lösen?
    Danke 🙂

    querdenker 1 Jahr ago Antworten


    • Hallo Querdenker! Schau Dir am Besten mal an, was in der Session zu finden ist (Shopware()->Session()). Wenn Du den Link auf eine Banner erweitern möchtest, solltest Du den entsprechenden Event konsumieren (https://developers.shopware.com/developers-guide/event-guide/) und über Dein Plugin das Template-File das die Banner bereitstellt überladen und damit den Link wie gewünscht modifizieren.

      synonymous 1 Jahr ago Antworten


  • Hallo,

    danke für die immer sehr informativen Artikel!

    Mich würde interessieren, wie ich aus einem Plugin Controller heraus am einfachsten Werte der Plugin Konfiguration ändern kann. Hat da jemand eine Idee?

    Carsten 1 Jahr ago Antworten


  • Schönes CheatSheet!
    mich würde noch interessieren ob es auch noch einen Shorthandle zum auslesen einer Subshop Konfiguration gibt.
    shopware.plugin.config_reader liefert ja immer nur den Hauptshop zurück

    Jörg 11 Monaten ago Antworten


    • Ich verwende für solche Fälle immer den Shopcontext. Den kannst Du über die ShopID aufbauen und dann entsprechend die Konfiguration auslesen.

      synonymous 10 Monaten ago Antworten


  • Hallo und danke erst mal. Ich bin in den letzten Wochen immer wieder über ganz verschiedene Fragestellungen auf diese Seite gestoßen.
    Ich steh aber bei einer Sache gerade voll auf meiner Leitung. Ich hoffe, du (oder jemand) kannst mir hierbei helfen.
    Ich habe einen eigenen Frontend-Controller gebaut. Diese hat mehrere Action-Methoden mit Parametern, die diese annimmt. So weit, so normal.
    Ich will aber einfach nicht verstehen, wie ich diese kryptischen URLs in schöne SEO-URLs umwandle, sodass der Controller, mit samt Action und Parameter von entsprechenden SEO-Links aufgerufen werden kann.
    Also anstatt /meinfrontendcontroller/detail/id/234 soll da z.B. stehen: /infopage/dies-ist-der-unique-titel-eines-eintrags
    Gibt es eine Router-Funktion, die man einfach aufrufen kann und „Original-URL“ und SEO-URL als Parameter übergeben kann , die dann gespeichert werden? Oder muss ich bei der Speicherung jedes Entries auch einen Eintrag in die Datenbanktabelle s_core_rewrite_urls speichern?
    Ich komme hier nicht wirklich weiter…
    Kann mir jemand einen Tipp oder noch besser ein Codebeispiel geben.

    Weblab 9 Monaten ago Antworten


  • Hi,

    Danke für deine Kniffe hier. Neben dem Shopwarehandbuch für Entwickler vom Rheinwerk Verlag hilft mir diese Seite doch immer wieder weiter.
    Zum Beispiel für die SEO URL, das habe ich sonst nirgends gefunden!

    Grüße
    Sebastian

    Sebastian 9 Monaten ago Antworten


    • Vielen Dank 🙂

      synonymous 9 Monaten ago Antworten


Kommentar verfassen

Folge mir auf Twitter

Hol Dir kostenlos Tipps und Tricks zu Shopware, E-Commerce und andere Open-Source Produkte.

Folge @synonymousrocks