[PHP] Smarty: Eigene "Funktionen"

27o8

abgemeldet
2 Mai 2006
9.028
933
Habe nun die Doku durchsucht, aber nichts wirkliches gefunden wasmir hilft. Und zwar habe ich bei mir Boxen im Content.

HTML:
<div class="cOben"></div>

<div class="cBox">
<h1>Boxtitel</h1>
   <p>
   Boxcontent
  </p>
</div>

<div class="cUnten"></div>
Auf Dauer ist es ziemlich nervig das immer neu einzutippen (bzw. copy/paste). Deshalb suche ich eine Möglichkeit wie ich eine eigene "Funktion" in Smarty anlegen kann und dann in Zukunft die Boxen so (oder so ähnlich) erstelle:

Code:
{box title="Mein Titel"}
   Inhalt
{/box}
Gibt es sowas?
 
Wenn du hier nach "Template Functions" suchst müsste genau das erklärt werden, was du suchst... oder ich habe dich missverstanden.

Liebe Grüße!


edit: Es ist nicht genau was du suchst. Aber du könntest Titel und Inhalt in zwei unterschiedlichen Variablen übergeben. Dann hättest du sowas wie
Code:
{include file="box.tpl" title="Box1" content="Lorem Ipsum bla"}
 
So wie du dir das vorstellst, nicht möglich! ... bis jetzt ;)

Mit Smarty3 kannst du sowas machen:
Code:
There is a new {function}...{/function} block tag.  This enables reuse of code
sequences like a plugin function. It can call itself recursively.

Example:

Template file:
{function name=menu level=0}
  <ul class="level{$level}">
  {foreach $data as $entry}
    {if is_array($entry)}
      <li>{$entry@key}</li>
       {menu data=$entry level=$level+1}
    {else}
      <li>{$entry}</li>
    {/if}
  {/foreach}
  </ul>
{/function}

{$menu = ['item1','item2','item3' => ['item3-1','item3-2','item3-3' =>
  ['item3-3-1','item3-3-2']],'item4']}

{menu data=$menu}


Generated output:
    * item1
    * item2
    * item3
          o item3-1
          o item3-2
          o item3-3
                + item3-3-1
                + item3-3-2
    * item4

The function tag itself must have the "name" attribute. This name is the tag
name when calling the function. The function tag may have any number of
additional attributes. These will be default settings for local variables.
Quelle: Smarty 3.0 Beta README

Wenn du nur einfache Boxen hast, d.h. keine Rekursion, bist du mit Kampfwurst's Edit bestens bedient :)
 
Mit dieser Variante müsste aber Markup in den Quellcode, nämlich in den Plugin-Code. Das kann man also in diesem Fall nicht anwenden.
 
Mit dieser Variante müsste aber Markup in den Quellcode, nämlich in den Plugin-Code. Das kann man also in diesem Fall nicht anwenden.

Japp, oder man weist den redundanten Code per capture zu und gibt diesen über einen Block an eine Funktion weiter und ersetzt dort die Platzhalter.

PHP:
{capture assign=htmlBox}
<div class="cOben"></div>

<div class="cBox">
<h1>#TITLE#</h1>
   <p>
   #CONTENT#
  </p>
</div>

<div class="cUnten"></div>
{/capture}

{insertFromCapture title="Boxtitel" tpl=$htmlBox}
Hello, world!
{/insertFromCapture}

Ansonsten eben mit Schleife in capture zuweisen, was aber zum Overhead führen kann.
 
Hi,

ich habe das folgendermaßen gelöst:

plugindatei erstellen:

plugins/block.box.php

PHP:
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* File:     block.box.php
* Type:     block
* Name:     box
* Purpose:  ertellt ein Box
* Thanks a lot to: ostsan
* -------------------------------------------------------------
*/

function smarty_block_box ($params, $content, $smarty, $repeat)

{
		$title = $params['title'];
		$box = file_get_contents("templates/box.tpl");
		$box = str_replace(array("{\$title}","{\$content}"),array($title, $content), $box);

		return $box;
	
}
?>

mit box.tpl:
PHP:
<div class="box">
 <div class="box_head">
  <div class="box_title">{$title}</div>
 </div>
 <div class="box_middle"><div class="box_content">{$content}<br /></div></div>
 <div class="box_footer"> </div>
</div>

z.B.

Aufruf im Template:
Code:
{box title="Titel}
Inhalt
{/box}