我有一个下拉列表,用户可以在表单上选择他们的时区。在提交时,我正在寻找使用Yii规则验证时区输入字段的最佳方法。
我可以使用以下方法在PHP中获得一个时区数组:
DateTimeZone::listIdentifiers(DateTimeZone::ALL)这些值如下(带时区值的索引键):
Array([0]=>'Pacific/Midway',[1]=>'Pacific/Niue',...);我的复选框如下所示:
<select name="timezone" id="timezone">
<option value="Pacific/Midway">Pacific/Midway (GMT-11:00)</option>
<option value="Pacific/Niue">Pacific/Niue (GMT-11:00)</option>
...
</select>我尝试了以下几点:
public function rules() {
return array(
array('timezone','in','range'=>DateTimeZone::listIdentifiers(DateTimeZone::ALL)),
array(timezone','required'),
);
} // rules()但是它从未验证过,我认为因为这个范围是一个多维数组,为了使范围工作,它只需要是一个数组,比如数组(‘value2 1’,'value2');这是真的吗?
有没有更好的方法?
发布于 2013-10-29 19:59:29
最好的方法是创建自定义验证器类,一些示例(未经测试,根据需要调优/修复):
class CountryValidator extends CValidator
{
/**
* Validates the attribute of the object.
* If there is any error, the error message is added to the object.
* @param CModel $object the object being validated
* @param string $attribute the attribute being validated
*/
protected function validateAttribute($object,$attribute)
{
$ids = DateTimeZone::listIdentifiers(DateTimeZone::ALL);
if(!in_array($object->$attribute, $ids))
{
$this->addError($object,$attribute,'Wrong time zone selected!');
}
}
}然后在你的模型中使用它:
/**
* @return array validation rules for model attributes.
*/
public function rules()
{
return array(
array('timezone', 'alias.to.CountryValidator'),
);
}该方法具有非常重要的优点:与其他验证器一样,它是可重用的,并且不会破坏您的模型代码。
https://stackoverflow.com/questions/19667654
复制相似问题