Страница 1 из 1

Yii2 Glide

Добавлено: 2015.04.10, 00:33
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, не стоит ждать пока автор все сделает за вас - помогайте ему. Спасибо.

Re: Yii2 Glide

Добавлено: 2015.11.12, 16:11
porcelanosa
А где метод outputImage ?
И как тогда выводить изображение, если без actions ?

Re: Yii2 Glide

Добавлено: 2015.11.12, 16:28
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']
    ) ?>
Получила ошибку
Изображение
Т.е. обращение вроде бы по правильному адресу.

Re: Yii2 Glide

Добавлено: 2015.11.13, 09:18
Onotole
Смотри response

Re: Yii2 Glide

Добавлено: 2015.11.13, 14:29
ZeiN
signKey стоит? Да и урл запроса у вас странный получился, в нем нет ни "path" ни "w"

Re: Yii2 Glide

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

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

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

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

Yii::$app->glide->outputImage(<path>, <params>)  

Re: Yii2 Glide

Добавлено: 2015.11.13, 15:27
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/' 
?

Re: Yii2 Glide

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

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

 'sourcePath' => '@app/web/uploads/' 
?
да, но тогда $path должен содержать эту поддиректорию:
test.jpg -> items/test.jpg

Re: Yii2 Glide

Добавлено: 2015.11.13, 16:41
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
этот файл существует.

Re: Yii2 Glide

Добавлено: 2015.11.16, 18:05
ZeiN
А должен быть:

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

items/5645e7800ff5d.jpg
Это относительный путь внутри basePath (D:/OpenServer/domains/yii2.local/web/uploads/images)

Re: Yii2 Glide

Добавлено: 2015.11.18, 20:21
Vindective
Возможен ли вывод изображения по координатам? К примеру при реализации клиентского кропа у меня есть координаты картинки x1,x2,y1,y2,h,w
возможно ли вывести картинку по ним?

Re: Yii2 Glide

Добавлено: 2015.11.21, 04:52
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
Изображение