diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/PMXPublisher.php b/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/PMXPublisher.php index 31c665a8e..91ea64e69 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/PMXPublisher.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/PMXPublisher.php @@ -46,8 +46,7 @@ class PMXPublisher $lastPos = strrpos($filename, '.'); $fileName = substr($filename, 0, $lastPos); $newFileName = \G::inflect($fileName); - $excess = strlen($newFileName) - $limit; - $newFileName = substr($newFileName, 0, strlen($newFileName) - $excess - 1); + $newFileName = $this->truncateFilename($newFileName, $limit); $newOutputFile = str_replace($fileName, $newFileName, $outputFile); if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { $newOutputFile = str_replace("/", DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR, $newOutputFile); @@ -57,9 +56,31 @@ class PMXPublisher setlocale(LC_CTYPE, $currentLocale); } else { $outputFile = \G::inflect($outputFile); - if (strlen($outputFile) >= $limit) { - $excess = strlen($outputFile) - $limit; - $newFileName = substr($outputFile, 0, strlen($outputFile) - $excess - 1); + $outputFile = $this->truncateFilename($outputFile, $limit); + } + return $outputFile; + } + + /** + * @param $outputFile + * @param $limit + * @return string + */ + private function truncateFilename($outputFile, $limit) + { + $limitFile = $limit; + if (mb_strlen($outputFile) != strlen($outputFile)) { + if (strlen($outputFile) >= $limitFile) { + do { + $newFileName = mb_strimwidth($outputFile, 0, $limit); + --$limit; + } while (strlen($newFileName) > $limitFile); + $outputFile = $newFileName; + } + } else { + if (strlen($outputFile) >= $limitFile) { + $excess = strlen($outputFile) - $limitFile; + $newFileName = substr($outputFile, 0, strlen($outputFile) - $excess); $outputFile = $newFileName; } } diff --git a/workflow/engine/src/ProcessMaker/Exporter/XmlExporter.php b/workflow/engine/src/ProcessMaker/Exporter/XmlExporter.php index d85d76d5e..61f26a41f 100644 --- a/workflow/engine/src/ProcessMaker/Exporter/XmlExporter.php +++ b/workflow/engine/src/ProcessMaker/Exporter/XmlExporter.php @@ -181,8 +181,7 @@ class XmlExporter extends Exporter $lastPos = strrpos($filename, '.'); $fileName = substr($filename, 0, $lastPos); $newFileName = \G::inflect($fileName); - $excess = strlen($newFileName) - $limit; - $newFileName = substr($newFileName, 0, strlen($newFileName) - $excess - 1); + $newFileName = $this->truncateFilename($newFileName, $limit); $newOutputFile = str_replace($fileName, $newFileName, $outputFile); if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { $newOutputFile = str_replace("/", DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR, $newOutputFile); @@ -192,9 +191,31 @@ class XmlExporter extends Exporter setlocale(LC_CTYPE, $currentLocale); } else { $outputFile = \G::inflect($outputFile); - if (strlen($outputFile) >= $limit) { - $excess = strlen($outputFile) - $limit; - $newFileName = substr($outputFile, 0, strlen($outputFile) - $excess - 1); + $outputFile = $this->truncateFilename($outputFile, $limit); + } + return $outputFile; + } + + /** + * @param $outputFile + * @param $limit + * @return string + */ + private function truncateFilename($outputFile, $limit) + { + $limitFile = $limit; + if (mb_strlen($outputFile) != strlen($outputFile)) { + if (strlen($outputFile) >= $limitFile) { + do { + $newFileName = mb_strimwidth($outputFile, 0, $limit); + --$limit; + } while (strlen($newFileName) > $limitFile); + $outputFile = $newFileName; + } + } else { + if (strlen($outputFile) >= $limitFile) { + $excess = strlen($outputFile) - $limitFile; + $newFileName = substr($outputFile, 0, strlen($outputFile) - $excess); $outputFile = $newFileName; } }