Translated using Weblate (Portuguese)
[phpmyadmin.git] / src / Template.php
blobf8bce6c28d14d28d4784030d0aaa15663ade22fd
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\Extensions\Node\TransNode;
11 use PhpMyAdmin\Twig\FlashMessagesExtension;
12 use PhpMyAdmin\Twig\I18nExtension;
13 use PhpMyAdmin\Twig\MessageExtension;
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 // This will enable debug for the extension to print lines
65 // It is used in po file lines re-mapping
66 TransNode::$enableAddDebugInfo = true;
67 } else {
68 $twig->disableDebug();
69 $twig->disableStrictVariables();
70 TransNode::$enableAddDebugInfo = false;
73 $twig->addExtension(new AssetExtension());
74 $twig->addExtension(new CoreExtension());
75 $twig->addExtension(new FlashMessagesExtension());
76 $twig->addExtension(new I18nExtension());
77 $twig->addExtension(new MessageExtension());
78 $twig->addExtension(new SanitizeExtension());
79 $twig->addExtension(new TransformationsExtension());
80 $twig->addExtension(new UrlExtension());
81 $twig->addExtension(new UtilExtension());
83 return $twig;
86 /**
87 * Loads a template.
89 * @param string $templateName Template path name
91 * @throws LoaderError
92 * @throws RuntimeError
93 * @throws SyntaxError
95 private function load(string $templateName): TemplateWrapper
97 if (static::$twig === null) {
98 $isDevEnv = $this->config->config->environment === 'development';
99 static::$twig = self::getTwigEnvironment(CACHE_DIR . 'twig', $isDevEnv);
102 try {
103 return static::$twig->load($templateName . '.twig');
104 } catch (RuntimeException) { // @phpstan-ignore-line thrown by Twig\Cache\FilesystemCache
105 /* Retry with disabled cache */
106 static::$twig->setCache(false);
108 return static::$twig->load($templateName . '.twig');
113 * @param string $template Template path name
114 * @param mixed[] $data Associative array of template variables
116 * @throws Throwable
117 * @throws LoaderError
118 * @throws RuntimeError
119 * @throws SyntaxError
121 public function render(string $template, array $data = []): string
123 return $this->load($template)->render($data);
126 public function disableCache(): void
128 if (static::$twig === null) {
129 static::$twig = self::getTwigEnvironment(null, false);
132 static::$twig->setCache(false);