Класс шаблонизатора (парсера шаблона)
Класс шаблонизатора может выполнять простую текстовую подстановку для псевдо-переменных, содержащихся в файлах вида. Он может анализировать простые переменные или переменные пары тегов.
Если вы никогда ранее не использовал шаблонизатор - псевдо-переменные заключаются в фигурные скобки, например:
<html>
<head>
<title>{blog_title}title>
head>
<body>
<h3>{blog_heading}h3>
{blog_entries}
<h5>{title}h5>
<p>{body}p>
{/blog_entries}
body>
html>
Эти переменные не являются фактическими PHP переменными, они используются в виде обычного текста, позволяющего убрать PHP из ваших шаблонов (файлов вида).
Примечание
CodeIgniter НЕ требует использовать этот класс вместо чистого PHP в файлах вида, позволяя им выполняться чуть быстрее. Впрочем, некоторые разработчики предпочитают использовать шаблонизатор, если они работают с дизайнерами, которые испытывают некоторую путаницу в работе с PHP.
Важно
Класс шаблонизатора НЕ полномасштабное решение парсинга шаблона. Мы сохранили его легким нарочно в целях поддержания максимальной производительности.
Использование класса шаблонизатора
Инициализация класса
Как и большинство остальных классов CodeIgniter, класс шаблонизатора инициализируется в вашем контроллере с помощью $this->load->library() метода:
$this->load->library('parser');
После загрузки, объект библиотеки будет доступен через: $this->parser
Парсинг шаблонов
Вы можете использовать parse() метод чтобы разобрать простые шаблоны, например:
$data = array(
'blog_title' => 'My Blog Title',
'blog_heading' => 'My Blog Heading'
);
$this->parser->parse('blog_template', $data);
Первый параметр содержит имя файла вида (в данном примере файл будет называться blog_template.php) и второй параметр содержит ассоциативный массив данных для замены в шаблоне. В приведенном выше примере шаблон будет содержать две переменные: {blog_title} и {blog_heading}
Нет необходимости вызова “echo” или других методов вывода данных, возвращенными $this->parser->parse(). Они автоматически передаются в выходной класс для отправки в браузер. Однако, если вы хотите вернуть данные вместо того чтобы они были отправлены в выходной класс - можете передать TRUE (булев) в качестве третьего параметра:
$string = $this->parser->parse('blog_template', $data, TRUE);
Парная переменная
Приведенный выше код позволяет замененить простые переменные. Что если вы хотите повторять переменные блока содержащие новые значения с каждой итерацией? Рассмотрим пример шаблона, который мы показали в начале страницы:
<html>
<head>
<title>{blog_title}title>
head>
<body>
<h3>{blog_heading}h3>
{blog_entries}
<h5>{title}h5>
<p>{body}p>
{/blog_entries}
body>
html>
В приведенном выше коде можно наблюдать парную переменную: {blog_entries} код... {/blog_entries}. В этом случае, весь код данных между этой переменной будет повторяться количество раз, соответствующее числу строк элементов массива “blog_entries”.
Парсинг парных переменных выполняется для разбора одиночных переменных, за исключением случаев, когда будет добавлен некий многомерный массив, соответствующий вашей парной переменной. Рассмотрим такой пример:
$this->load->library('parser');
$data = array(
'blog_title' => 'My Blog Title',
'blog_heading' => 'My Blog Heading',
'blog_entries' => array(
array('title' => 'Title 1', 'body' => 'Body 1'),
array('title' => 'Title 2', 'body' => 'Body 2'),
array('title' => 'Title 3', 'body' => 'Body 3'),
array('title' => 'Title 4', 'body' => 'Body 4'),
array('title' => 'Title 5', 'body' => 'Body 5')
)
);
$this->parser->parse('blog_template', $data);
Если данные “пары” поступают из базы данных и уже многомерный массив, вы можете просто использовать метод базы данных result_array():
$query = $this->db->query("SELECT * FROM blog");
$this->load->library('parser');
$data = array(
'blog_title' => 'My Blog Title',
'blog_heading' => 'My Blog Heading',
'blog_entries' => $query->result_array()
);
$this->parser->parse('blog_template', $data);
Замечания по использованию
Если добавлены параметры подстановки на которые нет ссылок в шаблоне, они игнорируются:
$template = 'Hello, {firstname} {lastname}';
$data = array(
'title' => 'Mr',
'firstname' => 'John',
'lastname' => 'Doe'
);
$this->parser->parse_string($template, $data);
// Результат: Hello, John Doe
Если не указан параметр подстановки указанный в шаблоне, оригинальная псевдо-переменная будет отображаться в результате:
$template = 'Hello, {firstname} {initials} {lastname}';
$data = array(
'title' => 'Mr',
'firstname' => 'John',
'lastname' => 'Doe'
);
$this->parser->parse_string($template, $data);
// Результат: Hello, John {initials} Doe
Если вы предоставляете строковый параметр замещения, когда ожидается массив, например для парной переменной, замена делается для тэга открытия парной переменной, тогда закрывающий тэг парной переменной не отображается должным образом:
$template = 'Hello, {firstname} {lastname} ({degrees}{degree} {/degrees})';
$data = array(
'degrees' => 'Mr',
'firstname' => 'John',
'lastname' => 'Doe',
'titles' => array(
array('degree' => 'BSc'),
array('degree' => 'PhD')
)
);
$this->parser->parse_string($template, $data);
// Результат: Hello, John Doe (Mr{degree} {/degrees})
Если назвать однин из параметров подстановки схожим с тем, что использовался внутри парной переменной, результаты могут быть неожиданными:
$template = 'Hello, {firstname} {lastname} ({degrees}{degree} {/degrees})';
$data = array(
'degree' => 'Mr',
'firstname' => 'John',
'lastname' => 'Doe',
'degrees' => array(
array('degree' => 'BSc'),
array('degree' => 'PhD')
)
);
$this->parser->parse_string($template, $data);
// Результат: Hello, John Doe (Mr Mr )
Просмотр Фрагментов
Вам не обязательно использовать парную переменную, чтобы получить эффект итерации в файле вида (представлении). Можно использовать фрагмент представления для того, что бы узнать что внутри парной переменной и контролировать итерации в контроллере а не в представлении.
Пример итерации контролируемой в файле вида:
$template = '{menuitems}
{title}
{/menuitems}';
$data = array(
'menuitems' => array(
array('title' => 'First Link', 'link' => '/first'),
array('title' => 'Second Link', 'link' => '/second'),
)
);
$this->parser->parse_string($template, $data);
Результат:
<ul>
<li><a href="/first">First Linka>li>
<li><a href="/second">Second Linka>li>
ul>
Пример итерации контролируется в контроллере, используя фрагмент представления:
$temp = '';
$template1 = '{title} ';
$data1 = array(
array('title' => 'First Link', 'link' => '/first'),
array('title' => 'Second Link', 'link' => '/second'),
);
foreach ($data1 as $menuitem)
{
$temp .= $this->parser->parse_string($template1, $menuitem, TRUE);
}
$template = '{menuitems}
';
$data = array(
'menuitems' => $temp
);
$this->parser->parse_string($template, $data);
Результат:
<ul>
<li><a href="/first">First Linka>li>
<li><a href="/second">Second Linka>li>
ul>
Справка класса
- class CI_Parser
- parse($template, $data[, $return = FALSE])
Параметры: - $template (строка) – Путь к файлу вида
- $data (массив) – Переменная с данными
- $return (булево) – Следует ли возвращать результат только в разобранный шаблон
Возвращает: Обработанная строка шаблона
Возвращаемый тип: строка
Разбирает шаблон из предоставленного пути и переменной.
- parse_string($template, $data[, $return = FALSE])
Параметры: - $template (строка) – Путь к файлу вида
- $data (массив) – Переменная с данными
- $return (булево) – Следует ли возвращать результат только в разобранный шаблон
Возвращает: Обработанная строка шаблона
Возвращаемый тип: строка
Этот метод работает так же, как parse(), только он принимает шаблон в виде строки вместо файла вида.