smartyでin_array

2011/01/31 | Smarty

せっかくsmartyを使うんだから、極力テンプレートにはロジックを記述したくない。しかしifやforeachなどの構文はどうしても必要になってくる。今回if構文内で配列内に値が存在するかどうかをチェックしたかったのだが・・・。

{if in_array($value,$myArray)}

こんな記述はできない。だったsmartyはPHPで記述されているが、PHPではないからだ。さてどう記述するか。

{if $value|in_array:$myArray}

修飾子を使えばよかったのか。勉強になりました。

Smartyで配列のキーが配列の時

2010/04/18 | Smarty

Smartyで配列を処理するときはこんな具合に書く。

PHP内でこんなとき・・・$vars[‘hoge’]
{$vars.hoge}

PHP内でこんなとき・・・$vars[$hoge]
{$vars.$hoge}

PHP内でこんなとき・・・$vars[‘hoge’][$fuga]
{$vars.hoge.$fuga}

さして難しいわけではないけれど、配列のキーが配列になる場合の記述がわからなかった

PHP内でこんなとき・・・$vars[$hoge[‘fuga’]]

答えはこんな感じ

{$vars[$hoge.fuga]}

Smartyの最新版でも大丈夫

2009/11/10 | Smarty

以前調べたSmartyのエラーの件、解決策が古いバージョンに戻すという方法をとったが、現行の最新バージョン2.6.26でも大丈夫なことを確認できた。こんな感じのエラー。

PHP Warning: preg_match() [<a href=’function.preg-match’>function.preg-match</a>]: Compilation failed: repeated subpattern is too long at offset 18454 in /library/smarty/Smarty_Compiler.class.php on line 454

2.6.20から2.6.26までのSmartyの変遷を追うと勉強になりそう。やらないけど。

Smartyでpreg_matchエラー

Smartyを使っていてこんなエラーが出た。

PHP Warning: preg_match() [<a href=’function.preg-match’>function.preg-match</a>]: Compilation failed: repeated subpattern is too long at offset 18454 in /library/smarty/Smarty_Compiler.class.php on line 454

たしか以前もこんなエラーに出くわしたことがある。確か、そのときは「PHPのバージョンが古いとpcre関連でバグがある」というような理解で終わったと記憶していた。そのときの解決策までは思い出せないが、エラーメッセージを見る限りでは正規表現のパターンの長すぎが原因のようだ。

しかし困ったのは、このエラーがSmarty内部で発生しているということ。ライブラリの中身なんて修正したくない(だって他のところでは動作しているのだから)。よくよく調べたらこのエラー、Smartyのバージョンを落とすことによって回避できるらしい。きっとバージョンが新しくなり、正規表現で記述していたパターンが長くなってエラーが出たのだろう。

エラーが出たバージョンは2.6.21だった。調べた結果によると、2.6.20と2.6.21がちょうど天と地の境目のようだ。早速2.6.20をダウンロードしてみたら見事解決した。よかった。ていうか、レンタルサーバ会社のPHPのバージョンが低いせいだよね、きっと。

Smartyテンプレート内でPHPスクリプトを書くときに

2009/03/16 | Smarty

すでにテンプレート内でロジックを書くということ自体がいけないのだが、それでもどうしてもやらなければいけないときがある(というかそのほうがソースがきれいになる)。

Smartyは専用タグを使うPHPのテンプレートエンジンだけど、テンプレートの中にPHPプログラムを直接書くこともできる(書かないでいいものなら書かないほうがいい)。例えばこんなふうに。

{php}
print(‘This is PHP script’);
{/php} 

そもそもこういうふうな処理をかかなければならないわけだから、何らかの変数処理というのも必要になるわけだし、変数だってテンプレートにSmarty変数として使用していたものを使いたくなるのも人情だ。そんな場合は、こういう具合に書く。

$smarty->assign(‘myText’,’This is PHP script’);

{php}
print($this->get_template_vars(‘myText’);
{/php} 

プログラム本体内でmyTextという名前でアサインされた変数を、テンプレート内のPHPスクリプトから呼び出す例だ。ミソは「get_template_vars」メソッド。Smarty関数を書くときにも時々使ったりする。これを使って呼び出せばいい。

でも、やらなくてすむのなら、やらないほうがいい。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net