CakePHPでレンダリング結果をファイル出力

Posted by joeartsea on 2009-02-17

CakePHPでレンダリング結果のHTMLをファイルとして書き出す方法です。もちろんテンプレートを利用できますのでHTMLだけじゃなくテキストデータならどんなファイルでも同じ方法で書き出せます。今回はCakePHP1.2のFileクラスを利用する方法です。まずは普通にviewを用意。

app/views/tests/test.ctp

1
2
3
4
5
6
7
8
9
<html> 
<head> 
<meta http-equiv="Content-type" content="text/html; charset=utf-8"> 
<title>test</title> 
</head> 
<body>
<?php echo $test ?>
</body> 
</html>

モデルはとりあえずデータベースを利用しない設定で作成。

app/models/test.php

1
2
3
4
5
6
<?php
class Test extends AppModel
{
    var $useTable = false;
}
?>

最後にコントローラでファイル出力を書く。

app/controllers/tests_controller.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
class TestsController extends AppController
{
var $name = &#39;Tests&#39;;
var $output = null;
function test()
{
$this->set(&#39;test&#39;, &#39;テスト&#39;);
$this->output = $this->render();
$file = new File(&#39;_C:/xampp/htdocs/test/test.html_&#39;, true);
$file->write($this->output);
$file->close();
$this->output = null;
}
}
?>

Fileクラスをnewする時にファイルを出力する場所を指定できます。例はWindows環境で絶対パスを指定しています。環境に合わせて指定してみてください。ちなみに最後の$this->output = nullでレンダリング結果をクリアしているので画面には何も表示されません。指定したパスにtest.htmlが生成されていれば成功です。

$this->output = nullをしなければ画面にもレンダリング結果が表示されます。ファイルを生成した後に違う画面を表示したい場合は最後にもう一度$this->render('other')などとしてください。test.htmlが生成された後ににother.ctpの内容が画面に表示されます。ファイル生成→完了画面表示などの場合にそうすることが多いでしょう。