2016-10-01 12 views
4

Я пытаюсь объединить все использованные файлы css в один. Но включение ресурсов с относительными путями вызывает проблемы. Я попробовал CssRewriteFilter, но он не работает.Фильтр CssRewrite не конвертирует относительные URL-адреса в абсолютные

Вот мой код:

$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 входит ../img/test.png код в /node_modules/test/css/test.css Assetic должен переписать его /node_modules/test/img/test.png

ответ

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'] 
    ... 
]; 

Так что вы можете назвать $sourcePath дважды как

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

Вы не запутанным $ sourceRoot (Третий аргумент) с $ sourcePath (4-й аргумент). Проверьте код в своей ссылке еще раз. Фактически вы дублируете функциональность. – Phil