Zugriff auf den Shop-Context im Shopware CLI Modus

Screenshot Source Code

Manchmal kommt es vor, dass Du mit einem Command-Plugin, das im CLI ausgeführt wird auf Eigenschaften einer Shop Instanz zurückgreifen musst. Allerdings weiß das System im CLI Modus nicht, um welchen Shop es sich handelt, da das Bootstraping des Frontends in diesem Modus nicht ausgeführt wird.

Ein schönes Beispiel dafür wäre etwa ein Export-Plugin, dass ein CSV für eine Preisvergleichsseite erstellt. Dieses CSV soll neben Artikelname und Preis auch die absolute URL zur Artikelseite enthalten. Wenn Du versucht über die Methode assemble() des Router Services die URL durch Angabe von Controller und Action zu erstellen, wirst Du feststellen, dass weder Protokoll noch Host korrekt generiert werden.

Das liegt daran, dass der Router im CLI Modus nicht weiß, für welchen Shop-Context Du die URL erstellen möchtest. Daher fällt er zurück auf den Default-Wert und der ist für das Protokoll „http“ und für den Host „localhost.

Um dieses Problem zu lösen, musst Du in Deinem Plugin definieren, welcher Shop-Context verwendet werden soll. Das ist über die Angabe der Shop-ID möglich, wie nachstehendes Beispiel zeigt.

// Try to get the URL without informing router (CLI) about shop instance
// Generates: http://localhost/detail/index/sArticle/4711
$url = Shopware()->Front()->Router()->assemble(array('module' => 'frontend', 'controller' => 'article', 'sArticle' => 4711));

// Set the Shop context instance for CLI
$repository = Shopware()->Container()->get('models')->getRepository('Shopware\Models\Shop\Shop');
$shop = $repository->getActiveById(1);
$shop->registerResources();
$context = Context::createFromShop($shop, Shopware()->Container()->get('config'));
Shopware()->Container()->get('router')->setContext($context);

// Try to get the URL after informing router (CLI) about shop instance
// Generates: https://www.shop.com/detail/index/sArticle/4711
$url = Shopware()->Front()->Router()->assemble(array('module' => 'frontend', 'controller' => 'article', 'sArticle' => 4711));

Durch die Erstellung des Context und Übergabe an den Router weiß dieser nun um welchen Shop es sich handelt und kann die korrekte URL erzeugen.

Zusammenfassung
Zugriff auf den Shop-Context im Shopware CLI Modus
Titel
Zugriff auf den Shop-Context im Shopware CLI Modus
Beschreibung
Manchmal kommt es vor, dass Du mit einem Command-Plugin, das im CLI ausgeführt wird auf Eigenschaften einer Shop Instanz zurückgreifen musst. Allerdings weiß das System im CLI Modus nicht, um welchen Shop es sich handelt, da das Bootstraping des Frontends in diesem Modus nicht ausgeführt wird.
Autor
Publisher
synonymous.rocks
Logo

3 Kommentare

In diesem Beitrag kannst Du Kommentare verfassen.


  • Moin, da fehlt Shopware\Components\Routing\ vor Context::createFromShop($shop, Shopware()->Container()->get(‚config‘));
    Im „Cheat-Sheet für Entwickler“ Beitrag ist es richtig… Btw: wie bekommt man eine Liste der Produkte in einem bestimmten Subshop im CLI Modus? Wenn ich danach $resource = Shopware\Components\Api\Manager::getResource(‚article‘); schreibe werden alle / falsche produkte erfasst (deren Kategorie ist nicht im Subshop). Gibt es eine Möglichkeit den anderen Componenten die richtige shopId mitzuteilen bzw. wie bekommt man die „richtige“ Produktliste?

    Vadim 2 Jahren ago Antworten


  • Hallo! Die Angabe der nötigen Namespaces erfolgt ja normalerweise im Klassenheader über die use Statements (use Shopware\Components\Routing\). Daher ist es hier nicht gesondert angeführt. Einen Shop-Context explizit selektieren kannst Du über die Methode registerResources(), in diesem Beispiel zu sehen: https://github.com/synonymous1984/SwAlgolia/blob/master/Services/SyncService.php#L95

    synonymous 1 Jahr ago Antworten


    • Hi, danke für diesen Link. Ist aber letzlendlich leider zu kompliziert zu verstehen 🙂 man sieht, dass Du ein Shopware Profi bist… ich habe es dennoch irgendwie geschafft mit Kategorien vergleich oder so, was sicherlich nicht sehr effizient ist.. Bei dem Code ging es darum zu bestimmen, ob eine Produkt ID zu einem bestimmten Shop gehört oder nicht und entsprechend (u.A.) Shop spezifische SEO URL abfragen…

      Wenn Du was gutes machen willst oder ein Thema zum neuen Blog Beitrag suchst, würde ich einen minimaler Grundsatz Code diesbezüglich sehr begrüssen 🙂 Das da oben bezieht sich offensichtlich auch nur auf den router. Vielleicht wäre eine allgemeine Methode wie Shop->setId(id) o.Ä. interessant. Letzendlich möchte man im backend oder über CLI ein Shop so behandlen wollen, als wäre es sozusagen im Frontend, nur dass man zwischen den Subshops leicht unterscheiden kann bzw. verständlich auswählen können.,, Jedenfalls sind Deine Beiträge hier sehr nützlich!

      Vadim 1 Jahr 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