2014-03-31 55 views
0

要么我不明白CCompareValidator如何在Yii中工作(原文如此!)或者它根本不适用于我。Yii的CCompareValidator不起作用

我想检查一下,如果正在更新的行/记录/用户的ID与当前登录用户的ID不一样。如果是,则禁止更新。

我在第一次使用CCompareValidator

array('id', 'compare', 'compareValue'=>Yii::app()->user->id, 'message'=>'Boom!') 

它不工作 - 它会暂停所有的行/记录/用户,不管什么一个ID其实就是编辑/更新。

因此,我将它重写为我自己的自定义验证程序。在我看来,该代码是相同的情况下,内置一个:

array('id', 'compareId', 'compareValue'=>Yii::app()->user->id, 'message'=>'Boom!') 

public function compareId($attribute = null, $params = null) 
{ 
    if($attribute === 'id') 
    { 
     if($this->id == $params['compareValue']) 
     { 
      $this->addError($params['message']); 
     } 
    } 
} 

它的工作原理就像一个魅力 - 允许任何行/记录/用户,该ID比当前已登录不同的更新在用户的ID中。阻止更新,显示已定义的消息,以防比较ID相等。

我错过了什么?为什么Yii的内置验证器在这个简单的例子中失败,而我自己的作品呢?

+0

你设置'skipOnError'为false吗? –

+0

['skipOnError'](http://www.yiiframework.com/doc/api/1.1/CValidator#skipOnError-detail)默认设置为'false'。除此之外,它与这个问题无关 - 它处理的情况有多个验证错误,在这种情况下,这是第一个也是唯一的验证错误。为了让自己确信,我用'skipOnError'设置为'true'和'false'来测试案例。没有效果。 – trejder

回答

1

的验证工作,像预想的那样,我的逻辑都失败了:

  1. CCompareValidator,抛出一个错误,当两个比较值不相等。另一方面,如果他们是平等的 - 它通过验证没有错误。这是假设的行为。

  2. 当两个值都不相同(记录的用户编辑不同的值)时,我想要一个错误,当值相等时(表示该用户试图编辑自己)并通过验证。

这就是为什么我需要使用'operator'=>'!='作为验证器的配置。这是答案。

顺便说一句:解决这个问题的所有荣耀去Keith at YiiFramework.com's forum