Класс шаблонизатора (парсера шаблона) 

Класс шаблонизатора может выполнять простую текстовую подстановку для псевдо-переменных, содержащихся в файлах вида. Он может анализировать простые переменные или переменные пары тегов.

Если вы никогда ранее не использовал шаблонизатор - псевдо-переменные заключаются в фигурные скобки, например:

<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 = '';

$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(), только он принимает шаблон в виде строки вместо файла вида.

    set_delimiters([$l = '{'[, $r = '}']]) 
    Параметры:
    • $l (строка) – Левый разделитель
    • $r (строка) – Правый разделитель
    Возвращаемый тип:

    смешанный

    Устанавливает разделители (открытие и закрытие) для псевдо-переменного “тэга” в шаблоне.