blogチュートリアル(8) ビューの作成

このステップでは、レスポンスをHTMLに整形するためのビューを作成します。

このステップが終わると、ようやく投稿記事の一覧画面を表示できるようになります。

indexSuccess.phpファイルの編集

apps/frontend/modules/post/templates/indexSuccess.phpファイルを開き、以下のように編集して下さい。

<h1>Blog posts</h1>
<table>
  <tr>
    <th>Id</th>
    <th>Title</th>
    <th>Actions</th>
    <th>CreatedAt</th>
  </tr>
 
  <!-- ここから、$posts配列をループして、投稿記事の情報を表示 -->
 
  <?php foreach ($posts as $post): ?>
  <tr>
    <td><?php echo $post->getId() ?></td>
    <td>
      <?php echo link_to($post->getTitle(), 'post/edit?id=' . $post->getId()) ?>
    </td>
    <td>
      <?php echo link_to('編集', 'post/edit?id=' . $post->getId()) ?>
      <?php echo link_to('削除', 'post/delete?id=' . $post->getId(),
                         array('confirm'=>'id=' . $post->getId() . 'のデータを削除してもよろしいですか?')) ?>
    </td>
    <td><?php echo $post->getCreatedAt() ?></td>
  </tr>
  <?php endforeach; ?>
 
</table>
<?php echo link_to('新規追加', 'post/new') ?>
<?php if ($flash = $sf_user->getFlash('info')): ?>
<?php echo $flash ?>
<?php endif ?>
 

ファイルの文字コードはUTF-8で保存してください。

$posts変数をループで処理している点はCakePHPと同じです。 しかし、$posts変数の中に格納されているのがレコードを表すオブジェクトになっている点が大きく異なります。したがって、レコードのIDやタイトルを取得するには以下のようにオブジェクトのメソッドを使用します。

  • idフィールド: $post->getId()
  • titleフィールド: $post->getTitle()
  • created_atフィールド: $post->getCreatedAt()

データベースのフィールド名と、アクセサメソッド名の対応はお分かりでしょうか。フィールド名は「小文字+アンダースコア」で、対応するアクセサ名は、アンダースコアを削除し、各パートの先頭文字を大文字にしたものになっています。

link_toヘルパー

ビューでリンクを記述する場合、symfonyではlink_toヘルパーを使用します。 link_toヘルパーの詳細は、『The Definitive Guide to symfony 1.2 第9章 リンクとルーティングシステム』を参照してください。

編集や削除のリンクを作成するコードで、link_toヘルパーの2つめの引数に内部URLと合わせてidパラメーターを追加しています。

ブラウザで確認

ビューのファイルを保存したら、ブラウザで「http://localhost/sf_sandbox/web/frontend_dev.php/post/index」にアクセスしてみてください。 この時点では、最初にfixtureで登録した3件のレコードがリストに表示されればOKです。

アクセスするURLは、お使いの環境に合わせて適宜読み替えて下さい。

TIP 表示された各行の編集や削除のリンクがどのようなURLになっているのかも確認してみてください。

ここまでの規約

アクションとビューのファイルを作成してブラウザでアクセスすると表示されましたが、 URLに対するアクションの関連づけ、アクションに対するビューファイルの関連づけは特に設定など行っていませんでした。 実際、これらは設定する必要はほとんどなく、以下のようなフレームワークのデフォルトルール(規約)に従って自動的に関連づけられています。

  • /(モジュール名)/(アクション名)というURLに対して、該当するモジュール、アクションをマッピング
    • ルーティングという機能のデフォルト設定。カスタマイズできます。
  • executeIndex(indexアクション)に対して、同一モジュールのtemplatesフォルダ内のindexSuccess.phpというビューファイルをマッピング
    • (アクション名)Success.php など。アクションの戻り値でエラーテンプレートなど使い分けられます。アクションで何も戻り値を戻さない場合はSuccessサフィックスのついたテンプレートとなります。