Темплейт система с PHP
Автор: StormBreaker
Това е клас, чрез който можете спокойно да си ползвате темплейти с php код.
- Разделяне на логиката от визуалната част
- Променливи вместо {test}
- Функции. С php имате най-добрия възможен набор от функции
- Условни оператори.
<? if ( empty($ne6to) ): ?>
...
<? else: ?>
...
<? endif; ?>Блокове/цикли
<? foreach ( $block as $item ): ?>
....
<? endforeach; ?>И най-хубавото е, че работи много по-бързо и е много по-леко отколкото при всяко зареждане на страница да се взима съдържанието на файл, пък да се минава през стотици регулярни изрази за заместване.
Начин на употреба 🙂
require_once ‘Template.php’; // Вмъкваме си дефиницията за класа
$t = new Template(„Templates/index.php“); // Първия параметър е пътя към темплейт файла. Ако сложите втория параметър на true тогава ще се включи изходния буфер, който се изключва при показване на темплейта или при ползване на $t->StopOutputBuffer();
// Ако е включен всичко след тази функция няма да се покаже на потребителя, а ще се запази в променлива, която може да се покаже в самия темплейт чрез $this->OutputBuffer
// Добавяме променлива в темплейта
$title = „Пробен темплейт“;
$t->AddVar(„title“, $title);
$title = „друго заглавие“; // Променливата в темплейта си остава = „Пробен темплейт“
// Или я добавяме като референция
$title = „Пробен темплейт“;
$t->AddRef(„title“, $title);
$title = „друго заглавие“; // Сега вече и променливата $title в самия темплейт се променя на „друго заглавие“
// А може да си добавим и масив от променливи. Има и втори параметър true/false, който указва дали да се презапишат съществуващи променливи с еднакви имена (true) или да се запазят старите (false).
$t->AddVars( array( ‘var1’ => ‘test’, ‘var2’ => ‘test2’) );
// Показваме темплейта по един от трите начина
// 1 – Тази функция връща като текст компилирания (така да речем) темплейт
echo $t->GetOutput();
// 2 – Директно го показва
$t->ShowOutput();
// 3 – същото като горното
echo $t;
Вътре в самия темплейт файл променливите се извикват най-лесно така:
<?= $title ?>Можете да ползвате и кратките варианти на foreach, if, for, while и т.н. например:
<? if ( empty($ne6to) ): ?>
...
<? else: ?>
...
<? endif; ?><? foreach ( $block as $item ): ?>
....
<? endforeach; ?>Има и 4 специални променливи, които можете да вземете в темплейта така:
$this->TemplatePath // път към темплейт файла например „/Templates/index.php“
$this->RelativePath // път към директорията, в която се намира файла, но спрямо уеб началната директория. например: „/Templates“
$this->AbsolutePath // абсолютен път към директорията: „C:\AppServ\www\Templates“
$this->OutputBuffer // съдържанието на изходния буфер ако е включен.
Когато не ви трябват толкова функции можете и така да заредите темплейта. Това автоматично ще го покаже.
Template::Load(„/Template/index.php“, array( .. masiv s promenlivi .. ));
Ето кода. Копирате го във файл да речем Template.php и после го вмъквате чрез require_once където ви трябва.
<?php
/**
* @author Stormbreaker
* @copyright 2010
*/
class Template
{
public $TemplatePath, $UseOB, $OutputCompiled = false, $Output;
public $RelativePath, $AbsolutePath;
private $ReplaceSet = false, $Replace;
public $RegisterVariables = true, $OutputBuffer, $Vars = array();
public function __construct($TemplatePath, $UseOutputBuffering = false, $RegisterVariables = true)
{
if ( $UseOutputBuffering )
$this->StartOutputBuffer();
$this->LoadTemplate($TemplatePath);
$this->RegisterVariables = $RegisterVariables;
}
public static function Load($path, $vars = false, $show = true)
{
$t = new Template($path);
if ( $vars !== false )
$t->AddVars($vars);
$out = $t->GetOutput();
if ( $show )
echo $out;
return $out;
}
public function StartOutputBuffer()
{
$this->UseOB = true;
ob_start();
}
public function LoadTemplate($Template)
{
if ( !is_file($Template) )
die('Could not load template: '. $Template);
$this->TemplatePath = $Template;
$this->AbsolutePath = dirname($Template);
$this->RelativePath = str_replace(str_replace("\\", "/", $_SERVER['DOCUMENT_ROOT']), "", str_replace("\\", "/", $this->AbsolutePath);
}
public function StopOutputBuffer($GetAllLevels = true)
{
$this->OutputBuffer = '';
if ( $GetAllLevels )
while ( ob_get_level() )
$this->OutputBuffer .= ob_get_clean();
else
$this->OutputBuffer = ob_get_clean();
$this->UseOB = false;
return $this->OutputBuffer;
}
public function AddVar($name, $val)
{
$this->Vars[$name] = $val;
}
public function AddRef($name, &$ref)
{
$this->Vars[$name] = &$ref;
}
public function AddVars($array, $shouldOverride = true)
{
if ( $shouldOverride )
$this->Vars = array_merge($this->Vars, $array);
else
$this->Vars = array_merge($array, $this->Vars);
}
public function Redirect($Url, $Time = 5)
{
header("Refresh: ".$Time."; url=". $Url);
if ( !$this->OutputShown )
$this->ShowOutput();
}
private function CompileOutput()
{
if ( $this->OutputCompiled )
return false;
extract($this->Vars, EXTR_REFS);
if ( $this->UseOB )
$this->StopOutputBuffer();
ob_start();
require $this->TemplatePath;
$this->Output = ob_get_clean();
if ( $this->ReplaceSet )
foreach ( $this->Replace as $r )
$this->Output = preg_replace($r['search'], $r['replace'], $this->Output);
$this->OutputCompiled = true;
return true;
}
public function GetOutput()
{
$this->CompileOutput();
return $this->Output;
}
public function ShowOutput()
{
echo $this->GetOutput();
}
public function __toString()
{
return $this->GetOutput();
}
}
?>

