Php Yii2表单验证

Php Yii2表单验证,php,yii,yii2,Php,Yii,Yii2,我刚刚用Yii2启动了我的第一个web应用程序。在活动表单验证方面遇到一些问题 在我的模型课上,我有一套规则 ProfileForm.php class ProfileForm extends Model { public $email; public $lastName; public $firstName; public $password; public $phone; public $address; public functio

我刚刚用Yii2启动了我的第一个web应用程序。在活动表单验证方面遇到一些问题

在我的模型课上,我有一套规则

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'],
            ];
        }
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,
        ]); 
}
<?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(); ?>
UserController

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'],
            ];
        }
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,
        ]); 
}
<?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(); ?>
查看
profile.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'],
            ];
        }
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,
        ]); 
}
<?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
model类在更新实际模型类之前验证该值。但是,当我将空值插入视图类中的字段时,不会触发表单验证。

您对
actionProfile()调用了错误的模型。

 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
        ]);
    }
您正在调用
User::findOne()
,因此您不能指望
ProfileForm
中的规则会起作用。如果不想使用
ProfileForm
,可以在
ProfileForm
类中扩展
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,
        ]); 
}
==========================

请记住,如果要通过
ProfileForm
扩展
User
,则必须删除属性定义:

public $email;
public $lastName;
public $firstName;
public $password;
public $phone;
public $address;

您的意思是没有触发客户端验证还是服务器端验证?客户端验证用于开始删除
选项'=>[],'fieldConfig'=>[]
您还可以在一行中将所有字段的手动分配从
Profile
更改为
User
,即
$User->attributes=$model->attributes
@Yupik删除不起作用。首先,此代码与客户端验证无关。第二,这是低质量的代码,您应该在可以的时候重构它。这段代码以我的形式实现并正确验证。没关系,我可以用yii2中的纯php编写表单,但即使它正常工作,它仍然是错误的。而且,正如我所说,这段代码与客户端验证无关。@Yupik你怎么能说这段代码与客户端验证无关。我的文件中也有同样的代码。客户端验证由web浏览器(主要是javascript)执行。您在这里粘贴了控制器操作,带有服务器端验证,以及根本不用的变量。请再次仔细阅读OP问题和评论,并关注答案。我认为问题与客户端验证相关,而不是触发,即使您将表单的
操作
指向某个甚至不存在的其他
控制器/操作
,也不会产生影响,但是,如果问题是在表单提交到操作之后进行验证,那么它可能会工作。事实上,问题与客户端验证有关。客户端验证使用的是
User
model
rules()
,而不是
ProfileForm
model
rules()
,因此,如果在
User
模型中,字段上没有
require
规则-它将不会生成JS脚本来验证它。啊
:D
是的,我没有注意到这个好的捕获+我为此付1英镑