* @since 2.0 */ class ScriptController extends Controller { public $defaultAction = 'compress'; public $bundles = array(); public $extensions = array(); /** * @var array * ~~~ * 'all' => array( * 'css' => 'all.css', * 'js' => 'js.css', * 'depends' => array( ... ), * ) * ~~~ */ public $targets = array(); public $basePath; public $baseUrl; public $publishOptions = array(); public function actionCompress($configFile, $bundleFile) { $this->loadConfiguration($configFile); $bundles = $this->loadBundles($this->bundles, $this->extensions); $this->publishBundles($bundles, $this->publishOptions); $timestamp = time(); $targets = array(); foreach ($this->targets as $name => $target) { $target['basePath'] = $this->basePath; $target['baseUrl'] = $this->baseUrl; if (isset($target['js'])) { $this->buildTarget($target, 'js', $bundles, $timestamp); } if (isset($target['css'])) { $this->buildTarget($target, 'css', $bundles, $timestamp); } $targets[$name] = $target; } $targets = $this->adjustDependency($targets, $bundles); $array = var_export($targets, true); $version = date('Y-m-d H:i:s', time()); file_put_contents($bundleFile, << $value) { if (property_exists($this, $name)) { $this->$name = $value; } else { throw new Exception("Unknown configuration: $name"); } } if (!isset($this->basePath)) { throw new Exception("Please specify the 'basePath' option."); } if (!is_dir($this->basePath)) { throw new Exception("The 'basePath' directory does not exist: {$this->basePath}"); } if (!isset($this->baseUrl)) { throw new Exception("Please specify the 'baseUrl' option."); } $this->publishOptions['basePath'] = $this->basePath; $this->publishOptions['baseUrl'] = $this->baseUrl; } protected function loadBundles($bundles, $extensions) { $result = array(); foreach ($bundles as $name => $bundle) { $bundle['class'] = 'yii\\web\\AssetBundle'; $result[$name] = Yii::createObject($bundle); } foreach ($extensions as $path) { $manifest = $path . '/assets.php'; if (!is_file($manifest)) { continue; } foreach (require($manifest) as $name => $bundle) { if (!isset($result[$name])) { $bundle['class'] = 'yii\\web\\AssetBundle'; $result[$name] = Yii::createObject($bundle); } } } return $result; } /** * @param \yii\web\AssetBundle[] $bundles * @param array $options */ protected function publishBundles($bundles, $options) { if (!isset($options['class'])) { $options['class'] = 'yii\\web\\AssetManager'; } $am = Yii::createObject($options); foreach ($bundles as $bundle) { $bundle->publish($am); } } /** * @param array $target * @param string $type either "js" or "css" * @param \yii\web\AssetBundle[] $bundles * @param integer $timestamp * @throws Exception */ protected function buildTarget(&$target, $type, $bundles, $timestamp) { $outputFile = strtr($target[$type], array( '{ts}' => $timestamp, )); $inputFiles = array(); foreach ($target['depends'] as $name) { if (isset($bundles[$name])) { foreach ($bundles[$name]->$type as $file) { $inputFiles[] = $bundles[$name]->basePath . '/' . $file; } } else { throw new Exception("Unknown bundle: $name"); } } if ($type === 'js') { $this->compressJsFiles($inputFiles, $target['basePath'] . '/' . $outputFile); } else { $this->compressCssFiles($inputFiles, $target['basePath'] . '/' . $outputFile); } $target[$type] = array($outputFile); } protected function adjustDependency($targets, $bundles) { return $targets; } protected function compressJsFiles($inputFiles, $outputFile) { } protected function compressCssFiles($inputFiles, $outputFile) { } }