Plugin Theme Update Methode - Theme Kompilieren führt zu Fehler bei neuer Theme-Variable

Hallo,

wenn man in der Bootstrap.php eines Theme-Plugins in der Update-Methode hinterlegt, dass nach Update dirket das Theme neu kompiliert wird, kommt es beim Kompilieren zu einem Fehler. Hier ein Beispiel der Update-Methode:

/**
	 * @return array
	 */
	public function update($oldVersion)
	{
		return [
			'success' => true,
			'invalidateCache' => ['template', 'theme']
		];
	}

Und hier ein Beispiel der Fehlermeldung:

Während der Bearbeitung von Shop "Zenit Design Theme Demo" ist ein Fehler aufgetreten: variable @neue-variable is undefined in file [...]

Die Variable, welche bemängelt wird, ist in der Theme-Konfiguration neu hinzugekommen.

Entfernt man die Update-Funktion, führt das Update im Plugin-Manager aus, ruft dann den Theme-Manager auf und kompiliert das Theme von dort aus, funktioniert es. BUG oder irgendwas vergessen?

 

MFG ZENIT

@zenit schrieb:

Die Variable, welche bemängelt wird, ist in der Theme-Konfiguration neu hinzugekommen.

Meine Vermutung: Die Variable wird zwar hinzugefügt, aber der Wert wird erst in die Datenbank geschrieben, wenn die Theme Konfiguration 1x gespeichert wurde. Das ist bei Installation des Plugin allerdings nicht der Fall.

Zeig uns mal den Code wie du die Variable in die Theme Konfiguration hinzufügst dann kann man da evtl. ansetzen.  Wink

Viele Grüße

Ich glaub es liegt an der Update-Methode. Es geht an sich nicht um die Variable. Durch diese Update-Methode wollte ich erreichen, dass nach dem Update direkt das Theme erneut kompiliert wird. Das wird häufig vergessen und ist daher eine häufige Fehlerquelle. 

Durch diese update-Funktion passiert aber nichts weiter. Hatte nun in einem anderen Plugin das Problem, dass die config nicht aktualsiert wurde, sondern nur cache geleert und das Theme kpmpiliert wurde. Da fehlt also noch was… 

Naja @simkli könnte da schon recht haben, vor allem da der Fehler ja auch dies besagt. Habe bei mir auch bemerkt, dass neue Less-Variablen erst einmal “aktiviert” werden müssen (einmal Theme speichern), damit der Fehler verschwindet. Du müsstest also mal gucken ob du die Speicher-Methode in deiner Update vorher aufrufen kannst und so alles funktioniert.

Hallo, 

ja ich meinte auch eher, dass mit der Anlage der neuen Variable prinzipiell alles in Ordnung ist, nur eben - wie ihr schon schreibt - das Speichern des Plugins bzw. der Update-Vorgang an sich fehlt. Ein Ansehen der Variable in der theme.php wird daher wenig nutzen.Das gleiche gitl ebenso bei normalen Plugins. Auch hier soll in einer Update-Methode gleich das Theme kompiliert werden. Aber auch hier werden keine neuen Config-Felder bei einem update installiert, wenn man die Update-Methode folgendermaßen einrichtet: 

/**
	 * @return array
	 */
	public function update()
	{
		return [
			'success' => true,
			'invalidateCache' => ['template', 'theme']
		];
	}

Ein Update ohne diese Update-Methode funktioniert hingegen problemlos. Neue Felder werden angelegt, die Variablen lassen sich im Theme-Manager kompilieren usw.

Was müsste denn in einer solchen Update-Funktion stehen? Eine Prüfung der Version und einzelnes Hinzufügen von neuen Config-Feldern usw. sollte doch nicht zwingend notwendig sein, sobald man diese Methode explizit verwendet oder dann doch? Ohne diese Methode werden Updates mit neuen Feldern ja problemlos geladen…

 

MFG ZENIT

 

Gibt es hierzu neue Erkenntnisse?

Über die theme.php neu hinzugefügte Variablen, welche im Theme genutzt werden, müssen wie @steinsoftware‍ beschrieben haben, erst durch Speichern der Theme-Konfiguration „bekannt“ gemacht werden und in die Datenbank geschrieben werden o.Ä… Und das passiert bei der Update-Methode nicht, sodass ein invalidieren des Theme Caches inkl. Theme Kompilierung im LESS-Compiler knallt… 

@mdsw schrieb:

Über die theme.php neu hinzugefügte Variablen, welche im Theme genutzt werden, müssen wie @steinsoftware‍ beschrieben haben, erst durch Speichern der Theme-Konfiguration „bekannt“ gemacht werden […]

@mdsw‍ Ich glaube, dass es schon reicht, die Themes zu „synchronisieren“. Das kannst du mit dem Theme-Installerservice machen. Wenn du Zugriff zum DI-Container hast:

/* z.B. im Plugin (neues System) */
$installer = $this->container->get('theme_installer');
$installer->synchronize();

Im alten Plugin-System geht es analog mit $this->get(…

Wenn du synchronize ausfuehrst, passiert das Gleiche, wie wenn du im Theme-Manager auf neuladen klickst.
Wenn du sehr viele Themes hast mit vielen Konfigurationen und einen schwachen Server kann das schon etwas dauern.

Viele Gruesse

 

1 „Gefällt mir“

@simkli‍ vielen Dank für die Antwort. 

Ich habe das in die Update-Methode eingefügt:

public function update(UpdateContext $updateContext)
{

	$installer = $this->container->get('theme_installer');
	$installer->synchronize();

	$updateContext->scheduleClearCache([
		UpdateContext::CACHE_LIST_DEFAULT,
		UpdateContext::CACHE_TAG_THEME
	]);

}

Leider passiert beim Update nichts weiter - es kommt allerdings auch zu keinem Fehler. Das Update läuft durch, der Kompiler will kompilieren und kennt die Variable noch immer nicht.

@mdsw‍: Ich habe mir den Prozess noch einmal genauer angesehen. Der ThemeInstaller ruft fuer jedes Theme die synchronize-Methode des Theme-Configurators auf. Dort wird bei jedem Theme die createConfig-Methode aufgerufen und die Werte im Form-Persister gespeichert.

Kannst du mal pruefen, ob nach deinem synchronize-Aufruf dein neues Feld in der Datenbank steht? (s_core_templates_config_elements)

Es gibt bei Shopware zwei Tabellen fuer die Theme-Felder. Die s_core_templates_config_elements und die s_core_templates_config_values. In der ersten werden allgemeine Infos ueber dein Feld gespeichert und der Default-Wert. Die zweite Tabelle speichert den Wert des Felds fuer jeden Subshop. Eigentlich sollte jedoch der Wert aus Tabelle 1 genommen werden, wenn kein Eintrag in Tabelle 2 existiert. Und bei synchronize, sollte ein Eintrag in die erste Tabelle erfolgen.

Viele Gruesse