symfony 1.4 メモ（フォーム）

1. [symfony 1.4 メモ（アクション）](https://qiita.com/shotets/items/dd56c98d397a42fa4f50)
2. [symfony 1.4 メモ（context）](https://qiita.com/shotets/items/ffa0baa3f930d8992dcb)
3. [symfony 1.4 メモ（モデル）](https://qiita.com/shotets/items/535204c3e7ad1decdab4)
4. [symfony 1.4 メモ（schemaの書き方）](https://qiita.com/shotets/items/f55d9e625c78bb8f05e6)
5. [symfony 1.4 メモ（Doctrine）](https://qiita.com/shotets/items/e7638a72fa90c687ab81)
6. **symfony 1.4 メモ（フォーム）**
7. [symfony 1.4 メモ（コマンド）](https://qiita.com/shotets/items/82d1f9f8d00f25e65197)
8. [symfony 1.4 メモ（ユーティリティ）](https://qiita.com/shotets/items/ca32b99e43badfe53f98)

## Classの継承

フォーム

```
ModelForm > BaseModelForm > BaseFormDoctrine > sfFormDoctrine > sfFormObject > BaseForm > sfFormSymfony > sfForm
ModelFormFilter > BaseModelFormFilter > BaseFormFilterDoctrine > sfFormFilterDoctrine > sfFormFilter > BaseForm > sfFormSymfony > sfForm
```

ウィジット

```
sfWidgetFormInput > sfWidgetForm > sfWidget
```

ウィジットスキーマ
```
sfWidgetFormSchema > sfWidgetForm > sfWidget
```


## オブジェクトの構成

- **Form**  
  フォーム全体を管理するオブジェクト
  - **widgetSchema**  
    各ウィジットをまとめたウィジット。これをrenderするとフォームをまとめて出力する
      - **widget**  
      各フォームのウィジット。
  - **ValidatorSchema**  
    各バリデータをまとめたもの。
      - **Validator**  
      各フォームのバリデータ。


## デフォルトで用意されているメソッド

```php
// フォームから送られてきた値を登録し、入力チェックを行う。
$this->bind(array $Values )

// 入力チェック済みかどうか。
$this->isBound()

// 入力チェックでエラーが無ければtrue。
$this->isValid()

// 入力チェック後の値を取得。
$this->getValues()
$this->getValue($field)

// デフォルト値の設定。
$this->setDefault($name, $default)
$this->setDefaults($defaults)

// デフォルト値の取得。
$this->getDefault($name)
$this->getDefaults()

// 保存前の処理拡張用。
$this->doUpdateObject($values)
```

※\$thisの部分はフォーム以外（アクション等）で使う場合はフォームオブジェクト（$form等）に。

## ウィジットの種類

### 基本ウィジット

<dl>
<dt>sfWidgetFormInput</dt>
<dd>テキスト入力</dd>
<dt>sfWidgetFormInputCheckbox</dt>
<dd>チェックボックス（単独）</dd>
<dt>sfWidgetFormInputHidden</dt>
<dd>hiddenタグ</dd>
<dt>sfWidgetFormInputPassword</dt>
<dd>パスワード入力</dd>
<dt>sfWidgetFormInputFile</dt>
<dd>ファイルアップロード</dd>
<dt>sfWidgetFormTextarea</dt>
<dd>テキストエリア</dd>
</dl>

### 共通のオプション

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

### 特殊なウィジット

<dl>
<dt>sfWidgetFormInputFileEditable</dt>
<dd>ファイルを編集できるアップロード<br>
<br>
追加オプション
<dl>
<dt>file_src</dt>
<dd>現在の画像の web ソースのパス(必須)</dd>

<dt>edit_mode</dt>
<dd>編集モードを有効にするには true、そうでなければ false</dd>

<dt>is_image</dt>
<dd>表示可能なファイルであるかどうか</dd>

<dt>with_delete</dt>
<dd>削除のチェックボックスを追加するかどうか</dd>

<dt>delete_label</dt>
<dd>テンプレートによって使用される削除ラベル</dd>

<dt>template</dt>
<dd>このウィジェットをレンダリングするために使用する HTML テンプレート (%input% %delete% %delete_label% %file%)</dd>
</dl>
</dd>
</dl>

<dl>
<dt>sfWidgetFormTextareaTinyMCE</dt>
<dd>WYSIWYG エディタ<br>
<br>
追加オプション
<dl>
<dt>theme</dt>
<dd>Tiny MCE のテーマ (デフォルトは advanced)</dd>

<dt>width</dt>
<dd>幅</dd>

<dt>height</dt>
<dd>高さ</dd>

<dt>config</dt>
<dd>JavaScript 固有の設定の配列</dd>
</dl>
</dd>
</dl>

<dl>
<dt>sfWidgetFormChoice</dt>
<dd>選択ウィジェット<br>
<br>
追加オプション
<dl>
<dt>expanded、multiple</dt>
<dd>
<table>
<thead>
<tr><th style="text-align: center">expanded</th><th style="text-align: center">multiple</th><th>生成されるフォーム</th></tr>
</thead>
<tbody>
<tr><td style="text-align: center">false</td><td style="text-align: center">false</td><td>プルダウン</td></tr>
<tr><td style="text-align: center">false</td><td style="text-align: center">true</td><td>プルダウン（複数選択可）</td></tr>
<tr><td style="text-align: center">true</td><td style="text-align: center">false</td><td>ラジオボタン</td></tr>
<tr><td style="text-align: center">true</td><td style="text-align: center">true</td><td>チェックボックス</td></tr>
</tbody>
<table>
</dd>
<dt>choices</dt>
<dd>可能な選択肢の配列 (必須)</dd>

<dt>renderer_class</dt>
<dd>デフォルトのレンダリングの代わりに使うレンダリングクラス
<dl>
<dt>sfWidgetFormSelectDoubleList</dt>
<dd>二重リスト表示</dd>
<dt>sfWidgetFormJQueryAutocompleter</dt>
<dd>jQuery 自動入力補完</dd>
</dl>
</dd>
<dt>renderer_options</dt>
<dd>レンダラのコンストラクターに渡されるオプション</dd>

<dt>renderer</dt>
<dd>レンダラウィジェット (expanded と renderer_options オプションを上書きする)</dd>
</dl>
<br>
以下はラジオボタンとチェックボックスの場合のオプション<br>
<dl>
<dt>separator</dt>
<dd>それぞれの入力チェックボックス/ラジオボタンの間で使用する区切り文字</dd>

<dt>label_separator</dt>
<dd>入力チェックボックス/ラジオボタンとラベルの間で使用する区切り文字</dd>

<dt>class</dt>
<dd>&lt;ul&gt; タグ用のクラス</dd>

<dt>formatter</dt>
<dd>チェックボックスの選択をフォーマットするために呼び出す callable<br>
callable なフォーマッターは引数としてウィジェットと入力の配列を受け取る</dd>

<dt>template</dt>
<dd>オプションをグループに分類する際に使用するテンプレート (%group% %options%)</dd>
</dl>
</dd>
</dl>

<dl>
<dt>sfWidgetFormDoctrineChoice</dt>
<dd>選択ウィジェット（Doctrine）

追加オプション
<dl>
<dt>model</dt>
<dd>モデルクラス (必須)</dd>

<dt>add_empty</dt>
<dd>最初に空の値を追加するかどうか (デフォルトは false)<br>
オプションがブール値ではない場合、値はテキストの値として使われる</dd>

<dt>method</dt>
<dd>オブジェクトの値を表示するために使うメソッド (デフォルトは __toString)</dd>

<dt>key_method</dt>
<dd>オブジェクトのキーを表示するために使うメソッド (デフォルトは getPrimaryKey)</dd>

<dt>order_by</dt>
<dd>2つのフィールドで構成された配列<br>
* 結果によって並べ替えされるカラム (PhpName フォーマットでなければならない)<br>
* asc もしくは desc</dd>

<dt>query</dt>
<dd>オブジェクトを読み取る際に使うクエリ</dd>

<dt>connection</dt>
<dd>使用する Doctrine の接続 (デフォルトでは null)</dd>

<dt>multiple</dt>
<dd>選択タグが複数の選択を許可する場合は true</dd>

<dt>table_method</dt>
<dd>オブジェクトを得るために使うメソッド</dd>
</dl>
</dd>
</dl>

<dl>
<dt>sfWidgetFormJQueryDate</dt>
<dd>jQuery 日付入力</dd>
</dl>

## ウィジットのmethod

```php
// オプション
setOptions(array('default' => 'デフォルト値'));	// マージでなく上書きになるので注意
setOption('default', 'デフォルト値');

// 設定
setAttributes(array('class' => 'foo'));	// マージでなく上書きになるので注意
setAttribute('class', 'foo');

// 出力
render('name', '値', array('class' => 'foo'));

// hidden
isHidden()
setHidden()

// needs_multipart
needsMultipartForm()

// default
getValue()
setValue()

// label
getLabel()
setLabel()

// id_format
getIdFormat()
setIdFormat()
```