Yii2 表单验证
Yii2 Form validation
我刚刚用 Yii2 开始了我的第一个网络应用程序。活动表单验证有问题。
在我的模型 class 中,我有一套规则。
ProfileForm.php
class ProfileForm extends Model
{
public $email;
public $lastName;
public $firstName;
public $password;
public $phone;
public $address;
public function rules()
{
return [
[['email', 'firstName', 'lastName', 'address'], 'required'],
];
}
UserController
public function actionUpdateProfile()
{
$model = new ProfileForm();
if ($model->load(Yii::$app->request->post()) && $model->validate()) {
$user = User::findOne(Yii::$app->user->id);
if ($user != NULL) {
$user->email = $model->email;
$user->firstName = $model->firstName;
$user->lastName = $model->lastName;
$user->address = $model->address;
$user->phone = $model->phone;
$user->save();
}
}
}
public function actionProfile()
{
$model = User::findOne(Yii::$app->user->id);
return $this->render('profile', [
'model' => $model,
]);
}
查看profile.php
<?php
$form = ActiveForm::begin([
'id' => 'profile-form',
'action' => ['user/update-profile'],
'options' => [],
'fieldConfig' => [],
]);
?>
<div class="form-group">
<label class="col-sm-3 control-label">First Name</label>
<div class="col-sm-9">
<?= $form->field($model, 'firstName')->textInput([
'placeholder' => $model->attributeLabels()['firstName']
])->label(false) ?>
</div>
</div>
..
..
..
..
<div class="form-group">
<div class="col-sm-offset-3 col-sm-9">
<?= Html::submitButton(Yii::t('app', 'Updated'), ['class' => 'btn btn-default', 'name' => 'profile-button']) ?>
</div>
</div>
<?php ActiveForm::end(); ?>
我希望 ProfileForm
模型 class 在更新实际模型 class 之前验证值。但是当我向视图中的字段插入空值时,表单验证不会触发 class.
public function actionUpdateProfile() {
$model = ProfileForm::find()->where(['id' =>Yii::$app->user->id])->one();
if (Yii::$app->request->post()) {
$model->load(Yii::$app->request->post());
if ($model->validate()) {
$updateId = $model->update(Yii::$app->user->id)
}
}
return $this->render('profile', [
'model' => $model
]);
}
您向 actionProfile()
调用了错误的模型:
public function actionProfile()
{
$model = User::findOne(Yii::$app->user->id); //here
return $this->render('profile', [
'model' => $model,
]);
}
您正在呼叫 User::findOne()
,因此您不能期望来自 ProfileForm
的 rules 会起作用。如果您不想使用 ProfileForm
,您可以在 ProfileForm
class 中扩展您的 User
模型,例如:
class ProfileForm extends User // here your `User` model instead of `Model`
^记住命名空间^
然后将 actionProfile()
更改为:
public function actionProfile()
{
$model = ProfileForm::findOne(Yii::$app->user->id); //here ProfileForm now
return $this->render('profile', [
'model' => $model,
]);
}
============================
记住,如果您要将 User
扩展 ProfileForm
,您必须删除属性定义:
public $email;
public $lastName;
public $firstName;
public $password;
public $phone;
public $address;
我刚刚用 Yii2 开始了我的第一个网络应用程序。活动表单验证有问题。
在我的模型 class 中,我有一套规则。
ProfileForm.php
class ProfileForm extends Model
{
public $email;
public $lastName;
public $firstName;
public $password;
public $phone;
public $address;
public function rules()
{
return [
[['email', 'firstName', 'lastName', 'address'], 'required'],
];
}
UserController
public function actionUpdateProfile()
{
$model = new ProfileForm();
if ($model->load(Yii::$app->request->post()) && $model->validate()) {
$user = User::findOne(Yii::$app->user->id);
if ($user != NULL) {
$user->email = $model->email;
$user->firstName = $model->firstName;
$user->lastName = $model->lastName;
$user->address = $model->address;
$user->phone = $model->phone;
$user->save();
}
}
}
public function actionProfile()
{
$model = User::findOne(Yii::$app->user->id);
return $this->render('profile', [
'model' => $model,
]);
}
查看profile.php
<?php
$form = ActiveForm::begin([
'id' => 'profile-form',
'action' => ['user/update-profile'],
'options' => [],
'fieldConfig' => [],
]);
?>
<div class="form-group">
<label class="col-sm-3 control-label">First Name</label>
<div class="col-sm-9">
<?= $form->field($model, 'firstName')->textInput([
'placeholder' => $model->attributeLabels()['firstName']
])->label(false) ?>
</div>
</div>
..
..
..
..
<div class="form-group">
<div class="col-sm-offset-3 col-sm-9">
<?= Html::submitButton(Yii::t('app', 'Updated'), ['class' => 'btn btn-default', 'name' => 'profile-button']) ?>
</div>
</div>
<?php ActiveForm::end(); ?>
我希望 ProfileForm
模型 class 在更新实际模型 class 之前验证值。但是当我向视图中的字段插入空值时,表单验证不会触发 class.
public function actionUpdateProfile() {
$model = ProfileForm::find()->where(['id' =>Yii::$app->user->id])->one();
if (Yii::$app->request->post()) {
$model->load(Yii::$app->request->post());
if ($model->validate()) {
$updateId = $model->update(Yii::$app->user->id)
}
}
return $this->render('profile', [
'model' => $model
]);
}
您向 actionProfile()
调用了错误的模型:
public function actionProfile()
{
$model = User::findOne(Yii::$app->user->id); //here
return $this->render('profile', [
'model' => $model,
]);
}
您正在呼叫 User::findOne()
,因此您不能期望来自 ProfileForm
的 rules 会起作用。如果您不想使用 ProfileForm
,您可以在 ProfileForm
class 中扩展您的 User
模型,例如:
class ProfileForm extends User // here your `User` model instead of `Model`
^记住命名空间^
然后将 actionProfile()
更改为:
public function actionProfile()
{
$model = ProfileForm::findOne(Yii::$app->user->id); //here ProfileForm now
return $this->render('profile', [
'model' => $model,
]);
}
============================
记住,如果您要将 User
扩展 ProfileForm
,您必须删除属性定义:
public $email;
public $lastName;
public $firstName;
public $password;
public $phone;
public $address;