Example #1
0
 /**
  * Публикует ресурс (файл или директорию)
  * Возвращает публичный URL ресурса
  * @param string $path
  * @return string
  */
 public function publish($path)
 {
     // Получаем абсолютный путь в ФС до ресурса и узнаем тип ресурса
     $realPath = $this->getRealPath($path);
     // TODO: смущает меня этот кусок, если честно. Надо внимательно его перепроверить.
     foreach ($this->assets as $asset) {
         if (false !== strpos($realPath, $asset['path'])) {
             return str_replace(DS, '/', str_replace($asset['path'], $asset['url'], $realPath));
         }
     }
     $type = is_dir($realPath) ? 'dir' : 'file';
     // Получаем время последней модификации ресурса
     // и, заодно, путь до него и до возможной публикации
     clearstatcache(true, $realPath);
     if ('dir' == $type) {
         $baseRealPath = $realPath;
         $lastModifiedTime = Helpers::dirMTime($realPath . DS . '.');
     } else {
         $baseRealPath = pathinfo($realPath, PATHINFO_DIRNAME);
         $baseRealName = pathinfo($realPath, PATHINFO_BASENAME);
         $lastModifiedTime = filemtime($realPath);
     }
     $pathHash = substr(md5($baseRealPath), 0, 12);
     $assetBasePath = ROOT_PATH_PUBLIC . DS . 'Assets' . DS . $pathHash;
     $assetBaseUrl = '/Assets/' . $pathHash;
     // Вариант 1 - такого пути в папке Assets нет
     if (!is_readable($assetBasePath)) {
         Helpers::mkDir($assetBasePath);
         if ('dir' == $type) {
             Helpers::copyDir($realPath, $assetBasePath);
         } else {
             Helpers::copyFile($realPath, $assetBasePath);
         }
     } else {
         // Вариант 2 - нужный путь уже есть, нужно проверить наличие там нашего файла
         clearstatcache();
         if ('file' == $type) {
             // Файл не найден, копируем его
             // Файл найден, но протух - перезаписываем
             if (!is_readable($assetBasePath . DS . $baseRealName) || $lastModifiedTime >= filemtime($assetBasePath . DS . $baseRealName)) {
                 Helpers::copyFile($realPath, $assetBasePath);
             }
         } else {
             // Это папка. Она уже скопирована. Но протухла
             if ($lastModifiedTime >= filemtime($assetBasePath . DS . '.')) {
                 Helpers::copyDir($realPath, $assetBasePath);
             }
         }
     }
     $asset =& $this->assets[];
     $asset['path'] = $realPath;
     $asset['url'] = str_replace(DS, '/', str_replace($baseRealPath, $assetBaseUrl, $realPath));
     return $asset['url'];
 }