Ввод файла 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(); ?>

SignupForm // класс модели

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>

person Noor Ahmed    schedule 04.01.2016    source источник


Ответы (3)


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

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

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

<?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']);
        ..............
    }
}

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

person scaisEdge    schedule 04.01.2016
comment
Я понимаю вашу точку зрения, но проблема в том, что у меня есть ошибка при проверке самого поля изображения. Когда форма публикуется, два поля публикуются для ввода файла изображения профиля, то есть Signup [profile_pic] (которое пусто) и Signup [profile_pic] (которое содержит изображение). Проверка, которую я применил, берет первую и возвращает ошибку, хотя файл сохраняется в каталоге загрузки и базе данных. - person Noor Ahmed; 05.01.2016
comment
правильно ли вы установили значение поля ввода?.. проверьте правильность содержащегося значения, затем проверьте правильность вашей логики проверки и последнюю оценку, если вам нужен другой сценарий для какого-либо случая.. - person scaisEdge; 05.01.2016
comment
У меня есть это правило в классе модели [['profile_path'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg'],. Я не использую сценарии. Для моей регистрационной формы существует только одна модель - person Noor Ahmed; 05.01.2016
comment
Объясните мне, где находится код для скрытого ввода .. какое поле связано .. Я не вижу этого кода .. (в конце концов отредактируйте / обновите свой вопрос). - person scaisEdge; 05.01.2016

Нужно установить атрибут значения в hiddenOptions

<?= $form->field($model, 'profile_path')->widget(FileInput::class, ['options' => ['accept' => 'image/*', 'hiddenOptions' => ['value' => $model->profile_path]]]) ?>
person Dmitriy Lysenko    schedule 20.03.2020

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

['profile_path', 'image', 'extensions' => 'png, jpg',
       'minWidth' => 100, 'maxWidth' => 2000,
       'minHeight' => 100, 'maxHeight' => 2000,
],
person Noor Ahmed    schedule 06.01.2016