パスワードを変更するためのフォームとして使用される単純なCFormModelサブクラスがあります。クラスには2つの属性しかありません(password1、password2-確認用-)。コードは次のとおりです。
class ChangePasswordForm extends CFormModel {
public $password1;
public $password2;
public function rules() {
return array(
array('password1, password2', 'required'),
array('password2', 'compare', 'compareAttribute'=>'password1'),
array('password1, password2', 'safe'),
);
}
public function attributeLabels() {
return array(
'password1' => 'Enter new password',
'password2' => 'Confirm new password',
);
}
}
コントローラビューファイルで、CActiveFormオブジェクトを使用してこのフォームをレンダリングします。
<?php
$form=$this->beginWidget('CActiveForm',
array(
'id'=>'change-pwd-form',
'action'=>array('site/changePasswordPost'),
'enableClientValidation'=>true,
'enableAjaxValidation'=>true,
'clientOptions'=>array(
'validateOnSubmit'=>true,
),
)
);
echo $form->errorSummary($changePwdForm);
?>
<fieldset><legend>Change your password</legend>
<div class="row">
<?php
echo $form->labelEx($changePwdForm, 'password1');
echo $form->passwordField($changePwdForm, 'password1');
?>
</div>
<div class="row">
<?php
echo $form->labelEx($changePwdForm, 'password2');
echo $form->passwordField($changePwdForm, 'password2');
?>
</div>
<div class="row">
<?php
echo CHtml::submitButton('Change password');
?>
</div>
</fieldset>
<?php
$this->endWidget();
?>
コントローラアクションでは、ChangePasswordFormオブジェクトを渡して、上記のビューをレンダリングします。
$changePwdForm = new ChangePasswordForm;
$this->render('changePassword', array('userid'=>$userid, 'userType'=>$t,
'changePwdForm'=>$changePwdForm));
Yii::app()->end();
問題は、ビューがレンダリングされている間、Javascriptコードが生成されないことです。何もない。したがって、送信ボタンをクリックすると、(2つのパスワードフィールドが必須であるため)許可されないはずですが、送信されます。上記のコードの何が問題になっていて、Javascriptが作成されていませんか?