Zugriff auf Template/Theme-Variable aus Plugin

Hi Community,

ich habe gerade das Problem, dass ich es nicht schaffe Shopversions-Übergreifend (5.x) und zuverlässig einen Wert aus der Theme-Konfiguration zu entnehmen. Mein Ansatz einen entsprechenden Getter zu schreiben funktioniert nur in Teilen:

   /**
     * Tries to fetch the demanded config name option from template settings
     *
     * @param $templateConfigName
     * @return bool
     * @throws \Exception
     */
    protected function getTemplateConfigVar($templateConfigName) {
        $shop = $this->container->get('shop');
        $template = $shop->getTemplate();
        $configVal = null;

        $templateElements = $template->getElements()->toArray();
        foreach ($templateElements as $templateElement){
            $configName = $templateElement->getName();

            if ($configName === $templateConfigName){
                $configValues = $templateElement->getValues()->getValues();
                $configVal = $configValues[0]->getValue();
                break;
            }
        }

        return $configVal;
    }

 

Konkret geht es bei mir um die Option asyncJavascriptLoading (Wenn aktiv, werden die JavaScript Dateien asynchron geladen.). Bei ungecheckter Box liefert mir dieses Konstrukt den Wert false, soweit so gut. Bei gecheckter Box schlägt der Getter auf configValues fatal fehl.

Habe mir $templateElement im Debugger angeschaut. Dort sind wirklich viele Informationen drin, aber irgendwie kann ich den aktuell gesetzten Wert nicht ausfindig machen.

Das ganze sollte dann, wie erwähnt, auch rückwärtskompatibel funktionieren bis SW 5.x. Ich werde mich parallel im SW-Code auf die Suche machen. Schauen wir mal wer schneller ist :slight_smile:

 

Viele Grüße

André

OK, das scheint schonmal der Holzweg zu sein. The-Way-To-Go scheint mir eher die Verwendung des Theme-Services zu sein, da das Template logischerweise nur die Optionen, nicht aber deren aktuelle Zustände liefert…

ist es das gleiche wie hier: https://issues.shopware.com/issues/SW-20265 ?

Ja das klingt sehr ähnlich wie das Problem vor dem ich gerade stehe. Ich bin auch schonmal etwas weiter:

    /**
     * Tries to fetch the demanded config name option from template settings
     *
     * @param $templateConfigName
     * @return bool
     * @throws \Exception
     */
    protected function getTemplateConfigVar($templateConfigName) {
        $shop = $this->container->get('shop');
        $compiler = $this->container->get('theme_compiler');
        $configuration = $compiler->getThemeConfiguration($shop);

        // dummy fallback
        $configVal = null;

        return $configVal;
    }

 

Hier finden sich in $configuration dann auch wirklich die aktuellen Config-Werte… außer genau dem den ich brauche, grrr

vll hilft das weiter. wenn du in der Themeeinstellung keinen Hacken reinmachst, dann schreibt er in die Tabelle s_template_config_values den Wert " b:0" . Suche nach der element_id=id aus s_template_config_elements wo name = " asyncJavascriptLoading". Wenn das Häckchen gesetzt ist, schreibt er gar nichts in die Tabelle rein. Also der Configwert existiert dann nicht.

1 „Gefällt mir“

Kleiner nachtrag:

Erstmal Danke @brettvormkopp‍ . Allerdings zeigt der Hack den du beschreibst doch mehr als deutlich, dass das doch nicht die Antwort sein kann. Ich denke hier ist Handlungsbedarf oder ich verwende immer noch die falschen Klassen/Methoden um an den gewünschten Wert zu erhalten. Find es halt seltsam, dass nur eine erlesene Auswahl der Settings im Objekt ist. Auch der Ansatz: Ist nicht da = true quält sich geradezu in meinen Kopf.

Da es bei mir nur um die Variable asyncJavascriptLoading ging konnte ich mir mit meinem Problem via Smarty helfen mittels:

{assign var='isAsyncJsLoading' value=(isset($theme.asyncJavascriptLoading) && $theme.asyncJavascriptLoading)}

Das geht dann auch mit alten Versionen, welche die Option nicht haben. Vielleicht postet hier ja noch jemand eine generische Lösung, die komplett aus PHP kommt.