Yii 2 ввод файла отображает скрытый тег ввода файла

Я использую yii2 для создания простого приложения с функцией регистрации. Проблема в том, что когда я отображаю тег ввода файла с использованием активных форм, он отображает поле ввода файла и скрытое поле. Затем валидатор выбирает тот, который скрыт, и всегда говорит, что изображение профиля требуется, хотя он сохраняет его в моем каталоге загрузки, а также добавляет путь к базе данных, но все равно возвращает с этой ошибкой. Спасибо за любую помощь.

Вот код:
Посмотреть:

<?php $form = ActiveForm::begin(['id' => 'form-signup' , 'options' => ['enctype' => 'multipart/form-data']]); ?>

<?= $form->field($model, 'username') ?>

<?= $form->field($model, 'email') ?>
<?= $form->field($model, 'profile_path')->widget(FileInput::classname(), [
'options' => ['accept' => 'image/*'],
]); ?>
<?= $form->field($model, 'password')->passwordInput() ?>
<div class="form-group">
<?= Html::submitButton('Signup', ['class' => 'btn btn-primary', 'name' => 'signup-button']) ?>
</div>
<?php ActiveForm::end(); ?>

RegistrationForm // модель класса

class SignupForm extends Model
{
public $username;
public $email;
public $password;
public $profile_path;

/**
* @inheritdoc
*/
public function rules()
{
return [
['username', 'filter', 'filter' => 'trim'],
['username', 'required'],
['username', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This username has already been taken.'],
['username', 'string', 'min' => 2, 'max' => 255],

['email', 'filter', 'filter' => 'trim'],
['email', 'required'],
['email', 'email'],
['email', 'string', 'max' => 255],
['email', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This email address has already been taken.'],

['password', 'required'],
['password', 'string', 'min' => 6],
[['profile_path'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg'],
];
}

/**
* Signs user up.
*
* @return User|null the saved model or null if saving fails
*/
public function signup()
{
if ($this->validate()) {
$user = new User();
$user->username = $this->username;
$user->email = $this->email;
$user->setPassword($this->password);
$user->generateAuthKey();
$user->setProfilePicture($this->profile_path);
if ($user->save(false)) {
return $user;
}
}

return null;
}

public function upload()
{
if ($this->validate()) {
$this->profile_path->saveAs('uploads/' . $this->profile_path->baseName . date('Y-m-d H:i:s') . '.' . $this->profile_path->extension);
$this->profile_path = 'uploads/' . $this->profile_path->baseName . '.' . $this->profile_path->extension;

return true;
} else {
return false;
}
}

}

Выход:

<label class="control-label" for="signupform-profile_path">Profile Path</label>
<input type="hidden" value="" name="SignupForm[profile_path]">
<input id="signupform-profile_path" type="file" name="SignupForm[profile_path]">
<p class="help-block help-block-error">Please upload a file.</p>

0

Решение

Я думаю, что вы должны использовать другой сценарий, избегая проверки ввода, скрытого, когда в этом нет необходимости. см. этот документ для краткого руководства

И это пример использования сценария

Определите правила и сценарии

<?php

class User extends Model
{
public $name;
public $email;
public $password;

public function rules(){
return [
[['name','email','password'],'required'],
['email','email'],
[['name', 'email', 'password'], 'required', 'on' => 'register'],
];
}
public function scenarios()
{
$scenarios = parent::scenarios();
$scenarios['login'] = ['name','password'];//Scenario Values Only Accepted
return $scenarios;
}
}
?>

Применить сценарий

<?php
...
class UserController extends Controller
{
..
// APPLY SCENARIOS
// scenario is set as a property
............
public function  actionLogin(){
$model = new User;
$model->scenario = 'login';
.............
}
// scenario is set through configuration
public function  actionRegister(){
$model = new User(['scenario' => 'register']);
..............
}
}

В сценарии входа в систему требуется только имя и пароль в имени сценария регистрации, адрес электронной почты и пароль.

1

Другие решения

Хорошо, ребята, я понял, что проблема была с валидатором, который я использовал. Использование валидатора изображений вместо валидатора файлов решило мою проблему. Вот обновленный код для проверки.

['profile_path', 'image', 'extensions' => 'png, jpg',
'minWidth' => 100, 'maxWidth' => 2000,
'minHeight' => 100, 'maxHeight' => 2000,
],
-1

По вопросам рекламы [email protected]