MODx Smarty Templates
von Michael Engel
am 17.07.08 um 16:50 (12175 Hits)
Meine Firma setzt nun seit einer Weile auf Smarty als CMS System. Soweit war es ja auch immer OK das einzige Problem das ich immer damit hatte das es Schlichtweg keine Template Engine Verwendet sondern Templates durch hässliche Snippets zusammengebaut werden müssen in denen HTML Code abgelegt werden muss weil es sonst weit Oversized währ.
In einer Späteren Version soll das CMS eine Smarty unterstüzung bekommen, doch bis dahin dauerte es mir zu lange ,) Und die Unterstüzung wurde kuzerhand als Plugin geschrieben. Da sicherlich noch andere Intresse an so etwas haben erscheint es hier:
Zuerst wurde Smarty komplett heruntergeladen und unterhalb von /manager/ abgelegt worden, hier kann man natürlich stattdessen auch das ggf. vorhandene Paket verwenden.
Dannach legen wir das tmp_c Verzeichniss mit dem Smarty später arbeitet des weiteren benötigen wir noch ein Verzeichniss für die Smarty Scripte... hier wurde in meinem Fall "/smartyScripts/" auf der MODx Hauptebene angelegt.
Zuletzt muss noch das Plugin unter Resourcen erstellt werden:
Wichtig: es muss mit dem Ereigniss "OnWebPagePrerender" Verknüpft werden.PHP-Code:if(file_exists(getcwd().'/smartyScripts/'.$modx->documentObject['id'].'.php')) {
define('SMARTY_DIR', getcwd().'/manager/Smarty/libs/' );
require_once('manager/Smarty/libs/Smarty.class.php');
$smarty = new Smarty;
$smarty->config_dir = SMARTY_DIR;
$smarty->template_dir = './smartyScripts';
$smarty->compile_dir = './manager/Smarty/tmp_c';
$smarty->cache_dir = './manager/Smarty/tmp_c';
$smarty->caching = false;
$smarty->force_compile = true;
$smarty->compile_check = false;
// None-Caching Blöcke registrieren
function smarty_block_dynamic($param, $content, &$smarty) {
return $content;
}
$smarty->register_block('dynamic', 'smarty_block_dynamic', false);
function modx_get_template ($tpl_name, &$tpl_source, &$smarty_obj)
{
// Get Template from Modx
global $modx;
$tpl_source = $modx->documentOutput;
// Dies ist nötig da unsere Designer und ModX viel inline Javascript verwendet das sonst zu Fehlern von Smarty führt.
$tpl_source = preg_replace("%<script.*</script>%Uis","{literal}\\0{/literal}", $tpl_source);
$tpl_source = preg_replace("%<style.*</style>%Uis","{literal}\\0{/literal}", $tpl_source);
return true;
}
function modx_get_timestamp($tpl_name, &$tpl_timestamp, &$smarty_obj)
{
$tpl_timestamp = time();
return true;
}
function modx_get_secure($tpl_name, &$smarty_obj)
{
// assume all templates are secure
return true;
}
function modx_get_trusted($tpl_name, &$smarty_obj)
{
// not used for templates
}
// register the resource name "modx"
$smarty->register_resource("modx", array("modx_get_template",
"modx_get_timestamp",
"modx_get_secure",
"modx_get_trusted"));
require(getcwd().'/smartyScripts/'.$modx->documentObject['id'].'.php');
$modx->documentOutput = $smarty->fetch('modx:current');
}
Soweit ist nun alles vorbereitet.Und das ganze Funktioniert so das die Programmierabteilung eine PHP Datei mit der Dokumenten ID als namen in das Smarty Verzeichniss Uploaded, in welchem die assigns auf die Smarty-variablen stehen. Und im Template Editor können die Designer wie gewohnt auf Smarty Befehle zugreifen, und müssen nicht mehr wegen jeder Kleinigkeit ein Snippet anfordern.
Ich hoffe es ist nicht Allzu Umständlich beschrieben ,)






