Smarty Template debugging

Finden statt Suchen in Gambio

Smarty Template debugging

Heute mal was für Entwickler die sich mit Gambio (oder Smarty) rumplagen. Gambio hat deutlich über 300 Templates für verschiedene Inhalte, da kann es schon eine Plage sein, das Template zu finden, welches den Code steuert, den man gerade ändern möchte. Aber hier kommt Hilfe

"Früher" war alles besser - das stimmt zwar nur bedingt, aber was das zuvor geschilderte Problem angeht, so stimmt das. Immerhin brachte Smarty v2 eine Debuggingfunktion mit, die um das HTML, welches von einem Template generiert wurde, einen Rahmen gezogen und den Templatenamen in der Ecke eingeblendet hat.
So leicht kann es gehen: den Templatenamen einfach ablesen

In aktuelleren Version geht das nicht mehr, erst recht nicht in Gambio.

Der Screenshot rechts ist jetzt natürlich nicht aus dem Jahre 2010, sondern aus einem aktuellen Gambio 4.9.x

In dem Kontaktformular wird an einer Stelle ein Captcha eingebunden und wie man hier gut sieht, ist das Template captcha_captcha.html dafür verantwortlich.

Wie wurde das gemacht? Wir haben einen PreFilter für Smarty registriert, der jedes gerenderte Template in einen Div hüllt, dem wir die nötigen Infos mitgeben. der Rest ist dann nur noch CSS. In anderen Systemen könnte man das auch mit einem Outputfilter, oder anderen Möglichkeiten lösen, in Gambio ist Smarty aber sehr eigenwillig implementiert, so daß dies die einzige Lösung ist, die wir gefunden haben.

 

Los geht's 

Zunächst müssen wir den Filter irgendwo sinnvoll registrieren. Perfekter Ort dafür ist natürlich im Smarty-Constructor. Hierzu erweiten wir einfach die Smarty-Klasse:
 
class SmartyDebugGXSmarty extends GXSmarty{
    public function __construct($template_dir=null,$compile_dir=null){
        parent::__construct($template_dir,$compile_dir);
        
        // Prefilter direkt registrieren
        require_once DIR_FS_CATALOG.'GXModules/ait/SmartyDebug/Shop/System/Smarty/Filters/Prefilter/DebugBorderPrefilter.php';
        $this->registerFilter('pre',[new DebugBorderPrefilter(),'process']);
    }
}
Damit Gambio ab jetzt unsere erweiterte Klasse verwendet, muss Code in die 

function init_smarty() 

welche sich in der GXMainComponents/View/ThemeContentViews/core/ThemeContentView.inc.php befindet.
Leider läßt Gambio es nicht zu, daß man die Klasse ThemeContentView überlädt. Auch gibt es kein Hooksystem mit dem wir das irgendwie elgant lösen könnten.

Das heißt: ohne CorePatch kommen wir hier nicht weiter. Da wir den preFilter aber eh nur während der Template-Entwicklung nutzen, ist dies gerade noch so zu verkraften.

Wir fügen also folgenden Code in die init_smarty() ein:

//ait - SmartyDebug
require_once DIR_FS_CATALOG.'GXModules/ait/SmartyDebug/SmartyDebugGXSmarty.inc.php';
$this->v_coo_smarty=MainFactory::create('SmartyDebugGXSmarty');
Dieser ersetzt den alten Aufruf:
 
# create smarty
$this->v_coo_smarty=MainFactory::create('GXSmarty');


Die Optik

Jetzt noch ein wenig SCSS in Ihre main.scss Datei einfügen, damit die Optik passt:
 
//Debugging
.debug-border{
    margin:0;
    padding:0;
    position:relative;
    outline:1px solid #d70039;
    transition:all 0.25s ease-in-out 0.2s;
    background-color:rgba(0, 0, 0, 0.1);
    
    &:hover{
        margin:15px;
        padding:10px;
        .debug-border:before{
            background-color:rgba(0, 0, 0, 0.7);
        }
    }
}

.debug-border:before{
    padding:1px 2px;
    position:absolute;
    z-index:99999;
    top:-12px;
    left:0;
    content:attr(data-template);
    color:#fff;
    background-color:rgba(0, 0, 0, 0.5);
    font-size:8px;
}
Im Wesentlichen wird ein roter Rahmen um den Block gezogen. Dazu wird das data-template Attribut des Wrappers asusgelesen und  oben Links als Titel für den Block. eingeblendet. Da sich die Templates auf die Weise schnell überlappen, gibt es beim :hover noch eine kleine Animation die Platz schafft.

Und das war es auch schon. Zusammen mit dem eigentlichen Prefilter (den Sie unten im Download finden) kann man jetzt Templates sauber debuggen.
Der Ablauf ist wie folgt:
  1. Über den Admin den Cache leeren
  2. Den Shop mit Parameter aufrufen: https://shop.ihre-domain.de/?debug=border
  3. Alle Seiten die ab jetzt aufgerufen werden, laufen durch den Prefilter.
  4. Ist man fertig dekativiert man den Filter wieder: https://shop.ihre-domain.de/?debug=off
  5. Jetzt wieder den Cache leeren und den Shop erneut aufrufen um die Templates ohne Rahmen zu rendern.
 
Hier sehen Sie das Ganze mal in Aktion


Jetzt einfach herunterladen

Natürlich müssen Sie nichts tippen, alle nötigen Dateien stehen hier zum Download bereit:
smary_debug.zip [3,65 KB]
Entpacken, den CSS Code rüber kopieren, die restlichen Dateien so in den Shop hochladen. Im preFilter muss noch eine Konstante angepasst werden (ja, ginge auch automatisch), noch den Modulcache leeren, aber das war's dann auch schon.


Hinweise und Schlusswort

Wie oben schon geschrieben, ist das Ganze leider nicht updatesicher. Ausserdem sollte es nicht in einer Produktivumgebung genutzt werden. Die gerenderten roten Rahmen sind für ALLE Besucher des Shops sichtbar, da Sie in den Templatecache reingerendert sind.

In der SmartyDebugGXSmarty ist schon eine statische level-Variable mit drin. Diese können Sie nutzen um je nach Tiefe ver Verschachtelung zB andere Farben für die Rahmen anzugeben. Ausserdem können Sie statt dem einfachen GET Parameter zum aktivieren/dekativieren noch ein Passwort mit einbauen, ebenso wie Sie beim dekativieren eventuell gleich den Cache automatisch löschen wollen. Für ganz Neugierige kann man auch gleich noch die Templatevariablen mit Ausgeben.

Möglichkeiten zur Erweiterung gibt es viele - wir freuen uns auf Ihr Feedback!

Tobias Arnoldt, 05.12.2025 | zurück zur Blog-Übersicht