code:
<?php
class PFuncValidator extends CValidator
{
public $funcName;
public $funcParams = array('{value}');
public $allowEmpty=true;
protected function validateAttribute($object,$attribute)
{
$value=$object->$attribute;
if($this->allowEmpty && $this->isEmpty($value))
return;
$params = var_export($this->funcParams, true);
$params = '$params='.strtr($params, array("'{value}'"=>'$value')).';';
eval($params);
$valid=call_user_func_array($this->funcName, $params);
if(!$valid)
{
$message=$this->message!==null?$this->message:'{attribute} is invalidated';
$this->addError($object,$attribute,$message);
}
}
}
usage:
public function rules()
{
return array(
//call is_array($value)
array('xxxxx', 'ext.PFuncValidator', 'funcName'=>'is_array'),
//call test(4, $value)
array('xxxxx', 'ext.PFuncValidator', 'funcName'=>'test', 'funcParams'=>array(4, '{value}')),
//call $obj->test($value);
array('xxxxx', 'ext.PFuncValidator', 'funcName'=>array($obj, 'test'), 'message'=>'xxxxxxxxxxxxx'),
);
}