1

ユーザーがページプロファイルを更新しようとしたときに、入力が検証ルールに従って検証されないプロファイルページがありますが、保存は続行されます (または少なくとも成功メッセージが出力されます) が、データは保存されません、元の値に戻ります。検証ルールが渡された場合にのみ、値が保存されます。

検証ルールが正しいように見えるため、これを修正する方法がわかりません。何か案は?

検証規則

 public $validate = array(
    "username" => array(
        "email" => array(
            "rule" => "email",
            "message" => "The username must be a valid email address."
        ),
        "unique" => array(
            "rule" => "isUnique",
            "message" => "This username has already been registered."
        )
    ),
    "password" => array(
        "alphaNumeric" => array(
            "rule" => "alphaNumeric",
            "message" => "The password can only contain alpha-numeric characters"
        ),
        "between" => array(
            "rule" => array("between",8,12),
            "message" => "The password must contain between 8 - 12 characters."
        )
    ),
    "company" => array(
        "rule" => "notEmpty",
        "message" => "Please provide a company name"
    ),
    "first_name" => array(
        "rule" => "notEmpty",
        "message" => "Please provide the contact person's first name"
    ),
    "last_name" => array(
        "rule" => "notEmpty",
        "message" => "Please provide the contact person's last name"
    ),
    "telephone" => array(
        "numeric" => array(
            "rule" => "numeric",
            "message" => "The telephone number must be numeric"
        ),
        "maxLength" => array(
            "rule" => array("maxLength",10),
            "message" => "Your telephone umber must be 10 numbers."
        ) 
    ),
    "fax" => array(
        "numeric" => array(
            "rule" => "numeric",
            "message" => "The fax number must be numeric"
        ),
        "maxLength" => array(
            "rule" => array("maxLength",10),
            "message" => "Your fax umber must be 10 numbers."
        )
    ),
    "user_type_id" => array(
        "rule" => "numeric",
        "message" => "Please select a user type"
    ),
    "user_status_id" => array(
        "rule" => "numeric",
        "message" => "Please select the users status."
    )
);

コントローラーの方法:

 public function profile() {
    if($this->request->is('post') || $this->request->is('put')) {
        if($this->Auth->user("id") == $this->request->data['User']['id']) {
            $this->User->save($this->request->data);
            $this->Session->setFlash('Your profile has been updated','default',array('class'=>'success'));
        } else {
            $this->Session->setFlash("An error has occured updating your profile.");
        }
    }
    $this->request->data = $this->User->read(null,$this->Auth->user("id"));
}
4

2 に答える 2

1

問題は if ブロックにあります。あなたの周りには誰もいません$this->User->save($this->request->data);

だからあなたが必要です

if ($this->User->save($this->request->data)) {
    // set good flash
} else {
    // else set bad flash
}

そして、Auth->user('id') が投稿データと等しくない場合に 1 つ必要になります (または、一般的なメッセージを送信するだけの場合は、2 つを 1 つの if ステートメントに結合します)。

于 2012-07-22T06:53:30.917 に答える
1

検証はおそらく正しく機能しています。問題は次のロジックによるものだと思います。

if($this->Auth->user("id") == $this->request->data['User']['id']) {
    $this->User->save($this->request->data);
    $this->Session->setFlash('Your profile has been updated','default',array('class'=>'success'));
} else {
    $this->Session->setFlash("An error has occured updating your profile.");
}

if ステートメントは、現在ログインしているユーザー ID がフォームで送信されたものと一致するかどうかのみをチェックします。ID が一致すると、レコードを保存しようとします。その後、その行を実行します。

そのため、save の呼び出しが有効かどうかに関係なく、次の行に移動し$this->Session->setFlash('Your profile has been updated','default',array('class'=>'success'));ます。そのため、プロフィールは毎回更新されていると言っています。

おそらく次のようなものが必要です。

if($this->Auth->user("id") == $this->request->data['User']['id']) {
    if ($this->User->save($this->request->data)) {
        $this->Session->setFlash('Your profile has been updated','default',array('class'=>'success'));
    } else {
        $this->Session->setFlash("An error has occured updating your profile.");
    }
} else {
    this->Session->setFlash("This is not your profile.");
}
于 2012-07-22T06:54:24.710 に答える