本ページではXoops Cube の機能(フォームデータの判定)について説明します。
1. フォームからデータの判定機能
2. ユーザーオリジナルの検査関数の作成
フォーム送信データの判定機能を追加しよう
前回作成したサンプルモジュール(フォームからデータの追加と削除の実施)のコードを変更して今回のサンプルを作成します。
今回は1ファイルを追加し、2ファイルを修正します。
1. sample2Form.class.php(今回追加ファイル)
2. indexAction.class.php
3. sample2.html
<?php if(!defined('XOOPS_ROOT_PATH')) exit(); require_once XOOPS_MODULE_PATH.'/legacy/kernel/Legacy_ActionForm.class.php'; class sample2Form extends Legacy_ActionForm { function sample2Form() { parent::Legacy_ActionForm(); } function prepare($select) { if($select === "add") { $this->mFormProperties['str'] = new XCube_StringProperty('str'); $this->mFieldProperties['str'] = new XCube_FieldProperty($this); $this->mFieldProperties['str']->setDependsByArray(array('required')); $this->mFieldProperties['str']->addMessage('required', 'データ追加する場合は、文字列は何か必ず入力して下さい。'); } elseif($select === "del") { $this->mFormProperties['id'] = new XCube_IntProperty('id'); $this->mFieldProperties['id'] = new XCube_FieldProperty($this); $this->mFieldProperties['id']->setDependsByArray(array('required')); $this->mFieldProperties['id']->addMessage('required', 'データ削除する場合は、IDは何か必ず入力して下さい。'); } } }
以下にコードの説明をします。
まず、本ファイルはアクションフォームの内容の検査等を行うための機能を持つクラスを作成するために追加しました。
4行目は、 Legacy_ActionForm.class.php ファイルを require することで、アクションフォームの内容の検査等を行うために必要な機能を使用可能にしています。
6行目で、作成したクラスがフォームアクションの検査機能が使えるように Legacy_ActionForm クラスを継承します。
8行目のコンストラクタの中で、親クラスの Legacy_ActionForm のコンストラクタを呼んでいます。
13行目の prepare() は親クラスの prepare() をオーバーライドして使用しています。
prepare() は初期の登録処理で使用される関数です。今回は実装上引数を取っています。
引数の $select については、HTMLのラジオボタンのどちらが選択されたかを判定するのに使用しています。
17行目の $this->mFormProperties['str'] = new XCube_StringProperty('str'); これでデータの型を登録しています。この場合は文字列型です。
'str' は、HTMLで指定した input の name に指定した名前です。
19、20行目は入力検査を行うための登録処理です。
20行目の required は、検査タイプの指定で、これは入力必須を検査するための指定です。
22行目は、入力がされていなかった場合に、エラーを表示するメッセージを登録しています。
<?php if (!defined('XOOPS_ROOT_PATH')) exit(); require '../../mainfile.php'; require_once './class/sample2Form.class.php'; class indexAction extends Sample2_Abstract { function indexAction() { } function executeView(&$render) { $root =& XCube_Root::getSingleton(); $select = null; $id_array = array(); $data_array = array(); $dataflg = false; $errflg = false; $modhand = & xoops_getmodulehandler('data'); $form = new sample2Form(); if(!empty($_GET['select'])) { $select = $_GET['select']; $form->prepare($select); $form->fetch(); $form->validate(); if(!$form->hasError()) { if($select === "add") { // 追加処理 $str = $_GET['str']; $modobj = & $modhand->create(); $modobj->assignVar('data',$str); $modhand->insert($modobj, true); } elseif($select === "del") { // 削除処理 $id = $_GET['id']; $mCriteria = new CriteriaCompo(); $mCriteria->add(new Criteria('id',$id,'=','','')); $modobj = $modhand->getObjects($mCriteria); if(!empty($modobj)) $modhand->delete($modobj[0], true); } } } // データベースにあるレコード数を取得する $cnt = $modhand->getCount(); if($cnt != 0) { $dataflg = true; // データベースの全レコードを取得する $modobj = $modhand->getObjects(); reset($modobj); while(list($key, $mod) = each($modobj)) { // 全レコードのIDとデータを取得する $id_array[] = $mod->get('id'); $data_array[] = $mod->get('data'); } } $render->setTemplateName('sample2.html'); $render->setAttribute('DFLG', $dataflg); $render->setAttribute('CNT', $cnt); $render->setAttribute('ID', $id_array); $render->setAttribute('DATA', $data_array); $render->setAttribute('ACTION_FORM', $form); } }
以下に変更コードの説明をします。
今回の変更は、5、26、31、32、35〜55行目のif文の追加及び80行目です。
5行目は、新規に追加したファイル内容を読み込むために required しています。
26行目の $form = new sample2Form(); でこのクラスで作成したアクションフォームを使用するためのオブジェクトを作成しています。
31行目の $form->prepare($select); で入力検査の登録を実施しています。
このときに、引数の $select の内容で登録する内容を変更しています。
32行目の $form->fetch(); でフォームで送信された値を取得しています。
33行目の $form->validate(); で値にエラーが無いか確認しています。
35行目の if(!$form->hasError()) でエラーがセットされているかどうか判定します。
81行目の、 $render->setAttribute('ACTION_FORM', $form); はHTMLファイルに記載されたSmartyの変数にオブジェクトを設定しています。
<div>データベースにあるレコード数は<{$CNT}></div> <{if $DFLG}> レコードに存在するIDは以下の通り。 <table> <tr> <td>ID 番号</td> <td>データ内容</td> </tr> <{section name=num loop=$CNT}> <tr> <td><{$ID[num]}></td> <td><{$DATA[num]}></td> </tr> <{/section}> </table> <{else}> 現在レコードはありません。 <{/if}> <br> <{if $ACTION_FORM->hasError()}> <ul> <{foreach item=errval from=$ACTION_FORM->getErrorMessages()}> <li><{$errval}></li> <{/foreach}> </ul> <{/if}> <form method="get" action="index.php"> <input type="radio" name="select" value="add">データを追加する</input> <input type="radio" name="select" value="del">データを削除する</input> <br> 文字列を入力して下さい。<{xoops_input name=str value=$ACTION_FORM->get('str')}> <br> 削除するIDを入力して下さい。<{xoops_input name=id value=$ACTION_FORM->get('id')}> <br> <button type="submit" name="send" >送信</button> </form>
以下に修正コードの説明をします。
今回の変更は22行目から28行目の追加、34行目と36行目の内容を変更しました。
22行目では、 indexAction.class.php で設定した、 ACTION_FORM のオブジェクトから、エラーがあるかの判定関数を呼んでいます。
そのため、エラーがあった場合にのみ、23行目から27行目が表示されます。
24行目の $ACTION_FORM->getErrorMessages() でエラーメッセージを取得しています。
取得したエラーメッセージを25行目の $errval で表示しています。
34、36行目で、 xoops_input としているのは、フォーム部品を作成する関数を呼んでいます。
sample2Form.class.php の mFormProperties[] や mFieldProperties[] で設定するのは、ここの name に設定されている名前を設定します。
アップデートが完了したら、Xoops Cubeのトップを開いた後、sample2の画面を開いて下さい。
sample2の画面が開いたら、「データを追加する」を選択して、何も入力せずに「送信」ボタンを押して下さい。
ユーザーオリジナルの検査関数を作ろう
このようにXoops Cubeにはフォーム内容を検査するための機能が備わっています。
エラーの検査に関して、ユーザー独自のエラー検出をする方法があります。
この場合、 validate+検査名(頭文字大文字) とする関数の命名規則があります。
このサンプルの場合には以下のようになります。
function validateStr() { // 検査時の処理を記載する } function validateId() { // 検査時の処理を記載する }
では実際に以下のコードをsample2Form.class.phpのprepare()の後に追加してみましょう。
function validateStr() { if ( !preg_match("/^[a-z]+$/i", $this->get('str')) ) { $this->addErrorMessage('アルファベット(a-z)のみ入力できます'); } }
Xoops Cubeの機能に関して、以前作成した「data.php」の中で、 XoopsSimpleObject 及び XoopsObjectGenericHandler を 継承してクラスを作成していましたが、 XoopsSimpleObject については値の入出力を、 XoopsObjectGenericHandler については、 データベースとのやり取りを実施するための機能を使用するためです。
以上でXoops Cube の機能(フォームデータの判定)の紹介を終了します。お疲れ様でした。