* Add native property types Includes TypeHints.UnionTypeHintFormat Signed-off-by: Kamil Tekiela <tekiela246@gmail.com> * Set some default values for properties Signed-off-by: Kamil Tekiela <tekiela246@gmail.com> * Format and promote properties Signed-off-by: Kamil Tekiela <tekiela246@gmail.com> * Remove redundant asserts Signed-off-by: Kamil Tekiela <tekiela246@gmail.com> * Redundant cast Signed-off-by: Kamil Tekiela <tekiela246@gmail.com> * $tmanager->theme is never null Signed-off-by: Kamil Tekiela <tekiela246@gmail.com> * Redundant variable Signed-off-by: Kamil Tekiela <tekiela246@gmail.com> * Fix empty on $statementInfo bool Signed-off-by: Kamil Tekiela <tekiela246@gmail.com> * Redundant casts Signed-off-by: Kamil Tekiela <tekiela246@gmail.com> * Redundant issets Signed-off-by: Kamil Tekiela <tekiela246@gmail.com> * getPacked() returns nullable string Signed-off-by: Kamil Tekiela <tekiela246@gmail.com> * Redundant if Signed-off-by: Kamil Tekiela <tekiela246@gmail.com> * $this->content can be null Signed-off-by: Kamil Tekiela <tekiela246@gmail.com> * Simplify ThemeManager::getInstance() Signed-off-by: Kamil Tekiela <tekiela246@gmail.com> * Use isset for checking if property is initialized Signed-off-by: Kamil Tekiela <tekiela246@gmail.com> * Use nullable instead of uninitialized property Signed-off-by: Kamil Tekiela <tekiela246@gmail.com> * password is no longer nullable I can't verify that none of the globals ever tried to set it to null, but the variable should never be nullable. Signed-off-by: Kamil Tekiela <tekiela246@gmail.com> * Update baselines Signed-off-by: Kamil Tekiela <tekiela246@gmail.com> * $same_wide_width param can be float or int Signed-off-by: Kamil Tekiela <tekiela246@gmail.com> * Update Message.php Signed-off-by: Kamil Tekiela <tekiela246@gmail.com> * Cast Sub_part to int Signed-off-by: Kamil Tekiela <tekiela246@gmail.com> * Fix one line doc comments Signed-off-by: Kamil Tekiela <tekiela246@gmail.com> --------- Signed-off-by: Kamil Tekiela <tekiela246@gmail.com>
147 lines
4.2 KiB
PHP
147 lines
4.2 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace PhpMyAdmin;
|
|
|
|
use PhpMyAdmin\Twig\AssetExtension;
|
|
use PhpMyAdmin\Twig\CoreExtension;
|
|
use PhpMyAdmin\Twig\Extensions\Node\TransNode;
|
|
use PhpMyAdmin\Twig\FlashMessagesExtension;
|
|
use PhpMyAdmin\Twig\I18nExtension;
|
|
use PhpMyAdmin\Twig\MessageExtension;
|
|
use PhpMyAdmin\Twig\SanitizeExtension;
|
|
use PhpMyAdmin\Twig\TableExtension;
|
|
use PhpMyAdmin\Twig\TrackerExtension;
|
|
use PhpMyAdmin\Twig\TransformationsExtension;
|
|
use PhpMyAdmin\Twig\UrlExtension;
|
|
use PhpMyAdmin\Twig\UtilExtension;
|
|
use RuntimeException;
|
|
use Throwable;
|
|
use Twig\Environment;
|
|
use Twig\Error\LoaderError;
|
|
use Twig\Error\RuntimeError;
|
|
use Twig\Error\SyntaxError;
|
|
use Twig\Extension\DebugExtension;
|
|
use Twig\Loader\FilesystemLoader;
|
|
use Twig\RuntimeLoader\ContainerRuntimeLoader;
|
|
use Twig\TemplateWrapper;
|
|
|
|
use function __;
|
|
use function sprintf;
|
|
use function trigger_error;
|
|
|
|
use const E_USER_WARNING;
|
|
|
|
/**
|
|
* Handle front end templating
|
|
*/
|
|
class Template
|
|
{
|
|
/**
|
|
* Twig environment
|
|
*/
|
|
protected static Environment $twig;
|
|
|
|
public const TEMPLATES_FOLDER = ROOT_PATH . 'templates';
|
|
|
|
public function __construct()
|
|
{
|
|
if (isset(static::$twig)) {
|
|
return;
|
|
}
|
|
|
|
/** @var Config|null $config */
|
|
$config = $GLOBALS['config'];
|
|
$cacheDir = $config?->getTempDir('twig');
|
|
|
|
static::$twig = self::getTwigEnvironment($cacheDir);
|
|
}
|
|
|
|
public static function getTwigEnvironment(string|null $cacheDir): Environment
|
|
{
|
|
/* Twig expects false when cache is not configured */
|
|
if ($cacheDir === null) {
|
|
$cacheDir = false;
|
|
}
|
|
|
|
$loader = new FilesystemLoader(self::TEMPLATES_FOLDER);
|
|
$twig = new Environment($loader, [
|
|
'auto_reload' => true,
|
|
'cache' => $cacheDir,
|
|
]);
|
|
|
|
$twig->addRuntimeLoader(new ContainerRuntimeLoader(Core::getContainerBuilder()));
|
|
|
|
if (($GLOBALS['cfg']['environment'] ?? '') === 'development') {
|
|
$twig->enableDebug();
|
|
$twig->addExtension(new DebugExtension());
|
|
// This will enable debug for the extension to print lines
|
|
// It is used in po file lines re-mapping
|
|
TransNode::$enableAddDebugInfo = true;
|
|
} else {
|
|
$twig->disableDebug();
|
|
TransNode::$enableAddDebugInfo = false;
|
|
}
|
|
|
|
$twig->addExtension(new AssetExtension());
|
|
$twig->addExtension(new CoreExtension());
|
|
$twig->addExtension(new FlashMessagesExtension());
|
|
$twig->addExtension(new I18nExtension());
|
|
$twig->addExtension(new MessageExtension());
|
|
$twig->addExtension(new SanitizeExtension());
|
|
$twig->addExtension(new TableExtension());
|
|
$twig->addExtension(new TrackerExtension());
|
|
$twig->addExtension(new TransformationsExtension());
|
|
$twig->addExtension(new UrlExtension());
|
|
$twig->addExtension(new UtilExtension());
|
|
|
|
return $twig;
|
|
}
|
|
|
|
/**
|
|
* Loads a template.
|
|
*
|
|
* @param string $templateName Template path name
|
|
*
|
|
* @throws LoaderError
|
|
* @throws RuntimeError
|
|
* @throws SyntaxError
|
|
*/
|
|
private function load(string $templateName): TemplateWrapper
|
|
{
|
|
try {
|
|
$template = static::$twig->load($templateName . '.twig');
|
|
} catch (RuntimeException $e) {
|
|
/* Retry with disabled cache */
|
|
static::$twig->setCache(false);
|
|
$template = static::$twig->load($templateName . '.twig');
|
|
// The trigger error is intentionally after second load
|
|
// to avoid triggering error when disabling cache does not solve it.
|
|
trigger_error(
|
|
sprintf(
|
|
__('Error while working with template cache: %s'),
|
|
$e->getMessage(),
|
|
),
|
|
E_USER_WARNING,
|
|
);
|
|
}
|
|
|
|
return $template;
|
|
}
|
|
|
|
/**
|
|
* @param string $template Template path name
|
|
* @param array $data Associative array of template variables
|
|
*
|
|
* @throws Throwable
|
|
* @throws LoaderError
|
|
* @throws RuntimeError
|
|
* @throws SyntaxError
|
|
*/
|
|
public function render(string $template, array $data = []): string
|
|
{
|
|
return $this->load($template)->render($data);
|
|
}
|
|
}
|