首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Yii中验证来自表单的时区输入?

如何在Yii中验证来自表单的时区输入?
EN

Stack Overflow用户
提问于 2013-10-29 19:40:31
回答 1查看 485关注 0票数 1

我有一个下拉列表,用户可以在表单上选择他们的时区。在提交时,我正在寻找使用Yii规则验证时区输入字段的最佳方法。

我可以使用以下方法在PHP中获得一个时区数组:

代码语言:javascript
复制
DateTimeZone::listIdentifiers(DateTimeZone::ALL)

这些值如下(带时区值的索引键):

代码语言:javascript
复制
Array([0]=>'Pacific/Midway',[1]=>'Pacific/Niue',...);

我的复选框如下所示:

代码语言:javascript
复制
<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>

我尝试了以下几点:

代码语言:javascript
复制
public function rules() {
  return array(
    array('timezone','in','range'=>DateTimeZone::listIdentifiers(DateTimeZone::ALL)),
    array(timezone','required'),
  );
} // rules()

但是它从未验证过,我认为因为这个范围是一个多维数组,为了使范围工作,它只需要是一个数组,比如数组(‘value2 1’,'value2');这是真的吗?

有没有更好的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-29 19:59:29

最好的方法是创建自定义验证器类,一些示例(未经测试,根据需要调优/修复):

代码语言:javascript
复制
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!');
        }
    }
}

然后在你的模型中使用它:

代码语言:javascript
复制
/**
 * @return array validation rules for model attributes.
 */
public function rules()
{
    return array(
       array('timezone', 'alias.to.CountryValidator'),
    );
}

该方法具有非常重要的优点:与其他验证器一样,它是可重用的,并且不会破坏您的模型代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19667654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档