我有一个用户可以通过邀请访问的注册表单。例如,受邀用户可以转到/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在进入时设置。
答案 0 :(得分:0)
1)您是否最初在$ this->模型 - >保存之前设置$ this->数据?
答案 1 :(得分:0)
这很奇怪,我已经做到了,没有任何问题。如果我理解正确,那就是表单显示后的最后一个。如果使用此
进入块时验证已经失败,您可以检入控制器echo debug($this->User->invalidFields() );
答案 2 :(得分:0)
不幸的是,控制器loadModel()函数根据您操作的第一个参数设置模型中的id属性。这是CakePHP 2.0中删除的一大烦恼。然而,在设置Id之后,没有代码可以自动验证您的字段,因此我的猜测是您有一个处理自动验证的组件,或者您的模式中有一些代码会在创建模型时执行此操作。
如果您找不到自动验证数据的代码,或者不想更改它,我建议您覆盖控制器中的loadModel()以删除id分配,或者仅为您的操作使用命名参数。