diff --git a/src/Path.php b/src/Path.php index a9fbb46..9835f88 100644 --- a/src/Path.php +++ b/src/Path.php @@ -458,16 +458,41 @@ class Path } /** - * Обновить относительную ссылку при переносе папки + * Обновить относительную ссылку в файле при переносе папки * * @param String $relativePath - относительная ссылка до переноса - * @param String $file - абсолютный путь к файлу содержащему ссылку до переноса - * @param String $srcDir - абсолютный путь к переносимой папке до переноса - * @param String $dstDir - абсолютный путь к переносимой папке после переноса + * @param String $fileDir - абсолютный путь к директории файла содержащего ссылку до переноса + * @param String $srcDir - абсолютный путь к переносимой директории до переноса + * @param String $dstDir - абсолютный путь к переносимой директории после переноса * * @return */ - static function updateRelativePathOnDirectoryMove($relativePath, $file, $srcDir = NULL , $dstFile = NULL) { + static function updateRelativePathOnDirectoryMove($relativePath, $fileDir, $srcDir, $dstDir) { + $relativePath = self::normalize($relativePath); + $fileDir = self::normalize($fileDir); + $srcDir = self::normalize($srcDir); + $dstDir = self::normalize($dstDir); + + $stepsUpTotal = 0; + $relativePathParts = self::listFromString($relativePath); + foreach ($relativePathParts as $part) { + $stepsUpTotal += ($part==".."?1:0); + } + + $fileDepthInFolder = count(self::listFromString($fileDir)) - count(self::listFromString($srcDir)); + + //проверка того, что путь выходит за пределы переносимой папки + if($stepsUpTotal <= $fileDepthInFolder) { + //возврат изначального пути если не выходит + return $relativePath; + } else { + //если выходит + //путь от корня к файлу, на который указывает ссылка + $oldAbsoluteLinkDstPath = self::normalize(self::join($fileDir, $relativePath)); + $pathFromDir = self::relative($fileDir, $srcDir); + $newAbsoluteLinkSrcPath = self::normalize(self::join($dstDir, $pathFromDir)); + return self::relative($oldAbsoluteLinkDstPath, $newAbsoluteLinkSrcPath); + } } }