%PDF- %PDF-
Direktori : /var/www/projetos/suporte.iigd.com.br/src/Application/View/Extension/ |
Current File : //var/www/projetos/suporte.iigd.com.br/src/Application/View/Extension/FrontEndAssetsExtension.php |
<?php /** * --------------------------------------------------------------------- * * GLPI - Gestionnaire Libre de Parc Informatique * * http://glpi-project.org * * @copyright 2015-2024 Teclib' and contributors. * @copyright 2003-2014 by the INDEPNET Development Team. * @licence https://www.gnu.org/licenses/gpl-3.0.html * * --------------------------------------------------------------------- * * LICENSE * * This file is part of GLPI. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <https://www.gnu.org/licenses/>. * * --------------------------------------------------------------------- */ namespace Glpi\Application\View\Extension; use DBmysql; use Entity; use Glpi\Toolbox\FrontEnd; use Html; use Plugin; use Session; use Twig\Extension\AbstractExtension; use Twig\TwigFunction; /** * @since 10.0.0 */ class FrontEndAssetsExtension extends AbstractExtension { /** * GLPI root dir. * @var string */ private $root_dir; public function __construct(string $root_dir = GLPI_ROOT) { $this->root_dir = $root_dir; } public function getFunctions(): array { return [ new TwigFunction('asset_path', [$this, 'assetPath']), new TwigFunction('css_path', [$this, 'cssPath']), new TwigFunction('js_path', [$this, 'jsPath']), new TwigFunction('custom_css', [$this, 'customCss'], ['is_safe' => ['html']]), new TwigFunction('locales_js', [$this, 'localesJs'], ['is_safe' => ['html']]), ]; } /** * Return domain-relative path of an asset. * * @param string $path * * @return string */ public function assetPath(string $path): string { return Html::getPrefixedUrl($path); } /** * Return domain-relative path of a CSS file. * * @param string $path * @param array $options * * @return string */ public function cssPath(string $path, array $options = []): string { $is_debug = isset($_SESSION['glpi_use_mode']) && $_SESSION['glpi_use_mode'] === Session::DEBUG_MODE; $file_path = parse_url($path, PHP_URL_PATH); // Strip potential quey string from path $extra_params = parse_url($path, PHP_URL_QUERY) ?: ''; if (preg_match('/\.scss$/', $file_path)) { $compiled_file = Html::getScssCompilePath($file_path, $this->root_dir); if (!$is_debug && file_exists($compiled_file)) { $path = str_replace($this->root_dir, '', $compiled_file); } else { $path = '/front/css.php?file=' . $file_path; if ($is_debug) { $extra_params .= ($extra_params !== '' ? '&' : '') . 'debug=1'; } } } else { $minified_path = str_replace('.css', '.min.css', $file_path); if (!$is_debug && file_exists($this->root_dir . '/' . $minified_path)) { $path = $minified_path; } else { $path = $file_path; } } if ($extra_params !== '') { // Append query string from initial path, if any $path .= (str_contains($path, '?') ? '&' : '?') . $extra_params; } $path = Html::getPrefixedUrl($path); $path = $this->getVersionnedPath($path, $options); return $path; } /** * Return domain-relative path of a JS file. * * @param string $path * @param array $options * * @return string */ public function jsPath(string $path, array $options = []): string { $is_debug = isset($_SESSION['glpi_use_mode']) && $_SESSION['glpi_use_mode'] === Session::DEBUG_MODE; $minified_path = str_replace('.js', '.min.js', $path); if (!$is_debug && file_exists($this->root_dir . '/' . $minified_path)) { $path = $minified_path; } $path = Html::getPrefixedUrl($path); $path = $this->getVersionnedPath($path, $options); return $path; } /** * Get path suffixed with asset version. * * @param string $path * * @return string */ private function getVersionnedPath(string $path, array $options = []): string { $version = $options['version'] ?? GLPI_VERSION; $path .= (strpos($path, '?') !== false ? '&' : '?') . 'v=' . FrontEnd::getVersionCacheKey($version); return $path; } /** * Return custom CSS for active entity. * * @return string */ public function customCss(): string { /** @var \DBmysql $DB */ global $DB; $css = ''; if ($DB instanceof DBmysql && $DB->connected) { $entity = new Entity(); if (isset($_SESSION['glpiactive_entity'])) { // Apply active entity styles $entity->getFromDB($_SESSION['glpiactive_entity']); } else { // Apply root entity styles $entity->getFromDB('0'); } $css = $entity->getCustomCssTag(); } return $css; } /** * Return locales JS code. * * @return string */ public function localesJs(): string { if (!isset($_SESSION['glpilanguage'])) { return ''; } // Compute available translation domains $locales_domains = ['glpi' => GLPI_VERSION]; $plugins = Plugin::getPlugins(); foreach ($plugins as $plugin) { $locales_domains[$plugin] = Plugin::getPluginFilesVersion($plugin); } $script = <<<JAVASCRIPT $(function() { i18n.setLocale('{$_SESSION['glpilanguage']}'); }); JAVASCRIPT; foreach ($locales_domains as $locale_domain => $locale_version) { $locales_path = Html::getPrefixedUrl( '/front/locale.php' . '?domain=' . $locale_domain . '&v=' . FrontEnd::getVersionCacheKey($locale_version) . ($_SESSION['glpi_use_mode'] == Session::DEBUG_MODE ? '&debug' : '') ); $script .= <<<JAVASCRIPT $(function() { $.ajax({ type: 'GET', url: '{$locales_path}', success: function(json) { i18n.loadJSON(json, '{$locale_domain}'); } }); }); JAVASCRIPT; } return Html::scriptBlock($script); } }