- атрибутивный шаблонизатор для PHP
 
Пред.
Руководство по Ptal
След.

Основные положения

Основная задача данного шаблонизатора - упростить код нативных шаблонов.

 

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

 

Таким образом, компиляция происходит только один раз при разработке шаблона. На рабочем сайте повторной компиляции не происходит, не тратятся ресурсы сервера.

 

Программисту доступны только два метода: $ptal->assign(); и $ptal->fetch();

 

В данном руководстве будет достаточно много уделяться внимания тому, во что компилируется шаблон. Чтобы сторонники нативных шаблонов могли изучать и понимать, что шаблонизатор очень прост как в идеологии, так и в реализации.

Генерируемый PHP код

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

 

Пример создания рекурсивного меню (совместимого с jsTree)

 

test.php

<?php
require ('lib/ptal/ptal.php');

class Item
{
    var $id;
    var $pid;
    var $title;
    var $link;

    function __construct($params)
    {
        $this->id    = $params['id'];
        $this->pid   = $params['pid'];
        $this->title = $params['title'];
        $this->link  = $params['link'];
    }
}

$list = array();
$list[] = new Item(array('id'=>1,'pid'=>0,'title'=>'Page1'));
$list[] = new Item(array('id'=>2,'pid'=>1,'title'=>'Sub Page1'));
$list[] = new Item(array('id'=>3,'pid'=>1,'title'=>'Sub Page2'));

$tree = array();
foreach ((array)$list as $item)
{
    $tree[$item->pid][$item->id] = $item;
}

$ptal = new Ptal;

$ptal->assign('tree',$tree);
$ptal->assign('curpage',$list[1]);

echo $ptal->fetch('treemenu.tal');

templates/treemenu.tal

<tal:block tal:if="!@pid"   tal:assign="pid 0" />

<ul tal:if="isset(@tree[@pid])">

  <li tal:foreach="@tree[@pid] as $node" id="phtml_{$node->id}">

    <a class="item tal:if($node->id == @curpage->id) current" href="{$node->link}">{$node->title}</a>

    <tal:block tal:if="@tree[$node->id]" tal:include="file treemenu.tal;pid {$node->id};" />    

  </li>

</ul>

 

После запуска test.php получим откомпилированный файл и результат его выполнения на экране.

 

templates_c/compiled_treemenu.php

<?php if(!$this->_tplVars['pid']):?><?php $this->_tplVars['pid']=0;?><?php endif;?>

<?php if(isset($this->_tplVars['tree'][$this->_tplVars['pid']])):?><ul>

  <?php $ptal['index']=0; foreach((array)$this->_tplVars['tree'][$this->_tplVars['pid']] as $node):?><li id="phtml_<?php echo $node->id;?>">

    <a class="item <?php if($node->id == $this->_tplVars['curpage']->id):?> current<?php endif;?>" href="<?php echo $node->link;?>"><?php echo $node->title?></a>

    <?php if($this->_tplVars['tree'][$node->id]):?><?php $this->_tplVars['pid']=$node->id;include("templates_c/compiled___treemenu.php");?> <?php endif;?>    

  </li><?php $ptal['index']++; endforeach;?>

</ul><?php endif;?>

Полученный HTML код

<ul>
  <li id="phtml_1">
    <a class="item " href="">Page1</a>  
<ul>
  <li id="phtml_2">
    <a class="item  current" href="">Sub Page1</a>       
  </li><li id="phtml_3">
    <a class="item " href="">Sub Page2</a>       
  </li>
</ul>     
  </li>
</ul>

 

В откомпилированном шаблоне ровно столько логических элементов, сколько заложено программистом в исходном шаблоне: 1. проверка данных на правильность 2. цикл 3. условие входа в рекурсию.

 

На основе всего вышесказанного можно сделать вывод, что данный шаблонизатор работает не намного медленнее нативных шаблонов. Зато он отлично упрощает код.


Пред.
Руководство по Ptal
Начало
След.
Сравнение с другими шаблонизаторами