imitronov

imitronov

Кто я?

Веб разработчик. Работаю с WordPress, 1C-Bitrix, modX, OctoberCMS. Делаю обзоры онлайн сервисов и малоизвестных CMS.


О чем я пишу


Свежие записи

Yii2: Ресайз на лету

Автоматическое изменение размеров изображений на лету для Yii2 Framework

  1. Устанавливаем Imagine

  2. Создаем модуль thumb (можно создать в Gii)

  3. Создаем модель RZImage:

    <?php
    namespace app\models;
    use Yii;
    use yii\imagine\Image;
    class RZImage
    {
    
    private $static;
    public $original;
    public $width;
    public $height;
    public $result;
    
    public function __construct($width, $height, $image) {
        $this->static = 'assets/static/';
        $this->width = $width;
        $this->height = $height;
        $this->original = $image;
        $this->result = $this->static . $this->width . 'x' . $this->height . '/' . $this->original;
    }
    
    public function originalExists() {
        return file_exists(Yii::getAlias('@webroot/') . $this->original);
    }
    
    public function resultExists() {
        return file_exists(Yii::getAlias('@webroot/') . $this->result);
    }
    
    private function checkFolder() {
        if(!is_dir(Yii::getAlias('@webroot/') . pathinfo($this->result, PATHINFO_DIRNAME))) {
            return mkdir(Yii::getAlias('@webroot/') . pathinfo($this->result, PATHINFO_DIRNAME), 0777, true);
        }
        return true;
    }
    
    public function getThumbnail() {
        if( $this->originalExists()) {
    
            if(!$this->resultExists()) {
                if($this->checkFolder()) {
                    Image::thumbnail(Yii::getAlias('@webroot/') . $this->original, $this->width, $this->height)->save(Yii::getAlias('@webroot/') . $this->result, ['quality' => 80]);
                } else {
                    throw new \yii\web\HttpException(424 ,'Не удалось создать папку для хранения превью.');
                }
            }
            return Yii::getAlias('@web/') . $this->result;
    
        } else {
            throw new \yii\web\HttpException(410 ,'Файл не найден. Скорее всего он был удален.');
        }
    }
    }
  4. Создаем контроллер CropController

    namespace app\modules\thumb\controllers;
    use yii\web\Controller;
    use app\models\RZImage;
    /**
    * Default controller for the `thumb` module
    */
    class CropController extends Controller
    {
    /**
     * Renders the index view for the module
     * @return string
     */
    public function actionIndex($width, $height, $original)
    {
        $image = new RZImage($width, $height, $original);
        $thumbnail = $image->getThumbnail();
        return $this->redirect($thumbnail);
    }
    }
    ?>
  5. Добавляем правило в UrlManager:

    '/thumb/crop/<width:[\d-]+>/<height:[\d-]+>/<original:.*?>' => '/thumb/crop'

P.S. В модель нужно добавить еще автоочистку кэша.