2013-04-08 51 views
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。有任何想法吗?

回答

1

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

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

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.', 
验证规则
相关问题