2009年1月22日木曜日

[PHP][Symfony]: 特定のスタイルシートを読み込まないようにする

# テスト環境はSymfony v1.2.0

Symfonyを使っていると,apps/APP_NAME/config/view.ymlに書いたデフォルトのスタイルシートは常に勝手に読み込まれることに気付く.
これは親切なのだが,デフォルトのapps/APP_NAME/templates/layout.phpを使わずに全て手動でHTMLを出力させたい時などには不便である.

例えば,apps/APP_NAME/templates/null.phpとして,以下のようなファイルを作る.

<?php echo $sf_content ?>

このレイアウトは,デフォルトのlayout.phpと違い,HTMLタグやHEADタグなどを含んでいないため,CSVを出力したり,HTML以外の任意のデータを出力する時に使う.
使い方は,Actionの中で

$this->setLayout('null');
とすればよい.

さて,このレイアウトテンプレートはCSSやXMLなどの非HTMLを出力する場合は問題なく機能する.
しかし,HTMLを出力しようとした際に問題が発生する.
というのは,アクションのテンプレートにHTMLを普段通り記述しただけでは,SymfonyがHEADタグを自動検出して,デフォルトのスタイルシートを読み込んでしまうのだ.

例えば,以下のテンプレートの場合,赤字の部分にデフォルトのスタイルシートが読み込まれる.

<html>
<head>
<meta ... />
<meta ... />
<!--ここに読み込まれる-->
</head>
<body>
</body>
</html>


デフォルトのスタイルシートを読み込みたくない場合,この動作はお節介なので,読み込まないように設定したい.
で,SymfonyのAPIドキュメントによると,Responseクラスを継承したsfWebResponseクラスにremoveStylesheet()というメソッドがあるので,これを使ってみるのだが,うまくいかないことが分かる.

public function executeHoge(sfWebRequest $request){
$response = $this->getResponse();
$response->removeStylesheet('stylesheet_to_remove');
return sfView::SUCCESS;
}

どうみても問題なさそうなのだが,やはりデフォルトのスタイルシートが挿入されてしまう.

で,お行儀が悪いが,テンプレートの方でこのメソッドを呼んでみる.

<?php
$sf_response->removeStylesheet('stylesheet_to_remove');
?>
<html>
<head>
<meta ... />
<meta ... />
</head>
<body>
</body>
</html>

すると,無事にスタイルシートが読み込まれなくなった.

どうやら,デフォルトのスタイルシートを挿入する処理は個別のActionのテンプレート処理の後に行うらしい.多分Filterか何かがやっているのだと思う.
この処理の順番を知らなかったのでかなりハマった.同じような経験をした人はいるのかな?

0 件のコメント:

コメントを投稿