|
Smarty
WARNING: All discussion is moving to https://reddit.com/r/smarty, please go there! This forum will be closing soon. |
|
View previous topic :: View next topic |
Author |
Message |
Ralfi Smarty n00b
Joined: 05 Jul 2004 Posts: 4
|
Posted: Mon Jul 05, 2004 3:28 pm Post subject: Problem mit Caching |
|
|
Hallo,
ich habe ein kleines Problem mit dem Caching. Wie ich einen bestimmten Bereich vom Cachen ausschliessen kann, weiss ich mittlerweile. Dafür nutze ich {insert name=login tpl="login.htm"}, was auch sehr gut klappt.
Ich versuche mein Problem einmal so verständlich wie möglich zu beschreiben:
In meinem Haupttemplate "main.htm" habe ich einen Content Bereich, der einfach über {$content} ausgegeben wird. Die Variable $content wird von meinem CMS mit Inhalten befüllt. Im Prinzip lese ich einen Artikel aus der Datenbank in meine Variable $text, passe den gelesenen Text etwas an und übergebe den String $text per $smarty->assign("content", $text) an das Template. Soweit so gut.
In diesen Artikelttext, den ich aus der Datenbank lese, möchte ich nun ebenfalls einen Bereich integrieren, der nicht gecacht werden soll. In dem String $text steht somit irgendwo auch ein "...{insert name=form form='form.htm'}...". Wenn ich nun per $smarty->fetch("main.htm", $cacheid) das Template verarbeiten möchte, erscheint in der Ausgabe unter anderem auch der Text "...{insert name=form form='form.htm'}...", d.h. der {insert} Befehl wurde nicht ausgeführt.
Ich verstehe schon, dass es so nicht klappt, weil beim $smarty->fetch("main.htm", $cacheid) ja erst die Variable "content" für Smarty mit Inhalten den Inhalten aus $text befüllt wird. Ich müsste also den String $text, den ich per assign() an Smarty übergebe, auch irgendwie verarbeiten können.
1. Gibt es bei Smarty die Möglichkeit, auch Strings zu verarbeiten, also ähnlich wie bei der fetch() Methode? Wenn ja, wie heisst die Methode?
2. Gibt es einen anderen Weg, wie ich mein Problem lösen könnte? Wenn ja, wie kann ich das genau machen?
Bin für jeden Hinweis dankbar.
Viele Grüsse,
Ralfi |
|
Back to top |
|
coach Smarty Regular
Joined: 03 Jun 2004 Posts: 65
|
Posted: Tue Jul 06, 2004 7:06 am Post subject: Re: Problem mit Caching |
|
|
Hallo Ralfi,
Ralfi wrote: |
Ich verstehe schon, dass es so nicht klappt, weil beim $smarty->fetch("main.htm", $cacheid) ja erst die Variable "content" für Smarty mit Inhalten den Inhalten aus $text befüllt wird. Ich müsste also den String $text, den ich per assign() an Smarty übergebe, auch irgendwie verarbeiten können.
1. Gibt es bei Smarty die Möglichkeit, auch Strings zu verarbeiten, also ähnlich wie bei der fetch() Methode? Wenn ja, wie heisst die Methode?
|
Nicht das ich wüßte. Du könntest, wenn du es wolltest, dynamisch ein Template erzeugen und in einem temporären Verzeichnis speichern und dann fetch() oder display() machen.
Ralfi wrote: |
2. Gibt es einen anderen Weg, wie ich mein Problem lösen könnte? Wenn ja, wie kann ich das genau machen?
|
Den insert im Text ersetzen per str_replace oder regulärem Ausdruck. Du könntest z.B. <!-- smarty file --> in Text 1 finden und dann einen fetch() von diesem File machen (Text 2) und dann quasi diesen im Text 1 überschreiben.
Lies mal ein paar Artikel weiter - da ist ein Posting von mir mit ähnlichem Thema.
Coach |
|
Back to top |
|
Ralfi Smarty n00b
Joined: 05 Jul 2004 Posts: 4
|
Posted: Tue Jul 06, 2004 8:04 am Post subject: |
|
|
Hallo Coach,
erst einmal danke für deine Hilfe. Ich habe mir auch deinen anderen Beitrag durchgelesen, jedoch nicht unbedingt alles verstanden . Ich stehe halt noch relativ am Anfang bei der Benutzung von Smarty.
Vielleicht beschreibe ich noch mal anhand von einem konkreten Beispiel, wo mein Problem liegt. Vielleicht ist mein gesamter Aufbau auch kompletter Mist.
Mein Template main.htm in vereinfachter Darstellung:
-----------------------------------------------------------------------------------
<html>
<head>
<title>{$title}</title>
</head>
<body>
<div id="menu">
{section name=nr loop=$menu}
<a href="{$menu[nr].url}">{$menu[nr].name}</a>
{/section}
</div>
<div id="content">
{$content}
</div>
</body>
</html>
-----------------------------------------------------------------------------------
Aus der Datenbank hole ich mir nun die Daten für einen Artikel (das Lesen des Menus lasse ich mal aussen vor). Ich habe dann in der Variable $title die Überschrift des Artikels und in der Variable $content den Artikeltext. Der Artikeltext kann in etwa wie folgt aussehen:
-----------------------------------------------------------------------------------
{h1}eine Überschrift{/h1}
Hier steht dann ganz viel Text.
{pic_1_left}Um dieses Bild herum fliesst ein Text.
{h2}noch eine Überschrift{/h2}
{form=plugin_login}
bla bla bla
-----------------------------------------------------------------------------------
Die Tags in geschweiften Klammern sind keine Smarty Tags sondern Tags, die ich in meinem CMS verwende. Ich könnte natürlich teilweise auch <h1> statt {h1} verwenden, aber ich möchte, dass meine CMS Tags alle einheitlich aufgebaut werden. Z.B. wird an der Stelle, wo "{pic_1_left}" steht durch mein CMS ein Bild eingebunden, das dem Artikel im CMS zugeordnet worden ist. Über entsprechende Funktionen wird also der Artikeltext vor der Übergabe an Smarty von mir geparst.
Nun möchte ich an einer bestimmten Stelle ein Formular einbinden, das nicht gecacht werden soll. Mein CMS ersetzt meinen CMS Tag "{form=plugin_login}" durch die Smarty Funktion '{insert name=form form="plugin_login"}'. Zudem habe ich eine Funktion "insert_form" geschrieben, die durch die Smarty Funktion '{insert}' aufgerufen werden soll.
Zu dem Aufruf dieser Funktion kommt es jedoch nicht. Mein geparster Artikeltext steht also weiterhin in der Variable $content und wird mit Hilfe von $smarty->assign("content", $content); an Smarty übergeben. Dadurch erscheint nun aber '{insert name=form form="plugin_login"}' im Klartext, d.h. beim $smarty->fetch("main.htm", $cacheid); wird die {insert} nicht abgearbeitet.
Das Problem liegt meiner Meinung nach daran, dass meine Smarty Funktion '{insert name=form form="plugin_login"}' nicht in der Templatedatei "main-htm", sondern in der Variable $content steht und somit von Smarty nicht verarbeitet werden kann.
Von anderen Templatesystemen kenne ich es, dass beim Parsen des Templates (also fetch() bei Smarty) zuerst die angegebene Template Datei (also bei mir main.htm) in einen String geladen und dann erst geparst wird. Es sollte bei Smarty also eine Methode geben, die den Inhalt dieses Strings parst. Mit der Funktion könnte ich mein Problem evtl. lösen, nur leider finde ich nichts passendes dazu.
Ok, ich weiss nicht, ob das Ganze nun klarer oder noch verwirrender geworden ist. Ich kann mir auch gut vorstellen, dass mein Ansatz ein völlig falscher ist und ich das Problem anders lösen muss / kann / sollte.
Ich bin weiterhin für jeden Tipp dankbar.
Viele Grüsse,
Ralfi |
|
Back to top |
|
messju Administrator
Joined: 16 Apr 2003 Posts: 3336 Location: Oldenburg, Germany
|
|
Back to top |
|
Ralfi Smarty n00b
Joined: 05 Jul 2004 Posts: 4
|
Posted: Tue Jul 06, 2004 8:39 am Post subject: |
|
|
Hallo messju,
genial!
Ich habe mein
<div id="content">
{$content}
</div>
einfach durch
<div id="content">
{eval var=$content}
</div>
ausgetauscht und schon klappt es wie gewünscht. Genau danach habe ich gesucht. Ich habe bisher in der Doku nur bei den Funktionen für Programmierer geschaut. Dass es so eine Funktion für Template Designer gibt, darauf wäre ich nie gekommen!
Ich wusste doch, dass es gehen muss, was ich vorhabe. Nochmals vielen Dank! Je tiefer ich in Smarty einsteige, desto mehr Laune macht es.
Gruss,
Ralfi |
|
Back to top |
|
Ralfi Smarty n00b
Joined: 05 Jul 2004 Posts: 4
|
Posted: Tue Jul 06, 2004 8:43 am Post subject: |
|
|
Kurzer Nachtrag:
und auch wenn in der Doku zu eval() steht, dass die Ausgabe bei eingeschaltetem Caching mit gecacht werden soll, scheint dies für insert() nicht zu gelten. Ein {$smarty.now|date_format:"%d.%m.%Y %H:%M:%S"} in dem inkludierten Template ist der Beweis.
Viele Grüsse,
Ralf |
|
Back to top |
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|
|