0

我通过校验和验证一个新条目,该校验和是所有条目的 md5() 以查看该条目是否已经存在并且工作正常,但是对于规则消息,我想显示条目“名称”而不是唯一属性下列的:

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

规则函数总是将 $this->name 设为 null。有任何想法吗?

4

2 回答 2

2

CUniqueValidator支持{value}在错误消息中针对这种确切情况的自定义占位符,但不幸的是,它映射到正在验证的属性的值(校验和),因此您不能利用它来显示名称。

此外,当rules()被框架调用时,当前实例仍然是空的,因此$this->name如上所述将始终具有name属性的默认值——通常是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));
    }
}

然后,您可以定义验证规则

'additionalPlaceholders' => 'name', // comma-separated list
'message' => 'Store {name} already exists on the database.',
于 2013-04-09T09:35:38.640 回答
1

正在验证的对象在规则函数中是不可访问的,而 Yii 中的验证器使用占位符机制来代替。

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

于 2013-04-08T10:48:45.833 回答