在初始表单加载时执行验证

时间:2011-03-24 19:23:04

标签: cakephp cakephp-1.3

我有一个用户可以通过邀请访问的注册表单。例如,受邀用户可以转到/users/register/[invite_code]并获取部分填充的注册表单。我看到了一些我没想到的东西:

如果邀请代码有效,我们会返回用户结构并在$this->data中设置该结构,以便自动预先填充表单。预填充有效,但是当表单加载时,数据验证错误就会显示,就像我提交了表单一样。当预先填充了一个值时,我看到很多“[字段名称]不能为空”。

在回答问题时,调用注册操作以显示和提交表单。代码如下所示:

public function register( $invite = null ) {
  # Handle a submitted registration
  if( !empty( $this->data ) ) {
    # Do stuff...

    if( $this->User->save( $this->data ) ) {
      $this->Session->setFlash( 'Welcome. Thanks for registering.', null, null, 'success' );
      $this->redirect( $this->Auth->redirect() );
    }
    else {
      $this->Session->setFlash( 'Oh noz. There\'s a problem with your registration.', null, null, 'validation' );
    }
  }

  # If an invite is passed, pull the user attached to that invite.
  if( !empty( $invite ) ) {
    # Attempt to pull the user that owns the invite

    if( empty( $user ) ) { # Unrecognized invite code
      # Do stuff...
    }
    else { # Invited user found
      if( !empty( $user['User']['password'] ) ) { # Invited user has already registered
        # Do stuff...
      }
      else { # This is the invited user
        $this->data = $user;
      }
    }
  }
}

感谢。

更新

回到此之后,当我将用户分配到$this->data时,问题就出现了。当我删除它,没有验证错误。不幸的是,也没有预先人口。我需要后者,所以我需要找到一种设置数据点的方法,而不会触发错误消息。

更新2

如果我转储$this->User->invalidFields(),即使早在UsersController::beforeFilter()的第一行,该数组也会填充invalids。这怎么可能?在请求的早期,我可能会做些什么呢?

更新3

我还注意到,当我输入UsersController::beforeFilter()时,$this->User->id的值已经设置。我不知道在哪里或为什么,但这似乎很重要。据我所知,进入实际应用程序代码的第一步是相关控制器的beforeFilter方法,用户ID在进入时设置。

3 个答案:

答案 0 :(得分:0)

1)您是否最初在$ this->模型 - >保存之前设置$ this->数据?

答案 1 :(得分:0)

这很奇怪,我已经做到了,没有任何问题。如果我理解正确,那就是表单显示后的最后一个。如果使用此

进入块时验证已经失败,您可以检入控制器
echo debug($this->User->invalidFields() );

答案 2 :(得分:0)

不幸的是,控制器loadModel()函数根据您操作的第一个参数设置模型中的id属性。这是CakePHP 2.0中删除的一大烦恼。然而,在设置Id之后,没有代码可以自动验证您的字段,因此我的猜测是您有一个处理自动验证的组件,或者您的模式中有一些代码会在创建模型时执行此操作。

如果您找不到自动验证数据的代码,或者不想更改它,我建议您覆盖控制器中的loadModel()以删除id分配,或者仅为您的操作使用命名参数。