{ assign var="total" value=123.45 }
{ $total | number_format:2 | floatval }
<br>
{ assign var="total" value=123.00 }
{ $total | number_format:2 | floatval }
結果
123.45
123
require_once('Smarty/Smarty.class.php');
$smarty = new Smarty();
$smarty->template_dir = './templates/';
$smarty->compile_dir = './templates_c/';
require_once('Twig/Autoloader.php');
Twig_Autoloader::register();
$loader = new Twig_Loader_Filesystem("./templates/");
$twig = new Twig_Environment($loader, array(
'cache' => 'cache_twig',
'debug' => false ,
));
$smarty->assign( array("mydata" => $hoge) );
$twig->addGlobal( "mydata", $hoge );
{assign var="aaa" value="999" }
{% set aaa = '999' %}
{% set aaa %}
<div id="pagination">
...
</div>
{% endset %}
@php($aaa = 999)
または
@php $aaa = 999; @endphp
または
@php
$aaa = 999;
@endphp
$template_file = 'myfile.html';
$smarty->display( $template_file );
$hash = array(
'id' => 999 ,
'name' => 'hoge' ,
);
$template_file = 'myfile.html'
echo $twig->render($template_file, $hash);
{% block content %}
{% endblock %}
@yield('content')
{% extends "layout" %}
{% block content %}
{% endblock %}
@extends('layout')
@extends('layout.blade.php') // ファイル名で記述してもok
@section('content')
@endsection
{section name=i start=0 loop=10}
{$smarty.section.i.index}回目
{/section}
{% for i in 0..10 %}
{{ i }}回目
{% endfor %}
@for ($i = 0; $i < 10; $i++)
{{ $i }}回目
@endfor
{ foreach from=$my_loop key="k" item="v" }
{$v.user_name}
{ /foreach }
{% for k,v in my_loop %}
<h1>{{ loop.index }}番目</h1>
{% if loop.first %}最初の要素です。
{% elseif loop.last %}最後の要素です。
{% else %}{{ v.user_name }}
{% endif %}
{% endfor %}
Twig の loop.index は 1 から始まります。
@foreach ($users as $user)
{{$loop->index}}
@if ($loop->first)
これは最初の要素です
@endif
@if ($loop->last)
これは最後の要素です
@endif
<p>これは {{ $user->id }} ユーザーです。</p>
@endforeach
Laravel Blade の $loop->index は 0 から始まります。
@empty が使用できるのでこちらの方がオススメの記法です
@forelse ($users as $user)
{{$loop->index}}
@if ($loop->first)
これは最初の要素です
@endif
@if ($loop->last)
これは最後の要素です
@endif
<p>これは {{ $user->id }} ユーザーです。</p>
@empty
ユーザーはいません
@endforelse
なお @empty は省略できません。
また、Laravel Blade の $loop->index は 0 から始まります。
{include file="inc/header.html"}
{% include 'inc/header.html' %}
resources/views/user/mypage_sub_menu.blade.php を読み込みます
@include('user.mypage_sub_menu')
{if $flag==1 and hoge == 'myname'}
hogehoge
{else}
fugafuga
{/if}
{% if flag == 1 and hoge == 'myname' %}
hogehoge
{% else %}
fugafuga
{% endif %}
@if ( flag == 1 and hoge == 'myname' )
hogehoge
@elseif ( flag == 2 )
hogehoge2
@else
fugafuga
@endif
{*
ここの間に記述したものはコメントアウトされ表示されません
*}
{#
ここの間に記述したものはコメントアウトされ表示されません
#}
{{--
ここの間に記述したものはコメントアウトされ表示されません
--}}
<a href="{$data|escape:'url'}">クリック</a>
<a href="{{data|escape('url') }}">クリック</a>
<a href="{{data|e('url') }}">クリック</a> {# 【e】 だけでも OK #}
Hello, {!! $name !!}.
{* 2015-07-30 13:04:58 みたいな表示 *}
{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}
{# 2015-07-30 13:04:58 みたいな表示 #}
{{ "now"|date("Y-m-d H:i:s") }}
{# TIMEZONE を指定することもできます #}
{{ "now"|date('d/m/Y H:i', timezone="Europe/Paris") }}
Twig の dateフィルタの 注意
データベースなどから持ってきた日付けを整形する場合はデータが存在するかどうかチェックしてから表示しないと、
データが存在しない場合に 現在の日付が表示されてしまいます
{{ "" | date("Y年m月d日") }} // 現在の日付が表示されます
例1 : if 文で判別する
{% if v.added_date != "" %}{{ v.added_date | date("Y/m/d H:i") }}{% endif %}
例2 : 三項演算子で表示する
{{ v.added_date is empty ? "" : v.added_date | date("Y/m/d") }}
{strip}
<table>
<tr>
<td>
test
</td>
</tr>
</table>
{/strip}
{% spaceless %}
<table>
<tr>
<td>
test
</td>
</tr>
</table>
{% endspaceless %}
<?php $aaa = 999; ?>
{$test_loop|@count}
{{ test_loop |length }}
{"abcdefghijklmnopqrstuvwxyz"|truncate:10}
Twigで truncate を使うには Twig-extensions をインストールします
https://github.com/twigphp/Twig-extensions
からダウンロードして Extensions ディレクトリを Twigディレクトリの下にアップロードし
PHPで $twig->addExtension( new Twig_Extensions_Extension_Text() ); とします。
{{"abcdefghijklmnopqrstuvwxyz"| truncate(20)}}
Twig_Extensions_Extension_Text : http://bit.ly/2jfkzXw
{assign var="new_array" value=","|explode:$str_hoge}
{% set new_array = "one,two,three"|split(',') %}
{{ "my name is hogehoge" | replace({hoge':'fuga'}) }}
{{ '1234'|reverse }}
{# outputs 4321 #}
{{ 123456 | slice(0, 2) }}
{ 'sugoude'|cat:'DJ'|cat:'Master Key'}
{{ 'sugoude' ~ 'DJ' ~ 'Master Key' }}
連結した文字にフィルタをかける場合は、文字列を定義してからフィルタをかけましょう
× NG
{{ $hoge~$fuga|my_filter }}
◯ OK
{%set hogefuga = $hoge~$fuga%}
{{ $hogefuga|my_filter }}
{ $value | string_format:"%02d" }
{{ "%02d" | format(value) }}
{$smarty.template}
{{ _self.getTemplateName().__toString }}
{# テンプレートファイル名 #}
{% if _target.relative %}{% set template_filename = _target.relative %}
{% else %}{% set template_filename = _self.getTemplateName().__toString %}
{% endif %}
{{ url('/') }}
または
{{Request::root()}}
Twig リファレンス : http://git.io/vneJa
modifierプラグインは
{$hoge|my_modifier}
と記述すると、プラグインを記述した関数
function smarty_modifier_my_modifier($a){ }
$a に $hoge の内容が渡ります。
{$hoge|my_modifier:'arg1':'arg2'}
と記述します。
すると
function smarty_modifier_my_modifier($a, $b, $c){ }
$a に $hoge が
$b に 'arg1' が
$c に 'arg2' が
渡ります
ある文章を指定文字数折り返(強制改行)したい時があります。
そんな時に便利なのがSmartyのwordwrapプラグインがありますが、日本語や全角文字には対応していないので使用出来ません。
そこで日本語対応のSmartyプラグイン
(引用元:http://goo.gl/JmZjK にインデント機能を拡張しました。)
<?php function smarty_modifier_unicode_wordwrap($str, $len=80, $break="\n", $indent='' ){ $str = str_replace( "\r", $break, str_replace( "\r", "\n", str_replace("\r\n", "\n", $str) ) ); $str = preg_replace('/(.{'.$len.'})/u', '${1}'.$break, $str); if (strcmp($indent,'')==0){ return $str; } else{ $ar = preg_split("/{$break}/",$str); for($i=0 ; $i<count($ar); $i++){ $ar[$i] = $indent.$ar[$i]; } return join($break, $ar); } } ?>
下記の例だと($my_text を日本語40文字で折り返して各業の文頭に■を追加)となります。
{$my_text|unicode_wordwrap:40:"\n":"■"} 第1引数 : 文字数(デフォルト値:80) 第2引数 : 改行コード(デフォルト値:¥n) 第3引数 : インデント(デフォルト値:ナシ)
です。
例えば管理画面で画像をキャッシュさせたくない場合など
Smartyテンプレート内で乱数(ランダムな文字列)を発生させて
<img src="test.jpg?123">
などとするといいでしょう。
そこで乱数を発生させるには
{0|rand:999}
つまり
<img src="test.jpg?{0|rand:999}">
となります。
正規表現にマッチするかどうか判別する Smarty Plugin。
<?php function smarty_modifier_ext_preg($string='', $preg_pattern=''){ if (strcmp($string,'')==0 || strcmp($preg_pattern,'')==0){ return false; } if (preg_match($preg_pattern, $string)){ return true; } else{ return false; } }
{ if $file|ext_preg:'/(mp4$)/i' }動画です { elseif $file|ext_preg:'/(gif$|jpg$|jpeg$|png$|bmp$)/i' }画像です { /if }
画像ファイルの width, height を取得して挿入するSmarty Plugin
<?php function smarty_modifier_image_wh($file_name='') { if (! $file_name ) { return "error:{$file_name}"; } if (!is_file($file_name)) { return "error:{$file_name}"; } list($width, $height, $type, $attr) = getimagesize($file_name); if ($width && $height){ return 'width="' .$width. '" height="'.$height.'"'; } else{ return "error: can not get width height:{$file_name}"; } }
<img src="{$image_file}" {$image_file|image_wh} />{/if}
とすると width="100" height="200" といった情報が入ります。
{$image_file|image_wh} ↓ {"`$data_dir`/`$image_file`"|image_wh}
とします。
Smartyキャッシュを削除するには clear_cache(); を使用します。
void clear_cache(string template, string cache_id, string compile_id, int expire_time);
Smartyを使用したサイトではSmartyキャッシュを使用することにより劇的に高速化されますが、(テストページや一時的に表示したページの)キャッシュファイルをクリアし忘れると、逆にハードディスクに負荷をかけて動作を遅くするおそれがあります。
古い不要キャッシュの削除は必ず行いましょう。
// 7日以上古いキャッシュを削除する $days = 7; $time = $days * 24 * 60 * 60; // 10回に1回実行 if( rand(1,10)==1 ){ $smarty->clear_all_cache($time); }
ファイルを使用せずキャッシュにMySQLを使用する
http://www.smarty.net/docsv2/ja/section.template.cache.handler.func.tpl
ファイル名 modifier.is_ua_with_osmb.php で下記コードを保存し Smartyの plugin フォルダに入れます。
<?php // Version 1.2 function smarty_modifier_is_ua_with_osmb($arg,$debug=false){ $useos; $browser; $os_browser; if ( preg_match('/Mac/',$_SERVER['HTTP_USER_AGENT']) ){ $useos='mac'; } elseif ( preg_match('/Win/',$_SERVER['HTTP_USER_AGENT']) ){ $useos='win'; } else { $useos = 'other'; } if ( preg_match('/Opera/',$_SERVER['HTTP_USER_AGENT']) && preg_match('/Version\/([0-9]+)/',$_SERVER['HTTP_USER_AGENT'], $r) ){ $browser = 'opera'.$r[1]; } elseif ( preg_match('/MSIE ([0-9])+/',$_SERVER['HTTP_USER_AGENT'], $r) ){ $browser = 'ie'.$r[1]; } elseif ( preg_match('/Safari/',$_SERVER['HTTP_USER_AGENT']) && preg_match('/Version\/([0-9]+)/',$_SERVER['HTTP_USER_AGENT'], $r) ){ $browser = 'safari'.$r[1]; } elseif ( preg_match('/Chrome\/([0-9]+)/',$_SERVER['HTTP_USER_AGENT'],$r) ){ $browser = 'chrome'.$r[1]; } elseif ( preg_match('/Firefox\/([0-9]+)/',$_SERVER['HTTP_USER_AGENT'], $r) ){ $browser = 'firefox'.$r[1]; } elseif ( preg_match('/Gecko/',$_SERVER['HTTP_USER_AGENT']) ){ $browser = 'gecko'; } else{ $browser = $_SERVER['HTTP_USER_AGENT']; } $os_browser = $useos.'_'.$browser; if ($debug){ return "{$os_browser} : {$_SERVER['HTTP_USER_AGENT']}"; } else{ if ( strcmp($arg, $os_browser)==0 ){ return true; } else{ return false; } } } ?>
■ 使い方
// デバッグモード { ""|is_ua_with_osmb:debug } // 例 { if "mac_safari4"|is_ua_with_osmb }このブラウザは mac版safari4です { elseif "win_ie8"|is_ua_with_osmb }このブラウザは win版IE8です { elseif "win_firefox3"|is_ua_with_osmb }このブラウザは win版firefox3です { else }それ以外のブラウザです { /if }
まず先頭に OSの種類を記述し、アンダースコアでブラウザとメジャーバージョンを記述します。
(記述は全て小文字)
通常( $data を myplugin に渡す )
{$data|myplugin}
引数を2つ($data1, $data2)渡す
{$data1|myplugin:$data2}
引数を3つ($data1, $data2, $data3)渡す
{$data1|myplugin:$data2:$data3}
配列や連想配列($ar_data)を引数として渡す
{$ar_data|@myplugin}
Smartyで配列の最初、最後を検知するには ループ名(任意)をつけて
.first
.last
で知ることが出来ます。
{ foreach from=$test_loop key="k" item="v" name="loopname"} { if $smarty.foreach.loopname.first }(最初の要素){$v.name}です。{ /if } { $v.name }です。 { if $smarty.foreach.loopname.last }(最後の要素){$v.name}です。{ /if } { /foreach }
ちなみに配列の長さは @count で求めることが出来ます
{$test_loop|@count}
Smartyはテンプレート内でPHP標準関数が使用できます。
なので
配列 $loop の要素数を知るには
{$loop|@count}
でOKです
{ if count($loop) > 0 }要素数は1以上です{/if}
{ math equation=a+b a=$loop|@count b=2 assign=kekka } {$kekka}
まずテンプレート内での変数の定義
{assign var="hogehoge" value="test_txt" } {assign var="aaa" value="999" } {assign var="bbb" value="10000" }
{ math equation=a+b a=$aaa b=$bbb assign=kekka }
{$kekka}には10999という値が入ります
◆ 文字列を連結して代入する場合
$year = '2001';
$month = '01';
$date = '15';
{ assign var="now_date" value="`$v.year`/`$v.month`/`$v.date`" } 変数をバッククォートで囲むと文字列と混ぜることが出来ます。
Smartyテンプレート内でセッション変数、cookie、環境変数の値を参照したいときは下記のようにします。
phpのセッション変数"id"の値を表示
{$smarty.session.id}
クッキーに登録された"username"の値を表示
{$smarty.cookies.username}
環境変数"PATH"の値を表示
{$smarty.env.PATH}
環境変数 "SERVER_NAME" の値を表示
{$smarty.server.SERVER_NAME}
環境変数 "HTTP_USER_AGENT" の値を表示
{$smarty.server.HTTP_USER_AGENT}
■ ただし Smartyで全ての環境変数が取得できるわけではありません。
なので
{ foreach from=$smarty.server key="k" item="v" } {$k}:{$v} { /foreach }
としてどういう環境変数が取得できるのかを調べるのがいいでしょう。
Smartyでfor文のような繰り返し処理をするには以下のように記述する。
{section name=i start=0 loop=10} 繰り返し回数は{$smarty.section.i.index}です。 $i に変数を代入する場合は下記のように行う {assign var="i" value=$smarty.section.i.index } 繰り返し回数は{$i}です。 {/section}
Smartyでは {} は変数を囲うマークアップとなります。
たとえば
.style2 { font-size: small }
はエラーとなってしまう。
これを防ぐには
.style2 {ldelim} font-size: small {rdelim}
と表記するか、
{literal} .style2 { font-size: small } {/literal}
と記述します。
{if $shop_id|in_array:$list}すでに入っています
{else}配列の中には存在しません
{/if}
Smartyで繰り返しの回数を取得(カウント)するには予約変数 {$smarty.foreach.ループ名}を使用する。
{ foreach from=$loop key="key" item="value" } 名前は{$value.name}です {/foreach}
というループ箇所がある場合は、【name="任意のループの名前"】をつけて
【$smarty.foreach.任意のループの名前.iteration】で参照する。
(なお、iteration の値は1からはじまる。)
{ foreach from=$loop key="key" item="value" name="loopname"} 名前は{$value.name}です ループ回数は{$smarty.foreach.loopname.iteration}です {/foreach}
でOK。
また5回ループするごとに何か処理を行いたい場合は {if} を使う
{ foreach from=$loop key="key" item="value" name="loopname"} 名前は{$value.name}です {if $smarty.foreach.loopname.iteration%5==0}5回繰り返しました{/if} {/foreach}
{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"} ↓ 2007-07-04 18:00:00
<pubDate>{$date|date_format:"%a, %d %b %Y %H:%M:%S"} +0900</pubDate>
<pubDate>{$smarty.now|date_format:"%a, %d %b %Y %H:%M:%S"} +0900</pubDate> ↓ <pubDate>Fri, 27 May 2011 14:13:13</pubDate>
Smartyで配列かどうかを判別するには is_array を使用します
{ if is_array($data) } { foreach from=$data key="k" item="v" name="loopname" } {$v|escape} { /foreach } { else } {$data|escape} { /if }
Smarty動作条件は
Smarty 3.x: PHP 5.2+
Smarty 2.x: PHP 4 or 5
となっています。 条件に当てはまるバージョンのSmartyをダウンロードします。
templates (パーミッションは変更しなくてよい)
templates_c (パーミッション 777 に変更する)
テンプレートファイルを置くフォルダは「templates」です。 templates_cフォルダは Smarty が使用するフォルダですので一切触る必要はありません。
このようなディレクトリ構成になります
|-- [libs]
|-- [templates]
|-- [templates_c]
|-- 実行するプログラム.php
require_once('Smarty/Smarty.class.php');
$template = new Smarty;
$template->display('test.html');
以上。簡単ですね。