注文の多いXOOPS屋 TOP現在のブログ旧スタッフblog アーカイブ
このページは 2007〜2008 年に公開していた「株式会社RYUS スタッフblog」のアーカイブです。内容は当時のものです。

XOOPS Cube で自作 validator を使う

2007/06/22 13:29   Ryuji   カテゴリ: cubson

最近メインのパソコンが不調でまいってる龍司です。

しばらく、備忘録をかねてcubsonネタつづくかもしれません(^^;

さて、cubson が生成する編集用コードでは ActionForm が使われていることを 前回 書きました。

XCube_ActionForm では、基本的な妥当性検査(文字列長のチェックや必須チェックなど)の指定は prepare メソッド内で行います。

たとえば、username が 100 文字以内かどうか検査するための指定は次のようになります。

PREfunction prepare()
{
$this->mFormProperties['username'] =& new XCube_StringProperty('username');

$this->mFieldProperties['username'] =& new XCube_FieldProperty($this);
$this->mFieldProperties['username']->setDependsByArray(array('maxlength'));
$this->mFieldProperties['username']->addMessage('maxlength', _MD_VIDEO_ERROR_MAXLENGTH, _MD_VIDEO_LANG_EDE_SUB_EVENT_NAME, '250');
$this->mFieldProperties['username']->addVar('maxlength', '100');
}/PRE

最初の new XCube_StringProperty(\'username\') で username は 文字列であることを指定。

setDependsByArray() で利用する validator を配列で指定します。ここでは、maxlength を指定しています。
addMessage(validator 名 , エラーメッセージ)で validator ごとにエラーメッセージをセットします。
addVar()は、validator ごとにセットする値がことなりますが、最大値や最小値などをセットします。

ここで利用できる validator は、core/XCube_Validator.class.php で定義されています。
このファイルを参考にして自前の validator を作成して利用することもできます。

ただし、自前 validator を setDependsByArray でセットできるようにするには、次のようなクラス名にする必要があります。
# validator 取得部分には残念ながら delegate が入っていないので。。

// validator 名は 1 文字目だけ大文字
class XCube_{validator 名 }Validator extends XCube_Validator/PRE

たとえば次のように作成してください

class XCube_Ymd_dateValidator extends XCube_Validator
{
function isValid(&$form, $vars)
{
if ($form->isNull()) {
return true;
}
else {
$date_string = $form->toString();
$length = strlen($date_string);
if($length != 8 ){
return false;
}
if(!is_numeric($date_string)){
return false;
}
$year = substr($date_string, 0, 4);
$month = substr($date_string, 4, 2);
$day = substr($date_string, 6, 2);

return checkdate($month, $day, $year);
}
}
}

これは、YYYYMMDD 形式で日付が正しく入力されているかチェックするための validator の例です。
ActionForm が呼び出されるまでに読み込めていれば OK ですので、preload や利用するモジュールの Module.class.php あたりで インクルードしておくと良いとおもいます。

利用するときは ActionForm の prepare 内で下記のように指定します。

    $this->mFieldProperties['start_date']->setDependsByArray(array('ymd_date'));/PRE