Темплейт система с PHP
28-04-2010
Това е клас, чрез който можете спокойно да си ползвате темплейти с php код.

- Разделяне на логиката от визуалната част
- Променливи <?= $test ?> вместо {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();
}
}

?>



/ Трябва да сте регистриран за да напишете коментар /
От: Pavkatar
19:34 28-04-2010
Супeр укрок, Браво ! :)
От: Pavkatar
20:20 28-04-2010
Въпрос: може ли да се зареждат няколко темплейт файла наведнъж? Примерно header.php и footer.php
От: StormBreaker
20:38 28-04-2010
Защо ти е да зареждаш 2 файла наведнъж? Можеш това да го вкараш в един. Ето ти пример за 2 темплейта на една страница. template.php ти съдържа например:

...

tekst za vsqka stranica





И другия темплейт специално за тази страница примерно index.php . Той ще се замести, където е

Това е индекса, здравейте :)

И сега вкарваш и двата един в друг:
// Първо главния темплейт, втория параметър е true за да работи буфера.
$t = new Template("template.php", true);

// Сега вкарваме и вторичния. По бързата процедура примерно. Може да си ползваш и горния начин пак с new Template и после ShowOutput :D
Template::Load("index.php");

// За демонстрация
echo "direktno izvejdane na tekst";

// И показваме всичко
$t->ShowOutput();

И в браузъра ще изведе:

...

tekst za vsqka stranica

Това е индекса, здравейте :)direktno izvejdane na tekst



Забележи, че при втория параметър = true всичко между new Template и ShowOutput се запазва и отива във $this->OutputBuffer вместо да се извежда директно. Ако се извеждаше директно това "direktno izvejdane na tekst" щеше да се появи преди ...
От: StormBreaker
20:42 28-04-2010
оф това изтри html таговете...

template.php
&lt;html&gt;
&lt;head&gt;...&lt;/head&gt;
&lt;body&gt;
tekst za vsqka stranica

&lt;?= $this->OutputBuffer ?&gt;
&lt;/body&gt;
&lt;/html&gt;

И това, което ще се изведе е:
&lt;html&gt;
&lt;head&gt;...&lt;/head&gt;
&lt;body&gt;
tekst za vsqka stranica

Това е индекса, здравейте :)direktno izvejdane na tekst
&lt;/body&gt;
&lt;/html&gt;
От: Styl3r
21:27 08-06-2010
Демо?
От: StormBreaker
21:40 08-06-2010
Какво демо искаш на темплейт система? o.O
От: Ev0luti0N
20:29 01-03-2011
Само аз ли не мога да се оправя с това :/
1