Для работы со множеством изображений понравилось -
https://github.com/zxbodya/yii2-gallery-manager
Насчет этого расширения, может кому пригодится:
Поведение наследуется от costa-rico и добавляет методы:
- - удаление изображений и каталога текущей модели из хранилища
- загрузка файла с именем image
- удаление файла с именем image
Код: Выделить всё
<?php
namespace common\behaviors;
use rico\yii2images\behaviors\ImageBehave;
use rico\yii2images\models\Image;
use Yii;
use yii\db\ActiveRecord;
use yii\helpers\BaseFileHelper;
use yii\web\UploadedFile;
/**
* Class ImageBehavior
* @package common\behaviors
* @author Andrey Kushnarev <andreykushnarev83@gmail.com>
*/
class ImageBehavior extends ImageBehave
{
public $component;
public function events()
{
return [
ActiveRecord::EVENT_AFTER_INSERT => 'afterSave',
ActiveRecord::EVENT_AFTER_UPDATE => 'afterSave',
ActiveRecord::EVENT_AFTER_DELETE => 'afterDelete'
];
}
/**
*
*/
public function afterSave()
{
$this->upload();
}
/**
*
*/
public function afterDelete()
{
$this->removeImages();
$storePath = $this->getModule()->getStorePath($this->owner);
$pictureSubDir = $this->getModule()->getModelSubDir($this->owner);
$dirToRemove = $storePath . DIRECTORY_SEPARATOR . $pictureSubDir;
BaseFileHelper::removeDirectory($dirToRemove);
}
/**
* @param string $name
* @return bool
*/
public function upload($name = 'image'){
$image = UploadedFile::getInstance($this->owner, $name);
if( $image ){
$path = Yii::getAlias('@storage') . '/web/source/temp' . $image->baseName . '.' . $image->extension;
$image->saveAs($path);
$img = $this->getImageByName($name);
if ($this->attachImage($path, true, $name) && $img instanceof Image){
$this->removeImage($img);
}
@unlink($path);
return true;
}
return false;
}
/**
* @param string $name
* @return bool
*/
public function removeImageByName($name = 'image')
{
$image = $this->getImageByName($name);
if ($image instanceof Image) {
$this->removeImage($image);
return true;
}
return false;
}
}
Подключение к модели:
Код: Выделить всё
public function behaviors()
{
return [
'image' => ImageBehavior::className(),
];
}
Добавление экшена в контроллер для удаления картинки:
Код: Выделить всё
public function actionRemoveImage($id)
{
$result = false;
if ($model = $this->findModel($id)){
$model->removeImageByName('image');
}
return $this->redirect(['update', 'id' => $model->id]);
}
Инпут и просмотр изображения во вьюшке:
Код: Выделить всё
<?= $form->field($model, 'image')->fileInput(['accept' => 'image/*']) ?>
<?php if (!$model->isNewRecord && $model->getImage()): ?>
<div class="preview">
<?= Html::img($model->getImage()->getUrl()) ?>
<?= Html::a('', ['remove-image', 'id' => $model->id], [
'class' => 'glyphicon-remove-circle glyphicon',
'data' => [
'confirm' => Yii::t('backend', 'Are you sure you want to delete this item?'),
'method' => 'post',
],
]) ?>
</div>
<?php endif; ?>
Стили для превью и кнопки удаления:
Код: Выделить всё
.preview {
position: relative;
height: 300px;
float: left;
color: #999;
border: 2px dashed #999;
border-radius: 7px;
margin: 0 0 10px 5px;
}
.preview img {
width: auto;
height: 100%;
border-radius: 7px;
}
.preview .glyphicon-remove-circle {
display: none;
cursor: pointer;
font-size: 3em;
text-align: center;
top: 50%;
left: 50%;
width: 50px;
height: 50px;
margin-left: -25px;
background-color: rgba(0,0,0,.8);
padding: 4px;
border-radius: 5px;
color: #FFF;
margin-top: -.5em;
position: absolute;
}
.preview:hover .glyphicon-remove-circle {
display: block;
}