2010-12-02 1 views
0
で実行時のバリデーションルールの設定

私の問題は今モデルは、検証のセットを持っているということですので、のようなルール:は、CakePHP

var $validate = array(
    'title' => array(
     'rule' => 'notEmpty' 
    ), 
    'uri' => array(
     'slugged' => array(
      'rule' => '/^[a-z0-9-_]+$/i', 
      'message' => 'This field should only contain characters, numbers, dashes and underscores' 
     ), 
     'uniqueUrl' => array(
      'rule' => array('uniqueUrl'), 
      'message' => 'A page has already acquired this url' 
     ) 
    ), 
    'meta_keywords' => array(
     'rule' => 'notEmpty' 
    ), 
    'meta_description' => array(
     'rule' => 'notEmpty' 
    ), 
    'layout' => array(
     'rule' => 'notEmpty' 
    ) 
); 

問題がhasOneの関係を持っている別のモデルでは、そのコントローラはまた、データを挿入することですそれに私はそのページからタイトル、URI、レイアウトを必要としないようにしたい。どうすればいいのですか?

投稿モデルがあり、そこでページの値を設定しました。

Array 
(
    [Post] => Array 
     (
      [title] => data[Post][title] 
      [body] => 

Post Body 

     ) 

    [Category] => Array 
     (
      [Category] => Array 
       (
        [0] => 1 
        [1] => 2 
        [2] => 3 
        [3] => 4 
       ) 

     ) 

    [Page] => Array 
     (
      [meta_keywords] => data[Page][meta_keywords] 
      [meta_description] => data[Page][meta_description] 
     ) 

) 

私はそれがこのようなことに転じページモデル

$this->data['Page']['title'] = $this->data['Post']['title']; 

のための情報を設定するには、コントローラから次の操作を行います。

Array 
(
    [Post] => Array 
     (
      [title] => data[Post][title] 
      [body] => 

Post Body 

     ) 

    [Category] => Array 
     (
      [Category] => Array 
       (
        [0] => 1 
        [1] => 2 
        [2] => 3 
        [3] => 4 
       ) 

     ) 

    [Page] => Array 
     (
      [meta_keywords] => data[Page][meta_keywords] 
      [meta_description] => data[Page][meta_description] 
      [title] => data[Post][title] 
     ) 

) 

私の問題は、私は必要としないことですPageフィールドを保存します。 Post belongsTo Page

ポストとしてポストを保存する場合は、ポストコントローラでメソッドのデフォルトビューを使用しますが、[Page][layout]は必要ありません。ページはスタティックページを使用し、ポストを作成するときではなく、ページを作成するときに必要になります。

+1

これは奇妙なことです。なぜなら、検証ルールはあなたのデータベースに入るものを「保護」するべきだからです。空のタイトルが受け入れられる場合、ルールは 'notEmpty'であってはなりません。どうか明らかにしてください。フィールドの1つだけを更新し、そのプロセスで 'title'などに触れる必要はないということを意味していますか? – deceze

+0

実際には、私は他のモデルから情報を得るべきです、私はPost ['title']などからPage ['title]を得るでしょう。私はコントローラ内にそれらを置いてsaveAllの直前に値を設定するべきですプロセス? –

+0

私は既にそれをしましたが、別の方法があれば私は考えていました。 –

答えて

0

検証の前にデータを前処理しているので、検証から何らかの制御を取り除いています。特定のフィールドに人為的に入力する必要があるかどうか(コード内で)決定しているように見えるので、これらの部分を冗長にレンダリングしているため、それらを削除する必要があります。 PHPで複数のバリデーションがある場合、最終的には混乱することになります。

これを行う方法、またはそれをよりきれいに行う方法は?うーん、beforeValidateはこれを行うための「正しい」場所かもしれませんが、アプリケーションのロジックに最も適した場所であればどこでも実行できます。機能は優雅の前に来るべきです。