Creazy!

WEBエンジニア・ヤガーのテック・ガジェットブログ

PHP 小技集

Smartyで配列のダンプを表示させる5つの方法

投稿日:


Smartyといえば、言うまでもなくPHPの中ではとても有名なテンプレートエンジンです。自分でも長い事使ってきたんだけども、使い方が分からなくて困るほど難しい事をしてこなかったせいか全然深いところまで調べてませんでした。
ところが、今日配列(というかデータオブジェクト)の中身を確認しようと思って(要するに変数をvar_dumpしたかっただけなんだけど)調べてたら、色々方法があるみたいなのでメモっておきます。
※PHP初心者向きの情報かもしれません。オレ今日知ったけど(…)

1)デバッギングコンソールを使う

Smartyにはもともとデバッグ用の仕組みが用意されています。
http://www.smarty.net/manual/ja/chapter.debugging.console.php

require_once 'Smarty.class.php';
$smarty = new Smarty;
$smarty->debugging = true;

こんな感じで $debugging を有効にしておくと Smarty に assign された全ての変数を表示するでデバッキングコンソールが常に別ウィンドウで表示されるようになります。
特定のテンプレートだけで変数を確認したい場合は $debugging の代わりに、テンプレート変数{debug}を使用する事もできます。
この辺りは、下記ページに非常に丁寧にまとまっています。
cl.pocari.org – Smarty を使った開発でデバッグを行う 4 つの方法

2)debug_print_var modifier を使う

これも、上で紹介したcl.pocari.orgさんのエントリーで知りましたが、まさにvar_dump(というかprint_rに近いのかな?)みたいな modifier があるみたいです(なぜかマニュアルにのってない…)。

{$hoge|@debug_print_var}

modifier なので変数の後ろに「|」パイプで繋げるだけでOK。
$hogeが配列の場合は「@」を付けないと配列の内部まで表示しないので注意が必要。
(「@」の件は、この辺を参考にするとよさそう)

3)PHP関数のvar_dumpを暗黙の修飾子として使う

環境にもよりますが、SmartyからでもPHP関数を使う事ができます。

全ての PHP 関数は暗黙で修飾子として使用する事ができます。

via: Smarty

{$hoge|@var_dump}

「@」を付けているのは配列をダンプするためで、debug_print_varの時と同じです。
このように、別になにも悩まずにいつものvar_dumpが使えるのですね。
ただ、この「暗黙の修飾子」がセキュリティ上の理由で禁止されているかもしれません。
$securityがtrueになっている
$security_settings の MODIFIER_FUNCS に関数が登録せれていない
また、var_dumpと同じ様に@var_export、@print_rなんかも使えますので出力形式のお好みに合わせて使う事ができます。

4){php}関数でvar_dumpを実行する

Smarty内でPHPコードが実行できる{php}関数というのがあるのですが、これを使えばそれこそPHPと同じようにvar_dumpできます。
(テンプレートにロジックを持ち込む事自体よろしくない事とされてますのであんまり良い方法ではありませんが…)
ただ、PHP側の変数を扱うにはちょっとしたコツが必要で、

{php} ブロック内の PHP 変数にアクセスするには、PHP の global キーワードを使う必要があります。

via: Smarty

ということなので、

{php}
global $hoge;
var_dump($hoge);
{/php}

のように一旦global宣言する必要があります。

5)dump用のプラグインを使う

実際プラグインを作って自分好みのデバッグを行っている人もいるようです。
ダンプ用Smartyプラグインで快適デバッグ – Lism.in * blog
何度も見るのですから見易い方がいいですよね。
preprint_rみたいにちゃんとPREタグで整形したり、
こだわりがある人は自作してみるものいいかもしれません。
カスタム関数の勉強にもなるし。

まとめ

邪魔じゃなければ{debug}で一通り変数だしちゃうのが手っ取り早いかも。
「暗黙の修飾子」でvar_dump使うのは環境によってはNGなので(まあデバッグするような開発環境だったら $security = false でいいと思うけど)、変数ごとにやるなら debug_print_var を使うかなぁ。
こんなに方法があってもしょうがないんだけど、まあ知識として持っておいても損はしないでしょ。

-PHP, 小技集

執筆者:


comment

メールアドレスが公開されることはありません。

関連記事

表紙で探すプログラマーっぽい写真

ブログデザイン勉強会 第3回を経て、このブログを的確に表現できる写真選びを進めています。が、ハッキリ言っていままで撮りためているストックの中には無いんじゃないかと思っています。ボクがよくカメラを向ける …

新しいFacebookページにStatic iframe形式でタブを追加する方法

【2011/02/21:追記】 iframe形式を使おうと思っている方は、こちらの記事も参考にしてください。 Facebookページのiframe形式タブに切り替える場合は、バグに注意! 少し前にfa …

no image

第8回:Twitter JavaScript Badges の日付フォーマットを自由にカスタマイズ

久しぶりに twitter ネタです。 というかシツコク JavaScript badges のお話。 以前のエントリーで IE での日付表示がおかしい件に対応しました。 そのエントリーにフォローする …

Googleドキュメントのフォーム機能からGoogle Apps Scriptを使ってメール送信

【2014/12/26:追記】 この記事はGoogleの仕様変更などで内容が古くなっていたため、最新の情報で書き換えました。 リンク先の記事を参照してください。 Googleドライブのフォーム機能から …

高感度撮影した写真のノイズ低減を3つのソフトで比較(Photoshop Elements, Neat Image, Photoshop Lightroom)

先日、ホタルの高感度撮影に挑戦したところ、愛用しているGF3ではノイズがかなりヒドイ状態で見るも無残だったため、少しでもノイズを除去できないかと調べてみました。画像の編集にはPhotoshop Ele …

スポンサードリンク

スポンサードリンク