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();

form()

現在の 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');

input($field = null)

$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();

set_tabular_form($model, $relation, $parent, $blanks = 1, $pagination = null)

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 を生成してしまいます。

get_tabular_form()

テーブル名を返す。

静的 いいえ
パラメータ なし
返り値 mixed, フォームの名前、テーブル形式でない場合は false
if ($name = $form->get_tabular_form())
{
	echo '$form は表形式のフィールドセットで名前は ', $name;
}

ORM モデルからフォームを作成する

Fieldset クラスは、 ORM モデルからフォームを作成するために使用することができます。 次の例ではモデルの $_properties で指定されたフィールドに基づきフォームを構築します。 例では、 $article は Model_Article のインスタンスです。

echo Fieldset::forge('article')->add_model($article)->populate($article, true)->build();

モデルのすべてのプロパティをフォーム上に望まない場合、フォームの種類を false に設定することでそれらは生成されなくなります。
これは実際には裏で Observer_Validation を使用しますが、これが機能するためのオブザーバーとしてそれを追加する必要はありません。

ORM モデルから One-to-Many フォームを作成する

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 = 12comments_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 設定ファイルによって制御されます。

下記の設定値が定義されています:

パラメータ Type デフォルト 説明
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');
				

他の例は後で書かれます。