CssRewrite过滤器不会将相对URL转换为绝对URL

时间:2016-10-01 07:56:35

标签: php css asset-pipeline assets assetic

我试图将所有使用过的css文件合并为一个。但包含相对路径的资源会导致问题。我尝试了资产的CssRewriteFilter,但它不起作用。

这是我的代码:

    $files = [
        '/node_modules/select2/dist/css/select2.min.css',
        '/node_modules/jquery-datetimepicker/jquery.datetimepicker.css',
        '/node_modules/icheck/skins/square/blue.css',
        '/node_modules/Plupload/js/jquery.plupload.queue/css/jquery.plupload.queue.css',
        '/node_modules/pace/themes/white/pace-theme-flash.css',
        '/node_modules/lightgallery/dist/css/lightgallery.min.css',
        '/node_modules/x-editable/dist/bootstrap3-editable/css/bootstrap-editable.css',
        '/node_modules/sweetalert2/dist/sweetalert2.css',
        '/node_modules/animate.css/animate.min.css',
        '/node_modules/fullcalendar/dist/fullcalendar.min.css',
        '/node_modules/flag-icon-css/css/flag-icon.min.css',
        '/theme/assets/skin/default_skin/css/theme.css',
    ];

    $am = new \Assetic\AssetManager();

    $items = [];

    foreach ($files as $file) {
        $filename = APP_ROOT_DIR . '/public/ui' . $file;
        $items[] = new \Assetic\Asset\FileAsset($filename, [new \Assetic\Filter\CssRewriteFilter()]);
    }

    $collection = new \Assetic\Asset\AssetCollection(
        $items
    );
    $collection->setTargetPath('vendor.css');

    $am->set('collection', $collection);

    $writer = new \Assetic\AssetWriter(APP_ROOT_DIR . '/public/ui/shared/css/');
    $writer->writeManagerAssets($am);

我的期望:

../img/test.png中的/node_modules/test/css/test.css代码中包含img时,Assetic应将其重写为/node_modules/test/img/test.png

1 个答案:

答案 0 :(得分:1)

尝试构建您的FileAsset类,如:

new \Assetic\Asset\FileAsset(
    $filename,
    [new \Assetic\Filter\CssRewriteFilter()],
    '/node_modules/test/'
);

src/Assetic/Asset/FileAsset.php:37中,我们看到您可以包含$sourcePath作为第三个参数。

https://github.com/kriswallsmith/assetic/blob/master/src/Assetic/Asset/FileAsset.php#L37

您可能希望将$files数组重新设置为

$files = [
    ['/node_modules/select2/dist/css/', 'select2.min.css']
    ...
];

这样你就可以像{/ p>一样调用$sourcePath两次

new \Assetic\Asset\FileAsset(
    APP_ROOT_DIR . '/public/ui' . $file[0].$file[1],
    [new \Assetic\Filter\CssRewriteFilter()],
    '/public/ui'.$filename[0]
);