忍者ブログ

uthorofotus iruc

プログラムを組むために考えたり憶えたりした、いろいろなことを記録していきます。タイトルの読みは「ウソロフォトス イルーク」

[21]  [20]  [19]  [18]  [17]  [16]  [15]  [14]  [13]  [12]  [11

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

askeet day seven:model and view manipulation の解説

askeetチュートリアルの7日目『モデルとビューに手を加える』です。

7日目の日本語版はまだ無いようです。有志の翻訳状況はこちらです。本家英語版はこちらです。

■これまでのsymfony(Previously on symfony)
symfonyでは新しいページを簡単に作れることを証明するために、7日目は多くのページを作成します。最近投稿された質問のリスト、最近投稿された回答のリスト、ユーザのプロフィール、それらの機能へのナビゲーションリンク追加をします。

■プレファクタリング(Prefactoring)
プレファクタリングはKen Pughという人の造語です。コードを書く前にリファクタリングをすることのようです。

ページャーのナビゲーションは、他のページでも使うのでライブラリ化しておきます。前は次のページへ、前のページへの部分は文字でしたが、画像を使うように変わっています。その画像ファイルをSubversionから取得しておきます。/tags/release_day_7/には無かったので/trunk/からダウンロードします。

cd web/images/
wget http://svn.askeet.com/trunk/web/images/first.gif
wget http://svn.askeet.com/trunk/web/images/previous.gif
wget http://svn.askeet.com/trunk/web/images/next.gif
wget http://svn.askeet.com/trunk/web/images/last.gif
cd ../../

今作成したヘルパーを使って、questionモジュールの_list.phpパーシャルを修正します。チュートリアルではuse_helpersを使っていますがエラーが出ますので、use_helper(sがつかない)を使います。

<?php use_helper('Text', 'Global') ?>

■最近投稿された質問の一覧(List of the recent questions)
質問データを取得するにはデータベースにアクセスするので、QuestionPeerクラスにメソッドを設定します。そのメソッドを使うようにquestionモジュールにアクションとテンプレート、ルーティング設定も追加します。

Peerメソッドで、データを取得する際にaddDescendingOrderByColumnメソッドを使うことにより、投稿順で質問データを取得できるようになります。self::CREATED_ATというのが、questionのcreate_at(作成日時)を指します。これはpropel-build-modelで生成されるBaseQuestionPeer.phpにて定義されています。setPeerMethodで指定するデータ取得メソッドにはdoSelectJoinUserを使っています。getHomepagePagerもそうでしたが、質問を投稿したユーザ(user_idで関連付けられる)のデータもビューで使用するため、JOIN句で一緒にデータを取得しておくためです。
最近投稿された質問の一覧

■最近投稿された回答の一覧(List of the recent answers)
まずはAnswerモジュールを作ります。indexアクションは使わないので、アクションクラスのexecuteIndexとテンプレートのindexSuccess.phpは消します。ここでもテンプレート内のuse_helpersをuse_helperに直します。
最近投稿された回答の一覧

■ユーザのプロフィール(User profile)
回答の投稿者がuser/showアクションへのリンクになっています。これはユーザのプロフィールが見れる機能です。UserモジュールにshowアクションとshowSuccess.phpテンプレートを作成します。
プロフィールページでは、そのユーザが投稿した質問、投稿した回答、興味を持った質問が表示されますので、JoinQuestion(回答/興味に関連する質問内容も表示するため)付きメソッドで取得しておきます。
作ったページを見る際、id/1だとanonymousユーザのページになってしまうので、http://askeet/frontend_dev.php/user/show/id/2 の方が良いでしょう。
ユーザのプロフィール

question/templates/_list.phpに、質問の投稿者と投稿日時を表示するように修正しますが、その際、特に_list.phpはDateヘルパーを読み込む必要があることに気を付けてください。チュートリアルで指示されたコードはformat_dateヘルパー関数を使っています。

<?php use_helper('Text', 'Global', 'Date') ?>

■ナビゲーションバーの追加(Add a navigation bar)
ナビゲーションバーの表示にはコンポーネントスロットというテンプレートの部品化機能を使います。コンポーネントスロットは、コンポーネント+スロットという2つの機能を合わせた物です。コンポーネントは、アクションとそれに対応するテンプレートをまとめて部品化した物です。スロットは、設定ファイルで指定(view.yml)したパーシャルをテンプレートで指定されたエリアに埋め込む機能です。コンポーネントスロットになると、スロットで埋め込む部品にコンポーネントを使用します。これらの詳細については、SymfonyBookのViewの項目を見てください。

▽レイアウトにコンポーネントを追加する(Add the component in the layout)
コンポーネントと言っていますが、本当はコンポーネントスロットを埋め込んでいます。<div id="content_bar">の代わりにinclude_component_slotというヘルパー関数を埋め込みます。

▽コンポーネントに対応するアクションの定義(Define what action goes into the component)
サイト全体にナビゲーションバーを付けますので、app/frontend/config/view.ymlにコンポーネントスロットで使うアクションを指定します。ここで指定するキー名は、先ほどのレイアウトテンプレートでinclude_component_slot関数の引数にした文字列です。ここで設定したアクションの指定は、モジュール:sideber アクション:defaultとなります。もし別のアクションを使いたければ、モジュールディレクトリ以下のconfig/view.ymlを編集するなどして、このdefault設定を上書きすればよいです。

▽sidebar/defaultアクションとテンプレートの記述(Write the sidebar/default action and template)
sidebarモジュールを作成して、コンポーネント用のdefaultアクションを追加します。例によってindexアクションとテンプレートは使用しないので消しておきます。コンポーネント用のアクションは、actionsディレクトリのcomponents.class.phpに変わります。テンプレートも、ファイル名が_default.phpと _+(アクション名)になるので注意してください。

■もうちょっとだけビューを設定(A little more view configuration)
レイアウトテンプレートにはヘッダのmetaを指定する部分はありません。include_metas/include_http_metas関数を使って、view.ymlで設定した内容を表示します。
もし、アクションなどでページタイトルを指定したい場合は、sfWebResponseクラス(getResponse)のsetTitleメソッドを使います。

■今までしてきたことを振り返る(Look at what we have done)
PHP-docのコメントを付けた方がいいかもしれないけど、symfonyのクラス/メソッドの名前は分かりやすいからなくても理解しやすいでしょう。テンプレートもforeachとifしか使っていないので意味が理解出来るはずです。それが、Subversionにあるコードにドキュメントが含まれていない理由です。

ここで作業の手を一旦止めて、データベーススキーマのリレーション図、各モジュールのアクション、各モデルのメソッドがどうなっているかを再確認します。

■また明日(See you Tomorrow)
8日目はログイン処理と質問への興味宣言(=お気に入りリスト入り)をAjax化します。

PR

この記事にコメントする

お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字

この記事へのトラックバック

この記事にトラックバックする:

askeet day eight:AJAX interactions の解説 HOME askeet day six:security and form validation の解説

プロフィール

HN:
flyfront
性別:
非公開
自己紹介:
PHPプログラマ。東京でsymfonyな仕事してます。

Wassr

カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

最新コメント

[01/02 通りすがり]
[10/18 flyfront]

バーコード

アクセス解析

忍者ブログ [PR]
Template by repe