|
1 Smarty 3.1 Notes |
|
2 ================ |
|
3 |
|
4 Smarty 3.1 is a departure from 2.0 compatibility. Most notably, all |
|
5 backward compatibility has been moved to a separate class file named |
|
6 SmartyBC.class.php. If you require compatibility with 2.0, you will |
|
7 need to use this class. |
|
8 |
|
9 Some differences from 3.0 are also present. 3.1 begins the journey of |
|
10 requiring setters/getters for property access. So far this is only |
|
11 implemented on the five directory properties: template_dir, |
|
12 plugins_dir, configs_dir, compile_dir and cache_dir. These properties |
|
13 are now protected, it is required to use the setters/getters instead. |
|
14 That said, direct property access will still work, however slightly |
|
15 slower since they will now fall through __set() and __get() and in |
|
16 turn passed through the setter/getter methods. 3.2 will exhibit a full |
|
17 list of setter/getter methods for all (currently) public properties, |
|
18 so code-completion in your IDE will work as expected. |
|
19 |
|
20 There is absolutely no PHP allowed in templates any more. All |
|
21 deprecated features of Smarty 2.0 are gone. Again, use the SmartyBC |
|
22 class if you need any backward compatibility. |
|
23 |
|
24 Internal Changes |
|
25 |
|
26 Full UTF-8 Compatibility |
|
27 |
|
28 The plugins shipped with Smarty 3.1 have been rewritten to fully |
|
29 support UTF-8 strings if Multibyte String is available. Without |
|
30 MBString UTF-8 cannot be handled properly. For those rare cases where |
|
31 templates themselves have to juggle encodings, the new modifiers |
|
32 to_charset and from_charset may come in handy. |
|
33 |
|
34 Plugin API and Performance |
|
35 |
|
36 All Plugins (modifiers, functions, blocks, resources, |
|
37 default_template_handlers, etc) are now receiving the |
|
38 Smarty_Internal_Template instance, where they were supplied with the |
|
39 Smarty instance in Smarty 3.0. *. As The Smarty_Internal_Template |
|
40 mimics the behavior of Smarty, this API simplification should not |
|
41 require any changes to custom plugins. |
|
42 |
|
43 The plugins shipped with Smarty 3.1 have been rewritten for better |
|
44 performance. Most notably {html_select_date} and {html_select_time} |
|
45 have been improved vastly. Performance aside, plugins have also been |
|
46 reviewed and generalized in their API. {html_select_date} and |
|
47 {html_select_time} now share almost all available options. |
|
48 |
|
49 The escape modifier now knows the $double_encode option, which will |
|
50 prevent entities from being encoded again. |
|
51 |
|
52 The capitalize modifier now know the $lc_rest option, which makes sure |
|
53 all letters following a captial letter are lower-cased. |
|
54 |
|
55 The count_sentences modifier now accepts (.?!) as |
|
56 legitimate endings of a sentence - previously only (.) was |
|
57 accepted |
|
58 |
|
59 The new unescape modifier is there to reverse the effects of the |
|
60 escape modifier. This applies to the escape formats html, htmlall and |
|
61 entity. |
|
62 |
|
63 default_template_handler_func |
|
64 |
|
65 The invocation of $smarty->$default_template_handler_func had to be |
|
66 altered. Instead of a Smarty_Internal_Template, the fifth argument is |
|
67 now provided with the Smarty instance. New footprint: |
|
68 |
|
69 |
|
70 /** |
|
71 * Default Template Handler |
|
72 * |
|
73 * called when Smarty's file: resource is unable to load a requested file |
|
74 * |
|
75 * @param string $type resource type (e.g. "file", "string", "eval", "resource") |
|
76 * @param string $name resource name (e.g. "foo/bar.tpl") |
|
77 * @param string &$content template's content |
|
78 * @param integer &$modified template's modification time |
|
79 * @param Smarty $smarty Smarty instance |
|
80 * @return string|boolean path to file or boolean true if $content and $modified |
|
81 * have been filled, boolean false if no default template |
|
82 * could be loaded |
|
83 */ |
|
84 function default_template_handler_func($type, $name, &$content, &$modified, Smarty $smarty) { |
|
85 if (false) { |
|
86 // return corrected filepath |
|
87 return "/tmp/some/foobar.tpl"; |
|
88 } elseif (false) { |
|
89 // return a template directly |
|
90 $content = "the template source"; |
|
91 $modified = time(); |
|
92 return true; |
|
93 } else { |
|
94 // tell smarty that we failed |
|
95 return false; |
|
96 } |
|
97 } |
|
98 |
|
99 Stuff done to the compiler |
|
100 |
|
101 Many performance improvements have happened internally. One notable |
|
102 improvement is that all compiled templates are now handled as PHP |
|
103 functions. This speeds up repeated templates tremendously, as each one |
|
104 calls an (in-memory) PHP function instead of performing another file |
|
105 include/scan. |
|
106 |
|
107 New Features |
|
108 |
|
109 Template syntax |
|
110 |
|
111 {block}..{/block} |
|
112 |
|
113 The {block} tag has a new hide option flag. It does suppress the block |
|
114 content if no corresponding child block exists. |
|
115 EXAMPLE: |
|
116 parent.tpl |
|
117 {block name=body hide} child content "{$smarty.block.child}" was |
|
118 inserted {block} |
|
119 In the above example the whole block will be suppressed if no child |
|
120 block "body" is existing. |
|
121 |
|
122 {setfilter}..{/setfilter} |
|
123 |
|
124 The new {setfilter} block tag allows the definition of filters which |
|
125 run on variable output. |
|
126 SYNTAX: |
|
127 {setfilter filter1|filter2|filter3....} |
|
128 Smarty3 will lookup up matching filters in the following search order: |
|
129 1. varibale filter plugin in plugins_dir. |
|
130 2. a valid modifier. A modifier specification will also accept |
|
131 additional parameter like filter2:'foo' |
|
132 3. a PHP function |
|
133 {/setfilter} will turn previous filter setting off again. |
|
134 {setfilter} tags can be nested. |
|
135 EXAMPLE: |
|
136 {setfilter filter1} |
|
137 {$foo} |
|
138 {setfilter filter2} |
|
139 {$bar} |
|
140 {/setfilter} |
|
141 {$buh} |
|
142 {/setfilter} |
|
143 {$blar} |
|
144 In the above example filter1 will run on the output of $foo, filter2 |
|
145 on $bar, filter1 again on $buh and no filter on $blar. |
|
146 NOTES: |
|
147 - {$foo nofilter} will suppress the filters |
|
148 - These filters will run in addition to filters defined by |
|
149 registerFilter('variable',...), autoLoadFilter('variable',...) and |
|
150 defined default modifier. |
|
151 - {setfilter} will effect only the current template, not included |
|
152 subtemplates. |
|
153 |
|
154 Resource API |
|
155 |
|
156 Smarty 3.1 features a new approach to resource management. The |
|
157 Smarty_Resource API allows simple, yet powerful integration of custom |
|
158 resources for templates and configuration files. It offers simple |
|
159 functions for loading data from a custom resource (e.g. database) as |
|
160 well as define new template types adhering to the special |
|
161 non-compiling (e,g, plain php) and non-compile-caching (e.g. eval: |
|
162 resource type) resources. |
|
163 |
|
164 See demo/plugins/resource.mysql.php for an example custom database |
|
165 resource. |
|
166 |
|
167 Note that old-fashioned registration of callbacks for resource |
|
168 management has been deprecated but is still possible with SmartyBC. |
|
169 |
|
170 CacheResource API |
|
171 |
|
172 In line with the Resource API, the CacheResource API offers a more |
|
173 comfortable handling of output-cache data. With the |
|
174 Smarty_CacheResource_Custom accessing databases is made simple. With |
|
175 the introduction of Smarty_CacheResource_KeyValueStore the |
|
176 implementation of resources like memcache or APC became a no-brainer; |
|
177 simple hash-based storage systems are now supporting hierarchical |
|
178 output-caches. |
|
179 |
|
180 See demo/plugins/cacheresource.mysql.php for an example custom |
|
181 database CacheResource. |
|
182 See demo/plugins/cacheresource.memcache.php for an example custom |
|
183 memcache CacheResource using the KeyValueStore helper. |
|
184 |
|
185 Note that old-fashioned registration of $cache_handler is not possible |
|
186 anymore. As the functionality had not been ported to Smarty 3.0.x |
|
187 properly, it has been dropped from 3.1 completely. |
|
188 |
|
189 Locking facilities have been implemented to avoid concurrent cache |
|
190 generation. Enable cache locking by setting |
|
191 $smarty->cache_locking = true; |
|
192 |
|
193 Relative Paths in Templates (File-Resource) |
|
194 |
|
195 As of Smarty 3.1 {include file="../foo.tpl"} and {include |
|
196 file="./foo.tpl"} will resolve relative to the template they're in. |
|
197 Relative paths are available with {include file="..."} and |
|
198 {extends file="..."}. As $smarty->fetch('../foo.tpl') and |
|
199 $smarty->fetch('./foo.tpl') cannot be relative to a template, an |
|
200 exception is thrown. |
|
201 |
|
202 Addressing a specific $template_dir |
|
203 |
|
204 Smarty 3.1 introduces the $template_dir index notation. |
|
205 $smarty->fetch('[foo]bar.tpl') and {include file="[foo]bar.tpl"} |
|
206 require the template bar.tpl to be loaded from $template_dir['foo']; |
|
207 Smarty::setTemplateDir() and Smarty::addTemplateDir() offer ways to |
|
208 define indexes along with the actual directories. |
|
209 |
|
210 Mixing Resources in extends-Resource |
|
211 |
|
212 Taking the php extends: template resource one step further, it is now |
|
213 possible to mix resources within an extends: call like |
|
214 $smarty->fetch("extends:file:foo.tpl|db:bar.tpl"); |
|
215 |
|
216 To make eval: and string: resources available to the inheritance |
|
217 chain, eval:base64:TPL_STRING and eval:urlencode:TPL_STRING have been |
|
218 introduced. Supplying the base64 or urlencode flags will trigger |
|
219 decoding the TPL_STRING in with either base64_decode() or urldecode(). |
|
220 |
|
221 extends-Resource in template inheritance |
|
222 |
|
223 Template based inheritance may now inherit from php's extends: |
|
224 resource like {extends file="extends:foo.tpl|db:bar.tpl"}. |
|
225 |
|
226 New Smarty property escape_html |
|
227 |
|
228 $smarty->escape_html = true will autoescape all template variable |
|
229 output by calling htmlspecialchars({$output}, ENT_QUOTES, |
|
230 SMARTY_RESOURCE_CHAR_SET). |
|
231 NOTE: |
|
232 This is a compile time option. If you change the setting you must make |
|
233 sure that the templates get recompiled. |
|
234 |
|
235 New option at Smarty property compile_check |
|
236 |
|
237 The automatic recompilation of modified templates can now be |
|
238 controlled by the following settings: |
|
239 $smarty->compile_check = COMPILECHECK_OFF (false) - template files |
|
240 will not be checked |
|
241 $smarty->compile_check = COMPILECHECK_ON (true) - template files will |
|
242 always be checked |
|
243 $smarty->compile_check = COMPILECHECK_CACHEMISS - template files will |
|
244 be checked if caching is enabled and there is no existing cache file |
|
245 or it has expired |
|
246 |
|
247 Automatic recompilation on Smarty version change |
|
248 |
|
249 Templates will now be automatically recompiled on Smarty version |
|
250 changes to avoide incompatibillities in the compiled code. Compiled |
|
251 template checked against the current setting of the SMARTY_VERSION |
|
252 constant. |
|
253 |
|
254 default_config_handler_func() |
|
255 |
|
256 Analogous to the default_template_handler_func() |
|
257 default_config_handler_func() has been introduced. |
|
258 |
|
259 default_plugin_handler_func() |
|
260 |
|
261 An optional default_plugin_handler_func() can be defined which gets called |
|
262 by the compiler on tags which can't be resolved internally or by plugins. |
|
263 The default_plugin_handler() can map tags to plugins on the fly. |
|
264 |
|
265 New getters/setters |
|
266 |
|
267 The following setters/getters will be part of the official |
|
268 documentation, and will be strongly recommended. Direct property |
|
269 access will still work for the foreseeable future... it will be |
|
270 transparently routed through the setters/getters, and consequently a |
|
271 bit slower. |
|
272 |
|
273 array|string getTemplateDir( [string $index] ) |
|
274 replaces $smarty->template_dir; and $smarty->template_dir[$index]; |
|
275 Smarty setTemplateDir( array|string $path ) |
|
276 replaces $smarty->template_dir = "foo"; and $smarty->template_dir = |
|
277 array("foo", "bar"); |
|
278 Smarty addTemplateDir( array|string $path, [string $index]) |
|
279 replaces $smarty->template_dir[] = "bar"; and |
|
280 $smarty->template_dir[$index] = "bar"; |
|
281 |
|
282 array|string getConfigDir( [string $index] ) |
|
283 replaces $smarty->config_dir; and $smarty->config_dir[$index]; |
|
284 Smarty setConfigDir( array|string $path ) |
|
285 replaces $smarty->config_dir = "foo"; and $smarty->config_dir = |
|
286 array("foo", "bar"); |
|
287 Smarty addConfigDir( array|string $path, [string $index]) |
|
288 replaces $smarty->config_dir[] = "bar"; and |
|
289 $smarty->config_dir[$index] = "bar"; |
|
290 |
|
291 array getPluginsDir() |
|
292 replaces $smarty->plugins_dir; |
|
293 Smarty setPluginsDir( array|string $path ) |
|
294 replaces $smarty->plugins_dir = "foo"; |
|
295 Smarty addPluginsDir( array|string $path ) |
|
296 replaces $smarty->plugins_dir[] = "bar"; |
|
297 |
|
298 string getCompileDir() |
|
299 replaces $smarty->compile_dir; |
|
300 Smarty setCompileDir( string $path ) |
|
301 replaces $smarty->compile_dir = "foo"; |
|
302 |
|
303 string getCacheDir() |
|
304 replaces $smarty->cache_dir; |
|
305 Smarty setCacheDir( string $path ) |
|
306 replaces $smarty->cache_dir; |