CACHE_LIST_FRONTEND bei Aktivierung oder Install berücksichtigt nicht die neuen LESS und JS Dateien

Hallo Community,

ich habe ein Problem mit dem Leeren des Caches bzw. mit dem Kompilieren des Themes bei Aktivierung eines Plugins:

So ist es möglich in der Plugin Bootstrap.php nach neuer Pluginstruktur mit folgendem Code bereits beim Aktivieren des Plugins das Theme zu kompilieren. Das wäre nützlich, weil viele Nutzer das vergessen.

public function activate(ActivateContext $context)
{
    $context->scheduleClearCache(InstallContext::CACHE_LIST_FRONTEND);
}

PROBLEM:

Wenn bei der Aktivierung durch CACHE_LIST_FRONTEND das Theme kompiliert wird, sind leider die neuen Javascript und LESS Dateien nicht dabei. Gehe ich direkt nach der Aktivierung und durchlaufener Kompilierung + Cache leeren in die Storefront erscheint die Darstellung des Plugins ohne Styles und JS.

Gehe ich direkt danach in den Theme-Manager und kompiliere von dort aus, ist die Darstellun des Plugins im Frontend korrekt. Es betrifft also nur die Kompilierung bei Aktivierung des Plugins, wenn dieses frisch installiert wurde.

Beim Kompilieren stehen also die neuen JS und LESS-Dateien noch nicht zur Verfügung - was die Cache Sammlung CACHE_LIST_FRONTEND nutzlos macht?! Viel mehr noch denkt der Kunde, das Plugin wäre defekt.

Reihenfolge vielleicht falsch?

Wenn du das Plugin gerade installieren willst, vorerst den Cache leerst und dann erst deine neuen Pfade und Dateien registrierst, dann könnte das bis zum nächsten Cache-Clear eine mögliche Begründung für dein Problem sein. Bei manchen Cache-Aktionen wird nach dem Clear ein sog. Cache-Warmup ausgeführt, dabei wird (um die Reaktionszeiten niedrig zu halten für Kunden) jede Shopseite schonmal aufgerufen und gecached.

hm… Reihenfolge…

public static function getSubscribedEvents()
{
   return [
      'Theme_Compiler_Collect_Plugin_Less' => 'onCollectLessFiles',
      'Theme_Compiler_Collect_Plugin_Javascript' => 'onCollectJsFiles'
   ];
}

habe ich in einen Subscriber ausgelagert (class Subscriber implements SubscriberInterface). Die eigentliche Plugin-Bootstrap beinhaltet lediglich die Aufrufe zum Install, Activate, Update, und Uninstall und die Funktionen zum Leeren der Caches…

Könnte es daran liegen?

Vielleicht leerst du in dem Zug einfach alle Caches. Ich konnte in meinem Test jedenfalls die o.g. Methode zum Löschen des Frontend-Cache nutzen.

LG Andre

Hallo @AndreHerking‍

Du meinst mit dem Preset:

CACHE_LIST_ALL

Ich werde das mal versuchen. Also ist nicht bekannt, dass es daran liegen könnte, dass ich die LESS und JS collects in einen Subscriber ausgelagert habe?!

Bei mir funktioniert das mit den LESS Files und der CACHE_LIST_DEFAULT reichbungslos unter SW 5.2.21

Ich habe es mit CACHE_LIST_ ALL unter SW 5.3.3 getestet. Bei Install und Bei Acitvate. Es werden die neuen LESS Files und JS Files nicht berücksichtigt.
Mit der alten Plugin-Struktur gibt es dahingehend keine Probleme.
 

Woran könnte das liegen? Wie oben beschrieben, werden bei einer späteren Kompilierung die LESS Files und JS Files korrekt mit kompiliert… liegt es am Subscriber?

Ich tippe mal auf einen Bug. Mach doch mal ein Ticket im Issue Tracker auf.

namespace DeinPlugin;

use Shopware\Components\Plugin;
use Shopware\Components\Plugin\Context\InstallContext;
use Shopware\Components\Plugin\Context\UninstallContext;
use Shopware\Components\Plugin\Context\UpdateContext;
use Shopware\Components\Plugin\Context\ActivateContext;
use Shopware\Components\Plugin\Context\DeactivateContext;

// Unter folgendem Link findet ihr vordefinierte Sets:
// https://github.com/shopware/shopware/blob/5.3/engine/Shopware/Components/Plugin/Context/InstallContext.php#L31

class DeinPlugin extends Plugin
{
	/**
	 * install function
	 */
	public function install(InstallContext $context)
    {
    }
	
	/**
	 * uninstall function
	 */
	public function uninstall(UninstallContext $context)
    {
    }
		
	/**
	 * update function
	 */
    public function update(UpdateContext $context)
    {
    }
	
	/**
	 * activate function
	 */	
	public function activate(ActivateContext $context)
    {
		$context->scheduleClearCache(
			[
				InstallContext::CACHE_TAG_THEME,
				InstallContext::CACHE_TAG_HTTP
			]);

		parent::install($context);
	}
	
	/**
	 * deactivate function
	 */	
	public function deactivate(DeactivateContext $context)
    {
        //$context->scheduleClearCache(InstallContext::CACHE_LIST_ALL);
    }
}

Hier eine Vorlage für alle diejenigen, die auf der Suche danach sind :wink: