Überschreiben eines Kerncontrollers von Pimcore

· 4 Min. Lesezeit

Ich arbeite jetzt schon seit einiger Zeit an einem Pimcore-Projekt, habe PHP und Symfony noch nie in meinem Leben berührt, daher war es eine große Herausforderung.

Die Dokumentation ist großartig, ich meine, im Ernst, sie ist großartig, aber sie scheint nicht für Anfänger in der Sprache/dem Framework gedacht zu sein, also musste ich mir bei allem, was ich gemacht habe, Notizen machen.

Nachdem ich erfahren habe, dass man Pimcore mithilfe von Bundles erweitern kann, habe ich stundenlang versucht, Controller, Javascript-Methoden und mehr zu überschreiben.

In diesem Beitrag erkläre ich, wie ich es geschafft habe, einen Controller zu überschreiben. Wie man Javascript-Dateien überschreibt, erfahren Sie später 😎.

Das Bundle erstellen

Zuerst müssen wir ein Bundle dafür erstellen. Das ist ziemlich einfach, da es in der [Pimcore-Dokumentation](https://pimcore.com/docs/pimcore/current/Development_Documentation/Extending_Pimcore/Bundle_Developers_Guide/index.html dokumentiert ist. Wir müssen nur bin/console pimcore:generate:bundle --namespace=EmiDemo/EmiDemoBundle im Projektordner ausführen.

Es wird einige Fragen aufwerfen, aber kein Grund zur Sorge.

Es wird ein neuer Ordner unter dem Ordner src mit dem Namensraum erstellt, den wir zuvor deklariert haben, und darin befinden sich alle notwendigen Dateien für das Bundle.

Außerdem wird das Plugin von der Pimcore-Administratorseite erkannt, aber deaktiviert. Sie müssen es aktivieren, um es verwenden zu können.

Überschreiben einer Methode von einem Controller

Um eine Methode in einem Controller zu überschreiben, müssen Sie natürlich zuerst die Aktion finden, die Sie aktualisieren möchten. Das scheint einfach zu sein, aber ich erkläre Ihnen, wie ich es normalerweise mache (von meinem Teamkollegen Cesar gelernt).

Rufen Sie zunächst die Seite auf, von der Sie glauben, dass der Controller Maßnahmen ergreift. In meinem Fall möchte ich die Seite überprüfen, die geladen wird, wenn wir ein Asset öffnen

Bild von Gyazo

Öffnen Sie dann einfach die Konsole und gehen Sie zur Registerkarte „Netzwerk“, führen Sie die gleichen Schritte noch einmal durch und versuchen Sie, die Aktion zu finden

Bild von Gyazo

Anhand dieser Informationen können Sie erkennen, dass die Aktion, die das Asset lädt, http://localhost/admin/asset/get-data-by-id?_dc=1607601778450&id=2&type=image ist. Daraus können wir ersehen, dass die Controller-Aktion get-data-by-id ist.

Suchen Sie die Aktion im Kerncontroller

Für mich ist es am einfachsten, alle Dateien im Visual Studio-Code zu finden

Bild von Gyazo

Wahrscheinlich wird es mehr als eines finden, also müssen Sie einen Blick darauf werfen und entscheiden, welches das richtige ist. In unserem Fall arbeiten wir mit Assets, daher ist es klar, dass wir AssetController.php verwenden möchten.

Ändern Sie den Kerncontroller

Das hängt vom Entwickler ab. Normalerweise mache ich das nicht, weil es schneller ist, einfach den Controller zu überschreiben und von dort aus zu entwickeln. Ich würde jedoch empfehlen, zunächst den Controller im Kernpaket zu aktualisieren, um zu sehen, ob Ihre Änderungen funktionieren.

In unserem Fall werde ich am Anfang der Methode einfach eine Nachricht zurückgeben, um zu überprüfen, ob sie funktioniert.

return $this->adminJson(['success' => false, 'message' => "Overriding the getDataByIdAction in the core!!"]);

Bild von Gyazo

Dann laden wir unser Asset neu und überprüfen die Registerkarte „Netzwerk“.

Bild von GyazoLassen Sie uns behalten, was wir dort haben, damit wir später wissen, dass wir die Bundle-Nachricht anstelle der Kernnachricht verwenden.

Jetzt kopieren wir das einfach in eine temporäre Datei, um nachzuverfolgen, was wir getan haben.

Verschieben Sie diese Änderungen in das Bundle

Um diese Änderungen nun auf unser Bundle zu übertragen, benötigen wir zunächst einige Dinge von unserem Kerncontroller:

  • Namensraum
  • Importe
  • Controllername

Bild von Gyazo

Und natürlich die Methode getDataByIdAction, die wir überschreiben möchten.

Legen Sie den Controller frei

Wir müssen den Controller freigeben. Dazu müssen Sie in die Datei /src/EmiDemo/EmiDemoBundle/Resources/config/pimcore/routing.yml gehen und hinzufügen

options:
        expose: true

Außerdem müssen wir den prefix in den Controller ändern, den wir überschreiben möchten, in unserem Fall den admin-Controller.

Am Ende wird es also so aussehen

emi_demo_emi_demo:
    resource: "@EmiDemoEmiDemoBundle/Controller/"
    type:     annotation
    prefix:   /admin
    options:
        expose: true

DefaultController.php

In unserer Datei werden wir die Importe hinzufügen und den Controller um den Controller erweitern, den wir überschreiben

Bild von Gyazo

Dann kopieren wir einfach die Methode vom Kerncontroller und aktualisieren in unserem Fall die Nachricht, die wir zurückgeben.

Bild von Gyazo

Wenn Sie sich erinnern, haben wir bereits eine Meldung im Kerncontroller: Overriding the getDataByIdAction in the core!! und jetzt sollten wir Overriding the getDataByIdAction in the bundle!! sehen.

Bild von Gyazo

Lassen Sie uns einfach nichts zurückgeben und sehen Sie, dass wir die Seite jetzt so sehen können, wie sie vorher war

Bild von Gyazo

Kommentieren Sie die Return-Anweisung aus und laden Sie sie erneut

Bild von Gyazo

Das ist es

Und mit dieser kleinen Demo können Sie sehen, wie einfach Sie einen vorhandenen Pimcore-Core-Controller übersteuern können. Es gibt einige Schritte, die Sie befolgen müssen, aber es ist nichts Schwieriges. Stellen Sie einfach sicher, dass Sie den Controller freigeben und den Cache von Zeit zu Zeit leeren, während Sie Änderungen vornehmen. Manchmal wird er zwischengespeichert und Sie stecken fest und denken, dass er nicht funktioniert und nur zwischengespeichert wird.

Wenn Sie sich fragen, wie Sie die Javascript-Dateien überschreiben können, finden Sie dies in einem anderen Tutorial 😁.