doniyorbekm
@doniyorbekm
Yii-шник

Валидация на файл не работает, почему?

Привет!
Загружаю файл на сервер средствами Yii2.
Модель:
public $attachment;
public function rules()
    {
        return [
            [['sender_id', 'incoming_number', 'incoming_date', 'delivery_type_id', 'attachment'], 'required'],
            [['sender_id', 'delivery_type_id', 'status_id'], 'integer'],
            [['outgoing_date', 'incoming_date', 'status_id', 'created'], 'safe'],
            [['attachment'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg, xls, docx, pdf'],
            [['comments'], 'string'],
            [['outgoing_number', 'incoming_number', 'summary', 'attachment'], 'string', 'max' => 255],
            [['status_id'], 'exist', 'skipOnError' => true, 'targetClass' => DocumentStatus::className(), 'targetAttribute' => ['status_id' => 'id']],
            [['delivery_type_id'], 'exist', 'skipOnError' => true, 'targetClass' => DeliveryTypes::className(), 'targetAttribute' => ['delivery_type_id' => 'id']],
            [['sender_id'], 'exist', 'skipOnError' => true, 'targetClass' => Senders::className(), 'targetAttribute' => ['sender_id' => 'id']],
        ];
    }

Контроллер:
$model = new Documents();
            if($model->load(Yii::$app->request->post()) && $model->validate()) {
$newDoc = new Documents();
$newDoc->sender_id = $model->sender_id;
$model->attachment = UploadedFile::getInstance($model, 'attachment');
$model->attachment->saveAs('uploads/documents/'.$model->attachment->name."-".date('YmdHis').$model->attachment->extension);
$newDoc->attachment = "filezzz";
}

При клике на сабмит пишет, что attachment не может быть пустым. Почему??? Я ведь назначаю ему значение
  • Вопрос задан
  • 234 просмотра
Решения вопроса 1
@Arik
В доках ведь есть все: https://github.com/yiisoft/yii2/blob/master/docs/g...

у вас проблема что запускаете валидацию перед тем как указать загруженный файл, в примерах доках есть нормальная реализация и действия контроллера и модели. Всю логику убрать в модель. если модель AR то наследоваться от нее и реализовать эту логику или поднять отдельную модель формы
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
tigroid3
@tigroid3
PHP, YII2, SQL, Postgres, Docker, SPHINX, GIT
потому что у вас attachment в rules описан сначала как файл, а потом как string и не может сохранить, потому что в attachment после
$model->attachment = UploadedFile::getInstance($model, 'attachment');

лежит объект а не строка. решение тут, это загрузка через дополнительную модель
$imageModel = new UploadImageForm();
$imageModel->files = UploadedFile::getInstances($imageModel, 'files');

if ($imageModel->validate()) {
   $imageModel->files //тут ваш скрипт чтобы сохранить файл
}

//ну и сама основная модель
if ($model->load(Yii::$app->request->post())) {
    $model->save();
}

модель для файла можно взять например тут
https://yiiframework.com.ua/ru/doc/guide/2/input-f...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы