2012-05-10 27 views
2

ケーキPHPの検証でエラーが発生します名前を既存の細かいエラーThis person name already existsを与えると、新しい人を追加するときケーキPHPの検証ルール「isUniqueは」「isUnique」編集

var $validate = array(
    'name' => array(
     'notempty' => array(
      'rule' => array('notempty'), 
     ), 
     'isUnique' => array (

      'rule' => 'isUnique', 

      'message' => 'This person name already exists.' 
     ) 

) 
); 

ここでは編集上のエラーが発生します。 しかし、既存の人物の編集でも、同じisUniqueエラーが返されます。

どのように並べ替えることができますか?本から

'isUnique' => array (

      'rule' => 'isUnique', 

      'message' => 'This person name already exists.', 

      'on' => 'create', 
) 

+0

'を作成' => 'on' に取り除くには、あなたはあなたが投稿できますロジックを編集しますか? –

+0

レコードにない 'name'で更新できます(更新時に現在の名前を除く)。更新時にエラーメッセージを表示します –

答えて

10

てみ

ルールは=>「を作成」「に」が定義されている場合は、ルールは、新しいの作成中に を適用されます記録。同様に、 'on' => 'update'と定義されている場合は、 レコードの更新中にのみ適用されます。

しかし、名前を変更することが許可されていて、他のレコードから一意性が必要な場合は、独自の固有の検証が必要になる場合があります。それを可能にする、そうでなければ失敗する。

編集: 次を使用しないでください - ビルトインisUnique検証ケーキは

注すでにそれを処理 - 未テストコード(その後半、私は午前中にテストします)が、それはあなたのアイデアを与えるだろう

'isUniqueName' => 'ルール' に 'isUnique' =>モデルと変化する 'ルール' に以下を追加し、

public function isUniqueName($fields) { 
     $conditions = array($this->alias . '.name' => $this->data[$this->alias]['name']); 
     if (isset($this->data[$this->alias][$this->primaryKey])) { 
      $conditions[$this->alias . '.' . $this->primaryKey . ' <>'] = $this->data[$this->alias][$this->primaryKey]; 
     } 
     return $this->find('count', compact('conditions')) == 0; 
} 
+0

' name'で更新できないレコード(すでに現在の名前を除く)がすでにレコードにある場合は、更新時にエラーメッセージを表示します。 –

+0

です - 私の編集を参照してください。 – tigrang

+0

このようにしないことを強くお勧めします。検証ルールはIDを渡す限り編集ビューでも機能するはずです(ケーキはこのレコードをisUnique検証チェックから除外しなければならないことを知っています)。 – mark