【问题标题】:Yii2 Form validationYii2 表单验证
【发布时间】:2018-02-13 07:54:46
【问题描述】:

我刚刚使用 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'],
            ];
        }

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 模型类在更新实际模型类之前验证值。但是当我向视图类中的字段插入空值时,不会触发表单验证。

【问题讨论】:

  • 你的意思是客户端验证还是服务器端没有触发?
  • 客户端验证
  • 开始删除options' =&gt; [], 'fieldConfig' =&gt; []
  • 您还可以在一行中将所有字段的手动分配从Profile 更改为User,即$user-&gt;attributes=$model-&gt;attributes
  • @Yupik 删除不起作用。

标签: php yii yii2


【解决方案1】:

你给actionProfile()打错了电话:

public function actionProfile()
{
        $model = User::findOne(Yii::$app->user->id);  //here 
        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,
        ]); 
}

===========================

请记住,如果您要将 User 扩展为 ProfileForm您必须删除您的属性定义

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

【讨论】:

  • 我认为问题与未触发客户端验证有关,即使您将表单的 action 指向其他一些甚至不存在的 controller/action 也不会影响,但如果问题是在表单提交到操作后进行验证,然后它可能会起作用。
  • 问题实际上与客户端验证有关。客户端验证使用User 模型rules(),而不是ProfileForm 模型rules(),因此如果在User 模型中没有require 字段规则 - 它不会生成JS 脚本来验证它.
  • :D 是的,我没有注意到这个好消息。为此 +1
【解决方案2】:
 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
        ]);
    }

【讨论】:

  • 首先,这段代码与客户端验证无关。其次 - 这是低质量的代码,你应该尽可能地重构它。
  • 此代码以我的形式实现并正确验证。
  • 没关系,我可以在yii2中用纯php编写表单,但仍然是错误的,即使它正在工作。而且,正如我所说,此代码与客户端验证无关
  • @Yupik 你怎么能说这段代码与客户端验证无关。在我的文件中工作的代码相同。
  • 客户端验证由网络浏览器执行(主要由 javascript)。您在此处粘贴了控制器操作,带有 服务器端验证,带有您根本不使用的变量。请再次仔细阅读OP问题cmets并专注于答案。
猜你喜欢
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
  • 2019-05-23
  • 2015-10-29
相关资源
最近更新 更多