トップ  > symfony  > フォーム  > 記事

No.1382 sfFormのレンダリングにカスタムフォーマッタを使用する

sfFormのレンダリングにカスタムフォーマッタを使用するAdd Star

symfonyのフォームライブラリsfFormを使ってフォームを表示する場合、フォームの各要素はデフォルトではテーブルの行として以下のようなHTMLタグで出力されます。

<tr>
  <th><label for="login_login_name">Login name</label></th>
  <td><input type="text" name="login[login_name]" id="login_login_name" /></td>
</tr>

フォーマッタは、デフォルトの「table」以外に「list」も用意されています。

(これらはそれぞれ、sfWidgetFormSchemaFormatterTableとsfWidgetFormSchemaFormatterListに対応します)

フォーマットをlistに変更するには、フォームの設定を行っている部分で以下のようにします。

<?php
class LoginForm extends sfForm {
  public function setup() {$this->widgetSchema->setDefaultFormFormatterName('list');
    :

こうすると、次のようなHTMLタグで出力されます。

<li>
  <label for="login_login_name">Login name</label>
  <input type="text" name="login[login_name]" id="login_login_name" />
</li>

出力されるタグのカスタマイズ

さて、出力されるタグを、独自クラスを指定したdivタグに変更する場合はどうするのでしょうか。

公式のドキュメント(Forms in Action)では、「テンプレートのカスタマイズ」のやり方しか書かれていません。

この方法ではテンプレートに直接フォーム要素を埋め込んでいくので、デザインに対しては柔軟になるのですが、フォーム要素を追加したり変更したりする場合にはテンプレートも合わせて修正しなくてはならないので、開発効率はかなり低下します。


フォーマッタの出力とテンプレートのカスタマイズの中間くらいのことをやりたいですよね。


そこで、sfWidgetFormSchemaFormatterListクラスを真似た、myWidgetFormSchemaFormatterDivクラスを次のように作成します。

<?php
class myWidgetFormSchemaFormatterDiv extends sfWidgetFormSchemaFormatter
{
  protected
    $rowFormat       = "<div class=\"formrow\">%error%%label%%field%%help%%hidden_fields%</div>\n",
    $errorRowFormat  = "<div class=\"error\">%errors%</div>\n",
    $helpFormat      = '<div class="help">%help%</div>',
    $decoratorFormat = "<div class=\"formcontent\">\n%content%\n</div>\n";
}

このフォーマッタを使用するために、formクラスのsetupメソッドで、次のようにフォーマッタを追加してデフォルトに設定します。

<?php
class LoginForm extends sfForm
{
  public function setup()
  {$this->widgetSchema->addFormFormatter('div', new myWidgetFormSchemaFormatterDiv($this->widgetSchema));
    $this->widgetSchema->setDefaultFormFormatterName('div');
    :

こうすると、myWidgetFormSchemaFormatterDivクラスのフォーマット設定でフォームがレンダリングされます。

<div class="formrow"><label for="login_login_name">Login name</label>
<input type="text" name="login[login_name]" id="login_login_name" /></div>

sfWidgetFormSchema::setFormFormatterNameを使用する場合の注意

上のサンプルコードではsetDefaultFormFormatterNameメソッドでフォーマッタを変更しましたが、同じような機能を持つsetFormFormatterNameメソッドがあります。

こ の2つの違いは、クラスのスタティック変数としてフォーマッタ名を保存するか、インスタンスのメンバ変数として保存するかです。1つの画面で複数のフォー ムオブジェクトを使用し、それぞれで別のフォーマッタを利用したい場合は、setFormFormatterNameを使用するということですね。

引用元

更新:2009/08/26 09:19 カテゴリ: symfony  > フォーム ▲トップ

FuelPHP

Mac

フロントエンド開発

web開発

プロマネ

マネタイズ

プレゼン

webサービス運用

webサービス

Linux

サーバ管理

MySQL

ソース・開発

svn・git

PHP

HTML・CSS

JavaScript

ツール, ライブラリ

ビジネス

テンプレート

負荷・チューニング

Windows

メール

メール・手紙文例

CodeIgniter

オブジェクト指向

UI・フロントエンド

cloud

マークアップ・テキスト

Flash

デザイン

DBその他

Ruby

PostgreSQL

ユーティリティ・ソフト

Firefox

ハードウェア

Google

symfony

OpenPNE全般

OpenPNE2

Hack(賢コツ)

OpenPNE3

リンク

個人開発

その他

未確認

KVS

ubuntu

Android

負荷試験

オープンソース

社会

便利ツール

マネー

Twig

食品宅配

WEB設計

オーディオ

一般常識

アプリ開発

Python

サイトマップ

うずら技術ブログ

たませんSNS

rss2.0