config = $config; $this->themeManager = $themeManager; $this->metadata = $metadata; } protected function getThemeManager() { return $this->themeManager; } protected function getConfig() { return $this->config; } protected function getMetadata() { return $this->metadata; } public function setBasePath($basePath) { $this->basePath = $basePath; } public function getBasePath() { return $this->basePath; } protected function getCacheTimestamp() { if (!$this->getConfig()->get('useCache')) { return (string) time(); } return $this->getConfig()->get('cacheTimestamp', 0); } public function display($runScript = null, $htmlFilePath = null, $vars = []) { if (is_null($runScript)) { $runScript = $this->runScript; } if (is_null($htmlFilePath)) { $htmlFilePath = $this->mainHtmlFilePath; } $isDeveloperMode = $this->getConfig()->get('isDeveloperMode'); $cacheTimestamp = $this->getCacheTimestamp(); if ($isDeveloperMode) { $useCache = $this->getConfig()->get('useCacheInDeveloperMode'); $jsFileList = $this->getMetadata()->get(['app', 'client', 'developerModeScriptList'], []); $loaderCacheTimestamp = 'null'; } else { $useCache = $this->getConfig()->get('useCache'); $jsFileList = $this->getMetadata()->get(['app', 'client', 'scriptList'], []); $loaderCacheTimestamp = $cacheTimestamp; } $cssFileList = $this->getMetadata()->get(['app', 'client', 'cssList'], []); $linkList = $this->getMetadata()->get(['app', 'client', 'linkList'], []); $scriptsHtml = ''; foreach ($jsFileList as $jsFile) { $src = $this->basePath . $jsFile . '?r=' . $cacheTimestamp; $scriptsHtml .= "\n " . ""; } $additionalStyleSheetsHtml = ''; foreach ($cssFileList as $cssFile) { $src = $this->basePath . $cssFile . '?r=' . $cacheTimestamp; $additionalStyleSheetsHtml .= "\n "; } $linksHtml = ''; foreach ($linkList as $item) { $href = $this->basePath . $item['href']; if (empty($item['noTimestamp'])) { $href .= '?r=' . $cacheTimestamp; } $as = $item['as'] ?? ''; $rel = $item['rel'] ?? ''; $type = $item['type'] ?? ''; $additinalPlaceholder = ''; if (!empty($item['crossorigin'])) { $additinalPlaceholder .= ' crossorigin'; } $linksHtml .= "\n "; } $data = [ 'applicationId' => 'espocrm-application-id', 'apiUrl' => 'api/v1', 'applicationName' => $this->getConfig()->get('applicationName', 'EspoCRM'), 'cacheTimestamp' => $cacheTimestamp, 'loaderCacheTimestamp' => $loaderCacheTimestamp, 'stylesheet' => $this->getThemeManager()->getStylesheet(), 'runScript' => $runScript, 'basePath' => $this->basePath, 'useCache' => $useCache ? 'true' : 'false', 'appClientClassName' => 'app', 'scriptsHtml' => $scriptsHtml, 'additionalStyleSheetsHtml' => $additionalStyleSheetsHtml, 'linksHtml' => $linksHtml, 'favicon196Path' => $this->getMetadata()->get(['app', 'client', 'favicon196']) ?? 'client/img/favicon196x196.png', 'faviconPath' => $this->getMetadata()->get(['app', 'client', 'favicon']) ?? 'client/img/favicon.ico', 'ajaxTimeout' => $this->getConfig()->get('ajaxTimeout') ?? 60000, ]; $html = file_get_contents($htmlFilePath); foreach ($vars as $key => $value) { $html = str_replace('{{'.$key.'}}', $value, $html); } foreach ($data as $key => $value) { if (array_key_exists($key, $vars)) continue; $html = str_replace('{{'.$key.'}}', $value, $html); } echo $html; } }