Webmaster общности: Predpriemach.com | SearchEngines.bg

    Темплейт система с 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();
    }
    }
    
    ?>

    Оставете коментар