Простой шаблонизатор с кэшированием и i18n

  1. /**
  2.  * Simple template engine
  3.  */
  4. class Template {
  5.     private static $templatesPath = 'templates/';
  6.     private static $cache = array();
  7.  
  8.     /**
  9.      * @param string $name filename without extension
  10.      * @return self
  11.      */
  12.     public static function from($name) {
  13.         return self::fromPath(self::$templatesPath, $name);
  14.     }
  15.    /**
  16.      * @param string $path path to directory of template files
  17.      * @param string $name filename without extension
  18.      * @return self
  19.      */
  20.     public static function fromPath($path, $name) {
  21.         return new Template($path, $name);
  22.     }
  23.  
  24.     /**
  25.      * Merge templates to one string
  26.      * @param Template[] $templates
  27.      * @param string $separator
  28.      * @return string
  29.      */
  30.     public static function merge(array $templates, $separator = "\n") {
  31.         $output = '';
  32.         foreach ($templates as $template) {
  33.             $output .= $template->render() . $separator;
  34.         }
  35.         return $output;
  36.     }
  37.     /**
  38.      * @param string $templatesPath
  39.      */
  40.     public static function setTemplatesPath($templatesPath) {
  41.         self::$templatesPath = $templatesPath;
  42.     }
  43.     /**
  44.      * @return string
  45.      */
  46.     public static function getTemplatesPath() {
  47.         return self::$templatesPath;
  48.     }
  49.  
  50.     protected $file;
  51.     protected $values;
  52.     protected $excludeFromCache;
  53.  
  54.     private function __construct($templatesPath, $file) {
  55.         $this->file = $templatesPath . $file . '.tpl';
  56.         $this->values = array();
  57.         $this->excludeFromCache = false;
  58.     }
  59.  
  60.     /**
  61.      * Add data to view
  62.      * @param string|array $key
  63.      * @param mixed $value
  64.      * @return $this
  65.      */
  66.     public function with($key, $value) {
  67.         if (is_array($key)) {
  68.             $this->values = array_merge($this->values, $key);
  69.         } else {
  70.             $this->values[$key] = $value;
  71.         }
  72.         return $this;
  73.     }
  74.     public function excludeFromCache() {
  75.         $this->excludeFromCache = true;
  76.         return $this;
  77.     }
  78.  
  79.     /**
  80.      * Render template
  81.      * @return string
  82.      */
  83.     public function render() {
  84.         // Get template content from storage or cache
  85.         if (array_key_exists($this->file, self::$cache)) {
  86.             $output = self::$cache[$this->file];
  87.         } else {
  88.             $output = file_get_contents($this->file);
  89.             if (!$this->excludeFromCache) {
  90.                 self::$cache[$this->file] = $output;
  91.             }
  92.         }
  93.         // {|key|} - multilanguage key
  94.         $output = preg_replace_callback('#\{\|(.*?)\|\}#u', function($key) {
  95.             global $lang;
  96.             return $lang->get($key[1]);
  97.         }, $output);
  98.         // {?key?} - if key doesn't exists - clear value
  99.         $output = preg_replace_callback('#\{\?(.*?)\?\}#u', function($key) {
  100.             if (array_key_exists($key[1], $this->values)) {
  101.                 return $this->values[$key[1]];
  102.             }
  103.             return '';
  104.         }, $output);
  105.         // {key} - normal replace if exists
  106.         foreach ($this->values as $key => $value) {
  107.             $output = str_replace('{'.$key.'}', $value, $output);
  108.         }
  109.         return $output;
  110.     }
  111.  
  112.     public function __toString() {
  113.         return $this->render();
  114.     }
  115. }
Для локализации используется класс Lang.

<b>{key}</b> - простая подстановка. Если ключ не задан, то при выводе будет: <b>{key}</b>
<b>{?key?}</b> - то же самое, но если ключ не задан, то при выводе будет пусто: <b></b>
<b>{|key|}</b> - подстановка с локализацией. В русской локализации выдаст: <b>ключ</b>, в английской: <b>key</b>

Пример

Реклама

Мы в соцсетях

tw tg yt gt