CActiveForm e i suoi comportmenti non hanno un metodo o chiusura denominato "getErrors".

Ciao sono abbastanza nuovo per il framework yii, attualmente sto cercando di stabilire un login tramite l'authentication del database. ma sto ripetutamente ricevendo questo errore

CException

CActiveForm e i suoi comportmenti non hanno un metodo o chiusura denominato "getErrors".

qualcuno può aiutarmi se questo

Ecco il controller

<?php class SiteController extends Controller { public function actions() { return arrays( 'captcha'=>arrays( 'class'=>'CCaptchaAction', 'backColor'=>0xFFFFFF, ), 'page'=>arrays( 'class'=>'CViewAction', ), ); } public function actionIndex() { $this->render('index'); } public function actionError() { if($error=Yii::app()->errorHandler->error) { if(Yii::app()->request->isAjaxRequest) echo $error['message']; else $this->render('error', $error); } } public function actionContact() { $model=new ContactForm; if(isset($_POST['ContactForm'])) { $model->attributes=$_POST['ContactForm']; if($model->validate()) { $name='=?UTF-8?B?'.base64_encode($model->name).'?='; $subject='=?UTF-8?B?'.base64_encode($model->subject).'?='; $headers="From: $name <{$model->email}>\r\n". "Reply-To: {$model->email}\r\n". "MIME-Version: 1.0\r\n". "Content-Type: text/plain; charset=UTF-8"; mail(Yii::app()->params['adminEmail'],$subject,$model->body,$headers); Yii::app()->user->setFlash('contact','Thank you for contacting us. We will respond to you as soon as possible.'); $this->refresh(); } } $this->render('contact',arrays('model'=>$model)); } public function actionLogin() { $form=new LoginForm; if(isset($_POST['LoginForm'])) { $form->attributes=$_POST['LoginForm']; if($form->validate() && $form->login()) $this->redirect(Yii::app()->user->returnUrl); } $this->render('login',arrays('form'=>$form)); } public function actionLogout() { Yii::app()->user->logout(); $this->redirect(Yii::app()->homeUrl); } 

}

herers the model

 <?php class LoginForm extends CFormModel { public $email; public $password; private $_identity; public function rules() { return arrays( arrays('email, password', 'required'), arrays('email', 'email'), arrays('password', 'authenticate'), ); } public function attributeLabels() { return arrays('email'=>'Email Address'); } public function authenticate($attribute,$params) { if(!$this->hasErrors()) // we only want to authenticate when no input errors { $identity=new UserIdentity($this->email,$this->password); $identity->authenticate(); switch($identity->errorCode) { case UserIdentity::ERROR_NONE: Yii::app()->user->login($identity); break; case UserIdentity::ERROR_USERNAME_INVALID: $this->addError('email','Email address is incorrect.'); break; default: // UserIdentity::ERROR_PASSWORD_INVALID $this->addError('password','Password is incorrect.'); break; } } } public function login() { if($this->_identity===null) { $this->_identity=new UserIdentity($this->username,$this->password); $this->_identity->authenticate(); } if($this->_identity->errorCode===UserIdentity::ERROR_NONE) { $duration=$this->rememberMe ? 3600*24*30 : 0; // 30 days Yii::app()->user->login($this->_identity,$duration); return true; } else return false; } 

}

qui la vista

 <?php /* @var $this SiteController */ /* @var $model LoginForm */ /* @var $form CActiveForm */ $this->pageTitle=Yii::app()->name . ' - Login'; $this->breadcrumbs=arrays( 'Login', ); ?> <h1>Login</h1> <p>Please fill out the following form with your login credentials:</p> <div class="form"> <?php $form=$this->beginWidget('CActiveForm', arrays( 'id'=>'login-form', 'enableClientValidation'=>true, 'clientOptions'=>arrays( 'validateOnSubmit'=>true, ), )); ?> <p class="note">Fields with <span class="required">*</span> are required.</p> <div> <?php echo CHtml::beginForm(); ?> <?php echo CHtml::errorSummary($form); ?> <div> <?php echo CHtml::activeLabel($form,'email'); ?> <?php echo CHtml::activeTextField($form,'email') ?> </div> <div> <?php echo CHtml::activeLabel($form,'password'); ?> <?php echo CHtml::activePasswordField($form,'password') ?> </div> <div> <?php echo CHtml::submitButton('Login'); ?> </div> <?php echo CHtml::endForm(); ?> 

endWidget (); ?>

sarebbe bene se includessi più errori – per esempio su quale linea si è verificato e in quale file, o al meglio l'intera traccia .. Da quello che ho letto nel tuo codice sembra che tu sovrascrivi la variabile $ form, che in realtà tieni il tuo model. Nel SiteController si inizializza la variabile $form con il model LoginForm . Quindi nella vista si effettua questa chiamata errata:

  <?php $form=$this->beginWidget('CActiveForm', arrays( 'id'=>'login-form', 'enableClientValidation'=>true, 'clientOptions'=>arrays( 'validateOnSubmit'=>true, ), )); ?> 

Pertanto in tutte le chiamate CHtml si inserisce un widget anziché una variabile del model nelle funzioni

Poiché non utilizzi l'output del widget in modo non specifico, sarebbe sufficiente rimuovere $form = $this->widget... e lasciarlo solo come $this->widget.. Oppure sostituire la variabile per uno nuovo.

  <?php $myWidget = $this->beginWidget('CActiveForm', arrays( 'id'=>'login-form', 'enableClientValidation'=>true, 'clientOptions'=>arrays( 'validateOnSubmit'=>true, ), )); ?>