Metainformationen im Subscriber

Hallo liebe Shopware Gemeinde,

 

nun, ich versuche mich etwas an den neuen Shopware 6 Plugins.

Im Moment möchte ich gerne im Subscriber auf die Metainformationen zugreifen - nur leider geht es nicht.

Über:

use Shopware\Storefront\Pagelet\Footer\FooterPagelet;
use Shopware\Storefront\Pagelet\Header\HeaderPagelet;
use Shopware\Storefront\Event\StorefrontRenderEvent;

geht es nicht, da diese Bereiche unterhalb der Metainformationen im dump sind.

Da es kein $event->getPage() gibt wird immer eine Fehlermeldung geworfen.

 

Es gibt ja in Shopware\Storefront\Page die Möglichkeit auf Page zuzugreifen.

Kann ich mit use darauf zugreifen?

Wenn ja, wie.

Oder kann ich die Metadaten einfacher abfragen?

Für eine Hilfe wäre ich sehr dankbar.

L.G.

Andy

Hallo Andy,

was meinst du genau mit Metainformationen?

Viele Grüße aus Schöppingen

cool Michael Telgmann

Hallo Herr Telgmann,

 

nun, ich möchte einfach nur wissen auf welcher Seite ich bin.

Das Problem ist, dass wenn ich ein Formular erstelle, dann wird dieses ja als Kategorie angezeigt.

Damit ich ein paar Sachen grafisch anders gestalten kann - nur auf dem sagen wir nur auf dem Kontaktformular, muss ich ja wissen, ob es geladen wurde.

Dafür habe ich ein Zusatzfeld erstellt, mit Farbauswahl.

Wenn ich aber nun auf das Kontaktformular anzeigen lasse, dann wird immer das Zusatzfeld aus der Startkategorie angezeigt, da dies ja die „aktive“ Kategorie ist.

Ich habe es über header, Footer und Storefrontrender versucht.

Wie kann ich im Subscriber auf den aktuellen Inhalt zugreifen - hier auf das Kontaktformular???

Ich hoffe ich konnte mich verständlich machen.

L.G.

Andy

 

Hallo Andy,

auf welches Event hast du dich denn subcribed? Grundsätzlich kann man sich die Event-Klasse anschauen, und dann sieht man schon viele Informationen, die verfügbar sind, z.B. die Page. Darüber kann man dann auch herausfinden, wo man sich befindet. 

Viele Grüße aus Schöppingen

cool Michael Telgmann

Ich subscribe auf:

use Shopware\Storefront\Pagelet\Footer\FooterPageletLoadedEvent;
use Shopware\Storefront\Pagelet\Header\HeaderPageletLoadedEvent;

Auch StroreFrontRenderEvent habe ich benutzt, aber ich komme nicht auf „Page“, denn dort könnte ich ja sehen wo ich bin.

Hallo,

Footer und Header sind ein Sonderfall, da diese nicht komplette Seiten rendern, sondern nur kleine Bestandteile einer Seite. Daher heißen diese auch Pagelet. Daher müsstest du die Methode \Shopware\Storefront\Pagelet\Footer\FooterPageletLoadedEvent::getPagelet aufrufen. 

Viele Grüße aus Schöppingen

cool Michael Telgmann

Hallo,

Ich mache:

use Shopware\Storefront\Pagelet\Footer\FooterPageletLoadedEvent;

mache dann:

FooterPageletLoadedEvent::getPagelet => ‘onFooterPageLoadedEvent’

und dann das:

public function onFooterPageLoadedEvent(FooterPageletLoadedEvent $event)
    {
        echo " – " .print_r($event->getPage());
    }

 

aber ich bekomme nicht die page angezeigt, sondern nur die Pagelet (den Auschnitt) von der Footer Klasse gezeigt.

Ich möchte aber höher in der Hierachie. Ich möchte Root oder Admin oder on Top. Was auch immer.

Gibt es eine Möglichkeit, ein event, auf ALLE ausgelieferten Variablen zuzugreifen?

StoreFrontRenderEvent ist auch eingeschränkt - kein Zugriff auf cmsPage.

 

Danke das Du so geduldig bist Thumb-Up

L.G.

Andy

Hallo Andy,

ich denke, dann ist es einfacher, wenn du weißt, auf welcher Seite du etwas tun möchtest. Dann kannst du dich nämlich z.B. auf die Productdetailseite oder auf die Accountseite oder was auch immer registrieren. Die einzelnen Seiten findest du hier platform/src/Storefront/Page at 6.1 · shopware/platform · GitHub in den Unterordnern.

Viele Grüße aus Schöppingen

cool Michael Telgmann

Hallo Michael,

eine letzte Frage:

Wie komme ich an die Variablen ( ist es nicht Objekt?! ). cmsPage.

L.G.

Andy

Hallo Andy,

in welchem Kontext? Was für ein Event benutzt du jetzt? Wenn du ein ***PageLoadedEvent genommen hast, sollte dort auch eine Methode “getPage” sein, und von dort aus kannst du “getCmsPage” ausführen. Natürlich vorausgesetzt diese Page hat ein CMS Element.

Viele Grüße aus Schöppingen

cool Michael Telgmann

Hallo Michael,

und welches ***PageLoadedEvent kann ich nutzen?

Ich habe es mit:

PageLoadedEvent versucht - im Frontend passiert nichts.

Kein Zugriff auf Variablen.

Das event wird erst gar nicht ausgeführt.

 

Es muss doch ein event geben, welches nach dem laden der Seite angesprochen werden kann.

 

O.K., dann etwas einfacheres:

Ich mache im Subscriber folgendes:

use Shopware\Storefront\Page\MetaInformation;

Das heißt ja nichts anderes als das die Datei MetaInformation.php im „Shopware\Storefront\Page“ Verzeichnis, dem Subsriber, zur Verfügung stehen soll.

Nur, wie kann ich nun Funktionen aus der MetaInformation in meinem Subscriber verwenden?

Brauche ich im ein ???

Ich steige da irgendwie nicht so richtig durch.

 

Ich bin sehr wissbegierig, ich weiß.

Doch nur wenn ich es verstehe kann ich etwas erreichen.

L.G.

Andy

Hallo Andy,

wie du hier siehst platform/PageLoadedEvent.php at 6.1 · shopware/platform · GitHub ist dieses Event eine abstrakte Klasse und damit ist klar, dass dieses Event natürlich nie geworfen wird. Schau dir die Klassen/Events an, die von PageLoadedEvent erben und schaue, wo diese geworfen werden. Bzw, überlege dir, wie oben schon mal geschrieben, auf welcher Seite du etwas tun möchtest und schaue dann, welches Event dort geworfen wird. Die Seite wird in den ***PageLoader Klassen geladen und dort werden auch die Seiten-spezifischen Events geworfen. z.B. die Produktdetailseite: platform/ProductPageLoader.php at 6.1 · shopware/platform · GitHub

Viele Grüße aus Schöppingen

cool Michael Telgmann

Hallo Michael,

erst einmal vielen dank für deine schnelle Antwort.

Mal ganz einfach, für Dummies,

 

Was würdest Du benutzen um auf getPage() zuzugreifen, in Deinem Subscriber.

Bitte mal ein Beispiel: Wie würde Dein Subscriber aussehen, der auf getPage() zugreifen kann.

Ich suche schon seit Tagen nach dem richtigen event.

Das witzige ist, dass ich dieses event schon mal gefunden hatte, aber leider überschrieben habe. Das es geht weiß ich - nur nicht mehr mit welchem event.

 

L.G.

Andy

 

 

 

Hallo Michael,

o.k., nun ist der Groschen gefallen.

Der Subscriber benötigt ein event aus dem „Page“ Verzeichnis.

z.B.: aus dem Verzeichnis: Maintenance, das event: MaintenancePageLoadedEvent

Dieses Event HAT Zugriff auf die Page Variablen, allerdings nur wenn man sich auf der Wartungsseite befindet.

Daher war seine Antwort goldrichtig!!!

Thumb-Up

 

Allerdings eine Sache hätte ich noch:

Kann ich mit „use Shopware\Storefront…“ jede PHP Datei in dem Storefront Verzeichnis ansprechen?

Wenn ja, kann ich Funtionen aus diesen PHP Dateien in meinem Subscriber ansprechen? Wenn ja wie???

Eine Antwort wäre toll!

L.G.

Andy

Hallo Andy,

du meinst vermutlich eine Dependency Injection von Services in deinen Subscriber oder? Das kannst du so machen: SwagPayPal/CheckoutSubscriber.php at master · shopwareLabs/SwagPayPal · GitHub
Im Konstruktor gibst du die Services an, die du in deinem Subscriber nutzen willst. Diese definierst du dann in der services.xml Datei

Viele Grüße aus Schöppingen

cool Michael Telgmann

Hallo Michael,

eigentlich geht es mir darum zu verstehen:

Ich benutze ein „use Shopware…“ oder „use Symphony…“

Kann ich nun auf die im „use …“, also in der darauf hingewiesenen php Datei und auf dessen Funktionen zugreifen?

Verstehe leider das Prinzip nicht.

 

L.G.

Andy

@Klabautermann schrieb:

Hallo Michael,

eigentlich geht es mir darum zu verstehen:

Ich benutze ein „use Shopware..“ oder „use Symphony..“

Kann ich nun auf die im "use …", also in der darauf hingewiesenen php Datei und auf dessen Funktionen zugreifen?

Verstehe leider das Prinzip nicht.

 

L.G.

Andy

Hallo Andy,

mit „use Shopware.…“ bindest du eine Klasse eine, keine Datei!

Ein Klassenname ist immer der Name selber inkl des „Namesspaces“. Beispiel:

namespace Shopware\Storefront\Page\Product;

class ProductPageLoadedEvent extends PageLoadedEvent
{
...
}

Der Klassenname ist innerhalb PHP nicht  ProductPageLoadedEvent sondern  Shopware\Storefront\Page\Product\ProductPageLoadedEvent   .

Immer wenn du die Klasse verwendest musst du en kompletten Namen angeben. Da dass aber immer sehr lange ist, kannst du in einer PHP Datei via use angeben, welche Klasse du verwenden möchtest. Also:
 

use Shopware\Storefront\Page\Product\ProductPageLoadedEvent;

Dann kannst du innerhalb deiner PHP Datei einfach  ProductPageLoadedEvent verwenden und PHP weiss, um welchen kompletten Namen es sich handelt.

Solltest du 2 gleiche Klassennamen haben, die aber in unterschiedlichen Namespaces liegen, kannst Alias verwenden.

Besipiel:
 

use Shopware\Storefront\Page\PageLoadedEvent;
use MyPlugin\Storefront\Page\PageLoadedEvent as MyPageLoadEvent;

Zu deinen Fragen (solten sie sich nicht selbst erklären):

Kann ich nun auf die im "use …", also in der darauf hingewiesenen php Datei und auf dessen Funktionen zugreifen?

Nein, mit use definierst du welche Klassen du verwendest und nicht welche Datei du laden möchtest.

Dafür bräuchtest du ein „import“ oder „require“. 

wenn du schreibst "… php Datei und auf dessen Funktionen zugreifen" dann hört sich das an als ob du eine PHP Dateie mit Funktionen einbienden möchtest. Das macht man so aber nicht (mehr). Man schreibt Klassen, instanziert diese (über „new MyDataService()“ oder besser über Dependency Injection (DI)) und ruft die Funktionen innerhalb der Klassen auf. Schau dir mal eine service.xml an. Da werden Klassen per DI definiert und die sind immer mit dem kompletten Namen.

Zu „Verstehe leider das Prinzip nicht.“:

Das Prinzip nennt sich OOP oder ObjektOrientierteProgrammierung. Als Klasse versteht man ein Objekt.

Vielleicht stellst du dir die Frage, woher nun PHP weiss, welche Klasse verwendet wird, wenn du sie nicht direkt über require oder import aufrufst.

Das geheimnis nennt sich „autoloader“. Es ist kein Zufall, dass der Klassenname inkl. Namespace die Verzeichnisstruktur wieder gibt. Somit weiß der Autoloader wo er die Datei findet und liest sie automatisch ein sobald sie benötigt wird.

Hoffe das hilft dir zum Verständnis des Prinzipes weiter.

gruß

DaMardl