Объединение и сжатие ресурсов и публикация изображений

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
SindBad
Сообщения: 81
Зарегистрирован: 2015.06.18, 10:53

Объединение и сжатие ресурсов и публикация изображений

Сообщение SindBad »

Приветствую!
Настроил объединение и сжатие CSS/JS, но есть проблема - не получается подхватить опубликованные изображения.
Конфиг:

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

<?php

$jscomp  = Yii::getAlias('@console/compilers/closure-compiler-v20181028.jar');
$csscomp = Yii::getAlias('@console/compilers/yuicompressor-2.4.7pre.jar');

return [
    // Adjust command/callback for asset files GZIP compressing:
    'gzipCommand'     => '"C:\Program Files\7-Zip\7z.exe" a -tgzip {to} {from}',
    // Whether to delete asset source after gzip compression:
    'removeUnGzipped' => true,
    // Adjust command/callback for JavaScript files compressing:
    'jsCompressor' => 'java -jar ' . $jscomp . ' --js {from} --js_output_file {to}',
    // Adjust command/callback for CSS files compressing:
    'cssCompressor' => 'java -jar ' . $csscomp . ' --type css {from} -o {to} --charset utf-8',
    // Whether to delete asset source after compression:
    'deleteSource' => true,
    // The list of asset bundles to compress:
    'bundles' => [
        \yii\web\YiiAsset::class,
        \yii\web\JqueryAsset::class,
        \yii\bootstrap\BootstrapPluginAsset::class,
        \yii\validators\ValidationAsset::class,
        \yii\widgets\ActiveFormAsset::class,
        \yii\validators\PunycodeAsset::class,
        \project\theme\AssetBundle::class,
    ],
    // Asset bundle for compression output:
    'targets' => [
        'all' => [
            'class' => \yii\web\AssetBundle::class,
            'basePath' => '@webroot/gzipped',
            'baseUrl' => '@web/gzipped',
            'js' => 'all-{hash}.js',
            'css' => 'all-{hash}.css',
        ],
    ],
    // Asset manager configuration:
    'assetManager' => [
        'basePath' => '@webroot/gzipped',
        'baseUrl'  => '@web/gzipped',
        'bundles' => [
            'yii\\bootstrap\\BootstrapAsset' => [
                'sourcePath' => null,
                'css' => [],
            ],
        ],
    ],
];
Как я могу это сделать на веб-странице, имея несжатые ресурсы:

class View:

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

    public function getAssetUrl(string $bundle, string $url): string
    {
        $bundle = Yii::$app->assetManager->getBundle($bundle);
        return $bundle->baseUrl . '/' . ltrim($url, '/');
    }
    
layout.php:

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

<img src="<?= $this->getAssetUrl(\project\theme\AssetBundle::class, '/images/logo3.png') ?>">
А вот со сжатыми ресурсами дело обстоит иначе, $bundle->baseUrl возвращает null, если отправлять ресурсы в папку, отличную от @webroot/asset, хотя изображения в папке со сжатыми ресурсами есть.

Как правильнее поступить в данном случае?

И как после сжатия оставить только изображения и шрифты?
SindBad
Сообщения: 81
Зарегистрирован: 2015.06.18, 10:53

Re: Объединение и сжатие ресурсов и публикация изображений

Сообщение SindBad »

Проблему решил, но вышел 3,14здецкий костыль.
Заставил hashCallback называть папку с нужными ресурсами не хэшем, а именем проекта:

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

// Asset manager configuration:
    'assetManager' => [
        'basePath' => '@webroot/gzipped',
        'baseUrl'  => '@web/gzipped',
        'hashCallback' => function ($path) {
            $fixedPath = strrev(str_replace(['/', '\\'], '/', $path));
            $sample    = strrev('/project/theme/assets');
            if (strpos($fixedPath, $sample) === 0) {
                return 'project';
            } else {
                $path = (is_file($path) ? dirname($path) : $path) . filemtime($path);
                return sprintf('%x', crc32($path . Yii::getVersion() . '|'));
            }
        },
    ],
Далее, подключая сжатые бандлы, в нужном переопределяю basePath и baseUrl

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

$bundles = include 'assets-prod.php';
$bundles['project\\theme\\AssetBundle'] = [
    'basePath' => '@webroot/gzipped/project',
    'baseUrl'  => '@web/gzipped/project',
    'js' => [],
    'css' => [],
    'depends' => [
        'yii\\web\\YiiAsset',
        'yii\\bootstrap\\BootstrapPluginAsset',
        'all',
    ],
];
Черт, я думал что работая с Yii2 уже никогда не буду делать подобное задротство)

Со вторым вопросом все просто оказалось: нужно было в конфиге компрессора настроить publishOptions.
Ответить