シンプル&パワフルなPHPライブラリ rhacoを使ってみよう!

第5回 Viewsで開発をもっと手軽に

この記事を読むのに必要な時間:およそ 2.5 分

継承可能なテンプレート

rhacoでは,テンプレートに「継承(extends⁠⁠」という機能があります。PHPのクラスを継承するのと同様にして,ベースとなるテンプレートを継承することで,内容を変更したい部分だけを記述するといったことが可能になります。

それでは,作成したテンプレート(list.html)を継承に対応させてみましょう。継承先のテンプレートで書き換えたい部分を <rt:block> タグで囲います。

resources/template/list.html(変更点のみ)

...(snip)...
<body>
  <h1>todo manager</h1>
  <rt:block name="content">
...(snip)...
  </rt:block>
</body>
...(snip)...

次にテンプレートを作成しますが,Viewsの規則にしたがったファイル名にすることで,コードに変更を加えずにテンプレートを切り替えることができます。

createに対応するフォームのテンプレートは,⁠resources/template/generic/モデル名_form.html」となります。

resources/template/generic/todo_form.html

<rt:extends href="../list.html" />
<rt:block name="content">
  <form action="{$rhaco.uri()}" method="post">
    <dl>
    <rt:loop param="{$object.models('views','form_display')}" var="column">
      <rt:if param="{$column.isSerial()}">
        {$viewutil.columnString($object,$column)}
      <rt:else />
        <dt>{$object.label($column)}</dt>
        <dt>{$viewutil.columnString($object,$column,true,true,'views')}</dt>
      </rt:if>
    </rt:loop>
    </dl>
    <input type="submit" name="save_create" value="{$generic_button}" />
  </form>
</rt:block>

このテンプレートでは,list.htmlを継承して,<rt:block>の⁠content⁠の部分のみを置き換えるコードです。テンプレートのコード自体は,rhaco本体に含まれるものを多少シンプルにしただけです※1⁠。

これを表示すると,list.htmlの⁠content⁠部分のみが置き換えられていることがわかります。

画像
※1

/path/to/rhaco/resources/templates/generic/views/form.html

入力エラーを表示する

現在までのコードでは,subjectが空のままでtodoが登録されてしまいます。このままだと,何のことかまったくわからないTODO管理アプリになってしまうので,対策してみます。

rhacoでは,モデルに対してverifyが自動的に行われます。モデル定義はすべて setup/project.xml で行うということは第3回で説明したとおりです。setup/project.xml のsubjectカラムにrequire属性を追加してみます。

setup/project.xml(抜粋/変更前)

<column name="subject" />

setup/project.xml(抜粋/変更後)

<column name="subject" require="true" />

project.xmlの変更を適用するには,再びsetup.phpにアクセスして,ページ下部の[setting]をクリックします。このとき,設定を変更する必要はありません。

これで,subjectが必須項目になりました。ためしに,さきほど作成したフォームを空のまま[create]すると,再びフォームに戻されるようになります。しかし,これでは何がエラーなのかわかりにくいですね。

次にエラーを表示させてみましょう。モデルで発生したエラーは,rhacoによって疑似的に例外がthrowされています。これは,PHP4でも動作するように,PHP5の例外機能は使用していません。

resources/template/generic/todo_form.html の <rt:block name="content"> のすぐ下に <rt:invalid /> と記述します。

この状態で,再びフォームを空のまま[create]すると,⁠subject is required.」と表示されることが確認できます。

画像

まとめ

今回はViews(汎用ビュー)機能を紹介しました。紹介したread,createメソッドのほかにdetail,update,confirmedCreate,confirmedUpdateといったメソッドも実装されています。引数については,rhaco-users.jp のドキュメントAPIなどで確認できるので,ぜひ試してみてください。

次回は,URL構造を奇麗にする Urls を紹介する予定です。

著者プロフィール

佐藤佳祐(さとうけいすけ)

北海道の大学に在籍し,現在は絶賛就職活動中。nequalに所属し,PEARリポジトリサービス「Openpear」開発を担当。最近はrhaco2と格闘する日々。お仕事の話,待ってます。

URLhttp://riaf.jp/