Translated using Weblate (Portuguese)
[phpmyadmin.git] / src / Template.php
blob937f7ed812d65b00d9f335d28f3025dfcbeafe5a
1 <?php
3 declare(strict_types=1);
5 namespace PhpMyAdmin;
7 use PhpMyAdmin\Container\ContainerBuilder;
8 use PhpMyAdmin\Twig\AssetExtension;
9 use PhpMyAdmin\Twig\CoreExtension;
10 use PhpMyAdmin\Twig\FlashMessengerExtension;
11 use PhpMyAdmin\Twig\I18nExtension;
12 use PhpMyAdmin\Twig\MessageExtension;
13 use PhpMyAdmin\Twig\PmaGlobalVariable;
14 use PhpMyAdmin\Twig\SanitizeExtension;
15 use PhpMyAdmin\Twig\TransformationsExtension;
16 use PhpMyAdmin\Twig\UrlExtension;
17 use PhpMyAdmin\Twig\UtilExtension;
18 use RuntimeException;
19 use Throwable;
20 use Twig\Environment;
21 use Twig\Error\LoaderError;
22 use Twig\Error\RuntimeError;
23 use Twig\Error\SyntaxError;
24 use Twig\Extension\DebugExtension;
25 use Twig\Loader\FilesystemLoader;
26 use Twig\RuntimeLoader\ContainerRuntimeLoader;
27 use Twig\TemplateWrapper;
29 /**
30 * Handle front end templating
32 class Template
34 /**
35 * Twig environment
37 protected static Environment|null $twig = null;
39 public const TEMPLATES_FOLDER = ROOT_PATH . 'resources/templates';
41 private Config $config;
43 public function __construct(Config|null $config = null)
45 $this->config = $config ?? Config::getInstance();
48 public static function getTwigEnvironment(string|null $cacheDir, bool $isDevEnv): Environment
50 /* Twig expects false when cache is not configured */
51 if ($cacheDir === null) {
52 $cacheDir = false;
55 $loader = new FilesystemLoader(self::TEMPLATES_FOLDER);
56 $twig = new Environment($loader, ['auto_reload' => true, 'cache' => $cacheDir]);
58 $twig->addRuntimeLoader(new ContainerRuntimeLoader(ContainerBuilder::getContainer()));
60 if ($isDevEnv) {
61 $twig->enableDebug();
62 $twig->enableStrictVariables();
63 $twig->addExtension(new DebugExtension());
64 } else {
65 $twig->disableDebug();
66 $twig->disableStrictVariables();
69 $twig->addGlobal('pma', new PmaGlobalVariable());
70 $twig->addExtension(new AssetExtension());
71 $twig->addExtension(new CoreExtension());
72 $twig->addExtension(new FlashMessengerExtension());
73 $twig->addExtension(new I18nExtension());
74 $twig->addExtension(new MessageExtension());
75 $twig->addExtension(new SanitizeExtension());
76 $twig->addExtension(new TransformationsExtension());
77 $twig->addExtension(new UrlExtension());
78 $twig->addExtension(new UtilExtension());
80 return $twig;
83 /**
84 * Loads a template.
86 * @param string $templateName Template path name
88 * @throws LoaderError
89 * @throws RuntimeError
90 * @throws SyntaxError
92 private function load(string $templateName): TemplateWrapper
94 if (static::$twig === null) {
95 $isDevEnv = $this->config->config->environment === 'development';
96 static::$twig = self::getTwigEnvironment(CACHE_DIR . 'twig', $isDevEnv);
99 try {
100 return static::$twig->load($templateName . '.twig');
101 } catch (RuntimeException) { // @phpstan-ignore-line thrown by Twig\Cache\FilesystemCache
102 /* Retry with disabled cache */
103 static::$twig->setCache(false);
105 return static::$twig->load($templateName . '.twig');
110 * @param string $template Template path name
111 * @param mixed[] $data Associative array of template variables
113 * @throws Throwable
114 * @throws LoaderError
115 * @throws RuntimeError
116 * @throws SyntaxError
118 public function render(string $template, array $data = []): string
120 return $this->load($template)->render($data);
123 public function disableCache(): void
125 if (static::$twig === null) {
126 static::$twig = self::getTwigEnvironment(null, false);
129 static::$twig->setCache(false);