2

AJAX以外の登録フォームを作成しようとしています。

CFormを介して送信すると、PHPはerror()が非オブジェクトで呼び出されていると言います。エラーが発生したソースファイルを確認したところ、(を使用してvar_dump(get_class($parent->getActiveFormWidget()));)getActiveFormWidget()が、CFormInputElementerror()が定義されていないを返すことがわかりました。

これは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 に答える