'Failed: Join path.', ERROR_MESSAGE_TO_DEVELOPER => "Trailing path parts may not start with '/'. Trailing part: '$part'."]), ERROR_PATH_INVALID); } $path .= '/' . $part; } }); // remove multiple occurrences of '/' (but keep http://) if (preg_match('/^\w*:\/\//', $path, $match) ) { $protocol = $match[0]; $path = substr($path, strlen($protocol)); } else { $protocol = ''; } $path = preg_replace('/\/{2,}/','/', $path); return $protocol . $path; } /////////////////////////////////////////////////// Private ////////////////////////////////////////////////////// /** * @param string $newPath */ private static function setAbsoluteApp(string $newPath) { self::$absoluteApp = $newPath; } /** * @param string $newPath */ private static function setAppToProject(string $newPath) { self::$appToProject = $newPath; } /** * @param string $newPath */ private static function setAbsoluteLog(string $newPath) { self::$absoluteLog = $newPath; } /** * Searches these places for log directory: * 1) project-directory/log * 2) fileadmin/protected/log * If not found create log dir in: project-directory/log * * @throws \UserFormException */ private static function findAbsoluteLog() { if (!is_null(self::$absoluteLog)) { // only execute once return; } // search log dir qfqProject/log $absoluteLog = self::absoluteApp(self::appToProject(self::PROJECT_TO_LOG_DEFAULT)); if (file_exists($absoluteLog)) { self::setAbsoluteLog($absoluteLog); // search log dir fileadmin/protected/log } elseif (file_exists(self::absoluteApp(self::APP_TO_LOG_IN_PROTECTED))) { self::setAbsoluteLog(self::absoluteApp(self::APP_TO_LOG_IN_PROTECTED)); // create default log dir qfqProject/log } else { HelperFile::createPathRecursive($absoluteLog); self::setAbsoluteLog($absoluteLog); } } /** * Read the project location from qfq.project.path.php or create the file with default path. * * @throws \CodeException * @throws \UserFormException */ private static function findAppToProject() { if (!is_null(self::$appToProject)) { // only execute once return; } // does qfq.project.path.php exist? => read path $absoluteProjectPathFile = self::absoluteApp(PROJECT_PATH_PHP_FILE); if (HelperFile::isReadableException($absoluteProjectPathFile)) { self::setAppToProject(HelperFile::include($absoluteProjectPathFile)); // does the deprecated config.qfq.php exist? => fileadmin/protected/qfqProject & migrate to qfq.json } elseif (HelperFile::isReadableException(self::absoluteApp(self::APP_TO_TYPO3_CONF, CONFIG_QFQ_PHP))) { HelperFile::createPathRecursive(self::absoluteApp(self::APP_TO_PROJECT_IN_PROTECTED)); self::setAppToProject(self::APP_TO_PROJECT_IN_PROTECTED); Config::migrateConfigPhpToJson(); self::writeProjectPathPhp(); // does fileadmin exist? => fileadmin/protected/qfqProject } elseif (file_exists(self::absoluteApp(self::APP_TO_FILEADMIN))) { HelperFile::createPathRecursive(self::absoluteApp(self::APP_TO_PROJECT_IN_PROTECTED)); self::setAppToProject(self::APP_TO_PROJECT_IN_PROTECTED); self::writeProjectPathPhp(); // else => folder above APP } else { self::setAppToProject(self::APP_TO_PROJECT_DEFAULT); self::writeProjectPathPhp(); } } /** * Find the absolute path of the App directory using the path of this file. * Fails if typo3conf is not found in that path. * * @throws \UserFormException */ private static function findAbsoluteApp() { // look for typo3conf directory $absoluteApp = self::realpath(self::join(__DIR__, '../../../../../../')); if (!file_exists(self::join($absoluteApp, self::APP_TO_TYPO3_CONF))) { Thrower::userFormException('App path seems to be wrong: Directory "typo3conf" not found in app path.' , "Current app path: $absoluteApp"); } return $absoluteApp; } /** * Write the project path configuration file to the project directory. * * @throws \UserFormException */ private static function writeProjectPathPhp() { $appToProject = self::appToProject(); $fileContent = <<