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 件のコメント:
コメントを投稿