Smartyのテンプレート内の処理で計算、加工をする方法
2014/06/26
Smartyのテンプレート上で計算をする場合
Smartyを使う場合、テンプレート上では PHPと同様な記述で変数を扱うことができません。
そのため、PHP上で計算をしようとしたり、ループさせて条件にヒットしたレコードが設定件数に達したらループを抜ける、といった処理を作ろうと思うと、Smarty用の記述をする必要があります。
そんな場合の処理です。
Smartyでは「assign」を使って変数に値を入れたり、計算をしたりします。
【サンプル】
例えば、ニュース表示で、「categoryId」が「3」のものを最大 3個まで表示するという処理の場合は、以下の様になります。
———————–
{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
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
PHPのデバッグで使う print_r、var_dump、var_exportの動作の違い
PHPのデバッグ等で変数や配列の中身を確認するために使用する関数print_r、var_dump、var_exportの動作の違い、仕様の違いについて確認した。var_exportがオススメ。
-
-
ECCUBEでアップロードできない。upload_max_filesizeを設定する場所
テンプレートをアップロードする際に発生するエラー「テンプレートファイルがアップロードされていません」の対処方法。これはファイル容量の制限に引っかかっています。
-
-
PHPで正規表現の検証には preg_match_allが便利
PHPで正規表現の検証には preg_match_allが便利です。その便利さの使い方の解説です。
-
-
ECCUBEの管理画面のSSL設定をインストール後に変更する方法
ECCUBEをインストールした後から管理画面のSSL設定を変更する方法を解説します。config.phpファイルのHTTPS_URLとADMIN_FORCE_SSLの値を変更すればOK。
-
-
PHPのソースで見慣れない記号が出てきた・アロー演算子(->)、ダブルアロー演算子(=>)
PHPのプログラムソースには見慣れない記号が出てきます。その意味や調べ方です。
-
-
PHPで1ヵ月前、先月、今月1日、来月末の日付などの算出はDateTimeImmutableを使う
PHPには日時をオブジェクトとして生成する関数「DateTimeImmutable」「DateTime」が用意されている。これを利用して1ヶ月後、月初日、月末日、5日後などを指定して日付を取得できる。
-
-
SEO対策用タイトル、ディスクリプションの文字数カウントツール
SEO対策に使える文字数カウントツールで文字数の条件の説明も行っています。
-
-
PHPでスクレイピング。phpQueryとphp-simple-html-dom-parserの比較と設置方法
「PHP スクレイピング」で検索すると「phpQuery」ばかりヒットするが、10年以上も放置されている。なので今も開発が続いている「PHP Simple HTML DOM Parser」をオススメする。
-
-
PHPのcURLでAPIやWebサイトへのアクセス方法。file_get_contentsとの比較
PHPからWebサイトにアクセスしてHTMLを取得、APIにアクセスして情報を取得する場合は、cURLがオススメ。file_get_contentsでも可能だがエラー制御に難がありトラブルのもとになる。
-
-
ECCUBE2.13.3で商品規格の在庫数が無制限から変更できないバグがある
2.13.3固有のバグである商品規格の在庫数の入力エリアがアクティブにならない不具合を解消する解説です。product_class.tplの2行を修正するだけの簡単対応です。