symfony askeet Day5

フォームとページャ

  • ログインフォーム
  • 質問ページャ

ログインフォーム

まずはsign inというリンクを張る。
frontendのtemplatesのlayout.php

  <div id="header">
    <ul>
      <li><?php echo link_to('about', '@homepage') ?></li>
      <li><?php echo link_to('sign in', 'user/login') ?></li>
    </ul>
    <h1><?php echo link_to(image_tag('askeet_logo.gif', 'alt=askeet'), '@homepage') ?></h1>
  </div>

書いてて思うのはやっぱり楽ですね、link_toだけで呼べちゃうのは。
で、userというモジュールを作るらしいので

symfony init-module frontend user

lsで確認してみると

$ ls -la apps/frontend/modules/
total 0
drwxr-xr-x  5 shota  staff  170  6 26 10:48 .
drwxr-xr-x  8 shota  staff  272  6 25 18:38 ..
drwxr-xr-x  8 shota  staff  272  6 26 10:35 .svn
drwxr-xr-x  5 shota  staff  170  6 25 18:54 question
drwxr-xr-x  7 shota  staff  238  6 26 10:48 user
$ ls -la apps/frontend/modules/user/
total 0
drwxr-xr-x  7 shota  staff  238  6 26 10:48 .
drwxr-xr-x  5 shota  staff  170  6 26 10:48 ..
drwxr-xr-x  3 shota  staff  102  6 26 10:48 actions
drwxr-xr-x  2 shota  staff   68  6 26 10:48 config
drwxr-xr-x  2 shota  staff   68  6 26 10:48 lib
drwxr-xr-x  3 shota  staff  102  6 26 10:48 templates
drwxr-xr-x  2 shota  staff   68  6 26 10:48 validate

できてますね、とりあえずtemplates内にあるindexSuccess.phpがいらないらしいので削除しちゃいます。
削除が終わったらactions内にあるaction.class.phpを開いて
まず、

  /**
   * Executes index action
   *
   */
  public function executeIndex()
  {
    $this->forward('default', 'module');
  }

こいつ↑を削除する。
削除が終わったらアクションを追加する。

  public function executeLogin()
  {
    $this->getRequest()->setAttribute('referer', $this->getRequest()->getReferer());
    
    return sfView::SUCCESS;
  }

説明によるとrefererを取得してloginSuccess.phpに結果を渡すと。
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>

input_tagだけでinputタグが作られると。
これは便利。あとはloginアクションを書き換えるだけ。
詳しい説明はaskeetを読むとして
これでユーザーの存在確認とUserテーブルをリクエストできるようになったと。
次に、ログインをしたらログアウトもしなければということで実装。
実装後、anonymousでログインしてみると

ほうほう、自分で1から書いていたときはものすごいコードになって
結果スパゲティになってたのでsymfonyすごいなーとか思いました。

質問ページャ

とんとんとんっと進んでいくので思わず書くこと無いなと思いましたが
以前ページャを使ったときはPEAR::Pagerを使ったのにややこしいなと思ったので
さくさくっと進んでしまうのには正直驚きです。

リファスタリング

今まで書いてきたQuestion内のアクションはモデル側なので
モデルに移設するとあります。適したところにコードを置くということですね。