Hallo, ich möchte gern einen Smarty-prefilter einsetzen, um Anker-Links (also z.B. Testlink) durch den entsprechenden anchor-Tag zu ersetzen (also {anchor anchor="blubb" text="Testlink"}).
Siehe Edit weiter unten
Meine Datei (prefilter.replaceanchor.php) sieht dabei so aus:
[noparse]function smarty_prefilter_replaceanchor($tpl_source, &$smarty)
{
return preg_replace('/(.+)/', '{anchor anchor="$1" text="$2"}', $tpl_source);
}
Wenn ich diese Datei jetzt im Ordner /lib/smarty/plugins ablege und in der/lib/content.functions.php per
$this->autoload_filters = array('pre' => array('replaceanchor'));[/noparse]
einbinde, wird das Plugin zwar geladen (ein echo "blubb"; wird angezeigt), allerdings wird mein Link nicht durch den entsprechenden Anker ersetzt.
Kann mir da jemand helfen? (Der reguläre Ausdruck sollte funktionieren, habe es im RegexBuddy getestet).
Edit: Mir kommt grad so der Gedanke, dass dieser prefilter garnicht auf den Seiteninhalt angewendet wird sondern nur auf das Template o.O
Edit2: In der Tat, habe es gerade ausprobiert - wenn ich einen Anker im Template habe, wird der korrekt umgewandelt. Allerdings steht dann auch nur der {anchor}-Tag in der Ausgabe und nicht der durch Smarty ersetzte
Weiß jemand, wie ich mein Vorhaben, anders lösen kann? Also dass, bevor Smarty den Content zu fassen bekommt, alle Anker-Links durch den {anchor}-Tag ersetzt werden, sodass Smarty diesen dann wieder in einen korrekten Link umsetzen kann?
Ich weiß nicht, wie ich es z.B. mit einem User-Tag umsetzen sollte.
Smarty prefilter einsetzen
Smarty prefilter einsetzen
Last edited by dc2 on Wed Jul 08, 2009 3:04 pm, edited 1 time in total.
Re: Smarty prefilter einsetzen
So falsch war dein Ansatz gar nicht, nur in der Ausführung noch nicht ganz optimal.
Zum einen - CMSms bietet auch hier eine einfache Lösung; das Herumschrauben an den Core-Dateien ist nicht erforderlich. Du musst prefilter.replaceanchor.php nur anstelle nach lib/Smarty/plugins nach /plugins kopieren. Der Prefilter wird dann automatisch geladen und ausgeführt. Du musst nur noch
in
ändern.
Zum anderen funktioniert dein Snippet noch nicht ganz so, wie es soll (zumindest bei mir nicht). Hier eine bei mir funktionierende Variante:
Danke an Andiministrator für die schnelle Regex-Hilfe !
Zum einen - CMSms bietet auch hier eine einfache Lösung; das Herumschrauben an den Core-Dateien ist nicht erforderlich. Du musst prefilter.replaceanchor.php nur anstelle nach lib/Smarty/plugins nach /plugins kopieren. Der Prefilter wird dann automatisch geladen und ausgeführt. Du musst nur noch
Code: Select all
function smarty_cms_prefilter_replaceanchor($tpl_source, &$smarty)
Code: Select all
function smarty_cms_prefilter_replaceanchor($tpl_source, &$smarty)
Zum anderen funktioniert dein Snippet noch nicht ganz so, wie es soll (zumindest bei mir nicht). Hier eine bei mir funktionierende Variante:
Code: Select all
<?php
function smarty_cms_prefilter_replaceanchor($tpl_source, &$smarty)
{
return preg_replace('/<a href="#([A-Za-z0-9\\._-]+)">(.+)<\/a>/', "{anchor anchor='$1' text='$2'}", $tpl_source);
}
?>
Re: Smarty prefilter einsetzen
Viele Dank für die schnelle Hilfe!
Ja bei /plugins hatte ich die Datei auch schonmal drin - aber vermutlich hat es aufgrund der anscheinend Regex nicht richtig funktioniert. Jetzt klappt alles, wie es soll - dankeschön
Hab fürher selbst schonmal mit Smarty rumgebastelt und hab die Datei deshalb erst in den Smarty-Plugin-Ordner getan xD
Wusste nicht, dass es so einfach geht
Ja bei /plugins hatte ich die Datei auch schonmal drin - aber vermutlich hat es aufgrund der anscheinend Regex nicht richtig funktioniert. Jetzt klappt alles, wie es soll - dankeschön
Hab fürher selbst schonmal mit Smarty rumgebastelt und hab die Datei deshalb erst in den Smarty-Plugin-Ordner getan xD
Wusste nicht, dass es so einfach geht
Last edited by dc2 on Thu Jul 09, 2009 11:44 am, edited 1 time in total.