mirror of
https://github.com/smarty-php/smarty.git
synced 2025-10-24 01:41:37 +02:00
WIP improving the docs
This commit is contained in:
@@ -1,23 +1,22 @@
|
||||
Tips & Tricks {#tips}
|
||||
=============
|
||||
# Tips & Tricks
|
||||
|
||||
Blank Variable Handling {#tips.blank.var.handling}
|
||||
=======================
|
||||
## Blank Variable Handling
|
||||
|
||||
There may be times when you want to print a default value for an empty
|
||||
variable instead of printing nothing, such as printing ` ` so that
|
||||
html table backgrounds work properly. Many would use an
|
||||
[`{if}`](#language.function.if) statement to handle this, but there is a
|
||||
[`{if}`](../designers/language-builtin-functions/language-function-if.md) statement to handle this, but there is a
|
||||
shorthand way with Smarty, using the
|
||||
[`default`](#language.modifier.default) variable modifier.
|
||||
[`default`](../designers/language-modifiers/language-modifier-default.md) variable modifier.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> "Undefined variable" errors will show an E\_NOTICE if not disabled in
|
||||
> PHP\'s [`error_reporting()`](https://www.php.net/error_reporting) level or
|
||||
> Smarty\'s [`$error_reporting`](#variable.error.reporting) property and
|
||||
> PHP's [`error_reporting()`](https://www.php.net/error_reporting) level or
|
||||
> Smarty's [`$error_reporting`](../programmers/api-variables/variable-error-reporting.md) property and
|
||||
> a variable had not been assigned to Smarty.
|
||||
|
||||
```smarty
|
||||
|
||||
{* the long way *}
|
||||
{if $title eq ''}
|
||||
@@ -29,19 +28,18 @@ shorthand way with Smarty, using the
|
||||
{* the short way *}
|
||||
{$title|default:' '}
|
||||
|
||||
|
||||
```
|
||||
|
||||
See also [`default`](#language.modifier.default) modifier and [default
|
||||
variable handling](#tips.default.var.handling).
|
||||
See also [`default`](../designers/language-modifiers/language-modifier-default.md) modifier and [default
|
||||
variable handling](#default-variable-handling).
|
||||
|
||||
Default Variable Handling {#tips.default.var.handling}
|
||||
=========================
|
||||
## Default Variable Handling
|
||||
|
||||
If a variable is used frequently throughout your templates, applying the
|
||||
[`default`](#language.modifier.default) modifier every time it is
|
||||
[`default`](../designers/language-modifiers/language-modifier-default.md) modifier every time it is
|
||||
mentioned can get a bit ugly. You can remedy this by assigning the
|
||||
variable its default value with the
|
||||
[`{assign}`](#language.function.assign) function.
|
||||
[`{assign}`](../designers/language-builtin-functions/language-function-assign.md) function.
|
||||
|
||||
|
||||
{* do this somewhere at the top of your template *}
|
||||
@@ -52,150 +50,156 @@ variable its default value with the
|
||||
|
||||
|
||||
|
||||
See also [`default`](#language.modifier.default) modifier and [blank
|
||||
variable handling](#tips.blank.var.handling).
|
||||
See also [`default`](../designers/language-modifiers/language-modifier-default.md) modifier and [blank
|
||||
variable handling](#blank-variable-handling).
|
||||
|
||||
Passing variable title to header template {#tips.passing.vars}
|
||||
=========================================
|
||||
## Passing variable title to header template
|
||||
|
||||
When the majority of your templates use the same headers and footers, it
|
||||
is common to split those out into their own templates and
|
||||
[`{include}`](#language.function.include) them. But what if the header
|
||||
[`{include}`](../designers/language-builtin-functions/language-function-include.md) them. But what if the header
|
||||
needs to have a different title, depending on what page you are coming
|
||||
from? You can pass the title to the header as an
|
||||
[attribute](#language.syntax.attributes) when it is included.
|
||||
[attribute](../designers/language-basic-syntax/language-syntax-attributes.md) when it is included.
|
||||
|
||||
`mainpage.tpl` - When the main page is drawn, the title of "Main Page"
|
||||
is passed to the `header.tpl`, and will subsequently be used as the
|
||||
title.
|
||||
|
||||
```smarty
|
||||
|
||||
{include file='header.tpl' title='Main Page'}
|
||||
{* template body goes here *}
|
||||
{include file='footer.tpl'}
|
||||
{include file='header.tpl' title='Main Page'}
|
||||
{* template body goes here *}
|
||||
{include file='footer.tpl'}
|
||||
|
||||
|
||||
```
|
||||
|
||||
`archives.tpl` - When the archives page is drawn, the title will be
|
||||
"Archives". Notice in the archive example, we are using a variable from
|
||||
the `archives_page.conf` file instead of a hard coded variable.
|
||||
|
||||
```smarty
|
||||
|
||||
{config_load file='archive_page.conf'}
|
||||
{config_load file='archive_page.conf'}
|
||||
|
||||
{include file='header.tpl' title=#archivePageTitle#}
|
||||
{* template body goes here *}
|
||||
{include file='footer.tpl'}
|
||||
{include file='header.tpl' title=#archivePageTitle#}
|
||||
{* template body goes here *}
|
||||
{include file='footer.tpl'}
|
||||
|
||||
```
|
||||
|
||||
|
||||
`header.tpl` - Notice that "Smarty News" is printed if the `$title`
|
||||
variable is not set, using the [`default`](#language.modifier.default)
|
||||
variable is not set, using the [`default`](../designers/language-modifiers/language-modifier-default.md)
|
||||
variable modifier.
|
||||
|
||||
```smarty
|
||||
|
||||
<html>
|
||||
<html>
|
||||
<head>
|
||||
<title>{$title|default:'Smarty News'}</title>
|
||||
<title>{$title|default:'Smarty News'}</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<body>
|
||||
|
||||
```
|
||||
|
||||
|
||||
`footer.tpl`
|
||||
|
||||
```smarty
|
||||
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
|
||||
```
|
||||
|
||||
|
||||
Dates {#tips.dates}
|
||||
=====
|
||||
## Dates
|
||||
|
||||
As a rule of thumb, always pass dates to Smarty as
|
||||
[timestamps](https://www.php.net/time). This allows template designers to
|
||||
use the [`date_format`](#language.modifier.date.format) modifier for
|
||||
use the [`date_format`](../designers/language-modifiers/language-modifier-date-format.md) modifier for
|
||||
full control over date formatting, and also makes it easy to compare
|
||||
dates if necessary.
|
||||
|
||||
|
||||
{$startDate|date_format}
|
||||
|
||||
```smarty
|
||||
{$startDate|date_format}
|
||||
```
|
||||
|
||||
|
||||
This will output:
|
||||
|
||||
```
|
||||
Jan 4, 2009
|
||||
```
|
||||
|
||||
Jan 4, 2009
|
||||
```smarty
|
||||
|
||||
|
||||
|
||||
|
||||
{$startDate|date_format:"%Y/%m/%d"}
|
||||
{$startDate|date_format:"%Y/%m/%d"}
|
||||
|
||||
```
|
||||
|
||||
|
||||
This will output:
|
||||
|
||||
|
||||
2009/01/04
|
||||
|
||||
|
||||
```
|
||||
2009/01/04
|
||||
```
|
||||
|
||||
Dates can be compared in the template by timestamps with:
|
||||
|
||||
```smarty
|
||||
|
||||
{if $order_date < $invoice_date}
|
||||
...do something..
|
||||
{/if}
|
||||
{if $order_date < $invoice_date}
|
||||
...do something..
|
||||
{/if}
|
||||
|
||||
|
||||
```
|
||||
|
||||
When using [`{html_select_date}`](#language.function.html.select.date)
|
||||
When using [`{html_select_date}`](../designers/language-custom-functions/language-function-html-select-date.md)
|
||||
in a template, the programmer will most likely want to convert the
|
||||
output from the form back into timestamp format. Here is a function to
|
||||
help you with that.
|
||||
|
||||
```php
|
||||
|
||||
<?php
|
||||
<?php
|
||||
|
||||
// this assumes your form elements are named
|
||||
// startDate_Day, startDate_Month, startDate_Year
|
||||
// this assumes your form elements are named
|
||||
// startDate_Day, startDate_Month, startDate_Year
|
||||
|
||||
$startDate = makeTimeStamp($startDate_Year, $startDate_Month, $startDate_Day);
|
||||
$startDate = makeTimeStamp($startDate_Year, $startDate_Month, $startDate_Day);
|
||||
|
||||
function makeTimeStamp($year='', $month='', $day='')
|
||||
{
|
||||
if(empty($year)) {
|
||||
$year = strftime('%Y');
|
||||
}
|
||||
if(empty($month)) {
|
||||
$month = strftime('%m');
|
||||
}
|
||||
if(empty($day)) {
|
||||
$day = strftime('%d');
|
||||
}
|
||||
function makeTimeStamp($year='', $month='', $day='')
|
||||
{
|
||||
if(empty($year)) {
|
||||
$year = strftime('%Y');
|
||||
}
|
||||
if(empty($month)) {
|
||||
$month = strftime('%m');
|
||||
}
|
||||
if(empty($day)) {
|
||||
$day = strftime('%d');
|
||||
}
|
||||
|
||||
return mktime(0, 0, 0, $month, $day, $year);
|
||||
}
|
||||
?>
|
||||
return mktime(0, 0, 0, $month, $day, $year);
|
||||
}
|
||||
|
||||
|
||||
```
|
||||
|
||||
|
||||
See also [`{html_select_date}`](#language.function.html.select.date),
|
||||
[`{html_select_time}`](#language.function.html.select.time),
|
||||
[`date_format`](#language.modifier.date.format) and
|
||||
[`$smarty.now`](#language.variables.smarty.now),
|
||||
See also [`{html_select_date}`](../designers/language-custom-functions/language-function-html-select-date.md),
|
||||
[`{html_select_time}`](../designers/language-custom-functions/language-function-html-select-time.md),
|
||||
[`date_format`](../designers/language-modifiers/language-modifier-date-format.md) and
|
||||
[`$smarty.now`](../designers/language-variables/language-variables-smarty.md#smarty-now),
|
||||
|
||||
Componentized Templates {#tips.componentized.templates}
|
||||
=======================
|
||||
## Componentized Templates
|
||||
|
||||
Traditionally, programming templates into your applications goes as
|
||||
follows: First, you accumulate your variables within your PHP
|
||||
application, (maybe with database queries.) Then, you instantiate your
|
||||
Smarty object, [`assign()`](#api.assign) the variables and
|
||||
[`display()`](#api.display) the template. So lets say for example we
|
||||
Smarty object, [`assign()`](../programmers/api-functions/api-assign.md) the variables and
|
||||
[`display()`](../programmers/api-functions/api-display.md) the template. So lets say for example we
|
||||
have a stock ticker on our template. We would collect the stock data in
|
||||
our application, then assign these variables in the template and display
|
||||
it. Now wouldn't it be nice if you could add this stock ticker to any
|
||||
@@ -206,58 +210,59 @@ You can do this by writing a custom plugin for fetching the content and
|
||||
assigning it to a template variable.
|
||||
|
||||
`function.load_ticker.php` - drop file in
|
||||
[`$plugins directory`](#variable.plugins.dir)
|
||||
[`$plugins directory`](../programmers/api-variables/variable-plugins-dir.md)
|
||||
|
||||
```php
|
||||
|
||||
<?php
|
||||
<?php
|
||||
|
||||
// setup our function for fetching stock data
|
||||
function fetch_ticker($symbol)
|
||||
{
|
||||
// put logic here that fetches $ticker_info
|
||||
// from some ticker resource
|
||||
return $ticker_info;
|
||||
}
|
||||
// setup our function for fetching stock data
|
||||
function fetch_ticker($symbol)
|
||||
{
|
||||
// put logic here that fetches $ticker_info
|
||||
// from some ticker resource
|
||||
return $ticker_info;
|
||||
}
|
||||
|
||||
function smarty_function_load_ticker($params, $smarty)
|
||||
{
|
||||
// call the function
|
||||
$ticker_info = fetch_ticker($params['symbol']);
|
||||
function smarty_function_load_ticker($params, $smarty)
|
||||
{
|
||||
// call the function
|
||||
$ticker_info = fetch_ticker($params['symbol']);
|
||||
|
||||
// assign template variable
|
||||
$smarty->assign($params['assign'], $ticker_info);
|
||||
}
|
||||
?>
|
||||
// assign template variable
|
||||
$smarty->assign($params['assign'], $ticker_info);
|
||||
}
|
||||
|
||||
|
||||
```
|
||||
|
||||
`index.tpl`
|
||||
|
||||
```smarty
|
||||
|
||||
{load_ticker symbol='SMARTY' assign='ticker'}
|
||||
{load_ticker symbol='SMARTY' assign='ticker'}
|
||||
|
||||
Stock Name: {$ticker.name} Stock Price: {$ticker.price}
|
||||
Stock Name: {$ticker.name} Stock Price: {$ticker.price}
|
||||
|
||||
|
||||
```
|
||||
|
||||
See also: [`{include}`](#language.function.include).
|
||||
See also: [`{include}`](../designers/language-builtin-functions/language-function-include.md).
|
||||
|
||||
Obfuscating E-mail Addresses {#tips.obfuscating.email}
|
||||
============================
|
||||
## Obfuscating E-mail Addresses
|
||||
|
||||
Do you ever wonder how your email address gets on so many spam mailing
|
||||
lists? One way spammers collect email addresses is from web pages. To
|
||||
help combat this problem, you can make your email address show up in
|
||||
scrambled javascript in the HTML source, yet it it will look and work
|
||||
correctly in the browser. This is done with the
|
||||
[`{mailto}`](#language.function.mailto) plugin.
|
||||
[`{mailto}`](../designers/language-custom-functions/language-function-mailto.md) plugin.
|
||||
|
||||
```smarty
|
||||
|
||||
<div id="contact">Send inquiries to
|
||||
{mailto address=$EmailAddress encode='javascript' subject='Hello'}
|
||||
</div>
|
||||
<div id="contact">Send inquiries to
|
||||
{mailto address=$EmailAddress encode='javascript' subject='Hello'}
|
||||
</div>
|
||||
|
||||
|
||||
```
|
||||
|
||||
> **Note**
|
||||
>
|
||||
@@ -265,5 +270,5 @@ correctly in the browser. This is done with the
|
||||
> his e-mail collector to decode these values, but not likely\....
|
||||
> hopefully..yet \... wheres that quantum computer :-?.
|
||||
|
||||
See also [`escape`](#language.modifier.escape) modifier and
|
||||
[`{mailto}`](#language.function.mailto).
|
||||
See also [`escape`](../designers/language-modifiers/language-modifier-escape.md) modifier and
|
||||
[`{mailto}`](../designers/language-custom-functions/language-function-mailto.md).
|
||||
|
||||
@@ -1,20 +1,18 @@
|
||||
Troubleshooting
|
||||
===============
|
||||
# Troubleshooting
|
||||
|
||||
Smarty/PHP errors {#smarty.php.errors}
|
||||
=================
|
||||
## Smarty/PHP errors
|
||||
|
||||
Smarty can catch many errors such as missing tag attributes or malformed
|
||||
variable names. If this happens, you will see an error similar to the
|
||||
following:
|
||||
|
||||
```
|
||||
Warning: Smarty: [in index.tpl line 4]: syntax error: unknown tag - '%blah'
|
||||
in /path/to/smarty/Smarty.class.php on line 1041
|
||||
|
||||
Warning: Smarty: [in index.tpl line 4]: syntax error: unknown tag - '%blah'
|
||||
in /path/to/smarty/Smarty.class.php on line 1041
|
||||
|
||||
Fatal error: Smarty: [in index.tpl line 28]: syntax error: missing section name
|
||||
in /path/to/smarty/Smarty.class.php on line 1041
|
||||
|
||||
Fatal error: Smarty: [in index.tpl line 28]: syntax error: missing section name
|
||||
in /path/to/smarty/Smarty.class.php on line 1041
|
||||
```
|
||||
|
||||
|
||||
Smarty shows you the template name, the line number and the error. After
|
||||
@@ -25,96 +23,82 @@ There are certain errors that Smarty cannot catch, such as missing close
|
||||
tags. These types of errors usually end up in PHP compile-time parsing
|
||||
errors.
|
||||
|
||||
|
||||
Parse error: parse error in /path/to/smarty/templates_c/index.tpl.php on line 75
|
||||
|
||||
|
||||
|
||||
`Parse error: parse error in /path/to/smarty/templates_c/index.tpl.php on line 75`
|
||||
|
||||
When you encounter a PHP parsing error, the error line number will
|
||||
correspond to the compiled PHP script, NOT the template itself. Usually
|
||||
you can look at the template and spot the syntax error. Here are some
|
||||
common things to look for: missing close tags for
|
||||
[`{if}{/if}`](#language.function.if) or
|
||||
[`{section}{/section}`](#language.function.if), or syntax of logic
|
||||
within an `{if}` tag. If you can\'t find the error, you might have to
|
||||
[`{if}{/if}`](../designers/language-builtin-functions/language-function-if.md) or
|
||||
[`{section}{/section}`](../designers/language-builtin-functions/language-function-section.md),
|
||||
or syntax of logic within an `{if}` tag. If you can\'t find the error, you might have to
|
||||
open the compiled PHP file and go to the line number to figure out where
|
||||
the corresponding error is in the template.
|
||||
|
||||
```
|
||||
Warning: Smarty error: unable to read resource: "index.tpl" in...
|
||||
```
|
||||
or
|
||||
```
|
||||
Warning: Smarty error: unable to read resource: "site.conf" in...
|
||||
```
|
||||
|
||||
Warning: Smarty error: unable to read resource: "index.tpl" in...
|
||||
or
|
||||
Warning: Smarty error: unable to read resource: "site.conf" in...
|
||||
|
||||
- The [`$template_dir`](#variable.template.dir) is incorrect, doesn\'t
|
||||
- The [`$template_dir`](../programmers/api-variables/variable-template-dir.md) is incorrect, doesn't
|
||||
exist or the file `index.tpl` is not in the `templates/` directory
|
||||
|
||||
- A [`{config_load}`](#language.function.config.load) function is
|
||||
within a template (or [`configLoad()`](#api.config.load) has been
|
||||
called) and either [`$config_dir`](#variable.config.dir) is
|
||||
- A [`{config_load}`](../designers/language-builtin-functions/language-function-config-load.md) function is
|
||||
within a template (or [`configLoad()`](../programmers/api-functions/api-config-load.md) has been
|
||||
called) and either [`$config_dir`](../programmers/api-variables/variable-config-dir.md) is
|
||||
incorrect, does not exist or `site.conf` is not in the directory.
|
||||
|
||||
<!-- -->
|
||||
```
|
||||
Fatal error: Smarty error: the $compile_dir 'templates_c' does not exist,
|
||||
or is not a directory...
|
||||
```
|
||||
|
||||
|
||||
Fatal error: Smarty error: the $compile_dir 'templates_c' does not exist,
|
||||
or is not a directory...
|
||||
|
||||
|
||||
|
||||
- Either the [`$compile_dir`](#variable.compile.dir)is incorrectly
|
||||
- Either the [`$compile_dir`](../programmers/api-variables/variable-compile-dir.md)is incorrectly
|
||||
set, the directory does not exist, or `templates_c` is a file and
|
||||
not a directory.
|
||||
|
||||
<!-- -->
|
||||
|
||||
|
||||
Fatal error: Smarty error: unable to write to $compile_dir '....
|
||||
|
||||
```
|
||||
Fatal error: Smarty error: unable to write to $compile_dir '....
|
||||
```
|
||||
|
||||
|
||||
- The [`$compile_dir`](#variable.compile.dir) is not writable by the
|
||||
- The [`$compile_dir`](../programmers/api-variables/variable-compile-dir.md) is not writable by the
|
||||
web server. See the bottom of the [installing
|
||||
smarty](#installing.smarty.basic) page for more about permissions.
|
||||
|
||||
<!-- -->
|
||||
|
||||
|
||||
Fatal error: Smarty error: the $cache_dir 'cache' does not exist,
|
||||
or is not a directory. in /..
|
||||
smarty](../getting-started.md#installation) page for more about permissions.
|
||||
|
||||
```
|
||||
Fatal error: Smarty error: the $cache_dir 'cache' does not exist,
|
||||
or is not a directory. in /..
|
||||
```
|
||||
|
||||
|
||||
- This means that [`$caching`](#variable.caching) is enabled and
|
||||
either; the [`$cache_dir`](#variable.cache.dir) is incorrectly set,
|
||||
- This means that [`$caching`](../programmers/api-variables/variable-caching.md) is enabled and
|
||||
either; the [`$cache_dir`](../programmers/api-variables/variable-cache-dir.md) is incorrectly set,
|
||||
the directory does not exist, or `cache/` is a file and not a
|
||||
directory.
|
||||
|
||||
<!-- -->
|
||||
```
|
||||
Fatal error: Smarty error: unable to write to $cache_dir '/...
|
||||
```
|
||||
|
||||
|
||||
Fatal error: Smarty error: unable to write to $cache_dir '/...
|
||||
|
||||
|
||||
|
||||
- This means that [`$caching`](#variable.caching) is enabled and the
|
||||
[`$cache_dir`](#variable.cache.dir) is not writable by the web
|
||||
- This means that [`$caching`](../programmers/api-variables/variable-caching.md) is enabled and the
|
||||
[`$cache_dir`](../programmers/api-variables/variable-cache-dir.md) is not writable by the web
|
||||
server. See the bottom of the [installing
|
||||
smarty](#installing.smarty.basic) page for permissions.
|
||||
smarty](../getting-started.md#installation) page for permissions.
|
||||
|
||||
<!-- -->
|
||||
|
||||
|
||||
Warning: filemtime(): stat failed for /path/to/smarty/cache/3ab50a623e65185c49bf17c63c90cc56070ea85c.one.tpl.php
|
||||
in /path/to/smarty/libs/sysplugins/smarty_resource.php
|
||||
|
||||
|
||||
```
|
||||
Warning: filemtime(): stat failed for /path/to/smarty/cache/3ab50a623e65185c49bf17c63c90cc56070ea85c.one.tpl.php
|
||||
in /path/to/smarty/libs/sysplugins/smarty_resource.php
|
||||
```
|
||||
|
||||
- This means that your application registered a custom error handler
|
||||
(using [set\_error\_handler()](https://www.php.net/set_error_handler))
|
||||
(using [set_error_handler()](https://www.php.net/set_error_handler))
|
||||
which is not respecting the given `$errno` as it should. If, for
|
||||
whatever reason, this is the desired behaviour of your custom error
|
||||
handler, please call
|
||||
[`muteExpectedErrors()`](#api.mute.expected.errors) after you\'ve
|
||||
[`muteExpectedErrors()`](../programmers/api-functions/api-mute-expected-errors.md) after you've
|
||||
registered your custom error handler.
|
||||
|
||||
See also [debugging](#chapter.debugging.console).
|
||||
See also [debugging](../designers/chapter-debugging-console.md).
|
||||
|
||||
Reference in New Issue
Block a user