1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309
|
#####################
Template Parser Class
#####################
The Template Parser Class can perform simple text substitution for
pseudo-variables contained within your view files.
It can parse simple variables or variable tag pairs.
If you've never used a template engine,
pseudo-variable names are enclosed in braces, like this::
<html>
<head>
<title>{blog_title}</title>
</head>
<body>
<h3>{blog_heading}</h3>
{blog_entries}
<h5>{title}</h5>
<p>{body}</p>
{/blog_entries}
</body>
</html>
These variables are not actual PHP variables, but rather plain text
representations that allow you to eliminate PHP from your templates
(view files).
.. note:: CodeIgniter does **not** require you to use this class since
using pure PHP in your view pages lets them run a little faster.
However, some developers prefer to use a template engine if
they work with designers who they feel would find some
confusion working with PHP.
.. important:: The Template Parser Class is **not** a full-blown
template parsing solution. We've kept it very lean on purpose in order
to maintain maximum performance.
.. contents::
:local:
.. raw:: html
<div class="custom-index container"></div>
*******************************
Using the Template Parser Class
*******************************
Initializing the Class
======================
Like most other classes in CodeIgniter, the Parser class is initialized
in your controller using the ``$this->load->library()`` method::
$this->load->library('parser');
Once loaded, the Parser library object will be available using:
$this->parser
Parsing templates
=================
You can use the ``parse()`` method to parse (or render) simple templates,
like this::
$data = array(
'blog_title' => 'My Blog Title',
'blog_heading' => 'My Blog Heading'
);
$this->parser->parse('blog_template', $data);
The first parameter contains the name of the :doc:`view
file <../general/views>` (in this example the file would be called
blog_template.php), and the second parameter contains an associative
array of data to be replaced in the template. In the above example, the
template would contain two variables: {blog_title} and {blog_heading}
There is no need to "echo" or do something with the data returned by
$this->parser->parse(). It is automatically passed to the output class
to be sent to the browser. However, if you do want the data returned
instead of sent to the output class you can pass TRUE (boolean) as the
third parameter::
$string = $this->parser->parse('blog_template', $data, TRUE);
Variable Pairs
==============
The above example code allows simple variables to be replaced. What if
you would like an entire block of variables to be repeated, with each
iteration containing new values? Consider the template example we showed
at the top of the page::
<html>
<head>
<title>{blog_title}</title>
</head>
<body>
<h3>{blog_heading}</h3>
{blog_entries}
<h5>{title}</h5>
<p>{body}</p>
{/blog_entries}
</body>
</html>
In the above code you'll notice a pair of variables: {blog_entries}
data... {/blog_entries}. In a case like this, the entire chunk of data
between these pairs would be repeated multiple times, corresponding to
the number of rows in the "blog_entries" element of the parameters array.
Parsing variable pairs is done using the identical code shown above to
parse single variables, except, you will add a multi-dimensional array
corresponding to your variable pair data. Consider this example::
$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);
If your "pair" data is coming from a database result, which is already a
multi-dimensional array, you can simply use the database ``result_array()``
method::
$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);
Usage Notes
===========
If you include substitution parameters that are not referenced in your
template, they are ignored::
$template = 'Hello, {firstname} {lastname}';
$data = array(
'title' => 'Mr',
'firstname' => 'John',
'lastname' => 'Doe'
);
$this->parser->parse_string($template, $data);
// Result: Hello, John Doe
If you do not include a substitution parameter that is referenced in your
template, the original pseudo-variable is shown in the result::
$template = 'Hello, {firstname} {initials} {lastname}';
$data = array(
'title' => 'Mr',
'firstname' => 'John',
'lastname' => 'Doe'
);
$this->parser->parse_string($template, $data);
// Result: Hello, John {initials} Doe
If you provide a string substitution parameter when an array is expected,
i.e. for a variable pair, the substitution is done for the opening variable
pair tag, but the closing variable pair tag is not rendered properly::
$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);
// Result: Hello, John Doe (Mr{degree} {/degrees})
If you name one of your individual substitution parameters the same as one
used inside a variable pair, the results may not be as expected::
$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);
// Result: Hello, John Doe (Mr Mr )
View Fragments
==============
You do not have to use variable pairs to get the effect of iteration in
your views. It is possible to use a view fragment for what would be inside
a variable pair, and to control the iteration in your controller instead
of in the view.
An example with the iteration controlled in the view::
$template = '<ul>{menuitems}
<li><a href="{link}">{title}</a></li>
{/menuitems}</ul>';
$data = array(
'menuitems' => array(
array('title' => 'First Link', 'link' => '/first'),
array('title' => 'Second Link', 'link' => '/second'),
)
);
$this->parser->parse_string($template, $data);
Result::
<ul>
<li><a href="/first">First Link</a></li>
<li><a href="/second">Second Link</a></li>
</ul>
An example with the iteration controlled in the controller,
using a view fragment::
$temp = '';
$template1 = '<li><a href="{link}">{title}</a></li>';
$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 = '<ul>{menuitems}</ul>';
$data = array(
'menuitems' => $temp
);
$this->parser->parse_string($template, $data);
Result::
<ul>
<li><a href="/first">First Link</a></li>
<li><a href="/second">Second Link</a></li>
</ul>
***************
Class Reference
***************
.. php:class:: CI_Parser
.. php:method:: parse($template, $data[, $return = FALSE])
:param string $template: Path to view file
:param array $data: Variable data
:param bool $return: Whether to only return the parsed template
:returns: Parsed template string
:rtype: string
Parses a template from the provided path and variables.
.. php:method:: parse_string($template, $data[, $return = FALSE])
:param string $template: Content to parse
:param array $data: Variable data
:param bool $return: Whether to only return the parsed template
:returns: Parsed template string
:rtype: string
This method works exactly like ``parse()``, only it accepts
the template as a string instead of loading a view file.
.. php:method:: set_delimiters([$l = '{'[, $r = '}']])
:param string $l: Left delimiter
:param string $r: Right delimiter
:rtype: void
Sets the delimiters (opening and closing) for a
pseudo-variable "tag" in a template.
|