我只是想创建一个非AJAX注册表单。
当我通过CForm提交时,PHP表示正在非对象上调用error()。我检查了发生错误的源文件,并且(使用var_dump(get_class($parent->getActiveFormWidget()));
)发现getActiveFormWidget()返回CFormInputElement
,它没有定义error()。
我认为这与CForm::activeForm有关,但默认为CActiveForm
。
我确实试过'enableAjaxValidation'=>false
。
我不理解什么?我怀疑我在路上误解了一些东西。
的一个CFormInputElement :: renderError(): 的
public function renderError()
{
$parent=$this->getParent();
// $parent->getActiveFormWidget() returns object that does not define error()
return $parent->getActiveFormWidget()->error($parent->getModel(), $this->name, $this->errorOptions, $this->enableAjaxValidation, $this->enableClientValidation);
}
的型号: 的
class RegisterFormModel extends CFormModel {
public $email;
public $password;
public $password_confirm;
public function rules()
{
return array(
array('email, password, password_confirm', 'required'),
array('password','compare','compareAttribute'=>'password_confirm'),
array('password, password_confirm','length','min'=>'6','max'=>'20'),
array('email', 'email'),
array('email', 'length', 'max'=>256)
);
}
public function attributeLabels()
{
return array(
'email'=>'Email',
'password'=>'Password',
'password_confirm'=>'Confirm Password',
);
}
}
查看: 的
<div class="form">
<?php echo $form; ?>
</div><!-- form -->
控制器操作:
class RegisterAction extends CAction
{
public function run()
{
$register_model = new RegisterFormModel;
$controller = $this->getController();
$form = new CForm(array(
'title'=>'Register',
'enableAjaxValidation'=>false,
'elements'=>array(
'email'=>array(
'type'=>'text',
'maxlength'=>256,
),
'password'=>array(
'type'=>'password',
'minlength'=>6,
'maxlength'=>32,
),
'password_confirm'=>array(
'type'=>'password',
'minlength'=>6,
'maxlength'=>32,
),
),
'buttons'=>array(
'register'=>array(
'type'=>'submit',
'label'=>'Register',
),
),
), $register_model);
if($form->submitted('register', true) && $form->validate())
{
// ...
}
else
{
$controller->render('register', array('model'=>$register_model, 'form'=>$form));
}
}
}
答案 0 :(得分:1)
好吧,我向你展示过我从未见过使用过CForm。
我建议您使用活动表单小部件
您需要在CFormModel中定义所有这些字段。这样您就可以为它们提供适当的验证。
答案 1 :(得分:1)
我知道答案真的很晚:) 但是为了其他可能有类似错误的人。
<?php
// change from: echo $form;
echo $form->render();
?>
我分别渲染元素,所以我就是这样做的:
<?php
// without the renderBegin() and renderEnd() it may give the no object error
echo $form->renderBegin();
echo $form->renderElements();
echo $form->renderEnd();
?>