Frontend Templates überschreiben via Plugin ohne Theme? Windows Problem?

Hallo Zusammen!

Ich versuche mich gerade in der Pluginentwicklung zurrecht zufindnen und komme im Moment nicht weiter. Ich möchte ein Plugin entwickeln welches das Detail Template anpassen soll aber ohne ein eigenes Theme bereitzustellen - theoretisch müsste das doch möglich sein?

Mein Plugin ist wie folgt aufgebaut:

Plugin Struktur

Hier ein Ausschnitt der ProSalesRunningMeter.php Datei:

 'preparePlugin',
        ];
    }

    /**
     * Prepare the plugin before activation.
     *
     */
    public function preparePlugin()
    {
        $this->subscribeTemplates();
    }

    /**
     * On plugin activation ...
     *
     * @param ActivateContext $activateContext
     * An object that determine an instance of the activation
     * context.
     */
    public function activate(ActivateContext $activateContext)
    {
        $activateContext->scheduleClearCache(ActivateContext::CACHE_LIST_ALL);
    }

    /**
     * On plugin deactivation ...
     *
     * @param DeactivateContext $deactivateContext
     * An object that determine an instance of the deactivate
     * context.
     */
    public function deactivate(DeactivateContext $deactivateContext)
    {
        $deactivateContext->scheduleClearCache(DeactivateContext::CACHE_LIST_ALL);
    }

    /**
     * On plugin installation ...
     *
     * @param InstallContext $installContext
     * An object that determine an instance of the installation
     * context.
     */
    public function install(InstallContext $installContext)
    {
        // ...
    }

    /**
     * On plugin uninstall ...
     *
     * @param UninstallContext $uninstallContext
     * An object that determine an instance of the uninstall
     * context.
     */
    public function uninstall(UninstallContext $uninstallContext)
    {
        $this->keepUserDataOnUninstall($uninstallContext);
        $uninstallContext->scheduleClearCache(UninstallContext::CACHE_LIST_ALL);
    }

    /**
     * On plugin update ...
     *
     * @param UpdateContext $updateContext
     * An object that determine an instance of the update
     * context.
     */
    public function update(UpdateContext $updateContext)
    {
        // ...
    }

    /**
     * Allows to keep the plugins user data on uninstall.
     *
     * @param UninstallContext $context
     * An object that determine an instance of the uninstall
     * context.
     */
    private function keepUserDataOnUninstall(UninstallContext $context)
    {
        if ($context->keepUserData()) {
            return;
        }
    }

    /**
     * Subscribe the template directory within the template manger.
     *
     */
    private function subscribeTemplates()
    {
        $this->container->get('Template')->addTemplateDir(
            $this->getPath() . '/Resources/views/'
        );
    }
}

In der subscribeTemplates() Methode werden oder sollten eigentlich die Views registriert werden.

Der Inhalt der Template ist relativ simpel:

{extends file="parent:frontend/detail/content/buy_container.tpl"}

{block name='frontend_detail_index_buy_container'}
    Hello World
{/block}

Die Installation erfolgt meistens via CLI wurde aber auch regulär via backend versucht:

php ./bin/console sw:plugin:refresh
php ./bin/console sw:plugin:uninstall ProSalesRunningMeter
php ./bin/console sw:plugin:install --activate ProSalesRunningMeter
php ./bin/console sw:cache:clear

Danach habe ich den Shop Cache geleert sowie den Cache unter Performance:

Was mache ich falsch?

Folgendes könnte auf den Fehler hinweisen:

  • Der Event : Ich bin mir nicht sicher ob ich den richtigen Event verwende.
  • Caching : Ich verstehe das Caching nicht wirklich und weiss nicht welche Caches erneuert werden müssen.
  • Einstellungen : Ich verwende die Standard Shopkonfiguration in der Deutschen Sprache - es wurden keine Einstellungen betreffend Entwicklung getätigt - sofern so etwas exisitiert?
    • Ich habe aber das debugging aktiviert: config.php
  • Ich verwende Windows - XAMPP hatte zuvor Bitnami One-Installer verwendet.
  • Shopware v. 5.5.8

Eine Frage nebenbei:

  • Eigentlich kann ich den Event doch auch mithilfe eines Subscriber filtern oder?

Ich hoffe Ihr erkennt mein Vorhaben und könnt mir eine Lösung des Problemes vermitteln. Ich möchte noch einmal kurz erwähnen das ich kein Theme schreiben möchte - aus anderen Plugins weiss ich dass die Frontend-Dateien auch ohne Theme überschrieben werden können.

Mit freundlichem Gruss

Alexander Bösch

Services sollten in lowercase eingetragen werden:

$this->container->get(‚template‘)->addTemplateDir( $this->getPath() . ‚/Resources/views/‘ );

Hat leider auch nicht geklappt.

Hat hier jemand eine Idee ich bin hier recht am verzweifeln?

Ich kann dir gern zeigen, wie ich das gemacht habe und wie es bei mir funktioniert. Um dieses Template zu manipulieren, verwende ich (u.a.) folgende Struktur:

/SW_ROOT_FOLDER/custom/plugins/PluginName/

|___ Resources/

      |___ views

            |___ frontend/

                  |___ detail/

                         |___ content/

                                |___ buy_container.tpl

      |___ services.xml

|___ Subscriber/

      |___ RouteSubscriber.php

|___ PluginName.php

Die Dateien sind wie folgt aufgebaut.

buy_container.tpl:

{extends file="parent:frontend/detail/content/buy_container.tpl"}

{block name='frontend_detail_data_attributes'}
    {$smarty.block.parent}

    [mein inhalt]

{/block}

services.xml:

            %plugin_name.plugin_name%
            %plugin_name.plugin_dir%

RouteSubscriber.php:

 'onPostDispatch',
        ];
    }

    public function __construct($pluginName, $pluginDirectory)
    {
        $this->pluginDirectory = $pluginDirectory;
    }

    public function onPostDispatch(\Enlight_Controller_ActionEventArgs $args)
    {
        /** @var \Enlight_Controller_Action $controller */
        $controller = $args->get('subject');
        $view = $controller->View();

        $view->addTemplateDir($this->pluginDirectory . '/Resources/views');

        $request = $controller->Request();
        $response = $controller->Response();


    }
}

PluginName.php:

 

1 „Gefällt mir“

Hallo MrFox

Vielen Dank für Deine Antwort doch leider funktioniert das bei mir ebenfalls nicht?

Ich habe einmal einen Reduced Test Case des Plugins hochgeladen: https://github.com/sirthxalot/rtc-shopware-frontend

Bei Deinem Beispiel musste ich die semikolon beim XML entfernen. Ausserdem erschliesst sich mir noch nicht wie

 $view->addTemplateDir($this->pluginDirectory . '/Resources/views');

Funktionieren soll? Nach Deiner Struktur gibt es kein views/ Verzeichnis ich habe deshalb einmal versucht die frontend Dateien im Verzeichnis view zu hinterlegen und einmal so wie Du es vorgeschlagen hast.

Ich wäre froh wenn jemand mal kurz den Code reviewen könnte.

Auf jedenfall Danke für Deine Antwort.

 

hab einen fehler gemacht bei der darstellung der dateistruktur. den hab ich behoben

warum das die ; in dem XML sind, kann ich dir nicht sagen, die gehören da nicht hin, das ist aber, was der Editor hier in dem Forum daraus macht :confused:

Hallo MrFox

Vielen Dank nocheinmal für Deine Ergänzungen - Ja der Editor macht witzige Sachen.

Nun habe ich das Plugin bei uns mal im Livesystem eingespitzt und siehe da es funktioniert!!!

Ich gebe einfach einmal Windows die Schuld - Ich denke es hat etwas mit den Pfaden zu tun - Doch leider bekomme ich keine Informationen von XDebug.

Im Moment weiss ich noch nicht weiter Ich werde wohl mein gesammtes Projekt auf uggs Mac tätigen müssen - Natürlich wäre Vagrant oder Docker auch eine Lösung aber ich habe keinen Bock mehr auf überaschungen.

Extenden von Blöcken ist mit Windows irgendwie kaputt. Die Vererbung funktioniert irgendwie in Smarty nicht.

1 „Gefällt mir“

https://forum.shopware.com/discussion/29617/template-vererbung-und-smarty-3-include-statements

Mögliche Lösung:  https://www.smarty.net/docs/en/resources.tpl#templates.windows.filepath (nicht getestet)

Ich finde Shopware kommuniziert das nicht richtig - Meiner Meinung nach ist Shopware somit inkompatibel mit Windows.

Ich danke Euch für Eure Zeit und Antworten - Für heute reichts mir   Smile 

Ja, Shopware lief noch nie auf Windows Systemen. Überall schreiben wir auch, dass man ein Linux basiertes System benötigt.

Steht auch in den Systemanforderungen: https://docs.shopware.com/de/shopware-5-de/tutorials-und-faq/systemanforderungen-hosting

Für alle diejenigen die es Interessiert wie ich weiter vorging:

Ich bin auf Docker umgestiegen. Ich verwende Windows 10 Professional mit einem nativen Docker.

Mithilfe von Laradock - ein Docker Container konnte ich alles starten.

Ich bin nun seit mehr als 1 Woche damit am arbeiten und muss sagen läuft wie am schnürchen ; )

Ich hoffe das hilft Euch weiter falls Ihr ebenfalls in ein ähnliches Problem läuft.

Gruss

Alexander

Hallo Alexander,

bist du bitte so lieb und erklärst deine Vorgehensweise zur Ausführung etwas ausführlicher ?

Ich selbst versuche derzeit eine Shopware 5.6.4 mithilfe von Docker aufzusetzen.

Leider läuft nicht ein Docker Image sauber durch bei mir.

Tausend Dank für deine Zeit.

Liebe Grüße

Tim