askeet Day5-1

さて、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アクションが表示に使われるということです。さぁ、アクションに戻りましょう。

んーむ、一気に進むのが遅くなりましたね・・・。
まぁ、約を作りながらだから仕方ないか。急ぐものではないですから、ゆっくりすすめていきましょう。

Category: PHP | Posted on: 2007/05/16 11:50 | Viewed: 2004

Comments

2007/05/16, 15:13 umi wrote:

いえいえ、遅くなる原因は違うところに。。。
ごめんなさい。一日も早く元気になるよう努力します。

2007/05/18, 12:16 delfino wrote:

やー、別にそんなことないですよ。
本当に訳を作るのに時間がかかるだけです。
元気になってもらうのはいいことですけど。

2007/05/19, 07:54 courant wrote:

askeetとDefinitive Guide to symfonyは全訳されており、来週下翻訳を公開する予定です。品質はあまりよくないので結局原典を読むことになりますが。

2007/05/21, 09:55 delfino wrote:

courantさん、情報ありがとうございます。
これでsymfonyの敷居が低くなりそうですね。

>品質はあまりよくないので結局原典を読むことになりますが。
5日目までaskeetのチュートリアルを試してみましたが、チュートリアルどおりには行かない所もありますし、原文を参考にしたり自分で試行錯誤しながら進めていく上で身についてくることで理解が深まるんだと思います。
文章を忠実に翻訳すると、日本語にはならないようなところもありますし。
期待しながら待たせていただきます。

Add Comment

:

:
:

TrackBacks

このエントリにトラックバックはありません

TrackBack URL

http://www.azul.systems-noel.jp/trackback/item_10.html