Yii2 Glide

Выкладываем свои наработки
Ответить
ZeiN
Сообщения: 180
Зарегистрирован: 2012.06.06, 13:59

Yii2 Glide

Сообщение ZeiN »

Доброго времени суток всем.
Хочу поделится написанным для одного проекта и для моего yii2-starter-kit компонентом - yii2-glide.
Glide это замечательный инструмент для модификации изображений по запросу "на лету". Например для нарезки превьюшек нужного размера по первому запросу.
Почитать что это такое и зачем оно нужно можно здесь.

Компонент только создан, так что приглашаю всех желающих:
- поделиться опытом интеграции Glide в проекты на yii2
- протестить это расширение
- обсудить что неудобно, где я накосячил
- оставлять предложения по расширению функционала
- посоветовать как сделать лучше
- контрибьютить в код или документацию (идеальный вариант)

Что хотелось бы получить по итогу:
- удобное надежное расширение, которое покрывает как можно больше юзкейсов

Пример использования:

Код: Выделить всё

'components' => [
    ...
    'glide' => [
        'class' => 'trntv\glide\components\Glide',
        'sourcePath' => '@app/web/uploads',
        'cachePath' => '@runtime/glide',
    ],
    ...
]
 
Вариант 1:

Код: Выделить всё

Yii::$app->glide->outputImage('new-upload.jpg', ['w' => 100, 'fit' => 'crop'])
 
Как Action:

Код: Выделить всё

public function actions()
{
    return [
        'glide' => 'trntv\glide\actions\GlideAction'
    ]
}
 
Вариант 2:

Код: Выделить всё

/index.php?r=site/glide?path=new-upload.jpg&w=100&h=75
Более сложный вариант интеграции можно посмотреть здесь:
https://github.com/trntv/yii2-starter-k ... er/storage

Secure URLs поддерживаются.

PS: У меня, как и у почти всех здесь присутствующих, не особенно много свободного времени для разработки расширений для души. Так что если мы хотим иметь хорошие качественные инструменты под yii, не стоит ждать пока автор все сделает за вас - помогайте ему. Спасибо.
Аватара пользователя
porcelanosa
Сообщения: 570
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

Re: Yii2 Glide

Сообщение porcelanosa »

А где метод outputImage ?
И как тогда выводить изображение, если без actions ?
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
Аватара пользователя
porcelanosa
Сообщения: 570
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

Re: Yii2 Glide

Сообщение porcelanosa »

В контроллер Items модуля admin добавила action

Код: Выделить всё

class ItemsController extends Controller {

    public function actions() {
        return [
            'glide' => 'trntv\glide\actions\GlideAction'
        ];
    }
Во вью попыталась вывести (подсмотренно на github yii2-starter-kit)

Код: Выделить всё

    <?php echo Html::img(
            /*Yii::$app->glide->createSignedUrl([
                    'items/glide',
                    'path' => $model->image_path,
                    'w' => 200
            ], true),*/
            Url::toRoute(
                    'items/glide',
                    ['path' => $model->image_path,
                    'w' => 200]),
            ['class' => 'article-thumb img-rounded pull-left']
    ) ?>
Получила ошибку
Изображение
Т.е. обращение вроде бы по правильному адресу.
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: Yii2 Glide

Сообщение Onotole »

Смотри response
ZeiN
Сообщения: 180
Зарегистрирован: 2012.06.06, 13:59

Re: Yii2 Glide

Сообщение ZeiN »

signKey стоит? Да и урл запроса у вас странный получился, в нем нет ни "path" ни "w"
ZeiN
Сообщения: 180
Зарегистрирован: 2012.06.06, 13:59

Re: Yii2 Glide

Сообщение ZeiN »

porcelanosa писал(а):А где метод outputImage ?
И как тогда выводить изображение, если без actions ?

Код: Выделить всё

Yii::$app->glide->server->outputImage(<path>, <params>)  
Добавил шорткат для этого метода, обновите пакет:

Код: Выделить всё

Yii::$app->glide->outputImage(<path>, <params>)  
Аватара пользователя
porcelanosa
Сообщения: 570
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

Re: Yii2 Glide

Сообщение porcelanosa »

Спасибо, за ответ.
Пакет обновился.
Я добавила в настройки компонента

Код: Выделить всё

        'glide' => [
            'class' => 'trntv\glide\components\Glide',
            'sourcePath' => '@app/web/uploads/images/items',
            'cachePath' => '@runtime/glide',
            'signKey' => 12312312312131321313//false//'<random-key>' // "false" if you do not want to use HTTP signatures
        ],
вызов

Код: Выделить всё

if(file_exists($model->getImagePath()) and !is_dir($model->getImagePath())) {
        Yii::$app->glide->outputImage($model->getImagePath(), ['w' => 100, 'fit' => 'crop']);
    }
файл существует, но выскакивает ошибка

Код: Выделить всё

League\Glide\Http\NotFoundException
Could not find the image `D:/OpenServer/domains/yii2.local/web/uploads/images/items/5645d5bf6c42c.jpg`.
P.S. И сразу же вопрос немного оффтоп - sourcePath указывает на папку с изображениями. А если у нас несколько таких папок? Считаются ли подпапки? т.е. могла бы я указать

Код: Выделить всё

 'sourcePath' => '@app/web/uploads/' 
?
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
ZeiN
Сообщения: 180
Зарегистрирован: 2012.06.06, 13:59

Re: Yii2 Glide

Сообщение ZeiN »

porcelanosa писал(а): файл существует, но выскакивает ошибка
покажите что в $model->getImagePath()
porcelanosa писал(а): P.S. И сразу же вопрос немного оффтоп - sourcePath указывает на папку с изображениями. А если у нас несколько таких папок? Считаются ли подпапки? т.е. могла бы я указать

Код: Выделить всё

 'sourcePath' => '@app/web/uploads/' 
?
да, но тогда $path должен содержать эту поддиректорию:
test.jpg -> items/test.jpg
Аватара пользователя
porcelanosa
Сообщения: 570
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

Re: Yii2 Glide

Сообщение porcelanosa »

Код: Выделить всё

protected $path = 'uploads/images/items';
public function getImagePath() {
        return Yii::getAlias('@webroot').$this->getBaseImagePath().$this->image_path;
    }

    private function getBaseImagePath() {
        return Yii::$app->request->baseUrl.'/'.$this->path.'/';
    } 
Возвращает D:/OpenServer/domains/yii2.local/web/uploads/images/items/5645e7800ff5d.jpg
этот файл существует.
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
ZeiN
Сообщения: 180
Зарегистрирован: 2012.06.06, 13:59

Re: Yii2 Glide

Сообщение ZeiN »

А должен быть:

Код: Выделить всё

items/5645e7800ff5d.jpg
Это относительный путь внутри basePath (D:/OpenServer/domains/yii2.local/web/uploads/images)
Vindective
Сообщения: 87
Зарегистрирован: 2014.04.18, 14:21

Re: Yii2 Glide

Сообщение Vindective »

Возможен ли вывод изображения по координатам? К примеру при реализации клиентского кропа у меня есть координаты картинки x1,x2,y1,y2,h,w
возможно ли вывести картинку по ним?
Аватара пользователя
porcelanosa
Сообщения: 570
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

Re: Yii2 Glide

Сообщение porcelanosa »

ZeiN писал(а):А должен быть:
items/5645e7800ff5d.jpg
А почему именно с items?
Я поняла что путь должен быть относительным, но относительно чего?
Относительно пути указанно в конфигурации?

Код: Выделить всё

            'sourcePath' => '@app/web/uploads/',
- т.е. если у меня изображение в папке uploads/images/items - то передать надо images/items ?
Я сделала так:

Код: Выделить всё

echo $model->getUploadUrl();
    echo Html::img(
            Yii::$app->glide->createSignedUrl([
                    'items/glide',
                    'path' => $model->getUploadUrl(),
                    'w' => 200
            ], true));
путь изображения images/items/5645e7800ff5d.jpg    
Пробовала и без images

НО теперь у меня вот этот код

Код: Выделить всё

if(file_exists($model->getImagePath()) and !is_dir($model->getImagePath())) {
        Yii::$app->glide->outputImage($model->getUploadUrl(), ['w' => 100/*, 'fit' => 'crop'*/]);
    }
выводит просто пустое окно Изображение
без ошибок. т.е. и layout побоку идет как-то :-)
Изображение
я использовала первый вариант кода - как выше.
items/5645e7800ff5d.jpg - это передаваемый url
http://site.local/items/glide?path=item ... 383c4fcf34 - это адрес по которому он стучится и возвращает 404
Изображение
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
Ответить