Yii - getActiveFormWidget() возвращает неверный тип в ядре?
Я только пытаюсь создать не-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));
}
}
}
2 ответа
Ну, я никогда не видел использование CForm, как вы показываете нам.
Я рекомендую вам использовать виджет активной формы,
и вам нужно определить все эти поля в вашей CFormModel. Таким образом, вы сможете обеспечить надлежащую проверку для них.
Я знаю, что ответ действительно поздно:) Но ради кого-то еще, у кого может быть подобная ошибка.
<?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();
?>