2013-07-23 2 views
0

Я работаю над своей новой CMS, и я попытался создать механизм шаблонов. И я добавил систему перевода, но не работает хорошо. Вот мой класс для шаблона:PHP translate and template engine

<?php 

class Template { 
    private $vars = array(); 

    public function assign($key, $value){ 
     $this->vars[$key] = $value; 
    } 

    public function render($template_name){ 
     $path = 'templates/default/'.$template_name.'.html'; 

     if(file_exists($path)){ 
      $contents = file_get_contents($path); 

      foreach($this->vars as $key => $value){ 
       $contents = preg_replace('/\['.$key.'\]/', $value, $contents); 
      } 

      $site_theme = 'default'; 
      $contents = preg_replace('/\<\!\-\- if (.*) \-\-\>/', '<?php if($1) : ?>', $contents); 
      $contents = preg_replace('/\<\!\-\- else \-\-\>/', '<?php else : ?>', $contents); 
      $contents = preg_replace('/\<\!\-\- endif \-\-\>/', '<?php endif; ?>', $contents); 
      $contents = preg_replace('/\<\!\-\- include:(.*) \-\-\>/', '<?php include "templates/$site_theme/$1"; ?>', $contents); 
      $contents = preg_replace('/\<\!\-\- is_logged \-\-\>/', '<?php logged() ? include "templates/'.$site_theme.'/logged.html" : logged(); ?>', $contents); 
      $contents = preg_replace('/\<\!\-\- not_logged \-\-\>/', '<?php logged() ? : include "templates/'.$site_theme.'/unlogged.html"; ?>', $contents); 

      eval(' ?> '.$contents. ' <?php '); 
     } else { 
      // What if i told you template don't exist? 
      exit('<h1>Template path don't exist. </h1>'); 
     } 

    } 

} 

?> 

индекс:

<?php 

     $template = new Template; 

    $template->assign('lang_title', $lang['cat_categories']); 

    $template->render('index'); 

?> 

Перевести файл:

<?php 

$lang['db_connect_failed']  = 'Unable connect to database'; 


$lang['cat_categories']  = 'Categories'; 

?> 

И это моя проблема: Все работает, когда я добавить [переменная] в моем файле templates/default/index.html, и он показывает, что нужно показывать. Но когда я добавляю файлы в шаблон, например: templates/default/inc/header.html, и в этом файле добавьте мою переменную, это не сработает. Я включаю этот файл в свой index.html, который находится в родительской папке, используя PHP или мой измененный комментарий HTML, который не работает. Я хочу добавить [lang_translate] в мой включенный файл или $ lang ['cat_categories'] (который не работает даже в index.html) в заголовке или индексе, чтобы показать перевод.

Все пути к файлу в порядке и работают. Что я могу сделать сейчас?

ответ

0

Тогда делает это должно работать, может быть:

// function names migt differ. Check output buffering on php.net 
Ob_start(); 
include index.html; 
$contents = ob_get_clean(); 

Теперь содержимое будет иметь файл заголовка тоже. Кстати, я бы предложил вам использовать механизм шаблонов. Использование eval в неизвестном файле шаблона, созданным кем-то, может оказаться рискованным.