153 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			153 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| Features
 | |
| =======
 | |
| 
 | |
| Some of Smarty's features:
 | |
| -   It is extremely fast.
 | |
| -   It is efficient since the PHP parser does the dirty work.
 | |
| -   No template parsing overhead, only compiles once.
 | |
| -   It is smart about [recompiling](#variable.compile.check) only the
 | |
|     template files that have changed.
 | |
| -   You can easily create your own custom
 | |
|     [functions](#language.custom.functions) and [variable
 | |
|     modifiers](#language.modifiers), so the template language is
 | |
|     extremely extensible.
 | |
| -   Configurable template [{delimiter}](#variable.left.delimiter) tag
 | |
|     syntax, so you can use `{$foo}`, `{{$foo}}`, `<!--{$foo}-->`, etc.
 | |
| -   The [`{if}..{elseif}..{else}..{/if}`](#language.function.if)
 | |
|     constructs are passed to the PHP parser, so the `{if...}` expression
 | |
|     syntax can be as simple or as complex an evaluation as you like.
 | |
| -   Allows unlimited nesting of
 | |
|     [`sections`](#language.function.section), `if's` etc.
 | |
| -   Built-in [caching](#caching) support
 | |
| -   Arbitrary [template](#resources) sources
 | |
| -   [Template Inheritance](#advanced.features.template.inheritance) for
 | |
|     easy management of template content.
 | |
| -   [Plugin](#plugins) architecture
 | |
| 
 | |
| ## Separation of presentation from application code
 | |
| -   This means templates can certainly contain logic under the condition
 | |
|     that it is for presentation only. Things such as
 | |
|     [including](./designers/language-builtin-functions/language-function-include.md) other templates,
 | |
|     [alternating](./designers/language-custom-functions/language-function-cycle.md) table row colors,
 | |
|     [upper-casing](./designers/language-modifiers/language-modifier-upper.md) a variable,
 | |
|     [looping](./designers/language-builtin-functions/language-function-foreach.md) over an array of data and
 | |
|     rendering it are examples of presentation logic.
 | |
| -   This does not mean however that Smarty forces a separation of
 | |
|     business and presentation logic. Smarty has no knowledge of which is
 | |
|     which, so placing business logic in the template is your own doing.
 | |
| -   Also, if you desire *no* logic in your templates you certainly can
 | |
|     do so by boiling the content down to text and variables only.
 | |
| 
 | |
| ## How does it work?
 | |
| 
 | |
| Under the hood, Smarty "compiles" (basically copies and converts) the
 | |
| templates into PHP scripts. This happens once when each template is
 | |
| first invoked, and then the compiled versions are used from that point
 | |
| forward. Smarty takes care of this for you, so the template designer
 | |
| just edits the Smarty templates and never has to manage the compiled
 | |
| versions. This approach keeps the templates easy to maintain, and yet
 | |
| keeps execution times extremely fast since the compiled code is just
 | |
| PHP. And of course, all PHP scripts take advantage of PHP op-code caches
 | |
| such as APC.
 | |
| 
 | |
| ## Template Inheritance
 | |
| 
 | |
| Template inheritance was introduced in Smarty 3. Before template
 | |
| inheritance, we managed our templates in
 | |
| pieces such as header and footer templates. This organization lends
 | |
| itself to many problems that require some hoop-jumping, such as managing
 | |
| content within the header/footer on a per-page basis. With template
 | |
| inheritance, instead of including other templates we maintain our
 | |
| templates as single pages. We can then manipulate blocks of content
 | |
| within by inheriting them. This makes templates intuitive, efficient and
 | |
| easy to manage. See
 | |
| [Template Inheritance](./programmers/advanced-features/advanced-features-template-inheritance.md)
 | |
| for more info.
 | |
| 
 | |
| ## Why not use XML/XSLT syntax?
 | |
| There are a couple of good reasons. First, Smarty can be used for more
 | |
| than just XML/HTML based templates, such as generating emails,
 | |
| javascript, CSV, and PDF documents. Second, XML/XSLT syntax is even more
 | |
| verbose and fragile than PHP code! It is perfect for computers, but
 | |
| horrible for humans. Smarty is about being easy to read, understand and
 | |
| maintain.
 | |
| 
 | |
| ## Template Security
 | |
| Although Smarty insulates you from PHP, you still have the option to use
 | |
| it in certain ways if you wish. Template security forces the restriction
 | |
| of PHP (and select Smarty functions.) This is useful if you have third
 | |
| parties editing templates, and you don't want to unleash the full power
 | |
| of PHP or Smarty to them.
 | |
| 
 | |
| ## Integration
 | |
| Sometimes Smarty gets compared to Model-View-Controller (MVC)
 | |
| frameworks. Smarty is not an MVC, it is just the presentation layer,
 | |
| much like the View (V) part of an MVC. As a matter of fact, Smarty can
 | |
| easily be integrated as the view layer of an MVC. Many of the more
 | |
| popular ones have integration instructions for Smarty, or you may find
 | |
| some help here in the forums and documentation.
 | |
| 
 | |
| ## Other Template Engines
 | |
| Smarty is not the only engine following the *"Separate Programming Code
 | |
| from Presentation"* philosophy. For instance, Python has template
 | |
| engines built around the same principles such as Django Templates and
 | |
| CheetahTemplate. *Note: Languages such as Python do not mix with HTML
 | |
| natively, which give them the advantage of proper programming code
 | |
| separation from the outset. There are libraries available to mix Python
 | |
| with HTML, but they are typically avoided.*
 | |
| 
 | |
| ## What Smarty is Not
 | |
| 
 | |
| Smarty is not an application development framework. Smarty is not an
 | |
| MVC. Smarty is not an alternative to Laravel, Symfony, CodeIgniter,
 | |
| or any of the other application development frameworks for PHP.
 | |
| 
 | |
| Smarty is a template engine, and works as the (V)iew component of your
 | |
| application. Smarty can easily be coupled to any of the engines listed
 | |
| above as the view component. No different than any other software,
 | |
| Smarty has a learning curve. Smarty does not guarantee good application
 | |
| design or proper separation of presentation, this still needs to be
 | |
| addressed by a competent developer and web designer.
 | |
| 
 | |
| ## Is Smarty Right for Me?
 | |
| 
 | |
| Smarty is not meant to be a tool for every job. The important thing is
 | |
| to identify if Smarty fits your needs. There are some important
 | |
| questions to ask yourself:
 | |
| 
 | |
| ### Template Syntax
 | |
| Are you content with PHP tags mixed with HTML? Are your
 | |
| web designers comfortable with PHP? Would your web designers prefer a
 | |
| tag-based syntax designed for presentation? Some experience working with
 | |
| both Smarty and PHP helps answer these questions.
 | |
| 
 | |
| ### The Business Case
 | |
| Is there a requirement to insulate the templates from
 | |
| PHP? Do you have untrusted parties editing templates that you do not
 | |
| wish to unleash the power of PHP to? Do you need to programmatically
 | |
| control what is and is not available within the templates? Smarty
 | |
| supplies these capabilities by design.
 | |
| 
 | |
| ## Feature set
 | |
| Does Smarty's features such as caching, template
 | |
| inheritance and plugin architecture save development cycles writing code
 | |
| that would be needed otherwise? Does the codebase or framework you plan
 | |
| on using have the features you need for the presentation component?
 | |
| 
 | |
| ## Sites using Smarty
 | |
| Many well-known PHP projects make use of Smarty such as XOOPS CMS, CMS Made Simple, Tiki
 | |
| CMS/Groupware and X-Cart to name a few.
 | |
| 
 | |
| ## Summary
 | |
| Whether you are using Smarty for a small website or massive enterprise
 | |
| solution, it can accommodate your needs. There are numerous features
 | |
| that make Smarty a great choice:
 | |
| 
 | |
| -   separation of PHP from HTML/CSS just makes sense
 | |
| -   readability for organization and management
 | |
| -   security for 3rd party template access
 | |
| -   feature completeness, and easily extendable to your own needs
 | |
| -   massive user base, Smarty is here to stay
 | |
| -   LGPL license for commercial use
 | |
| -   100% free to use, open source project
 | 
