ドキュメント
リリースカレンダー
リンク
SourceForge.jp SourceForge.JPへ
php.net PHP公式サイトへ

フォーム

 WEB上で入力フォームを作成する時、一般的な処理や定型的な処理が多く存在します。 そのような汎用的な処理をクラスにまとめ、簡単に入力フォームを作成できるのが、このライブラリになります。

 SyLフレームワークのフォームクラスは、3種類あります。
 ・フォームクラス
 ・アクションフォームクラス
 ・ADMアクションフォームクラス

 「フォームクラス」は、3種類中で最も低レベルで汎用的なフォームクラスで、SyLフレームワークを使用しない外部システムでも使用できます。
 「アクションフォームクラス」は、予めフォーム定義を作成したクラスを使用し、フォーム内の修正、フォーム自体の再利用が容易です。
 「ADMアクションフォームクラス」は、ADM (汎用データ管理)のフォーム関連処理で使用されるクラスです。

 ここでは、「フォームクラス」について説明します。

1. フォーム例

 基本的な使用方法は、下記のようになります。

<アクション内容>

// フォームクラスインクルード
// ※SyL外で使用する際は、直接インクルードしてください
SyL_Loader::lib('Form');
SyL_Loader::lib('ValidationManager');

// バリデーション基本パターン作成
$v_require   =& SyL_Validator::create('require', '{name}は必須です');
$v_length20  =& SyL_Validator::create('length',  '{name}は最大{max}文字
(バイト)まで入力できます', array('max'=> 20));

// フォームオブジェクト作成
$form =& new SyL_Form();

// フォーム要素: 名前
$element =& $form->createElement('text', 'name', '名前', array(), 
array('size' => '30'));
// バリデーションセット
$vs =& SyL_Validators::create();
$vs->add($v_require);
$vs->add($v_length20);
$element->setValidators($vs);
$form->addElement($element);

// フォーム要素: 性別
$gender = array(
  '1' => '男',
  '2' => '女'
);
$element =& $form->createElement('radio', 'gender', '性別',
$gender, array());
// バリデーションセット
$vs =& SyL_Validators::create();
$vs->add($v_require);
$element->setValidators($vs);
$form->addElement($element);

// サブミットボタン
$element =& $form->createElement('submit', 'OK', '送信');
$form->addElement($element);

// POSTならバリデーション処理
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    if ($form->validate()) {
        // バリデーションOK
        // フォーム内容を確認表示に変更
        $form->setReadOnly(true);
    }
}

// 結果を連想配列で取得
$forms =& $form->getResultArray();

<テンプレート内容>

<?php if ($forms['error']) { ?>
<font color="#990000"><?= implode('<br>', $forms['error_message']) ?></font>
<br><br>
<?php } ?>

<table>
<form <?= $forms['attributes'] ?>>
<tr>
<td><?= $forms['elements']['name']['label'] ?>
</td><td><?= $forms['elements']['name']['html'] ?></td>
</tr>
<tr>
<td><?= $forms['elements']['gender']['label'] ?></td>
<td><?= $forms['elements']['gender']['html'] ?></td>
</tr>
<tr>
<td colspan="2"><?= $forms['elements']['ok']['html'] ?></td>
</tr>
</form>
</table>


アクションでは、まずフォームオブジェクトを作成し、下記のように要素を作成します。

$element =& $form->createElement('text', 'name', '名前', array(), 
array('size' => '30'));

要素を作成する createElement メソッドの仕様です。

引数 内容
1 string textやradio、checkboxなどの要素タイプ
2 string 要素名。属性で表すと「name」
3 string ラベル名。表示される名称
4 array select, radio, checkbox の場合のオプション要素
5 array 要素に追加する属性。 例) array(size => 30)

作成した要素に対して、バリデーションを追加することができます。
バリデーションは、最初に基本パターンを作成し、

$v_require =& SyL_Validator::create('require', '{name}は必須です');

要素に追加する流れになります。

// バリデーショングループ作成
$vs =& SyL_Validators::create();
$vs->add($v_require);
// バリデーションを要素に追加
$element->setValidators($vs);

※バリデーションの使い方や種類は 7.3 バリデーション 参照

フォームの要素を作成し、大本のフォームオブジェクトにセットしたら、 場合よりバリデーションを行います。

if ($form->validate()) {
    $form->setReadOnly(true);
}

フォームオブジェクトの validate メソッドでバリデーションを実行し、 問題なければ(エラーがなければ)確認画面を表示するため、setReadOnly メソッドで全要素を読み取り専用にしています。

最後に表示処理用のデータを(配列として)取得します。

$forms =& $form->getResultArray();

テンプレート側では、表示処理用のデータを使用してフォームを構築します。

フォームオブジェクトの getResultArray メソッドで取得できる連想配列の仕様です。

キー 内容
read_only bool 全要素が読取専用(確認画面)であればtrue、それ以外はfalse
error bool エラーが1つでもある場合true、なければfalse
error_message array 全エラーメッセージ
elements array 要素の配列
例)
[last_name] => Array
    (
        [label] => 名前(姓)
        [html] => <input size="30" 
name="last_name" type="text" value="" />
        [require] => 1
        [error] => 
        [error_message] => 
        [read_only] => 
    )

[first_name] => Array
    (
...
attributes string フォームタグの属性

2. 要素の種類

 使用できるフォームの要素を下記に記載します。

要素名 内容
text テキストボックスを表示します。
生成例) $element =& $form->createElement('text', 'name', '名前');

<input size="30" name="name" type="text" value="" />
password パスワードボックスを表示します。
生成例) $element =& $form->createElement('password', 'passwd', 'パスワード');

<input size="30" name="password" type="text" value="" />
textarea テキストエリアを表示します。
生成例) $element =& $form->createElement('textarea', 'message', 'メッセージ', array(), array('rows' => '3', 'cols' => '3'));

<textarea rows="3" cols="3" name="message"></textarea>
radio ラジオボタンを表示します。
生成例) $element =& $form->createElement('radio', 'gender', '性別', array('1' => '男'));
 男
<input type="radio" name="gender" value="1" /> 男
select
(multiple含む)
プルダウンを表示します。
生成例) $element =& $form->createElement('select', 'prefecture', '都道府県', array('13' => '東京都'));

<select name="prefecture">
<option value="13">東京都
</select>
checkbox チェックボックスを表示します。
生成例) $element =& $form->createElement('checkbox', 'browser', 'ブラウザ', array('1' => 'IE'));
 IE
<input type="checkbox" name="browser" value="1" /> IE
button ボタンを表示します。
生成例) $element =& $form->createElement('button', 'regist', '登録');

<input type="button" name="regist" value="登録" />
submit サブミットボタンを表示します。
生成例) $element =& $form->createElement('submit', 'ok', '送信');

<input type="submit" name="ok" value="送信" />

3. グループ要素

 フォーム要素を作成しているときに、要素をグループ化して扱えたら便利なことがあります。 例えば、電話番号の3つのテキストボックスを例に示すと、

電話番号:  -  - 

というものです。 要素のグループ化は、このように複数の要素をグループ化して、1つの要素として扱うことができます。

コード例は、下記のようになります。

<アクション内容>

$element =& $form->createElement('group', 'tel', '電話番号');
$element->addElement($form->createElement('text', 'tel1', '電話番号1', 
array(), array('size' => '10')));
$element->addElement($form->createElement('text', 'tel2', '電話番号2', 
array(), array('size' => '10')));
$element->addElement($form->createElement('text', 'tel3', '電話番号3', 
array(), array('size' => '10')));
$element->setFormat('%s - %s - %s', 'tel1', 'tel2', 'tel3');
$vs =& SyL_Validators::create();
$vs->add($v_require);
$vs->add($v_numeric);
$element->setValidators($vs);
$form->addElement($element);

<テンプレート内容>

<?= $forms['elements']['tel']['label'] ?>
<?= $forms['elements']['tel']['html'] ?>

4. JavaScriptバリデーション

 外部からの入力に対して欠かせない処理の1つにバリデーションがあります。 特にフォームのバリデーションは、適正なデータのみをフィルタリングするだけでなく、 正確なエラーメッセージを表示することにより、ユーザビリティの向上にも付与します。

 サーバー側のバリデーションであれば、「1. フォーム例」で示した例のように記述することにより、 自動で実行することができますが、使用できるバリデーションには、サーバー側の他に クライアント側(JavaScript)バリデーションもあります。

 クライアント側バリデーションは、サーバー側で定義したバリデーションを、 JavaScriptコードとして出力することにより、 サーバー側と同一のチェックをクライアント側でも行うことができます。

 クライアント側バリデーションを使用するには、下記のような流れになります。

(1) サーバー側で、Validation ライブラリを出力するPHPコードを記述
(2) クライアント側で、Validation ライブラリをインポート
(3) サーバー側で、JavaScriptバリデーションを有効化
(4) クライアント側で、バリデーションコードを出力

(1) サーバー側で、Validation ライブラリを出力するPHPコードを記述

 クライアント側バリデーションを行うには、まずJavaScriptバリデーションライブラリをインポートします。

 もし、JavaScript出力フレームワークを使用しているのであれば、外部パラメータから読み込めるので、ここは省略可能です。 WEBアプリケーションフレームワークのみで作成する場合は、下記のように直接アクションで 動的にJavaScript出力ビューに切り替え、 Validationライブラリを出力します。

    function execute(&$data, &$context)
    {
        $context->setViewType('js.default');
        $data->addImport('validation');
    }

(2) クライアント側で、Ajax ライブラリをインポート

 (1)で作成したサーバー側のファイルを HTML のスクリプトタグで読み込みます。

スクリプトタグの記述例)
<script type="text/javascript" 
src="/web_controller.php/validation.html"></script>

 JavaScript出力フレームワークを使用している場合は、(1)を行わなくてもアクションがマッピングされていないURLに対して下記のように記述することにより自動的にインポートできます。

スクリプトタグの記述例)
<script type="text/javascript" 
src="/js_controller.php/index.js?import=Validation"></script>

※ここでインポートする Ajax ライブラリは、SYL_INCLUDE_DIR /lib/JsClient/SyL_JsClientValidation.js となり、上記方法ではこれを直接インポートしています。

(3) JavaScriptバリデーションを有効化

 PHP側でフォームオブジェクト生成後に、クライアント側バリデーション実行関数名を引数に useJs メソッドを実行する。

...
$form->useJs('sylFormCheck');
...

(4) クライアント側で、バリデーションコードを出力

 $forms['js_code']を出力すると、「(3) JavaScriptバリデーションを有効化」で指定した関数名でバリデーションコードが出力されます。

...
<?php echo $forms['js_code']; ?>
...

[ 関数の仕様 ]
 入力項目にエラーが発生した場合、(デフォルトで)アラート表示してエラー要素をフォーカスします。
・引数
 (1) フォームオブジェクト
・戻り値
 true: エラー無し、false: エラーあり

後は、その関数を使用してJavaScriptバリデーションを実現します。

...
<form ... onsubmit="return sylFormCheck(this);">
...