Template

Расширяемый шаблонизатор F3 дает вам всю гибкость, необходимую для современных шаблонов. Плагин Template расширяет класс Preview и специально разработан для шаблонов в стиле XML. Рекомендуем прочитать руководство о шаблонах пред этой статьей.

Если вы ищете сводный обзор доступных шаблонных директив и их синтаксиса, см. Краткий справочник.

Пространство имен: \

Расположение файла:lib/template.php

Инициализация

Вернуть уникальный экземпляр класса

$template = \Template::instance();

Класс Template использует фабричную оболочку Prefab , поэтому вы можете получить один и тот же экземпляр класса Template в любой точке вашего кода.

extend

Расширьте механизм шаблонов F3 с помощью настраиваемого тега

void extend ( string $tag, callback $func )

Функция extend позволяет вам создать свой собственный пользовательский тег шаблона. Это можно рассматривать как hook для механизма шаблонов F3.

$tag это имя пользовательского тега (без <>) . Не давайте уже существующие ,в директиве шаблонов F3, имена своим тегам , так как ваш обработчик тега не будет вызываться. На сегодняшний день вы не можете использовать extend для переопределения существующей директивы шаблона F3.

$func это имя вашей настраиваемой функции, которую F3 будет выполнять в обратном вызове, когда найдет вашу настраиваемую функцию $tag во время рендеринга шаблона.

Итак, чтобы определить новый настраиваемый тег и зарегистрировать/перехватить его настраиваемый обработчик, пишем:

\Template::instance()->extend('my_new_special_tag','MyImageViewHelper::my_tag_renderer');

Но давайте посмотрим на функциональный пример, чтобы увидеть, как это работает на начальном уровне:

Идея заключается в том , чтобы создать новый HTML тег <image>, который будет иметь возможность изменять размер изображения на лету в соответствии с width и height атрибутами.

class ImageViewHelper {
 
	static public function render($args) {
		// retrieve the attributes of the template tag, as found in the template
		// in our case, we expect 'src', 'width' and 'height', and optionally 'crop'
		$attr = $args['@attrib']; // provided by the F3 template engine
 
		$imagepath = $attr['src'];
		$imgObj = new \Image($imagepath);
		$imgObj->resize(
			$attr['width'],
			$attr['height'],
			((isset($attr['crop']) && $attr['crop']=='true') ? true : false)
		);
		$f3 = \Base::instance();
		// to avoid clash, build a unique name for the new generated image
		$file_name = $f3->hash($imagepath.$attr['width'].$attr['height']).'.png';
		// save it for example in TEMP
		$imagepath = $f3->get('TEMP').$file_name;
		// convert it to PNG and save it to a file
		$f3->write($imagepath, $imgObj->dump('png'));
		// done! return the HTML markup
		return
			sprintf ('<img src="/%s" width="%u" height="%u" />',
						$imagepath,$attr['width'],$attr['height']);
	}
}
 
// register the tag renderer either in index.php or in your view controller
\Template::instance()->extend('image','ImageViewHelper::render');

Базовый фрагмент выше принимает все теги html, которые выглядят следующим образом:

<image src="images/south-park.jpg" width="60" height="60" crop="true" />

и масштабирует изображение, указанное в src атрибуте, до указанных width=«60» height=«60» размеров, затем копирует новое масштабированное изображение в папку TEMP и, наконец, генерирует выходной HTML-код, аналогичный <img src=«/tmp/0dgsnl2kmnb.png» width=«60» height=«60» />вашему шаблону.

Зная, что все шаблоны F3 предварительно обработаны и кэшированы, мы получаем что, наш Image Tag Renderer будет обрабатывать файл только один раз, а не при каждом запросе.

parse

Парсит директивы и токены шаблона

string|array parse ( string $text )

Например:

<div>
	<h1>My favorite books</h1>
	<ul>
	<F3 group="{{ @books }}" value="{{ @book }}">
		<li>{{ @book.title }}</li>
	</F3>
	</ul>
</div>

возвращает:

array (size=3)
	0 => string '<div>
		<h1>My favorite books</h1>
		<ul>
		' (length=53)
	1 =>
		array (size=1)
			'repeat' => array (size=2)
				'@attrib' => array (size=2)
					'group' => string '{{ @books }}' (length=12)
					'value' => string '{{ @book }}' (length=11)
		0 => string '<li>{{ @book.title }}</li>' (length=38)
		2 => string '</ul>
  </div>' (length=19)
 
Печать/экспорт