Класс Template Parser
Класс Template Parser позволяет разбирать псевдо-переменные расположенные в ваших файлах Отображения. Он позволяет разбирать как простые переменные, так и переменные парных тегов. Если вы никогда не использовали шаблонизаторы, то псевдо-переменные выглядят так:
<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 может вызвать затруднения.
Еще примечание: Класс Template Parser не полнофункциональный шаблонизатор. Мы специально оставили его очень простым, чтобы сохранить максимум производительности.
Инициализация класса
Как и большинство других классов в CodeIgniter, класс Parser инициализируется в вашем контроллере при помощи функции $this->load->library:
$this->load->library('parser');
Однажды загруженный, объект библиотеки Parser будет доступен с помощью: $this->parser
В этой библиотеке доступны следующие функции:
$this->parser->parse()
Этот метод принимает имя шаблона и массив входных данных, и генерирует разобранную версию шаблона. Пример:
$this->load->library('parser');
$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(). Данные автоматически передаются в Output класс для отправки в броузер. Однако если вы хотите, чтобы функция все-таки возвращала данные, вместо отправки их в Output класс, вам необходимо передать TRUE (boolean) в качестве третьего параметра:
$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}. В случае подобного этому, фрагмент данных между этими парными переменными будет повторяться несколько раз, в соотвествии с количеством строк в результате.
Разбор парных переменных происходит с использованием идентичного кода, приведенного выше и показывающего разбор одиночных переменных, за исключением того, что в данном случае еще добавляется многомерных массив соответвующий данным парных переменных. Рассмотрим это пример:
$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);