mirror of
https://github.com/smarty-php/smarty.git
synced 2026-08-04 12:34:33 +02:00
Compare commits
20 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 533fa2abe3 | |||
| b05bb7186b | |||
| 9f6f21f0a0 | |||
| 84128a68ed | |||
| 2f3595a1ab | |||
| ee586702aa | |||
| 22329d9d30 | |||
| e361b0329b | |||
| bace28e2eb | |||
| 478f8a29b4 | |||
| f8717a6cf7 | |||
| 957f9ce43a | |||
| 4ab9757b49 | |||
| 23d29f2ea3 | |||
| 88cc17fe8e | |||
| 5fb8387027 | |||
| c5c9d6514c | |||
| 4cb07a89e2 | |||
| 47fa66cdcf | |||
| e97b7d136c |
@@ -0,0 +1 @@
|
||||
templates_c
|
||||
+6
-12
@@ -1,17 +1,11 @@
|
||||
# Auto detect text files and perform LF normalization
|
||||
* text=auto
|
||||
|
||||
*.php text eol=lf
|
||||
*.y text eol=lf
|
||||
*.lex text eol=lf
|
||||
|
||||
# exclude from git export
|
||||
/tests export-ignore
|
||||
/utilities/ export-ignore
|
||||
|
||||
/.gitattributes export-ignore
|
||||
/travis.ini export-ignore
|
||||
/myconfig.ini export-ignore
|
||||
/.travis.yml export-ignore
|
||||
/.gitignore export-ignore
|
||||
/make-release.sh export-ignore
|
||||
/phpunit.sh export-ignore
|
||||
/phpunit.xml export-ignore
|
||||
/TODO.md export-ignore
|
||||
/.gitattributes export-ignore
|
||||
/lexer/ export-ignore
|
||||
/utilities/ export-ignore
|
||||
|
||||
@@ -1,77 +0,0 @@
|
||||
# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
|
||||
|
||||
on:
|
||||
- pull_request
|
||||
- push
|
||||
|
||||
name: CI
|
||||
|
||||
jobs:
|
||||
tests:
|
||||
name: Tests
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
env:
|
||||
PHP_EXTENSIONS: dom, json, libxml, mbstring, pdo_sqlite, soap, xml, xmlwriter
|
||||
PHP_INI_VALUES: assert.exception=1, zend.assertions=1
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os:
|
||||
- ubuntu-latest
|
||||
|
||||
php-version:
|
||||
- "7.1"
|
||||
- "7.2"
|
||||
- "7.3"
|
||||
- "7.4"
|
||||
- "8.0"
|
||||
- "8.1"
|
||||
|
||||
compiler:
|
||||
- default
|
||||
|
||||
include:
|
||||
- os: ubuntu-latest
|
||||
php-version: "8.0"
|
||||
compiler: jit
|
||||
- os: ubuntu-latest
|
||||
php-version: "8.1"
|
||||
compiler: jit
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Override PHP ini values for JIT compiler
|
||||
if: matrix.compiler == 'jit'
|
||||
run: echo "PHP_INI_VALUES::assert.exception=1, zend.assertions=1, opcache.enable=1, opcache.enable_cli=1, opcache.optimization_level=-1, opcache.jit=1255, opcache.jit_buffer_size=32M" >> $GITHUB_ENV
|
||||
|
||||
- name: Install PHP with extensions
|
||||
uses: shivammathur/setup-php@v2
|
||||
with:
|
||||
php-version: ${{ matrix.php-version }}
|
||||
coverage: pcov
|
||||
extensions: ${{ env.PHP_EXTENSIONS }}
|
||||
ini-values: ${{ env.PHP_INI_VALUES }}
|
||||
|
||||
- name: Validate composer.json and composer.lock
|
||||
run: composer validate
|
||||
|
||||
- name: Cache Composer packages
|
||||
id: composer-cache
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: vendor
|
||||
key: ${{ runner.os }}-php-${{ matrix.php-version }}-${{ hashFiles('**/composer.lock') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-php-${{ matrix.php-version }}-
|
||||
|
||||
- name: Install dependencies
|
||||
if: steps.composer-cache.outputs.cache-hit != 'true'
|
||||
run: composer install --prefer-dist --no-progress --no-suggest
|
||||
|
||||
- name: Run tests with phpunit
|
||||
run: ./phpunit.sh
|
||||
+3
-7
@@ -1,14 +1,10 @@
|
||||
|
||||
.idea/
|
||||
|
||||
# Smarty
|
||||
lexer/*.php
|
||||
lexer/*.php.bak
|
||||
lexer/*.out
|
||||
utilies/*.php
|
||||
|
||||
# Dev
|
||||
phpunit*
|
||||
.phpunit.result.cache
|
||||
vendor/*
|
||||
composer.lock
|
||||
/composer.lock
|
||||
/vendor
|
||||
/tests
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
Smarty is supported only in PHP 4.0.6 or later.
|
||||
|
||||
Smarty versions previous to 2.0 require the PEAR libraries. Be sure to include
|
||||
the path to the PEAR libraries in your php include_path. Config_file.class.php
|
||||
uses the PEAR library for its error handling routines. PEAR comes with the PHP
|
||||
distribution. Unix users check /usr/local/lib/php, windows users check
|
||||
C:/php/pear.
|
||||
-3524
File diff suppressed because it is too large
Load Diff
+458
@@ -0,0 +1,458 @@
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the Lesser GPL. It also counts
|
||||
as the successor of the GNU Library Public License, version 2, hence
|
||||
the version number 2.1.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Lesser General Public License, applies to some
|
||||
specially designated software packages--typically libraries--of the
|
||||
Free Software Foundation and other authors who decide to use it. You
|
||||
can use it too, but we suggest you first think carefully about whether
|
||||
this license or the ordinary General Public License is the better
|
||||
strategy to use in any particular case, based on the explanations below.
|
||||
|
||||
When we speak of free software, we are referring to freedom of use,
|
||||
not price. Our General Public Licenses are designed to make sure that
|
||||
you have the freedom to distribute copies of free software (and charge
|
||||
for this service if you wish); that you receive source code or can get
|
||||
it if you want it; that you can change the software and use pieces of
|
||||
it in new free programs; and that you are informed that you can do
|
||||
these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
distributors to deny you these rights or to ask you to surrender these
|
||||
rights. These restrictions translate to certain responsibilities for
|
||||
you if you distribute copies of the library or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link other code with the library, you must provide
|
||||
complete object files to the recipients, so that they can relink them
|
||||
with the library after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
We protect your rights with a two-step method: (1) we copyright the
|
||||
library, and (2) we offer you this license, which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
To protect each distributor, we want to make it very clear that
|
||||
there is no warranty for the free library. Also, if the library is
|
||||
modified by someone else and passed on, the recipients should know
|
||||
that what they have is not the original version, so that the original
|
||||
author's reputation will not be affected by problems that might be
|
||||
introduced by others.
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of
|
||||
any free program. We wish to make sure that a company cannot
|
||||
effectively restrict the users of a free program by obtaining a
|
||||
restrictive license from a patent holder. Therefore, we insist that
|
||||
any patent license obtained for a version of the library must be
|
||||
consistent with the full freedom of use specified in this license.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the
|
||||
ordinary GNU General Public License. This license, the GNU Lesser
|
||||
General Public License, applies to certain designated libraries, and
|
||||
is quite different from the ordinary General Public License. We use
|
||||
this license for certain libraries in order to permit linking those
|
||||
libraries into non-free programs.
|
||||
|
||||
When a program is linked with a library, whether statically or using
|
||||
a shared library, the combination of the two is legally speaking a
|
||||
combined work, a derivative of the original library. The ordinary
|
||||
General Public License therefore permits such linking only if the
|
||||
entire combination fits its criteria of freedom. The Lesser General
|
||||
Public License permits more lax criteria for linking other code with
|
||||
the library.
|
||||
|
||||
We call this license the "Lesser" General Public License because it
|
||||
does Less to protect the user's freedom than the ordinary General
|
||||
Public License. It also provides other free software developers Less
|
||||
of an advantage over competing non-free programs. These disadvantages
|
||||
are the reason we use the ordinary General Public License for many
|
||||
libraries. However, the Lesser license provides advantages in certain
|
||||
special circumstances.
|
||||
|
||||
For example, on rare occasions, there may be a special need to
|
||||
encourage the widest possible use of a certain library, so that it becomes
|
||||
a de-facto standard. To achieve this, non-free programs must be
|
||||
allowed to use the library. A more frequent case is that a free
|
||||
library does the same job as widely used non-free libraries. In this
|
||||
case, there is little to gain by limiting the free library to free
|
||||
software only, so we use the Lesser General Public License.
|
||||
|
||||
In other cases, permission to use a particular library in non-free
|
||||
programs enables a greater number of people to use a large body of
|
||||
free software. For example, permission to use the GNU C Library in
|
||||
non-free programs enables many more people to use the whole GNU
|
||||
operating system, as well as its variant, the GNU/Linux operating
|
||||
system.
|
||||
|
||||
Although the Lesser General Public License is Less protective of the
|
||||
users' freedom, it does ensure that the user of a program that is
|
||||
linked with the Library has the freedom and the wherewithal to run
|
||||
that program using a modified version of the Library.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other
|
||||
program which contains a notice placed by the copyright holder or
|
||||
other authorized party saying it may be distributed under the terms of
|
||||
this Lesser General Public License (also called "this License").
|
||||
Each licensee is addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control compilation
|
||||
and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you accompany
|
||||
it with the complete corresponding machine-readable source code, which
|
||||
must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy
|
||||
from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also combine or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (1) uses at run time a
|
||||
copy of the library already present on the user's computer system,
|
||||
rather than copying library functions into the executable, and (2)
|
||||
will operate properly with a modified version of the library, if
|
||||
the user installs one, as long as the modified version is
|
||||
interface-compatible with the version that the work was made with.
|
||||
|
||||
c) Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
d) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
e) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the materials to be distributed need not include anything that is
|
||||
normally distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on
|
||||
which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library is void, and will automatically terminate your
|
||||
rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties with
|
||||
this License.
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library under this License may add
|
||||
an explicit geographical distribution limitation excluding those countries,
|
||||
so that distribution is permitted only in or among countries not thus
|
||||
excluded. In such case, this License incorporates the limitation as if
|
||||
written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the Lesser General Public License from time to time.
|
||||
Such new versions will be similar in spirit to the present version,
|
||||
but may differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library
|
||||
specifies a version number of this License which applies to it and
|
||||
"any later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
@@ -0,0 +1,284 @@
|
||||
QUESTION INDEX
|
||||
--------------
|
||||
|
||||
GENERAL
|
||||
|
||||
Q: What is Smarty?
|
||||
Q: What's the difference between Smarty and other template engines?
|
||||
Q: What do you mean "Compiled PHP Scripts" ?
|
||||
Q: Why can't I just use PHPA (http://php-accelerator.co.uk) or Zend Cache?
|
||||
Q: Why does smarty have a built in cache? Wouldn't it be better to handle this
|
||||
in a separate class?
|
||||
Q: Is Smarty faster than <insert other PHP template engine>?
|
||||
Q: How can I be sure to get the best performance from Smarty?
|
||||
Q: Do you have a mailing list?
|
||||
Q: Can you change the mailing list so reply-to sends to the list and not the
|
||||
user?
|
||||
|
||||
TROUBLESHOOTING
|
||||
|
||||
Q: Smarty doesn't work.
|
||||
Q: I get the following error when running Smarty:
|
||||
Warning: Smarty error: problem creating directory "templates_c/239/239105369"
|
||||
in /path/to/Smarty.class.php on line 542
|
||||
Q: I get the following error when running Smarty:
|
||||
Warning: Wrong parameter count for preg_replace() in
|
||||
Smarty.class.php on line 371
|
||||
Q: I get this error when passing variables to {include}:
|
||||
Fatal error: Call to undefined function: get_defined_vars() in
|
||||
/path/to/Smarty/templates_c/index.tpl.php on line 8
|
||||
Q: I get PHP errors in my {if} tag logic.
|
||||
Q: I'm changing my php code and/or templates, and my results are not getting
|
||||
updated.
|
||||
Q: I'm running Windows 2000 and I get blank content. My compiled PHP files are
|
||||
also zero length.
|
||||
Q: The template goes into an infinite loop when I include included templates
|
||||
that pass local variables
|
||||
Q: Javascript is causing Smarty errors in my templates.
|
||||
Q: I get "SAFE MODE Restriction in effect. ..."-errors when running smarty.
|
||||
|
||||
MISC
|
||||
|
||||
Q: Can I use Macromedia's Dreamweaver to edit my templates?
|
||||
Q: Dreamweaver is urlencoding the template delimiters when they are in a SRC or
|
||||
HREF link. How do I get around this?
|
||||
|
||||
HOWTO
|
||||
|
||||
Q: How do I generate different cache files per template based on arguments
|
||||
passed to the page?
|
||||
Q: How do I pass a template variable as a parameter? {function param={$varname}}
|
||||
does not work.
|
||||
Q: How do I include cached template(s) within a non-cached template?
|
||||
|
||||
|
||||
GENERAL
|
||||
-------
|
||||
|
||||
Q: What is Smarty?
|
||||
A: Smarty is a template engine for PHP... but be aware this isn't just another
|
||||
PHP template engine. It's much more than that.
|
||||
|
||||
Q: What's the difference between Smarty and other template engines?
|
||||
A: Most other template engines for PHP provide basic variable substitution and
|
||||
dynamic block functionality. Smarty takes a step further to be a "smart"
|
||||
template engine, adding features such as configuration files, template
|
||||
functions, variable modifiers (see the docs!) and making all of this
|
||||
functionality as easy as possible to use for both programmers and template
|
||||
designers. Smarty also compiles the templates into PHP scripts, eliminating
|
||||
the need to parse the templates on every invocation, making Smarty extremely
|
||||
scalable and manageable for large application needs.
|
||||
|
||||
Q: What do you mean "Compiled PHP Scripts" ?
|
||||
A: Smarty reads the template files and creates PHP scripts from them. Once
|
||||
these PHP scripts are created, Smarty executes these, never having to parse
|
||||
the template files again. If you change a template file, Smarty will
|
||||
recreate the PHP script for it. All this is done automatically by Smarty.
|
||||
Template designers never need to mess with the generated PHP scripts or even
|
||||
know of their existance. (NOTE: you can turn off this compile checking step
|
||||
in Smarty for increased performance.)
|
||||
|
||||
Q: Why can't I just use PHPA (http://php-accelerator.co.uk) or Zend Cache?
|
||||
A: You certainly can, and we highly recommend it! What PHPA does is caches
|
||||
compiled bytecode of your PHP scripts in shared memory or in a file. This
|
||||
speeds up server response and saves the compilation step. Smarty creates PHP
|
||||
scripts, which PHPA will cache nicely. Now, Smarty's built-in cache is
|
||||
something completely different. It caches the _output_ of the template
|
||||
contents. For example, if you have a template that requires several database
|
||||
queries, Smarty can cache this output, saving the need to call the database
|
||||
every time. Smarty and PHPA (or Zend Cache) complement each other nicely. If
|
||||
performance is of the utmost importance, we would recommend using one of
|
||||
these with any PHP application, using Smarty or not. As you can see in the
|
||||
benchmarks, Smartys performance _really_ excels in combination with a PHP
|
||||
accelerator.
|
||||
|
||||
Q: Why does Smarty have a built in cache? Wouldn't it be better to handle this
|
||||
in a separate class?
|
||||
A: Smarty's caching functionality is tightly integrated with the template
|
||||
engine, making it quite a bit more flexible than a simple caching wrapper.
|
||||
For instance, you can cache select portions of a template page. Let's say
|
||||
you have a polling box on your site. With Smarty, you can leave the poll
|
||||
dynamic and cache the rest of the page. You can also pass templates
|
||||
multiple cache ids, meaning that a template can have several caches
|
||||
depending on URL, cookies, etc.
|
||||
|
||||
Q: Is Smarty faster than <insert other PHP template engine>?
|
||||
A: See the benchmark page for some performance comparisons. Smarty's approach
|
||||
to templates is a bit different from some languages: it compiles templates
|
||||
into PHP scripts instead of parsing them on each invocation. This usually
|
||||
results in great performance gains, especially with complex templates.
|
||||
Coupled with the built-in caching of Smarty templates, the performance is
|
||||
outstanding.
|
||||
|
||||
Q: How can I be sure to get the best performance from Smarty?
|
||||
A: Be sure you set $compile_check=false once your templates are initially
|
||||
compiled. This will skip the unneeded step of testing if the template has
|
||||
changed since it was last compiled. If you have complex pages that don't
|
||||
change too often, turn on the caching engine and adjust your application so
|
||||
it doesn't do unnecessary work (like db calls) if a cached page is
|
||||
available. See the documentation for examples.
|
||||
|
||||
Q: Do you have a mailing list?
|
||||
A: We have a few mailing lists. "general" for you to share your ideas or ask
|
||||
questions, "dev" for those interested in the development efforts of Smarty,
|
||||
and "cvs" for those that would like to track the updates made in the cvs
|
||||
repository.
|
||||
|
||||
send a blank e-mail message to:
|
||||
smarty-general-subscribe@lists.php.net (subscribe to the general list)
|
||||
smarty-general-unsubscribe@lists.php.net (unsubscribe from the general list)
|
||||
smarty-general-digest-subscribe@lists.php.net (subscribe to digest)
|
||||
smarty-general-digest-unsubscribe@lists.php.net (unsubscribe from digest)
|
||||
smarty-dev-subscribe@lists.php.net (subscribe to the dev list)
|
||||
smarty-dev-unsubscribe@lists.php.net (unsubscribe from the dev list)
|
||||
smarty-cvs-subscribe@lists.php.net (subscribe to the cvs list)
|
||||
smarty-cvs-unsubscribe@lists.php.net (unsubscribe from the cvs list)
|
||||
You can also browse the mailing list archives at
|
||||
http://marc.theaimsgroup.com/?l=smarty&r=1&w=2
|
||||
|
||||
|
||||
|
||||
Q: Can you change the mailing list so Reply-To sends to the list and not the
|
||||
user?
|
||||
A: Yes we could, but no we won't. Use "Reply-All" in your e-mail client to send
|
||||
to the list. http://www.unicom.com/pw/reply-to-harmful.html
|
||||
|
||||
TROUBLESHOOTING
|
||||
---------------
|
||||
|
||||
Q: Smarty doesn't work.
|
||||
A: You must be using PHP 4.0.6 or later if you use any version of Smarty
|
||||
past 2.0.1. Read the BUGS file for more info.
|
||||
|
||||
Q: I get the following error when running Smarty:
|
||||
Warning: Smarty error: problem creating directory "templates_c/239/239105369"
|
||||
in /path/to/Smarty.class.php on line 542
|
||||
A: Your web server user does not have permission to write to the templates_c
|
||||
directory, or is unable to create the templates_c directory. Be sure the
|
||||
templates_c directory exists in the location defined in Smarty.class.php,
|
||||
and the web server user can write to it. If you do not know the web server
|
||||
user, chmod 777 the templates_c directory, reload the page, then check the
|
||||
file ownership of the files created in templates_c. Or, you can check the
|
||||
httpd.conf (usually in /usr/local/apache/conf) file for this setting:
|
||||
User nobody
|
||||
Group nobody
|
||||
|
||||
Q: I get the following error when running Smarty: Warning: Wrong parameter
|
||||
count for preg_replace() in Smarty.class.php on line 371
|
||||
A: preg_replace had a parameter added in PHP 4.0.2 that Smarty
|
||||
requires. Upgrade to at least 4.0.6 to fix all known PHP issues with
|
||||
Smarty.
|
||||
|
||||
Q: I get this error when passing variables to {include}:
|
||||
Fatal error: Call to undefined function: get_defined_vars() in
|
||||
/path/to/Smarty/templates_c/index.tpl.php on line 8
|
||||
A: get_defined_vars() was added to PHP 4.0.4. If you plan on passing
|
||||
variables to included templates, you will need PHP 4.0.6 or later.
|
||||
|
||||
Q: I get PHP errors in my {if} tag logic.
|
||||
A: All conditional qualifiers must be separated by spaces. This syntax will not
|
||||
work: {if $name=="Wilma"} You must instead do this: {if $name == "Wilma"}.
|
||||
The reason for this is syntax ambiguity. Both "==" and "eq" are equivalent
|
||||
in the template parser, so something like {if $nameeq"Wilma"} wouldn't be
|
||||
parsable by the tokenizer.
|
||||
|
||||
Q: I'm changing my php code and/or templates, and my results are not getting
|
||||
updated.
|
||||
A: This may be the result of your compile or cache settings. If you are
|
||||
changing your php code, your templates will not necessarily get recompiled
|
||||
to reflect the changes. Use $force_compile during develpment to avoid these
|
||||
situations. Also turn off caching during development when you aren't
|
||||
specifically testing it. You can also remove everything from your
|
||||
compile_dir and cache_dir and reload the page to be sure everything gets
|
||||
regenerated.
|
||||
|
||||
Q: I'm running Windows 2000 and I get blank content. My compiled PHP files are
|
||||
also zero length.
|
||||
A: There seems to be a problem with some W2k machines and exclusive file
|
||||
locking. Comment out the flock() call in _write_file to get around this,
|
||||
although be aware this could possibly cause a problem with simultaneous
|
||||
writes to a file, especially with caching turned on. NOTE: As of Smarty
|
||||
1.4.0, a workaround was put in place that should solve this.
|
||||
|
||||
Q: The template goes into an infinite loop when I include included templates
|
||||
that pass local variables
|
||||
A: This was fixed in 1.3.2 (new global attribute)
|
||||
|
||||
Q: Javascript is causing Smarty errors in my templates.
|
||||
A: Surround your javascript with {literal}{/literal} tags. See the docs.
|
||||
|
||||
Q: I get "SAFE MODE Restriction in effect. ..."-errors when running smarty.
|
||||
A: Use $smarty->use_sub_dirs = false when running php in safe mode.
|
||||
|
||||
MISC
|
||||
----
|
||||
|
||||
Q: Can I use Macromedia's Dreamweaver to edit my templates?
|
||||
A: Certainly. You might want to change your tag delimiters from {} to something
|
||||
that resembles valid HTML, like <!--{ }--> or <{ }> or something similar.
|
||||
This way the editor won't view the template tags as errors.
|
||||
|
||||
Q: Dreamweaver is urlencoding the template delimiters when they are in a SRC or
|
||||
HREF link. How do I get around this?
|
||||
A: In Edit - Properties - Rewrite HTML you can specify if Dreamweaver should
|
||||
change special letters to %-equivalent or not. The default is on which
|
||||
produces this error.
|
||||
|
||||
HOWTO
|
||||
-----
|
||||
|
||||
Q: How do I generate different cache files per template based on arguments
|
||||
passed to the page?
|
||||
A: Use your $REQUEST_URI as the cache_id when fetching the page:
|
||||
|
||||
global $REQUEST_URI; // if not already present
|
||||
$smarty->display('index.tpl',$REQUEST_URI);
|
||||
|
||||
This will create a separate cache file for each unique URL when you call
|
||||
index.tpl. See the documentation for display() and fetch()
|
||||
|
||||
Q: How do I pass a template variable as a parameter? {function param={$varname}}
|
||||
does not work.
|
||||
A: {function param=$varname} (You cannot nest template delimiters.)
|
||||
|
||||
Q: How do I include cached template(s) within a non-cached template?
|
||||
A: One way to do it:
|
||||
|
||||
$smarty->caching = true;
|
||||
$tpl1 = $smarty->fetch("internal1.tpl");
|
||||
$tpl2 = $smarty->fetch("internal2.tpl");
|
||||
$tpl3 = $smarty->fetch("internal3.tpl");
|
||||
|
||||
$smarty->assign("tpl1_contents",$tpl1);
|
||||
$smarty->assign("tpl2_contents",$tpl2);
|
||||
$smarty->assign("tpl3_contents",$tpl3);
|
||||
|
||||
$smarty->caching = false;
|
||||
$smarty->display('index.tpl');
|
||||
|
||||
index.tpl
|
||||
---------
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td>{$tpl1_contents}</td>
|
||||
<td>{$tpl2_contents}</td>
|
||||
<td>{$tpl3_contents}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
|
||||
|
||||
Another approach:
|
||||
|
||||
You could write a custom insert function to fetch your internal
|
||||
templates:
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td>{insert name=fetch_tpl tpl="internal1.tpl"}</td>
|
||||
<td>{insert name=fetch_tpl tpl="internal2.tpl"}</td>
|
||||
<td>{insert name=fetch_tpl tpl="internal3.tpl"}</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -0,0 +1,29 @@
|
||||
REQUIREMENTS:
|
||||
|
||||
Smarty requires PHP 4.0.6 or later.
|
||||
See the on-line documentation for complete install instructions.
|
||||
|
||||
INSTALLATION (quick):
|
||||
|
||||
* copy the files under the libs/ directory to a directory that is in your PHP
|
||||
include_path, or set the SMARTY_DIR constant and put them in this directory.
|
||||
(if you upgrade from versions before 2.5.0 be aware that up to Smarty 2.4.2
|
||||
all necessary files where in the distribution's root directory, but are now
|
||||
in libs/.)
|
||||
|
||||
* for each application using Smarty, create a "templates", "configs", and a
|
||||
"templates_c" directory, be sure to set the appropriate directory settings in
|
||||
Smarty for them. If they are located in the same directory as your
|
||||
application, they shouldn't need to be modified. Be sure the "templates_c"
|
||||
directory is writable by your web server user (usually nobody). chown
|
||||
nobody:nobody templates_c; chmod 700 templates_c You can also chmod 777 this
|
||||
directory, but be aware of security issues for multi-user systems. If you are
|
||||
using Smarty's built-in caching, create a "cache" directory and also chown
|
||||
nobody:nobody.
|
||||
|
||||
* setup your php and template files. A good working example is in the on-line
|
||||
documentation.
|
||||
|
||||
* TECHNICAL NOTE: If you do not have access to the php.ini file, you can change
|
||||
non-server settings (such as your include_path) with the ini_set() command.
|
||||
example: ini_set("include_path",".:/usr/local/lib/php");
|
||||
@@ -1,179 +0,0 @@
|
||||
Smarty: the PHP compiling template engine
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 3.0 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU Lesser General Public License below for more details.
|
||||
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
|
||||
This version of the GNU Lesser General Public License incorporates
|
||||
the terms and conditions of version 3 of the GNU General Public
|
||||
License, supplemented by the additional permissions listed below.
|
||||
|
||||
0. Additional Definitions.
|
||||
|
||||
As used herein, "this License" refers to version 3 of the GNU Lesser
|
||||
General Public License, and the "GNU GPL" refers to version 3 of the GNU
|
||||
General Public License.
|
||||
|
||||
"The Library" refers to a covered work governed by this License,
|
||||
other than an Application or a Combined Work as defined below.
|
||||
|
||||
An "Application" is any work that makes use of an interface provided
|
||||
by the Library, but which is not otherwise based on the Library.
|
||||
Defining a subclass of a class defined by the Library is deemed a mode
|
||||
of using an interface provided by the Library.
|
||||
|
||||
A "Combined Work" is a work produced by combining or linking an
|
||||
Application with the Library. The particular version of the Library
|
||||
with which the Combined Work was made is also called the "Linked
|
||||
Version".
|
||||
|
||||
The "Minimal Corresponding Source" for a Combined Work means the
|
||||
Corresponding Source for the Combined Work, excluding any source code
|
||||
for portions of the Combined Work that, considered in isolation, are
|
||||
based on the Application, and not on the Linked Version.
|
||||
|
||||
The "Corresponding Application Code" for a Combined Work means the
|
||||
object code and/or source code for the Application, including any data
|
||||
and utility programs needed for reproducing the Combined Work from the
|
||||
Application, but excluding the System Libraries of the Combined Work.
|
||||
|
||||
1. Exception to Section 3 of the GNU GPL.
|
||||
|
||||
You may convey a covered work under sections 3 and 4 of this License
|
||||
without being bound by section 3 of the GNU GPL.
|
||||
|
||||
2. Conveying Modified Versions.
|
||||
|
||||
If you modify a copy of the Library, and, in your modifications, a
|
||||
facility refers to a function or data to be supplied by an Application
|
||||
that uses the facility (other than as an argument passed when the
|
||||
facility is invoked), then you may convey a copy of the modified
|
||||
version:
|
||||
|
||||
a) under this License, provided that you make a good faith effort to
|
||||
ensure that, in the event an Application does not supply the
|
||||
function or data, the facility still operates, and performs
|
||||
whatever part of its purpose remains meaningful, or
|
||||
|
||||
b) under the GNU GPL, with none of the additional permissions of
|
||||
this License applicable to that copy.
|
||||
|
||||
3. Object Code Incorporating Material from Library Header Files.
|
||||
|
||||
The object code form of an Application may incorporate material from
|
||||
a header file that is part of the Library. You may convey such object
|
||||
code under terms of your choice, provided that, if the incorporated
|
||||
material is not limited to numerical parameters, data structure
|
||||
layouts and accessors, or small macros, inline functions and templates
|
||||
(ten or fewer lines in length), you do both of the following:
|
||||
|
||||
a) Give prominent notice with each copy of the object code that the
|
||||
Library is used in it and that the Library and its use are
|
||||
covered by this License.
|
||||
|
||||
b) Accompany the object code with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
4. Combined Works.
|
||||
|
||||
You may convey a Combined Work under terms of your choice that,
|
||||
taken together, effectively do not restrict modification of the
|
||||
portions of the Library contained in the Combined Work and reverse
|
||||
engineering for debugging such modifications, if you also do each of
|
||||
the following:
|
||||
|
||||
a) Give prominent notice with each copy of the Combined Work that
|
||||
the Library is used in it and that the Library and its use are
|
||||
covered by this License.
|
||||
|
||||
b) Accompany the Combined Work with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
c) For a Combined Work that displays copyright notices during
|
||||
execution, include the copyright notice for the Library among
|
||||
these notices, as well as a reference directing the user to the
|
||||
copies of the GNU GPL and this license document.
|
||||
|
||||
d) Do one of the following:
|
||||
|
||||
0) Convey the Minimal Corresponding Source under the terms of this
|
||||
License, and the Corresponding Application Code in a form
|
||||
suitable for, and under terms that permit, the user to
|
||||
recombine or relink the Application with a modified version of
|
||||
the Linked Version to produce a modified Combined Work, in the
|
||||
manner specified by section 6 of the GNU GPL for conveying
|
||||
Corresponding Source.
|
||||
|
||||
1) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (a) uses at run time
|
||||
a copy of the Library already present on the user's computer
|
||||
system, and (b) will operate properly with a modified version
|
||||
of the Library that is interface-compatible with the Linked
|
||||
Version.
|
||||
|
||||
e) Provide Installation Information, but only if you would otherwise
|
||||
be required to provide such information under section 6 of the
|
||||
GNU GPL, and only to the extent that such information is
|
||||
necessary to install and execute a modified version of the
|
||||
Combined Work produced by recombining or relinking the
|
||||
Application with a modified version of the Linked Version. (If
|
||||
you use option 4d0, the Installation Information must accompany
|
||||
the Minimal Corresponding Source and Corresponding Application
|
||||
Code. If you use option 4d1, you must provide the Installation
|
||||
Information in the manner specified by section 6 of the GNU GPL
|
||||
for conveying Corresponding Source.)
|
||||
|
||||
5. Combined Libraries.
|
||||
|
||||
You may place library facilities that are a work based on the
|
||||
Library side by side in a single library together with other library
|
||||
facilities that are not Applications and are not covered by this
|
||||
License, and convey such a combined library under terms of your
|
||||
choice, if you do both of the following:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work based
|
||||
on the Library, uncombined with any other library facilities,
|
||||
conveyed under the terms of this License.
|
||||
|
||||
b) Give prominent notice with the combined library that part of it
|
||||
is a work based on the Library, and explaining where to find the
|
||||
accompanying uncombined form of the same work.
|
||||
|
||||
6. Revised Versions of the GNU Lesser General Public License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions
|
||||
of the GNU Lesser General Public License from time to time. Such new
|
||||
versions will be similar in spirit to the present version, but may
|
||||
differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Library as you received it specifies that a certain numbered version
|
||||
of the GNU Lesser General Public License "or any later version"
|
||||
applies to it, you have the option of following the terms and
|
||||
conditions either of that published version or of any later version
|
||||
published by the Free Software Foundation. If the Library as you
|
||||
received it does not specify a version number of the GNU Lesser
|
||||
General Public License, you may choose any version of the GNU Lesser
|
||||
General Public License ever published by the Free Software Foundation.
|
||||
|
||||
If the Library as you received it specifies that a proxy can decide
|
||||
whether future versions of the GNU Lesser General Public License shall
|
||||
apply, that proxy's public statement of acceptance of any version is
|
||||
permanent authorization for you to choose that version for the
|
||||
Library.
|
||||
+103
@@ -0,0 +1,103 @@
|
||||
This is a simple guide to get Smarty setup and running quickly. The online
|
||||
documentation includes a very thorough explanation of a Smarty installation.
|
||||
This guide is meant to be a quick and painless way of getting Smarty working,
|
||||
and nothing more. The guide assumes you are familiar with the UNIX system
|
||||
environment. Windows users will need to make adjustments where necessary.
|
||||
|
||||
INSTALL SMARTY LIBRARY FILES
|
||||
|
||||
Copy the Smarty library files to your system. In our example, we place them in
|
||||
/usr/local/lib/php/Smarty/
|
||||
|
||||
$> cd YOUR_DOWNLOAD_DIRECTORY
|
||||
$> gtar -ztvf Smarty-2.x.y.tar.gz
|
||||
$> mkdir /usr/local/lib/php/Smarty
|
||||
$> cp -r Smarty-2.x.y/libs/* /usr/local/lib/php/Smarty
|
||||
|
||||
You should now have the following file structure:
|
||||
|
||||
/usr/local/lib/php/Smarty/
|
||||
Config_File.class.php
|
||||
debug.tpl
|
||||
internals/
|
||||
plugins/
|
||||
Smarty.class.php
|
||||
Smarty_Compiler.class.php
|
||||
|
||||
|
||||
SETUP SMARTY DIRECTORIES
|
||||
|
||||
You will need four directories setup for Smarty to work. These files are for
|
||||
templates, compiled templates, cached templates and config files. You may or
|
||||
may not use caching or config files, but it is a good idea to set them up
|
||||
anyways. It is also recommended to place them outside of the web server
|
||||
document root. The web server PHP user will need write access to the cache and
|
||||
compile directories as well.
|
||||
|
||||
In our example, the document root is /web/www.domain.com/docs and the
|
||||
web server username is "nobody". We will keep our Smarty files under
|
||||
/web/www.domain.com/smarty
|
||||
|
||||
$> cd /web/www.domain.com
|
||||
$> mkdir smarty
|
||||
$> mkdir smarty/templates
|
||||
$> mkdir smarty/templates_c
|
||||
$> mkdir smarty/cache
|
||||
$> mkdir smarty/configs
|
||||
$> chown nobody:nobody smarty/templates_c
|
||||
$> chown nobody:nobody smarty/cache
|
||||
$> chmod 775 smarty/templates_c
|
||||
$> chmod 775 smarty/cache
|
||||
|
||||
|
||||
SETUP SMARTY PHP SCRIPTS
|
||||
|
||||
Now we setup our application in the document root:
|
||||
|
||||
$> cd /web/www.domain.com/docs
|
||||
$> mkdir myapp
|
||||
$> cd myapp
|
||||
$> vi index.php
|
||||
|
||||
Edit the index.php file to look like the following:
|
||||
|
||||
<?php
|
||||
|
||||
// put full path to Smarty.class.php
|
||||
require('/usr/local/lib/php/Smarty/Smarty.class.php');
|
||||
$smarty = new Smarty();
|
||||
|
||||
$smarty->template_dir = '/web/www.domain.com/smarty/templates';
|
||||
$smarty->compile_dir = '/web/www.domain.com/smarty/templates_c';
|
||||
$smarty->cache_dir = '/web/www.domain.com/smarty/cache';
|
||||
$smarty->config_dir = '/web/www.domain.com/smarty/configs';
|
||||
|
||||
$smarty->assign('name', 'Ned');
|
||||
$smarty->display('index.tpl');
|
||||
|
||||
?>
|
||||
|
||||
|
||||
SETUP SMARTY TEMPLATE
|
||||
|
||||
$> vi /web/www.domain.com/smarty/templates/index.tpl
|
||||
|
||||
Edit the index.tpl file with the following:
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>Smarty</title>
|
||||
</head>
|
||||
<body>
|
||||
Hello, {$name}!
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
Now go to your new application through the web browser,
|
||||
http://www.domain.com/myapp/index.php in our example. You should see the text
|
||||
"Hello Ned!" in your browser.
|
||||
|
||||
Once you get this far, you can continue on to the Smarty Crash Course to learn
|
||||
a few more simple things, or on to the documentation to learn it all.
|
||||
@@ -0,0 +1,84 @@
|
||||
|
||||
NAME:
|
||||
|
||||
Smarty - the PHP compiling template engine
|
||||
|
||||
AUTHORS:
|
||||
|
||||
Monte Ohrt <monte at ohrt dot com>
|
||||
Andrei Zmievski <andrei@php.net>
|
||||
|
||||
MAILING LISTS:
|
||||
|
||||
We have a few mailing lists. "discussion" for you to share your ideas or ask
|
||||
questions, "developers" for those interested in the development efforts of Smarty,
|
||||
and "svn" for those that would like to track the updates made in the svn
|
||||
repository.
|
||||
|
||||
send a blank e-mail message to:
|
||||
smarty-discussion-subscribe@googlecode.com(subscribe to the general discussion list)
|
||||
smarty-discussion-unsubscribe@googlecode.com (unsubscribe from the general discussion list)
|
||||
smarty-discussion-digest-subscribe@googlecode.com (subscribe to digest)
|
||||
smarty-discussion-digest-unsubscribe@googlecode.com (unsubscribe from digest)
|
||||
smarty-developers-subscribe@googlecode.com (subscribe to the dev list)
|
||||
smarty-developers-unsubscribe@googlecode.com (unsubscribe from the dev list)
|
||||
smarty-svn-subscribe@googlecode.com (subscribe to the svn list)
|
||||
smarty-svn-unsubscribe@googlecode.com (unsubscribe from the svn list)
|
||||
|
||||
You can also browse the mailing list archives at
|
||||
http://groups.google.com/group/smarty-discussion
|
||||
http://groups.google.com/group/smarty-developers
|
||||
|
||||
and the OLD list archives at
|
||||
http://marc.theaimsgroup.com/?l=smarty&r=1&w=2
|
||||
|
||||
SYNOPSIS:
|
||||
|
||||
require("Smarty.class.php");
|
||||
|
||||
$smarty = new Smarty;
|
||||
|
||||
$smarty->assign("Title","My Homepage");
|
||||
$smarty->assign("Names",array("John","Gary","Gregg","James"));
|
||||
|
||||
$smarty->display("index.tpl");
|
||||
|
||||
|
||||
DESCRIPTION:
|
||||
|
||||
What is Smarty?
|
||||
|
||||
Smarty is a template engine for PHP. Many other template engines for PHP
|
||||
provide basic variable substitution and dynamic block functionality.
|
||||
Smarty takes a step further to be a "smart" template engine, adding
|
||||
features such as configuration files, template functions, and variable
|
||||
modifiers, and making all of this functionality as easy as possible to
|
||||
use for both programmers and template designers. Smarty also converts
|
||||
the templates into PHP scripts, eliminating the need to parse the
|
||||
templates on every invocation. This makes Smarty extremely scalable and
|
||||
manageable for large application needs.
|
||||
|
||||
Some of Smarty's features:
|
||||
|
||||
* it is extremely fast
|
||||
* no template parsing overhead, only compiles once.
|
||||
* it is smart about recompiling only the template files that have
|
||||
changed.
|
||||
* the template language is remarkably extensible via the plugin
|
||||
architecture.
|
||||
* configurable template delimiter tag syntax, so you can use
|
||||
{}, {{}}, <!--{}-->, or whatever you like.
|
||||
* built-in caching of template output.
|
||||
* arbitrary template sources (filesystem, databases, etc.)
|
||||
* template if/elseif/else/endif constructs are passed to the PHP parser,
|
||||
so the if syntax can be as simple or as complex as you like.
|
||||
* unlimited nesting of sections, conditionals, etc. allowed
|
||||
* it is possible to embed PHP code right in your template files,
|
||||
although not recommended and doubtfully needed since the engine
|
||||
is so customizable.
|
||||
* and many more.
|
||||
|
||||
COPYRIGHT:
|
||||
Copyright (c) 2001-2005 New Digital Group, Inc. All rights reserved.
|
||||
This software is released under the GNU Lesser General Public License.
|
||||
Please read the disclaimer at the top of the Smarty.class.php file.
|
||||
@@ -1,20 +1,17 @@
|
||||
# Smarty template engine
|
||||
Smarty is a template engine for PHP, facilitating the separation of presentation (HTML/CSS) from application logic.
|
||||
# Smarty 2 template engine
|
||||
## Distribution repository
|
||||
Starting with Smarty 2.6.23 Composer has been configured to load the packages from github.
|
||||
|
||||
**NOTE: Because of this change you must clear your local composer cache with the "composer clearcache" command**
|
||||
|
||||

|
||||
To get the latest v2.6 release use
|
||||
|
||||
## Documentation
|
||||
Read the [documentation](https://smarty-php.github.io/smarty/) to find out how to use it.
|
||||
"require": {
|
||||
"smarty/smarty": "~2.6"
|
||||
}
|
||||
|
||||
## Requirements
|
||||
Smarty can be run with PHP 7.1 to PHP 8.1.
|
||||
in your composer.json file.
|
||||
|
||||
The "smarty/smarty" package will start at libs/.... subfolder.
|
||||
|
||||
## Installation
|
||||
Smarty versions 3.1.11 or later can be installed with [Composer](https://getcomposer.org/).
|
||||
|
||||
To get the latest stable version of Smarty use:
|
||||
```bash
|
||||
composer require smarty/smarty
|
||||
````
|
||||
|
||||
More in the [Getting Started](./docs/getting-started.md) section of the docs.
|
||||
|
||||
+428
@@ -0,0 +1,428 @@
|
||||
2.6.7
|
||||
-----
|
||||
|
||||
Those using Smarty with security enabled: a hole was found that allowed PHP code to be executed from within a template file. This has been fixed and you are engouraged to upgrade immediately. Note that this hole does NOT affect the security of your web server or PHP applications, only the ability for someone editing a template to execute PHP code. Other changes in this release can be found in the NEWS file.
|
||||
|
||||
2.5.0
|
||||
-----
|
||||
|
||||
Very minor adjustments since RC2, see the NEWS file for details.
|
||||
|
||||
2.5.0-RC2
|
||||
---------
|
||||
|
||||
Many fixes since the RC1 release. This one is as close to production quality as
|
||||
they come, so this will be the last release before 2.5.0. The SGML documentation
|
||||
files have also been removed from the tarball. If you want them, get them from
|
||||
the CVS repository.
|
||||
|
||||
2.5.0-RC1
|
||||
---------
|
||||
|
||||
Release Candidate 1. All $smarty vars can now be dynamic, such as
|
||||
$smarty.get.$foo. A new class function get_function_object() gets you a
|
||||
reference to an assigned object, useful within your own custom functions.
|
||||
append() can now merge as well as append with a third optional attribute. A new
|
||||
class function get_config_vars() was added, and get_template_vars() can now be
|
||||
used to get individual vars. Full variable syntax is now supported within
|
||||
double quotes via a backtick (`) syntax. Files created by smarty are now
|
||||
written to a tmp file then renamed to avoid file lock retention. html_radios,
|
||||
html_checkboxes, html_table, html_image, nl2br functions added, see the NEWS
|
||||
file for full details.
|
||||
|
||||
2.4.2
|
||||
-----
|
||||
Another point release. Added support for dynamic object reference syntax
|
||||
($foo->$bar), support for full variable syntax within quotes ("$foo[0].bar"),
|
||||
and other minor fixes. See the NEWS file for full details.
|
||||
|
||||
2.4.1
|
||||
-----
|
||||
|
||||
This is basically a point release, cleaning up a few things caught
|
||||
in the 2.4.0 release. See the NEWS file for full details.
|
||||
|
||||
2.4.0
|
||||
-----
|
||||
|
||||
Smarty now supports the ability to access objects within the templates. Two
|
||||
methods are available, one which closely follows Smartys conventions, and
|
||||
another that follows more traditional object syntax for those familiar with
|
||||
PHP.
|
||||
|
||||
The internal compiling engine has also undergone some major work. The regex
|
||||
parsing was rewritten to be much more strict, more secure and more
|
||||
maintainable. Config files are now compiled, which can speed up pages quite a
|
||||
bit that use config files extensively. Assigned variables are no longer
|
||||
extracted to PHP namespace, saving an extract call for every template. There is
|
||||
now support for applying modifiers to static values and functions. You can now
|
||||
access constants with $smarty.const.VAR. See the NEWS file for complete
|
||||
changes.
|
||||
|
||||
2.3.1
|
||||
-----
|
||||
|
||||
The mtime on compiled files will now match the source files, in the case where
|
||||
the source file may not get the current timestamp, recompiling will still work
|
||||
as expected. Proper support for open_basedir has been added, so Smarty should
|
||||
work correctly in safe mode. Added a few new features such as textformat block
|
||||
function, strip variable modifier and optgroup support for html_options. Also
|
||||
other minor bug fixes, see the Change Log.
|
||||
|
||||
2.3.0
|
||||
-----
|
||||
|
||||
Smarty now has a {debug} template function that brings up the debugging console
|
||||
right where {debug} is called, regardless of $debugging settings. This works a
|
||||
little different than turning on $debugging in the sense that it shows all the
|
||||
template variables available at the time {debug} is called, including local
|
||||
scope vars. It does not show the templates names however, since this
|
||||
executed during runtime of the template.
|
||||
|
||||
You can now supply an expire time when clearing cache or compile files. This is
|
||||
mostly useful for removing stale files via the API.
|
||||
|
||||
Plugins now stop execution upon error, instead of outputting a warning and
|
||||
continuing.
|
||||
|
||||
Two new API functions, assign_by_ref() and append_by_ref() were added. They
|
||||
allow assigning template variables by reference. This can make a significant
|
||||
performance gain, especially if you are assigning large arrays of data. PHP 5.0
|
||||
will do this implicitly, so these functions are basically workarounds.
|
||||
|
||||
Several misc bug fixes, see the Change Log for information.
|
||||
|
||||
|
||||
2.2.0
|
||||
-----
|
||||
|
||||
Smarty now allows an array of paths for the $plugin_dir class variable. The
|
||||
directories will be searched in the order they are given, so for efficiency keep
|
||||
the most-used plugins at the top. Also, absolute paths to the plugin directories are
|
||||
more efficient than relying on the PHP include_path.
|
||||
|
||||
Cache files can now be grouped with the cache_id. See the documentation under
|
||||
the new "Caching" section for details. compile_id also respects the same
|
||||
grouping syntax. The cache/compile file structure changed, so be sure to clear
|
||||
out all your cache and compile files when upgrading Smarty. Also if you are
|
||||
using PHP-accelerator, restart apache. I've seen some quirky things happen if
|
||||
the phpa files do not get cleared (known issue with phpa and parent
|
||||
class-member changes, so just clear 'em.)
|
||||
|
||||
Smarty now correctly respects the PHP include_path for $template_dir, $compile_dir,
|
||||
$cache_dir, $config_dir and $plugin_dir. Be aware that relying on the
|
||||
include_path is an overhead, try to use absolute pathnames when possible
|
||||
(or relative to working directory.)
|
||||
|
||||
Documentation has been updated and rearranged a bit. Most notably, the
|
||||
installation instructions are completely revamped, and a new Caching section
|
||||
explains Smarty's caching in detail along with the new grouping functionality.
|
||||
|
||||
Many misc. bug fixes and enhancements, see the full ChangeLog (NEWS file) for
|
||||
details.
|
||||
|
||||
2.1.1
|
||||
-----
|
||||
|
||||
There was a bug with template paths and the include_path, this has been fixed.
|
||||
Also register_outputfilter() did not work, this is fixed. A new template
|
||||
function named "cycle" has been added to the distribution, nice for cycling
|
||||
through a list (or array) of values.
|
||||
|
||||
2.1.0
|
||||
-----
|
||||
|
||||
This release has quite a few new features and fixes. Most notable are the
|
||||
introduction of block functions, so you can write plugins that work on a block
|
||||
of text with {func}{/func} notation. Also output filters were added, so you can
|
||||
apply a function against the output of your templates. This differs from the
|
||||
postfilter function, which works on the compiled template at compile time, and
|
||||
output filters work on the template output at runtime.
|
||||
|
||||
Many other features and bug fixes are noted in the NEWS file.
|
||||
|
||||
|
||||
2.0.1
|
||||
-----
|
||||
|
||||
This is a point release, fixing a few bugs and cleaning things up. A plugin
|
||||
was renamed, the dash "-" was removed from compiled template and cached file
|
||||
names. If you're upgrading, you might want to clear them out first. See the
|
||||
ChangeLog for details.
|
||||
|
||||
2.0.0
|
||||
-----
|
||||
|
||||
This release is a huge milestone for Smarty. Most notable new things are a
|
||||
plugin architecture, removal of PEAR dependency, and optimizations that
|
||||
drastically improve the performance of Smarty in most cases.
|
||||
|
||||
The plugin architecture allows modifiers, custom functions, compiler functions,
|
||||
prefilters, postfilters, resources, and insert functions to be added by
|
||||
simply dropping a file into the plugins directory. Once dropped in, they are
|
||||
automatically registered by the template engine. This makes user-contributed
|
||||
plugins easy to manage, as well as the internal workings of Smarty easy to
|
||||
control and customize. This new architecture depends on the __FILE__ constant,
|
||||
which contains the full path to the executing script. Some older versions of
|
||||
PHP incorrectly gave the script name and not the full filesystem path. Be sure
|
||||
your version of PHP populates __FILE__ correctly. If you use custom template
|
||||
resource functions, the format of these changed with the plugin architecture.
|
||||
Be sure to update your functions accordingly. See the template resource section
|
||||
of the documentation.
|
||||
|
||||
The PEAR dependancy was removed from Smarty. The Config_File class that comes
|
||||
with Smarty was actually what needed PEAR for error handling which Smarty didn't
|
||||
use, but now everything is self-contained.
|
||||
|
||||
Performance improvements are graphed on the benchmark page, you will see that
|
||||
overall performance has been sped up by as much as 80% in some cases.
|
||||
|
||||
Smarty-cached pages now support If-Modified-Since headers, meaning that if a
|
||||
cached template page has not changed since the last request, a "304 Not
|
||||
Modified" header will be sent instead of resending the same page. This is
|
||||
disabled by default, change the setting of $cache_modified_check.
|
||||
|
||||
|
||||
1.5.2
|
||||
-----
|
||||
|
||||
Mostly bug fixes, added a default template resource handler.
|
||||
|
||||
|
||||
1.5.1
|
||||
-----
|
||||
|
||||
Critical bug fix release. If you use caching, you'll need to upgrade.
|
||||
|
||||
|
||||
1.5.0
|
||||
-----
|
||||
|
||||
Several feature enhancements were made to this version, most notably the
|
||||
{foreach ...} command which is an alternative to {section ...} with an easier
|
||||
syntax for looping through a single array of values. Several functions were
|
||||
enhanced so that the output can be automatically assigned to a template
|
||||
variable instead of displayed (assign attribute). Cache files can now be
|
||||
controlled with a custom function as an alternative to the built-in file based
|
||||
method. Many code cleanups and bug fixed went into this release as well.
|
||||
|
||||
|
||||
1.4.6
|
||||
-----
|
||||
|
||||
The behavior with caching and compile_check has been slightly enhanced. If
|
||||
caching is enabled AND compile_check is enabled, the cache will immediately get
|
||||
regenerated if _any_ involved template or config file is updated. This imposes
|
||||
a slight performance hit because it must check all the files for changes, so be
|
||||
sure to run live sites with caching enabled and compile_check disabled for best
|
||||
performance. If you update a template or config file, simply turn on
|
||||
compile_check, load the page, then turn it back off. This will update the cache
|
||||
file with the new content. This is accomplished by maintaining a list of
|
||||
included/loaded templates and config files at the beginning of the cache file.
|
||||
Therefore it is advisable to remove all cache files after upgrading to 1.4.6
|
||||
(although not absolutely necessary, old cache files will regenerate)
|
||||
|
||||
The debug console now has script timing and array values printed. You MUST
|
||||
update your debug.tpl file with this version of Smarty. Also, the new debug.tpl
|
||||
will not work with older versions of Smarty.
|
||||
|
||||
|
||||
1.4.5
|
||||
-----
|
||||
|
||||
Mostly bug fixes and minor improvements. Added compile id for separate compiled
|
||||
versions of the same script. The directory format and filename convention for
|
||||
the files in templates_c has changed, so you may want to remove all of the
|
||||
existing ones before you upgrade.
|
||||
|
||||
|
||||
1.4.4
|
||||
-----
|
||||
|
||||
A few bug fixes, new section looping attributes and properties, debugging
|
||||
console function for control via URL, and overLib integration and access
|
||||
to request variables from within the template.
|
||||
|
||||
|
||||
1.4.3
|
||||
-----
|
||||
|
||||
This release has a few bug fixes and several enhancements. Smarty now supports
|
||||
template security for third-party template editing. These features disallow the
|
||||
ability for someone to execute commands or PHP code from the template language.
|
||||
Smarty also now has a built-in debugging console, which is a javascript pop-up
|
||||
window that displays all the included template names and assigned variables.
|
||||
|
||||
|
||||
1.4.2
|
||||
-----
|
||||
|
||||
This was mostly one bug fix with variable scoping within included templates
|
||||
and a few documentation changes and updates. See the ChangeLog file for full
|
||||
details.
|
||||
|
||||
|
||||
1.4.1
|
||||
-----
|
||||
|
||||
It seems that the EX_LOCK logic from the previous release didn't fix all the
|
||||
problems with windows platforms. Hopefully this one does. It basically
|
||||
disables file locking on windows, so there is a potential that two programs
|
||||
could write over the same file at the same time, fyi.
|
||||
|
||||
The reset is minor bug fixes, please refer to the ChangeLog file.
|
||||
|
||||
|
||||
1.4.0
|
||||
-----
|
||||
|
||||
IMPORTANT NOTICE
|
||||
|
||||
Smarty now has a new syntax for accessing elements within section loops. The
|
||||
new syntax is easier to use and nicely handles data structures of any
|
||||
complexity. Consequently, this breaks the old syntax.
|
||||
|
||||
Here is an example of the syntax change:
|
||||
|
||||
old syntax:
|
||||
{$sec1/sec2/sec3/customer.phone}
|
||||
|
||||
new syntax:
|
||||
{$customer[$sec1][$sec2][$sec3].phone}
|
||||
|
||||
The section names used to come first, followed by the variable name. Now the
|
||||
variable name always comes first, followed by the section names in brackets.
|
||||
You can access variable indexes anywhere, depending on how you passed the
|
||||
variables in.
|
||||
|
||||
To fix your current templates, we have provided a script that will adjust the
|
||||
syntax for you. Located in misc/fix_vars.php, run this script from the the
|
||||
command line, giving each template as an argument. Be sure to use absolute
|
||||
pathnames, or pathnames relative to the executing script. Probably the easiest
|
||||
way to do this is to copy the fix_vars.php script into your template directory
|
||||
and run 'php -q fix_vars.php *.tpl' Be sure you have proper write permission,
|
||||
and backup your scripts first to be safe! The examples in the 1.4.0
|
||||
documentation have been updated to reflect the changes.
|
||||
|
||||
cd /path/to/templates
|
||||
cp /path/to/fix_vars.php .
|
||||
find . -name "*.tpl" -exec php -q ./fix_vars.php {} \;
|
||||
|
||||
NEW AND IMPROVED COMPILATION PROCESS
|
||||
|
||||
Smarty 1.4.0 also has a new compilation process. Instead of compiling all the
|
||||
templates up front, it now compiles them at runtime. This has several
|
||||
advantages. First of all, there is no longer a need to have a single template
|
||||
directory. You can now have arbitrary template sources, such as multiple
|
||||
directories or even database calls. This also speeds the performance of Smarty
|
||||
when $compile_check is enabled, since it is only checking the template that is
|
||||
being executed instead of everything found in the template directory. The
|
||||
$tpl_file_ext is no longer needed, but kept for backward compatability.
|
||||
Templates can now be named anything you like with any extension.
|
||||
|
||||
MINOR FIXES
|
||||
|
||||
A workaround for LOCK_EX on Windows systems was added, and changed a couple of
|
||||
file permissions for better security on public servers.
|
||||
|
||||
$show_info_header is now defaulted to false instead of true. This header causes
|
||||
problems when displaying content other than HTML, so now you must explicitly
|
||||
set this flag to true to show the header information (or change the default in
|
||||
your copy of Smarty.)
|
||||
|
||||
Documentation is written in docbook format. I updated the docbook -> HTML
|
||||
generating software & style-sheets, and consequently the examples are no longer
|
||||
in a different background color. If anyone wants to contribute a better
|
||||
stylesheet or help with documentation, drop me a line. <monte at ohrt dot com>
|
||||
|
||||
CHANGES/ENHANCEMENTS/UPDATES
|
||||
|
||||
date_format, html_select_date and html_select_time used to require a unix
|
||||
timestamp as the format of the date passed into the template. Smarty is now a
|
||||
bit smarter at this. It will take a unix timestamp, a mysql timestamp, or any
|
||||
date string that is parsable by strtotime, such as 10/01/2001 or 2001-10-01,
|
||||
etc. Just give some formats a try and see what works.
|
||||
|
||||
Smarty now has template prefilters, meaning that you can run your templates
|
||||
through custom functions before they are compiled. This is good for things like
|
||||
removing unwanted comments, keeping an eye on words or functionality people are
|
||||
putting in templates, translating XML -> HTML, etc. See the register_prefilter
|
||||
documentation for more info.
|
||||
|
||||
Another addition are the so-called compiler functions. These are custom
|
||||
functions registered by the user that are executed at compilation time of the
|
||||
template. They can be used to inject PHP code or time-sensitive static content
|
||||
into the compiled template.
|
||||
|
||||
The run-time custom functions are now passed the Smarty object as the second
|
||||
parameter. This can be used, for example, to assign or clear template variables
|
||||
from inside the custom function.
|
||||
|
||||
clear_compile_dir() was added for clearing out compiled versions of your
|
||||
templates. Not something normally needed, but you may have a need for this if
|
||||
you have $compile_check set to false and you periodically update templates via
|
||||
some automated process. As of 1.4.0, uncompiled templates _always_ get
|
||||
compiled regardless of $compile_check setting, although they won't be checked
|
||||
for recompile if $compile_check is set to false.
|
||||
|
||||
You can now refer to properties of objects assigned from PHP by using the '->'
|
||||
symbol and specifying the property name after it, e.g. $foo->bar.
|
||||
|
||||
{php}{/php} tags were added to embed php into the templates. Not normally
|
||||
needed, but some circumstances may call for it. Check out the "componentized
|
||||
templates" tip in the documentation for an example.
|
||||
|
||||
{capture}{/capture} and {counter} functions were added. See the documentation
|
||||
for a complete description and examples.
|
||||
|
||||
UPGRADE NOTES
|
||||
|
||||
The format of the files created in the $compile_dir are now a bit different.
|
||||
The compiled template filename is the template resource name url-encoded.
|
||||
Therefore, all compiled files are now in the top directory of $compile_dir.
|
||||
This was done to make way for arbitrary template resources. Each compiled
|
||||
template also has a header that states what template resource was used to
|
||||
create it. From a unix command prompt, you can use "head -2 *" to see the first
|
||||
two lines of each file.
|
||||
|
||||
When upgrading to 1.4.0, you will want to clear out all your old files in the
|
||||
$compile_dir. If you have $compile_check set to false and the compiled template
|
||||
does not yet exist, it will compile it regardless of this setting. This way you
|
||||
can clear out the $compile_dir and not worry about setting $compile_check to
|
||||
true to get the inital compilation under way.
|
||||
|
||||
|
||||
1.3.2
|
||||
-----
|
||||
|
||||
Smarty now has (an optional) header prepended to the output of the Smarty
|
||||
templates. This displays the Smarty version and the date/time when the page was
|
||||
generated. This is useful for debugging your cache routines, and purely
|
||||
informational so there is evidence that the page was generated by Smarty. Set
|
||||
$show_info_header to false to disable it.
|
||||
|
||||
{config_load ...} performance was tuned by placing the loaded variables into a
|
||||
global array, so basically a config file is read from the file system and
|
||||
placed into a php array structure only once, no matter how many times it is
|
||||
called in any of the templates. The scope of the loaded variables has changed a
|
||||
bit as well. Variables loaded by config_load used to be treated as global
|
||||
variables, meaning that parent templates (templates that included the current
|
||||
template) could see them. Now the default behavior is such that loaded
|
||||
variables are only visible by the current template and child templates (all
|
||||
templates included after the {config_load ...} is called.) To mimic the
|
||||
original behavior, provide the attribute "global=yes" like so: {config_load
|
||||
file="mystuff.conf" global=yes}. Now when you load in mystuff.conf, the
|
||||
variables will be visible to parent templates (merged with any existing config
|
||||
variables.)
|
||||
|
||||
A formatting attribute was added to the {math ...} function, adding the ability
|
||||
to control the format of the output. Use the same formatting syntax as the PHP
|
||||
function sprintf().
|
||||
|
||||
{html_select_time ...} was added, a custom function that works much like
|
||||
{html_select_date ...} except it displays time elements instead of dates.
|
||||
|
||||
A few custom modifiers were added: count_characters, count_words,
|
||||
count_sentences, count_paragraphs. All pretty self-explanatory.
|
||||
|
||||
/* vim: set et: */
|
||||
-19
@@ -1,19 +0,0 @@
|
||||
# Security Policy
|
||||
|
||||
## Supported Versions
|
||||
|
||||
Smarty currently supports the latest minor version of Smarty 3 and Smarty 4. (Smarty 4 has not been released yet.)
|
||||
|
||||
| Version | Supported |
|
||||
| ------- | ------------------ |
|
||||
| 4.0.x | :white_check_mark: |
|
||||
| 3.1.x | :white_check_mark: |
|
||||
| < 3.1 | :x: |
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
If you have discovered a security issue with Smarty, please contact us at mail [at] simonwisselink.nl. Do not
|
||||
disclose your findings publicly and PLEASE PLEASE do not file an Issue.
|
||||
|
||||
We will try to confirm the vulnerability and develop a fix if appropriate. When we release the fix, we will publish
|
||||
a security release. Please let us know if you want to be credited.
|
||||
@@ -0,0 +1,10 @@
|
||||
* handle asp style tags in $php_handler
|
||||
* fix all E_NOTICE warnings
|
||||
* make simple math easier
|
||||
* caching all but parts of the template
|
||||
* change plugins so $smarty variable always comes first
|
||||
* get cache ttl with function call
|
||||
FIX: make inserts use normal functions before plugins
|
||||
UPD: change it so that if template comes from some resource,
|
||||
that resource stays as the default, no need to specify it
|
||||
in includes.
|
||||
+9
-25
@@ -2,10 +2,8 @@
|
||||
"name": "smarty/smarty",
|
||||
"type": "library",
|
||||
"description": "Smarty - the compiling PHP template engine",
|
||||
"keywords": [
|
||||
"templating"
|
||||
],
|
||||
"homepage": "https://smarty-php.github.io/smarty/",
|
||||
"keywords": ["templating"],
|
||||
"homepage": "http://www.smarty.net",
|
||||
"license": "LGPL-3.0",
|
||||
"authors": [
|
||||
{
|
||||
@@ -15,35 +13,21 @@
|
||||
{
|
||||
"name": "Uwe Tews",
|
||||
"email": "uwe.tews@googlemail.com"
|
||||
},
|
||||
{
|
||||
"name": "Rodney Rehm",
|
||||
"email": "rodney.rehm@medialize.de"
|
||||
},
|
||||
{
|
||||
"name": "Simon Wisselink",
|
||||
"homepage": "https://www.iwink.nl/"
|
||||
}
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/smarty-php/smarty/issues",
|
||||
"forum": "https://github.com/smarty-php/smarty/discussions"
|
||||
"irc": "irc://irc.freenode.org/smarty",
|
||||
"issues": "http://code.google.com/p/smarty-php/issues/list",
|
||||
"forum": "http://www.smarty.net/forums/"
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.1 || ^8.0"
|
||||
"php": ">=5.2"
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"libs/"
|
||||
"libs/Smarty.class.php",
|
||||
"libs/Smarty_Compiler.class.php",
|
||||
"libs/Config_File.class.php"
|
||||
]
|
||||
},
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "4.0.x-dev"
|
||||
}
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^8.5 || ^7.5",
|
||||
"smarty/smarty-lexer": "^3.1"
|
||||
}
|
||||
}
|
||||
|
||||
+19
-29
@@ -1,35 +1,25 @@
|
||||
<?php
|
||||
/**
|
||||
* Example Application
|
||||
*
|
||||
* @package Example-application
|
||||
*/
|
||||
|
||||
require '../libs/Smarty.class.php';
|
||||
|
||||
$smarty = new Smarty;
|
||||
//$smarty->force_compile = true;
|
||||
|
||||
$smarty->compile_check = true;
|
||||
$smarty->debugging = true;
|
||||
$smarty->caching = true;
|
||||
$smarty->cache_lifetime = 120;
|
||||
$smarty->assign("Name", "Fred Irving Johnathan Bradley Peppergill", true);
|
||||
$smarty->assign("FirstName", array("John", "Mary", "James", "Henry"));
|
||||
$smarty->assign("LastName", array("Doe", "Smith", "Johnson", "Case"));
|
||||
$smarty->assign(
|
||||
"Class",
|
||||
array(
|
||||
array("A", "B", "C", "D"),
|
||||
array("E", "F", "G", "H"),
|
||||
array("I", "J", "K", "L"),
|
||||
array("M", "N", "O", "P")
|
||||
)
|
||||
);
|
||||
$smarty->assign(
|
||||
"contacts",
|
||||
array(
|
||||
array("phone" => "1", "fax" => "2", "cell" => "3"),
|
||||
array("phone" => "555-4444", "fax" => "555-3333", "cell" => "760-1234")
|
||||
)
|
||||
);
|
||||
$smarty->assign("option_values", array("NY", "NE", "KS", "IA", "OK", "TX"));
|
||||
$smarty->assign("option_output", array("New York", "Nebraska", "Kansas", "Iowa", "Oklahoma", "Texas"));
|
||||
|
||||
$smarty->assign("Name","Fred Irving Johnathan Bradley Peppergill");
|
||||
$smarty->assign("FirstName",array("John","Mary","James","Henry"));
|
||||
$smarty->assign("LastName",array("Doe","Smith","Johnson","Case"));
|
||||
$smarty->assign("Class",array(array("A","B","C","D"), array("E", "F", "G", "H"),
|
||||
array("I", "J", "K", "L"), array("M", "N", "O", "P")));
|
||||
|
||||
$smarty->assign("contacts", array(array("phone" => "1", "fax" => "2", "cell" => "3"),
|
||||
array("phone" => "555-4444", "fax" => "555-3333", "cell" => "760-1234")));
|
||||
|
||||
$smarty->assign("option_values", array("NY","NE","KS","IA","OK","TX"));
|
||||
$smarty->assign("option_output", array("New York","Nebraska","Kansas","Iowa","Oklahoma","Texas"));
|
||||
$smarty->assign("option_selected", "NE");
|
||||
|
||||
$smarty->display('index.tpl');
|
||||
|
||||
?>
|
||||
|
||||
@@ -1,85 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* APC CacheResource
|
||||
* CacheResource Implementation based on the KeyValueStore API to use
|
||||
* memcache as the storage resource for Smarty's output caching.
|
||||
* *
|
||||
*
|
||||
* @package CacheResource-examples
|
||||
* @author Uwe Tews
|
||||
*/
|
||||
class Smarty_CacheResource_Apc extends Smarty_CacheResource_KeyValueStore
|
||||
{
|
||||
/**
|
||||
* Smarty_CacheResource_Apc constructor.
|
||||
*
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
// test if APC is present
|
||||
if (!function_exists('apc_cache_info')) {
|
||||
throw new Exception('APC Template Caching Error: APC is not installed');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Read values for a set of keys from cache
|
||||
*
|
||||
* @param array $keys list of keys to fetch
|
||||
*
|
||||
* @return array list of values with the given keys used as indexes
|
||||
* @return boolean true on success, false on failure
|
||||
*/
|
||||
protected function read(array $keys)
|
||||
{
|
||||
$_res = array();
|
||||
$res = apc_fetch($keys);
|
||||
foreach ($res as $k => $v) {
|
||||
$_res[ $k ] = $v;
|
||||
}
|
||||
return $_res;
|
||||
}
|
||||
|
||||
/**
|
||||
* Save values for a set of keys to cache
|
||||
*
|
||||
* @param array $keys list of values to save
|
||||
* @param int $expire expiration time
|
||||
*
|
||||
* @return boolean true on success, false on failure
|
||||
*/
|
||||
protected function write(array $keys, $expire = null)
|
||||
{
|
||||
foreach ($keys as $k => $v) {
|
||||
apc_store($k, $v, $expire);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove values from cache
|
||||
*
|
||||
* @param array $keys list of keys to delete
|
||||
*
|
||||
* @return boolean true on success, false on failure
|
||||
*/
|
||||
protected function delete(array $keys)
|
||||
{
|
||||
foreach ($keys as $k) {
|
||||
apc_delete($k);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove *all* values from cache
|
||||
*
|
||||
* @return boolean true on success, false on failure
|
||||
*/
|
||||
protected function purge()
|
||||
{
|
||||
return apc_clear_cache('user');
|
||||
}
|
||||
}
|
||||
@@ -1,99 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Memcache CacheResource
|
||||
* CacheResource Implementation based on the KeyValueStore API to use
|
||||
* memcache as the storage resource for Smarty's output caching.
|
||||
* Note that memcache has a limitation of 256 characters per cache-key.
|
||||
* To avoid complications all cache-keys are translated to a sha1 hash.
|
||||
*
|
||||
* @package CacheResource-examples
|
||||
* @author Rodney Rehm
|
||||
*/
|
||||
class Smarty_CacheResource_Memcache extends Smarty_CacheResource_KeyValueStore
|
||||
{
|
||||
/**
|
||||
* memcache instance
|
||||
*
|
||||
* @var Memcache
|
||||
*/
|
||||
protected $memcache = null;
|
||||
|
||||
/**
|
||||
* Smarty_CacheResource_Memcache constructor.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
if (class_exists('Memcached')) {
|
||||
$this->memcache = new Memcached();
|
||||
} else {
|
||||
$this->memcache = new Memcache();
|
||||
}
|
||||
$this->memcache->addServer('127.0.0.1', 11211);
|
||||
}
|
||||
|
||||
/**
|
||||
* Read values for a set of keys from cache
|
||||
*
|
||||
* @param array $keys list of keys to fetch
|
||||
*
|
||||
* @return array list of values with the given keys used as indexes
|
||||
* @return boolean true on success, false on failure
|
||||
*/
|
||||
protected function read(array $keys)
|
||||
{
|
||||
$res = array();
|
||||
foreach ($keys as $key) {
|
||||
$k = sha1($key);
|
||||
$res[$key] = $this->memcache->get($k);
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
|
||||
/**
|
||||
* Save values for a set of keys to cache
|
||||
*
|
||||
* @param array $keys list of values to save
|
||||
* @param int $expire expiration time
|
||||
*
|
||||
* @return boolean true on success, false on failure
|
||||
*/
|
||||
protected function write(array $keys, $expire = null)
|
||||
{
|
||||
foreach ($keys as $k => $v) {
|
||||
$k = sha1($k);
|
||||
if (class_exists('Memcached')) {
|
||||
$this->memcache->set($k, $v, $expire);
|
||||
} else {
|
||||
$this->memcache->set($k, $v, 0, $expire);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove values from cache
|
||||
*
|
||||
* @param array $keys list of keys to delete
|
||||
*
|
||||
* @return boolean true on success, false on failure
|
||||
*/
|
||||
protected function delete(array $keys)
|
||||
{
|
||||
foreach ($keys as $k) {
|
||||
$k = sha1($k);
|
||||
$this->memcache->delete($k);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove *all* values from cache
|
||||
*
|
||||
* @return boolean true on success, false on failure
|
||||
*/
|
||||
protected function purge()
|
||||
{
|
||||
return $this->memcache->flush();
|
||||
}
|
||||
}
|
||||
@@ -1,183 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* MySQL CacheResource
|
||||
* CacheResource Implementation based on the Custom API to use
|
||||
* MySQL as the storage resource for Smarty's output caching.
|
||||
* Table definition:
|
||||
* <pre>CREATE TABLE IF NOT EXISTS `output_cache` (
|
||||
* `id` CHAR(40) NOT NULL COMMENT 'sha1 hash',
|
||||
* `name` VARCHAR(250) NOT NULL,
|
||||
* `cache_id` VARCHAR(250) NULL DEFAULT NULL,
|
||||
* `compile_id` VARCHAR(250) NULL DEFAULT NULL,
|
||||
* `modified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
* `content` LONGTEXT NOT NULL,
|
||||
* PRIMARY KEY (`id`),
|
||||
* INDEX(`name`),
|
||||
* INDEX(`cache_id`),
|
||||
* INDEX(`compile_id`),
|
||||
* INDEX(`modified`)
|
||||
* ) ENGINE = InnoDB;</pre>
|
||||
*
|
||||
* @package CacheResource-examples
|
||||
* @author Rodney Rehm
|
||||
*/
|
||||
class Smarty_CacheResource_Mysql extends Smarty_CacheResource_Custom
|
||||
{
|
||||
/**
|
||||
* @var \PDO
|
||||
*/
|
||||
protected $db;
|
||||
|
||||
/**
|
||||
* @var \PDOStatement
|
||||
*/
|
||||
protected $fetch;
|
||||
|
||||
/**
|
||||
* @var \PDOStatement
|
||||
*/
|
||||
protected $fetchTimestamp;
|
||||
|
||||
/**
|
||||
* @var \PDOStatement
|
||||
*/
|
||||
protected $save;
|
||||
|
||||
/**
|
||||
* Smarty_CacheResource_Mysql constructor.
|
||||
*
|
||||
* @throws \SmartyException
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
try {
|
||||
$this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty");
|
||||
} catch (PDOException $e) {
|
||||
throw new SmartyException('Mysql Resource failed: ' . $e->getMessage());
|
||||
}
|
||||
$this->fetch = $this->db->prepare('SELECT modified, content FROM output_cache WHERE id = :id');
|
||||
$this->fetchTimestamp = $this->db->prepare('SELECT modified FROM output_cache WHERE id = :id');
|
||||
$this->save = $this->db->prepare(
|
||||
'REPLACE INTO output_cache (id, name, cache_id, compile_id, content)
|
||||
VALUES (:id, :name, :cache_id, :compile_id, :content)'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* fetch cached content and its modification time from data source
|
||||
*
|
||||
* @param string $id unique cache content identifier
|
||||
* @param string $name template name
|
||||
* @param string $cache_id cache id
|
||||
* @param string $compile_id compile id
|
||||
* @param string $content cached content
|
||||
* @param integer $mtime cache modification timestamp (epoch)
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function fetch($id, $name, $cache_id, $compile_id, &$content, &$mtime)
|
||||
{
|
||||
$this->fetch->execute(array('id' => $id));
|
||||
$row = $this->fetch->fetch();
|
||||
$this->fetch->closeCursor();
|
||||
if ($row) {
|
||||
$content = $row[ 'content' ];
|
||||
$mtime = strtotime($row[ 'modified' ]);
|
||||
} else {
|
||||
$content = null;
|
||||
$mtime = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch cached content's modification timestamp from data source
|
||||
*
|
||||
* @note implementing this method is optional. Only implement it if modification times can be accessed faster than
|
||||
* loading the complete cached content.
|
||||
*
|
||||
* @param string $id unique cache content identifier
|
||||
* @param string $name template name
|
||||
* @param string $cache_id cache id
|
||||
* @param string $compile_id compile id
|
||||
*
|
||||
* @return integer|boolean timestamp (epoch) the template was modified, or false if not found
|
||||
*/
|
||||
protected function fetchTimestamp($id, $name, $cache_id, $compile_id)
|
||||
{
|
||||
$this->fetchTimestamp->execute(array('id' => $id));
|
||||
$mtime = strtotime($this->fetchTimestamp->fetchColumn());
|
||||
$this->fetchTimestamp->closeCursor();
|
||||
return $mtime;
|
||||
}
|
||||
|
||||
/**
|
||||
* Save content to cache
|
||||
*
|
||||
* @param string $id unique cache content identifier
|
||||
* @param string $name template name
|
||||
* @param string $cache_id cache id
|
||||
* @param string $compile_id compile id
|
||||
* @param integer|null $exp_time seconds till expiration time in seconds or null
|
||||
* @param string $content content to cache
|
||||
*
|
||||
* @return boolean success
|
||||
*/
|
||||
protected function save($id, $name, $cache_id, $compile_id, $exp_time, $content)
|
||||
{
|
||||
$this->save->execute(
|
||||
array('id' => $id,
|
||||
'name' => $name,
|
||||
'cache_id' => $cache_id,
|
||||
'compile_id' => $compile_id,
|
||||
'content' => $content,)
|
||||
);
|
||||
return !!$this->save->rowCount();
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete content from cache
|
||||
*
|
||||
* @param string $name template name
|
||||
* @param string $cache_id cache id
|
||||
* @param string $compile_id compile id
|
||||
* @param integer|null $exp_time seconds till expiration or null
|
||||
*
|
||||
* @return integer number of deleted caches
|
||||
*/
|
||||
protected function delete($name, $cache_id, $compile_id, $exp_time)
|
||||
{
|
||||
// delete the whole cache
|
||||
if ($name === null && $cache_id === null && $compile_id === null && $exp_time === null) {
|
||||
// returning the number of deleted caches would require a second query to count them
|
||||
$query = $this->db->query('TRUNCATE TABLE output_cache');
|
||||
return -1;
|
||||
}
|
||||
// build the filter
|
||||
$where = array();
|
||||
// equal test name
|
||||
if ($name !== null) {
|
||||
$where[] = 'name = ' . $this->db->quote($name);
|
||||
}
|
||||
// equal test compile_id
|
||||
if ($compile_id !== null) {
|
||||
$where[] = 'compile_id = ' . $this->db->quote($compile_id);
|
||||
}
|
||||
// range test expiration time
|
||||
if ($exp_time !== null) {
|
||||
$where[] = 'modified < DATE_SUB(NOW(), INTERVAL ' . intval($exp_time) . ' SECOND)';
|
||||
}
|
||||
// equal test cache_id and match sub-groups
|
||||
if ($cache_id !== null) {
|
||||
$where[] =
|
||||
'(cache_id = ' .
|
||||
$this->db->quote($cache_id) .
|
||||
' OR cache_id LIKE ' .
|
||||
$this->db->quote($cache_id . '|%') .
|
||||
')';
|
||||
}
|
||||
// run delete query
|
||||
$query = $this->db->query('DELETE FROM output_cache WHERE ' . join(' AND ', $where));
|
||||
return $query->rowCount();
|
||||
}
|
||||
}
|
||||
@@ -1,346 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* PDO Cache Handler
|
||||
* Allows you to store Smarty Cache files into your db.
|
||||
* Example table :
|
||||
* CREATE TABLE `smarty_cache` (
|
||||
* `id` char(40) NOT NULL COMMENT 'sha1 hash',
|
||||
* `name` varchar(250) NOT NULL,
|
||||
* `cache_id` varchar(250) DEFAULT NULL,
|
||||
* `compile_id` varchar(250) DEFAULT NULL,
|
||||
* `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
* `expire` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
|
||||
* `content` mediumblob NOT NULL,
|
||||
* PRIMARY KEY (`id`),
|
||||
* KEY `name` (`name`),
|
||||
* KEY `cache_id` (`cache_id`),
|
||||
* KEY `compile_id` (`compile_id`),
|
||||
* KEY `modified` (`modified`),
|
||||
* KEY `expire` (`expire`)
|
||||
* ) ENGINE=InnoDB
|
||||
* Example usage :
|
||||
* $cnx = new PDO("mysql:host=localhost;dbname=mydb", "username", "password");
|
||||
* $smarty->setCachingType('pdo');
|
||||
* $smarty->loadPlugin('Smarty_CacheResource_Pdo');
|
||||
* $smarty->registerCacheResource('pdo', new Smarty_CacheResource_Pdo($cnx, 'smarty_cache'));
|
||||
*
|
||||
* @author Beno!t POLASZEK - 2014
|
||||
*/
|
||||
class Smarty_CacheResource_Pdo extends Smarty_CacheResource_Custom
|
||||
{
|
||||
/**
|
||||
* @var string[]
|
||||
*/
|
||||
protected $fetchStatements = array('default' => 'SELECT %2$s
|
||||
FROM %1$s
|
||||
WHERE 1
|
||||
AND id = :id
|
||||
AND cache_id IS NULL
|
||||
AND compile_id IS NULL',
|
||||
'withCacheId' => 'SELECT %2$s
|
||||
FROM %1$s
|
||||
WHERE 1
|
||||
AND id = :id
|
||||
AND cache_id = :cache_id
|
||||
AND compile_id IS NULL',
|
||||
'withCompileId' => 'SELECT %2$s
|
||||
FROM %1$s
|
||||
WHERE 1
|
||||
AND id = :id
|
||||
AND compile_id = :compile_id
|
||||
AND cache_id IS NULL',
|
||||
'withCacheIdAndCompileId' => 'SELECT %2$s
|
||||
FROM %1$s
|
||||
WHERE 1
|
||||
AND id = :id
|
||||
AND cache_id = :cache_id
|
||||
AND compile_id = :compile_id');
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $insertStatement = 'INSERT INTO %s
|
||||
|
||||
SET id = :id,
|
||||
name = :name,
|
||||
cache_id = :cache_id,
|
||||
compile_id = :compile_id,
|
||||
modified = CURRENT_TIMESTAMP,
|
||||
expire = DATE_ADD(CURRENT_TIMESTAMP, INTERVAL :expire SECOND),
|
||||
content = :content
|
||||
|
||||
ON DUPLICATE KEY UPDATE
|
||||
name = :name,
|
||||
cache_id = :cache_id,
|
||||
compile_id = :compile_id,
|
||||
modified = CURRENT_TIMESTAMP,
|
||||
expire = DATE_ADD(CURRENT_TIMESTAMP, INTERVAL :expire SECOND),
|
||||
content = :content';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $deleteStatement = 'DELETE FROM %1$s WHERE %2$s';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $truncateStatement = 'TRUNCATE TABLE %s';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $fetchColumns = 'modified, content';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $fetchTimestampColumns = 'modified';
|
||||
|
||||
/**
|
||||
* @var \PDO
|
||||
*/
|
||||
protected $pdo;
|
||||
|
||||
/**
|
||||
* @var
|
||||
*/
|
||||
protected $table;
|
||||
|
||||
/**
|
||||
* @var null
|
||||
*/
|
||||
protected $database;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param PDO $pdo PDO : active connection
|
||||
* @param string $table : table (or view) name
|
||||
* @param string $database : optional - if table is located in another db
|
||||
*
|
||||
* @throws \SmartyException
|
||||
*/
|
||||
public function __construct(PDO $pdo, $table, $database = null)
|
||||
{
|
||||
if (is_null($table)) {
|
||||
throw new SmartyException("Table name for caching can't be null");
|
||||
}
|
||||
$this->pdo = $pdo;
|
||||
$this->table = $table;
|
||||
$this->database = $database;
|
||||
$this->fillStatementsWithTableName();
|
||||
}
|
||||
|
||||
/**
|
||||
* Fills the table name into the statements.
|
||||
*
|
||||
* @return $this Current Instance
|
||||
* @access protected
|
||||
*/
|
||||
protected function fillStatementsWithTableName()
|
||||
{
|
||||
foreach ($this->fetchStatements as &$statement) {
|
||||
$statement = sprintf($statement, $this->getTableName(), '%s');
|
||||
}
|
||||
$this->insertStatement = sprintf($this->insertStatement, $this->getTableName());
|
||||
$this->deleteStatement = sprintf($this->deleteStatement, $this->getTableName(), '%s');
|
||||
$this->truncateStatement = sprintf($this->truncateStatement, $this->getTableName());
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the fetch statement, depending on what you specify
|
||||
*
|
||||
* @param string $columns : the column(s) name(s) you want to retrieve from the database
|
||||
* @param string $id unique cache content identifier
|
||||
* @param string|null $cache_id cache id
|
||||
* @param string|null $compile_id compile id
|
||||
*
|
||||
* @access protected
|
||||
* @return \PDOStatement
|
||||
*/
|
||||
protected function getFetchStatement($columns, $id, $cache_id = null, $compile_id = null)
|
||||
{
|
||||
$args = array();
|
||||
if (!is_null($cache_id) && !is_null($compile_id)) {
|
||||
$query = $this->fetchStatements[ 'withCacheIdAndCompileId' ] and
|
||||
$args = array('id' => $id, 'cache_id' => $cache_id, 'compile_id' => $compile_id);
|
||||
} elseif (is_null($cache_id) && !is_null($compile_id)) {
|
||||
$query = $this->fetchStatements[ 'withCompileId' ] and
|
||||
$args = array('id' => $id, 'compile_id' => $compile_id);
|
||||
} elseif (!is_null($cache_id) && is_null($compile_id)) {
|
||||
$query = $this->fetchStatements[ 'withCacheId' ] and $args = array('id' => $id, 'cache_id' => $cache_id);
|
||||
} else {
|
||||
$query = $this->fetchStatements[ 'default' ] and $args = array('id' => $id);
|
||||
}
|
||||
$query = sprintf($query, $columns);
|
||||
$stmt = $this->pdo->prepare($query);
|
||||
foreach ($args as $key => $value) {
|
||||
$stmt->bindValue($key, $value);
|
||||
}
|
||||
return $stmt;
|
||||
}
|
||||
|
||||
/**
|
||||
* fetch cached content and its modification time from data source
|
||||
*
|
||||
* @param string $id unique cache content identifier
|
||||
* @param string $name template name
|
||||
* @param string|null $cache_id cache id
|
||||
* @param string|null $compile_id compile id
|
||||
* @param string $content cached content
|
||||
* @param integer $mtime cache modification timestamp (epoch)
|
||||
*
|
||||
* @return void
|
||||
* @access protected
|
||||
*/
|
||||
protected function fetch($id, $name, $cache_id, $compile_id, &$content, &$mtime)
|
||||
{
|
||||
$stmt = $this->getFetchStatement($this->fetchColumns, $id, $cache_id, $compile_id);
|
||||
$stmt->execute();
|
||||
$row = $stmt->fetch();
|
||||
$stmt->closeCursor();
|
||||
if ($row) {
|
||||
$content = $this->outputContent($row[ 'content' ]);
|
||||
$mtime = strtotime($row[ 'modified' ]);
|
||||
} else {
|
||||
$content = null;
|
||||
$mtime = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch cached content's modification timestamp from data source
|
||||
* {@internal implementing this method is optional.
|
||||
* Only implement it if modification times can be accessed faster than loading the complete cached content.}}
|
||||
*
|
||||
* @param string $id unique cache content identifier
|
||||
* @param string $name template name
|
||||
* @param string|null $cache_id cache id
|
||||
* @param string|null $compile_id compile id
|
||||
*
|
||||
* @return integer|boolean timestamp (epoch) the template was modified, or false if not found
|
||||
* @access protected
|
||||
*/
|
||||
// protected function fetchTimestamp($id, $name, $cache_id = null, $compile_id = null) {
|
||||
// $stmt = $this->getFetchStatement($this->fetchTimestampColumns, $id, $cache_id, $compile_id);
|
||||
// $stmt -> execute();
|
||||
// $mtime = strtotime($stmt->fetchColumn());
|
||||
// $stmt -> closeCursor();
|
||||
// return $mtime;
|
||||
// }
|
||||
/**
|
||||
* Save content to cache
|
||||
*
|
||||
* @param string $id unique cache content identifier
|
||||
* @param string $name template name
|
||||
* @param string|null $cache_id cache id
|
||||
* @param string|null $compile_id compile id
|
||||
* @param integer|null $exp_time seconds till expiration time in seconds or null
|
||||
* @param string $content content to cache
|
||||
*
|
||||
* @return boolean success
|
||||
* @access protected
|
||||
*/
|
||||
protected function save($id, $name, $cache_id, $compile_id, $exp_time, $content)
|
||||
{
|
||||
$stmt = $this->pdo->prepare($this->insertStatement);
|
||||
$stmt->bindValue('id', $id);
|
||||
$stmt->bindValue('name', $name);
|
||||
$stmt->bindValue('cache_id', $cache_id, (is_null($cache_id)) ? PDO::PARAM_NULL : PDO::PARAM_STR);
|
||||
$stmt->bindValue('compile_id', $compile_id, (is_null($compile_id)) ? PDO::PARAM_NULL : PDO::PARAM_STR);
|
||||
$stmt->bindValue('expire', (int)$exp_time, PDO::PARAM_INT);
|
||||
$stmt->bindValue('content', $this->inputContent($content));
|
||||
$stmt->execute();
|
||||
return !!$stmt->rowCount();
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes the content before saving to database
|
||||
*
|
||||
* @param string $content
|
||||
*
|
||||
* @return string $content
|
||||
* @access protected
|
||||
*/
|
||||
protected function inputContent($content)
|
||||
{
|
||||
return $content;
|
||||
}
|
||||
|
||||
/**
|
||||
* Decodes the content before saving to database
|
||||
*
|
||||
* @param string $content
|
||||
*
|
||||
* @return string $content
|
||||
* @access protected
|
||||
*/
|
||||
protected function outputContent($content)
|
||||
{
|
||||
return $content;
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete content from cache
|
||||
*
|
||||
* @param string|null $name template name
|
||||
* @param string|null $cache_id cache id
|
||||
* @param string|null $compile_id compile id
|
||||
* @param integer|null|-1 $exp_time seconds till expiration or null
|
||||
*
|
||||
* @return integer number of deleted caches
|
||||
* @access protected
|
||||
*/
|
||||
protected function delete($name = null, $cache_id = null, $compile_id = null, $exp_time = null)
|
||||
{
|
||||
// delete the whole cache
|
||||
if ($name === null && $cache_id === null && $compile_id === null && $exp_time === null) {
|
||||
// returning the number of deleted caches would require a second query to count them
|
||||
$this->pdo->query($this->truncateStatement);
|
||||
return -1;
|
||||
}
|
||||
// build the filter
|
||||
$where = array();
|
||||
// equal test name
|
||||
if ($name !== null) {
|
||||
$where[] = 'name = ' . $this->pdo->quote($name);
|
||||
}
|
||||
// equal test cache_id and match sub-groups
|
||||
if ($cache_id !== null) {
|
||||
$where[] =
|
||||
'(cache_id = ' .
|
||||
$this->pdo->quote($cache_id) .
|
||||
' OR cache_id LIKE ' .
|
||||
$this->pdo->quote($cache_id . '|%') .
|
||||
')';
|
||||
}
|
||||
// equal test compile_id
|
||||
if ($compile_id !== null) {
|
||||
$where[] = 'compile_id = ' . $this->pdo->quote($compile_id);
|
||||
}
|
||||
// for clearing expired caches
|
||||
if ($exp_time === Smarty::CLEAR_EXPIRED) {
|
||||
$where[] = 'expire < CURRENT_TIMESTAMP';
|
||||
} // range test expiration time
|
||||
elseif ($exp_time !== null) {
|
||||
$where[] = 'modified < DATE_SUB(NOW(), INTERVAL ' . intval($exp_time) . ' SECOND)';
|
||||
}
|
||||
// run delete query
|
||||
$query = $this->pdo->query(sprintf($this->deleteStatement, join(' AND ', $where)));
|
||||
return $query->rowCount();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the formatted table name
|
||||
*
|
||||
* @return string
|
||||
* @access protected
|
||||
*/
|
||||
protected function getTableName()
|
||||
{
|
||||
return (is_null($this->database)) ? "`{$this->table}`" : "`{$this->database}`.`{$this->table}`";
|
||||
}
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
<?php
|
||||
require_once 'cacheresource.pdo.php';
|
||||
|
||||
/**
|
||||
* PDO Cache Handler with GZIP support
|
||||
* Example usage :
|
||||
* $cnx = new PDO("mysql:host=localhost;dbname=mydb", "username", "password");
|
||||
* $smarty->setCachingType('pdo_gzip');
|
||||
* $smarty->loadPlugin('Smarty_CacheResource_Pdo_Gzip');
|
||||
* $smarty->registerCacheResource('pdo_gzip', new Smarty_CacheResource_Pdo_Gzip($cnx, 'smarty_cache'));
|
||||
*
|
||||
* @require Smarty_CacheResource_Pdo class
|
||||
* @author Beno!t POLASZEK - 2014
|
||||
*/
|
||||
class Smarty_CacheResource_Pdo_Gzip extends Smarty_CacheResource_Pdo
|
||||
{
|
||||
/**
|
||||
* Encodes the content before saving to database
|
||||
*
|
||||
* @param string $content
|
||||
*
|
||||
* @return string $content
|
||||
* @access protected
|
||||
*/
|
||||
protected function inputContent($content)
|
||||
{
|
||||
return gzdeflate($content);
|
||||
}
|
||||
|
||||
/**
|
||||
* Decodes the content before saving to database
|
||||
*
|
||||
* @param string $content
|
||||
*
|
||||
* @return string $content
|
||||
* @access protected
|
||||
*/
|
||||
protected function outputContent($content)
|
||||
{
|
||||
return gzinflate($content);
|
||||
}
|
||||
}
|
||||
@@ -1,62 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Extends All Resource
|
||||
* Resource Implementation modifying the extends-Resource to walk
|
||||
* through the template_dirs and inherit all templates of the same name
|
||||
*
|
||||
* @package Resource-examples
|
||||
* @author Rodney Rehm
|
||||
*/
|
||||
class Smarty_Resource_Extendsall extends Smarty_Internal_Resource_Extends
|
||||
{
|
||||
/**
|
||||
* populate Source Object with meta data from Resource
|
||||
*
|
||||
* @param Smarty_Template_Source $source source object
|
||||
* @param Smarty_Internal_Template $_template template object
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null)
|
||||
{
|
||||
$uid = '';
|
||||
$sources = array();
|
||||
$timestamp = 0;
|
||||
foreach ($source->smarty->getTemplateDir() as $key => $directory) {
|
||||
try {
|
||||
$s = Smarty_Resource::source(null, $source->smarty, 'file:' . '[' . $key . ']' . $source->name);
|
||||
if (!$s->exists) {
|
||||
continue;
|
||||
}
|
||||
$sources[ $s->uid ] = $s;
|
||||
$uid .= $s->filepath;
|
||||
$timestamp = $s->timestamp > $timestamp ? $s->timestamp : $timestamp;
|
||||
} catch (SmartyException $e) {
|
||||
}
|
||||
}
|
||||
if (!$sources) {
|
||||
$source->exists = false;
|
||||
return;
|
||||
}
|
||||
$sources = array_reverse($sources, true);
|
||||
reset($sources);
|
||||
$s = current($sources);
|
||||
$source->components = $sources;
|
||||
$source->filepath = $s->filepath;
|
||||
$source->uid = sha1($uid . $source->smarty->_joined_template_dir);
|
||||
$source->exists = true;
|
||||
$source->timestamp = $timestamp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable timestamp checks for extendsall resource.
|
||||
* The individual source components will be checked.
|
||||
*
|
||||
* @return bool false
|
||||
*/
|
||||
public function checkTimestamps()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -1,101 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* MySQL Resource
|
||||
* Resource Implementation based on the Custom API to use
|
||||
* MySQL as the storage resource for Smarty's templates and configs.
|
||||
* Table definition:
|
||||
* <pre>CREATE TABLE IF NOT EXISTS `templates` (
|
||||
* `name` varchar(100) NOT NULL,
|
||||
* `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
* `source` text,
|
||||
* PRIMARY KEY (`name`)
|
||||
* ) ENGINE=InnoDB DEFAULT CHARSET=utf8;</pre>
|
||||
* Demo data:
|
||||
* <pre>INSERT INTO `templates` (`name`, `modified`, `source`) VALUES ('test.tpl', "2010-12-25 22:00:00", '{$x="hello
|
||||
* world"}{$x}');</pre>
|
||||
*
|
||||
*
|
||||
* @package Resource-examples
|
||||
* @author Rodney Rehm
|
||||
*/
|
||||
class Smarty_Resource_Mysql extends Smarty_Resource_Custom
|
||||
{
|
||||
/**
|
||||
* PDO instance
|
||||
*
|
||||
* @var \PDO
|
||||
*/
|
||||
protected $db;
|
||||
|
||||
/**
|
||||
* prepared fetch() statement
|
||||
*
|
||||
* @var \PDOStatement
|
||||
*/
|
||||
protected $fetch;
|
||||
|
||||
/**
|
||||
* prepared fetchTimestamp() statement
|
||||
*
|
||||
* @var \PDOStatement
|
||||
*/
|
||||
protected $mtime;
|
||||
|
||||
/**
|
||||
* Smarty_Resource_Mysql constructor.
|
||||
*
|
||||
* @throws \SmartyException
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
try {
|
||||
$this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty");
|
||||
} catch (PDOException $e) {
|
||||
throw new SmartyException('Mysql Resource failed: ' . $e->getMessage());
|
||||
}
|
||||
$this->fetch = $this->db->prepare('SELECT modified, source FROM templates WHERE name = :name');
|
||||
$this->mtime = $this->db->prepare('SELECT modified FROM templates WHERE name = :name');
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch a template and its modification time from database
|
||||
*
|
||||
* @param string $name template name
|
||||
* @param string $source template source
|
||||
* @param integer $mtime template modification timestamp (epoch)
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function fetch($name, &$source, &$mtime)
|
||||
{
|
||||
$this->fetch->execute(array('name' => $name));
|
||||
$row = $this->fetch->fetch();
|
||||
$this->fetch->closeCursor();
|
||||
if ($row) {
|
||||
$source = $row[ 'source' ];
|
||||
$mtime = strtotime($row[ 'modified' ]);
|
||||
} else {
|
||||
$source = null;
|
||||
$mtime = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch a template's modification time from database
|
||||
*
|
||||
* @note implementing this method is optional. Only implement it if modification times can be accessed faster than
|
||||
* loading the comple template source.
|
||||
*
|
||||
* @param string $name template name
|
||||
*
|
||||
* @return integer timestamp (epoch) the template was modified
|
||||
*/
|
||||
protected function fetchTimestamp($name)
|
||||
{
|
||||
$this->mtime->execute(array('name' => $name));
|
||||
$mtime = $this->mtime->fetchColumn();
|
||||
$this->mtime->closeCursor();
|
||||
return strtotime($mtime);
|
||||
}
|
||||
}
|
||||
@@ -1,77 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* MySQL Resource
|
||||
* Resource Implementation based on the Custom API to use
|
||||
* MySQL as the storage resource for Smarty's templates and configs.
|
||||
* Note that this MySQL implementation fetches the source and timestamps in
|
||||
* a single database query, instead of two separate like resource.mysql.php does.
|
||||
* Table definition:
|
||||
* <pre>CREATE TABLE IF NOT EXISTS `templates` (
|
||||
* `name` varchar(100) NOT NULL,
|
||||
* `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
* `source` text,
|
||||
* PRIMARY KEY (`name`)
|
||||
* ) ENGINE=InnoDB DEFAULT CHARSET=utf8;</pre>
|
||||
* Demo data:
|
||||
* <pre>INSERT INTO `templates` (`name`, `modified`, `source`) VALUES ('test.tpl', "2010-12-25 22:00:00", '{$x="hello
|
||||
* world"}{$x}');</pre>
|
||||
*
|
||||
*
|
||||
* @package Resource-examples
|
||||
* @author Rodney Rehm
|
||||
*/
|
||||
class Smarty_Resource_Mysqls extends Smarty_Resource_Custom
|
||||
{
|
||||
/**
|
||||
* PDO instance
|
||||
*
|
||||
* @var \PDO
|
||||
*/
|
||||
protected $db;
|
||||
|
||||
/**
|
||||
* prepared fetch() statement
|
||||
*
|
||||
* @var \PDOStatement
|
||||
*/
|
||||
protected $fetch;
|
||||
|
||||
/**
|
||||
* Smarty_Resource_Mysqls constructor.
|
||||
*
|
||||
* @throws \SmartyException
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
try {
|
||||
$this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty");
|
||||
} catch (PDOException $e) {
|
||||
throw new SmartyException('Mysql Resource failed: ' . $e->getMessage());
|
||||
}
|
||||
$this->fetch = $this->db->prepare('SELECT modified, source FROM templates WHERE name = :name');
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch a template and its modification time from database
|
||||
*
|
||||
* @param string $name template name
|
||||
* @param string $source template source
|
||||
* @param integer $mtime template modification timestamp (epoch)
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function fetch($name, &$source, &$mtime)
|
||||
{
|
||||
$this->fetch->execute(array('name' => $name));
|
||||
$row = $this->fetch->fetch();
|
||||
$this->fetch->closeCursor();
|
||||
if ($row) {
|
||||
$source = $row[ 'source' ];
|
||||
$mtime = strtotime($row[ 'modified' ]);
|
||||
} else {
|
||||
$source = null;
|
||||
$mtime = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
{popup_init src="/javascripts/overlib.js"}
|
||||
<TITLE>{$title} - {$Name}</TITLE>
|
||||
</HEAD>
|
||||
<BODY bgcolor="#ffffff">
|
||||
|
||||
+40
-46
@@ -1,21 +1,21 @@
|
||||
{config_load file="test.conf" section="setup"}
|
||||
{config_load file=test.conf section="setup"}
|
||||
{include file="header.tpl" title=foo}
|
||||
|
||||
<PRE>
|
||||
|
||||
{* bold and title are read from the config file *}
|
||||
{if #bold#}<b>{/if}
|
||||
{* capitalize the first letters of each word of the title *}
|
||||
Title: {#title#|capitalize}
|
||||
{if #bold#}</b>{/if}
|
||||
{if #bold#}<b>{/if}
|
||||
{* capitalize the first letters of each word of the title *}
|
||||
Title: {#title#|capitalize}
|
||||
{if #bold#}</b>{/if}
|
||||
|
||||
The current date and time is {$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}
|
||||
The current date and time is {$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}
|
||||
|
||||
The value of global assigned variable $SCRIPT_NAME is {$SCRIPT_NAME}
|
||||
The value of global assigned variable $SCRIPT_NAME is {$SCRIPT_NAME}
|
||||
|
||||
Example of accessing server environment variable SERVER_NAME: {$smarty.server.SERVER_NAME}
|
||||
Example of accessing server environment variable SERVER_NAME: {$smarty.server.SERVER_NAME}
|
||||
|
||||
The value of {ldelim}$Name{rdelim} is <b>{$Name}</b>
|
||||
The value of {ldelim}$Name{rdelim} is <b>{$Name}</b>
|
||||
|
||||
variable modifier example of {ldelim}$Name|upper{rdelim}
|
||||
|
||||
@@ -24,64 +24,58 @@ variable modifier example of {ldelim}$Name|upper{rdelim}
|
||||
|
||||
An example of a section loop:
|
||||
|
||||
{section name=outer
|
||||
loop=$FirstName}
|
||||
{if $smarty.section.outer.index is odd by 2}
|
||||
{$smarty.section.outer.rownum} . {$FirstName[outer]} {$LastName[outer]}
|
||||
{else}
|
||||
{$smarty.section.outer.rownum} * {$FirstName[outer]} {$LastName[outer]}
|
||||
{/if}
|
||||
{sectionelse}
|
||||
none
|
||||
{/section}
|
||||
{section name=outer loop=$FirstName}
|
||||
{if $smarty.section.outer.index is odd by 2}
|
||||
{$smarty.section.outer.rownum} . {$FirstName[outer]} {$LastName[outer]}
|
||||
{else}
|
||||
{$smarty.section.outer.rownum} * {$FirstName[outer]} {$LastName[outer]}
|
||||
{/if}
|
||||
{sectionelse}
|
||||
none
|
||||
{/section}
|
||||
|
||||
An example of section looped key values:
|
||||
An example of section looped key values:
|
||||
|
||||
{section name=sec1 loop=$contacts}
|
||||
phone: {$contacts[sec1].phone}
|
||||
<br>
|
||||
{section name=sec1 loop=$contacts}
|
||||
phone: {$contacts[sec1].phone}<br>
|
||||
fax: {$contacts[sec1].fax}<br>
|
||||
cell: {$contacts[sec1].cell}<br>
|
||||
{/section}
|
||||
<p>
|
||||
|
||||
fax: {$contacts[sec1].fax}
|
||||
<br>
|
||||
|
||||
cell: {$contacts[sec1].cell}
|
||||
<br>
|
||||
{/section}
|
||||
<p>
|
||||
|
||||
testing strip tags
|
||||
{strip}
|
||||
testing strip tags
|
||||
{strip}
|
||||
<table border=0>
|
||||
<tr>
|
||||
<td>
|
||||
<A HREF="{$SCRIPT_NAME}">
|
||||
<font color="red">This is a test </font>
|
||||
</A>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<A HREF="{$SCRIPT_NAME}">
|
||||
<font color="red">This is a test </font>
|
||||
</A>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{/strip}
|
||||
{/strip}
|
||||
|
||||
</PRE>
|
||||
|
||||
This is an example of the html_select_date function:
|
||||
|
||||
<form>
|
||||
{html_select_date start_year=1998 end_year=2010}
|
||||
{html_select_date start_year=1998 end_year=2010}
|
||||
</form>
|
||||
|
||||
This is an example of the html_select_time function:
|
||||
|
||||
<form>
|
||||
{html_select_time use_24_hours=false}
|
||||
{html_select_time use_24_hours=false}
|
||||
</form>
|
||||
|
||||
This is an example of the html_options function:
|
||||
|
||||
<form>
|
||||
<select name=states>
|
||||
{html_options values=$option_values selected=$option_selected output=$option_output}
|
||||
</select>
|
||||
<select name=states>
|
||||
{html_options values=$option_values selected=$option_selected output=$option_output}
|
||||
</select>
|
||||
</form>
|
||||
|
||||
{include file="footer.tpl"}
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
theme: jekyll-theme-minimal
|
||||
@@ -1,332 +0,0 @@
|
||||
Tips & Tricks {#tips}
|
||||
=============
|
||||
|
||||
Blank Variable Handling {#tips.blank.var.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
|
||||
shorthand way with Smarty, using the
|
||||
[`default`](#language.modifier.default) variable modifier.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> "Undefined variable" errors will show an E\_NOTICE if not disabled in
|
||||
> PHP\'s [`error_reporting()`](&url.php-manual;error_reporting) level or
|
||||
> Smarty\'s [`$error_reporting`](#variable.error.reporting) property and
|
||||
> a variable had not been assigned to Smarty.
|
||||
|
||||
|
||||
{* the long way *}
|
||||
{if $title eq ''}
|
||||
|
||||
{else}
|
||||
{$title}
|
||||
{/if}
|
||||
|
||||
{* the short way *}
|
||||
{$title|default:' '}
|
||||
|
||||
|
||||
|
||||
See also [`default`](#language.modifier.default) modifier and [default
|
||||
variable handling](#tips.default.var.handling).
|
||||
|
||||
Default Variable Handling {#tips.default.var.handling}
|
||||
=========================
|
||||
|
||||
If a variable is used frequently throughout your templates, applying the
|
||||
[`default`](#language.modifier.default) 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.
|
||||
|
||||
|
||||
{* do this somewhere at the top of your template *}
|
||||
{assign var='title' value=$title|default:'no title'}
|
||||
|
||||
{* if $title was empty, it now contains the value "no title" when you use it *}
|
||||
{$title}
|
||||
|
||||
|
||||
|
||||
See also [`default`](#language.modifier.default) modifier and [blank
|
||||
variable handling](#tips.blank.var.handling).
|
||||
|
||||
Passing variable title to header template {#tips.passing.vars}
|
||||
=========================================
|
||||
|
||||
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
|
||||
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.
|
||||
|
||||
`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.
|
||||
|
||||
|
||||
{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.
|
||||
|
||||
|
||||
{config_load file='archive_page.conf'}
|
||||
|
||||
{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 modifier.
|
||||
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>{$title|default:'Smarty News'}</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
|
||||
|
||||
`footer.tpl`
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
Dates {#tips.dates}
|
||||
=====
|
||||
|
||||
As a rule of thumb, always pass dates to Smarty as
|
||||
[timestamps](&url.php-manual;time). This allows template designers to
|
||||
use the [`date_format`](#language.modifier.date.format) modifier for
|
||||
full control over date formatting, and also makes it easy to compare
|
||||
dates if necessary.
|
||||
|
||||
|
||||
{$startDate|date_format}
|
||||
|
||||
|
||||
|
||||
This will output:
|
||||
|
||||
|
||||
Jan 4, 2009
|
||||
|
||||
|
||||
|
||||
|
||||
{$startDate|date_format:"%Y/%m/%d"}
|
||||
|
||||
|
||||
|
||||
This will output:
|
||||
|
||||
|
||||
2009/01/04
|
||||
|
||||
|
||||
|
||||
Dates can be compared in the template by timestamps with:
|
||||
|
||||
|
||||
{if $order_date < $invoice_date}
|
||||
...do something..
|
||||
{/if}
|
||||
|
||||
|
||||
|
||||
When using [`{html_select_date}`](#language.function.html.select.date)
|
||||
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
|
||||
|
||||
// this assumes your form elements are named
|
||||
// startDate_Day, startDate_Month, startDate_Year
|
||||
|
||||
$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');
|
||||
}
|
||||
|
||||
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),
|
||||
|
||||
WAP/WML {#tips.wap}
|
||||
=======
|
||||
|
||||
WAP/WML templates require a php [Content-Type
|
||||
header](&url.php-manual;header) to be passed along with the template.
|
||||
The easist way to do this would be to write a custom function that
|
||||
prints the header. If you are using [caching](#caching), that won\'t
|
||||
work so we\'ll do it using the [`{insert}`](#language.function.insert)
|
||||
tag; remember `{insert}` tags are not cached! Be sure that there is
|
||||
nothing output to the browser before the template, or else the header
|
||||
may fail.
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
// be sure apache is configure for the .wml extensions!
|
||||
// put this function somewhere in your application, or in Smarty.addons.php
|
||||
function insert_header($params)
|
||||
{
|
||||
// this function expects $content argument
|
||||
if (empty($params['content'])) {
|
||||
return;
|
||||
}
|
||||
header($params['content']);
|
||||
return;
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
|
||||
|
||||
your Smarty template *must* begin with the insert tag :
|
||||
|
||||
|
||||
{insert name=header content="Content-Type: text/vnd.wap.wml"}
|
||||
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
|
||||
|
||||
<!-- begin new wml deck -->
|
||||
<wml>
|
||||
<!-- begin first card -->
|
||||
<card>
|
||||
<do type="accept">
|
||||
<go href="#two"/>
|
||||
</do>
|
||||
<p>
|
||||
Welcome to WAP with Smarty!
|
||||
Press OK to continue...
|
||||
</p>
|
||||
</card>
|
||||
<!-- begin second card -->
|
||||
<card id="two">
|
||||
<p>
|
||||
Pretty easy isn't it?
|
||||
</p>
|
||||
</card>
|
||||
</wml>
|
||||
|
||||
|
||||
|
||||
Componentized Templates {#tips.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
|
||||
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
|
||||
application by merely including the template, and not worry about
|
||||
fetching the data up front?
|
||||
|
||||
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)
|
||||
|
||||
|
||||
<?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;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
?>
|
||||
|
||||
|
||||
|
||||
`index.tpl`
|
||||
|
||||
|
||||
{load_ticker symbol='SMARTY' assign='ticker'}
|
||||
|
||||
Stock Name: {$ticker.name} Stock Price: {$ticker.price}
|
||||
|
||||
|
||||
|
||||
See also [`{include_php}`](#language.function.include.php),
|
||||
[`{include}`](#language.function.include) and
|
||||
[`{php}`](#language.function.php).
|
||||
|
||||
Obfuscating E-mail Addresses {#tips.obfuscating.email}
|
||||
============================
|
||||
|
||||
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.
|
||||
|
||||
|
||||
<div id="contact">Send inquiries to
|
||||
{mailto address=$EmailAddress encode='javascript' subject='Hello'}
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> This method isn\'t 100% foolproof. A spammer could conceivably program
|
||||
> 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).
|
||||
@@ -1,120 +0,0 @@
|
||||
Troubleshooting
|
||||
===============
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
that, the error consists of the actual line number in the Smarty class
|
||||
that the error occurred.
|
||||
|
||||
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
|
||||
|
||||
|
||||
|
||||
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
|
||||
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...
|
||||
|
||||
- The [`$template_dir`](#variable.template.dir) 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
|
||||
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...
|
||||
|
||||
|
||||
|
||||
- Either the [`$compile_dir`](#variable.compile.dir)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 '....
|
||||
|
||||
|
||||
|
||||
- The [`$compile_dir`](#variable.compile.dir) 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 /..
|
||||
|
||||
|
||||
|
||||
- This means that [`$caching`](#variable.caching) is enabled and
|
||||
either; the [`$cache_dir`](#variable.cache.dir) 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 '/...
|
||||
|
||||
|
||||
|
||||
- This means that [`$caching`](#variable.caching) is enabled and the
|
||||
[`$cache_dir`](#variable.cache.dir) is not writable by the web
|
||||
server. See the bottom of the [installing
|
||||
smarty](#installing.smarty.basic) 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
|
||||
|
||||
|
||||
|
||||
- This means that your application registered a custom error hander
|
||||
(using [set\_error\_handler()](&url.php-manual;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
|
||||
registered your custom error handler.
|
||||
|
||||
See also [debugging](#chapter.debugging.console).
|
||||
@@ -1,41 +0,0 @@
|
||||
Debugging Console {#chapter.debugging.console}
|
||||
=================
|
||||
|
||||
There is a debugging console included with Smarty. The console informs
|
||||
you of all the [included](./language-builtin-functions/language-function-include.md) templates,
|
||||
[assigned](../programmers/api-functions/api-assign.md) variables and
|
||||
[config](./language-variables/language-config-variables.md) file variables for the current
|
||||
invocation of the template. A template file named `debug.tpl` is
|
||||
included with the distribution of Smarty which controls the formatting
|
||||
of the console.
|
||||
|
||||
Set [`$debugging`](../programmers/api-variables/variable-debugging.md) to TRUE in Smarty, and if needed
|
||||
set [`$debug_tpl`](../programmers/api-variables/variable-debug-template.md) to the template resource
|
||||
path to `debug.tpl` (this is in [`SMARTY_DIR`](../programmers/smarty-constants.md) by
|
||||
default). When you load the page, a Javascript console window will pop
|
||||
up and give you the names of all the included templates and assigned
|
||||
variables for the current page.
|
||||
|
||||
To see the available variables for a particular template, see the
|
||||
[`{debug}`](./language-builtin-functions/language-function-debug.md) template function. To disable the
|
||||
debugging console, set [`$debugging`](../programmers/api-variables/variable-debugging.md) to FALSE. You
|
||||
can also temporarily turn on the debugging console by putting
|
||||
`SMARTY_DEBUG` in the URL if you enable this option with
|
||||
[`$debugging_ctrl`](../programmers/api-variables/variable-debugging-ctrl.md).
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> The debugging console does not work when you use the
|
||||
> [`fetch()`](../programmers/api-functions/api-fetch.md) API, only when using
|
||||
> [`display()`](../programmers/api-functions/api-display.md). It is a set of javascript statements
|
||||
> added to the very bottom of the generated template. If you do not like
|
||||
> javascript, you can edit the `debug.tpl` template to format the output
|
||||
> however you like. Debug data is not cached and `debug.tpl` info is not
|
||||
> included in the output of the debug console.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> The load times of each template and config file are in seconds, or
|
||||
> fractions thereof.
|
||||
|
||||
See also [troubleshooting](../appendixes/troubleshooting.md).
|
||||
@@ -1,77 +0,0 @@
|
||||
Config Files {#config.files}
|
||||
============
|
||||
|
||||
Config files are handy for designers to manage global template variables
|
||||
from one file. One example is template colors. Normally if you wanted to
|
||||
change the color scheme of an application, you would have to go through
|
||||
each and every template file and change the colors. With a config file,
|
||||
the colors can be kept in one place, and only one file needs to be
|
||||
updated.
|
||||
|
||||
|
||||
# global variables
|
||||
pageTitle = "Main Menu"
|
||||
bodyBgColor = #000000
|
||||
tableBgColor = #000000
|
||||
rowBgColor = #00ff00
|
||||
|
||||
[Customer]
|
||||
pageTitle = "Customer Info"
|
||||
|
||||
[Login]
|
||||
pageTitle = "Login"
|
||||
focus = "username"
|
||||
Intro = """This is a value that spans more
|
||||
than one line. you must enclose
|
||||
it in triple quotes."""
|
||||
|
||||
# hidden section
|
||||
[.Database]
|
||||
host=my.example.com
|
||||
db=ADDRESSBOOK
|
||||
user=php-user
|
||||
pass=foobar
|
||||
|
||||
|
||||
|
||||
Values of [config file variables](./language-variables/language-config-variables.md) can be in
|
||||
quotes, but not necessary. You can use either single or double quotes.
|
||||
If you have a value that spans more than one line, enclose the entire
|
||||
value with triple quotes (\"\"\"). You can put comments into config
|
||||
files by any syntax that is not a valid config file syntax. We recommend
|
||||
using a `
|
||||
#` (hash) at the beginning of the line.
|
||||
|
||||
The example config file above has two sections. Section names are
|
||||
enclosed in \[brackets\]. Section names can be arbitrary strings not
|
||||
containing `[` or `]` symbols. The four variables at the top are global
|
||||
variables, or variables not within a section. These variables are always
|
||||
loaded from the config file. If a particular section is loaded, then the
|
||||
global variables and the variables from that section are also loaded. If
|
||||
a variable exists both as a global and in a section, the section
|
||||
variable is used. If you name two variables the same within a section,
|
||||
the last one will be used unless
|
||||
[`$config_overwrite`](../programmers/api-variables/variable-config-overwrite.md) is disabled.
|
||||
|
||||
Config files are loaded into templates with the built-in template
|
||||
function [`
|
||||
{config_load}`](./language-builtin-functions/language-function-config-load.md) or the API
|
||||
[`configLoad()`](../programmers/api-functions/api-config-load.md) function.
|
||||
|
||||
You can hide variables or entire sections by prepending the variable
|
||||
name or section name with a period(.) eg `[.hidden]`. This is useful if
|
||||
your application reads the config files and gets sensitive data from
|
||||
them that the template engine does not need. If you have third parties
|
||||
doing template editing, you can be certain that they cannot read
|
||||
sensitive data from the config file by loading it into the template.
|
||||
|
||||
Config files (or resources) are loaded by the same resource facilities
|
||||
as templates. That means that a config file can also be loaded from a db
|
||||
`$smarty->configLoad("db:my.conf")`.
|
||||
|
||||
See also [`{config_load}`](./language-builtin-functions/language-function-config-load.md),
|
||||
[`$config_overwrite`](../programmers/api-variables/variable-config-overwrite.md),
|
||||
[`$default_config_handler_func`](../programmers/api-variables/variable-default-config-handler-func.md),
|
||||
[`getConfigVars()`](../programmers/api-functions/api-get-config-vars.md),
|
||||
[`clearConfig()`](../programmers/api-functions/api-clear-config.md) and
|
||||
[`configLoad()`](../programmers/api-functions/api-config-load.md)
|
||||
@@ -1,33 +0,0 @@
|
||||
Basic Syntax
|
||||
============
|
||||
|
||||
A simple Smarty template could look like this:
|
||||
```html
|
||||
<h1>{$title|escape}</h1>
|
||||
<ul>
|
||||
{foreach $cities as $city}
|
||||
<li>{$city.name|escape} ({$city.population})</li>
|
||||
{foreachelse}
|
||||
<li>no cities found</li>
|
||||
{/foreach}
|
||||
</ul>
|
||||
```
|
||||
|
||||
All Smarty template tags are enclosed within delimiters. By default
|
||||
these are `{` and `}`, but they can be
|
||||
[changed](../programmers/api-variables/variable-left-delimiter.md).
|
||||
|
||||
For the examples in this manual, we will assume that you are using the
|
||||
default delimiters. In Smarty, all content outside of delimiters is
|
||||
displayed as static content, or unchanged. When Smarty encounters
|
||||
template tags, it attempts to interpret them, and displays the
|
||||
appropriate output in their place.
|
||||
|
||||
The basis components of the Smarty syntax are:
|
||||
- [Comments](./language-basic-syntax/language-syntax-comments.md)
|
||||
- [Variables](./language-basic-syntax/language-syntax-variables.md)
|
||||
- [Functions](./language-basic-syntax/language-syntax-functions.md)
|
||||
- [Attributes](./language-basic-syntax/language-syntax-attributes.md)
|
||||
- [Quotes](./language-basic-syntax/language-syntax-quotes.md)
|
||||
- [Math](./language-basic-syntax/language-math.md)
|
||||
- [Escaping](./language-basic-syntax/language-escaping.md)
|
||||
@@ -1,84 +0,0 @@
|
||||
Escaping Smarty Parsing {#language.escaping}
|
||||
=======================
|
||||
|
||||
It is sometimes desirable or even necessary to have Smarty ignore
|
||||
sections it would otherwise parse. A classic example is embedding
|
||||
Javascript or CSS code in a template. The problem arises as those
|
||||
languages use the { and } characters which are also the default
|
||||
[delimiters](#language.function.ldelim) for Smarty.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> A good practice for avoiding escapement altogether is by separating
|
||||
> your Javascript/CSS into their own files and use standard HTML methods
|
||||
> to access them. This will also take advantage of browser script
|
||||
> caching. When you need to embed Smarty variables/functions into your
|
||||
> Javascript/CSS, then the following applies.
|
||||
|
||||
In Smarty templates, the { and } braces will be ignored so long as they
|
||||
are surrounded by white space. This behavior can be disabled by setting
|
||||
the Smarty class variable [`$auto_literal`](#variable.auto.literal) to
|
||||
false.
|
||||
|
||||
|
||||
<script>
|
||||
// the following braces are ignored by Smarty
|
||||
// since they are surrounded by whitespace
|
||||
function foobar {
|
||||
alert('foobar!');
|
||||
}
|
||||
// this one will need literal escapement
|
||||
{literal}
|
||||
function bazzy {alert('foobar!');}
|
||||
{/literal}
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
[`{literal}..{/literal}`](#language.function.literal) blocks are used
|
||||
for escaping blocks of template logic. You can also escape the braces
|
||||
individually with
|
||||
[`{ldelim}`](#language.function.ldelim),[`{rdelim}`](#language.function.ldelim)
|
||||
tags or
|
||||
[`{$smarty.ldelim}`,`{$smarty.rdelim}`](#language.variables.smarty.ldelim)
|
||||
variables.
|
||||
|
||||
Smarty\'s default delimiters { and } cleanly represent presentational
|
||||
content. However if another set of delimiters suit your needs better,
|
||||
you can change them with Smarty\'s
|
||||
[`$left_delimiter`](#variable.left.delimiter) and
|
||||
[`$right_delimiter`](#variable.right.delimiter) values.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Changing delimiters affects ALL template syntax and escapement. Be
|
||||
> sure to clear out cache and compiled files if you decide to change
|
||||
> them.
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
$smarty->left_delimiter = '<!--{';
|
||||
$smarty->right_delimiter = '}-->';
|
||||
|
||||
$smarty->assign('foo', 'bar');
|
||||
$smarty->assign('name', 'Albert');
|
||||
$smarty->display('example.tpl');
|
||||
|
||||
?>
|
||||
|
||||
|
||||
|
||||
Where the template is:
|
||||
|
||||
|
||||
Welcome <!--{$name}--> to Smarty
|
||||
<script language="javascript">
|
||||
var foo = <!--{$foo}-->;
|
||||
function dosomething() {
|
||||
alert("foo is " + foo);
|
||||
}
|
||||
dosomething();
|
||||
</script>
|
||||
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
Math {#language.math}
|
||||
====
|
||||
|
||||
Math can be applied directly to variable values.
|
||||
|
||||
|
||||
{$foo+1}
|
||||
|
||||
{$foo*$bar}
|
||||
|
||||
{* some more complicated examples *}
|
||||
|
||||
{$foo->bar-$bar[1]*$baz->foo->bar()-3*7}
|
||||
|
||||
{if ($foo+$bar.test%$baz*134232+10+$b+10)}
|
||||
|
||||
{$foo|truncate:"`$fooTruncCount/$barTruncFactor-1`"}
|
||||
|
||||
{assign var="foo" value="`$foo+$bar`"}
|
||||
|
||||
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Although Smarty can handle some very complex expressions and syntax,
|
||||
> it is a good rule of thumb to keep the template syntax minimal and
|
||||
> focused on presentation. If you find your template syntax getting too
|
||||
> complex, it may be a good idea to move the bits that do not deal
|
||||
> explicitly with presentation to PHP by way of plugins or modifiers.
|
||||
@@ -1,50 +0,0 @@
|
||||
Attributes {#language.syntax.attributes}
|
||||
==========
|
||||
|
||||
Most of the [functions](#language.syntax.functions) take attributes that
|
||||
specify or modify their behavior. Attributes to Smarty functions are
|
||||
much like HTML attributes. Static values don\'t have to be enclosed in
|
||||
quotes, but it is required for literal strings. Variables with or
|
||||
without modifiers may also be used, and should not be in quotes. You can
|
||||
even use PHP function results, plugin results and complex expressions.
|
||||
|
||||
Some attributes require boolean values (TRUE or FALSE). These can be
|
||||
specified as `true` and `false`. If an attribute has no value assigned
|
||||
it gets the default boolean value of true.
|
||||
|
||||
|
||||
{include file="header.tpl"}
|
||||
|
||||
{include file="header.tpl" nocache} // is equivalent to nocache=true
|
||||
|
||||
{include file="header.tpl" attrib_name="attrib value"}
|
||||
|
||||
{include file=$includeFile}
|
||||
|
||||
{include file=#includeFile# title="My Title"}
|
||||
|
||||
{assign var=foo value={counter}} // plugin result
|
||||
|
||||
{assign var=foo value=substr($bar,2,5)} // PHP function result
|
||||
|
||||
{assign var=foo value=$bar|strlen} // using modifier
|
||||
|
||||
{assign var=foo value=$buh+$bar|strlen} // more complex expression
|
||||
|
||||
{html_select_date display_days=true}
|
||||
|
||||
{mailto address="smarty@example.com"}
|
||||
|
||||
<select name="company_id">
|
||||
{html_options options=$companies selected=$company_id}
|
||||
</select>
|
||||
|
||||
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Although Smarty can handle some very complex expressions and syntax,
|
||||
> it is a good rule of thumb to keep the template syntax minimal and
|
||||
> focused on presentation. If you find your template syntax getting too
|
||||
> complex, it may be a good idea to move the bits that do not deal
|
||||
> explicitly with presentation to PHP by way of plugins or modifiers.
|
||||
@@ -1,71 +0,0 @@
|
||||
Comments {#language.syntax.comments}
|
||||
========
|
||||
|
||||
Template comments are surrounded by asterisks, and that is surrounded by
|
||||
the [delimiter](#variable.left.delimiter) tags like so:
|
||||
|
||||
::: {.informalexample}
|
||||
|
||||
{* this is a comment *}
|
||||
|
||||
|
||||
:::
|
||||
|
||||
Smarty comments are NOT displayed in the final output of the template,
|
||||
unlike `<!-- HTML comments -->`. These are useful for making internal
|
||||
notes in the templates which no one will see ;-)
|
||||
|
||||
|
||||
{* I am a Smarty comment, I don't exist in the compiled output *}
|
||||
<html>
|
||||
<head>
|
||||
<title>{$title}</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
{* another single line smarty comment *}
|
||||
<!-- HTML comment that is sent to the browser -->
|
||||
|
||||
{* this multiline smarty
|
||||
comment is
|
||||
not sent to browser
|
||||
*}
|
||||
|
||||
{*********************************************************
|
||||
Multi line comment block with credits block
|
||||
@ author: bg@example.com
|
||||
@ maintainer: support@example.com
|
||||
@ para: var that sets block style
|
||||
@ css: the style output
|
||||
**********************************************************}
|
||||
|
||||
{* The header file with the main logo and stuff *}
|
||||
{include file='header.tpl'}
|
||||
|
||||
|
||||
{* Dev note: the $includeFile var is assigned in foo.php script *}
|
||||
<!-- Displays main content block -->
|
||||
{include file=$includeFile}
|
||||
|
||||
{* this <select> block is redundant *}
|
||||
{*
|
||||
<select name="company">
|
||||
{html_options options=$vals selected=$selected_id}
|
||||
</select>
|
||||
*}
|
||||
|
||||
<!-- Show header from affiliate is disabled -->
|
||||
{* $affiliate|upper *}
|
||||
|
||||
{* you cannot nest comments *}
|
||||
{*
|
||||
<select name="company">
|
||||
{* <option value="0">-- none -- </option> *}
|
||||
{html_options options=$vals selected=$selected_id}
|
||||
</select>
|
||||
*}
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
Functions {#language.syntax.functions}
|
||||
=========
|
||||
|
||||
Every Smarty tag either prints a [variable](#language.variables) or
|
||||
invokes some sort of function. These are processed and displayed by
|
||||
enclosing the function and its [attributes](#language.syntax.attributes)
|
||||
within delimiters like so: `{funcname attr1="val1" attr2="val2"}`.
|
||||
|
||||
|
||||
{config_load file="colors.conf"}
|
||||
|
||||
{include file="header.tpl"}
|
||||
{insert file="banner_ads.tpl" title="My Site"}
|
||||
|
||||
{if $logged_in}
|
||||
Welcome, <span style="color:{#fontColor#}">{$name}!</span>
|
||||
{else}
|
||||
hi, {$name}
|
||||
{/if}
|
||||
|
||||
{include file="footer.tpl"}
|
||||
|
||||
|
||||
|
||||
- Both [built-in functions](#language.builtin.functions) and [custom
|
||||
functions](#language.custom.functions) have the same syntax within
|
||||
templates.
|
||||
|
||||
- Built-in functions are the **inner** workings of Smarty, such as
|
||||
[`{if}`](#language.function.if),
|
||||
[`{section}`](#language.function.section) and
|
||||
[`{strip}`](#language.function.strip). There should be no need to
|
||||
change or modify them.
|
||||
|
||||
- Custom functions are **additional** functions implemented via
|
||||
[plugins](#plugins). They can be modified to your liking, or you can
|
||||
create new ones. [`{html_options}`](#language.function.html.options)
|
||||
is an example of a custom function.
|
||||
|
||||
See also [`registerPlugin()`](#api.register.plugin)
|
||||
@@ -1,61 +0,0 @@
|
||||
Embedding Vars in Double Quotes {#language.syntax.quotes}
|
||||
===============================
|
||||
|
||||
- Smarty will recognize [assigned](#api.assign)
|
||||
[variables](#language.syntax.variables) embedded in \"double
|
||||
quotes\" so long as the variable name contains only numbers, letters
|
||||
and under\_scores. See [naming](&url.php-manual;language.variables)
|
||||
for more detail.
|
||||
|
||||
- With any other characters, for example a period(.) or
|
||||
`$object->reference`, then the variable must be surrounded by
|
||||
`` `backticks` ``.
|
||||
|
||||
- In addition Smarty3 does allow embedded Smarty tags in double quoted
|
||||
strings. This is useful if you want to include variables with
|
||||
modifiers, plugin or PHP function results.
|
||||
|
||||
<!-- -->
|
||||
|
||||
|
||||
{func var="test $foo test"} // sees $foo
|
||||
{func var="test $foo_bar test"} // sees $foo_bar
|
||||
{func var="test `$foo[0]` test"} // sees $foo[0]
|
||||
{func var="test `$foo[bar]` test"} // sees $foo[bar]
|
||||
{func var="test $foo.bar test"} // sees $foo (not $foo.bar)
|
||||
{func var="test `$foo.bar` test"} // sees $foo.bar
|
||||
{func var="test `$foo.bar` test"|escape} // modifiers outside quotes!
|
||||
{func var="test {$foo|escape} test"} // modifiers inside quotes!
|
||||
{func var="test {time()} test"} // PHP function result
|
||||
{func var="test {counter} test"} // plugin result
|
||||
{func var="variable foo is {if !$foo}not {/if} defined"} // Smarty block function
|
||||
|
||||
|
||||
|
||||
|
||||
{* will replace $tpl_name with value *}
|
||||
{include file="subdir/$tpl_name.tpl"}
|
||||
|
||||
{* does NOT replace $tpl_name *}
|
||||
{include file='subdir/$tpl_name.tpl'} // vars require double quotes!
|
||||
|
||||
{* must have backticks as it contains a dot "." *}
|
||||
{cycle values="one,two,`$smarty.config.myval`"}
|
||||
|
||||
{* must have backticks as it contains a dot "." *}
|
||||
{include file="`$module.contact`.tpl"}
|
||||
|
||||
{* can use variable with dot syntax *}
|
||||
{include file="`$module.$view`.tpl"}
|
||||
|
||||
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Although Smarty can handle some very complex expressions and syntax,
|
||||
> it is a good rule of thumb to keep the template syntax minimal and
|
||||
> focused on presentation. If you find your template syntax getting too
|
||||
> complex, it may be a good idea to move the bits that do not deal
|
||||
> explicitly with presentation to PHP by way of plugins or modifiers.
|
||||
|
||||
See also [`escape`](#language.modifier.escape).
|
||||
@@ -1,111 +0,0 @@
|
||||
Variables {#language.syntax.variables}
|
||||
=========
|
||||
|
||||
Template variables start with the \$dollar sign. They can contain
|
||||
numbers, letters and underscores, much like a [PHP
|
||||
variable](&url.php-manual;language.variables). You can reference arrays
|
||||
by index numerically or non-numerically. Also reference object
|
||||
properties and methods.
|
||||
|
||||
[Config file variables](#language.config.variables) are an exception to
|
||||
the \$dollar syntax and are instead referenced with surrounding
|
||||
\#hashmarks\#, or via the
|
||||
[`$smarty.config`](#language.variables.smarty.config) variable.
|
||||
|
||||
|
||||
{$foo} <-- displaying a simple variable (non array/object)
|
||||
{$foo[4]} <-- display the 5th element of a zero-indexed array
|
||||
{$foo.bar} <-- display the "bar" key value of an array, similar to PHP $foo['bar']
|
||||
{$foo.$bar} <-- display variable key value of an array, similar to PHP $foo[$bar]
|
||||
{$foo->bar} <-- display the object property "bar"
|
||||
{$foo->bar()} <-- display the return value of object method "bar"
|
||||
{#foo#} <-- display the config file variable "foo"
|
||||
{$smarty.config.foo} <-- synonym for {#foo#}
|
||||
{$foo[bar]} <-- syntax only valid in a section loop, see {section}
|
||||
{assign var=foo value='baa'}{$foo} <-- displays "baa", see {assign}
|
||||
|
||||
Many other combinations are allowed
|
||||
|
||||
{$foo.bar.baz}
|
||||
{$foo.$bar.$baz}
|
||||
{$foo[4].baz}
|
||||
{$foo[4].$baz}
|
||||
{$foo.bar.baz[4]}
|
||||
{$foo->bar($baz,2,$bar)} <-- passing parameters
|
||||
{"foo"} <-- static values are allowed
|
||||
|
||||
{* display the server variable "SERVER_NAME" ($_SERVER['SERVER_NAME'])*}
|
||||
{$smarty.server.SERVER_NAME}
|
||||
|
||||
Math and embedding tags:
|
||||
|
||||
{$x+$y} // will output the sum of x and y.
|
||||
{assign var=foo value=$x+$y} // in attributes
|
||||
{$foo[$x+3]} // as array index
|
||||
{$foo={counter}+3} // tags within tags
|
||||
{$foo="this is message {counter}"} // tags within double quoted strings
|
||||
|
||||
Defining Arrays:
|
||||
|
||||
{assign var=foo value=[1,2,3]}
|
||||
{assign var=foo value=['y'=>'yellow','b'=>'blue']}
|
||||
{assign var=foo value=[1,[9,8],3]} // can be nested
|
||||
|
||||
Short variable assignment:
|
||||
|
||||
{$foo=$bar+2}
|
||||
{$foo = strlen($bar)} // function in assignment
|
||||
{$foo = myfunct( ($x+$y)*3 )} // as function parameter
|
||||
{$foo.bar=1} // assign to specific array element
|
||||
{$foo.bar.baz=1}
|
||||
{$foo[]=1} // appending to an array
|
||||
|
||||
Smarty "dot" syntax (note: embedded {} are used to address ambiguities):
|
||||
|
||||
{$foo.a.b.c} => $foo['a']['b']['c']
|
||||
{$foo.a.$b.c} => $foo['a'][$b]['c'] // with variable index
|
||||
{$foo.a.{$b+4}.c} => $foo['a'][$b+4]['c'] // with expression as index
|
||||
{$foo.a.{$b.c}} => $foo['a'][$b['c']] // with nested index
|
||||
|
||||
PHP-like syntax, alternative to "dot" syntax:
|
||||
|
||||
{$foo[1]} // normal access
|
||||
{$foo['bar']}
|
||||
{$foo['bar'][1]}
|
||||
{$foo[$x+$x]} // index may contain any expression
|
||||
{$foo[$bar[1]]} // nested index
|
||||
{$foo[section_name]} // smarty {section} access, not array access!
|
||||
|
||||
Variable variables:
|
||||
|
||||
$foo // normal variable
|
||||
$foo_{$bar} // variable name containing other variable
|
||||
$foo_{$x+$y} // variable name containing expressions
|
||||
$foo_{$bar}_buh_{$blar} // variable name with multiple segments
|
||||
{$foo_{$x}} // will output the variable $foo_1 if $x has a value of 1.
|
||||
|
||||
Object chaining:
|
||||
|
||||
{$object->method1($x)->method2($y)}
|
||||
|
||||
Direct PHP function access:
|
||||
|
||||
{time()}
|
||||
|
||||
|
||||
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Although Smarty can handle some very complex expressions and syntax,
|
||||
> it is a good rule of thumb to keep the template syntax minimal and
|
||||
> focused on presentation. If you find your template syntax getting too
|
||||
> complex, it may be a good idea to move the bits that do not deal
|
||||
> explicitly with presentation to PHP by way of plugins or modifiers.
|
||||
|
||||
Request variables such as `$_GET`, `$_SESSION`, etc are available via
|
||||
the reserved [`$smarty`](#language.variables.smarty) variable.
|
||||
|
||||
See also [`$smarty`](#language.variables.smarty), [config
|
||||
variables](#language.config.variables)
|
||||
[`{assign}`](#language.function.assign) and [`assign()`](#api.assign).
|
||||
@@ -1,39 +0,0 @@
|
||||
Built-in Functions {#language.builtin.functions}
|
||||
==================
|
||||
|
||||
## Table of contents
|
||||
- [{$var=...}](./language-builtin-functions/language-function-shortform-assign.md)
|
||||
- [{append}](./language-builtin-functions/language-function-append.md)
|
||||
- [{assign}](./language-builtin-functions/language-function-assign.md)
|
||||
- [{block}](./language-builtin-functions/language-function-block.md)
|
||||
- [{call}](./language-builtin-functions/language-function-call.md)
|
||||
- [{capture}](./language-builtin-functions/language-function-capture.md)
|
||||
- [{config_load}](./language-builtin-functions/language-function-config.load)
|
||||
- [{debug}](./language-builtin-functions/language-function-debug.md)
|
||||
- [{extends}](./language-builtin-functions/language-function-extends.md)
|
||||
- [{for}](./language-builtin-functions/language-function-for.md)
|
||||
- [{foreach},{foreachelse}](./language-builtin-functions/language-function-foreach.md)
|
||||
- [{function}](./language-builtin-functions/language-function-function.md)
|
||||
- [{if},{elseif},{else}](./language-builtin-functions/language-function-if.md)
|
||||
- [{include}](./language-builtin-functions/language-function-include.md)
|
||||
- [{include_php}](./language-builtin-functions/language-function-include.php)
|
||||
- [{insert}](./language-builtin-functions/language-function-insert.md)
|
||||
- [{ldelim},{rdelim}](./language-builtin-functions/language-function-ldelim.md)
|
||||
- [{literal}](./language-builtin-functions/language-function-literal.md)
|
||||
- [{nocache}](./language-builtin-functions/language-function-nocache.md)
|
||||
- [{section},{sectionelse}](./language-builtin-functions/language-function-section.md)
|
||||
- [{setfilter}](./language-builtin-functions/language-function-setfilter.md)
|
||||
- [{strip}](./language-builtin-functions/language-function-strip.md)
|
||||
- [{while}](./language-builtin-functions/language-function-while.md)
|
||||
|
||||
Smarty comes with several built-in functions. These built-in functions
|
||||
are the integral part of the smarty template engine. They are compiled
|
||||
into corresponding inline PHP code for maximum performance.
|
||||
|
||||
You cannot create your own [custom
|
||||
functions](./language-custom-functions.md) with the same name; and you
|
||||
should not need to modify the built-in functions.
|
||||
|
||||
A few of these functions have an `assign` attribute which collects the
|
||||
result the function to a named template variable instead of being
|
||||
output; much like the [`{assign}`](./language-builtin-functions/language-function-assign.md) function.
|
||||
@@ -1,49 +0,0 @@
|
||||
{append} {#language.function.append}
|
||||
========
|
||||
|
||||
`{append}` is used for creating or appending template variable arrays
|
||||
**during the execution of a template**.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Assignment of variables in-template is essentially placing application
|
||||
> logic into the presentation that may be better handled in PHP. Use at
|
||||
> your own discretion.
|
||||
|
||||
**Attributes:**
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- -------- ---------- --------- ----------------------------------------------------------------------------------------------------
|
||||
var string Yes *n/a* The name of the variable being assigned
|
||||
value string Yes *n/a* The value being assigned
|
||||
index string No *n/a* The index for the new array element. If not specified the value is append to the end of the array.
|
||||
scope string No *n/a* The scope of the assigned variable: \'parent\',\'root\' or \'global\'
|
||||
|
||||
**Option Flags:**
|
||||
|
||||
Name Description
|
||||
--------- -----------------------------------------------------
|
||||
nocache Assigns the variable with the \'nocache\' attribute
|
||||
|
||||
|
||||
{append var='name' value='Bob' index='first'}
|
||||
{append var='name' value='Meyer' index='last'}
|
||||
// or
|
||||
{append 'name' 'Bob' index='first'} {* short-hand *}
|
||||
{append 'name' 'Meyer' index='last'} {* short-hand *}
|
||||
|
||||
The first name is {$name.first}.<br>
|
||||
The last name is {$name.last}.
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
The first name is Bob.
|
||||
The last name is Meyer.
|
||||
|
||||
|
||||
|
||||
See also [`append()`](#api.append) and
|
||||
[`getTemplateVars()`](#api.get.template.vars).
|
||||
@@ -1,149 +0,0 @@
|
||||
{assign} {#language.function.assign}
|
||||
========
|
||||
|
||||
`{assign}` is used for assigning template variables **during the
|
||||
execution of a template**.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Assignment of variables in-template is essentially placing application
|
||||
> logic into the presentation that may be better handled in PHP. Use at
|
||||
> your own discretion.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> See also the [`short-form`](#language.function.shortform.assign)
|
||||
> method of assigning template vars.
|
||||
|
||||
**Attributes:**
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- -------- ---------- --------- -----------------------------------------------------------------------
|
||||
var string Yes *n/a* The name of the variable being assigned
|
||||
value string Yes *n/a* The value being assigned
|
||||
scope string No *n/a* The scope of the assigned variable: \'parent\',\'root\' or \'global\'
|
||||
|
||||
**Option Flags:**
|
||||
|
||||
Name Description
|
||||
--------- -----------------------------------------------------
|
||||
nocache Assigns the variable with the \'nocache\' attribute
|
||||
|
||||
|
||||
{assign var="name" value="Bob"}
|
||||
{assign "name" "Bob"} {* short-hand *}
|
||||
|
||||
The value of $name is {$name}.
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
The value of $name is Bob.
|
||||
|
||||
|
||||
|
||||
|
||||
{assign var="name" value="Bob" nocache}
|
||||
{assign "name" "Bob" nocache} {* short-hand *}
|
||||
|
||||
The value of $name is {$name}.
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
The value of $name is Bob.
|
||||
|
||||
|
||||
|
||||
|
||||
{assign var=running_total value=$running_total+$some_array[$row].some_value}
|
||||
|
||||
|
||||
|
||||
Variables assigned in the included template will be seen in the
|
||||
including template.
|
||||
|
||||
|
||||
{include file="sub_template.tpl"}
|
||||
...
|
||||
{* display variable assigned in sub_template *}
|
||||
{$foo}<br>
|
||||
...
|
||||
|
||||
|
||||
|
||||
The template above includes the example `sub_template.tpl` below
|
||||
|
||||
|
||||
...
|
||||
{* foo will be known also in the including template *}
|
||||
{assign var="foo" value="something" scope=parent}
|
||||
{* bar is assigned only local in the including template *}
|
||||
{assign var="bar" value="value"}
|
||||
...
|
||||
|
||||
You can assign a variable to root of the current root tree. The variable
|
||||
is seen by all templates using the same root tree.
|
||||
|
||||
|
||||
{assign var=foo value="bar" scope="root"}
|
||||
|
||||
|
||||
|
||||
A global variable is seen by all templates.
|
||||
|
||||
|
||||
{assign var=foo value="bar" scope="global"}
|
||||
{assign "foo" "bar" scope="global"} {* short-hand *}
|
||||
|
||||
|
||||
|
||||
To access `{assign}` variables from a php script use
|
||||
[`getTemplateVars()`](#api.get.template.vars). Here\'s the template that
|
||||
creates the variable `$foo`.
|
||||
|
||||
|
||||
{assign var="foo" value="Smarty"}
|
||||
|
||||
The template variables are only available after/during template
|
||||
execution as in the following script.
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
// this will output nothing as the template has not been executed
|
||||
echo $smarty->getTemplateVars('foo');
|
||||
|
||||
// fetch the template to a variable
|
||||
$whole_page = $smarty->fetch('index.tpl');
|
||||
|
||||
// this will output 'smarty' as the template has been executed
|
||||
echo $smarty->getTemplateVars('foo');
|
||||
|
||||
$smarty->assign('foo','Even smarter');
|
||||
|
||||
// this will output 'Even smarter'
|
||||
echo $smarty->getTemplateVars('foo');
|
||||
|
||||
?>
|
||||
|
||||
The following functions can also *optionally* assign template variables.
|
||||
|
||||
[`{capture}`](#language.function.capture),
|
||||
[`{include}`](#language.function.include),
|
||||
[`{include_php}`](#language.function.include.php),
|
||||
[`{insert}`](#language.function.insert),
|
||||
[`{counter}`](#language.function.counter),
|
||||
[`{cycle}`](#language.function.cycle),
|
||||
[`{eval}`](#language.function.eval),
|
||||
[`{fetch}`](#language.function.fetch),
|
||||
[`{math}`](#language.function.math),
|
||||
[`{textformat}`](#language.function.textformat)
|
||||
|
||||
See also [`{$var=...}`](#language.function.shortform.assign),
|
||||
[`assign()`](#api.assign) and
|
||||
[`getTemplateVars()`](#api.get.template.vars).
|
||||
@@ -1,191 +0,0 @@
|
||||
{block} {#language.function.block}
|
||||
=======
|
||||
|
||||
`{block}` is used to define a named area of template source for template
|
||||
inheritance. For details see section of [Template
|
||||
Interitance](#advanced.features.template.inheritance).
|
||||
|
||||
The `{block}` template source area of a child template will replace the
|
||||
correponding areas in the parent template(s).
|
||||
|
||||
Optionally `{block}` areas of child and parent templates can be merged
|
||||
into each other. You can append or prepend the parent `{block}` content
|
||||
by using the `append` or `prepend` option flag with the childs `{block}`
|
||||
definition. With the {\$smarty.block.parent} the `{block}` content of
|
||||
the parent template can be inserted at any location of the child
|
||||
`{block}` content. {\$smarty.block.child} inserts the `{block}` content
|
||||
of the child template at any location of the parent `{block}`.
|
||||
|
||||
`{blocks}'s` can be nested.
|
||||
|
||||
**Attributes:**
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- -------- ---------- --------- ---------------------------------------
|
||||
name string Yes *n/a* The name of the template source block
|
||||
|
||||
**Option Flags (in child templates only):**
|
||||
|
||||
Name Description
|
||||
--------- -------------------------------------------------------------------------------------------
|
||||
append The `{block}` content will be be appended to the content of the parent template `{block}`
|
||||
prepend The `{block}` content will be prepended to the content of the parent template `{block}`
|
||||
hide Ignore the block content if no child block of same name is existing.
|
||||
nocache Disables caching of the `{block}` content
|
||||
|
||||
parent.tpl
|
||||
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>{block name="title"}Default Title{/block}</title>
|
||||
<title>{block "title"}Default Title{/block}</title> {* short-hand *}
|
||||
</head>
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
child.tpl
|
||||
|
||||
|
||||
{extends file="parent.tpl"}
|
||||
{block name="title"}
|
||||
Page Title
|
||||
{/block}
|
||||
|
||||
|
||||
|
||||
The result would look like
|
||||
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>Page Title</title>
|
||||
</head>
|
||||
</html>
|
||||
|
||||
parent.tpl
|
||||
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>{block name="title"}Title - {/block}</title>
|
||||
</head>
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
child.tpl
|
||||
|
||||
|
||||
{extends file="parent.tpl"}
|
||||
{block name="title" prepend}
|
||||
Page Title
|
||||
{/block}
|
||||
|
||||
|
||||
|
||||
The result would look like
|
||||
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>Title - Page Title</title>
|
||||
</head>
|
||||
</html>
|
||||
|
||||
parent.tpl
|
||||
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>{block name="title"} is my title{/block}</title>
|
||||
</head>
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
child.tpl
|
||||
|
||||
|
||||
{extends file="parent.tpl"}
|
||||
{block name="title" append}
|
||||
Page Title
|
||||
{/block}
|
||||
|
||||
|
||||
|
||||
The result would look like
|
||||
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>Page title is my titel</title>
|
||||
</head>
|
||||
</html>
|
||||
|
||||
parent.tpl
|
||||
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>{block name="title"}The {$smarty.block.child} was inserted here{/block}</title>
|
||||
</head>
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
child.tpl
|
||||
|
||||
|
||||
{extends file="parent.tpl"}
|
||||
{block name="title"}
|
||||
Child Title
|
||||
{/block}
|
||||
|
||||
|
||||
|
||||
The result would look like
|
||||
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>The Child Title was inserted here</title>
|
||||
</head>
|
||||
</html>
|
||||
|
||||
parent.tpl
|
||||
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>{block name="title"}Parent Title{/block}</title>
|
||||
</head>
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
child.tpl
|
||||
|
||||
|
||||
{extends file="parent.tpl"}
|
||||
{block name="title"}
|
||||
You will see now - {$smarty.block.parent} - here
|
||||
{/block}
|
||||
|
||||
|
||||
|
||||
The result would look like
|
||||
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>You will see now - Parent Title - here</title>
|
||||
</head>
|
||||
</html>
|
||||
|
||||
See also [Template
|
||||
Inheritance](#advanced.features.template.inheritance),
|
||||
[`$smarty.block.parent`](#language.variables.smarty.block.parent),
|
||||
[`$smarty.block.child`](#language.variables.smarty.block.child), and
|
||||
[`{extends}`](#language.function.extends)
|
||||
@@ -1,76 +0,0 @@
|
||||
{call} {#language.function.call}
|
||||
======
|
||||
|
||||
`{call}` is used to call a template function defined by the
|
||||
[`{function}`](#language.function.function) tag just like a plugin
|
||||
function.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Template functions are defined global. Since the Smarty compiler is a
|
||||
> single-pass compiler, The [`{call}`](#language.function.call) tag must
|
||||
> be used to call a template function defined externally from the given
|
||||
> template. Otherwise you can directly use the function as
|
||||
> `{funcname ...}` in the template.
|
||||
|
||||
- The `{call}` tag must have the `name` attribute which contains the
|
||||
the name of the template function.
|
||||
|
||||
- Values for variables can be passed to the template function as
|
||||
[attributes](#language.syntax.attributes).
|
||||
|
||||
**Attributes:**
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- -------------- ---------- --------- ------------------------------------------------------------------------------------------
|
||||
name string Yes *n/a* The name of the template function
|
||||
assign string No *n/a* The name of the variable that the output of called template function will be assigned to
|
||||
\[var \...\] \[var type\] No *n/a* variable to pass local to template function
|
||||
|
||||
**Option Flags:**
|
||||
|
||||
Name Description
|
||||
--------- --------------------------------------------
|
||||
nocache Call the template function in nocache mode
|
||||
|
||||
|
||||
{* define the function *}
|
||||
{function name=menu level=0}
|
||||
<ul class="level{$level}">
|
||||
{foreach $data as $entry}
|
||||
{if is_array($entry)}
|
||||
<li>{$entry@key}</li>
|
||||
{call name=menu data=$entry level=$level+1}
|
||||
{else}
|
||||
<li>{$entry}</li>
|
||||
{/if}
|
||||
{/foreach}
|
||||
</ul>
|
||||
{/function}
|
||||
|
||||
{* create an array to demonstrate *}
|
||||
{$menu = ['item1','item2','item3' => ['item3-1','item3-2','item3-3' =>
|
||||
['item3-3-1','item3-3-2']],'item4']}
|
||||
|
||||
{* run the array through the function *}
|
||||
{call name=menu data=$menu}
|
||||
{call menu data=$menu} {* short-hand *}
|
||||
|
||||
|
||||
|
||||
Will generate the following output
|
||||
|
||||
|
||||
* item1
|
||||
* item2
|
||||
* item3
|
||||
o item3-1
|
||||
o item3-2
|
||||
o item3-3
|
||||
+ item3-3-1
|
||||
+ item3-3-2
|
||||
* item4
|
||||
|
||||
|
||||
|
||||
See also [`{function}`](#language.function.function)
|
||||
@@ -1,82 +0,0 @@
|
||||
{capture} {#language.function.capture}
|
||||
=========
|
||||
|
||||
`{capture}` is used to collect the output of the template between the
|
||||
tags into a variable instead of displaying it. Any content between
|
||||
`{capture name='foo'}` and `{/capture}` is collected into the variable
|
||||
specified in the `name` attribute.
|
||||
|
||||
The captured content can be used in the template from the variable
|
||||
[`$smarty.capture.foo`](#language.variables.smarty.capture) where "foo"
|
||||
is the value passed in the `name` attribute. If you do not supply the
|
||||
`name` attribute, then "default" will be used as the name ie
|
||||
`$smarty.capture.default`.
|
||||
|
||||
`{capture}'s` can be nested.
|
||||
|
||||
**Attributes:**
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- -------- ---------- --------- ----------------------------------------------------------------------
|
||||
name string Yes *n/a* The name of the captured block
|
||||
assign string No *n/a* The variable name where to assign the captured output to
|
||||
append string No *n/a* The name of an array variable where to append the captured output to
|
||||
|
||||
**Option Flags:**
|
||||
|
||||
Name Description
|
||||
--------- -----------------------------------------
|
||||
nocache Disables caching of this captured block
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Be careful when capturing [`{insert}`](#language.function.insert)
|
||||
> output. If you have [`$caching`](#caching) enabled and you have
|
||||
> [`{insert}`](#language.function.insert) commands that you expect to
|
||||
> run within cached content, do not capture this content.
|
||||
|
||||
|
||||
{* we don't want to print a div tag unless content is displayed *}
|
||||
{capture name="banner"}
|
||||
{capture "banner"} {* short-hand *}
|
||||
{include file="get_banner.tpl"}
|
||||
{/capture}
|
||||
|
||||
{if $smarty.capture.banner ne ""}
|
||||
<div id="banner">{$smarty.capture.banner}</div>
|
||||
{/if}
|
||||
|
||||
|
||||
|
||||
This example demonstrates the capture function.
|
||||
|
||||
|
||||
{capture name=some_content assign=popText}
|
||||
{capture some_content assign=popText} {* short-hand *}
|
||||
The server is {$my_server_name|upper} at {$my_server_addr}<br>
|
||||
Your ip is {$my_ip}.
|
||||
{/capture}
|
||||
<a href="#">{$popText}</a>
|
||||
|
||||
|
||||
|
||||
This example also demonstrates how multiple calls of capture can be used
|
||||
to create an array with captured content.
|
||||
|
||||
|
||||
{capture append="foo"}hello{/capture}I say just {capture append="foo"}world{/capture}
|
||||
{foreach $foo as $text}{$text} {/foreach}
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
I say just hello world
|
||||
|
||||
|
||||
|
||||
See also [`$smarty.capture`](#language.variables.smarty.capture),
|
||||
[`{eval}`](#language.function.eval),
|
||||
[`{fetch}`](#language.function.fetch), [`fetch()`](#api.fetch) and
|
||||
[`{assign}`](#language.function.assign).
|
||||
@@ -1,91 +0,0 @@
|
||||
{config\_load} {#language.function.config.load}
|
||||
==============
|
||||
|
||||
`{config_load}` is used for loading config
|
||||
[`#variables#`](#language.config.variables) from a [configuration
|
||||
file](#config.files) into the template.
|
||||
|
||||
**Attributes:**
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- -------- ---------- --------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
file string Yes *n/a* The name of the config file to include
|
||||
section string No *n/a* The name of the section to load
|
||||
scope string no *local* How the scope of the loaded variables are treated, which must be one of local, parent or global. local means variables are loaded into the local template context. parent means variables are loaded into both the local context and the parent template that called it. global means variables are available to all templates.
|
||||
|
||||
The `example.conf` file.
|
||||
|
||||
|
||||
#this is config file comment
|
||||
|
||||
# global variables
|
||||
pageTitle = "Main Menu"
|
||||
bodyBgColor = #000000
|
||||
tableBgColor = #000000
|
||||
rowBgColor = #00ff00
|
||||
|
||||
#customer variables section
|
||||
[Customer]
|
||||
pageTitle = "Customer Info"
|
||||
|
||||
|
||||
|
||||
and the template
|
||||
|
||||
|
||||
{config_load file="example.conf"}
|
||||
{config_load "example.conf"} {* short-hand *}
|
||||
|
||||
<html>
|
||||
<title>{#pageTitle#|default:"No title"}</title>
|
||||
<body bgcolor="{#bodyBgColor#}">
|
||||
<table border="{#tableBorderSize#}" bgcolor="{#tableBgColor#}">
|
||||
<tr bgcolor="{#rowBgColor#}">
|
||||
<td>First</td>
|
||||
<td>Last</td>
|
||||
<td>Address</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
[Config Files](#config.files) may also contain sections. You can load
|
||||
variables from within a section with the added attribute `section`. Note
|
||||
that global config variables are always loaded along with section
|
||||
variables, and same-named section variables overwrite the globals.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Config file *sections* and the built-in template function called
|
||||
> [`{section}`](#language.function.section) have nothing to do with each
|
||||
> other, they just happen to share a common naming convention.
|
||||
|
||||
|
||||
{config_load file='example.conf' section='Customer'}
|
||||
{config_load 'example.conf' 'Customer'} {* short-hand *}
|
||||
|
||||
<html>
|
||||
<title>{#pageTitle#}</title>
|
||||
<body bgcolor="{#bodyBgColor#}">
|
||||
<table border="{#tableBorderSize#}" bgcolor="{#tableBgColor#}">
|
||||
<tr bgcolor="{#rowBgColor#}">
|
||||
<td>First</td>
|
||||
<td>Last</td>
|
||||
<td>Address</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
See [`$config_overwrite`](#variable.config.overwrite) to create arrays
|
||||
of config file variables.
|
||||
|
||||
See also the [config files](#config.files) page, [config
|
||||
variables](#language.config.variables) page,
|
||||
[`$config_dir`](#variable.config.dir),
|
||||
[`getConfigVars()`](#api.get.config.vars) and
|
||||
[`configLoad()`](#api.config.load).
|
||||
@@ -1,18 +0,0 @@
|
||||
{debug} {#language.function.debug}
|
||||
=======
|
||||
|
||||
`{debug}` dumps the debug console to the page. This works regardless of
|
||||
the [debug](#chapter.debugging.console) settings in the php script.
|
||||
Since this gets executed at runtime, this is only able to show the
|
||||
[assigned](#api.assign) variables; not the templates that are in use.
|
||||
However, you can see all the currently available variables within the
|
||||
scope of a template.
|
||||
|
||||
If caching is enabled and a page is loaded from cache `{debug}` does
|
||||
show only the variables which assigned for the cached page.
|
||||
|
||||
In order to see also the variables which have been locally assigned
|
||||
within the template it does make sense to place the `{debug}` tag at the
|
||||
end of the template.
|
||||
|
||||
See also the [debugging console page](#chapter.debugging.console).
|
||||
@@ -1,37 +0,0 @@
|
||||
{extends} {#language.function.extends}
|
||||
=========
|
||||
|
||||
`{extends}` tags are used in child templates in template inheritance for
|
||||
extending parent templates. For details see section of [Template
|
||||
Interitance](#advanced.features.template.inheritance).
|
||||
|
||||
- The `{extends}` tag must be on the first line of the template.
|
||||
|
||||
- If a child template extends a parent template with the `{extends}`
|
||||
tag it may contain only `{block}` tags. Any other template content
|
||||
is ignored.
|
||||
|
||||
- Use the syntax for [template resources](#resources) to extend files
|
||||
outside of the [`$template_dir`](#variable.template.dir) directory.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> When extending a variable parent like `{extends file=$parent_file}`,
|
||||
> make sure you include `$parent_file` in the
|
||||
> [`$compile_id`](#variable.compile.id). Otherwise Smarty cannot
|
||||
> distinguish between different `$parent_file`s.
|
||||
|
||||
**Attributes:**
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- -------- ---------- --------- -------------------------------------------------
|
||||
file string Yes *n/a* The name of the template file which is extended
|
||||
|
||||
|
||||
{extends file='parent.tpl'}
|
||||
{extends 'parent.tpl'} {* short-hand *}
|
||||
|
||||
|
||||
|
||||
See also [Template Interitance](#advanced.features.template.inheritance)
|
||||
and [`{block}`](#language.function.block).
|
||||
@@ -1,97 +0,0 @@
|
||||
{for} {#language.function.for}
|
||||
=====
|
||||
|
||||
The `{for}{forelse}` tag is used to create simple loops. The following
|
||||
different formarts are supported:
|
||||
|
||||
- `{for $var=$start to $end}` simple loop with step size of 1.
|
||||
|
||||
- `{for $var=$start to $end step $step}` loop with individual step
|
||||
size.
|
||||
|
||||
`{forelse}` is executed when the loop is not iterated.
|
||||
|
||||
**Attributes:**
|
||||
|
||||
Attribute Name Shorthand Type Required Default Description
|
||||
---------------- ----------- --------- ---------- --------- --------------------------------
|
||||
max n/a integer No *n/a* Limit the number of iterations
|
||||
|
||||
**Option Flags:**
|
||||
|
||||
Name Description
|
||||
--------- --------------------------------------
|
||||
nocache Disables caching of the `{for}` loop
|
||||
|
||||
|
||||
<ul>
|
||||
{for $foo=1 to 3}
|
||||
<li>{$foo}</li>
|
||||
{/for}
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
<ul>
|
||||
<li>1</li>
|
||||
<li>2</li>
|
||||
<li>3</li>
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
|
||||
$smarty->assign('to',10);
|
||||
|
||||
|
||||
|
||||
|
||||
<ul>
|
||||
{for $foo=3 to $to max=3}
|
||||
<li>{$foo}</li>
|
||||
{/for}
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
<ul>
|
||||
<li>3</li>
|
||||
<li>4</li>
|
||||
<li>5</li>
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
|
||||
$smarty->assign('start',10);
|
||||
$smarty->assign('to',5);
|
||||
|
||||
|
||||
|
||||
|
||||
<ul>
|
||||
{for $foo=$start to $to}
|
||||
<li>{$foo}</li>
|
||||
{forelse}
|
||||
no iteration
|
||||
{/for}
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
no iteration
|
||||
|
||||
|
||||
|
||||
See also [`{foreach}`](#language.function.foreach),
|
||||
[`{section}`](#language.function.section) and
|
||||
[`{while}`](#language.function.while)
|
||||
@@ -1,407 +0,0 @@
|
||||
{foreach},{foreachelse} {#language.function.foreach}
|
||||
=======================
|
||||
|
||||
`{foreach}` is used for looping over arrays of data. `{foreach}` has a
|
||||
simpler and cleaner syntax than the
|
||||
[`{section}`](#language.function.section) loop, and can also loop over
|
||||
associative arrays.
|
||||
|
||||
`{foreach $arrayvar as $itemvar}`
|
||||
|
||||
`{foreach $arrayvar as $keyvar=>$itemvar}`
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> This foreach syntax does not accept any named attributes. This syntax
|
||||
> is new to Smarty 3, however the Smarty 2.x syntax
|
||||
> `{foreach from=$myarray key="mykey" item="myitem"}` is still
|
||||
> supported.
|
||||
|
||||
- `{foreach}` loops can be nested.
|
||||
|
||||
- The `array` variable, usually an array of values, determines the
|
||||
number of times `{foreach}` will loop. You can also pass an integer
|
||||
for arbitrary loops.
|
||||
|
||||
- `{foreachelse}` is executed when there are no values in the `array`
|
||||
variable.
|
||||
|
||||
- `{foreach}` properties are [`@index`](#foreach.property.index),
|
||||
[`@iteration`](#foreach.property.iteration),
|
||||
[`@first`](#foreach.property.first),
|
||||
[`@last`](#foreach.property.last),
|
||||
[`@show`](#foreach.property.show),
|
||||
[`@total`](#foreach.property.total).
|
||||
|
||||
- `{foreach}` constructs are [`{break}`](#foreach.construct.break),
|
||||
[`{continue}`](#foreach.construct.continue).
|
||||
|
||||
- Instead of specifying the `key` variable you can access the current
|
||||
key of the loop item by `{$item@key}` (see examples below).
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> The `$var@property` syntax is new to Smarty 3, however when using the
|
||||
> Smarty 2 `{foreach from=$myarray key="mykey" item="myitem"}` style
|
||||
> syntax, the `$smarty.foreach.name.property` syntax is still supported.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Although you can retrieve the array key with the syntax
|
||||
> `{foreach $myArray as $myKey => $myValue}`, the key is always
|
||||
> available as `$myValue@key` within the foreach loop.
|
||||
|
||||
**Option Flags:**
|
||||
|
||||
Name Description
|
||||
--------- ------------------------------------------
|
||||
nocache Disables caching of the `{foreach}` loop
|
||||
|
||||
|
||||
<?php
|
||||
$arr = array('red', 'green', 'blue');
|
||||
$smarty->assign('myColors', $arr);
|
||||
?>
|
||||
|
||||
|
||||
|
||||
Template to output `$myColors` in an un-ordered list
|
||||
|
||||
|
||||
<ul>
|
||||
{foreach $myColors as $color}
|
||||
<li>{$color}</li>
|
||||
{/foreach}
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
<ul>
|
||||
<li>red</li>
|
||||
<li>green</li>
|
||||
<li>blue</li>
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
|
||||
<?php
|
||||
$people = array('fname' => 'John', 'lname' => 'Doe', 'email' => 'j.doe@example.com');
|
||||
$smarty->assign('myPeople', $people);
|
||||
?>
|
||||
|
||||
|
||||
|
||||
Template to output `$myArray` as key/value pairs.
|
||||
|
||||
|
||||
<ul>
|
||||
{foreach $myPeople as $value}
|
||||
<li>{$value@key}: {$value}</li>
|
||||
{/foreach}
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
<ul>
|
||||
<li>fname: John</li>
|
||||
<li>lname: Doe</li>
|
||||
<li>email: j.doe@example.com</li>
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
Assign an array to Smarty, the key contains the key for each looped
|
||||
value.
|
||||
|
||||
|
||||
<?php
|
||||
$smarty->assign('contacts', array(
|
||||
array('phone' => '555-555-1234',
|
||||
'fax' => '555-555-5678',
|
||||
'cell' => '555-555-0357'),
|
||||
array('phone' => '800-555-4444',
|
||||
'fax' => '800-555-3333',
|
||||
'cell' => '800-555-2222')
|
||||
));
|
||||
?>
|
||||
|
||||
|
||||
|
||||
The template to output `$contact`.
|
||||
|
||||
|
||||
{* key always available as a property *}
|
||||
{foreach $contacts as $contact}
|
||||
{foreach $contact as $value}
|
||||
{$value@key}: {$value}
|
||||
{/foreach}
|
||||
{/foreach}
|
||||
|
||||
{* accessing key the PHP syntax alternate *}
|
||||
{foreach $contacts as $contact}
|
||||
{foreach $contact as $key => $value}
|
||||
{$key}: {$value}
|
||||
{/foreach}
|
||||
{/foreach}
|
||||
|
||||
|
||||
|
||||
Either of the above examples will output:
|
||||
|
||||
|
||||
phone: 555-555-1234
|
||||
fax: 555-555-5678
|
||||
cell: 555-555-0357
|
||||
phone: 800-555-4444
|
||||
fax: 800-555-3333
|
||||
cell: 800-555-2222
|
||||
|
||||
|
||||
|
||||
A database (PDO) example of looping over search results. This example is
|
||||
looping over a PHP iterator instead of an array().
|
||||
|
||||
|
||||
<?php
|
||||
include('Smarty.class.php');
|
||||
|
||||
$smarty = new Smarty;
|
||||
|
||||
$dsn = 'mysql:host=localhost;dbname=test';
|
||||
$login = 'test';
|
||||
$passwd = 'test';
|
||||
|
||||
// setting PDO to use buffered queries in mysql is
|
||||
// important if you plan on using multiple result cursors
|
||||
// in the template.
|
||||
|
||||
$db = new PDO($dsn, $login, $passwd, array(
|
||||
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true));
|
||||
|
||||
$res = $db->prepare("select * from users");
|
||||
$res->execute();
|
||||
$res->setFetchMode(PDO::FETCH_LAZY);
|
||||
|
||||
// assign to smarty
|
||||
$smarty->assign('res',$res);
|
||||
|
||||
$smarty->display('index.tpl');?>
|
||||
?>
|
||||
|
||||
|
||||
|
||||
|
||||
{foreach $res as $r}
|
||||
{$r.id}
|
||||
{$r.name}
|
||||
{foreachelse}
|
||||
.. no results ..
|
||||
{/foreach}
|
||||
|
||||
|
||||
|
||||
The above is assuming the results contain the columns named `id` and
|
||||
`name`.
|
||||
|
||||
What is the advantage of an iterator vs. looping over a plain old array?
|
||||
With an array, all the results are accumulated into memory before being
|
||||
looped. With an iterator, each result is loaded/released within the
|
||||
loop. This saves processing time and memory, especially for very large
|
||||
result sets.
|
||||
|
||||
\@index {#foreach.property.index}
|
||||
-------
|
||||
|
||||
`index` contains the current array index, starting with zero.
|
||||
|
||||
|
||||
{* output empty row on the 4th iteration (when index is 3) *}
|
||||
<table>
|
||||
{foreach $items as $i}
|
||||
{if $i@index eq 3}
|
||||
{* put empty table row *}
|
||||
<tr><td>nbsp;</td></tr>
|
||||
{/if}
|
||||
<tr><td>{$i.label}</td></tr>
|
||||
{/foreach}
|
||||
</table>
|
||||
|
||||
|
||||
|
||||
\@iteration {#foreach.property.iteration}
|
||||
-----------
|
||||
|
||||
`iteration` contains the current loop iteration and always starts at
|
||||
one, unlike [`index`](#foreach.property.index). It is incremented by one
|
||||
on each iteration.
|
||||
|
||||
The *\"is div by\"* operator can be used to detect a specific iteration.
|
||||
Here we bold-face the name every 4th iteration.
|
||||
|
||||
|
||||
{foreach $myNames as $name}
|
||||
{if $name@iteration is div by 4}
|
||||
<b>{$name}</b>
|
||||
{/if}
|
||||
{$name}
|
||||
{/foreach}
|
||||
|
||||
The *\"is even by\"* and *\"is odd by\"* operators can be used to
|
||||
alternate something every so many iterations. Choosing between even or
|
||||
odd rotates which one starts. Here we switch the font color every 3rd
|
||||
iteration.
|
||||
|
||||
|
||||
{foreach $myNames as $name}
|
||||
{if $name@iteration is even by 3}
|
||||
<span style="color: #000">{$name}</span>
|
||||
{else}
|
||||
<span style="color: #eee">{$name}</span>
|
||||
{/if}
|
||||
{/foreach}
|
||||
|
||||
|
||||
|
||||
This will output something similar to this:
|
||||
|
||||
|
||||
<span style="color: #000">...</span>
|
||||
<span style="color: #000">...</span>
|
||||
<span style="color: #000">...</span>
|
||||
<span style="color: #eee">...</span>
|
||||
<span style="color: #eee">...</span>
|
||||
<span style="color: #eee">...</span>
|
||||
<span style="color: #000">...</span>
|
||||
<span style="color: #000">...</span>
|
||||
<span style="color: #000">...</span>
|
||||
<span style="color: #eee">...</span>
|
||||
<span style="color: #eee">...</span>
|
||||
<span style="color: #eee">...</span>
|
||||
...
|
||||
|
||||
|
||||
|
||||
\@first {#foreach.property.first}
|
||||
-------
|
||||
|
||||
`first` is TRUE if the current `{foreach}` iteration is the initial one.
|
||||
Here we display a table header row on the first iteration.
|
||||
|
||||
|
||||
{* show table header at first iteration *}
|
||||
<table>
|
||||
{foreach $items as $i}
|
||||
{if $i@first}
|
||||
<tr>
|
||||
<th>key</td>
|
||||
<th>name</td>
|
||||
</tr>
|
||||
{/if}
|
||||
<tr>
|
||||
<td>{$i@key}</td>
|
||||
<td>{$i.name}</td>
|
||||
</tr>
|
||||
{/foreach}
|
||||
</table>
|
||||
|
||||
|
||||
|
||||
\@last {#foreach.property.last}
|
||||
------
|
||||
|
||||
`last` is set to TRUE if the current `{foreach}` iteration is the final
|
||||
one. Here we display a horizontal rule on the last iteration.
|
||||
|
||||
|
||||
{* Add horizontal rule at end of list *}
|
||||
{foreach $items as $item}
|
||||
<a href="#{$item.id}">{$item.name}</a>{if $item@last}<hr>{else},{/if}
|
||||
{foreachelse}
|
||||
... no items to loop ...
|
||||
{/foreach}
|
||||
|
||||
|
||||
|
||||
\@show {#foreach.property.show}
|
||||
------
|
||||
|
||||
The show `show` property can be used after the execution of a
|
||||
`{foreach}` loop to detect if data has been displayed or not. `show` is
|
||||
a boolean value.
|
||||
|
||||
|
||||
<ul>
|
||||
{foreach $myArray as $name}
|
||||
<li>{$name}</li>
|
||||
{/foreach}
|
||||
</ul>
|
||||
{if $name@show} do something here if the array contained data {/if}
|
||||
|
||||
\@total {#foreach.property.total}
|
||||
-------
|
||||
|
||||
`total` contains the number of iterations that this `{foreach}` will
|
||||
loop. This can be used inside or after the `{foreach}`.
|
||||
|
||||
|
||||
{* show number of rows at end *}
|
||||
{foreach $items as $item}
|
||||
{$item.name}<hr/>
|
||||
{if $item@last}
|
||||
<div id="total">{$item@total} items</div>
|
||||
{/if}
|
||||
{foreachelse}
|
||||
... no items to loop ...
|
||||
{/foreach}
|
||||
|
||||
See also [`{section}`](#language.function.section),
|
||||
[`{for}`](#language.function.for) and
|
||||
[`{while}`](#language.function.while)
|
||||
|
||||
{break} {#foreach.construct.break}
|
||||
-------
|
||||
|
||||
`{break}` aborts the iteration of the array
|
||||
|
||||
|
||||
{$data = [1,2,3,4,5]}
|
||||
{foreach $data as $value}
|
||||
{if $value == 3}
|
||||
{* abort iterating the array *}
|
||||
{break}
|
||||
{/if}
|
||||
{$value}
|
||||
{/foreach}
|
||||
{*
|
||||
prints: 1 2
|
||||
*}
|
||||
|
||||
|
||||
|
||||
{continue} {#foreach.construct.continue}
|
||||
----------
|
||||
|
||||
`{continue}` leaves the current iteration and begins with the next
|
||||
iteration.
|
||||
|
||||
|
||||
{$data = [1,2,3,4,5]}
|
||||
{foreach $data as $value}
|
||||
{if $value == 3}
|
||||
{* skip this iteration *}
|
||||
{continue}
|
||||
{/if}
|
||||
{$value}
|
||||
{/foreach}
|
||||
{*
|
||||
prints: 1 2 4 5
|
||||
*}
|
||||
|
||||
|
||||
@@ -1,88 +0,0 @@
|
||||
{function} {#language.function.function}
|
||||
==========
|
||||
|
||||
`{function}` is used to create functions within a template and call them
|
||||
just like a plugin function. Instead of writing a plugin that generates
|
||||
presentational content, keeping it in the template is often a more
|
||||
manageable choice. It also simplifies data traversal, such as deeply
|
||||
nested menus.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Template functions are defined global. Since the Smarty compiler is a
|
||||
> single-pass compiler, The [`{call}`](#language.function.call) tag must
|
||||
> be used to call a template function defined externally from the given
|
||||
> template. Otherwise you can directly use the function as
|
||||
> `{funcname ...}` in the template.
|
||||
|
||||
- The `{function}` tag must have the `name` attribute which contains
|
||||
the the name of the template function. A tag with this name can be
|
||||
used to call the template function.
|
||||
|
||||
- Default values for variables can be passed to the template function
|
||||
as [attributes](#language.syntax.attributes). Like in PHP function
|
||||
declarations you can only use scalar values as default. The default
|
||||
values can be overwritten when the template function is being
|
||||
called.
|
||||
|
||||
- You can use all variables from the calling template inside the
|
||||
template function. Changes to variables or new created variables
|
||||
inside the template function have local scope and are not visible
|
||||
inside the calling template after the template function is executed.
|
||||
|
||||
**Attributes:**
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- -------------- ---------- --------- ---------------------------------------------------------------
|
||||
name string Yes *n/a* The name of the template function
|
||||
\[var \...\] \[var type\] No *n/a* default variable value to pass local to the template function
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> You can pass any number of parameter to the template function when it
|
||||
> is called. The parameter variables must not be declared in the
|
||||
> `{funcname ...}` tag unless you what to use default values. Default
|
||||
> values must be scalar and can not be variable. Variables must be
|
||||
> passed when the template is called.
|
||||
|
||||
|
||||
{* define the function *}
|
||||
{function name=menu level=0}
|
||||
{function menu level=0} {* short-hand *}
|
||||
<ul class="level{$level}">
|
||||
{foreach $data as $entry}
|
||||
{if is_array($entry)}
|
||||
<li>{$entry@key}</li>
|
||||
{menu data=$entry level=$level+1}
|
||||
{else}
|
||||
<li>{$entry}</li>
|
||||
{/if}
|
||||
{/foreach}
|
||||
</ul>
|
||||
{/function}
|
||||
|
||||
{* create an array to demonstrate *}
|
||||
{$menu = ['item1','item2','item3' => ['item3-1','item3-2','item3-3' =>
|
||||
['item3-3-1','item3-3-2']],'item4']}
|
||||
|
||||
{* run the array through the function *}
|
||||
{menu data=$menu}
|
||||
|
||||
|
||||
|
||||
Will generate the following output
|
||||
|
||||
|
||||
* item1
|
||||
* item2
|
||||
* item3
|
||||
o item3-1
|
||||
o item3-2
|
||||
o item3-3
|
||||
+ item3-3-1
|
||||
+ item3-3-2
|
||||
* item4
|
||||
|
||||
|
||||
|
||||
See also [`{call}`](#language.function.call)
|
||||
@@ -1,121 +0,0 @@
|
||||
{if},{elseif},{else} {#language.function.if}
|
||||
====================
|
||||
|
||||
`{if}` statements in Smarty have much the same flexibility as PHP
|
||||
[if](&url.php-manual;if) statements, with a few added features for the
|
||||
template engine. Every `{if}` must be paired with a matching `{/if}`.
|
||||
`{else}` and `{elseif}` are also permitted. All PHP conditionals and
|
||||
functions are recognized, such as *\|\|*, *or*, *&&*, *and*,
|
||||
*is\_array()*, etc.
|
||||
|
||||
If securty is enabled, only PHP functions from `$php_functions` property
|
||||
of the securty policy are allowed. See the
|
||||
[Security](#advanced.features.security) section for details.
|
||||
|
||||
The following is a list of recognized qualifiers, which must be
|
||||
separated from surrounding elements by spaces. Note that items listed in
|
||||
\[brackets\] are optional. PHP equivalents are shown where applicable.
|
||||
|
||||
Qualifier Alternates Syntax Example Meaning PHP Equivalent
|
||||
-------------------- ------------ ------------------------ -------------------------------- ----------------------
|
||||
== eq \$a eq \$b equals ==
|
||||
!= ne, neq \$a neq \$b not equals !=
|
||||
\> gt \$a gt \$b greater than \>
|
||||
\< lt \$a lt \$b less than \<
|
||||
\>= gte, ge \$a ge \$b greater than or equal \>=
|
||||
\<= lte, le \$a le \$b less than or equal \<=
|
||||
=== \$a === 0 check for identity ===
|
||||
! not not \$a negation (unary) !
|
||||
\% mod \$a mod \$b modulous \%
|
||||
is \[not\] div by \$a is not div by 4 divisible by \$a % \$b == 0
|
||||
is \[not\] even \$a is not even \[not\] an even number (unary) \$a % 2 == 0
|
||||
is \[not\] even by \$a is not even by \$b grouping level \[not\] even (\$a / \$b) % 2 == 0
|
||||
is \[not\] odd \$a is not odd \[not\] an odd number (unary) \$a % 2 != 0
|
||||
is \[not\] odd by \$a is not odd by \$b \[not\] an odd grouping (\$a / \$b) % 2 != 0
|
||||
|
||||
|
||||
{if $name eq 'Fred'}
|
||||
Welcome Sir.
|
||||
{elseif $name eq 'Wilma'}
|
||||
Welcome Ma'am.
|
||||
{else}
|
||||
Welcome, whatever you are.
|
||||
{/if}
|
||||
|
||||
{* an example with "or" logic *}
|
||||
{if $name eq 'Fred' or $name eq 'Wilma'}
|
||||
...
|
||||
{/if}
|
||||
|
||||
{* same as above *}
|
||||
{if $name == 'Fred' || $name == 'Wilma'}
|
||||
...
|
||||
{/if}
|
||||
|
||||
|
||||
{* parenthesis are allowed *}
|
||||
{if ( $amount < 0 or $amount > 1000 ) and $volume >= #minVolAmt#}
|
||||
...
|
||||
{/if}
|
||||
|
||||
|
||||
{* you can also embed php function calls *}
|
||||
{if count($var) gt 0}
|
||||
...
|
||||
{/if}
|
||||
|
||||
{* check for array. *}
|
||||
{if is_array($foo) }
|
||||
.....
|
||||
{/if}
|
||||
|
||||
{* check for not null. *}
|
||||
{if isset($foo) }
|
||||
.....
|
||||
{/if}
|
||||
|
||||
|
||||
{* test if values are even or odd *}
|
||||
{if $var is even}
|
||||
...
|
||||
{/if}
|
||||
{if $var is odd}
|
||||
...
|
||||
{/if}
|
||||
{if $var is not odd}
|
||||
...
|
||||
{/if}
|
||||
|
||||
|
||||
{* test if var is divisible by 4 *}
|
||||
{if $var is div by 4}
|
||||
...
|
||||
{/if}
|
||||
|
||||
|
||||
{*
|
||||
test if var is even, grouped by two. i.e.,
|
||||
0=even, 1=even, 2=odd, 3=odd, 4=even, 5=even, etc.
|
||||
*}
|
||||
{if $var is even by 2}
|
||||
...
|
||||
{/if}
|
||||
|
||||
{* 0=even, 1=even, 2=even, 3=odd, 4=odd, 5=odd, etc. *}
|
||||
{if $var is even by 3}
|
||||
...
|
||||
{/if}
|
||||
|
||||
|
||||
|
||||
|
||||
{if isset($name) && $name == 'Blog'}
|
||||
{* do something *}
|
||||
{elseif $name == $foo}
|
||||
{* do something *}
|
||||
{/if}
|
||||
|
||||
{if is_array($foo) && count($foo) > 0}
|
||||
{* do a foreach loop *}
|
||||
{/if}
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
{include\_php} {#language.function.include.php}
|
||||
==============
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> `{include_php}` is deprecated from Smarty, use registered plugins to
|
||||
> properly insulate presentation from the application code. As of Smarty
|
||||
> 3.1 the `{include_php}` tags are only available from [SmartyBC](#bc).
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- --------- ---------- --------- ----------------------------------------------------------------------------------
|
||||
file string Yes *n/a* The name of the php file to include as absolute path
|
||||
once boolean No *TRUE* whether or not to include the php file more than once if included multiple times
|
||||
assign string No *n/a* The name of the variable that the output of include\_php will be assigned to
|
||||
|
||||
**Option Flags:**
|
||||
|
||||
Name Description
|
||||
--------- ----------------------------------------
|
||||
nocache Disables caching of inluded PHP script
|
||||
|
||||
`{include_php}` tags are used to include a php script in your template.
|
||||
The path of the attribute `file` can be either absolute, or relative to
|
||||
[`$trusted_dir`](#variable.trusted.dir). If security is enabled, then
|
||||
the script must be located in the `$trusted_dir` path of the securty
|
||||
policy. See the [Security](#advanced.features.security) section for
|
||||
details.
|
||||
|
||||
By default, php files are only included once even if called multiple
|
||||
times in the template. You can specify that it should be included every
|
||||
time with the `once` attribute. Setting once to FALSE will include the
|
||||
php script each time it is included in the template.
|
||||
|
||||
You can optionally pass the `assign` attribute, which will specify a
|
||||
template variable name that the output of `{include_php}` will be
|
||||
assigned to instead of displayed.
|
||||
|
||||
The smarty object is available as `$_smarty_tpl->smarty` within the PHP
|
||||
script that you include.
|
||||
|
||||
The `load_nav.php` file:
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
// load in variables from a mysql db and assign them to the template
|
||||
require_once('database.class.php');
|
||||
$db = new Db();
|
||||
$db->query('select url, name from navigation order by name');
|
||||
$this->assign('navigation', $db->getRows());
|
||||
|
||||
?>
|
||||
|
||||
|
||||
|
||||
where the template is:
|
||||
|
||||
|
||||
{* absolute path, or relative to $trusted_dir *}
|
||||
{include_php file='/path/to/load_nav.php'}
|
||||
{include_php '/path/to/load_nav.php'} {* short-hand *}
|
||||
|
||||
{foreach item='nav' from=$navigation}
|
||||
<a href="{$nav.url}">{$nav.name}</a><br />
|
||||
{/foreach}
|
||||
|
||||
|
||||
|
||||
See also [`{include}`](#language.function.include),
|
||||
[`$trusted_dir`](#variable.trusted.dir),
|
||||
[`{php}`](#language.function.php),
|
||||
[`{capture}`](#language.function.capture), [template
|
||||
resources](#resources) and [componentized
|
||||
templates](#tips.componentized.templates)
|
||||
@@ -1,194 +0,0 @@
|
||||
{include} {#language.function.include}
|
||||
=========
|
||||
|
||||
`{include}` tags are used for including other templates in the current
|
||||
template. Any variables available in the current template are also
|
||||
available within the included template.
|
||||
|
||||
- The `{include}` tag must have the `file` attribute which contains
|
||||
the template resource path.
|
||||
|
||||
- Setting the optional `assign` attribute specifies the template
|
||||
variable that the output of `{include}` is assigned to, instead of
|
||||
being displayed. Similar to [`{assign}`](#language.function.assign).
|
||||
|
||||
- Variables can be passed to included templates as
|
||||
[attributes](#language.syntax.attributes). Any variables explicitly
|
||||
passed to an included template are only available within the scope
|
||||
of the included file. Attribute variables override current template
|
||||
variables, in the case when they are named the same.
|
||||
|
||||
- You can use all variables from the including template inside the
|
||||
included template. But changes to variables or new created variables
|
||||
inside the included template have local scope and are not visible
|
||||
inside the including template after the `{include}` statement. This
|
||||
default behaviour can be changed for all variables assigned in the
|
||||
included template by using the scope attribute at the `{include}`
|
||||
statement or for individual variables by using the scope attribute
|
||||
at the [`{assign}`](#language.function.assign) statement. The later
|
||||
is useful to return values from the included template to the
|
||||
including template.
|
||||
|
||||
- Use the syntax for [template resources](#resources) to `{include}`
|
||||
files outside of the [`$template_dir`](#variable.template.dir)
|
||||
directory.
|
||||
|
||||
**Attributes:**
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
----------------- ---------------- ---------- --------- --------------------------------------------------------------------------------------------------
|
||||
file string Yes *n/a* The name of the template file to include
|
||||
assign string No *n/a* The name of the variable that the output of include will be assigned to
|
||||
cache\_lifetime integer No *n/a* Enable caching of this subtemplate with an individual cache lifetime
|
||||
compile\_id string/integer No *n/a* Compile this subtemplate with an individual compile\_id
|
||||
cache\_id string/integer No *n/a* Enable caching of this subtemplate with an individual cache\_id
|
||||
scope string No *n/a* Define the scope of all in the subtemplate assigned variables: \'parent\',\'root\' or \'global\'
|
||||
\[var \...\] \[var type\] No *n/a* variable to pass local to template
|
||||
|
||||
**Option Flags:**
|
||||
|
||||
Name Description
|
||||
--------- -------------------------------------------------------------------------------------
|
||||
nocache Disables caching of this subtemplate
|
||||
caching Enable caching of this subtemplate
|
||||
inline If set merge the compile code of the subtemplate into the compiled calling template
|
||||
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>{$title}</title>
|
||||
</head>
|
||||
<body>
|
||||
{include file='page_header.tpl'}
|
||||
|
||||
{* body of template goes here, the $tpl_name variable
|
||||
is replaced with a value eg 'contact.tpl'
|
||||
*}
|
||||
{include file="$tpl_name.tpl"}
|
||||
|
||||
{* using shortform file attribute *}
|
||||
{include 'page_footer.tpl'}
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
|
||||
{include 'links.tpl' title='Newest links' links=$link_array}
|
||||
{* body of template goes here *}
|
||||
{include 'footer.tpl' foo='bar'}
|
||||
|
||||
|
||||
|
||||
The template above includes the example `links.tpl` below
|
||||
|
||||
|
||||
<div id="box">
|
||||
<h3>{$title}{/h3>
|
||||
<ul>
|
||||
{foreach from=$links item=l}
|
||||
.. do stuff ...
|
||||
</foreach}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
Variables assigned in the included template will be seen in the
|
||||
including template.
|
||||
|
||||
|
||||
{include 'sub_template.tpl' scope=parent}
|
||||
...
|
||||
{* display variables assigned in sub_template *}
|
||||
{$foo}<br>
|
||||
{$bar}<br>
|
||||
...
|
||||
|
||||
|
||||
|
||||
The template above includes the example `sub_template.tpl` below
|
||||
|
||||
|
||||
...
|
||||
{assign var=foo value='something'}
|
||||
{assign var=bar value='value'}
|
||||
...
|
||||
|
||||
The included template will not be cached.
|
||||
|
||||
|
||||
{include 'sub_template.tpl' nocache}
|
||||
...
|
||||
|
||||
|
||||
|
||||
In this example included template will be cached with an individual
|
||||
cache lifetime of 500 seconds.
|
||||
|
||||
|
||||
{include 'sub_template.tpl' cache_lifetime=500}
|
||||
...
|
||||
|
||||
|
||||
|
||||
In this example included template will be cached independent of the
|
||||
global cahing setting.
|
||||
|
||||
|
||||
{include 'sub_template.tpl' caching}
|
||||
...
|
||||
|
||||
|
||||
|
||||
This example assigns the contents of `nav.tpl` to the `$navbar`
|
||||
variable, which is then output at both the top and bottom of the page.
|
||||
|
||||
|
||||
<body>
|
||||
{include 'nav.tpl' assign=navbar}
|
||||
{include 'header.tpl' title='Smarty is cool'}
|
||||
{$navbar}
|
||||
{* body of template goes here *}
|
||||
{$navbar}
|
||||
{include 'footer.tpl'}
|
||||
</body>
|
||||
|
||||
|
||||
|
||||
This example includes another template relative to the directory of the
|
||||
current template.
|
||||
|
||||
|
||||
{include 'template-in-a-template_dir-directory.tpl'}
|
||||
{include './template-in-same-directory.tpl'}
|
||||
{include '../template-in-parent-directory.tpl'}
|
||||
|
||||
|
||||
|
||||
|
||||
{* absolute filepath *}
|
||||
{include file='/usr/local/include/templates/header.tpl'}
|
||||
|
||||
{* absolute filepath (same thing) *}
|
||||
{include file='file:/usr/local/include/templates/header.tpl'}
|
||||
|
||||
{* windows absolute filepath (MUST use "file:" prefix) *}
|
||||
{include file='file:C:/www/pub/templates/header.tpl'}
|
||||
|
||||
{* include from template resource named "db" *}
|
||||
{include file='db:header.tpl'}
|
||||
|
||||
{* include a $variable template - eg $module = 'contacts' *}
|
||||
{include file="$module.tpl"}
|
||||
|
||||
{* wont work as its single quotes ie no variable substitution *}
|
||||
{include file='$module.tpl'}
|
||||
|
||||
{* include a multi $variable template - eg amber/links.view.tpl *}
|
||||
{include file="$style_dir/$module.$view.tpl"}
|
||||
|
||||
|
||||
|
||||
See also [`{include_php}`](#language.function.include.php),
|
||||
[`{insert}`](#language.function.insert),
|
||||
[`{php}`](#language.function.php), [template resources](#resources) and
|
||||
[componentized templates](#tips.componentized.templates).
|
||||
@@ -1,86 +0,0 @@
|
||||
{insert} {#language.function.insert}
|
||||
========
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> `{insert}` tags are deprecated from Smarty, and should not be used.
|
||||
> Put your PHP logic in PHP scripts or plugin functions instead.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> As of Smarty 3.1 the `{insert}` tags are only available from
|
||||
> [SmartyBC](#bc).
|
||||
|
||||
`{insert}` tags work much like [`{include}`](#language.function.include)
|
||||
tags, except that `{insert}` tags are NOT cached when template
|
||||
[caching](#caching) is enabled. They will be executed on every
|
||||
invocation of the template.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- -------------- ---------- --------- ----------------------------------------------------------------------------------
|
||||
name string Yes *n/a* The name of the insert function (insert\_`name`) or insert plugin
|
||||
assign string No *n/a* The name of the template variable the output will be assigned to
|
||||
script string No *n/a* The name of the php script that is included before the insert function is called
|
||||
\[var \...\] \[var type\] No *n/a* variable to pass to insert function
|
||||
|
||||
Let\'s say you have a template with a banner slot at the top of the
|
||||
page. The banner can contain any mixture of HTML, images, flash, etc. so
|
||||
we can\'t just use a static link here, and we don\'t want this contents
|
||||
cached with the page. In comes the {insert} tag: the template knows
|
||||
\#banner\_location\_id\# and \#site\_id\# values (gathered from a
|
||||
[config file](#config.files)), and needs to call a function to get the
|
||||
banner contents.
|
||||
|
||||
{* example of fetching a banner *}
|
||||
{insert name="getBanner" lid=#banner_location_id# sid=#site_id#}
|
||||
{insert "getBanner" lid=#banner_location_id# sid=#site_id#} {* short-hand *}
|
||||
|
||||
In this example, we are using the name "getBanner" and passing the
|
||||
parameters \#banner\_location\_id\# and \#site\_id\#. Smarty will look
|
||||
for a function named insert\_getBanner() in your PHP application,
|
||||
passing the values of \#banner\_location\_id\# and \#site\_id\# as the
|
||||
first argument in an associative array. All {insert} function names in
|
||||
your application must be prepended with \"insert\_\" to remedy possible
|
||||
function name-space conflicts. Your insert\_getBanner() function should
|
||||
do something with the passed values and return the results. These
|
||||
results are then displayed in the template in place of the {insert} tag.
|
||||
In this example, Smarty would call this function:
|
||||
insert\_getBanner(array(\"lid\" =\> \"12345\",\"sid\" =\> \"67890\"));
|
||||
and display the returned results in place of the {insert} tag.
|
||||
|
||||
- If you supply the `assign` attribute, the output of the `{insert}`
|
||||
tag will be assigned to this template variable instead of being
|
||||
output to the template.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Assigning the output to a template variable isn\'t too useful with
|
||||
> [caching](#variable.caching) enabled.
|
||||
|
||||
- If you supply the `script` attribute, this php script will be
|
||||
included (only once) before the `{insert}` function is executed.
|
||||
This is the case where the insert function may not exist yet, and a
|
||||
php script must be included first to make it work.
|
||||
|
||||
The path can be either absolute, or relative to
|
||||
[`$trusted_dir`](#variable.trusted.dir). If security is enabled,
|
||||
then the script must be located in the `$trusted_dir` path of the
|
||||
securty policy. See the [Security](#advanced.features.security)
|
||||
section for details.
|
||||
|
||||
The Smarty object is passed as the second argument. This way you can
|
||||
reference and modify information in the Smarty object from within the
|
||||
`{insert}` function.
|
||||
|
||||
If no PHP script can be found Smarty is looking for a corresponding
|
||||
insert plugin.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> It is possible to have portions of the template not cached. If you
|
||||
> have [caching](#caching) turned on, `{insert}` tags will not be
|
||||
> cached. They will run dynamically every time the page is created, even
|
||||
> within cached pages. This works good for things like banners, polls,
|
||||
> live weather, search results, user feedback areas, etc.
|
||||
|
||||
See also [`{include}`](#language.function.include)
|
||||
@@ -1,55 +0,0 @@
|
||||
{ldelim},{rdelim} {#language.function.ldelim}
|
||||
=================
|
||||
|
||||
`{ldelim}` and `{rdelim}` are used for [escaping](#language.escaping)
|
||||
template delimiters, by default **{** and **}**. You can also use
|
||||
[`{literal}{/literal}`](#language.function.literal) to escape blocks of
|
||||
text eg Javascript or CSS. See also the complementary
|
||||
[`{$smarty.ldelim}`](#language.variables.smarty.ldelim).
|
||||
|
||||
|
||||
{* this will print literal delimiters out of the template *}
|
||||
|
||||
{ldelim}funcname{rdelim} is how functions look in Smarty!
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
{funcname} is how functions look in Smarty!
|
||||
|
||||
|
||||
|
||||
Another example with some Javascript
|
||||
|
||||
|
||||
<script language="JavaScript">
|
||||
function foo() {ldelim}
|
||||
... code ...
|
||||
{rdelim}
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
will output
|
||||
|
||||
|
||||
<script language="JavaScript">
|
||||
function foo() {
|
||||
.... code ...
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
|
||||
<script language="JavaScript" type="text/javascript">
|
||||
function myJsFunction(){ldelim}
|
||||
alert("The server name\n{$smarty.server.SERVER_NAME}\n{$smarty.server.SERVER_ADDR}");
|
||||
{rdelim}
|
||||
</script>
|
||||
<a href="javascript:myJsFunction()">Click here for Server Info</a>
|
||||
|
||||
See also [`{literal}`](#language.function.literal) and [escaping Smarty
|
||||
parsing](#language.escaping).
|
||||
@@ -1,36 +0,0 @@
|
||||
{literal} {#language.function.literal}
|
||||
=========
|
||||
|
||||
`{literal}` tags allow a block of data to be taken literally. This is
|
||||
typically used around Javascript or stylesheet blocks where {curly
|
||||
braces} would interfere with the template
|
||||
[delimiter](#variable.left.delimiter) syntax. Anything within
|
||||
`{literal}{/literal}` tags is not interpreted, but displayed as-is. If
|
||||
you need template tags embedded in a `{literal}` block, consider using
|
||||
[`{ldelim}{rdelim}`](#language.function.ldelim) to escape the individual
|
||||
delimiters instead.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> `{literal}{/literal}` tags are normally not necessary, as Smarty
|
||||
> ignores delimiters that are surrounded by whitespace. Be sure your
|
||||
> javascript and CSS curly braces are surrounded by whitespace. This is
|
||||
> new behavior to Smarty 3.
|
||||
|
||||
|
||||
<script>
|
||||
// the following braces are ignored by Smarty
|
||||
// since they are surrounded by whitespace
|
||||
function myFoo {
|
||||
alert('Foo!');
|
||||
}
|
||||
// this one will need literal escapement
|
||||
{literal}
|
||||
function myBar {alert('Bar!');}
|
||||
{/literal}
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
See also [`{ldelim} {rdelim}`](#language.function.ldelim) and the
|
||||
[escaping Smarty parsing](#language.escaping) page.
|
||||
@@ -1,23 +0,0 @@
|
||||
{nocache} {#language.function.nocache}
|
||||
=========
|
||||
|
||||
`{nocache}` is used to disable caching of a template section. Every
|
||||
`{nocache}` must be paired with a matching `{/nocache}`.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Be sure any variables used within a non-cached section are also
|
||||
> assigned from PHP when the page is loaded from the cache.
|
||||
|
||||
|
||||
|
||||
Today's date is
|
||||
{nocache}
|
||||
{$smarty.now|date_format}
|
||||
{/nocache}
|
||||
|
||||
|
||||
|
||||
The above code will output the current date on a cached page.
|
||||
|
||||
See also the [caching section](#caching).
|
||||
@@ -1,644 +0,0 @@
|
||||
{section},{sectionelse} {#language.function.section}
|
||||
=======================
|
||||
|
||||
A `{section}` is for looping over **sequentially indexed arrays of
|
||||
data**, unlike [`{foreach}`](#language.function.foreach) which is used
|
||||
to loop over a **single associative array**. Every `{section}` tag must
|
||||
be paired with a closing `{/section}` tag.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> The [`{foreach}`](#language.function.foreach) loop can do everything a
|
||||
> {section} loop can do, and has a simpler and easier syntax. It is
|
||||
> usually preferred over the {section} loop.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> {section} loops cannot loop over associative arrays, they must be
|
||||
> numerically indexed, and sequential (0,1,2,\...). For associative
|
||||
> arrays, use the [`{foreach}`](#language.function.foreach) loop.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- --------- ---------- --------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
name string Yes *n/a* The name of the section
|
||||
loop mixed Yes *n/a* Value to determine the number of loop iterations
|
||||
start integer No *0* The index position that the section will begin looping. If the value is negative, the start position is calculated from the end of the array. For example, if there are seven values in the loop array and start is -2, the start index is 5. Invalid values (values outside of the length of the loop array) are automatically truncated to the closest valid value.
|
||||
step integer No *1* The step value that will be used to traverse the loop array. For example, step=2 will loop on index 0,2,4, etc. If step is negative, it will step through the array backwards.
|
||||
max integer No *n/a* Sets the maximum number of times the section will loop.
|
||||
show boolean No *TRUE* Determines whether or not to show this section
|
||||
|
||||
**Option Flags:**
|
||||
|
||||
Name Description
|
||||
--------- ------------------------------------------
|
||||
nocache Disables caching of the `{section}` loop
|
||||
|
||||
- Required attributes are `name` and `loop`.
|
||||
|
||||
- The `name` of the `{section}` can be anything you like, made up of
|
||||
letters, numbers and underscores, like [PHP
|
||||
variables](&url.php-manual;language.variables).
|
||||
|
||||
- {section}\'s can be nested, and the nested `{section}` names must be
|
||||
unique from each other.
|
||||
|
||||
- The `loop` attribute, usually an array of values, determines the
|
||||
number of times the `{section}` will loop. You can also pass an
|
||||
integer as the loop value.
|
||||
|
||||
- When printing a variable within a `{section}`, the `{section}`
|
||||
`name` must be given next to variable name within \[brackets\].
|
||||
|
||||
- `{sectionelse}` is executed when there are no values in the loop
|
||||
variable.
|
||||
|
||||
- A `{section}` also has its own variables that handle `{section}`
|
||||
properties. These properties are accessible as:
|
||||
[`{$smarty.section.name.property}`](#language.variables.smarty.loops)
|
||||
where "name" is the attribute `name`.
|
||||
|
||||
- `{section}` properties are [`index`](#section.property.index),
|
||||
[`index_prev`](#section.property.index.prev),
|
||||
[`index_next`](#section.property.index.next),
|
||||
[`iteration`](#section.property.iteration),
|
||||
[`first`](#section.property.first),
|
||||
[`last`](#section.property.last),
|
||||
[`rownum`](#section.property.rownum),
|
||||
[`loop`](#section.property.loop), [`show`](#section.property.show),
|
||||
[`total`](#section.property.total).
|
||||
|
||||
[`assign()`](#api.assign) an array to Smarty
|
||||
|
||||
|
||||
<?php
|
||||
$data = array(1000,1001,1002);
|
||||
$smarty->assign('custid',$data);
|
||||
?>
|
||||
|
||||
The template that outputs the array
|
||||
|
||||
|
||||
{* this example will print out all the values of the $custid array *}
|
||||
{section name=customer loop=$custid}
|
||||
{section customer $custid} {* short-hand *}
|
||||
id: {$custid[customer]}<br />
|
||||
{/section}
|
||||
<hr />
|
||||
{* print out all the values of the $custid array reversed *}
|
||||
{section name=foo loop=$custid step=-1}
|
||||
{section foo $custid step=-1} {* short-hand *}
|
||||
{$custid[foo]}<br />
|
||||
{/section}
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
id: 1000<br />
|
||||
id: 1001<br />
|
||||
id: 1002<br />
|
||||
<hr />
|
||||
id: 1002<br />
|
||||
id: 1001<br />
|
||||
id: 1000<br />
|
||||
|
||||
|
||||
|
||||
|
||||
{section name=foo start=10 loop=20 step=2}
|
||||
{$smarty.section.foo.index}
|
||||
{/section}
|
||||
<hr />
|
||||
{section name=bar loop=21 max=6 step=-2}
|
||||
{$smarty.section.bar.index}
|
||||
{/section}
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
10 12 14 16 18
|
||||
<hr />
|
||||
20 18 16 14 12 10
|
||||
|
||||
|
||||
|
||||
The `name` of the `{section}` can be anything you like, see [PHP
|
||||
variables](&url.php-manual;language.variables). It is used to reference
|
||||
the data within the `{section}`.
|
||||
|
||||
|
||||
{section name=anything loop=$myArray}
|
||||
{$myArray[anything].foo}
|
||||
{$name[anything]}
|
||||
{$address[anything].bar}
|
||||
{/section}
|
||||
|
||||
|
||||
|
||||
This is an example of printing an associative array of data with a
|
||||
`{section}`. Following is the php script to assign the `$contacts` array
|
||||
to Smarty.
|
||||
|
||||
|
||||
<?php
|
||||
$data = array(
|
||||
array('name' => 'John Smith', 'home' => '555-555-5555',
|
||||
'cell' => '666-555-5555', 'email' => 'john@myexample.com'),
|
||||
array('name' => 'Jack Jones', 'home' => '777-555-5555',
|
||||
'cell' => '888-555-5555', 'email' => 'jack@myexample.com'),
|
||||
array('name' => 'Jane Munson', 'home' => '000-555-5555',
|
||||
'cell' => '123456', 'email' => 'jane@myexample.com')
|
||||
);
|
||||
$smarty->assign('contacts',$data);
|
||||
?>
|
||||
|
||||
|
||||
|
||||
The template to output `$contacts`
|
||||
|
||||
|
||||
{section name=customer loop=$contacts}
|
||||
<p>
|
||||
name: {$contacts[customer].name}<br />
|
||||
home: {$contacts[customer].home}<br />
|
||||
cell: {$contacts[customer].cell}<br />
|
||||
e-mail: {$contacts[customer].email}
|
||||
</p>
|
||||
{/section}
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
<p>
|
||||
name: John Smith<br />
|
||||
home: 555-555-5555<br />
|
||||
cell: 666-555-5555<br />
|
||||
e-mail: john@myexample.com
|
||||
</p>
|
||||
<p>
|
||||
name: Jack Jones<br />
|
||||
home phone: 777-555-5555<br />
|
||||
cell phone: 888-555-5555<br />
|
||||
e-mail: jack@myexample.com
|
||||
</p>
|
||||
<p>
|
||||
name: Jane Munson<br />
|
||||
home phone: 000-555-5555<br />
|
||||
cell phone: 123456<br />
|
||||
e-mail: jane@myexample.com
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
This example assumes that `$custid`, `$name` and `$address` are all
|
||||
arrays containing the same number of values. First the php script that
|
||||
assign\'s the arrays to Smarty.
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
$id = array(1001,1002,1003);
|
||||
$smarty->assign('custid',$id);
|
||||
|
||||
$fullnames = array('John Smith','Jack Jones','Jane Munson');
|
||||
$smarty->assign('name',$fullnames);
|
||||
|
||||
$addr = array('253 Abbey road', '417 Mulberry ln', '5605 apple st');
|
||||
$smarty->assign('address',$addr);
|
||||
|
||||
?>
|
||||
|
||||
The `loop` variable only determines the number of times to loop. You can
|
||||
access ANY variable from the template within the `{section}`. This is
|
||||
useful for looping multiple arrays. You can pass an array which will
|
||||
determine the loop count by the array size, or you can pass an integer
|
||||
to specify the number of loops.
|
||||
|
||||
|
||||
{section name=customer loop=$custid}
|
||||
<p>
|
||||
id: {$custid[customer]}<br />
|
||||
name: {$name[customer]}<br />
|
||||
address: {$address[customer]}
|
||||
</p>
|
||||
{/section}
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
<p>
|
||||
id: 1000<br />
|
||||
name: John Smith<br />
|
||||
address: 253 Abbey road
|
||||
</p>
|
||||
<p>
|
||||
id: 1001<br />
|
||||
name: Jack Jones<br />
|
||||
address: 417 Mulberry ln
|
||||
</p>
|
||||
<p>
|
||||
id: 1002<br />
|
||||
name: Jane Munson<br />
|
||||
address: 5605 apple st
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
{section}\'s can be nested as deep as you like. With nested
|
||||
{section}\'s, you can access complex data structures, such as
|
||||
multi-dimensional arrays. This is an example `.php` script thats
|
||||
assign\'s the arrays.
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
$id = array(1001,1002,1003);
|
||||
$smarty->assign('custid',$id);
|
||||
|
||||
$fullnames = array('John Smith','Jack Jones','Jane Munson');
|
||||
$smarty->assign('name',$fullnames);
|
||||
|
||||
$addr = array('253 N 45th', '417 Mulberry ln', '5605 apple st');
|
||||
$smarty->assign('address',$addr);
|
||||
|
||||
$types = array(
|
||||
array( 'home phone', 'cell phone', 'e-mail'),
|
||||
array( 'home phone', 'web'),
|
||||
array( 'cell phone')
|
||||
);
|
||||
$smarty->assign('contact_type', $types);
|
||||
|
||||
$info = array(
|
||||
array('555-555-5555', '666-555-5555', 'john@myexample.com'),
|
||||
array( '123-456-4', 'www.example.com'),
|
||||
array( '0457878')
|
||||
);
|
||||
$smarty->assign('contact_info', $info);
|
||||
|
||||
?>
|
||||
|
||||
|
||||
In this template, *\$contact\_type\[customer\]* is an array of contact
|
||||
types for the current customer.
|
||||
|
||||
|
||||
{section name=customer loop=$custid}
|
||||
<hr>
|
||||
id: {$custid[customer]}<br />
|
||||
name: {$name[customer]}<br />
|
||||
address: {$address[customer]}<br />
|
||||
{section name=contact loop=$contact_type[customer]}
|
||||
{$contact_type[customer][contact]}: {$contact_info[customer][contact]}<br />
|
||||
{/section}
|
||||
{/section}
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
<hr>
|
||||
id: 1000<br />
|
||||
name: John Smith<br />
|
||||
address: 253 N 45th<br />
|
||||
home phone: 555-555-5555<br />
|
||||
cell phone: 666-555-5555<br />
|
||||
e-mail: john@myexample.com<br />
|
||||
<hr>
|
||||
id: 1001<br />
|
||||
name: Jack Jones<br />
|
||||
address: 417 Mulberry ln<br />
|
||||
home phone: 123-456-4<br />
|
||||
web: www.example.com<br />
|
||||
<hr>
|
||||
id: 1002<br />
|
||||
name: Jane Munson<br />
|
||||
address: 5605 apple st<br />
|
||||
cell phone: 0457878<br />
|
||||
|
||||
|
||||
|
||||
Results of a database search (eg ADODB or PEAR) are assigned to Smarty
|
||||
|
||||
|
||||
<?php
|
||||
$sql = 'select id, name, home, cell, email from contacts '
|
||||
."where name like '$foo%' ";
|
||||
$smarty->assign('contacts', $db->getAll($sql));
|
||||
?>
|
||||
|
||||
The template to output the database result in a HTML table
|
||||
|
||||
|
||||
<table>
|
||||
<tr><th> </th><th>Name></th><th>Home</th><th>Cell</th><th>Email</th></tr>
|
||||
{section name=co loop=$contacts}
|
||||
<tr>
|
||||
<td><a href="view.php?id={$contacts[co].id}">view<a></td>
|
||||
<td>{$contacts[co].name}</td>
|
||||
<td>{$contacts[co].home}</td>
|
||||
<td>{$contacts[co].cell}</td>
|
||||
<td>{$contacts[co].email}</td>
|
||||
<tr>
|
||||
{sectionelse}
|
||||
<tr><td colspan="5">No items found</td></tr>
|
||||
{/section}
|
||||
</table>
|
||||
|
||||
.index {#section.property.index}
|
||||
------
|
||||
|
||||
`index` contains the current array index, starting with zero or the
|
||||
`start` attribute if given. It increments by one or by the `step`
|
||||
attribute if given.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> If the `step` and `start` properties are not modified, then this works
|
||||
> the same as the [`iteration`](#section.property.iteration) property,
|
||||
> except it starts at zero instead of one.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> `$custid[customer.index]` and `$custid[customer]` are identical.
|
||||
|
||||
|
||||
{section name=customer loop=$custid}
|
||||
{$smarty.section.customer.index} id: {$custid[customer]}<br />
|
||||
{/section}
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
0 id: 1000<br />
|
||||
1 id: 1001<br />
|
||||
2 id: 1002<br />
|
||||
|
||||
|
||||
|
||||
.index\_prev {#section.property.index.prev}
|
||||
------------
|
||||
|
||||
`index_prev` is the previous loop index. On the first loop, this is set
|
||||
to -1.
|
||||
|
||||
.index\_next {#section.property.index.next}
|
||||
------------
|
||||
|
||||
`index_next` is the next loop index. On the last loop, this is still one
|
||||
more than the current index, respecting the setting of the `step`
|
||||
attribute, if given.
|
||||
|
||||
|
||||
<?php
|
||||
$data = array(1001,1002,1003,1004,1005);
|
||||
$smarty->assign('rows',$data);
|
||||
?>
|
||||
|
||||
Template to output the above array in a table
|
||||
|
||||
|
||||
{* $rows[row.index] and $rows[row] are identical in meaning *}
|
||||
<table>
|
||||
<tr>
|
||||
<th>index</th><th>id</th>
|
||||
<th>index_prev</th><th>prev_id</th>
|
||||
<th>index_next</th><th>next_id</th>
|
||||
</tr>
|
||||
{section name=row loop=$rows}
|
||||
<tr>
|
||||
<td>{$smarty.section.row.index}</td><td>{$rows[row]}</td>
|
||||
<td>{$smarty.section.row.index_prev}</td><td>{$rows[row.index_prev]}</td>
|
||||
<td>{$smarty.section.row.index_next}</td><td>{$rows[row.index_next]}</td>
|
||||
</tr>
|
||||
{/section}
|
||||
</table>
|
||||
|
||||
|
||||
|
||||
The above example will output a table containing the following:
|
||||
|
||||
|
||||
index id index_prev prev_id index_next next_id
|
||||
0 1001 -1 1 1002
|
||||
1 1002 0 1001 2 1003
|
||||
2 1003 1 1002 3 1004
|
||||
3 1004 2 1003 4 1005
|
||||
4 1005 3 1004 5
|
||||
|
||||
|
||||
|
||||
.iteration {#section.property.iteration}
|
||||
----------
|
||||
|
||||
`iteration` contains the current loop iteration and starts at one.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> This is not affected by the `{section}` properties `start`, `step` and
|
||||
> `max`, unlike the [`index`](#section.property.index) property.
|
||||
> `iteration` also starts with one instead of zero unlike `index`.
|
||||
> [`rownum`](#section.property.rownum) is an alias to `iteration`, they
|
||||
> are identical.
|
||||
|
||||
|
||||
<?php
|
||||
// array of 3000 to 3015
|
||||
$id = range(3000,3015);
|
||||
$smarty->assign('arr',$id);
|
||||
?>
|
||||
|
||||
Template to output every other element of the `$arr` array as `step=2`
|
||||
|
||||
|
||||
{section name=cu loop=$arr start=5 step=2}
|
||||
iteration={$smarty.section.cu.iteration}
|
||||
index={$smarty.section.cu.index}
|
||||
id={$custid[cu]}<br />
|
||||
{/section}
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
iteration=1 index=5 id=3005<br />
|
||||
iteration=2 index=7 id=3007<br />
|
||||
iteration=3 index=9 id=3009<br />
|
||||
iteration=4 index=11 id=3011<br />
|
||||
iteration=5 index=13 id=3013<br />
|
||||
iteration=6 index=15 id=3015<br />
|
||||
|
||||
|
||||
|
||||
Another example that uses the `iteration` property to output a table
|
||||
header block every five rows.
|
||||
|
||||
|
||||
<table>
|
||||
{section name=co loop=$contacts}
|
||||
{if $smarty.section.co.iteration is div by 5}
|
||||
<tr><th> </th><th>Name></th><th>Home</th><th>Cell</th><th>Email</th></tr>
|
||||
{/if}
|
||||
<tr>
|
||||
<td><a href="view.php?id={$contacts[co].id}">view<a></td>
|
||||
<td>{$contacts[co].name}</td>
|
||||
<td>{$contacts[co].home}</td>
|
||||
<td>{$contacts[co].cell}</td>
|
||||
<td>{$contacts[co].email}</td>
|
||||
<tr>
|
||||
{/section}
|
||||
</table>
|
||||
|
||||
|
||||
|
||||
An that uses the `iteration` property to alternate a text color every
|
||||
third row.
|
||||
|
||||
|
||||
<table>
|
||||
{section name=co loop=$contacts}
|
||||
{if $smarty.section.co.iteration is even by 3}
|
||||
<span style="color: #ffffff">{$contacts[co].name}</span>
|
||||
{else}
|
||||
<span style="color: #dddddd">{$contacts[co].name}</span>
|
||||
{/if}
|
||||
{/section}
|
||||
</table>
|
||||
|
||||
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> The *\"is div by\"* syntax is a simpler alternative to the PHP mod
|
||||
> operator syntax. The mod operator is allowed:
|
||||
> `{if $smarty.section.co.iteration % 5 == 1}` will work just the same.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> You can also use *\"is odd by\"* to reverse the alternating.
|
||||
|
||||
.first {#section.property.first}
|
||||
------
|
||||
|
||||
`first` is set to TRUE if the current `{section}` iteration is the
|
||||
initial one.
|
||||
|
||||
.last {#section.property.last}
|
||||
-----
|
||||
|
||||
`last` is set to TRUE if the current section iteration is the final one.
|
||||
|
||||
This example loops the `$customers` array, outputs a header block on the
|
||||
first iteration and on the last outputs the footer block. Also uses the
|
||||
[`total`](#section.property.total) property.
|
||||
|
||||
|
||||
{section name=customer loop=$customers}
|
||||
{if $smarty.section.customer.first}
|
||||
<table>
|
||||
<tr><th>id</th><th>customer</th></tr>
|
||||
{/if}
|
||||
|
||||
<tr>
|
||||
<td>{$customers[customer].id}}</td>
|
||||
<td>{$customers[customer].name}</td>
|
||||
</tr>
|
||||
|
||||
{if $smarty.section.customer.last}
|
||||
<tr><td></td><td>{$smarty.section.customer.total} customers</td></tr>
|
||||
</table>
|
||||
{/if}
|
||||
{/section}
|
||||
|
||||
|
||||
|
||||
.rownum {#section.property.rownum}
|
||||
-------
|
||||
|
||||
`rownum` contains the current loop iteration, starting with one. It is
|
||||
an alias to [`iteration`](#section.property.iteration), they work
|
||||
identically.
|
||||
|
||||
.loop {#section.property.loop}
|
||||
-----
|
||||
|
||||
`loop` contains the last index number that this {section} looped. This
|
||||
can be used inside or after the `{section}`.
|
||||
|
||||
|
||||
{section name=customer loop=$custid}
|
||||
{$smarty.section.customer.index} id: {$custid[customer]}<br />
|
||||
{/section}
|
||||
There are {$smarty.section.customer.loop} customers shown above.
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
0 id: 1000<br />
|
||||
1 id: 1001<br />
|
||||
2 id: 1002<br />
|
||||
There are 3 customers shown above.
|
||||
|
||||
|
||||
|
||||
.show {#section.property.show}
|
||||
-----
|
||||
|
||||
`show` is used as a parameter to section and is a boolean value. If
|
||||
FALSE, the section will not be displayed. If there is a `{sectionelse}`
|
||||
present, that will be alternately displayed.
|
||||
|
||||
Boolean `$show_customer_info` has been passed from the PHP application,
|
||||
to regulate whether or not this section shows.
|
||||
|
||||
|
||||
{section name=customer loop=$customers show=$show_customer_info}
|
||||
{$smarty.section.customer.rownum} id: {$customers[customer]}<br />
|
||||
{/section}
|
||||
|
||||
{if $smarty.section.customer.show}
|
||||
the section was shown.
|
||||
{else}
|
||||
the section was not shown.
|
||||
{/if}
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
1 id: 1000<br />
|
||||
2 id: 1001<br />
|
||||
3 id: 1002<br />
|
||||
|
||||
the section was shown.
|
||||
|
||||
|
||||
|
||||
.total {#section.property.total}
|
||||
------
|
||||
|
||||
`total` contains the number of iterations that this `{section}` will
|
||||
loop. This can be used inside or after a `{section}`.
|
||||
|
||||
|
||||
{section name=customer loop=$custid step=2}
|
||||
{$smarty.section.customer.index} id: {$custid[customer]}<br />
|
||||
{/section}
|
||||
There are {$smarty.section.customer.total} customers shown above.
|
||||
|
||||
|
||||
|
||||
See also [`{foreach}`](#language.function.foreach),
|
||||
[`{for}`](#language.function.for), [`{while}`](#language.function.while)
|
||||
and [`$smarty.section`](#language.variables.smarty.loops).
|
||||
@@ -1,42 +0,0 @@
|
||||
{setfilter} {#language.function.setfilter}
|
||||
===========
|
||||
|
||||
The `{setfilter}...{/setfilter}` block tag allows the definition of
|
||||
template instance\'s variable filters.
|
||||
|
||||
SYNTAX: {setfilter filter1\|filter2\|filter3\....}\...{/setfilter}
|
||||
|
||||
The filter can be:
|
||||
|
||||
- A variable filter plugin specified by it\'s name.
|
||||
|
||||
- A modidier specified by it\'s name and optional additional
|
||||
parameter.
|
||||
|
||||
`{setfilter}...{/setfilter}` blocks can be nested. The filter definition
|
||||
of inner blocks does replace the definition of the outer block.
|
||||
|
||||
Template instance filters run in addition to other modifiers and
|
||||
filters. They run in the following order: modifier, default\_modifier,
|
||||
\$escape\_html, registered variable filters, autoloaded variable
|
||||
filters, template instance\'s variable filters. Everything after
|
||||
default\_modifier can be disabled with the `nofilter` flag.
|
||||
|
||||
|
||||
<script>
|
||||
{setfilter filter1}
|
||||
{$foo} {* filter1 runs on output of $foo *}
|
||||
{setfilter filter2|mod:true}
|
||||
{$bar} {* filter2 and modifier mod runs on output of $bar *}
|
||||
{/setfilter}
|
||||
{$buh} {* filter1 runs on output of $buh *}
|
||||
{/setfilter}
|
||||
{$blar} {* no template instance filter runs on output of $blar}
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> The setting of template instance filters does not effect the output of
|
||||
> included subtemplates.
|
||||
@@ -1,84 +0,0 @@
|
||||
{\$var=\...} {#language.function.shortform.assign}
|
||||
============
|
||||
|
||||
This is a short-hand version of the {assign} function. You can assign
|
||||
values directly to the template, or assign values to array elements too.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Assignment of variables in-template is essentially placing application
|
||||
> logic into the presentation that may be better handled in PHP. Use at
|
||||
> your own discretion.
|
||||
|
||||
The following attributes can be added to the tag:
|
||||
|
||||
**Attributes:**
|
||||
|
||||
Attribute Name Shorthand Type Required Default Description
|
||||
---------------- ----------- -------- ---------- --------- -----------------------------------------------------------------------
|
||||
scope n/a string No *n/a* The scope of the assigned variable: \'parent\',\'root\' or \'global\'
|
||||
|
||||
**Option Flags:**
|
||||
|
||||
Name Description
|
||||
--------- -----------------------------------------------------
|
||||
nocache Assigns the variable with the \'nocache\' attribute
|
||||
|
||||
|
||||
{$name='Bob'}
|
||||
|
||||
The value of $name is {$name}.
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
The value of $name is Bob.
|
||||
|
||||
|
||||
|
||||
|
||||
{$running_total=$running_total+$some_array[row].some_value}
|
||||
|
||||
|
||||
|
||||
|
||||
{$user.name="Bob"}
|
||||
|
||||
|
||||
|
||||
|
||||
{$user.name.first="Bob"}
|
||||
|
||||
|
||||
|
||||
|
||||
{$users[]="Bob"}
|
||||
|
||||
|
||||
|
||||
Variables assigned in the included template will be seen in the
|
||||
including template.
|
||||
|
||||
|
||||
{include file="sub_template.tpl"}
|
||||
...
|
||||
{* display variable assigned in sub_template *}
|
||||
{$foo}<br>
|
||||
...
|
||||
|
||||
|
||||
|
||||
The template above includes the example `sub_template.tpl` below
|
||||
|
||||
|
||||
...
|
||||
{* foo will be known also in the including template *}
|
||||
{$foo="something" scope=parent}
|
||||
{* bar is assigned only local in the including template *}
|
||||
{$bar="value"}
|
||||
...
|
||||
|
||||
See also [`{assign}`](#language.function.assign) and
|
||||
[`{append}`](#language.function.append)
|
||||
@@ -1,48 +0,0 @@
|
||||
{strip} {#language.function.strip}
|
||||
=======
|
||||
|
||||
Many times web designers run into the issue where white space and
|
||||
carriage returns affect the output of the rendered HTML (browser
|
||||
\"features\"), so you must run all your tags together in the template to
|
||||
get the desired results. This usually ends up in unreadable or
|
||||
unmanageable templates.
|
||||
|
||||
Anything within `{strip}{/strip}` tags are stripped of the extra spaces
|
||||
or carriage returns at the beginnings and ends of the lines before they
|
||||
are displayed. This way you can keep your templates readable, and not
|
||||
worry about extra white space causing problems.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> `{strip}{/strip}` does not affect the contents of template variables,
|
||||
> see the [strip modifier](#language.modifier.strip) instead.
|
||||
|
||||
|
||||
{* the following will be all run into one line upon output *}
|
||||
{strip}
|
||||
<table border='0'>
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{$url}">
|
||||
<font color="red">This is a test</font>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{/strip}
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
<table border='0'><tr><td><a href="http://. snipped...</a></td></tr></table>
|
||||
|
||||
|
||||
|
||||
Notice that in the above example, all the lines begin and end with HTML
|
||||
tags. Be aware that all the lines are run together. If you have plain
|
||||
text at the beginning or end of any line, they will be run together, and
|
||||
may not be desired results.
|
||||
|
||||
See also the [`strip`](#language.modifier.strip) modifier.
|
||||
@@ -1,43 +0,0 @@
|
||||
{while} {#language.function.while}
|
||||
=======
|
||||
|
||||
`{while}` loops in Smarty have much the same flexibility as PHP
|
||||
[while](&url.php-manual;while) statements, with a few added features for
|
||||
the template engine. Every `{while}` must be paired with a matching
|
||||
`{/while}`. All PHP conditionals and functions are recognized, such as
|
||||
*\|\|*, *or*, *&&*, *and*, *is\_array()*, etc.
|
||||
|
||||
The following is a list of recognized qualifiers, which must be
|
||||
separated from surrounding elements by spaces. Note that items listed in
|
||||
\[brackets\] are optional. PHP equivalents are shown where applicable.
|
||||
|
||||
Qualifier Alternates Syntax Example Meaning PHP Equivalent
|
||||
-------------------- ------------ ------------------------ -------------------------------- ----------------------
|
||||
== eq \$a eq \$b equals ==
|
||||
!= ne, neq \$a neq \$b not equals !=
|
||||
\> gt \$a gt \$b greater than \>
|
||||
\< lt \$a lt \$b less than \<
|
||||
\>= gte, ge \$a ge \$b greater than or equal \>=
|
||||
\<= lte, le \$a le \$b less than or equal \<=
|
||||
=== \$a === 0 check for identity ===
|
||||
! not not \$a negation (unary) !
|
||||
\% mod \$a mod \$b modulous \%
|
||||
is \[not\] div by \$a is not div by 4 divisible by \$a % \$b == 0
|
||||
is \[not\] even \$a is not even \[not\] an even number (unary) \$a % 2 == 0
|
||||
is \[not\] even by \$a is not even by \$b grouping level \[not\] even (\$a / \$b) % 2 == 0
|
||||
is \[not\] odd \$a is not odd \[not\] an odd number (unary) \$a % 2 != 0
|
||||
is \[not\] odd by \$a is not odd by \$b \[not\] an odd grouping (\$a / \$b) % 2 != 0
|
||||
|
||||
|
||||
|
||||
{while $foo > 0}
|
||||
{$foo--}
|
||||
{/while}
|
||||
|
||||
|
||||
|
||||
The above example will count down the value of \$foo until 1 is reached.
|
||||
|
||||
See also [`{foreach}`](#language.function.foreach),
|
||||
[`{for}`](#language.function.for) and
|
||||
[`{section}`](#language.function.section).
|
||||
@@ -1,35 +0,0 @@
|
||||
Combining Modifiers {#language.combining.modifiers}
|
||||
===================
|
||||
|
||||
You can apply any number of modifiers to a variable. They will be
|
||||
applied in the order they are combined, from left to right. They must be
|
||||
separated with a `|` (pipe) character.
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
$smarty->assign('articleTitle', 'Smokers are Productive, but Death Cuts Efficiency.');
|
||||
|
||||
?>
|
||||
|
||||
where template is:
|
||||
|
||||
|
||||
{$articleTitle}
|
||||
{$articleTitle|upper|spacify}
|
||||
{$articleTitle|lower|spacify|truncate}
|
||||
{$articleTitle|lower|truncate:30|spacify}
|
||||
{$articleTitle|lower|spacify|truncate:30:". . ."}
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
Smokers are Productive, but Death Cuts Efficiency.
|
||||
S M O K E R S A R ....snip.... H C U T S E F F I C I E N C Y .
|
||||
s m o k e r s a r ....snip.... b u t d e a t h c u t s...
|
||||
s m o k e r s a r e p r o d u c t i v e , b u t . . .
|
||||
s m o k e r s a r e p. . .
|
||||
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
Custom Functions {#language.custom.functions}
|
||||
================
|
||||
|
||||
Smarty comes with several custom plugin functions that you can use in
|
||||
the templates.
|
||||
|
||||
## Table of contents
|
||||
- [{counter}](./language-custom-functions/language-function-counter.md)
|
||||
- [{cycle}](./language-custom-functions/language-function-cycle.md)
|
||||
- [{eval}](./language-custom-functions/language-function-eval.md)
|
||||
- [{fetch}](./language-custom-functions/language-function-fetch.md)
|
||||
- [{html_checkboxes}](./language-custom-functions/language-function-html-checkboxes.md)
|
||||
- [{html_image}](./language-custom-functions/language-function-html-image.md)
|
||||
- [{html_options}](./language-custom-functions/language-function-html-options.md)
|
||||
- [{html_radios}](./language-custom-functions/language-function-html-radios.md)
|
||||
- [{html_select_date}](./language-custom-functions/language-function-html-select-date.md)
|
||||
- [{html_select_time}](./language-custom-functions/language-function-html-select-time.md)
|
||||
- [{html_table}](./language-custom-functions/language-function-html-table.md)
|
||||
- [{mailto}](./language-custom-functions/language-function-mailto.md)
|
||||
- [{math}](./language-custom-functions/language-function-math.md)
|
||||
- [{textformat}](./language-custom-functions/language-function-textformat.md)
|
||||
@@ -1,41 +0,0 @@
|
||||
{counter} {#language.function.counter}
|
||||
=========
|
||||
|
||||
`{counter}` is used to print out a count. `{counter}` will remember the
|
||||
count on each iteration. You can adjust the number, the interval and the
|
||||
direction of the count, as well as determine whether or not to print the
|
||||
value. You can run multiple counters concurrently by supplying a unique
|
||||
name for each one. If you do not supply a name, the name "default" will
|
||||
be used.
|
||||
|
||||
If you supply the `assign` attribute, the output of the `{counter}`
|
||||
function will be assigned to this template variable instead of being
|
||||
output to the template.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- --------- ---------- ----------- ------------------------------------------------------
|
||||
name string No *default* The name of the counter
|
||||
start number No *1* The initial number to start counting from
|
||||
skip number No *1* The interval to count by
|
||||
direction string No *up* The direction to count (up/down)
|
||||
print boolean No *TRUE* Whether or not to print the value
|
||||
assign string No *n/a* the template variable the output will be assigned to
|
||||
|
||||
|
||||
{* initialize the count *}
|
||||
{counter start=0 skip=2}<br />
|
||||
{counter}<br />
|
||||
{counter}<br />
|
||||
{counter}<br />
|
||||
|
||||
|
||||
|
||||
this will output:
|
||||
|
||||
|
||||
0<br />
|
||||
2<br />
|
||||
4<br />
|
||||
6<br />
|
||||
|
||||
|
||||
@@ -1,57 +0,0 @@
|
||||
{cycle} {#language.function.cycle}
|
||||
=======
|
||||
|
||||
`{cycle}` is used to alternate a set of values. This makes it easy to
|
||||
for example, alternate between two or more colors in a table, or cycle
|
||||
through an array of values.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- --------- ---------- ----------- -------------------------------------------------------------------------------------------------------------
|
||||
name string No *default* The name of the cycle
|
||||
values mixed Yes *N/A* The values to cycle through, either a comma delimited list (see delimiter attribute), or an array of values
|
||||
print boolean No *TRUE* Whether to print the value or not
|
||||
advance boolean No *TRUE* Whether or not to advance to the next value
|
||||
delimiter string No *,* The delimiter to use in the values attribute
|
||||
assign string No *n/a* The template variable the output will be assigned to
|
||||
reset boolean No *FALSE* The cycle will be set to the first value and not advanced
|
||||
|
||||
- You can `{cycle}` through more than one set of values in a template
|
||||
by supplying a `name` attribute. Give each `{cycle}` an unique
|
||||
`name`.
|
||||
|
||||
- You can force the current value not to print with the `print`
|
||||
attribute set to FALSE. This would be useful for silently skipping a
|
||||
value.
|
||||
|
||||
- The `advance` attribute is used to repeat a value. When set to
|
||||
FALSE, the next call to `{cycle}` will print the same value.
|
||||
|
||||
- If you supply the `assign` attribute, the output of the `{cycle}`
|
||||
function will be assigned to a template variable instead of being
|
||||
output to the template.
|
||||
|
||||
<!-- -->
|
||||
|
||||
|
||||
{section name=rows loop=$data}
|
||||
<tr class="{cycle values="odd,even"}">
|
||||
<td>{$data[rows]}</td>
|
||||
</tr>
|
||||
{/section}
|
||||
|
||||
|
||||
|
||||
The above template would output:
|
||||
|
||||
|
||||
<tr class="odd">
|
||||
<td>1</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td>2</td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<td>3</td>
|
||||
</tr>
|
||||
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
{debug} {#language.function.debug}
|
||||
=======
|
||||
|
||||
`{debug}` dumps the debug console to the page. This works regardless of
|
||||
the [debug](#chapter.debugging.console) settings in the php script.
|
||||
Since this gets executed at runtime, this is only able to show the
|
||||
[assigned](#api.assign) variables; not the templates that are in use.
|
||||
However, you can see all the currently available variables within the
|
||||
scope of a template.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- -------- ---------- -------------- ---------------------------------
|
||||
output string No *javascript* output type, html or javascript
|
||||
|
||||
See also the [debugging console page](#chapter.debugging.console).
|
||||
@@ -1,84 +0,0 @@
|
||||
{eval} {#language.function.eval}
|
||||
======
|
||||
|
||||
`{eval}` is used to evaluate a variable as a template. This can be used
|
||||
for things like embedding template tags/variables into variables or
|
||||
tags/variables into config file variables.
|
||||
|
||||
If you supply the `assign` attribute, the output of the `{eval}`
|
||||
function will be assigned to this template variable instead of being
|
||||
output to the template.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- -------- ---------- --------- ------------------------------------------------------
|
||||
var mixed Yes *n/a* Variable (or string) to evaluate
|
||||
assign string No *n/a* The template variable the output will be assigned to
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> - Evaluated variables are treated the same as templates. They follow
|
||||
> the same escapement and security features just as if they were
|
||||
> templates.
|
||||
>
|
||||
> - Evaluated variables are compiled on every invocation, the compiled
|
||||
> versions are not saved! However if you have [caching](#caching)
|
||||
> enabled, the output will be cached with the rest of the template.
|
||||
>
|
||||
> - If the content to evaluate doesn\'t change often, or is used
|
||||
> repeatedly, consider using
|
||||
> `{include file="string:{$template_code}"}` instead. This may cache
|
||||
> the compiled state and thus doesn\'t have to run the (comparably
|
||||
> slow) compiler on every invocation.
|
||||
>
|
||||
The contents of the config file, `setup.conf`.
|
||||
|
||||
|
||||
emphstart = <strong>
|
||||
emphend = </strong>
|
||||
title = Welcome to {$company}'s home page!
|
||||
ErrorCity = You must supply a {#emphstart#}city{#emphend#}.
|
||||
ErrorState = You must supply a {#emphstart#}state{#emphend#}.
|
||||
|
||||
|
||||
|
||||
Where the template is:
|
||||
|
||||
|
||||
{config_load file='setup.conf'}
|
||||
|
||||
{eval var=$foo}
|
||||
{eval var=#title#}
|
||||
{eval var=#ErrorCity#}
|
||||
{eval var=#ErrorState# assign='state_error'}
|
||||
{$state_error}
|
||||
|
||||
|
||||
|
||||
The above template will output:
|
||||
|
||||
|
||||
This is the contents of foo.
|
||||
Welcome to Foobar Pub & Grill's home page!
|
||||
You must supply a <strong>city</strong>.
|
||||
You must supply a <strong>state</strong>.
|
||||
|
||||
|
||||
|
||||
This outputs the server name (in uppercase) and IP. The assigned
|
||||
variable `$str` could be from a database query.
|
||||
|
||||
|
||||
<?php
|
||||
$str = 'The server name is {$smarty.server.SERVER_NAME|upper} '
|
||||
.'at {$smarty.server.SERVER_ADDR}';
|
||||
$smarty->assign('foo',$str);
|
||||
?>
|
||||
|
||||
|
||||
|
||||
Where the template is:
|
||||
|
||||
|
||||
{eval var=$foo}
|
||||
|
||||
|
||||
@@ -1,59 +0,0 @@
|
||||
{fetch} {#language.function.fetch}
|
||||
=======
|
||||
|
||||
`{fetch}` is used to retrieve files from the local file system, http, or
|
||||
ftp and display the contents.
|
||||
|
||||
- If the file name begins with `http://`, the web site page will be
|
||||
fetched and displayed.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> This will not support http redirects, be sure to include a
|
||||
> trailing slash on your web page fetches where necessary.
|
||||
|
||||
- If the file name begins with `ftp://`, the file will be downloaded
|
||||
from the ftp server and displayed.
|
||||
|
||||
- For local files, either a full system file path must be given, or a
|
||||
path relative to the executed php script.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> If security is enabled and you are fetching a file from the local
|
||||
> file system, `{fetch}` will only allow files from within the
|
||||
> `$secure_dir` path of the securty policy. See the
|
||||
> [Security](#advanced.features.security) section for details.
|
||||
|
||||
- If the `assign` attribute is set, the output of the `{fetch}`
|
||||
function will be assigned to this template variable instead of being
|
||||
output to the template.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- -------- ---------- --------- ------------------------------------------------------
|
||||
file string Yes *n/a* The file, http or ftp site to fetch
|
||||
assign string No *n/a* The template variable the output will be assigned to
|
||||
|
||||
|
||||
{* include some javascript in your template *}
|
||||
{fetch file='/export/httpd/www.example.com/docs/navbar.js'}
|
||||
|
||||
{* embed some weather text in your template from another web site *}
|
||||
{fetch file='http://www.myweather.com/68502/'}
|
||||
|
||||
{* fetch a news headline file via ftp *}
|
||||
{fetch file='ftp://user:password@ftp.example.com/path/to/currentheadlines.txt'}
|
||||
{* as above but with variables *}
|
||||
{fetch file="ftp://`$user`:`$password`@`$server`/`$path`"}
|
||||
|
||||
{* assign the fetched contents to a template variable *}
|
||||
{fetch file='http://www.myweather.com/68502/' assign='weather'}
|
||||
{if $weather ne ''}
|
||||
<div id="weather">{$weather}</div>
|
||||
{/if}
|
||||
|
||||
|
||||
|
||||
See also [`{capture}`](#language.function.capture),
|
||||
[`{eval}`](#language.function.eval),
|
||||
[`{assign}`](#language.function.assign) and [`fetch()`](#api.fetch).
|
||||
@@ -1,113 +0,0 @@
|
||||
{html\_checkboxes} {#language.function.html.checkboxes}
|
||||
==================
|
||||
|
||||
`{html_checkboxes}` is a [custom function](#language.custom.functions)
|
||||
that creates an html checkbox group with provided data. It takes care of
|
||||
which item(s) are selected by default as well.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- ------------------- ------------------------------------- ------------ -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
name string No *checkbox* Name of checkbox list
|
||||
values array Yes, unless using options attribute *n/a* An array of values for checkbox buttons
|
||||
output array Yes, unless using options attribute *n/a* An array of output for checkbox buttons
|
||||
selected string/array No *empty* The selected checkbox element(s)
|
||||
options associative array Yes, unless using values and output *n/a* An associative array of values and output
|
||||
separator string No *empty* String of text to separate each checkbox item
|
||||
assign string No *empty* Assign checkbox tags to an array instead of output
|
||||
labels boolean No *TRUE* Add \<label\>-tags to the output
|
||||
label\_ids boolean No *FALSE* Add id-attributes to \<label\> and \<input\> to the output
|
||||
escape boolean No *TRUE* Escape the output / content (values are always escaped)
|
||||
strict boolean No *FALSE* Will make the \"extra\" attributes *disabled* and *readonly* only be set, if they were supplied with either boolean *TRUE* or string *\"disabled\"* and *\"readonly\"* respectively
|
||||
|
||||
- Required attributes are `values` and `output`, unless you use
|
||||
`options` instead.
|
||||
|
||||
- All output is XHTML compliant.
|
||||
|
||||
- All parameters that are not in the list above are printed as
|
||||
name/value-pairs inside each of the created \<input\>-tags.
|
||||
|
||||
<!-- -->
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
$smarty->assign('cust_ids', array(1000,1001,1002,1003));
|
||||
$smarty->assign('cust_names', array(
|
||||
'Joe Schmoe',
|
||||
'Jack Smith',
|
||||
'Jane Johnson',
|
||||
'Charlie Brown')
|
||||
);
|
||||
$smarty->assign('customer_id', 1001);
|
||||
|
||||
?>
|
||||
|
||||
|
||||
|
||||
where template is
|
||||
|
||||
|
||||
{html_checkboxes name='id' values=$cust_ids output=$cust_names
|
||||
selected=$customer_id separator='<br />'}
|
||||
|
||||
|
||||
|
||||
or where PHP code is:
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
$smarty->assign('cust_checkboxes', array(
|
||||
1000 => 'Joe Schmoe',
|
||||
1001 => 'Jack Smith',
|
||||
1002 => 'Jane Johnson',
|
||||
1003 => 'Charlie Brown')
|
||||
);
|
||||
$smarty->assign('customer_id', 1001);
|
||||
|
||||
?>
|
||||
|
||||
|
||||
|
||||
and the template is
|
||||
|
||||
|
||||
{html_checkboxes name='id' options=$cust_checkboxes
|
||||
selected=$customer_id separator='<br />'}
|
||||
|
||||
|
||||
|
||||
both examples will output:
|
||||
|
||||
|
||||
<label><input type="checkbox" name="id[]" value="1000" />Joe Schmoe</label><br />
|
||||
<label><input type="checkbox" name="id[]" value="1001" checked="checked" />Jack Smith</label>
|
||||
<br />
|
||||
<label><input type="checkbox" name="id[]" value="1002" />Jane Johnson</label><br />
|
||||
<label><input type="checkbox" name="id[]" value="1003" />Charlie Brown</label><br />
|
||||
|
||||
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
$sql = 'select type_id, types from contact_types order by type';
|
||||
$smarty->assign('contact_types',$db->getAssoc($sql));
|
||||
|
||||
$sql = 'select contact_id, contact_type_id, contact '
|
||||
.'from contacts where contact_id=12';
|
||||
$smarty->assign('contact',$db->getRow($sql));
|
||||
|
||||
?>
|
||||
|
||||
|
||||
|
||||
The results of the database queries above would be output with.
|
||||
|
||||
|
||||
{html_checkboxes name='contact_type_id' options=$contact_types
|
||||
selected=$contact.contact_type_id separator='<br />'}
|
||||
|
||||
See also [`{html_radios}`](#language.function.html.radios) and
|
||||
[`{html_options}`](#language.function.html.options)
|
||||
@@ -1,56 +0,0 @@
|
||||
{html\_image} {#language.function.html.image}
|
||||
=============
|
||||
|
||||
`{html_image}` is a [custom function](#language.custom.functions) that
|
||||
generates an HTML `<img>` tag. The `height` and `width` are
|
||||
automatically calculated from the image file if they are not supplied.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- -------- ---------- ----------------------- ---------------------------------------
|
||||
file string Yes *n/a* name/path to image
|
||||
height string No *actual image height* Height to display image
|
||||
width string No *actual image width* Width to display image
|
||||
basedir string no *web server doc root* Directory to base relative paths from
|
||||
alt string no *""* Alternative description of the image
|
||||
href string no *n/a* href value to link the image to
|
||||
path\_prefix string no *n/a* Prefix for output path
|
||||
|
||||
- `basedir` is the base directory that relative image paths are based
|
||||
from. If not given, the web server\'s document root
|
||||
`$_ENV['DOCUMENT_ROOT']` is used as the base. If security is
|
||||
enabled, then the image must be located in the `$secure_dir` path of
|
||||
the securty policy. See the [Security](#advanced.features.security)
|
||||
section for details.
|
||||
|
||||
- `href` is the href value to link the image to. If link is supplied,
|
||||
an `<a href="LINKVALUE"><a>` tag is placed around the image tag.
|
||||
|
||||
- `path_prefix` is an optional prefix string you can give the output
|
||||
path. This is useful if you want to supply a different server name
|
||||
for the image.
|
||||
|
||||
- All parameters that are not in the list above are printed as
|
||||
name/value-pairs inside the created `<img>` tag.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> `{html_image}` requires a hit to the disk to read the image and
|
||||
> calculate the height and width. If you don\'t use template
|
||||
> [caching](#caching), it is generally better to avoid `{html_image}`
|
||||
> and leave image tags static for optimal performance.
|
||||
|
||||
|
||||
{html_image file='pumpkin.jpg'}
|
||||
{html_image file='/path/from/docroot/pumpkin.jpg'}
|
||||
{html_image file='../path/relative/to/currdir/pumpkin.jpg'}
|
||||
|
||||
|
||||
|
||||
Example output of the above template would be:
|
||||
|
||||
|
||||
<img src="pumpkin.jpg" alt="" width="44" height="68" />
|
||||
<img src="/path/from/docroot/pumpkin.jpg" alt="" width="44" height="68" />
|
||||
<img src="../path/relative/to/currdir/pumpkin.jpg" alt="" width="44" height="68" />
|
||||
|
||||
|
||||
@@ -1,155 +0,0 @@
|
||||
{html\_options} {#language.function.html.options}
|
||||
===============
|
||||
|
||||
`{html_options}` is a [custom function](#language.custom.functions) that
|
||||
creates the html `<select><option>` group with the assigned data. It
|
||||
takes care of which item(s) are selected by default as well.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- ------------------- ------------------------------------- --------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
values array Yes, unless using options attribute *n/a* An array of values for dropdown
|
||||
output array Yes, unless using options attribute *n/a* An array of output for dropdown
|
||||
selected string/array No *empty* The selected option element(s)
|
||||
options associative array Yes, unless using values and output *n/a* An associative array of values and output
|
||||
name string No *empty* Name of select group
|
||||
strict boolean No *FALSE* Will make the \"extra\" attributes *disabled* and *readonly* only be set, if they were supplied with either boolean *TRUE* or string *\"disabled\"* and *\"readonly\"* respectively
|
||||
|
||||
- Required attributes are `values` and `output`, unless you use the
|
||||
combined `options` instead.
|
||||
|
||||
- If the optional `name` attribute is given, the `<select></select>`
|
||||
tags are created, otherwise ONLY the `<option>` list is generated.
|
||||
|
||||
- If a given value is an array, it will treat it as an html
|
||||
`<optgroup>`, and display the groups. Recursion is supported with
|
||||
`<optgroup>`.
|
||||
|
||||
- All parameters that are not in the list above are printed as
|
||||
name/value-pairs inside the `<select>` tag. They are ignored if the
|
||||
optional `name` is not given.
|
||||
|
||||
- All output is XHTML compliant.
|
||||
|
||||
<!-- -->
|
||||
|
||||
|
||||
<?php
|
||||
$smarty->assign('myOptions', array(
|
||||
1800 => 'Joe Schmoe',
|
||||
9904 => 'Jack Smith',
|
||||
2003 => 'Charlie Brown')
|
||||
);
|
||||
$smarty->assign('mySelect', 9904);
|
||||
?>
|
||||
|
||||
|
||||
|
||||
The following template will generate a drop-down list. Note the presence
|
||||
of the `name` attribute which creates the `<select>` tags.
|
||||
|
||||
|
||||
{html_options name=foo options=$myOptions selected=$mySelect}
|
||||
|
||||
|
||||
|
||||
Output of the above example would be:
|
||||
|
||||
|
||||
<select name="foo">
|
||||
<option value="1800">Joe Schmoe</option>
|
||||
<option value="9904" selected="selected">Jack Smith</option>
|
||||
<option value="2003">Charlie Brown</option>
|
||||
</select>
|
||||
|
||||
|
||||
<?php
|
||||
$smarty->assign('cust_ids', array(56,92,13));
|
||||
$smarty->assign('cust_names', array(
|
||||
'Joe Schmoe',
|
||||
'Jane Johnson',
|
||||
'Charlie Brown'));
|
||||
$smarty->assign('customer_id', 92);
|
||||
?>
|
||||
|
||||
|
||||
|
||||
The above arrays would be output with the following template (note the
|
||||
use of the php [`count()`](&url.php-manual;function.count) function as a
|
||||
modifier to set the select size).
|
||||
|
||||
|
||||
<select name="customer_id" size="{$cust_names|@count}">
|
||||
{html_options values=$cust_ids output=$cust_names selected=$customer_id}
|
||||
</select>
|
||||
|
||||
|
||||
|
||||
The above example would output:
|
||||
|
||||
|
||||
<select name="customer_id" size="3">
|
||||
<option value="56">Joe Schmoe</option>
|
||||
<option value="92" selected="selected">Jane Johnson</option>
|
||||
<option value="13">Charlie Brown</option>
|
||||
</select>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
$sql = 'select type_id, types from contact_types order by type';
|
||||
$smarty->assign('contact_types',$db->getAssoc($sql));
|
||||
|
||||
$sql = 'select contact_id, name, email, contact_type_id
|
||||
from contacts where contact_id='.$contact_id;
|
||||
$smarty->assign('contact',$db->getRow($sql));
|
||||
|
||||
?>
|
||||
|
||||
Where a template could be as follows. Note the use of the
|
||||
[`truncate`](#language.modifier.truncate) modifier.
|
||||
|
||||
|
||||
<select name="type_id">
|
||||
<option value='null'>-- none --</option>
|
||||
{html_options options=$contact_types|truncate:20 selected=$contact.type_id}
|
||||
</select>
|
||||
|
||||
|
||||
|
||||
|
||||
<?php
|
||||
$arr['Sport'] = array(6 => 'Golf', 9 => 'Cricket',7 => 'Swim');
|
||||
$arr['Rest'] = array(3 => 'Sauna',1 => 'Massage');
|
||||
$smarty->assign('lookups', $arr);
|
||||
$smarty->assign('fav', 7);
|
||||
?>
|
||||
|
||||
|
||||
|
||||
The script above and the following template
|
||||
|
||||
|
||||
{html_options name=foo options=$lookups selected=$fav}
|
||||
|
||||
|
||||
|
||||
would output:
|
||||
|
||||
|
||||
<select name="foo">
|
||||
<optgroup label="Sport">
|
||||
<option value="6">Golf</option>
|
||||
<option value="9">Cricket</option>
|
||||
<option value="7" selected="selected">Swim</option>
|
||||
</optgroup>
|
||||
<optgroup label="Rest">
|
||||
<option value="3">Sauna</option>
|
||||
<option value="1">Massage</option>
|
||||
</optgroup>
|
||||
</select>
|
||||
|
||||
See also [`{html_checkboxes}`](#language.function.html.checkboxes) and
|
||||
[`{html_radios}`](#language.function.html.radios)
|
||||
@@ -1,112 +0,0 @@
|
||||
{html\_radios} {#language.function.html.radios}
|
||||
==============
|
||||
|
||||
`{html_radios}` is a [custom function](#language.custom.functions) that
|
||||
creates a HTML radio button group. It also takes care of which item is
|
||||
selected by default as well.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- ------------------- ------------------------------------- --------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
name string No *radio* Name of radio list
|
||||
values array Yes, unless using options attribute *n/a* An array of values for radio buttons
|
||||
output array Yes, unless using options attribute *n/a* An array of output for radio buttons
|
||||
selected string No *empty* The selected radio element
|
||||
options associative array Yes, unless using values and output *n/a* An associative array of values and output
|
||||
separator string No *empty* String of text to separate each radio item
|
||||
assign string No *empty* Assign radio tags to an array instead of output
|
||||
labels boolean No *TRUE* Add \<label\>-tags to the output
|
||||
label\_ids boolean No *FALSE* Add id-attributes to \<label\> and \<input\> to the output
|
||||
escape boolean No *TRUE* Escape the output / content (values are always escaped)
|
||||
strict boolean No *FALSE* Will make the \"extra\" attributes *disabled* and *readonly* only be set, if they were supplied with either boolean *TRUE* or string *\"disabled\"* and *\"readonly\"* respectively
|
||||
|
||||
- Required attributes are `values` and `output`, unless you use
|
||||
`options` instead.
|
||||
|
||||
- All output is XHTML compliant.
|
||||
|
||||
- All parameters that are not in the list above are output as
|
||||
name/value-pairs inside each of the created `<input>`-tags.
|
||||
|
||||
<!-- -->
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
$smarty->assign('cust_ids', array(1000,1001,1002,1003));
|
||||
$smarty->assign('cust_names', array(
|
||||
'Joe Schmoe',
|
||||
'Jack Smith',
|
||||
'Jane Johnson',
|
||||
'Charlie Brown')
|
||||
);
|
||||
$smarty->assign('customer_id', 1001);
|
||||
|
||||
?>
|
||||
|
||||
|
||||
|
||||
Where template is:
|
||||
|
||||
|
||||
{html_radios name='id' values=$cust_ids output=$cust_names
|
||||
selected=$customer_id separator='<br />'}
|
||||
|
||||
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
$smarty->assign('cust_radios', array(
|
||||
1000 => 'Joe Schmoe',
|
||||
1001 => 'Jack Smith',
|
||||
1002 => 'Jane Johnson',
|
||||
1003 => 'Charlie Brown'));
|
||||
$smarty->assign('customer_id', 1001);
|
||||
|
||||
?>
|
||||
|
||||
|
||||
|
||||
Where template is:
|
||||
|
||||
|
||||
{html_radios name='id' options=$cust_radios
|
||||
selected=$customer_id separator='<br />'}
|
||||
|
||||
|
||||
|
||||
Both examples will output:
|
||||
|
||||
|
||||
<label><input type="radio" name="id" value="1000" />Joe Schmoe</label><br />
|
||||
<label><input type="radio" name="id" value="1001" checked="checked" />Jack Smith</label><br />
|
||||
<label><input type="radio" name="id" value="1002" />Jane Johnson</label><br />
|
||||
<label><input type="radio" name="id" value="1003" />Charlie Brown</label><br />
|
||||
|
||||
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
$sql = 'select type_id, types from contact_types order by type';
|
||||
$smarty->assign('contact_types',$db->getAssoc($sql));
|
||||
|
||||
$sql = 'select contact_id, name, email, contact_type_id '
|
||||
.'from contacts where contact_id='.$contact_id;
|
||||
$smarty->assign('contact',$db->getRow($sql));
|
||||
|
||||
?>
|
||||
|
||||
|
||||
|
||||
The variable assigned from the database above would be output with the
|
||||
template:
|
||||
|
||||
|
||||
{html_radios name='contact_type_id' options=$contact_types
|
||||
selected=$contact.contact_type_id separator='<br />'}
|
||||
|
||||
|
||||
|
||||
See also [`{html_checkboxes}`](#language.function.html.checkboxes) and
|
||||
[`{html_options}`](#language.function.html.options)
|
||||
@@ -1,119 +0,0 @@
|
||||
{html\_select\_date} {#language.function.html.select.date}
|
||||
====================
|
||||
|
||||
`{html_select_date}` is a [custom function](#language.custom.functions)
|
||||
that creates date dropdowns. It can display any or all of year, month,
|
||||
and day. All parameters that are not in the list below are printed as
|
||||
name/value-pairs inside the `<select>` tags of day, month and year.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------- ---------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
prefix string No Date\_ What to prefix the var name with
|
||||
time [timestamp](&url.php-manual;function.time), [DateTime](&url.php-manual;class.DateTime), mysql timestamp or any string parsable by [`strtotime()`](&url.php-manual;strtotime), arrays as produced by this function if field\_array is set. No current [timestamp](&url.php-manual;function.time) What date/time to pre-select. If an array is given, the attributes field\_array and prefix are used to identify the array elements to extract year, month and day from. Omitting this parameter or supplying a falsy value will select the current date. To prevent date selection, pass in NULL
|
||||
start\_year string No current year The first year in the dropdown, either year number, or relative to current year (+/- N)
|
||||
end\_year string No same as start\_year The last year in the dropdown, either year number, or relative to current year (+/- N)
|
||||
display\_days boolean No TRUE Whether to display days or not
|
||||
display\_months boolean No TRUE Whether to display months or not
|
||||
display\_years boolean No TRUE Whether to display years or not
|
||||
month\_names array No null List of strings to display for months. array(1 =\> \'Jan\', ..., 12 =\> \'Dec\')
|
||||
month\_format string No \%B What format the month should be in (strftime)
|
||||
day\_format string No \%02d What format the day output should be in (sprintf)
|
||||
day\_value\_format string No \%d What format the day value should be in (sprintf)
|
||||
year\_as\_text boolean No FALSE Whether or not to display the year as text
|
||||
reverse\_years boolean No FALSE Display years in reverse order
|
||||
field\_array string No null If a name is given, the select boxes will be drawn such that the results will be returned to PHP in the form of name\[Day\], name\[Year\], name\[Month\].
|
||||
day\_size string No null Adds size attribute to select tag if given
|
||||
month\_size string No null Adds size attribute to select tag if given
|
||||
year\_size string No null Adds size attribute to select tag if given
|
||||
all\_extra string No null Adds extra attributes to all select/input tags if given
|
||||
day\_extra string No null Adds extra attributes to select/input tags if given
|
||||
month\_extra string No null Adds extra attributes to select/input tags if given
|
||||
year\_extra string No null Adds extra attributes to select/input tags if given
|
||||
all\_id string No null Adds id-attribute to all select/input tags if given
|
||||
day\_id string No null Adds id-attribute to select/input tags if given
|
||||
month\_id string No null Adds id-attribute to select/input tags if given
|
||||
year\_id string No null Adds id-attribute to select/input tags if given
|
||||
field\_order string No MDY The order in which to display the fields
|
||||
field\_separator string No \\n String printed between different fields
|
||||
month\_value\_format string No \%m strftime() format of the month values, default is %m for month numbers.
|
||||
all\_empty string No null If supplied then the first element of any select-box has this value as it\'s label and "" as it\'s value. This is useful to make the select-boxes read "Please select" for example.
|
||||
year\_empty string No null If supplied then the first element of the year\'s select-box has this value as it\'s label and "" as it\'s value. This is useful to make the select-box read "Please select a year" for example. Note that you can use values like "-MM-DD" as time-attribute to indicate an unselected year.
|
||||
month\_empty string No null If supplied then the first element of the month\'s select-box has this value as it\'s label and "" as it\'s value. . Note that you can use values like "YYYY\--DD" as time-attribute to indicate an unselected month.
|
||||
day\_empty string No null If supplied then the first element of the day\'s select-box has this value as it\'s label and "" as it\'s value. Note that you can use values like "YYYY-MM-" as time-attribute to indicate an unselected day.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> There is an useful php function on the [date tips page](#tips.dates)
|
||||
> for converting `{html_select_date}` form values to a timestamp.
|
||||
|
||||
Template code
|
||||
|
||||
|
||||
{html_select_date}
|
||||
|
||||
|
||||
|
||||
This will output:
|
||||
|
||||
|
||||
<select name="Date_Month">
|
||||
<option value="1">January</option>
|
||||
<option value="2">February</option>
|
||||
<option value="3">March</option>
|
||||
..... snipped .....
|
||||
<option value="10">October</option>
|
||||
<option value="11">November</option>
|
||||
<option value="12" selected="selected">December</option>
|
||||
</select>
|
||||
<select name="Date_Day">
|
||||
<option value="1">01</option>
|
||||
<option value="2">02</option>
|
||||
<option value="3">03</option>
|
||||
..... snipped .....
|
||||
<option value="11">11</option>
|
||||
<option value="12">12</option>
|
||||
<option value="13" selected="selected">13</option>
|
||||
<option value="14">14</option>
|
||||
<option value="15">15</option>
|
||||
..... snipped .....
|
||||
<option value="29">29</option>
|
||||
<option value="30">30</option>
|
||||
<option value="31">31</option>
|
||||
</select>
|
||||
<select name="Date_Year">
|
||||
<option value="2006" selected="selected">2006</option>
|
||||
</select>
|
||||
|
||||
|
||||
|
||||
|
||||
{* start and end year can be relative to current year *}
|
||||
{html_select_date prefix='StartDate' time=$time start_year='-5'
|
||||
end_year='+1' display_days=false}
|
||||
|
||||
|
||||
|
||||
With 2000 as the current year the output:
|
||||
|
||||
|
||||
<select name="StartDateMonth">
|
||||
<option value="1">January</option>
|
||||
<option value="2">February</option>
|
||||
.... snipped ....
|
||||
<option value="11">November</option>
|
||||
<option value="12" selected="selected">December</option>
|
||||
</select>
|
||||
<select name="StartDateYear">
|
||||
<option value="1995">1995</option>
|
||||
.... snipped ....
|
||||
<option value="1999">1999</option>
|
||||
<option value="2000" selected="selected">2000</option>
|
||||
<option value="2001">2001</option>
|
||||
</select>
|
||||
|
||||
|
||||
|
||||
See also [`{html_select_time}`](#language.function.html.select.time),
|
||||
[`date_format`](#language.modifier.date.format),
|
||||
[`$smarty.now`](#language.variables.smarty.now) and the [date tips
|
||||
page](#tips.dates).
|
||||
@@ -1,98 +0,0 @@
|
||||
{html\_select\_time} {#language.function.html.select.time}
|
||||
====================
|
||||
|
||||
`{html_select_time}` is a [custom function](#language.custom.functions)
|
||||
that creates time dropdowns for you. It can display any or all of hour,
|
||||
minute, second and meridian.
|
||||
|
||||
The `time` attribute can have different formats. It can be a unique
|
||||
timestamp, a string of the format `YYYYMMDDHHMMSS` or a string that is
|
||||
parseable by PHP\'s [`strtotime()`](&url.php-manual;strtotime).
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
----------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------- ---------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
prefix string No Time\_ What to prefix the var name with
|
||||
time [timestamp](&url.php-manual;function.time), [DateTime](&url.php-manual;class.DateTime), mysql timestamp or any string parsable by [`strtotime()`](&url.php-manual;strtotime), arrays as produced by this function if field\_array is set. No current [timestamp](&url.php-manual;function.time) What date/time to pre-select. If an array is given, the attributes field\_array and prefix are used to identify the array elements to extract hour, minute, second and meridian from.
|
||||
display\_hours boolean No TRUE Whether or not to display hours
|
||||
display\_minutes boolean No TRUE Whether or not to display minutes
|
||||
display\_seconds boolean No TRUE Whether or not to display seconds
|
||||
display\_meridian boolean No TRUE Whether or not to display meridian (am/pm)
|
||||
use\_24\_hours boolean No TRUE Whether or not to use 24 hour clock
|
||||
minute\_interval integer No 1 Number interval in minute dropdown
|
||||
second\_interval integer No 1 Number interval in second dropdown
|
||||
hour\_format string No \%02d What format the hour label should be in (sprintf)
|
||||
hour\_value\_format string No \%20d What format the hour value should be in (sprintf)
|
||||
minute\_format string No \%02d What format the minute label should be in (sprintf)
|
||||
minute\_value\_format string No \%20d What format the minute value should be in (sprintf)
|
||||
second\_format string No \%02d What format the second label should be in (sprintf)
|
||||
second\_value\_format string No \%20d What format the second value should be in (sprintf)
|
||||
field\_array string No n/a Outputs values to array of this name
|
||||
all\_extra string No null Adds extra attributes to select/input tags if given
|
||||
hour\_extra string No null Adds extra attributes to select/input tags if given
|
||||
minute\_extra string No null Adds extra attributes to select/input tags if given
|
||||
second\_extra string No null Adds extra attributes to select/input tags if given
|
||||
meridian\_extra string No null Adds extra attributes to select/input tags if given
|
||||
field\_separator string No \\n String printed between different fields
|
||||
option\_separator string No \\n String printed between different options of a field
|
||||
all\_id string No null Adds id-attribute to all select/input tags if given
|
||||
hour\_id string No null Adds id-attribute to select/input tags if given
|
||||
minute\_id string No null Adds id-attribute to select/input tags if given
|
||||
second\_id string No null Adds id-attribute to select/input tags if given
|
||||
meridian\_id string No null Adds id-attribute to select/input tags if given
|
||||
all\_empty string No null If supplied then the first element of any select-box has this value as it\'s label and "" as it\'s value. This is useful to make the select-boxes read "Please select" for example.
|
||||
hour\_empty string No null If supplied then the first element of the hour\'s select-box has this value as it\'s label and "" as it\'s value. This is useful to make the select-box read "Please select an hour" for example.
|
||||
minute\_empty string No null If supplied then the first element of the minute\'s select-box has this value as it\'s label and "" as it\'s value. This is useful to make the select-box read "Please select an minute" for example.
|
||||
second\_empty string No null If supplied then the first element of the second\'s select-box has this value as it\'s label and "" as it\'s value. This is useful to make the select-box read "Please select an second" for example.
|
||||
meridian\_empty string No null If supplied then the first element of the meridian\'s select-box has this value as it\'s label and "" as it\'s value. This is useful to make the select-box read "Please select an meridian" for example.
|
||||
|
||||
|
||||
{html_select_time use_24_hours=true}
|
||||
|
||||
|
||||
|
||||
At 9:20 and 23 seconds in the morning the template above would output:
|
||||
|
||||
|
||||
<select name="Time_Hour">
|
||||
<option value="00">00</option>
|
||||
<option value="01">01</option>
|
||||
... snipped ....
|
||||
<option value="08">08</option>
|
||||
<option value="09" selected>09</option>
|
||||
<option value="10">10</option>
|
||||
... snipped ....
|
||||
<option value="22">22</option>
|
||||
<option value="23">23</option>
|
||||
</select>
|
||||
<select name="Time_Minute">
|
||||
<option value="00">00</option>
|
||||
<option value="01">01</option>
|
||||
... snipped ....
|
||||
<option value="19">19</option>
|
||||
<option value="20" selected>20</option>
|
||||
<option value="21">21</option>
|
||||
... snipped ....
|
||||
<option value="58">58</option>
|
||||
<option value="59">59</option>
|
||||
</select>
|
||||
<select name="Time_Second">
|
||||
<option value="00">00</option>
|
||||
<option value="01">01</option>
|
||||
... snipped ....
|
||||
<option value="22">22</option>
|
||||
<option value="23" selected>23</option>
|
||||
<option value="24">24</option>
|
||||
... snipped ....
|
||||
<option value="58">58</option>
|
||||
<option value="59">59</option>
|
||||
</select>
|
||||
<select name="Time_Meridian">
|
||||
<option value="am" selected>AM</option>
|
||||
<option value="pm">PM</option>
|
||||
</select>
|
||||
|
||||
|
||||
|
||||
See also [`$smarty.now`](#language.variables.smarty.now),
|
||||
[`{html_select_date}`](#language.function.html.select.date) and the
|
||||
[date tips page](#tips.dates).
|
||||
@@ -1,89 +0,0 @@
|
||||
{html\_table} {#language.function.html.table}
|
||||
=============
|
||||
|
||||
`{html_table}` is a [custom function](#language.custom.functions) that
|
||||
dumps an array of data into an HTML `<table>`.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- --------- ---------- ---------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
loop array Yes *n/a* Array of data to loop through
|
||||
cols mixed No *3* Number of columns in the table or a comma-separated list of column heading names or an array of column heading names.if the cols-attribute is empty, but rows are given, then the number of cols is computed by the number of rows and the number of elements to display to be just enough cols to display all elements. If both, rows and cols, are omitted cols defaults to 3. if given as a list or array, the number of columns is computed from the number of elements in the list or array.
|
||||
rows integer No *empty* Number of rows in the table. if the rows-attribute is empty, but cols are given, then the number of rows is computed by the number of cols and the number of elements to display to be just enough rows to display all elements.
|
||||
inner string No *cols* Direction of consecutive elements in the loop-array to be rendered. *cols* means elements are displayed col-by-col. *rows* means elements are displayed row-by-row.
|
||||
caption string No *empty* Text to be used for the `<caption>` element of the table
|
||||
table\_attr string No *border=\"1\"* Attributes for `<table>` tag
|
||||
th\_attr string No *empty* Attributes for `<th>` tag (arrays are cycled)
|
||||
tr\_attr string No *empty* attributes for `<tr>` tag (arrays are cycled)
|
||||
td\_attr string No *empty* Attributes for `<td>` tag (arrays are cycled)
|
||||
trailpad string No * * Value to pad the trailing cells on last row with (if any)
|
||||
hdir string No *right* Direction of each row to be rendered. possible values: *right* (left-to-right), and *left* (right-to-left)
|
||||
vdir string No *down* Direction of each column to be rendered. possible values: *down* (top-to-bottom), *up* (bottom-to-top)
|
||||
|
||||
- The `cols` attribute determines how many columns will be in the
|
||||
table.
|
||||
|
||||
- The `table_attr`, `tr_attr` and `td_attr` values determine the
|
||||
attributes given to the `<table>`, `<tr>` and `<td>` tags.
|
||||
|
||||
- If `tr_attr` or `td_attr` are arrays, they will be cycled through.
|
||||
|
||||
- `trailpad` is the value put into the trailing cells on the last
|
||||
table row if there are any present.
|
||||
|
||||
<!-- -->
|
||||
|
||||
|
||||
<?php
|
||||
$smarty->assign( 'data', array(1,2,3,4,5,6,7,8,9) );
|
||||
$smarty->assign( 'tr', array('bgcolor="#eeeeee"','bgcolor="#dddddd"') );
|
||||
$smarty->display('index.tpl');
|
||||
?>
|
||||
|
||||
|
||||
|
||||
The variables assigned from php could be displayed as these three
|
||||
examples demonstrate. Each example shows the template followed by
|
||||
output.
|
||||
|
||||
|
||||
{**** Example One ****}
|
||||
{html_table loop=$data}
|
||||
|
||||
<table border="1">
|
||||
<tbody>
|
||||
<tr><td>1</td><td>2</td><td>3</td></tr>
|
||||
<tr><td>4</td><td>5</td><td>6</td></tr>
|
||||
<tr><td>7</td><td>8</td><td>9</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
||||
{**** Example Two ****}
|
||||
{html_table loop=$data cols=4 table_attr='border="0"'}
|
||||
|
||||
<table border="0">
|
||||
<tbody>
|
||||
<tr><td>1</td><td>2</td><td>3</td><td>4</td></tr>
|
||||
<tr><td>5</td><td>6</td><td>7</td><td>8</td></tr>
|
||||
<tr><td>9</td><td> </td><td> </td><td> </td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
||||
{**** Example Three ****}
|
||||
{html_table loop=$data cols="first,second,third,fourth" tr_attr=$tr}
|
||||
|
||||
<table border="1">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>first</th><th>second</th><th>third</th><th>fourth</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr bgcolor="#eeeeee"><td>1</td><td>2</td><td>3</td><td>4</td></tr>
|
||||
<tr bgcolor="#dddddd"><td>5</td><td>6</td><td>7</td><td>8</td></tr>
|
||||
<tr bgcolor="#eeeeee"><td>9</td><td> </td><td> </td><td> </td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
{mailto} {#language.function.mailto}
|
||||
========
|
||||
|
||||
`{mailto}` automates the creation of a `mailto:` anchor links and
|
||||
optionally encodes them. Encoding emails makes it more difficult for web
|
||||
spiders to lift email addresses off of a site.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Javascript is probably the most thorough form of encoding, although
|
||||
> you can use hex encoding too.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- -------- ---------- --------- -----------------------------------------------------------------------------------------------
|
||||
address string Yes *n/a* The e-mail address
|
||||
text string No *n/a* The text to display, default is the e-mail address
|
||||
encode string No *none* How to encode the e-mail. Can be one of `none`, `hex`, `javascript` or `javascript_charcode`.
|
||||
cc string No *n/a* Email addresses to carbon copy, separate entries by a comma.
|
||||
bcc string No *n/a* Email addresses to blind carbon copy, separate entries by a comma
|
||||
subject string No *n/a* Email subject
|
||||
newsgroups string No *n/a* Newsgroups to post to, separate entries by a comma.
|
||||
followupto string No *n/a* Addresses to follow up to, separate entries by a comma.
|
||||
extra string No *n/a* Any extra information you want passed to the link, such as style sheet classes
|
||||
|
||||
|
||||
{mailto address="me@example.com"}
|
||||
<a href="mailto:me@example.com" >me@example.com</a>
|
||||
|
||||
{mailto address="me@example.com" text="send me some mail"}
|
||||
<a href="mailto:me@example.com" >send me some mail</a>
|
||||
|
||||
{mailto address="me@example.com" encode="javascript"}
|
||||
<script type="text/javascript" language="javascript">
|
||||
eval(unescape('%64%6f% ... snipped ...%61%3e%27%29%3b'))
|
||||
</script>
|
||||
|
||||
{mailto address="me@example.com" encode="hex"}
|
||||
<a href="mailto:%6d%65.. snipped..3%6f%6d">m&..snipped...#x6f;m</a>
|
||||
|
||||
{mailto address="me@example.com" subject="Hello to you!"}
|
||||
<a href="mailto:me@example.com?subject=Hello%20to%20you%21" >me@example.com</a>
|
||||
|
||||
{mailto address="me@example.com" cc="you@example.com,they@example.com"}
|
||||
<a href="mailto:me@example.com?cc=you@example.com,they@example.com" >me@example.com</a>
|
||||
|
||||
{mailto address="me@example.com" extra='class="email"'}
|
||||
<a href="mailto:me@example.com" class="email">me@example.com</a>
|
||||
|
||||
{mailto address="me@example.com" encode="javascript_charcode"}
|
||||
<script type="text/javascript" language="javascript">
|
||||
{document.write(String.fromCharCode(60,97, ... snipped ....60,47,97,62))}
|
||||
</script>
|
||||
|
||||
See also [`escape`](#language.modifier.escape),
|
||||
[`{textformat}`](#language.function.textformat) and [obfuscating email
|
||||
addresses](#tips.obfuscating.email).
|
||||
@@ -1,104 +0,0 @@
|
||||
{math} {#language.function.math}
|
||||
======
|
||||
|
||||
`{math}` allows the template designer to do math equations in the
|
||||
template.
|
||||
|
||||
- Any numeric template variables may be used in the equations, and the
|
||||
result is printed in place of the tag.
|
||||
|
||||
- The variables used in the equation are passed as parameters, which
|
||||
can be template variables or static values.
|
||||
|
||||
- +, -, /, \*, abs, ceil, cos, exp, floor, log, log10, max, min, pi,
|
||||
pow, rand, round, sin, sqrt, srans and tan are all valid operators.
|
||||
Check the PHP documentation for further information on these
|
||||
[math](&url.php-manual;eval) functions.
|
||||
|
||||
- If you supply the `assign` attribute, the output of the `{math}`
|
||||
function will be assigned to this template variable instead of being
|
||||
output to the template.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> `{math}` is an expensive function in performance due to its use of the
|
||||
> php [`eval()`](&url.php-manual;eval) function. Doing the math in PHP
|
||||
> is much more efficient, so whenever possible do the math calculations
|
||||
> in the script and [`assign()`](#api.assign) the results to the
|
||||
> template. Definitely avoid repetitive `{math}` function calls, eg
|
||||
> within [`{section}`](#language.function.section) loops.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- --------- ---------- --------- --------------------------------------------------
|
||||
equation string Yes *n/a* The equation to execute
|
||||
format string No *n/a* The format of the result (sprintf)
|
||||
var numeric Yes *n/a* Equation variable value
|
||||
assign string No *n/a* Template variable the output will be assigned to
|
||||
\[var \...\] numeric Yes *n/a* Equation variable value
|
||||
|
||||
**Example a:**
|
||||
|
||||
|
||||
{* $height=4, $width=5 *}
|
||||
|
||||
{math equation="x + y" x=$height y=$width}
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
9
|
||||
|
||||
|
||||
|
||||
**Example b:**
|
||||
|
||||
|
||||
{* $row_height = 10, $row_width = 20, #col_div# = 2, assigned in template *}
|
||||
|
||||
{math equation="height * width / division"
|
||||
height=$row_height
|
||||
width=$row_width
|
||||
division=#col_div#}
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
100
|
||||
|
||||
|
||||
|
||||
**Example c:**
|
||||
|
||||
|
||||
{* you can use parenthesis *}
|
||||
|
||||
{math equation="(( x + y ) / z )" x=2 y=10 z=2}
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
6
|
||||
|
||||
|
||||
|
||||
**Example d:**
|
||||
|
||||
|
||||
{* you can supply a format parameter in sprintf format *}
|
||||
|
||||
{math equation="x + y" x=4.4444 y=5.0000 format="%.2f"}
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
9.44
|
||||
|
||||
|
||||
@@ -1,190 +0,0 @@
|
||||
{textformat} {#language.function.textformat}
|
||||
============
|
||||
|
||||
`{textformat}` is a [block function](#plugins.block.functions) used to
|
||||
format text. It basically cleans up spaces and special characters, and
|
||||
formats paragraphs by wrapping at a boundary and indenting lines.
|
||||
|
||||
You can set the parameters explicitly, or use a preset style. Currently
|
||||
"email" is the only available style.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- --------- ---------- ------------------ ----------------------------------------------------------------------------------------
|
||||
style string No *n/a* Preset style
|
||||
indent number No *0* The number of chars to indent every line
|
||||
indent\_first number No *0* The number of chars to indent the first line
|
||||
indent\_char string No *(single space)* The character (or string of chars) to indent with
|
||||
wrap number No *80* How many characters to wrap each line to
|
||||
wrap\_char string No *\\n* The character (or string of chars) to break each line with
|
||||
wrap\_cut boolean No *FALSE* If TRUE, wrap will break the line at the exact character instead of at a word boundary
|
||||
assign string No *n/a* The template variable the output will be assigned to
|
||||
|
||||
|
||||
{textformat wrap=40}
|
||||
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
|
||||
This is bar.
|
||||
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
|
||||
{/textformat}
|
||||
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
|
||||
This is foo. This is foo. This is foo.
|
||||
This is foo. This is foo. This is foo.
|
||||
|
||||
This is bar.
|
||||
|
||||
bar foo bar foo foo. bar foo bar foo
|
||||
foo. bar foo bar foo foo. bar foo bar
|
||||
foo foo. bar foo bar foo foo. bar foo
|
||||
bar foo foo. bar foo bar foo foo.
|
||||
|
||||
|
||||
|
||||
|
||||
{textformat wrap=40 indent=4}
|
||||
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
|
||||
This is bar.
|
||||
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
|
||||
{/textformat}
|
||||
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
|
||||
This is foo. This is foo. This is
|
||||
foo. This is foo. This is foo. This
|
||||
is foo.
|
||||
|
||||
This is bar.
|
||||
|
||||
bar foo bar foo foo. bar foo bar foo
|
||||
foo. bar foo bar foo foo. bar foo
|
||||
bar foo foo. bar foo bar foo foo.
|
||||
bar foo bar foo foo. bar foo bar
|
||||
foo foo.
|
||||
|
||||
|
||||
|
||||
|
||||
{textformat wrap=40 indent=4 indent_first=4}
|
||||
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
|
||||
This is bar.
|
||||
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
|
||||
{/textformat}
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
|
||||
This is foo. This is foo. This
|
||||
is foo. This is foo. This is foo.
|
||||
This is foo.
|
||||
|
||||
This is bar.
|
||||
|
||||
bar foo bar foo foo. bar foo bar
|
||||
foo foo. bar foo bar foo foo. bar
|
||||
foo bar foo foo. bar foo bar foo
|
||||
foo. bar foo bar foo foo. bar foo
|
||||
bar foo foo.
|
||||
|
||||
|
||||
|
||||
|
||||
{textformat style="email"}
|
||||
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
|
||||
This is bar.
|
||||
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
|
||||
{/textformat}
|
||||
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
|
||||
This is foo. This is foo. This is foo. This is foo. This is foo. This is
|
||||
foo.
|
||||
|
||||
This is bar.
|
||||
|
||||
bar foo bar foo foo. bar foo bar foo foo. bar foo bar foo foo. bar foo
|
||||
bar foo foo. bar foo bar foo foo. bar foo bar foo foo. bar foo bar foo
|
||||
foo.
|
||||
|
||||
|
||||
|
||||
|
||||
See also [`{strip}`](#language.function.strip) and
|
||||
[`wordwrap`](#language.modifier.wordwrap).
|
||||
@@ -1,123 +0,0 @@
|
||||
Variable Modifiers {#language.modifiers}
|
||||
==================
|
||||
|
||||
## Table of contents
|
||||
- [capitalize](./language-modifiers/language-modifier-capitalize.md)
|
||||
- [cat](./language-modifiers/language-modifier-cat.md)
|
||||
- [count_characters](./language-modifiers/language-modifier-count-characters.md)
|
||||
- [count_paragraphs](./language-modifiers/language-modifier-count-paragraphs.md)
|
||||
- [count_sentences](./language-modifiers/language-modifier-count-sentences.md)
|
||||
- [count_words](./language-modifiers/language-modifier-count-words.md)
|
||||
- [date_format](./language-modifiers/language-modifier-date-format.md)
|
||||
- [default](./language-modifiers/language-modifier-default.md)
|
||||
- [escape](./language-modifiers/language-modifier-escape.md)
|
||||
- [from_charset](./language-modifiers/language-modifier-from-charset.md)
|
||||
- [indent](./language-modifiers/language-modifier-indent.md)
|
||||
- [lower](./language-modifiers/language-modifier-lower.md)
|
||||
- [nl2br](./language-modifiers/language-modifier-nl2br.md)
|
||||
- [regex_replace](./language-modifiers/language-modifier-regex-replace.md)
|
||||
- [replace](./language-modifiers/language-modifier-replace.md)
|
||||
- [spacify](./language-modifiers/language-modifier-spacify.md)
|
||||
- [string_format](./language-modifiers/language-modifier-string-format.md)
|
||||
- [strip](./language-modifiers/language-modifier-strip.md)
|
||||
- [strip_tags](./language-modifiers/language-modifier-strip-tags.md)
|
||||
- [to_charset](./language-modifiers/language-modifier-to-charset.md)
|
||||
- [truncate](./language-modifiers/language-modifier-truncate.md)
|
||||
- [unescape](./language-modifiers/language-modifier-unescape.md)
|
||||
- [upper](./language-modifiers/language-modifier-upper.md)
|
||||
- [wordwrap](./language-modifiers/language-modifier-wordwrap.md)
|
||||
|
||||
Variable modifiers can be applied to
|
||||
[variables](./language-variables.md), [custom
|
||||
functions](./language-custom-functions.md) or strings. To apply a modifier,
|
||||
specify the value followed by a `|` (pipe) and the modifier name. A
|
||||
modifier may accept additional parameters that affect its behavior.
|
||||
These parameters follow the modifier name and are separated by a `:`
|
||||
(colon). Also, *all php-functions can be used as modifiers implicitly*
|
||||
(more below) and modifiers can be
|
||||
[combined](./language-combining-modifiers.md).
|
||||
|
||||
|
||||
{* apply modifier to a variable *}
|
||||
{$title|upper}
|
||||
|
||||
{* modifier with parameters *}
|
||||
{$title|truncate:40:"..."}
|
||||
|
||||
{* apply modifier to a function parameter *}
|
||||
{html_table loop=$myvar|upper}
|
||||
|
||||
{* with parameters *}
|
||||
{html_table loop=$myvar|truncate:40:"..."}
|
||||
|
||||
{* apply modifier to literal string *}
|
||||
{"foobar"|upper}
|
||||
|
||||
{* using date_format to format the current date *}
|
||||
{$smarty.now|date_format:"%Y/%m/%d"}
|
||||
|
||||
{* apply modifier to a custom function *}
|
||||
{mailto|upper address="smarty@example.com"}
|
||||
|
||||
{* using php's str_repeat *}
|
||||
{"="|str_repeat:80}
|
||||
|
||||
{* php's count *}
|
||||
{$myArray|@count}
|
||||
|
||||
{* this will uppercase and truncate the whole array *}
|
||||
<select name="name_id">
|
||||
{html_options output=$my_array|upper|truncate:20}
|
||||
</select>
|
||||
|
||||
|
||||
|
||||
- Modifiers can be applied to any type of variables, including arrays
|
||||
and objects.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> The default behavior was changed with Smarty 3. In Smarty 2.x, you
|
||||
> had to use an \"`@`\" symbol to apply a modifier to an array, such
|
||||
> as `{$articleTitle|@count}`. With Smarty 3, the \"`@`\" is no
|
||||
> longer necessary, and is ignored.
|
||||
>
|
||||
> If you want a modifier to apply to each individual item of an
|
||||
> array, you will either need to loop the array in the template, or
|
||||
> provide for this functionality inside your modifier function.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Second, in Smarty 2.x, modifiers were applied to the result of
|
||||
> math expressions like `{8+2}`, meaning that
|
||||
> `{8+2|count_characters}` would give `2`, as 8+2=10 and 10 is two
|
||||
> characters long. With Smarty 3, modifiers are applied to the
|
||||
> variables or atomic expressions before executing the calculations,
|
||||
> so since 2 is one character long, `{8+2|count_characters}`
|
||||
> gives 9. To get the old result use parentheses like
|
||||
> `{(8+2)|count_characters}`.
|
||||
|
||||
- Modifiers are autoloaded from the
|
||||
[`$plugins_dir`](../programmers/api-variables/variable-plugins-dir.md) or can be registered
|
||||
explicitly with the [`registerPlugin()`](../programmers/api-functions/api-register-plugin.md)
|
||||
function. The later is useful for sharing a function between php
|
||||
scripts and smarty templates.
|
||||
|
||||
- All php-functions can be used as modifiers implicitly, as
|
||||
demonstrated in the example above. However, using php-functions as
|
||||
modifiers has two little pitfalls:
|
||||
|
||||
- First - sometimes the order of the function-parameters is not
|
||||
the desirable one. Formatting `$foo` with
|
||||
`{"%2.f"|sprintf:$foo}` actually works, but asks for the more
|
||||
intuitive, like `{$foo|string_format:"%2.f"}` that is provided
|
||||
by the Smarty distribution.
|
||||
|
||||
- Secondly - if security is enabled, all php-functions that are to
|
||||
be used as modifiers have to be declared trusted in the
|
||||
`$modifiers` property of the securty policy. See the
|
||||
[Security](../programmers/advanced-features/advanced-features-security.md) section for details.
|
||||
|
||||
See also [`registerPlugin()`](../programmers/api-functions/api-register-plugin.md), [combining
|
||||
modifiers](./language-combining-modifiers.md). and [extending smarty with
|
||||
plugins](../programmers/plugins.md)
|
||||
@@ -1,41 +0,0 @@
|
||||
capitalize {#language.modifier.capitalize}
|
||||
==========
|
||||
|
||||
This is used to capitalize the first letter of all words in a variable.
|
||||
This is similar to the PHP [`ucwords()`](&url.php-manual;ucwords)
|
||||
function.
|
||||
|
||||
Parameter Position Type Required Default Description
|
||||
-------------------- --------- ---------- --------- -----------------------------------------------------------------------------------------------------------
|
||||
1 boolean No FALSE This determines whether or not words with digits will be uppercased
|
||||
2 boolean No FALSE This determines whether or not Capital letters within words should be lowercased, e.g. \"aAa\" to \"Aaa\"
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
$smarty->assign('articleTitle', 'next x-men film, x3, delayed.');
|
||||
|
||||
?>
|
||||
|
||||
|
||||
|
||||
Where the template is:
|
||||
|
||||
|
||||
{$articleTitle}
|
||||
{$articleTitle|capitalize}
|
||||
{$articleTitle|capitalize:true}
|
||||
|
||||
|
||||
|
||||
Will output:
|
||||
|
||||
|
||||
next x-men film, x3, delayed.
|
||||
Next X-Men Film, x3, Delayed.
|
||||
Next X-Men Film, X3, Delayed.
|
||||
|
||||
|
||||
|
||||
See also [`lower`](#language.modifier.lower) and
|
||||
[`upper`](#language.modifier.upper)
|
||||
@@ -1,31 +0,0 @@
|
||||
cat {#language.modifier.cat}
|
||||
===
|
||||
|
||||
This value is concatenated to the given variable.
|
||||
|
||||
Parameter Position Type Required Default Description
|
||||
-------------------- -------- ---------- --------- -----------------------------------------------
|
||||
1 string No *empty* This value to catenate to the given variable.
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
$smarty->assign('articleTitle', "Psychics predict world didn't end");
|
||||
|
||||
?>
|
||||
|
||||
|
||||
|
||||
Where template is:
|
||||
|
||||
|
||||
{$articleTitle|cat:' yesterday.'}
|
||||
|
||||
|
||||
|
||||
Will output:
|
||||
|
||||
|
||||
Psychics predict world didn't end yesterday.
|
||||
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
count\_characters {#language.modifier.count.characters}
|
||||
=================
|
||||
|
||||
This is used to count the number of characters in a variable.
|
||||
|
||||
Parameter Position Type Required Default Description
|
||||
-------------------- --------- ---------- --------- -------------------------------------------------------------------------------
|
||||
1 boolean No FALSE This determines whether or not to include whitespace characters in the count.
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
$smarty->assign('articleTitle', 'Cold Wave Linked to Temperatures.');
|
||||
|
||||
?>
|
||||
|
||||
|
||||
|
||||
Where template is:
|
||||
|
||||
|
||||
{$articleTitle}
|
||||
{$articleTitle|count_characters}
|
||||
{$articleTitle|count_characters:true}
|
||||
|
||||
|
||||
|
||||
Will output:
|
||||
|
||||
|
||||
Cold Wave Linked to Temperatures.
|
||||
29
|
||||
33
|
||||
|
||||
|
||||
|
||||
See also [`count_words`](#language.modifier.count.words),
|
||||
[`count_sentences`](#language.modifier.count.sentences) and
|
||||
[`count_paragraphs`](#language.modifier.count.paragraphs).
|
||||
@@ -1,38 +0,0 @@
|
||||
count\_paragraphs {#language.modifier.count.paragraphs}
|
||||
=================
|
||||
|
||||
This is used to count the number of paragraphs in a variable.
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
$smarty->assign('articleTitle',
|
||||
"War Dims Hope for Peace. Child's Death Ruins Couple's Holiday.\n\n
|
||||
Man is Fatally Slain. Death Causes Loneliness, Feeling of Isolation."
|
||||
);
|
||||
|
||||
?>
|
||||
|
||||
|
||||
|
||||
Where template is:
|
||||
|
||||
|
||||
{$articleTitle}
|
||||
{$articleTitle|count_paragraphs}
|
||||
|
||||
|
||||
|
||||
Will output:
|
||||
|
||||
|
||||
War Dims Hope for Peace. Child's Death Ruins Couple's Holiday.
|
||||
|
||||
Man is Fatally Slain. Death Causes Loneliness, Feeling of Isolation.
|
||||
2
|
||||
|
||||
|
||||
|
||||
See also [`count_characters`](#language.modifier.count.characters),
|
||||
[`count_sentences`](#language.modifier.count.sentences) and
|
||||
[`count_words`](#language.modifier.count.words).
|
||||
@@ -1,37 +0,0 @@
|
||||
count\_sentences {#language.modifier.count.sentences}
|
||||
================
|
||||
|
||||
This is used to count the number of sentences in a variable. A sentence
|
||||
being delimited by a dot, question- or exclamation-mark (.?!).
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
$smarty->assign('articleTitle',
|
||||
'Two Soviet Ships Collide - One Dies.
|
||||
Enraged Cow Injures Farmer with Axe.'
|
||||
);
|
||||
|
||||
?>
|
||||
|
||||
|
||||
|
||||
Where template is:
|
||||
|
||||
|
||||
{$articleTitle}
|
||||
{$articleTitle|count_sentences}
|
||||
|
||||
|
||||
|
||||
Will output:
|
||||
|
||||
|
||||
Two Soviet Ships Collide - One Dies. Enraged Cow Injures Farmer with Axe.
|
||||
2
|
||||
|
||||
|
||||
|
||||
See also [`count_characters`](#language.modifier.count.characters),
|
||||
[`count_paragraphs`](#language.modifier.count.paragraphs) and
|
||||
[`count_words`](#language.modifier.count.words).
|
||||
@@ -1,33 +0,0 @@
|
||||
count\_words {#language.modifier.count.words}
|
||||
============
|
||||
|
||||
This is used to count the number of words in a variable.
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
$smarty->assign('articleTitle', 'Dealers Will Hear Car Talk at Noon.');
|
||||
|
||||
?>
|
||||
|
||||
|
||||
|
||||
Where template is:
|
||||
|
||||
|
||||
{$articleTitle}
|
||||
{$articleTitle|count_words}
|
||||
|
||||
|
||||
|
||||
This will output:
|
||||
|
||||
|
||||
Dealers Will Hear Car Talk at Noon.
|
||||
7
|
||||
|
||||
|
||||
|
||||
See also [`count_characters`](#language.modifier.count.characters),
|
||||
[`count_paragraphs`](#language.modifier.count.paragraphs) and
|
||||
[`count_sentences`](#language.modifier.count.sentences).
|
||||
@@ -1,175 +0,0 @@
|
||||
date\_format {#language.modifier.date.format}
|
||||
============
|
||||
|
||||
This formats a date and time into the given
|
||||
[`strftime()`](&url.php-manual;strftime) format. Dates can be passed to
|
||||
Smarty as unix [timestamps](&url.php-manual;function.time), [DateTime
|
||||
objects](&url.php-manual;class.DateTime), mysql timestamps or any string
|
||||
made up of month day year, parsable by php\'s
|
||||
[`strtotime()`](&url.php-manual;strtotime). Designers can then use
|
||||
`date_format` to have complete control of the formatting of the date. If
|
||||
the date passed to `date_format` is empty and a second parameter is
|
||||
passed, that will be used as the date to format.
|
||||
|
||||
Parameter Position Type Required Default Description
|
||||
-------------------- -------- ---------- ------------ -------------------------------------------------
|
||||
1 string No \%b %e, %Y This is the format for the outputted date.
|
||||
2 string No n/a This is the default date if the input is empty.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Since Smarty-2.6.10 numeric values passed to `date_format` are
|
||||
> *always* (except for mysql timestamps, see below) interpreted as a
|
||||
> unix timestamp.
|
||||
>
|
||||
> Before Smarty-2.6.10 numeric strings that where also parsable by
|
||||
> `strtotime()` in php (like `YYYYMMDD`) where sometimes (depending on
|
||||
> the underlying implementation of `strtotime()`) interpreted as date
|
||||
> strings and NOT as timestamps.
|
||||
>
|
||||
> The only exception are mysql timestamps: They are also numeric only
|
||||
> and 14 characters long (`YYYYMMDDHHMMSS`), mysql timestamps have
|
||||
> precedence over unix timestamps.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> `date_format` is essentially a wrapper to PHP\'s
|
||||
> [`strftime()`](&url.php-manual;strftime) function. You may have more
|
||||
> or less conversion specifiers available depending on your system\'s
|
||||
> [`strftime()`](&url.php-manual;strftime) function where PHP was
|
||||
> compiled. Check your system\'s manpage for a full list of valid
|
||||
> specifiers. However, a few of the specifiers are emulated on Windows.
|
||||
> These are: %D, %e, %h, %l, %n, %r, %R, %t, %T.
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
$config['date'] = '%I:%M %p';
|
||||
$config['time'] = '%H:%M:%S';
|
||||
$smarty->assign('config', $config);
|
||||
$smarty->assign('yesterday', strtotime('-1 day'));
|
||||
|
||||
?>
|
||||
|
||||
|
||||
|
||||
This template uses [`$smarty.now`](#language.variables.smarty.now) to
|
||||
get the current time:
|
||||
|
||||
|
||||
{$smarty.now|date_format}
|
||||
{$smarty.now|date_format:"%D"}
|
||||
{$smarty.now|date_format:$config.date}
|
||||
{$yesterday|date_format}
|
||||
{$yesterday|date_format:"%A, %B %e, %Y"}
|
||||
{$yesterday|date_format:$config.time}
|
||||
|
||||
|
||||
|
||||
This above will output:
|
||||
|
||||
|
||||
Jan 1, 2022
|
||||
01/01/22
|
||||
02:33 pm
|
||||
Dec 31, 2021
|
||||
Monday, December 1, 2021
|
||||
14:33:00
|
||||
|
||||
|
||||
|
||||
`date_format` conversion specifiers:
|
||||
|
||||
- \%a - abbreviated weekday name according to the current locale
|
||||
|
||||
- \%A - full weekday name according to the current locale
|
||||
|
||||
- \%b - abbreviated month name according to the current locale
|
||||
|
||||
- \%B - full month name according to the current locale
|
||||
|
||||
- \%c - preferred date and time representation for the current locale
|
||||
|
||||
- \%C - century number (the year divided by 100 and truncated to an
|
||||
integer, range 00 to 99)
|
||||
|
||||
- \%d - day of the month as a decimal number (range 01 to 31)
|
||||
|
||||
- \%D - same as %m/%d/%y
|
||||
|
||||
- \%e - day of the month as a decimal number, a single digit is
|
||||
preceded by a space (range 1 to 31)
|
||||
|
||||
- \%g - Week-based year within century \[00,99\]
|
||||
|
||||
- \%G - Week-based year, including the century \[0000,9999\]
|
||||
|
||||
- \%h - same as %b
|
||||
|
||||
- \%H - hour as a decimal number using a 24-hour clock (range 00
|
||||
to 23)
|
||||
|
||||
- \%I - hour as a decimal number using a 12-hour clock (range 01
|
||||
to 12)
|
||||
|
||||
- \%j - day of the year as a decimal number (range 001 to 366)
|
||||
|
||||
- \%k - Hour (24-hour clock) single digits are preceded by a blank.
|
||||
(range 0 to 23)
|
||||
|
||||
- \%l - hour as a decimal number using a 12-hour clock, single digits
|
||||
preceded by a space (range 1 to 12)
|
||||
|
||||
- \%m - month as a decimal number (range 01 to 12)
|
||||
|
||||
- \%M - minute as a decimal number
|
||||
|
||||
- \%n - newline character
|
||||
|
||||
- \%p - either \`am\' or \`pm\' according to the given time value, or
|
||||
the corresponding strings for the current locale
|
||||
|
||||
- \%r - time in a.m. and p.m. notation
|
||||
|
||||
- \%R - time in 24 hour notation
|
||||
|
||||
- \%S - second as a decimal number
|
||||
|
||||
- \%t - tab character
|
||||
|
||||
- \%T - current time, equal to %H:%M:%S
|
||||
|
||||
- \%u - weekday as a decimal number \[1,7\], with 1 representing
|
||||
Monday
|
||||
|
||||
- \%U - week number of the current year as a decimal number, starting
|
||||
with the first Sunday as the first day of the first week
|
||||
|
||||
- \%V - The ISO 8601:1988 week number of the current year as a decimal
|
||||
number, range 01 to 53, where week 1 is the first week that has at
|
||||
least 4 days in the current year, and with Monday as the first day
|
||||
of the week.
|
||||
|
||||
- \%w - day of the week as a decimal, Sunday being 0
|
||||
|
||||
- \%W - week number of the current year as a decimal number, starting
|
||||
with the first Monday as the first day of the first week
|
||||
|
||||
- \%x - preferred date representation for the current locale without
|
||||
the time
|
||||
|
||||
- \%X - preferred time representation for the current locale without
|
||||
the date
|
||||
|
||||
- \%y - year as a decimal number without a century (range 00 to 99)
|
||||
|
||||
- \%Y - year as a decimal number including the century
|
||||
|
||||
- \%Z - time zone or name or abbreviation
|
||||
|
||||
- \%% - a literal \`%\' character
|
||||
|
||||
See also [`$smarty.now`](#language.variables.smarty.now),
|
||||
[`strftime()`](&url.php-manual;strftime),
|
||||
[`{html_select_date}`](#language.function.html.select.date) and the
|
||||
[date tips](#tips.dates) page.
|
||||
@@ -1,41 +0,0 @@
|
||||
default {#language.modifier.default}
|
||||
=======
|
||||
|
||||
This is used to set a default value for a variable. If the variable is
|
||||
unset or an empty string, the given default value is printed instead.
|
||||
Default takes the one argument.
|
||||
|
||||
Parameter Position Type Required Default Description
|
||||
-------------------- -------- ---------- --------- ---------------------------------------------------------------
|
||||
1 string No *empty* This is the default value to output if the variable is empty.
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
$smarty->assign('articleTitle', 'Dealers Will Hear Car Talk at Noon.');
|
||||
$smarty->assign('email', '');
|
||||
|
||||
?>
|
||||
|
||||
|
||||
|
||||
Where template is:
|
||||
|
||||
|
||||
{$articleTitle|default:'no title'}
|
||||
{$myTitle|default:'no title'}
|
||||
{$email|default:'No email address available'}
|
||||
|
||||
|
||||
|
||||
Will output:
|
||||
|
||||
|
||||
Dealers Will Hear Car Talk at Noon.
|
||||
no title
|
||||
No email address available
|
||||
|
||||
|
||||
|
||||
See also the [default variable handling](#tips.default.var.handling) and
|
||||
the [blank variable handling](#tips.blank.var.handling) pages.
|
||||
@@ -1,74 +0,0 @@
|
||||
escape {#language.modifier.escape}
|
||||
======
|
||||
|
||||
`escape` is used to encode or escape a variable to `html`, `url`,
|
||||
`single quotes`, `hex`, `hexentity`, `javascript` and `mail`. By default
|
||||
its `html`.
|
||||
|
||||
Parameter Position Type Required Possible Values Default Description
|
||||
-------------------- --------- ---------- ------------------------------------------------------------------------------------------------------------ --------- -------------------------------------------------------------------------------------
|
||||
1 string No `html`, `htmlall`, `url`, `urlpathinfo`, `quotes`, `hex`, `hexentity`, `javascript`, `mail` `html` This is the escape format to use.
|
||||
2 string No `ISO-8859-1`, `UTF-8`, and any character set supported by [`htmlentities()`](&url.php-manual;htmlentities) `UTF-8` The character set encoding passed to htmlentities() et. al.
|
||||
3 boolean No FALSE TRUE Double encode entites from & to &amp; (applys to `html` and `htmlall` only)
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
$smarty->assign('articleTitle',
|
||||
"'Stiff Opposition Expected to Casketless Funeral Plan'"
|
||||
);
|
||||
$smarty->assign('EmailAddress','smarty@example.com');
|
||||
|
||||
?>
|
||||
|
||||
|
||||
|
||||
These are example `escape` template lines followed by the output
|
||||
|
||||
|
||||
{$articleTitle}
|
||||
'Stiff Opposition Expected to Casketless Funeral Plan'
|
||||
|
||||
{$articleTitle|escape}
|
||||
'Stiff Opposition Expected to Casketless Funeral Plan'
|
||||
|
||||
{$articleTitle|escape:'html'} {* escapes & " ' < > *}
|
||||
'Stiff Opposition Expected to Casketless Funeral Plan'
|
||||
|
||||
{$articleTitle|escape:'htmlall'} {* escapes ALL html entities *}
|
||||
'Stiff Opposition Expected to Casketless Funeral Plan'
|
||||
|
||||
<a href="?title={$articleTitle|escape:'url'}">click here</a>
|
||||
<a
|
||||
href="?title=%27Stiff%20Opposition%20Expected%20to%20Casketless%20Funeral%20Plan%27">click here</a>
|
||||
|
||||
{$articleTitle|escape:'quotes'}
|
||||
\'Stiff Opposition Expected to Casketless Funeral Plan\'
|
||||
|
||||
<a href="mailto:{$EmailAddress|escape:"hex"}">{$EmailAddress|escape:"hexentity"}</a>
|
||||
{$EmailAddress|escape:'mail'} {* this converts to email to text *}
|
||||
<a href="mailto:%62%6f%..snip..%65%74">bob..snip..et</a>
|
||||
|
||||
{'mail@example.com'|escape:'mail'}
|
||||
smarty [AT] example [DOT] com
|
||||
|
||||
|
||||
|
||||
|
||||
{* the "rewind" parameter registers the current location *}
|
||||
<a href="$my_path?page=foo&rewind=$my_uri|urlencode}">click here</a>
|
||||
|
||||
|
||||
|
||||
This snippet is useful for emails, but see also
|
||||
[`{mailto}`](#language.function.mailto)
|
||||
|
||||
|
||||
{* email address mangled *}
|
||||
<a href="mailto:{$EmailAddress|escape:'hex'}">{$EmailAddress|escape:'mail'}</a>
|
||||
|
||||
|
||||
|
||||
See also [escaping smarty parsing](#language.escaping),
|
||||
[`{mailto}`](#language.function.mailto) and the [obfuscating email
|
||||
addresses](#tips.obfuscating.email) page.
|
||||
@@ -1,19 +0,0 @@
|
||||
from\_charset {#language.modifier.from_charset}
|
||||
=============
|
||||
|
||||
`from_charset` is used to transcode a string from a given charset to the
|
||||
internal charset. This is the exact opposite of the [to\_charset
|
||||
modifier](#language.modifier.to_charset).
|
||||
|
||||
Parameter Position Type Required Possible Values Default Description
|
||||
-------------------- -------- ---------- -------------------------------------------------------------------------------------------------------------------------- -------------- ---------------------------------------------------------------
|
||||
1 string No `ISO-8859-1`, `UTF-8`, and any character set supported by [`mb_convert_encoding()`](&url.php-manual;mb_convert_encoding) `ISO-8859-1` The charset encoding the value is supposed to be decoded from
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Charset encoding should be handled by the application itself. This
|
||||
> modifier should only be used in cases where the application cannot
|
||||
> anticipate that a certain string is required in another encoding.
|
||||
|
||||
See also [Charset Enconding](#charset), [from\_charset
|
||||
modifier](#language.modifier.from_charset).
|
||||
@@ -1,62 +0,0 @@
|
||||
indent {#language.modifier.indent}
|
||||
======
|
||||
|
||||
This indents a string on each line, default is 4. As an optional
|
||||
parameter, you can specify the number of characters to indent. As an
|
||||
optional second parameter, you can specify the character to use to
|
||||
indent with eg use `"\t"` for a tab.
|
||||
|
||||
Parameter Position Type Required Default Description
|
||||
-------------------- --------- ---------- ------------- ---------------------------------------------------
|
||||
1 integer No 4 This determines how many characters to indent to.
|
||||
2 string No (one space) This is the character used to indent with.
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
$smarty->assign('articleTitle',
|
||||
'NJ judge to rule on nude beach.
|
||||
Sun or rain expected today, dark tonight.
|
||||
Statistics show that teen pregnancy drops off significantly after 25.'
|
||||
);
|
||||
?>
|
||||
|
||||
|
||||
|
||||
Where template is:
|
||||
|
||||
|
||||
{$articleTitle}
|
||||
|
||||
{$articleTitle|indent}
|
||||
|
||||
{$articleTitle|indent:10}
|
||||
|
||||
{$articleTitle|indent:1:"\t"}
|
||||
|
||||
|
||||
|
||||
Will output:
|
||||
|
||||
|
||||
NJ judge to rule on nude beach.
|
||||
Sun or rain expected today, dark tonight.
|
||||
Statistics show that teen pregnancy drops off significantly after 25.
|
||||
|
||||
NJ judge to rule on nude beach.
|
||||
Sun or rain expected today, dark tonight.
|
||||
Statistics show that teen pregnancy drops off significantly after 25.
|
||||
|
||||
NJ judge to rule on nude beach.
|
||||
Sun or rain expected today, dark tonight.
|
||||
Statistics show that teen pregnancy drops off significantly after 25.
|
||||
|
||||
NJ judge to rule on nude beach.
|
||||
Sun or rain expected today, dark tonight.
|
||||
Statistics show that teen pregnancy drops off significantly after 25.
|
||||
|
||||
|
||||
|
||||
See also [`strip`](#language.modifier.strip),
|
||||
[`wordwrap`](#language.modifier.wordwrap) and
|
||||
[`spacify`](#language.modifier.spacify).
|
||||
@@ -1,33 +0,0 @@
|
||||
lower {#language.modifier.lower}
|
||||
=====
|
||||
|
||||
This is used to lowercase a variable. This is equivalent to the PHP
|
||||
[`strtolower()`](&url.php-manual;strtolower) function.
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
$smarty->assign('articleTitle', 'Two Convicts Evade Noose, Jury Hung.');
|
||||
|
||||
?>
|
||||
|
||||
|
||||
|
||||
Where template is:
|
||||
|
||||
|
||||
{$articleTitle}
|
||||
{$articleTitle|lower}
|
||||
|
||||
|
||||
|
||||
This will output:
|
||||
|
||||
|
||||
Two Convicts Evade Noose, Jury Hung.
|
||||
two convicts evade noose, jury hung.
|
||||
|
||||
|
||||
|
||||
See also [`upper`](#language.modifier.upper) and
|
||||
[`capitalize`](#language.modifier.capitalize).
|
||||
@@ -1,35 +0,0 @@
|
||||
nl2br {#language.modifier.nl2br}
|
||||
=====
|
||||
|
||||
All `"\n"` line breaks will be converted to html `<br />` tags in the
|
||||
given variable. This is equivalent to the PHP\'s
|
||||
[`nl2br()`](&url.php-manual;nl2br) function.
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
$smarty->assign('articleTitle',
|
||||
"Sun or rain expected\ntoday, dark tonight"
|
||||
);
|
||||
|
||||
?>
|
||||
|
||||
|
||||
|
||||
Where the template is:
|
||||
|
||||
|
||||
{$articleTitle|nl2br}
|
||||
|
||||
|
||||
|
||||
Will output:
|
||||
|
||||
|
||||
Sun or rain expected<br />today, dark tonight
|
||||
|
||||
|
||||
|
||||
See also [`word_wrap`](#language.modifier.wordwrap),
|
||||
[`count_paragraphs`](#language.modifier.count.paragraphs) and
|
||||
[`count_sentences`](#language.modifier.count.sentences).
|
||||
@@ -1,51 +0,0 @@
|
||||
regex\_replace {#language.modifier.regex.replace}
|
||||
==============
|
||||
|
||||
A regular expression search and replace on a variable. Use the
|
||||
[`preg_replace()`](&url.php-manual;preg_replace) syntax from the PHP
|
||||
manual.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Although Smarty supplies this regex convenience modifier, it is
|
||||
> usually better to apply regular expressions in PHP, either via custom
|
||||
> functions or modifiers. Regular expressions are considered application
|
||||
> code and are not part of presentation logic.
|
||||
|
||||
Parameters
|
||||
|
||||
Parameter Position Type Required Default Description
|
||||
-------------------- -------- ---------- --------- ------------------------------------------------
|
||||
1 string Yes *n/a* This is the regular expression to be replaced.
|
||||
2 string Yes *n/a* This is the string of text to replace with.
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
$smarty->assign('articleTitle', "Infertility unlikely to\nbe passed on, experts say.");
|
||||
|
||||
?>
|
||||
|
||||
|
||||
|
||||
Where template is:
|
||||
|
||||
|
||||
{* replace each carriage return, tab and new line with a space *}
|
||||
|
||||
{$articleTitle}
|
||||
{$articleTitle|regex_replace:"/[\r\t\n]/":" "}
|
||||
|
||||
|
||||
|
||||
Will output:
|
||||
|
||||
|
||||
Infertility unlikely to
|
||||
be passed on, experts say.
|
||||
Infertility unlikely to be passed on, experts say.
|
||||
|
||||
|
||||
|
||||
See also [`replace`](#language.modifier.replace) and
|
||||
[`escape`](#language.modifier.escape).
|
||||
@@ -1,40 +0,0 @@
|
||||
replace {#language.modifier.replace}
|
||||
=======
|
||||
|
||||
A simple search and replace on a variable. This is equivalent to the
|
||||
PHP\'s [`str_replace()`](&url.php-manual;str_replace) function.
|
||||
|
||||
Parameter Position Type Required Default Description
|
||||
-------------------- -------- ---------- --------- ---------------------------------------------
|
||||
1 string Yes *n/a* This is the string of text to be replaced.
|
||||
2 string Yes *n/a* This is the string of text to replace with.
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
$smarty->assign('articleTitle', "Child's Stool Great for Use in Garden.");
|
||||
|
||||
?>
|
||||
|
||||
|
||||
|
||||
Where template is:
|
||||
|
||||
|
||||
{$articleTitle}
|
||||
{$articleTitle|replace:'Garden':'Vineyard'}
|
||||
{$articleTitle|replace:' ':' '}
|
||||
|
||||
|
||||
|
||||
Will output:
|
||||
|
||||
|
||||
Child's Stool Great for Use in Garden.
|
||||
Child's Stool Great for Use in Vineyard.
|
||||
Child's Stool Great for Use in Garden.
|
||||
|
||||
|
||||
|
||||
See also [`regex_replace`](#language.modifier.regex.replace) and
|
||||
[`escape`](#language.modifier.escape).
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user