2

我只是想创建一个非 AJAX 注册表单。

当我通过 CForm 提交时,PHP 说 error() 在非对象上被调用。我检查了发生错误的源文件,并且(使用var_dump(get_class($parent->getActiveFormWidget()));)发现 getActiveFormWidget() 返回 a 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));    
        }
    }    
}
4

2 回答 2

1

好吧,我从未见过像您向我们展示的那样使用 CForm。

我建议您使用活动表单小部件,

http://www.yiiframework.com/wiki/195/implementing-a-registration-process-using-the-yii-user-management-module/

您需要在 CFormModel 中定义所有这些字段。这样,您将能够为它们提供适当的验证。

于 2012-07-08T17:22:42.340 回答
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();
?>
于 2015-01-07T12:51:04.057 回答