Не создавайте парсер, поскольку он абсолютно бессмысленный, PHP уже является механизмом шаблонов, все, что вы хотите сделать, это расширить его возможности с помощью инкапсулированной системы шаблонов.
Метод, описанный ниже, - это способ, которым я всегда создаюмой шаблонизатор, он очень потерян и может быть расширен с помощью помощников шаблонов.
хорошая вещь в моей системе шаблонов состоит в том, что вам не нужно тратить свои ресурсы на создание кеш-системы для ваших скомпилированных шаблонов.как уже в скомпилированном состоянии, по сравнению с такими движками, как smarty.
Сначала мы хотим создать основной класс шаблона, который будет использоваться для задания данных, выбора шаблона и т. д.
Итак, давайте начнем с этого:
class Template
{
private $__data = array();
public function __construct(){/*Set up template root here*/}
public function __set($key,$val)
{
$this->__data[$key] => $val;
}
public function __get($key)
{
return $this->__data[$key];
}
public function Display($Template)
{
new TemplatePage($Template,$this->__data); //Send data and template name to encapsulated object
}
}
это очень простой класс, который позволит делать что-то вроде
$Template = new Template();
$Template->Userdata = $User->GetUserData();
$Template->Display("frontend/index");
Хорошо, теперь вы могли заметить, что класс выше называется TemplatePage
, это класс, который загружает фактический шаблон файла, и внутри фактического шаблона вы будете находиться в области действия TemplatePage
scope.
Это позволит вам иметь методы для получения данных вашего шаблона, а также доступа к помощникам, ниже приведен пример TemplatePage
class TemplatePage
{
private $__data = array();
public function __construct($template,$data)
{
$this->__data = $data;
unset($data);
//Load the templates
if(file_exists(TEMPLATE_PATH . "/" . $template . ".php"))
{
require_once TEMPLATE_PATH . "/" . $template . ".php";
return;
}
trigger_error("Template does not exists",E_USER_ERROR);
}
public function __get($key)
{
return $this->__data[$key];
}
public function require($template)
{
if(file_exists(TEMPLATE_PATH . "/" . $template . ".php"))
{
require_once TEMPLATE_PATH . "/" . $template . ".php";
return;
}
trigger_error("Template does not exists",E_USER_NOTICE);
}
public function link($link,$title)
{
return sprintf('<a href="%s">%s</a>',$link,$title);
}
}
Так что теперь, когда шаблонзагруженный в рамках класса, вы можете расширить методы, такие как link
и require
, чтобы получить полнофункциональный набор инструментов шаблона
Пример шаблона:
<?php $this->require("folder/js_modules") ?>
<ul>
<?php foreach ($this->photos as $photo): ?>
<li>
<?php echo $this->link($photo->link,"click to view") ?>
<span><?php echo $photo->image_name?></span>
</li>
<?php endforeach; ?>
</ul>
<?php $this->require("folder/footer") ?>