Smartyのテンプレート内の処理で計算、加工をする方法
2014/06/26
Smartyのテンプレート上で計算をする場合
Smartyを使う場合、テンプレート上では PHPと同様な記述で変数を扱うことができません。
そのため、PHP上で計算をしようとしたり、ループさせて条件にヒットしたレコードが設定件数に達したらループを抜ける、といった処理を作ろうと思うと、Smarty用の記述をする必要があります。
そんな場合の処理です。
Smartyでは「assign」を使って変数に値を入れたり、計算をしたりします。
【サンプル】
例えば、ニュース表示で、「categoryId」が「3」のものを最大 3個まで表示するという処理の場合は、以下の様になります。
———————–
1 2 3 4 5 6 7 8 9 10 |
{assign var="count" value=0} {foreach from=$data["news"] item="each"} {if $count < 3} {if $each["categoryId"] == "3"} <li>{$each["newsDate"]} {$each["newsTitle"]}<br /> {$each["newsBody"]|nl2br}</li> {assign var="count" value=$count+1} {/if} {/if} {/foreach} |
———————–
上記の 1行目の様に、先頭に「assign」を記述し、変数名を「var」で指定し、その中に入れる値を「value」で指定します。
PHPでの記述では「$count = 0」とするところを、「{assign var=”count” value=0}」と記述する、ということになりますね。
また、計算をする場合も同様に、assign、var、valueで指定をします。
具体的には 7行目のように、先頭に「assign」を記述し、計算結果を入れる変数名を「var」で指定し、「value」で計算式を指定します。
PHPの記述では、「$count=$count+1」とするところを「{assign var=”count” value=$count+1}」と書いていることになります。
PHPでは「$count+1」の記述を「$count++」とすることができますが、Smartyのテンプレート上ではその記述はできないようです。(エラーにはなりませんが、計算はされていないようです。)
処理と表示を分ける意味において、SQLを発行するタイミングで、カテゴリ、件数と絞った SQLを実行する方がいいのは間違いないのですが、例えば 1ページにカテゴリごとに分けてニュースを複数表示する、といった場合などは、SQLを複数実行するよりは表示の処理で振り分けをする方がいい、という判断をすることもあるでしょう。
そういった場合には、このようなテンプレート上で処理を記述する必要があるかと思いますので、このような対応が必要になってきます。
(処理と表示を分ける意味において、内部処理で「categoryId」が「3」になるレコードだけを別の変数に分けておき、テンプレート側ではそれを表示するだけ、という処理の方が本来あるべきつくりであることは間違いないのですが。)
下記のオフィシャルサイトを参考にしました。
http://www.smarty.net/docs/ja/language.function.assign.tpl
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
include、requireのパス指定をdirname(__FILE__)、__DIR__と書く理由
include、requireのパスの指定を dirname(__FILE__)、__DIR__で記述する理由に付いて解説。相対パス、絶対パスを直書き、パスを書かない場合は何が問題かを説明。
-
-
数値がMySQLのint(11)に保存できない!PHPの変数が本当にint型か確認!
PHPでintegerとdoubleが混在するような計算をする場合は要注意!計算結果が整数値であっても途中で使用する変数にdoubleの値が入っているときは計算結果がintegerではない場合があります。
-
-
PHP range関数を使って階乗と重複組み合わせを計算
PHPの range関数を使って階乗と重複組み合わせを計算し、それを元に乱数発生器を作成しました。
-
-
sleepの秒指定は整数のみなので1.5秒はsleep、usleepを組み合わせる
PHPのプログラム処理を遅延させる「sleep()」は整数秒単位。「usleep()」は1秒未満のマイクロ秒単位。では「1.5」秒はどう表現するのか。「sleep()」「usleep()」を組み合わせる。その解説。
-
-
配列の値をテキスト表示する際に「、」でつなげるときの処理方法の一例
配列の値を「、」でつないで出力する際、単純にforeachで繰り返し処理をすると「イヌ、サル、キジ、」となるが文字列最後の「、」を出力しない方法を3つ解説している。
-
-
乱数発生器(パスワード生成サービス)がバージョンアップで高速化!
乱数やパスワードを生成する乱数発生器を高速化!重複しない10桁、20桁の文字列を10万件、20万件と生成することも可能!イベントのキャンペーンのシリアルコードなどにも利用可能!
-
-
PHPのcURLでAPIやWebサイトへのアクセス方法。file_get_contentsとの比較
PHPからWebサイトにアクセスしてHTMLを取得、APIにアクセスして情報を取得する場合は、cURLがオススメ。file_get_contentsでも可能だがエラー制御に難がありトラブルのもとになる。
-
-
QRコード(二次元バーコード)作成サービスを公開
QRコード(二次元バーコード)を生成するサービス。QRコードにする文字列を入力するだけで QRコードが簡単に作れる。オプションとして、画像サイズ、余白サイズ、エラー訂正レベルがある。
-
-
複数銘柄を指定して株価チャートを一覧するツール公開
入力銘柄の5日間、3か月間、6か月間、1年間、2年間の株価チャートを一覧表示しますのでチャートで売買判断をするのに最適です。
-
-
PHPで配列の値をダブルクオーテーションで囲んでimplodeでカンマ区切りにする方法
PHPで配列の値を、preg_replace関数でクォーテーションで囲み、implode関数で「,(カンマ)」で区切ってテキスト化する方法。この方法であれば配列が空でも分岐の処理は必要なし!