PHPプログラムに関する各種メモ書き:タグ「Smarty」での検索

Smartyで小数点以下を2桁にまとめ、最後がゼロの場合は表示しないようにする

{ 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
No.1095
03/03 19:44

edit

Smarty

テンプレートエンジン『Twig』と『Smarty』比較表

● テンプレートの読み込みとディレクトリのセット(PHPファイルに記述)

※ Smarty

require_once('Smarty/Smarty.class.php');
$smarty = new Smarty();
$smarty->template_dir = './templates/';
$smarty->compile_dir = './templates_c/';

※ Twig

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 ,
));

● 変数のアサイン(PHPファイルに記述)

※ Smarty

$smarty->assign( array("mydata" => $hoge) );

※ Twig

$twig->addGlobal( "mydata", $hoge );

● テンプレートの表示(PHPファイルに記述)

※ Smarty

$template_file = 'myfile.html';
$smarty->display( $template_file );

※ Twig

$hash = array(
'id' => 999 ,
'name' => 'hoge' ,
);
$template_file = 'myfile.html'
echo $twig->render($template_file, $hash);

● ループ処理(for 文)(HTMLファイル内に記述)

※ Smarty

{section name=i start=0 loop=10}
  {$smarty.section.i.index}回目
{/section}

※ Twig

{% for i in 0..10 %}
  {{ i }}回目
{% endfor %}

● ループ処理(foreach 文)(HTMLファイル内に記述)

※ Smarty

{ foreach from=$my_loop key="k" item="v" }
{$v.user_name}
{ /foreach }

※ Twig

{% for k,v in my_loop %}
  <h1>{{ loop.index }}番目</h1>
  {% if loop.first %}最初の要素です。
  {% elseif loop.last %}最後の要素です。
  {% else %}{{ v.user_name }}
  {% endif %}   
{% endfor %}

loop.index1 から始まります。

● ファイルのインクルード(HTMLファイル内に記述)

※ Smarty

{include file="inc/header.html"}

※ Twig

{% include 'inc/header.html' %}

● if文(HTMLファイル内に記述)

※ Smarty

{if $flag==1 and hoge == 'myname'}
     hogehoge
{else}
    fugafuga
{/if}

※ Twig

{% if flag == 1 and hoge == 'myname' %}
     hogehoge
{% else %}
    fugafuga
{% endif %}

● コメントアウト(HTMLファイル内に記述)

※ Smarty

{*
ここの間に記述したものはコメントアウトされ表示されません
*}

※ Twig

{#
ここの間に記述したものはコメントアウトされ表示されません
#}

● 文字列のエスケープ(HTMLファイル内に記述)

※ Smarty(エスケープオプションは : html, htmlall, url, urlpathinfo, quotes, hex, hexentity, javascript, mail )

<a href="{$data|escape:'url'}">クリック</a>

※ Twig(エスケープオプションは : html, js, css, url, html_attr )

<a href="{{data|escape('url') }}">クリック</a>
<a href="{{data|e('url') }}">クリック</a> {# 【e】 だけでも OK #}

● 日付の表示(HTMLファイル内に記述)

※ Smarty

{* 2015-07-30 13:04:58 みたいな表示 *}
{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}

※ Twig

{# 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日") }} // 現在の日付が表示されます
{% if v.added_date != ""%}{{ v.added_date | date("Y/m/d H:i") }}{% endif %}

● ホワイトスペースと改行をなくして1行で出力する(HTMLファイル内に記述)

※ Smarty

{strip}
<table>
 <tr>
  <td>
   test
  </td>
 </tr>
</table>
{/strip}

※ Twig

{% spaceless %}
<table>
 <tr>
  <td>
   test
  </td>
 </tr>
</table>
{% endspaceless %}

● テンプレートファイル内で変数をセットする(HTMLファイル内に記述)

※ Smarty

{assign var="aaa" value="999" }

※ Twig

{% set aaa = '999' %}

※ Twig(ヒアドキュメント的)

{% set aaa %}
    <div id="pagination">
        ...
    </div>
{% endset %}

● テンプレートファイル内で配列の長さを知る(HTMLファイル内に記述)

※ Smarty

{$test_loop|@count}

※ Twig

{{ test_loop |length }}

● 長い文字列を切り詰める(truncate)(HTMLファイル内に記述)

※ Smarty

{"abcdefghijklmnopqrstuvwxyz"|truncate:10}

※ Twig

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

● 文字列の分割(explode, split)(HTMLファイル内に記述)

※ Smarty

{assign var="new_array" value=","|explode:$str_hoge} 

※ Twig

{% set new_array = "one,two,three"|split(',') %}

● 文字列の置換(replace)(HTMLファイル内に記述)

※ Twig

{{ "my name is hogehoge" | replace({hoge':'fuga'}) }}

● 文字列を逆にする(HTMLファイル内に記述)

※ Twig

{{ '1234'|reverse }}
{# outputs 4321 #}

● 文字列を切り出す(HTMLファイル内に記述)

※ Twig

{{ 123456 | slice(0, 2) }}

● 文字列の連結(HTMLファイル内に記述)

※ Smarty

{ 'sugoude'|cat:'DJ'|cat:'Master Key'}

※ Twig

{{ 'sugoude' ~ 'DJ' ~ 'Master Key' }}

● printf(プリントフォーマット)(HTMLファイル内に記述)

※ Smarty

{ $value | string_format:"%02d" }

 Twig リファレンス : http://git.io/vneJa 

No.954
08/08 18:31

edit

Twig
Smarty

Smartyのプラグイン(modifier)に複数の引数を渡す

modifierプラグインは

{$hoge|my_modifier}

と記述すると、プラグインを記述した関数

function smarty_modifier_my_modifier($a){

}

$a に $hoge の内容が渡ります。


■ modifierプラグインに複数の引数を渡すには

{$hoge|my_modifier:'arg1':'arg2'}

と記述します。

すると

function smarty_modifier_my_modifier($a, $b, $c){

}

$a に $hoge が

$b に 'arg1' が

$c に 'arg2' が

渡ります

No.943
05/12 12:43

edit

Smarty

日本語(全角文字)を指定文字数で折り返す(word wrap)Smartyプラグイン

ある文章を指定文字数折り返(強制改行)したい時があります。

そんな時に便利なのがSmartyのwordwrapプラグインがありますが、日本語や全角文字には対応していないので使用出来ません。

そこで日本語対応のSmartyプラグイン

■ modifier.unicode_wordwrap

(引用元:http://goo.gl/JmZjK にインデント機能を拡張しました。)

ファイル名 modifier.unicode_wordwrap.php で下記コードを保存し plugins フォルダに格納

<?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引数 : インデント(デフォルト値:ナシ)

です。

No.873
02/06 16:23

edit

Smarty
日本語

Smartyテンプレート内で乱数(ランダム文字列)を発生させる

例えば管理画面で画像をキャッシュさせたくない場合など

Smartyテンプレート内で乱数(ランダムな文字列)を発生させて

<img src="test.jpg?123">

などとするといいでしょう。

そこで乱数を発生させるには

{0|rand:999}

つまり

<img src="test.jpg?{0|rand:999}">

となります。

No.845
11/01 11:43

edit

Smarty

正規表現にマッチするかどうか判別する Smarty Plugin

正規表現にマッチするかどうか判別する Smarty Plugin。

ファイル名 modifier.ext_preg.php で以下のとおり作成

<?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;
	}
}

使い方 ( $file にファイル名が入っているものとします )

{ if $file|ext_preg:'/(mp4$)/i' }動画です
{ elseif $file|ext_preg:'/(gif$|jpg$|jpeg$|png$|bmp$)/i' }画像です
{ /if }
No.837
09/17 12:44

edit

Smarty

画像ファイルの width, height を取得して挿入するSmarty Plugin

画像ファイルの width, height を取得して挿入するSmarty Plugin

ファイル名 : modifier.image_wh.php で保存

<?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}

とします。


No.833
01/05 11:43

edit

Smarty
画像
ファイル

Smartyキャッシュを削除する

Smartyキャッシュを削除するには clear_cache(); を使用します。

void clear_cache(string template,
                 string cache_id,
                 string compile_id,
                 int expire_time);

Smartyを使用したサイトではSmartyキャッシュを使用することにより劇的に高速化されますが、(テストページや一時的に表示したページの)キャッシュファイルをクリアし忘れると、逆にハードディスクに負荷をかけて動作を遅くするおそれがあります。

古い不要キャッシュの削除は必ず行いましょう。

Smarty Cache時間による自動削除の例

// 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

No.761
08/23 10:43

edit

Smarty
ファイル
高速化

SmartyプラグインでOSとブラウザ判別を行う

ファイル名 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の種類を記述し、アンダースコアでブラウザとメジャーバージョンを記述します。

(記述は全て小文字)

No.674
03/23 13:23

edit

Smarty

Smarty の プラグインへの引数指定方法

通常( $data を myplugin に渡す )

{$data|myplugin}

引数を2つ($data1, $data2)渡す

{$data1|myplugin:$data2}

引数を3つ($data1, $data2, $data3)渡す

{$data1|myplugin:$data2:$data3}

配列や連想配列($ar_data)を引数として渡す

{$ar_data|@myplugin}

No.649
09/15 14:01

edit

Smarty
配列

Smartyで配列の最初と最後の要素を検知する

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}
No.601
11/01 11:18

edit

Smarty
配列

Smarty でテンプレート側で配列の長さ(要素数)を求める

Smartyはテンプレート内でPHP標準関数が使用できます。

なので

配列 $loop の要素数を知るには

{$loop|@count}

でOKです


if文で使用するには

{ if count($loop) > 0 }要素数は1以上です{/if}

計算式で使用するには( 例:$loopの要素数に2を足す )

{ math equation=a+b a=$loop|@count b=2 assign=kekka }
{$kekka}

No.583
01/21 11:11

edit

配列
Smarty

Smartyテンプレート内で変数に代入をする、計算をする

まずテンプレート内での変数の定義

{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`" }
変数をバッククォートで囲むと文字列と混ぜることが出来ます。
No.580
10/14 23:47

edit

Smarty

Smartyでセッション変数、cookie、環境変数を参照する

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 }

としてどういう環境変数が取得できるのかを調べるのがいいでしょう。



No.490
04/21 10:18

edit

Smarty
Cookie
セッション

Smartyで for文 (for i=0 ; i<10; i++)のような繰り返しを行う。

Smartyでfor文のような繰り返し処理をするには以下のように記述する。

{section name=i start=0 loop=10}
繰り返し回数は{$smarty.section.i.index}です。

$i に変数を代入する場合は下記のように行う
{assign var="i" value=$smarty.section.i.index }
繰り返し回数は{$i}です。

{/section}

No.486
12/22 14:22

edit

Smarty

Smartyテンプレート内にcss定義など {} を含む文字列を記述する。

Smartyでは {} は変数を囲うマークアップとなります。

たとえば

.style2 {
font-size: small
}

はエラーとなってしまう。

これを防ぐには

.style2 {ldelim}
font-size: small
{rdelim}

と表記するか、

{literal}
.style2 {
font-size: small
}
{/literal}

と記述します。

No.435
07/25 15:25

edit

Smarty

Smartyで 配列の中に要素があるかを調べる (in_array )

Smartyで PHP のin_array を使いたいなと思ったんですが、プラグインを書かなくても使えます。

$shop_idが配列$listの中に入っているかどうかを調べるには以下のようにする
テンプレートファイル内で以下のように記述する。
{if $shop_id|in_array:$list}すでに入っています
{else}配列の中には存在しません
{/if}

No.354
03/23 13:56

edit

Smarty
配列

【Smarty】で{foreach}の繰り返し回数を取得する

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}
No.333
11/24 11:20

edit

Smarty

Smartyを使ってRSS用日付を表示させる

■ 日付表示の基本

{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}
 ↓
2007-07-04 18:00:00

■ RSS用 日付表示

<pubDate>{$date|date_format:"%a, %d %b %Y %H:%M:%S"} +0900</pubDate> 

■ RSS用 日付表示(現在の日付を表示する場合)

<pubDate>{$smarty.now|date_format:"%a, %d %b %Y %H:%M:%S"} +0900</pubDate>
↓
<pubDate>Fri, 27 May 2011 14:13:13</pubDate>
No.289
06/30 15:28

edit

Smarty
日付

Smartyで配列かどうかを判別するには?

Smartyで配列かどうかを判別するには is_array を使用します

{ if is_array($data) }
  { foreach from=$data key="k" item="v" name="loopname" }
    {$v|escape}
  { /foreach }
{ else }
  {$data|escape}
{ /if }
No.262
07/14 15:34

edit

Smarty
配列

Smartyで数字を3桁ごとにコンマで区切る

Smartyで数字を3桁ごとにコンマで区切るには

合計: {$sum|number_format}円

とします。

No.214
07/14 11:28

edit

Smarty

PHPの代表的なテンプレートエンジンsmartyのダウンロードとインストール

1. Smarty動作条件を確認する

Smarty動作条件は

Smarty 3.x: PHP 5.2+
Smarty 2.x: PHP 4 or 5

となっています。

条件に当てはまるバージョンのSmartyをダウンロードします。

2. ダウンロードした「Smarty-XXXXX.tar.gz」または「Smarty-XXXXX.zip」を解凍する

3. 解凍して出来たディレクトリ内の 「libsフォルダ」をFTPでアップロード(プログラムがあるphpディレクトリにアップロード)

4. テンプレート用フォルダを作成しパーミッションを変更する

templates (パーミッションは変更しなくてよい)
templates_c (パーミッション 777 に変更する)

5. テンプレート用フォルダ(templates)にテンプレートファイルをアップロード

テンプレートファイルを置くフォルダは「templates」です。

templates_cフォルダは Smarty が使用するフォルダですので一切触る必要はありません。

6. ディレクトリ例

このようなディレクトリ構成になります

 |-- [libs]
 |-- [templates]
 |-- [templates_c]
 |-- 実行するプログラム.php

7. phpコーディング例 ( ./templates/test.html を表示させる。)

require_once('Smarty/Smarty.class.php');
$template = new Smarty;
$template->display('test.html');

以上。簡単ですね。

■ Smarty3日本語マニュアル

http://www.smarty.net/docs/ja/

■ Tips

http://techblog.ecstudio.jp/tech-tips/smarty-tip.html

No.1
08/23 19:34

edit

Smarty