public function publish($path, $level = -1) { $assetPath = $this->generatePath($path); if (isset($this->_published[$path])) { return $this->_published[$path]; } if (is_dir($this->getBasePath() . '/' . $assetPath) && ($this->fastCheck || FileHelper::md5Directory($this->getBasePath() . '/' . $assetPath) == FileHelper::md5Directory($path))) { return $this->getBaseUrl() . '/' . $assetPath; } else { if (!is_dir($this->getBasePath() . '/' . $assetPath)) { mkdir($this->getBasePath() . '/' . $assetPath, 0777, true); } FileHelper::copyDirectory($path, $this->getBasePath() . '/' . $assetPath, 0777, $level); $this->_published[$path] = $this->getBaseUrl() . '/' . $assetPath; return $this->_published[$path]; } }
/** * Publishes a directory. * @param string $src the asset directory to be published * @param array $options the options to be applied when publishing a directory. * The following options are supported: * * - only: array, list of patterns that the file paths should match if they want to be copied. * - except: array, list of patterns that the files or directories should match if they want to be excluded from being copied. * - caseSensitive: boolean, whether patterns specified at "only" or "except" should be case sensitive. Defaults to true. * - beforeCopy: callback, a PHP callback that is called before copying each sub-directory or file. * This overrides [[beforeCopy]] if set. * - afterCopy: callback, a PHP callback that is called after a sub-directory or file is successfully copied. * This overrides [[afterCopy]] if set. * - forceCopy: boolean, whether the directory being published should be copied even if * it is found in the target directory. This option is used only when publishing a directory. * This overrides [[forceCopy]] if set. * * @return array the path directory and the URL that the asset is published as. * @throws InvalidParamException if the asset to be published does not exist. */ protected function publishDirectory($src, $options) { \Yii::trace("src:{$src} option:" . print_r($options, true), __METHOD__); $dir = $this->hash($src); $dstDir = $this->basePath . DIRECTORY_SEPARATOR . $dir; \Yii::trace("dstDir:{$dstDir} ", __METHOD__); if ($this->linkAssets) { if (!is_dir($dstDir)) { symlink($src, $dstDir); } } elseif (!empty($options['forceCopy']) || $this->forceCopy && !isset($options['forceCopy']) || !is_dir($dstDir)) { $opts = array_merge($options, ['dirMode' => $this->dirMode, 'fileMode' => $this->fileMode]); if (!isset($opts['beforeCopy'])) { if ($this->beforeCopy !== null) { $opts['beforeCopy'] = $this->beforeCopy; } else { $opts['beforeCopy'] = function ($from, $to) { return strncmp(basename($from), '.', 1) !== 0; }; } } if (!isset($opts['afterCopy']) && $this->afterCopy !== null) { $opts['afterCopy'] = $this->afterCopy; } FileHelper::copyDirectory($src, $dstDir, $opts); } return [$dstDir, $this->baseUrl . '/' . $dir]; }