さて、askeetを4日目まで進めてきましたが、5日目以降は今のところ日本語訳がないみたいですね。
仕方ないのでへろへろ日本語訳をしながらすすめていくことに致しましょう。
訳を作りながらになりますから、進捗は大幅に遅れるものかと思われます。
symfony アドベントカレンダ 5日目
フォームとページャ
前回までのsymfony
長い4日目で、あなたは、コードの断片をその本質により関連のある別のファイルに移すことで、あなたのアプリケーションをリファクタリングすることに慣れました。あなたはまた、データに関連する共通のメソッドをアクションコードから取り出すことでモデルを修正することも学びました。
開発はクリーンですが、機能の一部は乏しいままです。askeetサイトとユーザ間に多少の対話性を与える時間です。そしてHTMLの対話性の根本は-ハイパーリンクの他に-フォームです。
今日の目標はユーザにログインを許可することとホームページにある質問のリストにページ番号をつけることです。これは開発するには時間が短いでしょうが、あなたを昨日から回復させるでしょう。
ログインフォーム
テストデータにはユーザ情報がありますが、アプリケーションには承認する方法がありません。アプリケーションの全てのページからログインフォームにアクセスさせましょう。グローバルレイアウトaskeet/apps/frontend/templates/layout.phpを開いてaboutへのリンクの前に以下の行を追加してください。
<li><?php echo link_to('sign in', 'user/login') ?></li>
現在のレイアウトのこのリンクの箇所はちょうどウェブデバッグツールバーの下にあります。これを見る為にはSfアイコンをクリックしてツールバーを格納してください。
そしてユーザモジュールを作成する時間です。2日目でクエスチョンモジュールを生成した時のように、今回はsymfonyにモジュールスケルトンを作るよう依頼して、私達は自身のコードを書きます。
$ symfony init-module frontend user
スケルトンはdefault indexアクションとindexSuccess.phpを含んでいます。どちらも必要ではないので取り除いてください。
(訳注:apps/frontend/modules/user/actions/actions.class.phpのexecuteIndex()関数を削除して、apps/frontend/modules/user/templates/indexSuccess.phpファイルを削除するということです。)
user/loginアクション作成
user/actions/action.class.phpファイル(askeet/apps/frontend/modules/ディレクトリ以下の)に以下のログインアクションを追加してください。
public function executeLogin()
{
$this->getRequest()->setAttribute('referer', $this->getRequest()->getReferer());
return sfView::SUCCESS;
}
このアクションはリファラをリクエスト属性に保存します。これはテンプレートにhiddenフィールドの送信を可能にします。そしてこのフォームのターゲットアクションは、ログイン成功後に元のリファラへリダイレクトすることができます。
sfView::SUCCESSの戻り値はこのアクションの結果をloginSuccess.phpテンプレートに渡します。このステートメントは戻り値を含まないアクションとして暗に含みます。それはあるアクションのデフォルトテンプレートがアクション名Success.phpを呼び出す理由です。
動作にさらに取り組む前に、テンプレートを見ましょう。
loginSuccess.phpテンプレート作成
ウェブにおける多くのコンピュータと人の対話がフォームを使用します。symfonyは、フォームヘルパを提供して、フォームの生成と管理を容易にします。askeet/apps/frontend/modules/user/templates/ディレクトリに以下のloginSuccess.phpテンプレートを作成してください。
<?php echo form_tag('user/login') ?>
<fieldset>
<div class="form-row">
<label for="nickname">nickname:</label>
<?php echo input_tag('nickname', $sf_params->get('nickname')) ?>
</div>
<div class="form-row">
<label for="password">password:</label>
<?php echo input_password_tag('password') ?>
</div>
</fieldset>
<?php echo input_hidden_tag('referer', $sf_request->getAttribute('referer')) ?>
<?php echo submit_tag('sign in') ?>
</form>
このテンプレートはフォームヘルパに対するあなたの最初の紹介です。これらのsymfonyの関数はフォームタグ出力を自動化することを手伝います。form_tag()ヘルパはフォームをデフォルトでPOSTでオープンします、そして引数として与えられたアクションをポイントします。input_tag()ヘルパは、自動的に第1引数として与えられた名前をID属性として、第2引数を初期値として<input>タグを提供します。(それは驚きです。)あなたはフォームヘルパとフォームヘルパが生成するHTMLコードについてより多くのことをsymfony bookの関連した章で見つけられます。
ここでの重要なことは、フォームが送信されたときに呼ばれるアクション(form_tag()の引数)は同じloginアクションが表示に使われるということです。さぁ、アクションに戻りましょう。
んーむ、一気に進むのが遅くなりましたね・・・。
まぁ、約を作りながらだから仕方ないか。急ぐものではないですから、ゆっくりすすめていきましょう。