Мне нужно поле для загрузки файлов для действий как для создания, так и для обновления, а также для необходимой проверки и проверки типов, которые должны выполняться в обоих случаях.Как реализовать требуемый атрибут загрузки файлов, в разделе «Обновление», в Yii 2?
Это как моя форма выглядит (Примечание: Это форма, а не активная модель Record):
<?php
namespace app\models;
use Yii;
use yii\base\Model;
use yii\base\Object;
use yii\helpers\FileHelper;
class MyCustomForm extends Model
{
public $file_image;
public function rules()
{
return [
[
[['file_image'], 'file', 'skipOnEmpty' => false, 'extensions' => 'jpg, jpeg, png, bmp, jpe']
]
];
}
public function scenarios()
{
$scenarios = parent::scenarios();
//Scenarios Attributes that will be validated
$scenarios['action_add'] = ['file_image'];
$scenarios['action_edit'] = ['file_image'];
return $scenarios;
}
}
И это, как мои действия контроллера выглядит.
Создать действие работает, как ожидалось (по запросу POST Я везу Загруженный файл с помощью команды UploadedFile :: GetInstance)
public function actionCreate()
{
$model_form = new MyCustomForm(['scenario' => 'action_add']);
if (Yii::$app->request->isPost && $model_form->load(Yii::$app->request->post())) {
$model_form->file_image = \yii\web\UploadedFile::getInstance($model_form, "file_image");
if($model_form->validate()) {
if(isset($model_form->file_image)){
//I'm uploading my image to some cloud server here
//creating corresponding $model_entity for database, fill with the data from the form and save it
$model_entity->save();
}
}
}
}
Но я столкнулся с проблемой, когда делает то же самое на действия Update , В базе данных у меня есть URL-адрес изображения, который находится на стороннем облачном сервере, и я могу получить к нему доступ и отображать изображение в моей форме (так что запрос GET на Update работает, я получаю соответствующий объект из базы данных и заполняю форму данными). Но для POST проверка файла не выполняется, если у меня нет файла, назначенного в модели, и запрос POST для обновления не работает.
public function actionUpdate($id)
{
$model_entity = $this->findModel($id);
$image_URL = //I'm having URL to corresponding image here;
$model_form = new MyCustomForm(['scenario' => 'action_edit']);
$model_form_data = [$model_form->formName() => $model_entity->attributes];
$model_form->load($model_form_data);
if (Yii::$app->request->isPost && $model_form->load(Yii::$app->request->post())) {
//if we upload image again this will work
//NOTE: I have another text fields in the form and If I only change them
//and if I don't change the file image, the following result will return NULL and validation will fail
$file_uploaded_image = \yii\web\UploadedFile::getInstance($model_form, "file_image");
if(isset($file_uploaded_image)){
//new image is uploaded on update, this scenario will be OK
} else {
//no image is uploaded on update, this scenario will fail
}
if($model_form->validate()) {
//this will fail if I don't upload image on Update
}
}
}
Я пробовал много вещей в действии обновления до проверки, чтобы найти обходной путь, чтобы получить изображение и проверку, чтобы не потерпеть неудачу. Например:
$dataImg = file_get_contents($image_URL);
$model_form->file_image = $dataImg;
или пытается сделать получить с временным файлом:
$dataImg = file_get_contents($dataImg);
$filePath = \yii\helpers\FileHelper::createDirectory("/images/tmp/test.png", 777);
file_put_contents($filePath, $dataImg);
$model_form->file_image = $filePath;
Но ни один из них не работает. Есть ли решение для этого сценария? Обратите внимание, что мне придется использовать Froms (как указано выше), а не ActiveRecord, так как мой реальный проект более сложный, например, в списке.