2016-01-04 8 views
0

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

Вот код: Вид:

<?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> 
+0

У меня тоже такая же проблема. Похоже, что есть проблема в самом виджетах FileInput. Я подал ошибку. https://github.com/kartik-v/yii2-widget-fileinput/issues/55 –

+0

Я выяснил, почему валидация не удалась. просто используйте проверку изображения вместо проверки файлов. – noor

+0

обновленный код: '['profile_path', 'image', 'extensions' => 'png, jpg', 'minWidth' => 100, 'maxWidth' => 2000, 'minHeight' => 100, 'maxHeight '=> 2000, ], ' – noor

ответ

-1

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

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

Я думаю, вы шо пакетирования использовать другой сценарий избегая проверки ввода скрыт, когда нет необходимости .. see this doc for a brief guide

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

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

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

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

+0

Я понимаю вашу точку зрения, но проблема в том, что у меня ошибка при проверке самого поля изображения. Когда форма размещена, для ввода файла изображения профиля размещаются два поля i.e Зарегистрировать [profile_pic] (который пуст) и зарегистрировать [profile_pic] (который содержит изображение). Применяемая проверка i принимает первый и возвращает ошибку, хотя файл сохраняется в каталоге загрузок и в базе данных. – noor

+0

правильно ли вы задали значение поля ввода? .. проверьте правильность содержащегося значения, затем проверьте правильность вашей логики проверки и последнюю оценку, если вам нужен другой сценарий для некоторого случая. – scaisEdge

+0

У меня есть это правило в class class '[['profile_path'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg'],'. Я не использую сценарии. Есть только одна модель для моей регистрационной формы – noor