Template.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <?php
  2. /* vim: set expandtab sw=4 ts=4 sts=4: */
  3. /**
  4. * hold PhpMyAdmin\Template class
  5. *
  6. * @package PhpMyAdmin
  7. */
  8. declare(strict_types=1);
  9. namespace PhpMyAdmin;
  10. use PhpMyAdmin\Twig\CoreExtension;
  11. use PhpMyAdmin\Twig\I18nExtension;
  12. use PhpMyAdmin\Twig\MessageExtension;
  13. use PhpMyAdmin\Twig\PluginsExtension;
  14. use PhpMyAdmin\Twig\RelationExtension;
  15. use PhpMyAdmin\Twig\SanitizeExtension;
  16. use PhpMyAdmin\Twig\ServerPrivilegesExtension;
  17. use PhpMyAdmin\Twig\StorageEngineExtension;
  18. use PhpMyAdmin\Twig\TableExtension;
  19. use PhpMyAdmin\Twig\TrackerExtension;
  20. use PhpMyAdmin\Twig\TransformationsExtension;
  21. use PhpMyAdmin\Twig\UrlExtension;
  22. use PhpMyAdmin\Twig\UtilExtension;
  23. use RuntimeException;
  24. use Throwable;
  25. use Twig\Environment;
  26. use Twig\Error\LoaderError;
  27. use Twig\Error\RuntimeError;
  28. use Twig\Error\SyntaxError;
  29. use Twig\Loader\FilesystemLoader;
  30. use Twig_Error_Loader;
  31. use Twig_Error_Runtime;
  32. use Twig_Error_Syntax;
  33. use Twig_TemplateWrapper;
  34. /**
  35. * Class Template
  36. *
  37. * Handle front end templating
  38. *
  39. * @package PhpMyAdmin
  40. */
  41. class Template
  42. {
  43. /**
  44. * Twig environment
  45. * @var Environment
  46. */
  47. protected static $twig;
  48. /**
  49. * @var string
  50. */
  51. public const BASE_PATH = 'templates/';
  52. /**
  53. * Template constructor
  54. */
  55. public function __construct()
  56. {
  57. /** @var Config $config */
  58. $config = $GLOBALS['PMA_Config'];
  59. if (static::$twig === null) {
  60. $loader = new FilesystemLoader(self::BASE_PATH);
  61. $cache_dir = $config !== null ? $config->getTempDir('twig') : null;
  62. /* Twig expects false when cache is not configured */
  63. if ($cache_dir === null) {
  64. $cache_dir = false;
  65. }
  66. $twig = new Environment($loader, [
  67. 'auto_reload' => true,
  68. 'cache' => $cache_dir,
  69. 'debug' => false,
  70. ]);
  71. $twig->addExtension(new CoreExtension());
  72. $twig->addExtension(new I18nExtension());
  73. $twig->addExtension(new MessageExtension());
  74. $twig->addExtension(new PluginsExtension());
  75. $twig->addExtension(new RelationExtension());
  76. $twig->addExtension(new SanitizeExtension());
  77. $twig->addExtension(new ServerPrivilegesExtension());
  78. $twig->addExtension(new StorageEngineExtension());
  79. $twig->addExtension(new TableExtension());
  80. $twig->addExtension(new TrackerExtension());
  81. $twig->addExtension(new TransformationsExtension());
  82. $twig->addExtension(new UrlExtension());
  83. $twig->addExtension(new UtilExtension());
  84. static::$twig = $twig;
  85. }
  86. }
  87. /**
  88. * Loads a template.
  89. *
  90. * @param string $templateName Template path name
  91. *
  92. * @return Twig_TemplateWrapper
  93. * @throws LoaderError
  94. * @throws RuntimeError
  95. * @throws SyntaxError
  96. */
  97. public function load(string $templateName): Twig_TemplateWrapper
  98. {
  99. try {
  100. $template = static::$twig->load($templateName . '.twig');
  101. } catch (RuntimeException $e) {
  102. /* Retry with disabled cache */
  103. static::$twig->setCache(false);
  104. $template = static::$twig->load($templateName . '.twig');
  105. /*
  106. * The trigger error is intentionally after second load
  107. * to avoid triggering error when disabling cache does not
  108. * solve it.
  109. */
  110. trigger_error(
  111. sprintf(
  112. __('Error while working with template cache: %s'),
  113. $e->getMessage()
  114. ),
  115. E_USER_WARNING
  116. );
  117. }
  118. return $template;
  119. }
  120. /**
  121. * @param string $template Template path name
  122. * @param array $data Associative array of template variables
  123. *
  124. * @return string
  125. * @throws Throwable
  126. * @throws Twig_Error_Loader
  127. * @throws Twig_Error_Runtime
  128. * @throws Twig_Error_Syntax
  129. */
  130. public function render(string $template, array $data = []): string
  131. {
  132. return $this->load($template)->render($data);
  133. }
  134. }