Fieldset クラス
Fieldset クラスは、オブジェクト指向風に、フォームを作ったりそのバリデーションを扱ったりするのに利用されます。
Fieldset クラスは、 Form クラスと Validation クラスを利用します。Fieldset クラスそのものは、フィールドセットとそれぞれのフィールドを組み合わせるだけで、
実際には、 Form と Validation の 2 つのクラスが仕事をすることになります。
Fieldset のフィールドはすべて Fieldset_Field オブジェクトで定義され、
それらのフィールドは Fieldset の field() メソッドを使用して直接操作することができます。
フォームのマークアップは、 Fieldset インスタンスをビューに渡すとき、あるいは build() を呼び出すときに生成されます。
forge($name = 'default', $config = array())
forge メソッドは、新しい Fieldset インスタンスを返します。注意: 1 つの $name に 1 つのインスタンスのみです。
静的 |
はい |
パラメータ |
パラメータ |
デフォルト |
説明 |
$name |
'default'
|
この Fieldset の一意識別子 |
$config |
array() |
設定の配列 |
|
返り値 |
\Fieldset オブジェクト |
例 |
$article_form = Fieldset::forge('article');
|
Fieldset オブジェクトを構築するとき、カスタム設定されたオブジェクトをセットアップするための設定を記述する配列を渡すことができます。
以下のアイテムがサポートされています。
validation_instance |
Validation オブジェクト |
null
|
Fieldset を検証するために使用する既存の Validation クラスオブジェクト。
指定しない場合、この Fieldset に Validation オブジェクトを新規作成します。
|
form_instance |
Form オブジェクト |
null
|
Fieldset を検証するために使用する既存の Form クラスオブジェクト。
指定しない場合、この Fieldset に Form オブジェクトを新規作成します。
|
これらのフィールドの他に、カスタムフォーム設定を渡すことで、 Fieldset がフォームを生成する方法を変更できます。
有効な設定値は、form.php 設定ファイルをご覧ください。
instance($instance = null)
指定したインスタンス、またはデフォルトインスタンスを返す。 (必要なら作成する)
静的 |
はい |
パラメータ |
パラメータ |
デフォルト |
説明 |
$instance |
null
|
呼び出す Fieldset インスタンスの一意識別子 |
|
返り値 |
\Fieldset オブジェクト
または、指定したインスタンスが存在しなければ false |
例 |
$article_form = Fieldset::instance('article');
|
validation()
現在の Fieldset の Validation インスタンスを取得する。存在しなければ、Validation インスタンスを作成する。
静的 |
いいえ |
返り値 |
\Validation オブジェクト |
例 |
$validation = $article_form->validation();
|
現在の Fieldset の Form インスタンスを取得する。存在しなければ、 Form インスタンスを作成する。
静的 |
いいえ |
返り値 |
\Form Object |
例 |
$form = $article_form->form();
|
add($name, $label = '', array $attributes = array(), array $rules = array())
Fieldset_Field インスタンスを作成し、現在の Fieldset に追加する。
静的 |
いいえ |
パラメータ |
パラメータ |
デフォルト |
説明 |
$name |
必須 |
HTML name 属性、 Fieldset でフィールドを参照するのにも使用する |
$label |
''
|
フィールドラベル |
$attributes |
array()
|
HTML 属性の連想配列 |
$rules |
array()
|
このフィールドに適用する検証ルール |
|
返り値 |
Fieldset_Field インスタンス |
例 |
$title_field = $article_form->add('article_title', 'Title', array('class' => 'pretty_input'));
// ラジオボタンの例
$ops = array('male', 'female');
$form->add(
'gender', '',
array('options' => $ops, 'type' => 'radio', 'value' => 'true')
);
// チェックボックスの例
$ops = array('male', 'female');
$form->add(
'gender', '',
array('options' => $ops, 'type' => 'checkbox', 'value' => 'true')
);
// 検証ルール付きの Email 入力の例
$form->add(
'email', 'E-mail',
array('type' => 'email', 'class' => 'pretty_input'),
array('required', 'valid_email')
);
// 検証ルールを配列で記述した text 入力の例
$form->add(
'name', 'Full name',
array('type' => 'name', 'class' => 'pretty_input'),
array(array('required'), array('valid_string', array('alpha-numeric', 'dots', 'spaces')))
);
|
delete($name)
Fieldset から Fieldset_Field インスタンスを取り除く。
静的 |
いいえ |
パラメータ |
パラメータ |
デフォルト |
説明 |
$name |
必須 |
Fieldset のフィールド名 |
|
返り値 |
現在の Fieldset インスタンス |
Throws |
RuntimeException, if the field given is not defined |
Example |
$fieldset->delete('article_title');
|
duplicate($name, $newname)
Duplicates a named Fieldset_Field instance from the Fieldset.
Static |
No |
Parameters |
Param |
Default |
Description |
$name |
required |
name of the current field within the Fieldset |
$newname |
required |
name of the duplicated field within the Fieldset |
|
Returns |
The current Fieldset instance |
Throws |
RuntimeException, if the field given is not defined |
Throws |
RuntimeException, if the field given is not defined |
例 |
$fieldset->delete('article_title');
|
add_before($name, $label = '', array $attributes = array(), array $rules = array(), $fieldname = null)
Fieldset_Field インスタンスを作成し、 $fieldname で定義済みのフィールドを指定し、そのフィールドの直前に現在の Fieldset に追加します。
静的 |
いいえ |
パラメータ |
パラメータ |
デフォルト |
説明 |
$name |
必須 |
HTML name 属性、Fieldset でフィールドを参照するのにも使用する |
$label |
''
|
フィールドラベル |
$attributes |
array()
|
HTML 属性の連想配列 |
$rules |
array()
|
このフィールドに適用する検証ルール |
$fieldname |
null
|
先に追加されているはずの定義済みフィールド |
|
返り値 |
Fieldset_Field オブジェクト |
例 |
// 'location' フィールドの前に追加されるラジオボタンフィールド
$ops = array('male', 'female');
$form->add_before('gender', '', array('options' => $ops, 'type' => 'radio', 'value' => 'true'), array(), 'location');
|
add_after($name, $label = '', array $attributes = array(), array $rules = array(), $fieldname = null)
Fieldset_Field インスタンスを作成し、現在の Fieldset の $fieldname で識別される定義済みフィールドの後に追加する。
静的 |
いいえ |
パラメータ |
パラメータ |
デフォルト |
説明 |
$name |
必須 |
HTML name 属性、 Fieldset でフィールドを参照するのにも使用する |
$label |
''
|
フィールドラベル |
$attributes |
array()
|
HTML 属性の連想配列 |
$rules |
array()
|
このフィールドに適用する検証ルール |
$fieldname |
null
|
既に追加されているはずの定義済みフィールド |
|
返り値 |
Fieldset_Field オブジェクト |
例 |
// 'location' フィールドの後に追加されるラジオボタンフィールド
$ops = array('male', 'female');
$form->add_after('gender', '', array('options' => $ops, 'type' => 'radio', 'value' => 'true'), array(), 'location');
|
field($name = null)
現在の Fieldset から Fieldset_Field インスタンスを 1 つまたは全て取得する。
静的 |
いいえ |
パラメータ |
パラメータ |
デフォルト |
説明 |
$name |
null
|
Fieldset に存在しているフィールドの名前 または 全てのフィールドを取得するための null 。 |
|
返り値 |
Fieldset_Field インスタンス
または Fieldset_Field インスタンスの array() |
例 |
$fields = $article_form->field();
$title_field = $article_form->field('article_title');
|
add_model($class, $instance = null, $method = 'set_form_fields')
モデルフィールドを追加する。 モデルは set_form_fields() メソッドを必ずもち、そのメソッドはこの Fieldset インスタンスにフィールドを追加します。
Orm\Model はビルトインでこれをサポートしています。
静的 |
いいえ |
パラメータ |
パラメータ |
デフォルト |
説明 |
$class |
必須 |
(名前空間を含む)完全なクラス名、あるいはモデルのオブジェクトインスタンスを指定し、フィールドを取得する |
$instance |
null
|
フィールドに入れるプロパティと同名の配列/オブジェクト。(モデルからフィールド名を取得し、この配列/オブジェクトから残りのパラメータを取得します) |
$method |
'set_form_fields'
|
フィールド取得時に呼び出すメソッド名 |
|
返り値 |
\Fieldset オブジェクト |
例 |
$article_form = Fieldset::forge('article');
$article_form->add_model('Model_Article');
|
set_config($config, $value = null)
fieldset の設定値をセットする
静的 |
いいえ |
パラメータ |
パラメータ |
デフォルト |
説明 |
$config |
必須 |
設定の配列。 |
$value |
null
|
指定された場合は、渡された設定の配列から設定する項目を設定します。 |
|
返り値 |
\Fieldset オブジェクト |
例 |
$article_form->set_config($config);
// or
$article_form->set_config('key', 'value');
|
get_config($key = null, $default = null)
設定の配列を取得する、またはキーを指定して設定値を取得する。
静的 |
いいえ |
パラメータ |
パラメータ |
デフォルト |
説明 |
$key |
null
|
配列のキー( 1 つまたは複数)。空の場合はすべて取得する。 |
$default |
null
|
$key 入力がある場合は、単一または複数の値。入力が無い場合は配列。 |
|
返り値 |
array() または mixed |
例 |
$config = $article_form->get_config();
|
get_name()
fieldset インスタンスの識別子を取得する。
静的 |
いいえ |
パラメータ |
(なし) |
返り値 |
string |
例 |
$article_form = Fieldset::forge('article');
$name = $article_form->get_name(); // 'article'
|
populate($input, $repopulate = false)
指定した input に初期値を設定する。オプションで再設定するように設定可能。
静的 |
いいえ |
パラメータ |
パラメータ |
デフォルト |
説明 |
$input |
必須 |
それぞれのフィールドに割り当てる値のオブジェクトまたは連想配列、
あるいは値を取得するモデルインスタンス。 |
$repopulate |
false |
初期設定のあとに repopulate() メソッドを使用するかどうか |
|
返り値 |
\Fieldset オブジェクト |
例 |
$article_form->populate($model);
|
repopulate()
フォーム送信からの入力値をフィールドに設定する。(method 属性を使用して
POST か GET かをチェックするかを決定する)
静的 |
いいえ |
パラメータ |
なし
|
返り値 |
\Fieldset Object |
例 |
$article_form->repopulate();
|
build($action = null)
$this->form()->build() のエイリアス。HTML フォームマークアップを生成する。Form を参照。
静的 |
いいえ |
パラメータ |
パラメータ |
デフォルト |
説明 |
$action |
null
|
フォームの action 属性に指定する URL |
|
返り値 |
string HTML マークアップ |
例 |
$this->template->form = $article_form->build(Uri::create('article/submit'));
|
disable($field)
disable メソッドは、ビルドされるフィールドを無効にします。
フォームのフィールドの順序を変更したり、複雑なレイアウトのフィールドを作成したり、といったことができます。
静的 |
いいえ |
パラメータ |
パラメータ |
デフォルト |
説明 |
$field |
required |
無効にしたいフィールド |
|
返り値 |
\Fieldset オブジェクト |
例外 |
RuntimeException, フィールドが定義されていない場合 |
例 |
$fieldset->disable('name');
|
フィールドはフィールドセットから取り除かれませんので、バリデーションは行われます。
enable($field)
enable メソッドは、disableメソッドで無効化されたフィールドを再び有効にします。
静的 |
いいえ |
パラメータ |
パラメータ |
デフォルト |
説明 |
$field |
required |
有効にしたいフィールド |
|
返り値 |
\Fieldset Object |
例外 |
RuntimeException, フィールドが定義されていない場合 |
例 |
$fieldset->enable('name');
|
$this->validation()->input() のエイリアス。POST データまたは入力をバリデーションした値を配列で取得します。Validation を参照。
静的 |
いいえ |
パラメータ |
パラメータ |
デフォルト |
説明 |
$field |
null
|
値を取得するフィールド |
|
返り値 |
配列、または指定したフィールドの値 |
例 |
$input_values = $article_form->input();
|
validated($field = null)
$this->validation()->validated() のエイリアス。バリデーションされた値を配列で取得します。Validation を参照。
静的 |
いいえ |
パラメータ |
パラメータ |
デフォルト |
説明 |
$field |
null
|
値を取得するフィールド |
|
返り値 |
配列、または指定したフィールドの値。フィールドが見つからない場合は false |
例 |
$validated_values = $article_form->validated();
|
error($field = null)
$this->validation()->error() のエイリアス。バリデーションされなかった値を配列で取得します。Validation を参照。
静的 |
いいえ |
パラメータ |
パラメータ |
デフォルト |
説明 |
$field |
null
|
値を取得するフィールド |
|
返り値 |
配列、または指定したフィールドの値。フィールドが見つからない場合は false |
例 |
$errors = $article_form->error();
|
show_errors(Array $config = array())
$this->validation()->show_errors() のエイリアス。全てのエラーリストを $config パラメータで設定したマークアップで返します。Validation を参照。
静的 |
いいえ |
パラメータ |
パラメータ |
デフォルト |
説明 |
$config |
array()
|
open_list, close_list, open_error, close_error そして no_errors を使用。値を上書きする。 |
|
返り値 |
配列、または指定したフィールドの値。フィールドが見つからない場合は false |
例 |
$all_errors = $article_form->show_errors();
|
Define an embedded fieldset on a related ORM model to create a One-to-Many form.
静的 |
いいえ |
パラメータ |
パラメータ |
デフォルト |
説明 |
$model |
必須 |
関連付けられるモデルの名前空間付きの名前。 |
$relation |
必須 |
$model に関連付けられる親オブジェクトのリレーション名 |
$parent |
必須 |
フォームを生成するのに使用する親オブジェクト。テーブルに表示されるレコードを含むオブジェクト。 |
$blanks |
1
|
テーブルに表示される空の行の数。 |
$pagination |
null
|
Pagination object, to make the tabular form paginated |
|
返り値 |
Fieldset 、メソッドチェーン用 |
例外 |
RuntimeException, パラメータが適切でない場合 |
例 |
以下を参照
|
テーブルは config/form.php 設定ファイルのテンプレート定義に従って表示されます。
これらのテンプレートを自由に変更することができますが、表構造は維持する必要があります。
というのも、fieldset クラスが各行のフィールドに基づいてテーブルヘッダを追加するからです。
もしテンプレートの行定義からテーブルを取り除いた場合、妥当でない HTML を生成してしまいます。
テーブル名を返す。
静的 |
いいえ |
パラメータ |
なし
|
返り値 |
mixed, フォームの名前、テーブル形式でない場合は false |
例 |
if ($name = $form->get_tabular_form())
{
echo '$form は表形式のフィールドセットで名前は ', $name;
}
|
Fieldset クラスは、 ORM モデルからフォームを作成するために使用することができます。
次の例ではモデルの $_properties で指定されたフィールドに基づきフォームを構築します。
例では、 $article は Model_Article のインスタンスです。
echo Fieldset::forge('article')->add_model($article)->populate($article, true)->build();
モデルのすべてのプロパティをフォーム上に望まない場合、フォームの種類を
false
に設定することでそれらは生成されなくなります。
これは実際には裏で Observer_Validation
を使用しますが、これが機能するためのオブザーバーとしてそれを追加する必要はありません。
ORM モデルオブジェクトと多くのリレーションのためのフォームを作成するために Fieldset クラスはまた利用することができます。
これは、関連するモデルとリレーションの名前を指定して、メインフォームのフィールドセットに表形式のフィールドセットを埋め込むことによって行われます。
デフォルトでは、 One-to-Many フィールドセットは config/form.php ファイル内のテンプレートによって制御され、表形式で表示されます。
// $id で識別される記事とそのコメントの one-to-many フォームを作成しようとしている。
// 記事とその関連のコメントを取得
$article = Model_Article::find($id, array('related' => array('comments')));
// ORM モデルフォーム定義を使用してこの記事のためのフォームフィールドセットを作成
$form = Fieldset::forge('article')->add_model($article);
/*
* one-to-many テーブルを作成するために表形式を追加。
*
* データは、 $article オブジェクトに関連づけされた、 'Model_Comment' クラスのオブジェクトである
* 'comments' によって提供される。
*
* フォームに埋め込まフィールドセットを回避するためにフィールドセットタグを無効にすることができます
*/
$form->add(\Fieldset::forge('tabular')->set_tabular_form('Model_Comment', 'comments', $article)->set_fieldset_tag(false));
それは複合キーを持っていない関連付けられたモデルのみで動作します!
それは指定されたリレーションの名前の配列とそのインデックス値としてレコードの主キーの値を使用し表形式の HTML 入力タグを生成します。
表の一番下に追加された空白行は '_new' 接尾辞と共にリレーション名を使用します。
これは、 1 回で、親レコード、およびすべての関連付けられたレコードを更新することを可能にし、個別に新しい行を処理します。
この例では、既存の行のために comments[12][fieldA]
ような入力タグ名が表示されます
(この場合は最初の空白行のフィールドのための id = 12
と comments_new[0][fieldA]
を持つ行。
// 投稿された one-to-many フォームを処理
if (\Input::post())
{
// 入力を検証
$form->validation()->run();
// 検証済みの場合、更新を保存
if ( ! $form->validation()->error())
{
// 記事の記録、および任意のコメントレコードの変更を更新
$article->from_array($data);
// 表形式のレコードを削除する必要があるか?
foreach ($data['comments'] as $id => $row)
{
if ($id and ! empty($row['_delete']))
{
unset($article->comments[$id]);
}
}
// 新しい表形式のレコードデータ持っているか (私たちは、1 つの空白行を追加していることを仮定) ?
$data = array_filter($data['comments_new'][0]);
$new_errors = false;
if ( ! empty($data))
{
// 必須フィールドをチェック
if (empty($data['fieldA']) or empty($data['fieldB']))
{
$new_errors = true;
// ここで必要なフィールドが存在しないというエラーメッセージが表示する...
}
else
{
// 新たな関連付けされたレコードを作成
$article->comments[] = Model_Comment::forge(array('article_id' => $article->id, 'fieldA' => $data['fieldA'], 'fieldB' => $data['fieldB']));
}
}
// 更新を保存
if ( ! $new_errors)
{
if ($article->save())
{
// ここでセーブ成功したメッセージを表示し、リダイレクトし離れる
}
else
{
// エラーメッセージを表示、保存が成功しなかった
}
}
}
else
{
// ユーザー検証失敗の通知
}
}
フィールドセットによって生成されたフォームのレイアウトは、 form.php 設定ファイルによって制御されます。
下記の設定値が定義されています:
prep_value |
boolean |
true
|
true の場合、フィールドセットに渡されたフォームの値は Security::htmlentities() を使用してエスケープされます。
|
auto_id |
boolean |
true
|
true の場合、フォームフィールドの id 属性が手動でフィールドに割り当てられていない場合に生成されます。
|
auto_id_prefix |
string |
'form_'
|
auto_id が true の場合、生成された id 属性の前にこの文字列をつけます。
|
form_method |
string |
'post'
|
生成するフォームアクションの種類。 'get' もしくは 'post' が指定可能。
|
form_template |
string |
'\n\t\t{open} \n\t\t<table>\n{fields}\n\t\t</table> \n\t\t{close}\n'
|
フォームの開始と終了のためのプレースホルダを含む文字列と入力フィールドのリスト。
|
field_template |
string |
'\t\t<tr> \n\t\t\t<td class=\"{error_class}\"> {label}{required}</td> \n\t\t\t<td class=\"{error_class}\">{field} <span>{説明}</span> {error_msg} </td>\n\t\t</tr>\n'
|
単一の入力フィールドを生成するためのプレースホルダを含む文字列。
|
multi_field_template |
string |
'\t\t<tr> \n\t\t\t<td class=\"{error_class}\"> {group_label}{required}</td> \n\t\t\t<td class=\"{error_class}\">{fields} \n\t\t\t\t{field} {label} \n{fields}<span>{description}</span> \t\t\t{error_msg}\n\t\t\t</td>\n\t\t</tr>\n'
|
ラジオボタンやチェックボックスのグループのように、複数の入力を有する単一の入力フィールドを生成するためのプレースホルダを含む文字列。
|
error_template |
string |
'<span>{error_msg}</span>'
|
入力エラーのメッセージを生成するためのプレースホルダを含む文字列。
|
group_label |
string |
'<span>{label}</span>'
|
マルチフィールド入力のラベルを生成するためのプレースホルダを含む文字列。
|
required_mark |
string |
'*'
|
HTML を含む文字列で必須の入力フィールドをマーク。
|
inline_errors |
boolean |
false
|
true の場合、検証エラーメッセージがフォームにインラインで表示されます。
|
error_class |
string |
null
|
エラーメッセージに適用する CSS クラス名
|
label_class |
string |
null
|
フィールドのラベルに適用する CSS クラス名
|
tabular_form_template |
string |
'<table>{fields}</table>\n'
|
すべての行と完全な表形式のためのテンプレート。
|
tabular_field_template |
string |
'{field}'
|
表形式で子フィールドセットを埋め込むためのテンプレート。
|
tabular_row_template |
string |
'<tr>{fields}</tr>\n'
|
表形式で単一の行を生成するためのテンプレート。
|
tabular_row_field_template |
string |
'\t\t\t<td>{label}{required} {field} {error_msg}</td>\n'
|
表形式で行の単一のフィールドを生成するためのテンプレート。
|
tabular_delete_label |
string |
'Delete?'
|
行の削除のチェックボックスのためのカラムヘッダ。
|
フォームテンプレートで次のマクロを利用することができます。
{open} |
フォーム開始タグ、 Form::open(); により生成。 |
{close} |
フォーム終了タグ、 Form::open(); (訳注: Form::close() の間違い?) により生成。 |
{fields} |
生成されたすべての入力フィールドを含む HTML のブロック。 |
{label} |
入力フィールドのラベル、 Form::label(); により生成。 |
{required} |
S必須の入力フィールドを示す文字列。 |
{error_class} |
エラーメッセージに適用される設定されたクラス。 |
{field} |
個々の入力フィールド用に生成された HTML 。 |
{description} |
文字列フィールドの説明またはヘルプテキストが表示。 |
{error_msg} |
検証の結果返される書式化されたエラーメッセージを含む文字列。 |
{group_label} |
グループ化された入力フィールドの入力フィールドのラベル、 Form::label(); により生成。 |
2 つの方法でフィールドセットで form() インスタンスの属性を変更することができます。 forge() メソッドの属性の配列、もしくは、 直接フォームインスタンスを変更することでオプションを提供することができます。
// Fieldset オブジェクトの属性で form_attributes オプションを使用
$fieldset = Fieldset::forge('article', array(
'form_attributes' => array(
'id' => 'edit_article_form',
'name' => 'edit_article'
)
)
);
// 直接フォームインスタンスを変更
$fieldset->form()->set_attribute('id', 'edit_article_form');
他の例は後で書かれます。