テンプレート関数リファレンス

{include}

【構文】

{include file='[ファイル名]'}

シングルクォーテーションはダブルクォーテーションでも可。

【属性】

file:必須。インクルードするテンプレートファイル名(テンプレートディレクトリからのパス)。

【説明】

include関数は、あるテンプレートファイルから別のテンプレートファイルをインクルードします。
これを使用することにより、複数のWebページで共通して使用する部分(ヘッダやフッタなど)を1つのテンプレートファイルで表現することができます。

STACのinclude関数はSmartyのinclude関数と違い、コンパイル時に展開されるため、いくつ使用してもコンパイル時の次回以降の実行速度に影響しません。
ただし、インクルードされる側のテンプレートを変更した場合、それをインクルードするテンプレートファイルはいずれも次回アクセス時に再コンパイルすることになります。

※STACの現バージョンでは、インクルードのネストには対応していません。

【例】

example.tpl

{include file='common_header.tpl'}  {* ヘッダのインクルード *}
<h1>STAC Include Example</h1>
<div id="main">
{$hello}
</div>
{include file='common_footer.tpl'}  {* フッタのインクルード *}

common_header.tpl

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>STAC</title>
</head>
<body>
<div id="header">
<p>STAC</p>
</div>

common_footer.tpl

<div id="footer">
<p>&copy; STAC</p>
</div>
</body>
</html>

example.php

<?php
require_once('/path/to/STAC/STAC.class.php');
$stac = new STAC();
$stac->template_dir('/path/to/templates');
$stac->compile_dir('/path/to/templates_c');
$stac->assign('hello','Hello STAC.');
$stac->display('example.tpl');

出力結果

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>STAC</title>
</head>
<body>
<div id="header">
<p>STAC</p>
</div>

<h1>STAC Include Example</h1>
<div id="main">
Hello STAC.</div>
<div id="footer">
<p>&copy; STAC</p>
</div>
</body>
</html>

ページトップへ

{assign}

【構文】

{assign var='[テンプレート変数名]' value='[テンプレート変数の値]'}

シングルクォーテーションはダブルクォーテーションでも可。

【属性】

var:必須。テンプレート変数名(「$」を含まない)。
value:必須。テンプレート変数の値。

【説明】

assign関数は指定したテンプレート変数に値を割り当てます。
通常、テンプレート変数への値の割り当ては呼び出しプログラム内でSTAC::assign()を使用して割り当てますが、このテンプレート関数を使用すると、テンプレート側で値の割り当てが可能です。
assign関数の記述箇所に関わらず、全ての指定されたテンプレート変数に割り当てが行われます。

この関数を使用することで、ページ固有の値を共通ヘッダやフッタに表示させるといったようなことができるようになります。

【例】

example.tpl

{include file='common_header.tpl'}
{assign var='title' value='STAC assign Example'}  {* テンプレート変数$titleに文字列をアサイン *}
<h1>{$title}</h1>
<div id="main">
{$hello}
</div>
{include file='common_footer.tpl'}

common_header.tpl

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="title" content="{$title}" />
<title>{$title}</title>
</head>
<body>
<div id="header">
<p>STAC</p>
</div>

common_footer.tpl

<div id="footer">
<p>&copy; STAC</p>
</div>
</body>
</html>

example.php

<?php
require_once('/path/to/STAC/STAC.class.php');
$stac = new STAC();
$stac->template_dir('/path/to/templates');
$stac->compile_dir('/path/to/templates_c');
$stac->assign('hello','Hello STAC.');
$stac->display('example.tpl');

出力結果

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="title" content="STAC assign Example" />
<title>STAC assign Example</title>
</head>
<body>
<div id="header">
<p>STAC</p>
</div>


<h1>STAC assign Example</h1>
<div id="main">
Hello STAC.</div>
<div id="footer">
<p>&copy; STAC</p>
</div>
</body>
</html>

ページトップへ

{capture}{/capture}

【構文】

{capture name='[テンプレート変数名]'}
 [テンプレート変数の値]
{/capture}

シングルクォーテーションはダブルクォーテーションでも可。

【属性】

name:必須。テンプレート変数名

【説明】

capture関数はassign関数と同様、指定したテンプレート変数に値を割り当てます。
assign関数が単一タグの記述で1行文字列を設定できることに対して、capture関数は複数行に渡るブロックをテンプレート変数に割り当てることができます。

【例】

example.tpl

{include file='common_header.tpl'}
{capture name='script'}  {* テンプレート変数$scriptに以下の文字列をアサイン *}
<script type="text/javascript">
<!--
    // script here.
// -->
</script>
{/capture}
<div id="main">
{$hello}
</div>
</body>
</html>

common_header.tpl

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>STAC capture Example</title>
{$script}
</head>
<body>
<div id="header">
<p>STAC</p>
</div>

example.php

<?php
require_once('/path/to/STAC/STAC.class.php');
$stac = new STAC();
$stac->template_dir('/path/to/templates');
$stac->compile_dir('/path/to/templates_c');
$stac->assign('hello','Hello STAC.');
$stac->display('example.tpl');

出力結果

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>STAC capture Example</title>

<script type="text/javascript">
<!--
    // script here.
// -->
</script>
</head>
<body>
<div id="header">
<p>STAC</p>
</div>

<div id="main">
Hello STAC.</div>
</body>
</html>

ページトップへ

{if}/{elseif}/{endif}

【構文】

{if [条件式1]}
 [ブロック1]
{elseif [条件式2]}
 [ブロック2]
{/if}

【属性】

属性はありません。
代わりに条件式が必要となります。

【説明】

※Ver.0.1.1から{elseif}に条件式が指定できるようになりました。

if関数はテンプレート変数などの値によって表示内容を分けるための条件分岐を実現します。
{if}の条件式の内容が真のとき、[ブロック1]が表示され、偽のときに{elseif}が評価されます。
{elseif}に条件式が指定され条件式の内容が真のとき、または{elseif}に条件式が指定されていない場合、[ブロック2]が表示されます。

{if}に対する{/if}は必須です。
{elseif}はオプションです。なくても構いません。
また、{elseif}内の条件式もオプションです。

条件式として指定された式は、テンプレート変数を除いて、そのままPHPのif文に変換されます。
例えば、

{if $title == 'home'}

という条件式が指定されれば、そのままPHPで

if( $title == 'home' )

という意味のPHPコードにコンパイルされます。
STACは条件式がどのような式なのかは判別しません。
条件式の内容はほぼそのままPHPコードとして評価されるため、記述には十分注意して下さい。

条件式内で使用可能なSTAC管理変数は、テンプレート変数、section関数のloop属性の項目変数、foreach関数のkey属性の変数およびvalue属性の変数です。
{section}及び{foreach}内の{if}を使用したサンプルコードは、{section}/{foreach}それぞれのリファレンスにあります。

【例】

example.tpl

{if $login_name == 'administrator'}
  <p>おかえりなさい管理者さん</p>
{elseif}
  <p>ようこそ{$login_name}さん</p>
{/if}

example.php

<?php
require_once('/path/to/STAC/STAC.class.php');
$stac = new STAC();
$stac->template_dir('/path/to/templates');
$stac->compile_dir('/path/to/templates_c');
$stac->assign('login_name' ,'administrator.');
$stac->display('example.tpl');

出力結果

  <p>おかえりなさい管理者さん</p>
ページトップへ

{foreach}{/foreach}

【構文】

{foreach from=$[配列変数名] key=[配列キー] value=[配列の値]}
   [配列の個数分表示される実行ブロック]
{/foreach}

【属性】

from:必須。STAC::assign()で指定する配列変数に関連付けた変数名を、先頭に「$」を付けて指定します。
key:オプション。配列のキーを実行ブロック内でテンプレート変数として使用するときの変数名を指定します。
value:必須。配列の値を実行ブロック内でテンプレート変数として使用するときの変数名を指定します。

【説明】

{foreach}関数は1次元配列の全ての要素に対して実行ブロックの中身を表示するループ処理を実現します。
ループ内のブロックでは、配列キー及び配列の値をそれぞれテンプレート変数として使用できます。

【例】

example.tpl

<h2>プロフィール</h2>
<dl>
{foreach from=$profile key=attr_type value=attr_value}
<dt>{$attr_type}</dt><dd>{if $attr_type == 'url'}<a href="{$attr_value}">{/if}{$attr_value}{if $attr_type == 'url'}</a>{/if}</dd>
{/foreach}
</dl>

example.php

<?php
require_once('/path/to/STAC/STAC.class.php');
$stac = new STAC();
$stac->template_dir('/path/to/templates');
$stac->compile_dir('/path/to/templates_c');

$profiles = array(
                'name' => 'STAC'
                , 'age' => '生まれたて'
                , 'job' => 'テンプレートエンジン'
                , 'url' => 'http://stac.okayuclub.net/'
            );

$stac->assign('profile',$profiles);
$stac->display('example.tpl');

出力結果

<h2>プロフィール</h2>
<dl>
<dt>name</dt><dd>STAC</dd>
<dt>age</dt><dd>生まれたて</dd>
<dt>job</dt><dd>テンプレートエンジン</dd>
<dt>url</dt><dd><a href="http://stac.okayuclub.net/">http://stac.okayuclub.net/</a></dd>

</dl>
ページトップへ

{section}{/section}

【構文】

{section loop=$[配列変数名] start=[開始インデックス] max=[終了インデックス]}
 [配列の個数分表示される実行ブロック]
{/section}

【属性】

loop:必須。STAC::assign()で指定する配列変数に関連付けた変数名を、先頭に「$」を付けて指定します。
start:オプション。配列内の開始インデックス値を数値で指定します。省略すると配列の先頭からループが実行されます。
max:オプション。配列内の終了インデックス値を数値で指定します。省略すると配列の終端までループが実行されます。

【説明】

section関数は二次元配列のstartからmaxまでの要素に対して実行ブロックの中身を表示するループ処理を実現します。
ループ内のブロックでは、配列の各要素のテンプレート変数は{$[loop属性].[配列キー]}と記述します。

【例】

example.tpl

<table>
<tr>
<td>商品コード</td>
<td>商品名</td>
<td>数量</td>
</tr>
{section loop=$order}
<tr>
<td>{$order.product_id}</td>
<td>{$order.product_name}</td>
{if $order.product_id == ''}
<td><b>{$order.count}</b></td>
{elseif}
<td>{$order.count}</td>
{/if}
</tr>
{/section}
</table>

example.php

<?php
require_once('/path/to/STAC/STAC.class.php');
$stac = new STAC();
$stac->template_dir('/path/to/templates');
$stac->compile_dir('/path/to/templates_c');

$orders = array(
                array(
                    'product_id'=>'0001'
                    , 'product_name'=>'商品01'
                    , 'count'=>10
                )
                , array(
                    'product_id'=>'0002'
                    , 'product_name'=>'商品02'
                    , 'count'=>20
                )
                , array(
                    'product_id'=>'0003'
                    , 'product_name'=>'商品03'
                    , 'count'=>30
                )
                , array(
                    'product_id'=>''
                    , 'product_name'=>'合計'
                    , 'count'=>60
                )
            );
$stac->assign('order',$orders);
$stac->display('example.tpl');

出力結果

<table>
<tr>
<td>商品コード</td>
<td>商品名</td>
<td>数量</td>
</tr>
<tr>
<td>0001</td>
<td>商品01</td>
<td>10</td>
</tr>
<tr>
<td>0002</td>
<td>商品02</td>
<td>20</td>
</tr>
<tr>
<td>0003</td>
<td>商品03</td>
<td>30</td>
</tr>
<tr>
<td></td>
<td>合計</td>
<td><b>60</b></td>
</tr>

</table>
ページトップへ