我对Yii很新。
只有在用户选择了图像时,才必须应用图像验证(允许使用.svg和.png)。
public function rules() {
return [
[['logo'], 'file', 'extensions'=>'svg, png'],
];
}
当用户选择图像时,它可以正常工作。 但是在更新表格上我们只有文件的名称。现在,如果我们提交表单,它将应用验证。我只有在用户更改图像时才需要验证。
我的控制器代码
if ($model->load(Yii::$app->request->post())) {
$model->logo = UploadedFile::getInstance($model, 'logo');
if (!empty($model->logo)) {
$model->logo->name = $model->logo->baseName . Yii::$app->formatter->asTimestamp(date('Y-d-m h:i:s')) . '.' . $model->logo->extension;
$logoPath = Yii::getAlias('@common') . '/web/uploads/logo/' . $model->logo->name;
$model->logo->saveAs($logoPath, false);
}
if ($model->updateSite()) {
return $this->redirect(['site-list']);
}
}
如果您需要更多说明,请与我们联系。 谢谢。
答案 0 :(得分:2)
在这种情况下,使用场景可能会有所帮助。
定义验证规则以依赖于场景
public function rules() {
return [
[['logo'], 'file', 'extensions'=>'svg, png', 'on' => 'imageUploaded'],
];
}
然后在控制器中定义模型的场景。这样的事情。
if ($model->load(Yii::$app->request->post())) {
$model->logo = UploadedFile::getInstance($model, 'logo');
if (!empty($model->logo)) {
$model->scenario = 'imageUploaded';
...
}
}
也可以为条件验证定义匿名函数。
public function rules() {
return [
[['logo'], 'file', 'extensions'=>'svg, png', 'when' => function ($model) {
//return true to apply the rule
return $model->isImageUploaded();
}],
];
}
有关规则和方案的更多信息,请访问https://github.com/yiisoft/yii2/blob/master/docs/guide/input-validation.md#declaring-rules-