Caution: You are browsing the legacy symfony 1.x part of this website.
Cover of the book Symfony 5: The Fast Track

Symfony 5: The Fast Track is the best book to learn modern Symfony development, from zero to production. +300 pages showcasing Symfony with Docker, APIs, queues & async tasks, Webpack, SPAs, etc.

付録 A - ウィジェット

1.2
Symfony version
1.4
Language

はじめに

symfony フォームフレームワークはたくさんの便利なウィジェットを搭載してやってきます。 これらのウィジェットはたいていのプロジェクトの共通のニーズをカバーします。 この章では symfony に搭載されたデフォルトのフォームウィジェットを説明します。 sfFormExtraPluginsfPropelPluginsfDoctrinePlugin プラグインからもいくつかのフォームウィジェットが含まれます。 これらのプラグインはコアチームによってサポートされとても便利なウィジェットをいくつか含みます。

tip

symfony MVC フレームワークを使わない場合でも、プロジェクトのどこかに widget/ ディレクトリを設置することで sfFormExtraPluginsfPropelPluginsfDoctrinePlugin プラグインで定義されたウィジェットを利用できます。

それぞれのウィジェットの詳細内容に飛び込む前に、ウィジェットが共通に持つ機能を見てみましょう。

sfWidget 基底クラス

すべての symfony ウィジェットは sfWidget 基底クラスを継承します。 この基底クラスはいくつかのデフォルト機能をすべてのウィジェットに提供します。

デフォルトでは、すべてのウィジェットは XHTML としてレンダリングされます。 setXhtml() メソッドを呼び出せば HTML に切り替えられます:

sfWidget::setXhtml(false);

ウィジェットシステムはエスケープされた HTML 属性と気の利いた内容で自動的に構成されます。 効率よくするには、システムにプロジェクトで使用される文字セットを伝えることが必要です。 デフォルトでは文字セットは UTF-8 で、setCharset() メソッドを呼び出すことで文字セットを設定できます:

sfWidget::setCharset('ISO-8859-1');

note

symfony MVC フレームワークで symfony ウィジェットを使う場合、settings.yml の charset に従って文字セットは自動的に設定されます。

ウィジェットが JavaScript ファイルもしくは/かつスタイルシートに依存する場合、getJavaScripts()getStylesheets() メソッドをそれぞれオーバーライドできます:

class Widget extends sfWidget
{
  public function getStylesheets()
  {
    // 配列のキーはファイルで
    // 値はコロン(,)で分割されたメディアの名前
    return array(
      '/path/to/file.css' => 'all',
      '/another/file.css' => 'screen,print',
    );
  }
 
  public function getJavaScripts()
  {
    return array('/path/to/file.js', '/another/file.js');
  }
}

sfWidgetForm 基底クラス

このセクションでは、フォームウィジェットだけを説明します。 これらすべては sfWidgetForm 基底クラスを継承し、追加のデフォルト機能をいくつか提供するためにこの基底クラスは sfWidget クラスを継承します。

ウィジェットを作るとき、追加の引数としてオプションと HTML 属性を渡すことができます:

$w = new sfWidgetFormInput(
  array('default' => 'Fabien'),
  array('class' => 'foo')
);

オプションと HTML 属性は setOptions()setAttributes() メソッドを使うことでも設定できます:

$w = new sfWidgetFormInput();
$w->setOptions(array('default' => 'Fabien'));
$w->setAttributes(array('class' => 'foo'));

setOption()setAttribute() メソッドによって個別のオプションもしくは HTML 属性を設定できます:

$w = new sfWidgetFormInput();
$w->setOption('default', 'Fabien');
$w->setAttribute('class', 'foo');

render()メソッドを呼び出すことでウィジェットをレンダリングできます:

$w->render('name', 'value', array('class' => 'foo'));

render() メソッドは次の引数をとります:

  • ウィジェットの名前
  • ウィジェットの値
  • オプションのいくつかの HTML 属性 (これらはコンストラクションが行われるときに 定義されたデフォルトにマージされます)

note

ウィジェットはステーレスなので、単独のウィジェットインスタンスは望む限りの異なる数の引数だけレンダリングできます。

上記のウィジェットは次のようにレンダリングします:

<input class="foo" type="text" name="bar" id="bar" value="value"/>

sfWidgetForm で定義されるデフォルトのオプションは次のとおりです:

オプション 説明
is_hidden フォームウィジェットが hidden であることが必須であれば true そうでなければ false (デフォルトは false)
needs_multipart ウィジェットがマルチパートフォームを必要とするのであれば true、そうでなければ false (デフォルトは false)
default ウィジェットをレンダリングする際に使うデフォルト値
label ウィジェットがウィジェットスキーマによってレンダリングされるときに使うラベル
id_format 生成される HTML id 属性用のフォーマット (デフォルトは %s)

note

デコレーションなしで隠しウィジェットをレンダリングするためにウィジェットフォームスキーマクラスが is_hidden オプションを使います。 form タグがレンダリングされるときに enctype="multipart/form-data" 属性を追加するためにフォームクラスが needs_multipart オプションを使います。

sfWidgetForm クラスはすべてのオプションに対してアクセサーメソッドも提供します:

  • is_hidden: isHidden()setHidden()
  • needs_multipart: needsMultipartForm()
  • default: getValue()setValue()
  • label: getLabel()setLabel()
  • id_format: getIdFormat()setIdFormat()

ウィジェットスキーマ

フォームウィジェットスキーマは1つもしくはいくつかの別のウィジェット用のラッパーウィジェットです。

次のセクションでは、ウィジェットは複数のカテゴリに再分類されます。

ウィジェット

入力ウィジェット

sfWidgetFormInput

input タグはおそらくもっともシンプルなフォームタグで sfWidgetFormInput クラスによって表現されます。

オプション 説明
type HTML type 属性の値(デフォルトは text)
$w = new sfWidgetFormInput();
echo $w->render('foo');
 
# <input type="text" name="foo" id="foo" />

sfWidgetFormInputCheckbox

sfWidgetFormInputCheckboxtypecheckbox である入力ウィジェットです。

$w = new sfWidgetFormInputCheckbox();
echo $w->render('foo');
 
# <input type="checkbox" name="foo" id="foo" />

sfWidgetFormInputHidden

sfWidgetFormInputHiddentypehidden である入力ウィジェットです。 is_hidden オプションは true にセットされます。

$w = new sfWidgetFormInputHidden();
echo $w->render('foo');
 
# <input type="hidden" name="foo" id="foo" />

sfWidgetFormInputPassword

sfWidgetFormInputPasswordtypepassword である入力ウィジェットです。

$w = new sfWidgetFormInputPassword();
echo $w->render('foo');
 
# <input type="password" name="foo" id="foo" />

sfWidgetFormInputFile

sfWidgetFormInputFiletypefile である入力ウィジェットです。 needs_multipart オプションは自動的に true にセットされます。

$w = new sfWidgetFormInputFile();
echo $w->render('foo');
 
# <input type="file" name="foo" id="foo" />

sfWidgetFormInputFileEditable

sfWidgetFormInputFileEditable は入力ファイルウィジェットで、以前アップロードされたファイルを表示もしくは削除する機能を追加するために、sfWidgetFormInputFile ウィジェットを拡張します。

オプション 説明
file_src 現在の画像の web ソースのパス(必須)
edit_mode ブール値: 編集モードを有効にするには true、そうでなければ false
is_image ファイルが表示可能なファイルであるかどうか
with_delete 削除のチェックボックスを追加するかどうか
delete_label テンプレートによって使用される削除ラベル
template このウィジェットをレンダリングするために使用する HTML テンプレート
利用可能なプレースホルダー:
* input (画像のアップロードウィジェット)
* delete (削除のチェックボックス)
* delete_label (削除ラベルのテキスト)
* file (ファイルタグ)

caution

edit モードにおいて、このウィジェットは「_delete」を接尾辞とするファイルアップロードウィジェットから名づけられた追加ウィジェットをレンダリングします。 ですので、フォームを作る際には、この追加フィールド用のバリデーターを追加することをお忘れなく。

sfWidgetFormTextarea

sfWidgetFormTextarea ウィジェットは必須の HTML の rowscols 属性に対して自動的にデフォルト値を設定します。

$w = new sfWidgetFormTextarea();
echo $w->render('foo');
 
# <textarea rows="4" cols="30" name="foo" id="foo"></textarea>

sfWidgetFormTextareaTinyMCE

WYSIWYG エディタウィジェットをレンダリングしたい場合、sfWidgetFormTextareaTinyMCE を使用できます:

$w = new sfWidgetFormTextareaTinyMCE(
  array(),
  array('class' => 'foo')
);

caution

このウィジェットは symfony の sfFormExtraPlugin プラグインの一部です。

プラグインにはTiny MCE の JavaScript ファイルが搭載されていないので、自分でインストールして含めなければなりません。

オプション 説明
theme Tiny MCE のテーマ (デフォルトは advanced)
width
height 高さ
config JavaScript 固有の設定の配列

選択ウィジェット

選択の表現

ユーザーに選択可能なもののリストから選択を行わせたい場合、HTMLは選択を表現する方法をいくつか提供します:

  • select タグ:

    ドロップダウンリスト

  • multiple 属性を持つ select タグ:

    ドロップダウンボックス

  • ``typeradioであるinput` タグのリスト:

    ラジオボタンのリスト

  • typecheckbox である input タグのリスト:

    チェックボックスのリスト

しかし究極的には、これらすべてはユーザーが有限の選択肢の範囲で単独もしくは複数の選択を行うことを許可します。

sfWidgetFormChoice ウィジェットは1つのウィジェットの範囲内でこれらすべての実現可能なものを標準化します。 このウィジェットは選択をこれまで見てきた4つの HTML 表現のどれかにレンダリングできます。 後で見るようにこれによって独自の表現を定義することもできます。

sfWidgetFormChoice はレンダリング作業を別のウィジェットにデリゲートする特別なウィジェットです。 レンダリングは2つのオプション: expandedmultiple で制御されます:

expandedfalse expandedtrue
multiplefalse sfWidgetFormSelect sfWidgetFormSelectRadio
multipletrue sfWidgetFormSelectMany sfWidgetFormSelectCheckbox

note

それ自身をレンダリングする sfWidgetFormChoice によって使用される sfWidgetFormSelectsfWidgetFormSelectManysfWidgetFormSelectCheckboxsfWidgetFormSelectRadio ウィジェットは他のウィジェットと同じくプレーンなもので直接利用できます。 たいていの場合、このセクションではこれらのドキュメントは作成されていないので、より柔軟な sfWidgetFormChoice ウィジェットを使うほうがよいです。

それぞれを実現するための HTML 表現は次の通りです:

$w = new sfWidgetFormChoice(array(
  'choices' => array('Fabien Potencier', 'Fabian Lange'),
));

ドロップダウンリスト

$w = new sfWidgetFormChoice(array(
  'multiple' => true,
  'choices'  => array('PHP', 'symfony', 'Doctrine', 'Propel', 'model'),
));

ドロップダウンリスト

$w = new sfWidgetFormChoice(array(
  'expanded' => true,
  'choices'  => array('published', 'draft', 'deleted'),
));

ラジオボタンのリスト

$w = new sfWidgetFormChoice(array(
  'expanded' => true,
  'multiple' => true,
  'choices'  => array('A week of symfony', 'Call the expert', 'Community'),
));

ラジオボックスのリスト

選択のグループ化

choices オプションに配列の配列を渡すことで選択のグループをサポートする組み込みの機能を sfWidgetFormChoice ウィジェットは持ちます:

$choices = array(
  'Europe'  => array('France' => 'France', 'Spain' => 'Spain', 'Italy' => 'Italy'),
  'America' => array('USA' => 'USA', 'Canada' => 'Canada', 'Brazil' => 'Brazil'),
);
 
$w = new sfWidgetFormChoice(array('choices' => $choices));

選択グループ

expandedmultiple オプションも期待どおりに機能します:

$w = new sfWidgetFormChoice(array(
  'choices'  => $choices,
  'expanded' => true,
));

展開された選択グループ

レンダラウィジェットに使われるレイアウトもカスタマイズできます:

$w = new sfWidgetFormChoice(array(
  'choices'  => $choices,
  'expanded' => true,
  'renderer_options' => array('template' => '<strong>%group%</strong> %options%'),
));

展開されカスタムテンプレートを持つ選択グループ

オプションの組み合わせの例は次のとおりです:

$w = new sfWidgetFormChoice(array(
  'choices'  => $choices,
  'multiple' => true,
));

複数の選択グループ

$w = new sfWidgetFormChoice(array(
  'choices'  => $choices,
  'multiple' => true,
  'expanded' => true,
  'renderer_options' => array('template' => '<strong>%group%</strong> %options%'),
));

展開された複数の選択グループ

note

ウィジェットがプレーンな select タグでレンダリングされるとき、標準の optgroup タグが使われます。

サポートされるオプション

ウィジェット用にサポートされるすべてのオプションのリストは次のとおりです:

オプション 説明
choices 可能な選択肢の配列 (必須)
multiple 選択タグが複数の選択肢を許可しなければならない場合は true にする
expanded 展開されたウィジェットを表示するには true にする
renderer_class デフォルトの代わりに使うクラス
renderer_options レンダラのコンストラクターに渡されるオプション
renderer レンダラウィジェット (expandedrenderer_options オプションを上書きする)
choices オプションは次のとおり: new sfCallable($thisWidgetInstance, 'getChoices')

sfWidgetFormSelectCheckboxsfWidgetFormSelectRadio ウィジェットは次のオプションをサポートします:

オプション 説明
label_separator 入力チェックボックス/ラジオボタンとラベルの間で使用する区切り文字
class メインの <ul> タグ用のクラス
separator それぞれの入力チェックボックス/ラジオボタンの間で使用する区切り文字
formatter チェックボックスの選択をフォーマットするために呼び出す callable
callable なフォーマッターは引数としてウィジェットと入力の配列を受け取る
template オプションをグループに分類する際に使用するテンプレート (%group% %options%)

tip

sfWidgetFormChoiceMany ウィジェットはショートカットです。 multiple オプションを持つ sfWidgetFormChoice ウィジェットは自動的に true にセットされます。

二重リストの表現

ユーザーが複数のオプションを選択できるとき、別のボックスで選択されたオプションを表示する方が良い場合があります。

選択ウィジェットを二重リストとしてレンダリングするために sfWidgetFormSelectDoubleList ウィジェットを使うことができます:

$w = new sfWidgetFormChoice(array(
  'choices'        => array('PHP', 'symfony', 'Doctrine', 'Propel', 'model'),
  'renderer_class' => 'sfWidgetFormSelectDoubleList',
));

二重リスト

caution

このウィジェットは symfony の sfFormExtraPlugin プラグインの一部です。

note

このウィジェットはカスタムの JavaScript を使います。 ウィジェットの getJavaScripts() メソッドを呼び出すことでこれらのパスを読み取ることができます:

$files = $w->getJavascripts();
オプション 説明(訳注:associatedとunassociatedは図を参照)
choices 可能な選択肢の配列 (必須)
class ウィジェットのメインクラス
class_select 2つの select タグ用のクラス
label_unassociated unassociated 用のラベル
label_associated associated 用のラベル
unassociate unassociate リンク用の HTML
associate associate リンク用の HTML
template このウィジェットをレンダリングするために使用する HTML テンプレート。
利用可能なプレースホルダー: %label_associated%, %label_unassociated%, %associate%, %unassociate%, %associated%, %unassociated%, %class%

自動入力補完

ユーザーがたくさんの要素の中から選択を行えるようにしたいとき、これらすべての一覧をセンタボックスの中で表示することが不可能になります。 sfWidgetFormJQueryAutocompleter はシンプルな input タグを自動入力選択ボックスに変換することでこの問題を解決します。

caution

このウィジェットは symfony の sfFormExtraPlugin プラグインの一部です。 JQuery と JQuery UI は sfFormExtraPlugin には搭載されていないので、手動でインストールしてインクルードする必要があります。

$w = new sfWidgetFormChoice(array(
  'choices'          => array(),
  'renderer_class'   => 'sfWidgetFormJQueryAutocompleter',
  'renderer_options' => array('url' => '/autocomplete_script'),
));

note

このウィジェットは適切に動作するカスタムの JavaScript とスタイルシートを使用します。 ウィジェットの getJavaScripts()getStylesheets() メソッドを呼び出すことでこれらのパスを読み取ることができます。

url オプションはユーザーの入力に基づいた選択を投入するためにウィジェットが呼び出す URL です。 URL は2つのパラメータを受け取ります:

  • q: ユーザーが入力した文字列
  • limit: 返す項目の最大数

スクリプトは選択の配列の有効な JSON 表記を返さなければなりません(配列を JSON に変換する PHP 組み込みの json_encode() 関数を使います)。

オプション 説明
url 使用する選択を取得するために呼び出す URL (必須)
config JQuery 自動入力補完ウィジェットを設定する JavaScript の配列
value_callback 表示される前に値を変換するコールバック

選択が Propel のモデルに関連したものであれば、sfWidgetFormPropelJQueryAutocompleter ウィジェットは外部キーの検索用に最適化されます:

$w = new sfWidgetFormChoice(array(
  'renderer_class'   => 'sfWidgetFormPropelJQueryAutocompleter',
  'renderer_options' => array(
    'model' => 'Article',
    'url'   => '/autocomplete_script',
  ),
));
オプション 説明
model モデルクラス (必須)
method オブジェクトを文字列に変換するメソッド (デフォルトでは __toString())

Propel モデルにバインドされる選択

選択が Propel モデルにバインドされる場合(通常はユーザーが外部キーを変更することを許可するとき)、 sfWidgetFormPropelChoice ウィジェットを使うことができます:

$w = new sfWidgetFormPropelChoice(array(
  'model'     => 'Article',
  'add_empty' => false,
));

あなたが渡した model クラスに従って choices はウィジェットによって自動的に読み取られます。 専用オプションのセットをとおしてウィジェットは細かく設定されます:

オプション 説明
model Propel のモデルクラス (必須)
add_empty 最初に空の値を追加するかどうか (デフォルトは false)
オプションがブール値でなければ、値はテキストの値として使われる
method オブジェクトの値を表示するために使うメソッド (デフォルトは __toString)
key_method オブジェクトのキーを表示するために使うメソッド (デフォルトは getPrimaryKey)
order_by 2つのフィールドで構成された配列:
* 結果によって並べ替えられるカラム (PhpName フォーマットでなければならない)
* asc もしくは desc
criteria オブジェクトを読み取るときに使う基準
connection 使用する Propel の接続名(デフォルトは null)
multiple select タグが複数の選択を許可しなければならないときは true
peer_method オブジェクトを得るために使うピアメソッド

Doctrine モデルにバインドされた選択

選択が Doctrine モデルにバインドされる場合(通常はユーザーが外部キーを変更することを許可するとき)、 sfWidgetFormDoctrineChoice ウィジェットを使うことができます:

$w = new sfWidgetFormDoctrineChoice(array(
  'model'     => 'Article',
  'add_empty' => false,
));

あなたが渡した model クラスに従ってウィジェットが choices を自動的に読み取ります。 専用オプションのセットをとおしてウィジェットの高度な設定が可能です:

オプション 説明
model モデルクラス (必須)
add_empty 最初に空の値を追加するかどうか (デフォルトは false)
オプションがブール値ではない場合、値はテキストの値として使われる
method オブジェクトの値を表示するために使うメソッド (デフォルトは __toString)
key_method オブジェクトのキーを表示するために使うメソッド (デフォルトは getPrimaryKey)
order_by 2つのフィールドで構成された配列:
* 結果によって並べ替えされるカラム (PhpName フォーマットでなければならない)
* asc もしくは desc
query オブジェクトを読み取る際に使うクエリ
connection 使用する Doctrine の接続 (デフォルトでは null)
multiple 選択タグが複数の選択を許可する場合は true
table_method オブジェクトを得るために使うメソッド

日付ウィジェット

日付、時間、もしくは日付と時間に対していくつかの select ボックスを提供することで日付ウィジェットは日付の入力作業を簡単にするために使われます。 symfony のすべての日付ウィジェットはいくつかの HTML タグによって表現されます。 これらはユーザーカルチャに従ってカスタマイズすることも可能です。

note

すべての select ボックスを避けることでユーザーが日付をより速く入力できることから日付用にシンプルな input タグを使うことを好む人がいます。 もちろん、日付の書式はバリデーターによってサーバーサイドで強制されます。 ありがたいことに、symfony の日付バリデーターは理解と解析ができる日付フォーマットを自在に扱える強力なバリデーターを提供します。

sfWidgetFormDate

sfWidgetFormDate は日付ウィジェットを表します:

日付ウィジェット

ユーザーによって投稿された値はウィジェットの名前の配列に保存されます:

$w = new sfWidgetFormDate();
$w->render('date');
 
# 投稿された値は`date`配列になる:
# array(
#   'date' => array(
#     'day'   => 15,
#     'month' => 10,
#     'year'  => 2005,
#   ),
# );

ウィジェットのふるまいは多くのオプションでカスタマイズできます:

オプション 説明
format 日付書式の文字列 (デフォルトは %month%/%day%/%year%)
years 年の select タグ の years の配列 (オプション)
months 月の select タグの months の配列 (オプション)
days 日にちの select タグの days の配列 (オプション)
can_be_empty ウィジェットが空の値を受け取るかどうか (デフォルトはtrue)
empty_values 空の文字列に使う値の配列 (デフォルトは yearmonthday に対して空の文字列)

format オプションを使用すればデフォルトタグの並びのカスタマイズが可能になります (render() メソッドが呼び出されるとき、%year%%month%%day% プレースホルダーは対応する select タグに置き換えられます):

$w = new sfWidgetFormDate(
  array('format' => '%year% - %month% - %day%')
);

カスタマイズされた書式を持つ日付ウィジェット

デフォルトでは、現在の年から10年前後の year select タグが投入されます。 これは years オプションを使うことで変更できます:

$years = range(2009, 2020);
$w = new sfWidgetFormDate(
  array('years' => array_combine($years, $years))
);

yearsmonthsdays オプションは配列を受け取ります。 キーは option タグの値で値はユーザーに表示される文字列です。

sfWidgetFormTime

sfWidgetFormTime は時間ウィジェットを表します:

時間ウィジェット

ユーザーによって投稿された値はウィジェットの名前の配列に保存されます:

$w = new sfWidgetFormTime();
$w->render('time');
 
# 投稿された値は配列 `time` になる:
# array(
#   'time' => array(
#     'hour'    => 12,
#     'minute'  => 13,
#     'second'  => 14,
#   ),
# );

ウィジェットのふるまいは多くのオプションでカスタマイズできます:

オプション 説明
format 時間書式の文字列 (%hour%:%minute%:%second%)
format_without_seconds 秒無しの時間書式の文字列 (%hour%:%minute%)
with_seconds 秒に対して選択を含めるか (デフォルトは false)
hours 時間の select タグ用の時間の配列 (オプション)
minutes 分の select タグ用の分の配列 (オプション)
seconds 2番目の select タグ用の秒数の配列 (オプション)
can_be_empty ウィジェットが空の値を受け取るかどうか (デフォルトは true)
empty_values 空の値に使う値の配列
(デフォルトは hoursminutes、と seconds 用の空の文字列)

デフォルトでは、ウィジェットは秒の選択を許可しません。 with_seconds オプションを true に設定することでこれを変更できます:

$w = new sfWidgetFormTime(array('with_seconds' => true));

format オプションを使うすることで format_without_seconds オプションはデフォルトタグの並びをカスタマイズできます (render() メソッドが呼び出されるとき %hour%%minute%%second% プレースホルダーは対応する select タグに置き換えられます):

$w = new sfWidgetFormTime(array(
  'with_seconds' => true,
  'format'       => '%hour% : %minute% : %second%',
));

カスタマイズされた書式を持つ時間ウィジェット

すべての分もしくは秒を表示したくなければ、3つのタグそれぞれに対して独自の値を提供できます:

$seconds = array(0, 15, 30, 45);
$w = new sfWidgetFormTime(array(
  'with_seconds' => true,
  'seconds'      => array_combine($seconds, $seconds),
));

カスタマイズされたタグを持つ時間ウィジェット

hoursminutes、とsecondsオプションは配列を受け取ります。 キーはoptionタグの配列で値はユーザーに表示される文字列です。

sfWidgetFormDateTime

sfWidgetFormDateTime ウィジェットは2つのサブウィジェット: sfWidgetFormDate ウィジェットと sfWidgetFormTime ウィジェットをレンダリングするウィジェットです:

$w = new sfWidgetFormDateTime();

datetime ウィジェット

オプション 説明
date 日付ウィジェット用のオプション (sfWidgetFormDate を参照)
time 時間ウィジェット用のオプション (sfWidgetFormTime を参照)
with_time 時間を含めるかどうか (デフォルトでは true)
format 日付と時間ウィジェット用の書式文字列
(デフォルトは %date% %time%)

tip

デフォルトでは、日付と時間ウィジェットのそれぞれに対してウィジェットは sfWidgetFormDatesfWidgetFormTime のインスタンスを作成します。 getDateWidget()getTimeWidget() メソッドをオーバーライドすることでウィジェットによって使用されるクラスを変更できます。

sfWidgetFormI18nDate

sfWidgetFormI18nDate は標準の sfWidgetFormDate ウィジェットを拡張します。 標準ウィジェットが月を数字として表示するのに対して、国際化ウィジェットはカルチャにしたがってこれらをローカライズされた文字列として表示します:

$w = new sfWidgetFormI18nDate(array('culture' => 'fr'));

国際化日付ウィジェット

月の文字列のフォーマッティングは month_format オプションで調整できます。 このウィジェットは3つの値: name (デフォルト)、short_namenumber を受け取ります。

$w = new sfWidgetFormI18nDate(array(
  'culture'      => 'fr',
  'month_format' => 'short_name',
));

ショートネームとしての国際化日付ウィジェット

カルチャに従って、ウィジェットは3つの異なる select ボックスの順序とそれらの間で使う区切り文字も知っています。

caution

このウィジェットは symfony の国際化サブフレームワークに依存します。

sfWidgetFormI18nTime

sfWidgetFormI18nTime は標準の sfWidgetFormTime ウィジェットを拡張します。

オプションとして渡される culture に従って、ウィジェットは3つの異なる select ボックスとそれらの間で使用する区切り文字を知っています:

$w = new sfWidgetFormI18nTime(array('culture' => 'ar'));

国際化時間ウィジェット

caution

このウィジェットは symfony の国際化サブフレームワークに依存します。

sfWidgetFormI18nDateTime

sfWidgetFormI18nDateTime は2つのサブウィジェット: sfWidgetFormI18nDate ウィジェットと sfWidgetFormI18nTime ウィジェットをレンダリングするウィジェットです。

caution

このウィジェットは symfony の国際化サブフレームワークに依存します。

sfWidgetFormDateRange

sfWidgetFormDateRange ウィジェットは日付範囲の選択を表現します:

$w = new sfWidgetFormDateRange(array(
  'from_date' => new sfWidgetFormDate(),
  'to_date'   => new sfWidgetFormDate(),
));

日付範囲ウィジェット

オプション 説明
from_date 変換元の日付ウィジェット (必須)
to_date 変換先の日付ウィジェット (必須)
template ウィジェットをレンダリングするテンプレート
(利用可能なプレースホルダー: %from_date%%to_date%)

ウィジェットをレンダリングするために使用されるテンプレートは template オプションでカスタマイズできます:

$w = new sfWidgetFormDateRange(array(
  'from_date' => new sfWidgetFormDate(),
  'to_date'   => new sfWidgetFormDate(),
  'template'  => 'Begin at: %from_date%<br />End at: %to_date%',
));

カスタマイズされた日付範囲ウィジェット

note

このウィジェットはより洗練された sfWidgetFormFilterDate ウィジェット用の基底クラスです。

sfWidgetFormJQueryDate

sfWidgetFormJQueryDate は JQuery UI でレンダリングされる日付ウィジェットを表します:

$w = new sfWidgetFormJQueryDate(array(
  'culture' => 'en',
));

caution

このウィジェットは symfony の sfFormExtraPlugin プラグインの一部です。 JQuery と JQuery UI は sfFormExtraPlugin に搭載されていないのでこれらを手動でインストールして含める必要があります。

オプション 説明
image ウィジェットを表現する画像パス (デフォルトは false)
config JQuery 日付ウィジェットを設定する JavaScript の配列
culture ユーザーカルチャ

国際化ウィジェット

caution

このセクションのウィジェットは symfony の国際化サブフレームワークに依存します。

sfWidgetFormI18nSelectCountry

sfWidgetFormI18nSelectCountry ウィジェットは国の選択を表します:

$w = new sfWidgetFormI18nSelectCountry(array('culture' => 'fr'));

国際化された国のリスト

オプション 説明
culture 国際化された文字列に使われるカルチャ (必須)
countries 使用する国コードの配列 (ISO 3166)
add_empty 最初に空の値を追加するかどうか (デフォルトは false)
オプションがブール値でなければ、値はテキストの値として使われる

sfWidgetFormI18nSelectLanguage

sfWidgetFormI18nSelectLanguage は言語の選択を表します:

$w = new sfWidgetFormI18nSelectLanguage(array('culture' => 'fr'));

国際化された言語のリスト

オプション 説明
culture 国際化された文字列用に使用するカルチャ (必須)
languages 使用する言語コードの配列
add_empty 最初に空の値を追加するかどうか (デフォルトは false)
オプションがブール値でなければ、値はテキストの値として使われる。

sfWidgetFormI18nSelectCurrency

sfWidgetFormI18nSelectCurrency は通貨の選択を表します:

$w = new sfWidgetFormI18nSelectCurrency(array('culture' => 'fr'));

国際化された通貨のリスト

オプション 説明
culture 国際化された文字列に使うカルチャ (必須)
currencies 使用する通貨コードの配列
add_empty 最初に空の値を追加するかどうか (デフォルトは false)
オプションがブール値でなければ、値はテキストの値として使われる。

Captcha ウィジェット

sfFormExtraPluginプラグインはReCaptcha プロジェクト をベースとするキャプチャウィジェットの sfWidgetFormReCaptcha を備えています:

$w = new sfWidgetFormReCaptcha(array(
  'public_key' => 'RECAPTCHA_PUBLIC_KEY'
));
オプション 説明
public_key ReCaptcha の公開鍵
use_ssl SSL を使用するかどうか (デフォルトは false)
server_url HTTP API 用の URL
server_url_ssl HTTPS API 用の URL (use_ssltrue のときのみ使われる)

public_key は ReCaptcha の公開鍵です。 API キーは無料で入手できます。

tip

ReCaptcha API に関する詳細な情報はオンラインで見つかります。

ReCaptcha フィールドの名前を変更することはできないので、HTTP リクエストからフォームをバインドするときこれらを手動で追加しなければなりません。

たとえば、フォームが contact[%s] ネームフォーマットを持つ場合、キャプチャ情報が残りのフォームに投稿された値にマージされることを保証するために必要なコードは次のとおりです:

$captcha = array(
  'recaptcha_challenge_field' => $request->getParameter('recaptcha_challenge_field'),
  'recaptcha_response_field'  => $request->getParameter('recaptcha_response_field'),
);
$submittedValues = array_merge(
  $request->getParameter('contact'),
  array('captcha' => $captcha)
);

このウィジェットは sfValidatorReCatpcha バリデーターと一緒に使われます。

フィルタウィジェット

フィルタウィジェットはフィルタとしてふるまうフォームをレンダリングするために使うことができる特別なウィジェットです。

sfWidgetFormFilterInput

sfWidgetFormFilterInputはテキスト用のフィルタを表します。 デフォルトでは、ユーザーが空のテキストを検索できるようにするためにこのウィジェットはチェックボックスを含みます。

オプション 説明
with_empty 空のチェックボックスを追加するかどうか (デフォルトでは true)
empty_label 空のチェックボックスを利用する際に使うラベル
template ウィジェットをレンダリングするために使うテンプレート
利用可能なプレースホルダー: %input%%empty_checkbox%%empty_label%

sfWidgetFormFilterDate

sfWidgetFormFilterDate は日付の範囲をフィリタリングするウィジェットを表します。 デフォルトでは、ユーザーが空の日付を検索できるようにするためにこのウィジェットはチェックボックスを含みます。

オプション 説明
with_empty 空のチェックボックスを追加するかどうか (デフォルトでは true)
empty_label 空のチェックボックス利用時に使用するラベル
template ウィジェットをレンダリングするために使うテンプレート
利用可能なプレースホルダー: %date_range%%empty_checkbox%%empty_label%

sfWidgetFormSchema

sfWidgetFormSchema ウィジェットはいくつかのフィールドで構成されるウィジェットを表します。 フィールドは名前つきのシンプルなウィジェットです:

$w = new sfWidgetFormSchema(array(
  'name'    => new sfWidgetFormInput(),
  'country' => new sfWidgetFormI18nSelectCountry(),
));

note

フォームは sfWidgetFormSchema クラスのウィジェットスキーマで定義されます。

sfWidgetFormSchema コンストラクターはオプションとして5つの引数をとります:

  • フィールドの配列
  • オプションの配列
  • HTML属性の配列
  • 埋め込みウィジェット用のラベルの配列
  • 埋め込みウィジェット用のヘルプメッセージの配列

利用可能なオプションは次のとおりです:

オプション 説明
name_format 入力名用の sprintf パターン (デフォルトでは %s)
form_formatter フォームフォーマッターの名前 (tablelist が搭載されており、table がデフォルト)

すべてのフォームに対してデフォルトのフォーマッターを変更したい場合、setDefaultFormFormatterName() メソッドで設定できます:

sfWidgetFormSchema::setDefaultFormFormatterName('list');

sfWidgetFormSchema クラスは sfWidgetForm クラスを継承するので、すべてのメソッドとふるまいを継承します。

caution

sfWidgetFormSchema オブジェクトはコンテナータグではなくウィジェットの「rows」だけをレンダリングします (table フォーマッターに対して table、もしくは list に対して ul):

<Table>
  <?php echo $ws->render('') ?>
</table>

埋め込みのウィジェットにアクセスするために sfWidgetFormSchema を配列として使うことができます:

$ws = new sfWidgetFormSchema(array('name' => new sfWidgetFormInput()));
 
$nameWidget = $ws['name'];
 
unset($ws['name']);

caution

ウィジェットフォームスキーマがフォームに埋め込まれるとき、フォームはウィジェット自身ではなく、テンプレート内のバインドされるフィールドにアクセスする権限をあなたに与えます。 詳細はフォームのリファレンスの章を参照してください。

他のスキーマのように、ウィジェットスキーマは入れ子にできます:

$ws = new sfWidgetFormSchema(array(
  'title'  => new sfWidgetFormInput(),
  'author' => new sfWidgetFormSchema(array(
    'first_name' => new sfWidgetFormInput(),
    'last_name'  => new sfWidgetFormInput(),
  )),
));

配列記法を利用することで埋め込みのウィジェットスキーマにアクセスできます:

$ws['author']['first_name']->setLabel('First Name');

下記において、ウィジェットスキーマクラスのメインメソッドが説明されていますが、すべてのメソッドのリストに関しては、オンラインのAPIドキュメントを参照してください。

setLabel()getLabel()setLabels()getLabels()

setLabel()getLabel()setLabels()getLabels() メソッドは埋め込みウィジェット用のラベルを管理します。 これらはウィジェットの getLabel()setLabel() メソッドのプロキシメソッドです。

$ws = new sfWidgetFormSchema(array('name' => new sfWidgetFormInput()));
 
$ws->setLabel('name', 'Fabien');
 
// 上記は下記と同等
 
$ws['name']->setLabel('Fabien');
 
// もしくは
 
$ws->setLabels(array('name' => 'Fabien'));

setLabels() メソッドは既存の値に渡された値をマージします。

setDefault()getDefault()setDefaults()getDefaults()

setDefault()getDefault()setDefaults()getDefaults() メソッドは埋め込みウィジェット用のデフォルトの値を管理します。 これらはウィジェットの getDefault()setDefault() メソッドのプロキシメソッドです。

$ws = new sfWidgetFormSchema(array('name' => new sfWidgetFormInput()));
 
$ws->setDefault('name', 'Fabien');
 
// 上記は下記のものと同等
 
$ws['name']->setDefault('Fabien');
 
// もしくは
 
$ws->setDefaults(array('name' => 'Fabien'));

setDefaults() メソッドは渡された値を既存の値にマージします。

setHelp()setHelps()getHelps()getHelp()

setHelp()setHelps()getHelps() getHelp() メソッドは埋め込みウィジェットに関連したヘルプメッセージを管理します:

$ws = new sfWidgetFormSchema(array('name' => new sfWidgetFormInput()));
 
$ws->setHelp('name', 'Fabien');
 
// は下記と同等
 
$ws->setHelps(array('name' => 'Fabien'));

setHelps() メソッドは受け取った値を既存の値にマージします。

getPositions()setPositions()moveField()

ウィジェットスキーマに含まれるフィールドの並べ替えが行われます。 順序は moveField() メソッドで変更できます:

$ws = new sfWidgetFormSchema(array(
  'first_name' => new sfWidgetFormInput(),
  'last_name' => new sfWidgetFormInput()
));
 
$ws->moveField('first_name', sfWidgetFormSchema::AFTER, 'last_name');

定数は次のとおりです:

  • sfWidgetFormSchema::FIRST
  • sfWidgetFormSchema::LAST
  • sfWidgetFormSchema::BEFORE
  • sfWidgetFormSchema::AFTER

setPositions() メソッドですべての位置を変更することも可能です:

$ws->setPositions(array('last_name', 'first_name'));

sfWidgetFormSchemaDecorator

sfWidgetFormSchemaDecorator ウィジェットは任意の HTML スニペット内部のフォームスキーマウィジェットをラップするプロキシウィジェットスキーマです:

$ws = new sfWidgetFormSchema(array('name' => new sfWidgetFormInput()));
 
$wd = new sfWidgetFormSchemaDecorator($ws, '<table>%content%</table>');

note

フォームが別のフォームに埋め込まれるときこのウィジェットが symfony の内部で使われます。