ghopper / fileinput
Yii2 widget 用于图像上传
dev-master
2018-07-11 12:13 UTC
Requires
- yiisoft/yii2: ~2.0
This package is not auto-updated.
Last update: 2024-09-20 21:12:04 UTC
README
FileInput
Yii2 widget 用于图像上传
轻量级小部件,只需几行代码即可实现基本功能。无需ajax,无需广泛定制。
安装
php composer.phar require "ghopper/fileinput:@dev"
或添加到 composer.json
{
"require": {
"ghopper/fileinput": "@dev"
}
}
使用方法
视图
<?php use ghopper\fileinput\FileInputWidget; ... $imageInitData = []; // prepare initial data to be shown $images = $model->images; if (is_array($images) && count($images)) { foreach ($images as $image) { $imageInitData[] = [ 'name' => $image->name, 'url' => $image->url, 'size' => $image->getSize(), 'type' => $image->getType(), 'dimension' => implode('x', $image->getDimension()), ]; } } ?> ... <h2>Images</h2> <?= $form->field($item, 'uploadedFiles')->widget(FileInputWidget::className(), [ 'multi' => true, 'initData' => $imageInitData, ]) ?> ...
模型
/** * Files, obtained from the web form * @var UploadedFile[] */ public $uploadedFiles; /** * Obtained file names * * @var string[] */ public $uploadedFilesName; /** * {@inheritdoc} */ public function rules() { return [ [['uploadedFilesName'], 'safe'], [['uploadedFiles'], 'image', 'minWidth' => self::IMG_MIN_WIDTH, 'minHeight' => self::IMG_MIN_HEIGHT, 'extensions' => 'png, jpg', 'maxFiles' => 6, 'maxSize' => 1024 * 1024 * 2 ], ]; }
控制器
现在您可以在控制器中获取所有数据
$uploadedImages = UploadedFile::getInstances($model, 'uploadedFiles'); // files itself $uploadedImageLabels = $model->uploadedFilesName; // file labels
使用两个数组(仅上传的文件和文件标签(已上传和新的标签)),您可以管理服务器端文件。如果适当的标签不存在,则删除服务器文件。
public function actionUpdate($id) { $model = $this->findModel($id); if ($model->load(Yii::$app->request->post()) && $model->validate()) { $model->uploadedFiles = UploadedFile::getInstances($model, 'uploadedFiles'); $transaction = Yii::$app->db->beginTransaction(); try { if ($model->save(false)) { // remove images from the server $currentImagesCount = 0; $currentImages = $model->images; // get current images foreach ($currentImages as $key => $img) { if (!in_array($img->name, $model->uploadedFilesName)) { // delete if it were deleted on web $img->delete(); } else { // update file pos if ($img->pos !== $key) { $img->pos = $key; $img->update(); } // increase uploaded files counter $currentImagesCount++; } } /** @var $images Image[] */ $images = $this->loadImageModels($model, $currentImagesCount); foreach($images as $image) { $image->saveImage(); } $transaction->commit(); return $this->redirect(['view', 'id' =item> $item->id]); } } catch (\Exception $exc) { ... } } } /** * @param Model $model * @return Image[] */ private function loadImageModels(Model $model, $curIndex = 0) { $images = []; $uploadedImages = (is_array($model->uploadedFiles) && count($model->uploadedFiles)) ? $model->uploadedFiles : []; foreach ($uploadedImages as $key => $file) { $img = new Image(); ... $img->pos = $key + $curIndex; $img->uploadedFile = $file; $img->uploadedFileName = $model->uploadedFilesName[$curIndex + $key]; $images[] = $img; } return $images; }