[Smarty Basics] Ausgabe abfangen (Capture)

Diskussionen zur Smarty-Template-Engine
Post Reply
nhaack

[Smarty Basics] Ausgabe abfangen (Capture)

Post by nhaack »

Hallo zusammen,

anbei eine kurze Smarty Notiz. Ein Smarty Feature, dass ich oft und gerne nutze. Im Grunde wird alles zwischen den {capture} Tags aufgezeichnet. Über eine Variable kann ich den Inhalt (die Aufnahme) dann an beliebiger Stelle ausgeben (oder an Plug-ins oder Module weiterreichen). Der Inhalt zwischen den Tags wird über die Variable ausgegeben und erscheint nicht direkt.

Code: Select all


{capture assign=VAR_NAME}{some_plug_in}{/capture}

Oder aber auch sowas:

{capture assign=VAR_NAME}
   HTML, Text, JS, ...
{/capture}

EDIT: Achtung, es werden auch Leerzeichen oder Tab-Stops etc im Capture aufgezeichnet. Wenn das Capture also bei leerem Inhalt auch selbst wirklich leer sein soll, die Anweisung am besten in einer Zeile schreiben.

Das ist ganz praktisch, wenn man z.B. ein DIV um ein Element setzen möchte, und ansonsten nichts erscheinen soll.

Code: Select all

Problem:

<div>
   {some_plug_in}
</div>

Erzeugt Folgendes, wenn keine Rückgabe bzw. leer:

<div>
</div>

Wurde das ganze mit dem Capture vorher aufgezeichnet, können wir nun die Aufzeichnung auf Inhalt prüfen. Ist das Capture leer, brauchen wir keinen Block (bzw. garnichts).

Code: Select all


{capture assign=banner}{some_plug_in}{/capture}

{if $banner != ''}
<div id="banner">{$banner}</div>
{/if}

Eine Plug-in-Ausgabe aufzuzeichnen ist nur ein Beispiel. In das Capture passt alles mögliche rein (HTML, JS, XML ...) . Nur bei Zahlen wird es eng, denn die Aufzeichnung liegt nur als String vor.

Wer lieber über das Name-Attribute an den Content ran möchte, ändert die Nutzung wie folgt:

Code: Select all


{capture name=banner}
   Irgendwas...
{/capture}

{$smarty.capture.banner}

Beste Grüße
Nils
Last edited by nhaack on Thu Feb 18, 2010 10:19 pm, edited 1 time in total.
antibart
Power Poster
Power Poster
Posts: 1155
Joined: Sun Aug 17, 2008 9:29 am

Re: [Smarty Basics] Ausgabe abfangen (Capture)

Post by antibart »

Sorry, dass ich es in diesen alten Thread post. Aber falls es eine einfache Lösung gibt, wäre sie hier als Ergänzung evtl am besten aufgehoben.

Ich habe das so mehrfach mit verschiedenen Plug-Ins versucht .... sowohl mit dem name-, als auch mit assign-Attribut.

... erstaunlicherweise ohne jegliche Wirkung. Bzw passiert genau das, was durch das Capture vermieden werden soll : das leere Div wird nicht abgefangen.

In folgendem Codeschnipsel versuche ich aktuell gerade, eine zweiten Content-Block abzufangen.

Heisst: wenn der Content-Block nicht leer ist, soll das DIV angezeigt werden.

Code: Select all

<div id="content_re">
{capture assign=blau}
 {content block="rechts"}
{/capture}
{if $blau != ''}
<div id="blauer-kasten">
{$blau}</div>
{/if}
<div id="aktuell">
<h2>Aktuell</h2>
{news category='general' number='2'}</div>

</div>



Praktisch genau wie im Beispiel. Seltsamerweise wird das DIV immer angezeigt. Wenn ich testweise eine zusätzliche {else}-Alternative einbinde (um DIV "aktuell"),verschwindet das aktuell-Div ....

Wenn ich die Capture-Abfrage testweise an anderer Stelle (im Header) im Template einfüge, ist das Div immer ausgeblendet. Platziere ich sie außerhalb des Headers an den Anafang des Templates, ist das DIV wieder kontinuierlich da.

Auch wenn ich es mit anderen Plug-Ins probiere,klappt es nicht, Wo ist mein Denkfehler? Fehlt mir ein Module? Installiert ist auf jeden CGSimple Smarty. Das Ganze klingt doch so einfach und sieht so logisch aus...
Last edited by antibart on Sat Jan 16, 2010 10:09 am, edited 1 time in total.
nhaack

Re: [Smarty Basics] Ausgabe abfangen (Capture)

Post by nhaack »

Hi Antibart,

bei Content-Blöcken kannst du nochmal folgendes probieren

Code: Select all


{content block=""rechts" assign="blau"}

  {if $blau!= ''}
    <div id="blauer-kasten">
       {$blau} 
    </div>
 {/if}

Das müsste dann eigentlich klappen.

Anstelle von:  

Code: Select all


{capture assign=blau}
 {content block="rechts"}
{/capture}

kannst du auch nochmal folgendes Probieren

Code: Select all


{capture assign=blau}{content block="rechts"}{/capture}

Bei dem Captcha hättest du mit dem führenden Leerzeichen ja auch ein Whitespace im Capture und damit wäre das Capture nicht mehr leer (im eigentlichen Sinne). Das war im meinem Beispiel wohl nicht ganz klar, habe es entsprechend oben angepasst.

Beste Grüße
Nils
Last edited by nhaack on Sat Jan 16, 2010 3:36 pm, edited 1 time in total.
NaN

Re: [Smarty Basics] Ausgabe abfangen (Capture)

Post by NaN »

nhaack wrote:
EDIT: Achtung, es werden auch Leerzeichen oder Tab-Stops etc im Capture aufgezeichnet. Wenn das Capture also bei leerem Inhalt auch selbst wirklich leer sein soll, die Anweisung am besten in einer Zeile schreiben.
Oder mal mit dem Tag {strip} versuchen (entfernt alle Zeilenübrüche, Tabs und Leerzeichen, die nicht durch HTML Tags wie z.B.
oder   gekennzeichnet sind):

Code: Select all


{capture assign=blau}{strip}

   {content block="rechts"}

{/strip}{/capture}

Ist ähnlich wie

Code: Select all


{capture assign=blau}{content block="rechts"}{/capture}

Nur mit dem Unterschied, dass bei {strip} auch keine Ausgabe erscheinen würde, wenn der Content an sich nur ein Leerzeichen enthalten würde. Außerdem verändert man damit den Inhalt den man ausgeben möchte, weil auch im Fließtext sämtliche Leerzeichen, die nicht durch HTML Tags wie   gekennzeichnet sind, entfernt werden. (Was wohl kaum das gewünschte Ergebnis ist)

Daher wäre der Smarty-Modifikator strip besser geeignet (um den original Inhalt nicht zu ändern):

Code: Select all


{capture assign=blau}

   {content block="rechts"}

{/capture}

{if ($blau|strip) != ''}

   {$blau}

{/if}

Somit behält man den origial Content bei, kann aber dennoch prüfen, ob der Inhalt evtl. nur aus Leerzeichen besteht.
Aber wie schon erwähnt, würde ich, sofern es nur um den Inhalt geht, mit dem assign-Parameter des {content}-Tags arbeiten.
{capture}...{/capture} würde ich nur dann verwenden, wenn sich die Ausgabe nicht irgendwie anders einer Variablen zuordnen lässt.
antibart
Power Poster
Power Poster
Posts: 1155
Joined: Sun Aug 17, 2008 9:29 am

Re: [Smarty Basics] Ausgabe abfangen (Capture)

Post by antibart »

nhaack wrote:

Bei dem Captcha hättest du mit dem führenden Leerzeichen ja auch ein Whitespace im Capture und damit wäre das Capture nicht mehr leer (im eigentlichen Sinne). Das war im meinem Beispiel wohl nicht ganz klar, habe es entsprechend oben angepasst.


Völlig klar - da war mein Denkfehler ... ich hätte sozusagen ein Leezeichen in den Editor einfügen müssen.

Auf jeden Fall hat oben erwähnte Lösung sofort zr Lösung geführt.

Ich danke Euch ....

EDIT evtl wäre es für die Übersichtlchkeit besser, den Hinweis in den Startthread einzufügen und die restlchen Posts einfach zu löschen.
Last edited by antibart on Mon Jan 18, 2010 9:59 am, edited 1 time in total.
Post Reply

Return to “Smarty-Tipps und -Tricks”