2014-03-31 111 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