在模型规则错误消息上显示另一个属性值

时间:2013-04-08 10:32:55

标签: php yii

我通过校验和验证一个新条目,该校验和是所有条目的md5(),以查看条目是否已存在且工作正常,但对于规则消息,我想显示条目" name&# 34;而不是如下的唯一属性:

public function rules() {
    return array_merge(parent::rules(), array(
        array('checksum', 'unique', 'message' => 'Store ' . $this->name . 'already exists on the database.'),
    ));
}

规则函数始终将$ this-> name作为null。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

CUniqueValidator支持错误消息中的自定义{value}占位符,但不幸的是,它会映射到要验证的属性的值(校验和),因此您无法利用它显示名称。

此外,当框架调用rules()时,当前实例仍为空,因此上面写的$this->name将始终具有name属性的默认值 - 通常{ {1}}。

获得所需内容的唯一方法是扩展null,也许是这样:

CUniqueValidator

然后,您可以使用

定义验证规则
class ExtendedUniqueValidator extends CUniqueValidator
{
    public $additionalPlaceholders;

    protected function addError($object,$attribute,$message,$params=array())
    {
        $params['{attribute}']=$object->getAttributeLabel($attribute);

        $additional = array_filter(
            array_map('trim', explode(',', $this->additionalPlaceholders)));
        foreach ($additional as $attributeName) {
            $params['{'.$attributeName.'}'] = $object->$attributeName;
        }

        $object->addError($attribute,strtr($message,$params));
    }
}

答案 1 :(得分:1)

在规则函数中无法访问正在验证的对象,而Yii中的验证器使用占位符机制。

我认为获得所需行为的正确方法是扩展uniqueValidator以将对象名称包含在新的或现有的占位符中。