Нативный шаблонизатор



Работать с нативными шаблонами очень просто, ведь по сути это обычные PHP файлы. С одной только разницей, что в них активно используется HTML разметка. Однако фреймворк предоставляет несколько полезных функций для более удобной с ними работы. Принцип работы с ним коротко описан здесь


Для того чтобы воспользоваться этим функционалом, нужно отключить встроенный шаблонизатор, который включен по умолчанию. Встроенный шаблонизатор тоже понимает нативный php синтаксис, если это разрешить в настройках. Но если нужен чистый натив, лучше его всё-таки отключить, это даст экономию ресурса.

Отключается он следующей настройкой в любом конфигурационном файле:

1
2
3
4
5

                'template' => [
                                    
'abc_template'    => false,
                ],




По умолчанию расширение шаблонов должно быть .tpl, однако можно сделать его любым, прописав настройку в конфигурации:

1
2
3
4
5
6

                'template' => [
                                    
'abc_template'    => false,
                                    
'ext'             => 'php',
                ],




Однако шаблоны .tpl корректнее подсвечиваются дебаггером.

Чем отличается работа шаблонизатора от прямого включения шаблонов с помощью include.

Первое. Если пользоваться функционалом фреймворка, то страницу формирует он, а не приложение. Это позволит контролировать некоторые процессы и более правильно подготовить страницу для отправки в поток.
Второе. Поддерживается эмуляция одного уровня наследования шаблонов.
И третье. Это позволит более наглядно разделить логику отображения и логику шаблона.

Шаблонизатор представляет следующие методы:

1 selectTpl() Выбирает шаблон
2 assign() Передает переменные в шаблон
3 assignHtml() Передает переменные в шаблон
4 extendsTpl() Наследует макет от шаблона
5 parseTpl() Разбирает и заполняет шаблон




selectTpl() public method

Выбирает шаблон

Метод загружает для разбора выбранный шаблон. Аргументом принимает путь от директории с шаблонами и название файла без расширения

public TplNative::selectTpl ( $tplName )
$tplName string Имя шаблона без расширения
return $this Объект


assign() public method

Передает переменные в шаблон

Этот метод передает значения переменных в шаблон как по имени, так и массивом. При передаче массива ключи становятся именами переменных, а значения их заполняют.

Смотри еще assignHtml().

public TplNative::assign ( $data, $value null )
$data string|array Имя переменной в шаблоне. Либо массив, где ключи - имена переменных.
$value string Значение переменной, если первым аргументом передано имя.
return $this Объект


assignHtml() public method

Передает переменные в шаблон

Этот метод передает значения переменных в шаблон как по имени, так и массивом, предварительно обработав их htmlspecialchars(). При передаче массива ключи становятся именами переменных, а значения их заполняют.

Смотри еще assign().

public TplNative::assignHtml ( $data, $value null )
$data string|array Имя переменной в шаблоне. Либо массив, где ключи - имена переменных.
$value string Значение переменной, если первым аргументом передано имя.
return $this Объект


extendsTpl() public method

Наследует макет от шаблона

Помещает шаблон в макет и передает в макет переменные, назначенные в шаблоне.

public TplNative::extendsTpl ( $block, $layout null )
$block string Блок (имя переменной), куда будет помещен шаблон
$layout string Макет (главный шаблон)
return $this Объект




parseTpl() public method

Разбирает и заполняет шаблон

Возвращает заполненный шаблон в виде строки.

public TplNative::parseTpl ( )
return string Заполненный шаблон



Примеры использования.

К примеру, у нас есть макет (главный шаблон). Размещается он в директории с шаблонами
(по умолчанию theme/tpl/)

www\theme\tpl\index.tpl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ABC-Framework</title>
</head>
 
<body>
<div class="content">

<?=$content?>


</div>
<div class="footer">
© 2015-<?=date('Y'); ?> IRBIS-team
</div>
</body>
</html>



В переменную $content будет выведен заполненный шаблон текущей страницы.

Для примера: шаблон главной страницы

www\theme\tpl\main.tpl
1
2
3
4
5
6
7
8

<div style="text-align:center">
<h2><?=$hello?></h2>
</div>
 



Для этого нужно в файле вида сделать таким образом:

App\Views\MainView.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php     

namespace App\Views;  

use 
ABC\Core\Base;  
    
class 
MainView extends Base  
{  
    public function 
createHello()  
    {   
// Выбираем шаблон
        
$this->selectTpl('test');  
        
// Получаем контент из модели  
        
$content $this->getModel('MainModel')->getContent(); 
        
// Передаем контент в шаблон  
        
$this->tpl->assign($content);  
        
// Шаблонизатор наследует макет (по умолчанию index.tpl)  
        // и выводит в него шаблон  
        
$this->tpl->extendsTpl('content');  
        
// Выводим результат в поток  
        
$this->render(); 
    }  




Метод assign() может принимать аргументом массив, и тогда шаблонизатором его ключи будут переданы в названия переменных, а значения передадутся в них.

Если требуется обработать данные функцией htmlspecialchars(), можно воспользоваться методом  assignHtml().

Если потребуется еще один (или несколько) экземпляров шаблонизатора, получить их можно из сервиса: App\Views\MainView.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php     

namespace App\Views;  

use 
ABC\Core\Base;  
    
class 
MainView extends Base  
{  
    public function 
createHello()  
    {   
// Новый экземпляр шаблонизатора  
        
$tpl ABC::newService(ABC::TPL_NATIVE); 
        
// Выбираем шаблон 
        
$tpl->selectTpl('main');  
        
// Получаем контент из модели 
        
$content $this->getModel('MainModel')->getContent(); 
        
// Передаем контент в переменную $hello шаблона  
        
$tpl->tpl->assignHtml('hello'$content['hello']); 
        
// Шаблонизатор наследует макет (по умолчанию index.tpl)  
        // и выводит в него шаблон  
        
$tpl->extendsTpl('content');  
        
// Выводим результат в поток
        
$tpl->display();  
    }