Программирование, веб-кодинг, Расширения, виджеты

Фотогалерея для Yii2 (расширение zxbodya/yii2-gallery-manager)

Устанавливаем и настраиваем расширение менеджера фотогалереи через поведение

Фотогалерея для Yii2 (расширение zxbodya/yii2-gallery-manager)

Удобно взять расширение zxbodya/yii2-gallery-manager

Вот это расширение того же автора для Yii1 было описано и немного мной модифицировано, если кому нужна галерея для yii1 - http://loco.ru/materials/428-yii-fotogalereya-cher...

Устанавливаем yii2-gallery-manager как описано в описании.

Дальше в вашей форме просто вставляете

<?php
...
use zxbodya\yii2\galleryManager\GalleryManager;
?>
...
<div class="row">
                <div class="col-xs-12 text-center">
                    <div class="panel panel-default">
                      <div class="panel-heading">Галерея "Фото"</div>
                      <div class="panel-body">
                            <?php 
                                if ($model->isNewRecord) {
                                    echo 'Can not upload images for new record';
                                } else {
                                    echo GalleryManager::widget(
                                        [
                                            'model' => $model,
                                            'behaviorName' => 'galleryBehavior',
                                            'apiRoute' => 'portfolio/galleryApi'
                                        ]
                                    );
                            }?>
                      </div>
                    </div>
                </div>
            </div>

Потом в модели подключаем поведение, указав свои пути к папкам для сохранения галерей и настройки размеров изображений для сохранения.

use zxbodya\yii2\galleryManager\GalleryBehavior;
...

public function behaviors()
    {
        return [
            ...
            'galleryBehavior' => [
                'class' => GalleryBehavior::className(),
                'type' => 'portfolio',
                'extension' => 'jpg',
                'directory' => Yii::getAlias('@webroot') . '/images/portfolio/gallery',
                'url' => Yii::getAlias('@web') . '/images/portfolio/gallery',
                'versions' => [
                     'small' => function ($img) {
                         /** @var \Imagine\Image\ImageInterface $img */
                         return $img
                             ->copy()
                             ->thumbnail(new \Imagine\Image\Box(200, 200));
                     },
                     'medium' => function ($img) {
                         /** @var Imagine\Image\ImageInterface $img */
                         $dstSize = $img->getSize();
                         $maxWidth = 800;
                         if ($dstSize->getWidth() > $maxWidth) {
                             $dstSize = $dstSize->widen($maxWidth);
                         }
                         return $img
                             ->copy()
                             ->resize($dstSize);
                     },
                ]
            ],
 
        ];
    }


И в контроллере указать в действиях galleryApi

use zxbodya\yii2\galleryManager\GalleryManagerAction;
...

public function actions()
    {
        return [
            'galleryApi' => [
                'class' => GalleryManagerAction::className(),
                // mappings between type names and model classes (should be the same as in behaviour)
                'types' => [
                    'portfolio' => Portfolio::className(),
                    'portfolio_reviews' => Portfolio::className()
                ]
            ],
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
        ];
    }
...


Выводить же галерею или изображения можно в виде так

<span class="pl-s1"><span class="pl-k">foreach</span>(<span class="pl-smi">$model</span><span class="pl-k">-></span>getBehavior(<span class="pl-s"><span class="pl-pds">'</span>galleryBehavior<span class="pl-pds">'</span></span>)<span class="pl-k">-></span>getImages() <span class="pl-k">as</span> <span class="pl-smi">$image</span>) {</span>
<span class="pl-s1">    <span class="pl-c1">echo</span> <span class="pl-c1">Html</span><span class="pl-k">::</span>img(<span class="pl-smi">$image</span><span class="pl-k">-></span>getUrl(<span class="pl-s"><span class="pl-pds">'</span>medium<span class="pl-pds">'</span></span>));</span>
<span class="pl-s1">}</span>

это выведет все изображения. Вывод можете настраивать как вам нужно, уже работая с массивом в php.