Friendica にはテンプレートシステムがあります。開発チームでは、php から html を分離するよう努めています (これは携帯用のテーマを使いたい場合にも便利です)。このテンプレートシステムでは、変数の置換、最小限のロジックの使用、ほかのテンプレートへのテンプレートのインクルードが可能です。'view' フォルダには、すぐにインクルードして使えるフォームフィールド用テンプレートが用意されており、これらを使えばサイト全体を通じてフォームの表示を統一することができます。

クイックガイド

1 - テンプレートの構文

変数

変数は $ で始まります。

Welcome $name

配列をテンプレートに渡すことができます。配列の項目を参照するには、$varname.key という形式を使用します。

php での記述:
    $user = Array( 'name'=>'John', 'enabled'=>false)
テンプレートでの記述:
    Welcome $user.name

論理ブロック

論理ブロックの形式は次のとおりです: {{ name opts }}...{{ endname }}

条件: IF

構文:

{{ if <$var> }}...[{{ else }} ...] {{ endif }}
{{ if <$var>==<$var|str> }}...[{{ else }} ...]{{ endif }}
{{ if <$var>!=<$var|str> }}...[{{ else }} ...]{{ endif }}

使用例:

{{ if $user.enabled }} Ok. {{ endif }}

{{ if $user.enabled }}
     <span>$user.name</span>
{{ else }}
    <span>$user.name</span>
{{ endif }}

ループ: FOR

構文:

{{ for <$var> as $name }}...{{ endfor }}
{{ for <$var> as $key=>$name }}...{{ endfor }}

使用例:

 {{ for $items as $item}}
     < h1 >$item.title< /h1 >;
     $item.body
 {{ endfor }}

インクルード: INC

構文:

{{ inc  [with $var1=$var2] }}{{ endinc }}

使用例:

 ファイル: field_text.tpl
 < label for="id_$field.name">$field.label< /label >
 < input id="id_$field.name" name="$field.name" value="$field_value" />

 ファイル: form.tpl
 < form >
     {{ inc field_text.tpl with $field=$username }}{{ endinc }}
     {{ inc field_text.tpl with $field=$useremail }}{{ endinc }}
 < /form >

2 - PHP サイド

Friendica では、次の 2 つの関数でテンプレートが使われます。

get_markup_template($templatename);
replace_macro($tpl, $array);

最初の関数は view/theme/$currenttheme および view/$templatename を探し、その内容を返します。

2 番目の関数はテンプレートの内容の $array を置換します。

ファイル: test.tpl
Hello $name! {{ if $isback }} Welcome back! {{ endif }}

ファイル: test.php
<?php ...
$tpl = get_markup_template('test.tpl');
echo replace_macro($tpl, array(
    '$name' => 'Anna',
    '$isback' => false));

結果:

Hello Anna!

フォームフィールド用テンプレート

view/ フォルダには、多数のフォームフィールド用テンプレートがあります。

  • field_input.tpl: text input を表示します。
  • field_password.tpl: password input を表示します。
  • field_textarea.tpl: textarea 要素を表示します。
  • field_richtext.tpl: tinymce rich textarea を表示します。
  • field_radio.tpl: radio input を表示します。
  • field_checkbox.tpl: value=1 で checkbox input を表示します。
  • field_intcheckbox.tpl: 独自の値で checkbox input を表示します。
  • field_yesno.tpl: JavaScript で強化されたチェックボックスです。"ON/OFF" または独自のラベルの付いたスライダーボタンを表示します。
  • field_select.tpl: select input を表示します。オプションは key=>value 配列として渡されます。
  • field_select_raw.tpl: select input ですが、オプションはあらかじめ構築済みの HTML 文字列として渡されます。
  • field_openid.tpl: OpenID アイコン付きのスタイル設定された text input です。
  • field_custom.tpl: input タグのないフィールドテンプレートです。あらかじめ構築済みの HTML 文字列として渡されます。

どの field_* テンプレートも、$field という名前の変数を期待しています。フィールドテンプレートは、次のようにしてインクルードします。

{{ inc field_input.tpl with $field=$myvar }}{{ endinc }}

$field 変数は配列です。

$field = array('name', 'Label', value, '[optional help text]', [extra data] )
  • 'name' は、HTML 要素に割り当てられる名前です。
  • 'Label' は、要素のラベルとして表示する文字列です。
  • value は、フィールドの値です。
    • field_checkbox では、フィールドをチェックするかしないか (通常は 1 または 0) を設定するために、'true' か 'false' に評価される値が必要です。
    • field_select では、この値を使って現在選択されているオプションを設定します。
    • field_custom では、この値として、あらかじめ構築済みの HTML 文字列を期待しています。
  • 'optional text help' は、入力内容について説明するために input の下に表示されるテキストです。空の文字列でもかまいません。
  • extra data は、一部のテンプレートで必要になるデータです。
    • field_select: value=>label として < option > タグ内で使用する array(key=>value,..)
    • field_intcheckbox: input 要素の値
    • field_select_raw: < option > タグのあらかじめ構築済みの HTML 文字列
    • field_yesno: array ("label off","label on") 形式による OFF と ON の独自ラベル

アドオン内で addon フォルダからテンプレートをロードする方法:

ファイル: addon/myaddon/myaddon.php
$tpl = file_get_content(dirname(__file__)."/mytemplate.tpl";