• ベストアンサー

smartyで計算を行う方法

smartyで複雑な計算を行う場合はどうすればよいのでしょうか? 簡単な計算は、 <{$a/$b}> のように記述出来ますが、カッコを使った方法などはどうすれば良いのでしょうか? 色々と試したり検索しているのですが出来ません。 外部のPHPファイルに各変数の値を渡して計算して元のページに計算結果を戻す、がベストな方法でしょうか? 例えば、$a/($b-$c)という式があったとします。 これをsmartyで計算してその結果を表示する場合、 <{assign var="d" value=$b-$c}> <{$a/$d}> って少しまわりくどい方法なら出来ますが、もっと複雑な式などになる場合、こんな感じで順を追って一つづつ値をアサインして最終的に答えを導き出すのが普通なのでしょうか? もっと簡単にカッコなどを使うことって出来ますか? また、外部にPHPファイルを用意して、そこで計算をして結果を戻してくるって方法も取れるのでしょうか? PHPで計算する方法があるなら、是非教えていただけませんか? フォームなどから外部のPHPに値を渡すなら、 $a = &_POST[$a] って書くのは知っているのですが、smartyの値を渡したり戻したり、って方法が分かりません。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • yuuki0229
  • ベストアンサー率70% (33/47)
回答No.4

挙げられた例ですと、テンプレート側に計算処理を始めるトリガーを置く必要は無さそうですので、 No.2さんの仰るように、計算したあとでSmartyに渡すのが一般的かと思います。 ただ、そこで補足されている以下の考え方は少々異なります。 >smartyテンプレートで受けた値を外部のPHPスクリプトに渡して計算を行い、その計算結果をsmartyテンプレートに戻すという方法が正解となのですよね。 どこかに $smarty->assign('B', $sinchou); といったコードがあるはずですが、その続きで $bmi = $sinchou * $shinchou / 10000 / max($taiju, 1); $smarty->assign('BMI', $bmi); のように追加で新しい変数を与えるイメージになります。 #maxはゼロ除算対策です テンプレート側では他の変数と同じように扱えます。 <{$A|escape}>さんのBMI値は<{$BMI}>です。 また、数値のフォーマット程度の処理であれば修飾子などを使って、テンプレート側で行ってしまうこともよくあります。 <{$A|escape}>さんのBMI値は<{$BMI|string_format:"%.1f"}>です。

atsuya192
質問者

お礼

反応が遅れてしまいすみませんでした。 解説頂いたのを飲み込むのに時間が掛かってしまいました。 まだ実践が出来ていないのですが仕組みは理解できたので、更に勉強していきたいと思います。ありがとうございます。

その他の回答 (3)

  • yuuki0229
  • ベストアンサー率70% (33/47)
回答No.3

作ろうとしているのはページャでしょうか? #外してたら以下の回答も的外れになるかも知れませんが… そういう計算するクラスを作ってSmarty側からpublicのメンバ変数を参照させたりしてます。 --- PHPスクリプト側 --- $pager = new MyPager($totalCount, $currentPage, $limit); $smarty->assign('pager', $pager); // assignは1度 --- Smartyテンプレート側 --- <{$pager->totalCount}>件中 <{$pager->dispFrom}>件~<{$pager->dispTo}>件を表示しています。 テンプレート側に書きたいパラメタ(例えば幅のpx数など)がある場合は関数のプラグインを登録しておくのも良いと思います。 http://www.smarty.net/manual/ja/api.register.function.php >外部にPHPファイルを用意して、そこで計算をして結果を戻してくるって方法も取れるのでしょうか? このニュアンスに近いと思います。

atsuya192
質問者

補足

回答ありがとうございます。 ページャの意味が分からず、勉強させて頂きましたが、多分、ページャというものではないと思います。初心者で意図がうまく伝えられず本当にすみません。 希望としては、私のサイトに訪れたユーザー(友人)が、自己紹介ページを作成出来るような環境を整えたいと思っています。 自己紹介ページといっても、設置されたフォームに、名前($A)、身長($B)、体重($C)、年齢($D)、コメント($E)の項目を入力させて、それを表示するだけのページなのですが…。 そのフォームで入力された値を各々のページで表示出来るようにはなりましたが、計算などを行う際の流れが理解出来ていない状態です。 例えば、フォームで入力された、"$C"を"$B"で割る場合、smartyテンプレート側に<{$C/$B}>と書いておけば、その答えが表示されるのですが、これを計算用にPHPファイルを別途用意して、 <? $taiju = $C; $sinchou = $B; $kekka1 = ($C/$B); $kekka2 = ($B/$C); ?> のような計算をし、その結果を自己紹介ページにて表示させる場合はどうすれば良いのでしょうか? テンプレート上の"$C"といっても、例えばAさんとBさんの2人が自己紹介ページを作成したら、"$C"にはAさんの値やBさんの値などもあるので、それぞれの値を個別にPHP側の、「$taiju」「$sinchou」へアサインする必要がある(??)と思うのですが解決出来ていません…。 そして、各自己紹介ページにPHP上の計算結果を渡す場合も、どのようにアサインさせるのかも分からないです…。 お手数をお掛けして申し訳ありません。 もし、お手すきな時間がございましたら、ご教授頂けないでしょうか? 宜しくお願いいたします。

  • inu2
  • ベストアンサー率33% (1229/3720)
回答No.2

Smartyは「テンプレートエンジン」です。 ロジック部分とテンプレート部分を切り分けるために使うものです。 Smarty内で計算(ロジック)するって事そのものに、そもそも使い方がちがっています。 目的を失うとSmartyを使っている意味が全くなくなりますよ。 ロジック側で計算した値をSmartyにassignすればいいだけです。

atsuya192
質問者

補足

回答ありがとうございます。 返信が遅れてしまい申し訳ありません。 初心者の為、値のassgin方法について勉強させて頂いてました。 smarty側に計算を行うようなものを記述するのは間違っているんですね、ご助言ありがとうございます。 そうすると、smartyテンプレートで受けた値を外部のPHPスクリプトに渡して計算を行い、その計算結果をsmartyテンプレートに戻すという方法が正解となのですよね。 ただ、外部PHPとの連携(アサイン方法)がいまいち理解出来ておりませんorz

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

「Smarty 計算」あたりのキーワードで検索して見つかる たくさんのサイトのうち、もしかすると参考URLに書いた サイトなどが役に立つかもしれません。

参考URL:
http://xfield.info/modules/tautech/content0136.html
atsuya192
質問者

補足

ありがとうございます。 色々と検索してみてはいるんですが、なかなか答えが出てこないんです…。参考URLチェックしてみます。

専門家に質問してみよう