はい、やってまいりました。だれだれaskeetのお時間です。
今日は「symfony アドイベントアドベント カレンダー 3日目 MVC構造へダイブ」です。
さっそくチュートリアルに習ってレッツダイブです。
MVCがうんちゃらとかそういうことは専門のサイト様におまかせするとして、チュートリアルをさくさく実践いたしましょう。
レイアウトの変更
askeet/apps/frontend/templates/layout.phpを
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<?php include_http_metas() ?>
<?php include_metas() ?>>
<?php include_title() ?>
<link rel="shortcut icon" href="/favicon.ico" />
</head>
<body>
<?php echo $sf_data->getRaw('sf_content') ?>
</body>
</html>
から
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<?php echo include_http_metas() ?>
<?php echo include_metas() ?>
<?php echo include_title() ?>
<link rel="shortcut icon" href="/favicon.ico" />
</head>
<body>
<div id="header">
<ul>
<li><?php echo link_to('about', '@homepage') ?></li>
</ul>
<h1><?php echo link_to(image_tag('askeet_logo.gif', 'alt=askeet'), '@homepage') ?></h1>
</div>
<div id="content">
<div id="content_main">
<?php echo $sf_data->getRaw('sf_content') ?>
<div class="verticalalign"></div>
</div>
<div id="content_bar">
<!-- Nothing for the moment -->
<div class="verticalalign"></div>
</div>
</div>
</body>
</html>
に変更・・・と。コピペですね。
つづいて、SVNリポジトリからmain.cssとlayout.cssをダウンロードしてきて、askeet/web/css/にコピー。(main.cssは既存のものがあるので、上書き)
そして、askeet/apps/frontend/config/view.ymlの12行目を
stylesheets: [main]
から
stylesheets: [main, layout]
に変更。で、ここまで変更を加えてアプリケーションにアクセスしたら変更が反映・・・されてませんね・・・。
こちらの実践サイト様をみてみると、キャッシュが関連しているようなことが書いてありますね。
じゃあとりあえずキャッシュを消してみますか。
symfony clear-cache
それでも状況は変わりません。仕方ないので開発環境(frontend_dev.php)のログをみてみると・・・
17 View render "<PEAR_HOME>\pear\data/symfony/modules/default/templates/indexSuccess.php"
18 View decorate content with "<PEAR_HOME>\pear\data/symfony/modules/default/templates/defaultLayout.php"
19 View render "<PEAR_HOME>\pear\data/symfony/modules/default/templates/defaultLayout.php"
なんかsymfonyデフォルトのデフォルトレイアウトを見に行ってるみたいですね。
これじゃいくらaskeetのレイアウトを変更しても反映されないような・・・。
しかたないなぁと思って読み進めていくと・・・・なんだか微妙に納得がいくようなことが書いてあります。
デフォルトのホームページ(トップページ)への再定義
>注意: 興味深い人なら、 'Congratulations' を表示していたページを探したかもしれません。結果としてそのようなページは askeet プロジェクトディレクトリには見つからず不思議に思っていたのではないでしょうか?実は、 default/index アクションのテンプレートディレクトリは symfony data ディレクトリというプロジェクトから独立した場所に定義されています。 オーバーライド(上書き)したい場合は、 default モジュールを作ってそれぞれのアクションを定義することが出来ます。
つまり、askeet/apps/frontend/templates/layout.phpにいくら変更を加えても、default/indexアクションを実行して表示されるテンプレートはsymfonyデフォルトのものですよってことでしょうか。
チュートリアルにでてる画面に変わらなくて当然・・・なのか?
気を取り直して、チュートリアル再開。
askeet/apps/frontend/config/routing.ymlのhomepage: セクションを変更します。
homepage:
url: /
param: { module: question, action: list }
そして考えずブラウザをリロードすると、今度は画面が変わりましたね。
キャッシュのクリアとかは必要ないようです。
なのですが、askeetイメージが表示されていないのでSVNリポジトリから持ってきて、askeet/web/imagesにコピーしておきましょう。
テストデータの定義
まずはテストデータの作成。
askeet/data/fixturesディレクトリを作成して、test_data.ymlファイルを作成してチュートリアルにある内容を保存。
データを設定する為のバッチ作成
続いて定義したデータをロードするためのバッチファイルを作成。
ここも特に考えることはなさそうです。
sfDatabaseManagerインスタンスを生成して、initializeメソッドをコール。
sfPropelDataインスタンスを生成して、さっき作成したaskeet/data/fixturesディレクトリを引数にloadDataメソッドをコールということですね。
バッチファイルができたらコマンドラインからバッチファイルを実行して、ブラウザをリロードしてみると・・・。
定義したデータがDBに登録されて、ページに反映されていますね。
モデル内でのデータアクセス
モデルの説明を読んだら、テンプレートを変更です。
askeet/apps/frontend/modules/question/templates/listSuccess.phpをtableからdivに変更するわけですね。
そしてブラウザをリロードすると変更が反映されました。
チュートリアルではその後に、main.cssをダウンロードしてとか書いてありますけど、これはさっきダウンロードしましたよね。
クリーンアップ
つかわないファイルや関数があるから消しとけーと。そういうことみたいです。
このチュートリアルはSVNでバージョン管理してますから、言われたとおりに消しておきましょう。
はい、ここまで完了したら後はお手本にならってrelease_day_3タグをうって本日のダイブを終了いたしましょう。