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

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

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

    <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 (строка) – Правый разделитель
    Возвращаемый тип:

    смешанный

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