FuelPHPサイド
FuelBeans 12 : ビューを柔軟に取り扱う
ビューの取り扱いをもうちょっとやってみましょう。(キーバインドも変更して、絶好調です。 :D )
さて、前回のhello.phpをちょっと簡単にしましょう。index_actionだけにしてください。
<?php
class Controller_Hello extends Controller {
function action_index() {
$view = View::forge('hello');
$view->title = 'FuelPHP テストプログラムです。';
$view->content = 'いらっしゃいませ、ご主人様';
return $view;
}
}
これで、動作を確認します。当然ながら動きますね。
これは、ビューを先に作成してから、データーを設定しました。データーを用意してから、その配列を渡す方法も取れます。
<?php
class Controller_Hello extends Controller {
function action_index() {
$data = array(
'title' => 'FuelPHP テストプログラムどすえ。',
'content' => 'もうかりまっか',
);
return View::forge('hello', $data);
}
}
これが、FuelPHPは様々なフレームワークのいいとこ取りしている点です。それぞれ、別のフレームワークで採用されている方法です。おすすめは最初の方法です。コードがクールですし、まあ、次の理由もあるからです。
では、コードを次のように変更してください。
<?php
class Controller_Hello extends Controller {
function action_index() {
$view = View::forge('hello');
$view->title = 'FuelPHP テストプログラム';
$view->content = '<span style="color:red">燃えながら</span>ヘロー';
return $view;
}
}
燃えながらヘローの燃えながらを赤で表示しようという腹です。実行してみましょう。どうなるでしょうか?
まあ、この節のタイトルを読んでもらえば想像ついたかも知れませんが、FuelPHPはデフォルトで出力にフィルターがかかっています。
これは、config.phpの設定で外すことも可能です。試してみましょう。config.phpは長いですから変更する部分のみ示します。
118 /**
119 * This output filter can be any normal PHP function as well as 'xss_clean'
120 *
121 * WARNING: Using xss_clean will cause a performance hit. How much is
122 * dependant on how much input data there is.
123 */
124 'output_filter' => array('Security::htmlentities'),
125
126 /**
127 * Whether to automatically filter view data
128 */
129 'auto_filter_output' => true,
129行目、auto_filter_outputがtureになっています。これをfalseに変更して実行してみましょう。今度は意図したとおりに表示されます。
このオプションをfalseにするのは、危険ですから、やめましょう。PHPプログラムでは出力時にフィルターをかけるのがほぼ常識になっており、それを自動的にやってくれているのです。もし自分で制御したいのなら、falseでかまいません。
フィルターの種類のみ変更、もしくは追加したい場合、124行のoutput_filterを変更、追加することで対応できます。(私は試したことありません。)
先へ進む前に、auto_filter_outputをtrueに戻してください。これで、原則出力がフィルタリンクされる状態へ戻りました。
もし、ある特定のビューのみ、安全であり、タグなどを含む場合、そのビューのみフィルタリングを中止できます。
View::forge()の第3引数は、フィルタリングを行うか、行わないかをture、falseで指定します。ここをfalseに指定すればフィルタリングされません。View::forge('hello', null, false)にして試してください。
試したら、元の通り、View::forge('hello')へ戻してくださいね。
でも、ビュー全体のフィルタリングをオフにするのはやり過ぎだと思いませんか?この場合でしたら、contentだけフィルタリングをしなければ済む話です。
FuelPHPには、その手段が提供されています。次のように変更してください。
<?php
class Controller_Hello extends Controller {
function action_index() {
$view = View::forge('hello');
$view->title = 'FuelPHP テストプログラム';
$view->set('content', '<span style="color:red">燃えながら</span>ヘロー', false);
return $view;
}
}
これが一番多用するパターンです。set関数の第3引数がフィルタリングの有無です。このパターンを利用するために、最初にビューを作成しました。ビューの生成時にデーターを渡す方法でも、手段があるかも知れませんが、私は見つけていません。見つけたら、参考までに教えて下さいね。
よくあるチュートリアルで、ビューはヘッダー、コンテンツ、フッターなどに分割して作成し、表示できますよというものがあります。
それが、例としてドキュメントに存在しています。(まだ翻訳されていませんが、コードですから、読めると思います。)
同じ事を書いても面白く無いので、ご覧になり、実際に動作させてみてください。
Nesting Viewの節です。
Method1はグローバルを利用する例です。
Method2は配列を利用する例です。
Controller_Templateクラスが存在しています。このクラスはControllerクラスを継承しています。
つまり、Controllerに自動的にtemplate.phpというビューを取り込み、returnで出力内容を返さなくても、自動的に渡してくれる、つまり表の準備だけ行えば良いというクラスです。
実は大したことをやっているわけでありません。fuel/core/classes/controller/template.phpがそのソースです。開いてみてください。
before()はそのコントローラーが生成されたときに呼び出されるクラスです。コンストラクタの代わりに使用します。
templateというビューを生成しているわけです。template以外のビューを使用したい場合、Controller_Templateをextendsしたクラスのbefore()関数の中で、この$templateに設置してあげればいいのです。
ここまで読んで気が付かれたとおもいますが、余り利用価値はありません。その程度のことしかやっていません。
他のフレームワークで、この仕組を提供しているものが存在するので、同じ機能を作っただけでしょう。色々取り込みすぎて、余計な物までくっついています。
実用的には、このController_Templateクラスではなく、Controllerクラスを継承し、自分独自のベースクラスを作成し、実際の処理はそのベースクラスを継承する形になるでしょう。
ベースクラスのbefore()とafter()で全クラスに必要な前処理と、後処理を行います。他のフレームワークですと、フックを掛けたりする方式で実現することが、クラスの継承という形態で自然な形で組み込めます。
| FuelBeans 10 : ビューを利用する< 前 | 次 >FuelBeans 14 : ハウ・ツー・デバッグ |
|---|
| < 前 | 次 > |
|---|