@ -0,0 +1 @@ |
|||||||
|
includes/config.php |
@ -0,0 +1,36 @@ |
|||||||
|
CREDITS |
||||||
|
|
||||||
|
Building this software would have been impossible without building on the work of others. I would like to thank the following |
||||||
|
people and projects (in no particular order) for their work: |
||||||
|
|
||||||
|
Smarty Template Engine |
||||||
|
http://www.smarty.net/ |
||||||
|
|
||||||
|
Bootstrap |
||||||
|
http://twitter.github.com/bootstrap/ |
||||||
|
|
||||||
|
Bootswatch |
||||||
|
http://bootswatch.com/ |
||||||
|
|
||||||
|
jQuery Validation plugin |
||||||
|
Jorn Zaefferer |
||||||
|
http://bassistance.de/jquery-plugins/jquery-plugin-validation/ |
||||||
|
|
||||||
|
Batch. |
||||||
|
Adam Whitcroft |
||||||
|
http://adamwhitcroft.com/batch/ |
||||||
|
|
||||||
|
jQuery Validate Bootstrap integration |
||||||
|
David Cochran |
||||||
|
http://alittlecode.com/files/jQuery-Validate-Demo/ |
||||||
|
|
||||||
|
Datepicker for Boostrap |
||||||
|
http://www.eyecon.ro/bootstrap-datepicker/ |
||||||
|
|
||||||
|
jQuery lightBox plugin |
||||||
|
Leandro Vieira Pinho |
||||||
|
http://leandrovieira.com/projects/jquery/lightbox/ |
||||||
|
|
||||||
|
Lightbox2 |
||||||
|
Lokesh Dhakar |
||||||
|
http://lokeshdhakar.com/projects/lightbox2/ |
@ -0,0 +1,146 @@ |
|||||||
|
Installation Instructions |
||||||
|
|
||||||
|
NOTE: these instructions are specific to operating with MySQL. |
||||||
|
If you're going to use a different database, substitute your database |
||||||
|
server's setup procedure where necessary. |
||||||
|
|
||||||
|
1. Unpack phpgiftreg website |
||||||
|
2. Create MySQL database |
||||||
|
3. Create MySQL tables |
||||||
|
4. Create MySQL user (optional) |
||||||
|
5. Configure db.php |
||||||
|
6. Configure config.php (optional) |
||||||
|
7. Create Apache alias |
||||||
|
8. Set up the initial family and user using setup.php |
||||||
|
|
||||||
|
============================================================================= |
||||||
|
|
||||||
|
1. Unpack phpgiftreg website |
||||||
|
|
||||||
|
Change to the directory where you're going to run the website from and |
||||||
|
extract the pages. The tarball contains the phpgiftreg/ directory itself. |
||||||
|
|
||||||
|
user@host $ tar -xvzf phpgiftreg-x.x.x.tar.gz |
||||||
|
<output> |
||||||
|
|
||||||
|
Then give everything the proper permissions (thanks to Paul Hubbard for |
||||||
|
pointing this out). An example would be owner-writable, world-readable: |
||||||
|
|
||||||
|
user@host $ cd phpgiftreg-x.x.x |
||||||
|
user@host $ chmod 644 *.php *.css images/* |
||||||
|
|
||||||
|
As of 1.6.0, there is a subdirectory called item_images/ that must be |
||||||
|
writeable by the webserver. The phpgiftreg scripts will be writing files |
||||||
|
to this directory. Don't worry, the setup.php script described below |
||||||
|
will test if you got this right. |
||||||
|
|
||||||
|
As of 2.0.0, there are subdirectories called cache/ and templates_c/ |
||||||
|
that must also be writeable by the webserver. setup.php will also test |
||||||
|
if those have the correct permissions. |
||||||
|
|
||||||
|
============================================================================= |
||||||
|
|
||||||
|
2. Create MySQL database |
||||||
|
|
||||||
|
Login to the MySQL server with a user capable of creating databases. If |
||||||
|
you're running a trusted system, simply executing `mysql' should be adequate. |
||||||
|
Otherwise, do something like this: |
||||||
|
|
||||||
|
user@host $ mysql -u username -h host -p |
||||||
|
Enter password: <enter password here> |
||||||
|
Welcome to the MySQL monitor. Commands end with ; or \g. |
||||||
|
Your MySQL connection id is 626 to server version: 3.23.58-log |
||||||
|
|
||||||
|
Type 'help;' or '\h' for help. Type '\c' to clear the buffer. |
||||||
|
|
||||||
|
mysql> |
||||||
|
|
||||||
|
Once inside, create the phpgiftreg database: |
||||||
|
|
||||||
|
mysql> create database phpgiftreg; |
||||||
|
Database phpgiftreg created. |
||||||
|
|
||||||
|
============================================================================= |
||||||
|
|
||||||
|
3. Create MySQL tables |
||||||
|
|
||||||
|
You can examine the area where the `ranks' table is populated and |
||||||
|
modify that. There's a column for the rank's description and how it |
||||||
|
should look when rendered in HTML. By default, it shows between 1 and 5 |
||||||
|
stars, which should be suitable for most installations. |
||||||
|
|
||||||
|
Change to the phpgiftreg database like this: |
||||||
|
|
||||||
|
mysql> use phpgiftreg; |
||||||
|
Reading table information for completion of table and column names |
||||||
|
You can turn off this feature to get a quicker startup with -A |
||||||
|
|
||||||
|
Database changed |
||||||
|
|
||||||
|
Run the create-phpgiftregdb.sql script like this: |
||||||
|
|
||||||
|
mysql> source /path/to/create-phpgiftregdb.sql |
||||||
|
<lots of activity> |
||||||
|
|
||||||
|
mysql> |
||||||
|
|
||||||
|
============================================================================= |
||||||
|
|
||||||
|
4. Create MySQL user (optional) |
||||||
|
|
||||||
|
You should have a separate user for the database. If you choose to, create |
||||||
|
the new user like so: |
||||||
|
|
||||||
|
mysql> GRANT ALL ON phpgiftreg.* TO username@host IDENTIFIED BY 'password'; |
||||||
|
mysql> FLUSH PRIVILEGES; |
||||||
|
|
||||||
|
This creates a user called `username' that can connect from `host'. |
||||||
|
|
||||||
|
============================================================================= |
||||||
|
|
||||||
|
5. Configure includes/config.php |
||||||
|
|
||||||
|
You MUST edit includes/config.php to define your database connection. |
||||||
|
It is required to set the `pdo_connection_string', `pdo_username' |
||||||
|
and `pdo_password' settings. See |
||||||
|
http://www.php.net/manual/en/pdo.construct.php for more information, |
||||||
|
especially if you are going to use a database other than MySQL. |
||||||
|
|
||||||
|
NOTE: phpgiftreg is only tested on MySQL, though other databases should |
||||||
|
(in theory) work with little modification. |
||||||
|
|
||||||
|
There are some options to change in config.php if you wish. Their functions |
||||||
|
are described in that file. |
||||||
|
|
||||||
|
NOTE: older versions of phpgiftreg defined database parameters in a |
||||||
|
file called db.php. That file is no longer used, and connection information |
||||||
|
belongs in includes/config.php. |
||||||
|
|
||||||
|
============================================================================= |
||||||
|
|
||||||
|
6. Create Apache alias |
||||||
|
|
||||||
|
Edit your httpd.conf and add an Alias like so: |
||||||
|
|
||||||
|
Alias /phpgiftreg/ "/path/to/phpgiftreg/" |
||||||
|
|
||||||
|
The trailing slashes are important. Restart the web server and you should |
||||||
|
be good to go. |
||||||
|
|
||||||
|
============================================================================= |
||||||
|
|
||||||
|
7. Set up the initial family and user using setup.php |
||||||
|
|
||||||
|
Point your browser to http://yourserver/phpgiftreg/setup.php or wherever you |
||||||
|
installed it. It will check your confirmation, and then you'll be prompted |
||||||
|
to enter some details for an initial administrator user and the default |
||||||
|
family. If everything goes well, you'll be ready to begin! |
||||||
|
|
||||||
|
============================================================================= |
||||||
|
|
||||||
|
If you have any problems with these instructions, or if they weren't clear |
||||||
|
or just didn't plain work, please let me know at generalpf@gmail.com. |
||||||
|
|
||||||
|
Ryan Walberg |
||||||
|
generalpf@gmail.com |
||||||
|
@GeneralPF |
@ -0,0 +1,37 @@ |
|||||||
|
PHP Gift Registry (phpgiftreg) |
||||||
|
|
||||||
|
The PHP Gift Registry is a web-enabled gift registry intended for use among |
||||||
|
a circle of family members or friends. |
||||||
|
|
||||||
|
It is intended to fill the following purposes: |
||||||
|
x Permit the long-term storage of a list of items one desires, along with |
||||||
|
its price, where it can be bought, and (optionally) a URL where it can be |
||||||
|
viewed. |
||||||
|
x Enabled items to be "locked" by one shopper so that the same item is not |
||||||
|
bought by someone else. |
||||||
|
|
||||||
|
Its features include: |
||||||
|
x A single unifying view of items on your own list and people whose lists you |
||||||
|
can view. |
||||||
|
x A now-optional request/permit system by which you can control who can see |
||||||
|
your list. |
||||||
|
x A "checkin/checkout" system which allows you to reserve items on someone's |
||||||
|
list. |
||||||
|
x An in-system messaging system by which users can be informed of item |
||||||
|
deletions or custom announcements. |
||||||
|
x New users can request accounts. Optionally, administrators will be |
||||||
|
informed about the request, and they can then approve or reject the |
||||||
|
request. Either way, the user will be informed by e-mail. |
||||||
|
x A site-customizable ranking system for items. |
||||||
|
x An events system for users to add significant (read: gift-bearing) events |
||||||
|
which will show up on others' displays when the event nears. |
||||||
|
|
||||||
|
Read INSTALL for installation instructions. |
||||||
|
|
||||||
|
If you have any questions, comments, feature requests, or patches, feel |
||||||
|
free to e-mail me. |
||||||
|
|
||||||
|
phpgiftreg is licensed by the GPL. For more information on the GPL, visit |
||||||
|
http://www.gnu.org |
||||||
|
|
||||||
|
Copyright 2012 Ryan Walberg <generalpf@gmail.com> @GeneralPF |
@ -0,0 +1,85 @@ |
|||||||
|
<?php |
||||||
|
// This program is free software; you can redistribute it and/or modify |
||||||
|
// it under the terms of the GNU General Public License as published by |
||||||
|
// the Free Software Foundation; either version 2 of the License, or |
||||||
|
// (at your option) any later version. |
||||||
|
|
||||||
|
// This program 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 General Public License for more details. |
||||||
|
|
||||||
|
// You should have received a copy of the GNU General Public License |
||||||
|
// along with this program; if not, write to the Free Software |
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
|
||||||
|
require_once(dirname(__FILE__) . "/includes/funcLib.php"); |
||||||
|
require_once(dirname(__FILE__) . "/includes/MySmarty.class.php"); |
||||||
|
$smarty = new MySmarty(); |
||||||
|
$opt = $smarty->opt(); |
||||||
|
|
||||||
|
session_start(); |
||||||
|
if (!isset($_SESSION["userid"])) { |
||||||
|
header("Location: " . getFullPath("login.php")); |
||||||
|
exit; |
||||||
|
} |
||||||
|
else if ($_SESSION["admin"] != 1) { |
||||||
|
echo "You don't have admin privileges."; |
||||||
|
exit; |
||||||
|
} |
||||||
|
else { |
||||||
|
$userid = $_SESSION["userid"]; |
||||||
|
} |
||||||
|
|
||||||
|
$action = $_GET["action"]; |
||||||
|
if ($action == "approve") { |
||||||
|
$pwd = generatePassword($opt); |
||||||
|
if ($_GET["familyid"] != "") { |
||||||
|
$stmt = $smarty->dbh()->prepare("INSERT INTO {$opt["table_prefix"]}memberships(userid,familyid) VALUES(?, ?)"); |
||||||
|
$stmt->bindValue(1, (int) $_GET["userid"], PDO::PARAM_INT); |
||||||
|
$stmt->bindValue(2, (int) $_GET["familyid"], PDO::PARAM_INT); |
||||||
|
$stmt->execute(); |
||||||
|
} |
||||||
|
$stmt = $smarty->dbh()->prepare("UPDATE {$opt["table_prefix"]}users SET approved = 1, password = {$opt["password_hasher"]}(?) WHERE userid = ?"); |
||||||
|
$stmt->bindParam(1, $pwd, PDO::PARAM_INT); |
||||||
|
$stmt->bindValue(2, (int) $_GET["userid"], PDO::PARAM_INT); |
||||||
|
$stmt->execute(); |
||||||
|
|
||||||
|
// send the e-mails |
||||||
|
$stmt = $smarty->dbh()->prepare("SELECT username, email FROM {$opt["table_prefix"]}users WHERE userid = ?"); |
||||||
|
$stmt->bindValue(1, (int) $_GET["userid"], PDO::PARAM_INT); |
||||||
|
$stmt->execute(); |
||||||
|
if ($row = $stmt->fetch()) { |
||||||
|
mail( |
||||||
|
$row["email"], |
||||||
|
"Gift Registry application approved", |
||||||
|
"Your Gift Registry application was approved by " . $_SESSION["fullname"] . ".\r\n" . |
||||||
|
"Your username is " . $row["username"] . " and your password is $pwd.", |
||||||
|
"From: {$opt["email_from"]}\r\nReply-To: {$opt["email_reply_to"]}\r\nX-Mailer: {$opt["email_xmailer"]}\r\n" |
||||||
|
) or die("Mail not accepted for " . $row["email"]); |
||||||
|
} |
||||||
|
header("Location: " . getFullPath("index.php")); |
||||||
|
exit; |
||||||
|
} |
||||||
|
else if ($action == "reject") { |
||||||
|
// send the e-mails |
||||||
|
$stmt = $smarty->dbh()->prepare("SELECT email FROM {$opt["table_prefix"]}users WHERE userid = ?"); |
||||||
|
$stmt->bindValue(1, (int) $_GET["userid"], PDO::PARAM_INT); |
||||||
|
$stmt->execute(); |
||||||
|
if ($row = $stmt->fetch()) { |
||||||
|
mail( |
||||||
|
$row["email"], |
||||||
|
"Gift Registry application denied", |
||||||
|
"Your Gift Registry application was denied by " . $_SESSION["fullname"] . ".", |
||||||
|
"From: {$opt["email_from"]}\r\nReply-To: {$opt["email_reply_to"]}\r\nX-Mailer: {$opt["email_xmailer"]}\r\n" |
||||||
|
) or die("Mail not accepted for " . $row["email"]); |
||||||
|
} |
||||||
|
|
||||||
|
$stmt = $smarty->dbh()->prepare("DELETE FROM {$opt["table_prefix"]}users WHERE userid = ?"); |
||||||
|
$stmt->bindValue(1, (int) $_GET["userid"], PDO::PARAM_INT); |
||||||
|
$stmt->execute(); |
||||||
|
|
||||||
|
header("Location: " . getFullPath("index.php")); |
||||||
|
exit; |
||||||
|
} |
||||||
|
?> |
@ -0,0 +1,605 @@ |
|||||||
|
// Flatness by Jenil (www.jgog.in) |
||||||
|
// Bootswatch 2.3.2 |
||||||
|
// ----------------------------------------------------- |
||||||
|
|
||||||
|
|
||||||
|
// TYPOGRAPHY |
||||||
|
// -------------------------------------------------- |
||||||
|
|
||||||
|
@import url("http://fonts.googleapis.com/css?family=Lato:400,700,900,400italic"); |
||||||
|
|
||||||
|
h1 { |
||||||
|
font-size: 48px; |
||||||
|
font-weight: 900; |
||||||
|
} |
||||||
|
|
||||||
|
h2 { |
||||||
|
font-size: 36px; |
||||||
|
font-weight: 700; |
||||||
|
} |
||||||
|
|
||||||
|
h3 { |
||||||
|
font-size: 28px; |
||||||
|
font-weight: 700; |
||||||
|
} |
||||||
|
|
||||||
|
h4 { |
||||||
|
font-size: 24px; |
||||||
|
font-weight: 500; |
||||||
|
} |
||||||
|
|
||||||
|
h5 { |
||||||
|
font-size: 16px; |
||||||
|
font-weight: 500; |
||||||
|
} |
||||||
|
|
||||||
|
h6 { |
||||||
|
font-size: 13px; |
||||||
|
font-weight: 500; |
||||||
|
text-transform: none; |
||||||
|
} |
||||||
|
|
||||||
|
p { |
||||||
|
margin-bottom: 1em; |
||||||
|
} |
||||||
|
|
||||||
|
// SCAFFOLDING |
||||||
|
// -------------------------------------------------- |
||||||
|
|
||||||
|
.page-header { |
||||||
|
border-bottom: none; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
// NAVBAR |
||||||
|
// -------------------------------------------------- |
||||||
|
|
||||||
|
.navbar { |
||||||
|
|
||||||
|
.brand { |
||||||
|
|
||||||
|
text-shadow: none; |
||||||
|
|
||||||
|
&:hover { |
||||||
|
color: @linkColorHover; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.navbar-inner { |
||||||
|
.box-shadow(none); |
||||||
|
} |
||||||
|
|
||||||
|
.nav > li > a { |
||||||
|
text-shadow: none; |
||||||
|
} |
||||||
|
|
||||||
|
.nav > .active > a, |
||||||
|
.nav > .active > a:hover, |
||||||
|
.nav > .active > a:focus { |
||||||
|
.box-shadow(none); |
||||||
|
} |
||||||
|
|
||||||
|
.navbar-search .search-query { |
||||||
|
border: none; |
||||||
|
.box-shadow(none); |
||||||
|
line-height: normal; |
||||||
|
} |
||||||
|
|
||||||
|
.btn-navbar { |
||||||
|
background-image: none; |
||||||
|
.box-shadow(none); |
||||||
|
} |
||||||
|
|
||||||
|
.btn, .btn-group { |
||||||
|
margin-top: 6px; |
||||||
|
} |
||||||
|
|
||||||
|
&-inverse { |
||||||
|
|
||||||
|
.brand:hover { |
||||||
|
color: @blueDark; |
||||||
|
} |
||||||
|
|
||||||
|
.navbar-search .search-query { |
||||||
|
border-color: transparent; |
||||||
|
.box-shadow(none); |
||||||
|
line-height: normal; |
||||||
|
color: @textColor; |
||||||
|
|
||||||
|
&:focus { |
||||||
|
padding: 4px 14px; |
||||||
|
color: @textColor; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
div.subnav { |
||||||
|
|
||||||
|
border-color: transparent; |
||||||
|
background-image: none; |
||||||
|
background-color: @grayLighter; |
||||||
|
.box-shadow(none); |
||||||
|
|
||||||
|
&-fixed { |
||||||
|
top: @navbarHeight; |
||||||
|
} |
||||||
|
|
||||||
|
.nav > li > a { |
||||||
|
border-color: transparent; |
||||||
|
.box-shadow(none); |
||||||
|
color: @textColor; |
||||||
|
} |
||||||
|
|
||||||
|
.nav > .active > a, |
||||||
|
.nav > .active > a:hover { |
||||||
|
border-color: transparent; |
||||||
|
background-color: darken(@grayLighter, 10%); |
||||||
|
.box-shadow(none); |
||||||
|
color: @textColor; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// NAVIGATION |
||||||
|
// -------------------------------------------------- |
||||||
|
|
||||||
|
.nav-list { |
||||||
|
|
||||||
|
& > li > a, |
||||||
|
& > .active > a, |
||||||
|
.nav-header { |
||||||
|
text-shadow: none; |
||||||
|
} |
||||||
|
|
||||||
|
.divider { |
||||||
|
background: none; |
||||||
|
border-bottom: 2px solid @dropdownDividerBottom; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.nav-pills { |
||||||
|
|
||||||
|
.open .dropdown-toggle { |
||||||
|
background-color: @blueDark; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.pagination { |
||||||
|
|
||||||
|
ul { |
||||||
|
|
||||||
|
.box-shadow(none); |
||||||
|
|
||||||
|
& > li > a { |
||||||
|
background-color: @green; |
||||||
|
border-color: transparent; |
||||||
|
color: @white; |
||||||
|
|
||||||
|
&:hover { |
||||||
|
background-color: lighten(@green, 10%); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
& > .active > a, |
||||||
|
& > .active > a:hover { |
||||||
|
background-color: @paginationActiveBackground; |
||||||
|
color: @textColor; |
||||||
|
} |
||||||
|
|
||||||
|
& > .disabled > a, |
||||||
|
& > .disabled > a:hover { |
||||||
|
background-color: lighten(@green, 10%); |
||||||
|
color: @white; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.pager { |
||||||
|
|
||||||
|
li > a, |
||||||
|
li > span { |
||||||
|
background-color: @green; |
||||||
|
border: none; |
||||||
|
color: @white; |
||||||
|
|
||||||
|
&:hover { |
||||||
|
background-color: lighten(@green, 10%); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.disabled > a, |
||||||
|
.disabled > span, |
||||||
|
.disabled > a:hover, |
||||||
|
.disabled > span:hover { |
||||||
|
background-color: lighten(@green, 10%); |
||||||
|
color: @white; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.breadcrumb { |
||||||
|
|
||||||
|
& > li { |
||||||
|
text-shadow: none; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// BUTTONS |
||||||
|
// -------------------------------------------------- |
||||||
|
|
||||||
|
.btn { |
||||||
|
padding: 9px 20px; |
||||||
|
border: none; |
||||||
|
background-image: none; |
||||||
|
color: @white; |
||||||
|
text-decoration: none; |
||||||
|
text-shadow: none; |
||||||
|
.box-shadow(none); |
||||||
|
-webkit-transition: 0.25s; |
||||||
|
-moz-transition: 0.25s; |
||||||
|
transition: 0.25s; |
||||||
|
|
||||||
|
&:hover, |
||||||
|
&:focus { |
||||||
|
color: white; |
||||||
|
-webkit-transition: 0.25s; |
||||||
|
-moz-transition: 0.25s; |
||||||
|
transition: 0.25s; |
||||||
|
} |
||||||
|
|
||||||
|
&:active, |
||||||
|
&.active { |
||||||
|
.box-shadow(none); |
||||||
|
color: rgba(255, 255, 255, 0.75); |
||||||
|
} |
||||||
|
|
||||||
|
&.disabled, |
||||||
|
&[disabled] { |
||||||
|
color: white; |
||||||
|
} |
||||||
|
|
||||||
|
&-large { |
||||||
|
padding: @paddingLarge; |
||||||
|
} |
||||||
|
|
||||||
|
&-small { |
||||||
|
padding: @paddingSmall; |
||||||
|
} |
||||||
|
|
||||||
|
&-mini { |
||||||
|
padding: @paddingMini; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// TABLES |
||||||
|
// ----------------------------------------------------- |
||||||
|
|
||||||
|
.table tbody tr { |
||||||
|
&.success > td, |
||||||
|
&.error > td, |
||||||
|
&.warning > td, |
||||||
|
&.info > td { |
||||||
|
color: @white; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// FORMS |
||||||
|
// -------------------------------------------------- |
||||||
|
|
||||||
|
textarea, |
||||||
|
input[type="text"], |
||||||
|
input[type="password"], |
||||||
|
input[type="datetime"], |
||||||
|
input[type="datetime-local"], |
||||||
|
input[type="date"], |
||||||
|
input[type="month"], |
||||||
|
input[type="time"], |
||||||
|
input[type="week"], |
||||||
|
input[type="number"], |
||||||
|
input[type="email"], |
||||||
|
input[type="url"], |
||||||
|
input[type="search"], |
||||||
|
input[type="tel"], |
||||||
|
input[type="color"], |
||||||
|
.uneditable-input { |
||||||
|
padding: 7px 6px; |
||||||
|
border: 2px solid #dce4ec; |
||||||
|
text-indent: 1px; |
||||||
|
.border-radius(@inputBorderRadius); |
||||||
|
.box-shadow(none); |
||||||
|
.placeholder(#acb6c0); |
||||||
|
|
||||||
|
&:focus { |
||||||
|
border-color: #1abc9c; |
||||||
|
.box-shadow(none); |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.input-prepend { |
||||||
|
|
||||||
|
.add-on:first-child, |
||||||
|
.btn:first-child { |
||||||
|
.border-radius(@inputBorderRadius 0 0 @inputBorderRadius); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.input-append { |
||||||
|
|
||||||
|
input, |
||||||
|
select, |
||||||
|
.uneditable-input { |
||||||
|
|
||||||
|
.border-radius(@inputBorderRadius 0 0 @inputBorderRadius); |
||||||
|
|
||||||
|
+ .btn-group .btn:last-child { |
||||||
|
.border-radius(0 @inputBorderRadius @inputBorderRadius 0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.add-on:last-child, |
||||||
|
.btn:last-child, |
||||||
|
.btn-group:last-child > .dropdown-toggle { |
||||||
|
.border-radius(0 @inputBorderRadius @inputBorderRadius 0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.input-prepend, |
||||||
|
.input-append { |
||||||
|
|
||||||
|
input, |
||||||
|
select, |
||||||
|
.uneditable-input { |
||||||
|
.border-radius(0); |
||||||
|
+ .btn-group .btn { |
||||||
|
.border-radius(0 @inputBorderRadius @inputBorderRadius 0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.add-on:first-child, |
||||||
|
.btn:first-child { |
||||||
|
.border-radius(@inputBorderRadius 0 0 @inputBorderRadius); |
||||||
|
} |
||||||
|
|
||||||
|
.add-on:last-child, |
||||||
|
.btn:last-child { |
||||||
|
.border-radius(0 @inputBorderRadius @inputBorderRadius 0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.input-append, |
||||||
|
.input-prepend { |
||||||
|
|
||||||
|
.add-on { |
||||||
|
padding: 9px 5px; |
||||||
|
text-shadow: none; |
||||||
|
border: none; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.control-group.error, |
||||||
|
.control-group.error input:focus, |
||||||
|
.control-group.error textarea:focus { |
||||||
|
border-color: #e74c3c; |
||||||
|
.box-shadow(none); |
||||||
|
} |
||||||
|
|
||||||
|
.control-group.success, |
||||||
|
.control-group.success input:focus, |
||||||
|
.control-group.success textarea:focus { |
||||||
|
border-color: #2ecc71; |
||||||
|
.box-shadow(none); |
||||||
|
} |
||||||
|
|
||||||
|
.control-group.warning, |
||||||
|
.control-group.warning input:focus, |
||||||
|
.control-group.warning textarea:focus { |
||||||
|
border-color: #f1c40f; |
||||||
|
.box-shadow(none); |
||||||
|
} |
||||||
|
|
||||||
|
.control-group.info, |
||||||
|
.control-group.info input:focus, |
||||||
|
.control-group.info textarea:focus { |
||||||
|
border-color: #3498db; |
||||||
|
.box-shadow(none); |
||||||
|
} |
||||||
|
|
||||||
|
input[disabled], |
||||||
|
input[readonly], |
||||||
|
textarea[disabled], |
||||||
|
textarea[readonly] { |
||||||
|
background-color: #eaeded; |
||||||
|
border-color: transparent; |
||||||
|
color: #cad2d3; |
||||||
|
cursor: default; |
||||||
|
} |
||||||
|
|
||||||
|
input[type="file"]{ |
||||||
|
line-height: 16px; |
||||||
|
} |
||||||
|
|
||||||
|
legend { |
||||||
|
border-bottom: none; |
||||||
|
color: @textColor; |
||||||
|
} |
||||||
|
|
||||||
|
.form-actions { |
||||||
|
border-top: none; |
||||||
|
.border-radius(@baseBorderRadius); |
||||||
|
background-color: darken(@grayLighter, 5%); |
||||||
|
} |
||||||
|
|
||||||
|
// DROPDOWNS |
||||||
|
// -------------------------------------------------- |
||||||
|
|
||||||
|
|
||||||
|
// ALERTS, LABELS, BADGES |
||||||
|
// -------------------------------------------------- |
||||||
|
|
||||||
|
.alert { |
||||||
|
background-color: @orange; |
||||||
|
color: @white; |
||||||
|
text-shadow: none; |
||||||
|
|
||||||
|
h1, h2, h3, h4, h5, h6 { |
||||||
|
color: @white; |
||||||
|
} |
||||||
|
|
||||||
|
&-error { |
||||||
|
background-color: @red; |
||||||
|
} |
||||||
|
|
||||||
|
&-success { |
||||||
|
background-color: @green; |
||||||
|
} |
||||||
|
|
||||||
|
&-info { |
||||||
|
background-color: @blue; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.label { |
||||||
|
padding: 6px 10px; |
||||||
|
text-shadow: none; |
||||||
|
} |
||||||
|
|
||||||
|
.badge { |
||||||
|
padding: 6px 10px; |
||||||
|
.border-radius(@borderRadiusLarge); |
||||||
|
text-shadow: none; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
// MISC |
||||||
|
// -------------------------------------------------- |
||||||
|
|
||||||
|
.well { |
||||||
|
border: none; |
||||||
|
.box-shadow(none); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
.progress { |
||||||
|
|
||||||
|
background: @grayLighter; |
||||||
|
border-radius: 32px; |
||||||
|
height: 12px; |
||||||
|
.box-shadow(none); |
||||||
|
|
||||||
|
.bar { |
||||||
|
background-color: @blueDark; |
||||||
|
background-image: none; |
||||||
|
.box-shadow(none); |
||||||
|
} |
||||||
|
|
||||||
|
.bar + .bar { |
||||||
|
.box-shadow(none); |
||||||
|
} |
||||||
|
|
||||||
|
&-striped .bar { |
||||||
|
#gradient > .striped(@blueDark); |
||||||
|
} |
||||||
|
|
||||||
|
&-success .bar, |
||||||
|
&-success.progress-striped .bar, |
||||||
|
.bar-success { |
||||||
|
background-color: @green; |
||||||
|
} |
||||||
|
|
||||||
|
&-warning .bar, |
||||||
|
&-warning.progress-striped .bar, |
||||||
|
.bar-warning { |
||||||
|
background-color: @yellow; |
||||||
|
} |
||||||
|
|
||||||
|
&-danger .bar, |
||||||
|
&-danger.progress-striped .bar, |
||||||
|
.bar-danger { |
||||||
|
background-color: @red; |
||||||
|
} |
||||||
|
|
||||||
|
&-info .bar, |
||||||
|
&-info.progress-striped .bar, |
||||||
|
.bar-info { |
||||||
|
background-color: @blue; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.tooltip { |
||||||
|
|
||||||
|
&.in { |
||||||
|
opacity: 1; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.popover { |
||||||
|
color: @white; |
||||||
|
|
||||||
|
&-title { |
||||||
|
border-bottom: 2px solid @dropdownDividerBottom; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.modal { |
||||||
|
|
||||||
|
&-header { |
||||||
|
background-color: @navbarBackground; |
||||||
|
border-bottom: none; |
||||||
|
color: @white; |
||||||
|
} |
||||||
|
|
||||||
|
&-footer { |
||||||
|
background-color: @grayLighter; |
||||||
|
border-top: none; |
||||||
|
.box-shadow(none); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.close { |
||||||
|
text-shadow: none; |
||||||
|
} |
||||||
|
|
||||||
|
// MEDIA QUERIES |
||||||
|
// -------------------------------------------------- |
||||||
|
|
||||||
|
@media (max-width: 767px) { |
||||||
|
|
||||||
|
div.subnav { |
||||||
|
|
||||||
|
.nav > li:first-child > a, |
||||||
|
.nav > li + li > a { |
||||||
|
border-color: transparent; |
||||||
|
|
||||||
|
&:hover { |
||||||
|
background-color: darken(@grayLighter, 10%); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.nav > li:last-child > a { |
||||||
|
border-radius: 0 0 4px 4px; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.input-append, |
||||||
|
.input-prepend { |
||||||
|
|
||||||
|
.add-on,.btn { |
||||||
|
padding: 5px; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@media (max-width: 979px) { |
||||||
|
|
||||||
|
.navbar { |
||||||
|
|
||||||
|
.nav-collapse .nav > li > a { |
||||||
|
color: @white; |
||||||
|
|
||||||
|
&:hover { |
||||||
|
background-color: @green; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
} |
@ -0,0 +1,300 @@ |
|||||||
|
// Flatness by Jenil (www.jgog.in) |
||||||
|
// Bootswatch 2.3.2 |
||||||
|
// -------------------------------------------------- |
||||||
|
|
||||||
|
|
||||||
|
// Global values |
||||||
|
// -------------------------------------------------- |
||||||
|
|
||||||
|
// Grays |
||||||
|
// ------------------------- |
||||||
|
@black: #000; |
||||||
|
@grayDarker: #222; |
||||||
|
@grayDark: #7b8a8b; |
||||||
|
@gray: #95A5A6; |
||||||
|
@grayLight: #b4bcc2; |
||||||
|
@grayLighter: #ECF0F1; |
||||||
|
@white: #fff; |
||||||
|
|
||||||
|
|
||||||
|
// Accent colors |
||||||
|
// ------------------------- |
||||||
|
@blue: #3498DB; |
||||||
|
@blueDark: #2C3E50; |
||||||
|
@green: #18BC9C; |
||||||
|
@red: #E74C3C; |
||||||
|
@yellow: #e6bb0d; |
||||||
|
@orange: #F39C12; |
||||||
|
@pink: #ff6699; |
||||||
|
@purple: #8E44AD; |
||||||
|
|
||||||
|
|
||||||
|
// Scaffolding |
||||||
|
// ------------------------- |
||||||
|
@bodyBackground: @white; |
||||||
|
@textColor: @blueDark; |
||||||
|
|
||||||
|
|
||||||
|
// Links |
||||||
|
// ------------------------- |
||||||
|
@linkColor: #1ABC9C; |
||||||
|
@linkColorHover: lighten(@linkColor, 5%); |
||||||
|
|
||||||
|
|
||||||
|
// Typography |
||||||
|
// ------------------------- |
||||||
|
@sansFontFamily: "Lato", "Helvetica Neue", Helvetica, Arial, sans-serif; |
||||||
|
@serifFontFamily: Georgia, "Times New Roman", Times, serif; |
||||||
|
@monoFontFamily: Monaco, Menlo, Consolas, "Courier New", monospace; |
||||||
|
|
||||||
|
@baseFontSize: 15px; |
||||||
|
@baseFontFamily: @sansFontFamily; |
||||||
|
@baseLineHeight: 20px; |
||||||
|
@altFontFamily: @serifFontFamily; |
||||||
|
|
||||||
|
@headingsFontFamily: inherit; // empty to use BS default, @baseFontFamily |
||||||
|
@headingsFontWeight: bold; // instead of browser default, bold |
||||||
|
@headingsColor: inherit; // empty to use BS default, @textColor |
||||||
|
|
||||||
|
|
||||||
|
// Component sizing |
||||||
|
// ------------------------- |
||||||
|
// Based on 14px font-size and 20px line-height |
||||||
|
|
||||||
|
@fontSizeLarge: @baseFontSize * 1.25; // ~18px |
||||||
|
@fontSizeSmall: @baseFontSize * 0.85; // ~12px |
||||||
|
@fontSizeMini: @baseFontSize * 0.75; // ~11px |
||||||
|
|
||||||
|
@paddingLarge: 18px 36px; // 44px |
||||||
|
@paddingSmall: 2px 12px; // 26px |
||||||
|
@paddingMini: 1px 8px; // 24px |
||||||
|
|
||||||
|
@baseBorderRadius: 6px; |
||||||
|
@borderRadiusLarge: 10px; |
||||||
|
@borderRadiusSmall: 3px; |
||||||
|
|
||||||
|
|
||||||
|
// Tables |
||||||
|
// ------------------------- |
||||||
|
@tableBackground: transparent; // overall background-color |
||||||
|
@tableBackgroundAccent: #f9f9f9; // for striping |
||||||
|
@tableBackgroundHover: #f5f5f5; // for hover |
||||||
|
@tableBorder: #ddd; // table and cell border |
||||||
|
|
||||||
|
// Buttons |
||||||
|
// ------------------------- |
||||||
|
@btnBackground: @grayLight; |
||||||
|
@btnBackgroundHighlight: lighten(@btnBackground, 10%); |
||||||
|
@btnBorder: #ddd; |
||||||
|
|
||||||
|
@btnPrimaryBackground: @textColor; |
||||||
|
@btnPrimaryBackgroundHighlight: lighten(@btnPrimaryBackground, 10%); |
||||||
|
|
||||||
|
@btnInfoBackground: @blue; |
||||||
|
@btnInfoBackgroundHighlight: lighten(@btnInfoBackground, 10%); |
||||||
|
|
||||||
|
@btnSuccessBackground: @green; |
||||||
|
@btnSuccessBackgroundHighlight: lighten(@btnSuccessBackground, 10%); |
||||||
|
|
||||||
|
@btnWarningBackground: @orange; |
||||||
|
@btnWarningBackgroundHighlight: lighten(@btnWarningBackground, 10%); |
||||||
|
|
||||||
|
@btnDangerBackground: @red; |
||||||
|
@btnDangerBackgroundHighlight: lighten(@btnDangerBackground, 10%); |
||||||
|
|
||||||
|
@btnInverseBackground: @grayDarker; |
||||||
|
@btnInverseBackgroundHighlight: lighten(@btnInverseBackground, 10%); |
||||||
|
|
||||||
|
|
||||||
|
// Forms |
||||||
|
// ------------------------- |
||||||
|
@inputBackground: @white; |
||||||
|
@inputBorder: #dce4ec; |
||||||
|
@inputBorderRadius: @baseBorderRadius; |
||||||
|
@inputDisabledBackground: #eaeded; |
||||||
|
@formActionsBackground: #f5f5f5; |
||||||
|
@inputHeight: @baseLineHeight + 10px; // base line-height + 8px vertical padding + 2px top/bottom border |
||||||
|
|
||||||
|
|
||||||
|
// Dropdowns |
||||||
|
// ------------------------- |
||||||
|
@dropdownBackground: @blueDark; |
||||||
|
@dropdownBorder: rgba(0,0,0,0); |
||||||
|
@dropdownDividerTop: rgba(0,0,0,0.2); |
||||||
|
@dropdownDividerBottom: rgba(0,0,0,0.2); |
||||||
|
|
||||||
|
@dropdownLinkColor: @white; |
||||||
|
@dropdownLinkColorHover: @white; |
||||||
|
@dropdownLinkColorActive: @dropdownLinkColor; |
||||||
|
|
||||||
|
@dropdownLinkBackgroundActive: @green; |
||||||
|
@dropdownLinkBackgroundHover: @green; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// COMPONENT VARIABLES |
||||||
|
// -------------------------------------------------- |
||||||
|
|
||||||
|
|
||||||
|
// Z-index master list |
||||||
|
// ------------------------- |
||||||
|
// Used for a bird's eye view of components dependent on the z-axis |
||||||
|
// Try to avoid customizing these :) |
||||||
|
@zindexDropdown: 1000; |
||||||
|
@zindexPopover: 1010; |
||||||
|
@zindexTooltip: 1030; |
||||||
|
@zindexFixedNavbar: 1030; |
||||||
|
@zindexModalBackdrop: 1040; |
||||||
|
@zindexModal: 1050; |
||||||
|
|
||||||
|
|
||||||
|
// Sprite icons path |
||||||
|
// ------------------------- |
||||||
|
@iconSpritePath: "../img/glyphicons-halflings.png"; |
||||||
|
@iconWhiteSpritePath: "../img/glyphicons-halflings-white.png"; |
||||||
|
|
||||||
|
|
||||||
|
// Input placeholder text color |
||||||
|
// ------------------------- |
||||||
|
@placeholderText: @grayLight; |
||||||
|
|
||||||
|
|
||||||
|
// Hr border color |
||||||
|
// ------------------------- |
||||||
|
@hrBorder: @grayLighter; |
||||||
|
|
||||||
|
|
||||||
|
// Horizontal forms & lists |
||||||
|
// ------------------------- |
||||||
|
@horizontalComponentOffset: 180px; |
||||||
|
|
||||||
|
|
||||||
|
// Wells |
||||||
|
// ------------------------- |
||||||
|
@wellBackground: @grayLighter; |
||||||
|
|
||||||
|
|
||||||
|
// Navbar |
||||||
|
// ------------------------- |
||||||
|
@navbarCollapseWidth: 979px; |
||||||
|
@navbarCollapseDesktopWidth: @navbarCollapseWidth + 1; |
||||||
|
|
||||||
|
@navbarHeight: 50px; |
||||||
|
@navbarBackgroundHighlight: @textColor; |
||||||
|
@navbarBackground: @textColor; |
||||||
|
@navbarBorder: darken(@navbarBackground, 5%); |
||||||
|
|
||||||
|
@navbarText: @white; |
||||||
|
@navbarLinkColor: @white; |
||||||
|
@navbarLinkColorHover: @linkColor; |
||||||
|
@navbarLinkColorActive: @linkColor; |
||||||
|
@navbarLinkBackgroundHover: transparent; |
||||||
|
@navbarLinkBackgroundActive: darken(@navbarBackground, 5%); |
||||||
|
|
||||||
|
@navbarBrandColor: @navbarLinkColor; |
||||||
|
|
||||||
|
// Inverted navbar |
||||||
|
@navbarInverseBackground: @green; |
||||||
|
@navbarInverseBackgroundHighlight: @green; |
||||||
|
@navbarInverseBorder: darken(@green, 5%); |
||||||
|
|
||||||
|
@navbarInverseText: @white; |
||||||
|
@navbarInverseLinkColor: @white; |
||||||
|
@navbarInverseLinkColorHover: @blueDark; |
||||||
|
@navbarInverseLinkColorActive: @blueDark; |
||||||
|
@navbarInverseLinkBackgroundHover: transparent; |
||||||
|
@navbarInverseLinkBackgroundActive: darken(@navbarInverseBackground, 5%); |
||||||
|
|
||||||
|
@navbarInverseSearchBackground: @white; |
||||||
|
@navbarInverseSearchBackgroundFocus: @white; |
||||||
|
@navbarInverseSearchBorder: @grayLight; |
||||||
|
@navbarInverseSearchPlaceholderColor: @gray; |
||||||
|
|
||||||
|
@navbarInverseBrandColor: @navbarInverseLinkColor; |
||||||
|
|
||||||
|
|
||||||
|
// Pagination |
||||||
|
// ------------------------- |
||||||
|
@paginationBackground: #fff; |
||||||
|
@paginationBorder: #ddd; |
||||||
|
@paginationActiveBackground: @grayLighter; |
||||||
|
|
||||||
|
|
||||||
|
// Hero unit |
||||||
|
// ------------------------- |
||||||
|
@heroUnitBackground: @grayLighter; |
||||||
|
@heroUnitHeadingColor: inherit; |
||||||
|
@heroUnitLeadColor: inherit; |
||||||
|
|
||||||
|
|
||||||
|
// Form states and alerts |
||||||
|
// ------------------------- |
||||||
|
@warningText: @yellow; |
||||||
|
@warningBackground: @yellow; |
||||||
|
@warningBorder: transparent; |
||||||
|
|
||||||
|
@errorText: @red; |
||||||
|
@errorBackground: @red; |
||||||
|
@errorBorder: transparent; |
||||||
|
|
||||||
|
@successText: @green; |
||||||
|
@successBackground: @green; |
||||||
|
@successBorder: transparent; |
||||||
|
|
||||||
|
@infoText: @blue; |
||||||
|
@infoBackground: @blue; |
||||||
|
@infoBorder: transparent; |
||||||
|
|
||||||
|
|
||||||
|
// Tooltips and popovers |
||||||
|
// ------------------------- |
||||||
|
@tooltipColor: #fff; |
||||||
|
@tooltipBackground: @blueDark; |
||||||
|
@tooltipArrowWidth: 5px; |
||||||
|
@tooltipArrowColor: @tooltipBackground; |
||||||
|
|
||||||
|
@popoverBackground: @blueDark; |
||||||
|
@popoverArrowWidth: 10px; |
||||||
|
@popoverArrowColor: @blueDark; |
||||||
|
@popoverTitleBackground: @blueDark; |
||||||
|
|
||||||
|
// Special enhancement for popovers |
||||||
|
@popoverArrowOuterWidth: @popoverArrowWidth + 1; |
||||||
|
@popoverArrowOuterColor: rgba(0,0,0,.25); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// GRID |
||||||
|
// -------------------------------------------------- |
||||||
|
|
||||||
|
|
||||||
|
// Default 940px grid |
||||||
|
// ------------------------- |
||||||
|
@gridColumns: 12; |
||||||
|
@gridColumnWidth: 60px; |
||||||
|
@gridGutterWidth: 20px; |
||||||
|
@gridRowWidth: (@gridColumns * @gridColumnWidth) + (@gridGutterWidth * (@gridColumns - 1)); |
||||||
|
|
||||||
|
// 1200px min |
||||||
|
@gridColumnWidth1200: 70px; |
||||||
|
@gridGutterWidth1200: 30px; |
||||||
|
@gridRowWidth1200: (@gridColumns * @gridColumnWidth1200) + (@gridGutterWidth1200 * (@gridColumns - 1)); |
||||||
|
|
||||||
|
// 768px-979px |
||||||
|
@gridColumnWidth768: 42px; |
||||||
|
@gridGutterWidth768: 20px; |
||||||
|
@gridRowWidth768: (@gridColumns * @gridColumnWidth768) + (@gridGutterWidth768 * (@gridColumns - 1)); |
||||||
|
|
||||||
|
|
||||||
|
// Fluid grid |
||||||
|
// ------------------------- |
||||||
|
@fluidGridColumnWidth: percentage(@gridColumnWidth/@gridRowWidth); |
||||||
|
@fluidGridGutterWidth: percentage(@gridGutterWidth/@gridRowWidth); |
||||||
|
|
||||||
|
// 1200px min |
||||||
|
@fluidGridColumnWidth1200: percentage(@gridColumnWidth1200/@gridRowWidth1200); |
||||||
|
@fluidGridGutterWidth1200: percentage(@gridGutterWidth1200/@gridRowWidth1200); |
||||||
|
|
||||||
|
// 768px-979px |
||||||
|
@fluidGridColumnWidth768: percentage(@gridColumnWidth768/@gridRowWidth768); |
||||||
|
@fluidGridGutterWidth768: percentage(@gridGutterWidth768/@gridRowWidth768); |
After Width: | Height: | Size: 8.6 KiB |
After Width: | Height: | Size: 12 KiB |
@ -0,0 +1,128 @@ |
|||||||
|
<?php |
||||||
|
// This program is free software; you can redistribute it and/or modify |
||||||
|
// it under the terms of the GNU General Public License as published by |
||||||
|
// the Free Software Foundation; either version 2 of the License, or |
||||||
|
// (at your option) any later version. |
||||||
|
|
||||||
|
// This program 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 General Public License for more details. |
||||||
|
|
||||||
|
// You should have received a copy of the GNU General Public License |
||||||
|
// along with this program; if not, write to the Free Software |
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
|
||||||
|
require_once(dirname(__FILE__) . "/includes/funcLib.php"); |
||||||
|
require_once(dirname(__FILE__) . "/includes/MySmarty.class.php"); |
||||||
|
$smarty = new MySmarty(); |
||||||
|
$opt = $smarty->opt(); |
||||||
|
|
||||||
|
session_start(); |
||||||
|
if (!isset($_SESSION["userid"])) { |
||||||
|
header("Location: " . getFullPath("login.php")); |
||||||
|
exit; |
||||||
|
} |
||||||
|
else if ($_SESSION["admin"] != 1) { |
||||||
|
echo "You don't have admin privileges."; |
||||||
|
exit; |
||||||
|
} |
||||||
|
else { |
||||||
|
$userid = $_SESSION["userid"]; |
||||||
|
} |
||||||
|
if (!empty($_GET["message"])) { |
||||||
|
$message = $_GET["message"]; |
||||||
|
} |
||||||
|
|
||||||
|
$action = isset($_GET["action"]) ? $_GET["action"] : ""; |
||||||
|
|
||||||
|
if ($action == "insert" || $action == "update") { |
||||||
|
/* validate the data. */ |
||||||
|
$category = trim($_GET["category"]); |
||||||
|
|
||||||
|
$haserror = false; |
||||||
|
if ($category == "") { |
||||||
|
$haserror = true; |
||||||
|
$category_error = "A category is required."; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if ($action == "delete") { |
||||||
|
/* first, NULL all category FKs for items that use this category. */ |
||||||
|
$stmt = $smarty->dbh()->prepare("UPDATE {$opt["table_prefix"]}items SET category = NULL WHERE category = ?"); |
||||||
|
$stmt->bindValue(1, (int) $_GET["categoryid"], PDO::PARAM_INT); |
||||||
|
$stmt->execute(); |
||||||
|
|
||||||
|
$stmt = $smarty->dbh()->prepare("DELETE FROM {$opt["table_prefix"]}categories WHERE categoryid = ?"); |
||||||
|
$stmt->bindValue(1, (int) $_GET["categoryid"], PDO::PARAM_INT); |
||||||
|
$stmt->execute(); |
||||||
|
|
||||||
|
header("Location: " . getFullPath("categories.php?message=Category+deleted.")); |
||||||
|
exit; |
||||||
|
} |
||||||
|
else if ($action == "edit") { |
||||||
|
$stmt = $smarty->dbh()->prepare("SELECT category FROM {$opt["table_prefix"]}categories WHERE categoryid = ?"); |
||||||
|
$stmt->bindValue(1, (int) $_GET["categoryid"], PDO::PARAM_INT); |
||||||
|
$stmt->execute(); |
||||||
|
if ($row = $stmt->fetch()) { |
||||||
|
$category = $row["category"]; |
||||||
|
} |
||||||
|
} |
||||||
|
else if ($action == "") { |
||||||
|
$category = ""; |
||||||
|
} |
||||||
|
else if ($action == "insert") { |
||||||
|
if (!$haserror) { |
||||||
|
$stmt = $smarty->dbh()->prepare("INSERT INTO {$opt["table_prefix"]}categories(categoryid,category) VALUES(NULL, ?)"); |
||||||
|
$stmt->bindParam(1, $category, PDO::PARAM_STR); |
||||||
|
$stmt->execute(); |
||||||
|
|
||||||
|
header("Location: " . getFullPath("categories.php?message=Category+added.")); |
||||||
|
exit; |
||||||
|
} |
||||||
|
} |
||||||
|
else if ($action == "update") { |
||||||
|
if (!$haserror) { |
||||||
|
$stmt = $smarty->dbh()->prepare("UPDATE {$opt["table_prefix"]}categories " . |
||||||
|
"SET category = ? " . |
||||||
|
"WHERE categoryid = ?"); |
||||||
|
$stmt->bindParam(1, $category, PDO::PARAM_STR); |
||||||
|
$stmt->bindValue(2, (int) $_GET["categoryid"], PDO::PARAM_INT); |
||||||
|
$stmt->execute(); |
||||||
|
|
||||||
|
header("Location: " . getFullPath("categories.php?message=Category+updated.")); |
||||||
|
exit; |
||||||
|
} |
||||||
|
} |
||||||
|
else { |
||||||
|
die("Unknown verb."); |
||||||
|
} |
||||||
|
|
||||||
|
$stmt = $smarty->dbh()->prepare("SELECT c.categoryid, c.category, COUNT(itemid) AS itemsin " . |
||||||
|
"FROM {$opt["table_prefix"]}categories c " . |
||||||
|
"LEFT OUTER JOIN {$opt["table_prefix"]}items i ON i.category = c.categoryid " . |
||||||
|
"GROUP BY c.categoryid, category " . |
||||||
|
"ORDER BY category"); |
||||||
|
$stmt->execute(); |
||||||
|
$categories = array(); |
||||||
|
while ($row = $stmt->fetch()) { |
||||||
|
$categories[] = $row; |
||||||
|
} |
||||||
|
|
||||||
|
if (isset($action)) { |
||||||
|
$smarty->assign('action', $action); |
||||||
|
} |
||||||
|
$smarty->assign('categories', $categories); |
||||||
|
if (isset($_GET["categoryid"])) { |
||||||
|
$smarty->assign('categoryid', (int) $_GET["categoryid"]); |
||||||
|
} |
||||||
|
if (isset($message)) { |
||||||
|
$smarty->assign('message', $message); |
||||||
|
} |
||||||
|
$smarty->assign('category', $category); |
||||||
|
if (isset($category_error)) { |
||||||
|
$smarty->assign('category_error', $category_error); |
||||||
|
} |
||||||
|
$smarty->assign('haserror', isset($haserror) ? $haserror : false); |
||||||
|
$smarty->display('categories.tpl'); |
||||||
|
?> |
@ -0,0 +1,7 @@ |
|||||||
|
/* |
||||||
|
Datepicker for Bootstrap |
||||||
|
Copyright 2012 Stefan Petre |
||||||
|
Licensed under the Apache License v2.0 |
||||||
|
http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
*/ |
||||||
|
.datepicker { top: 0; left: 0; padding: 4px; margin-top: 1px; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; /*.dow { border-top: 1px solid #ddd !important; }*/ } .datepicker:before { content: ''; display: inline-block; border-left: 7px solid transparent; border-right: 7px solid transparent; border-bottom: 7px solid #ccc; border-bottom-color: rgba(0, 0, 0, 0.2); position: absolute; top: -7px; left: 6px; } .datepicker:after { content: ''; display: inline-block; border-left: 6px solid transparent; border-right: 6px solid transparent; border-bottom: 6px solid #ffffff; position: absolute; top: -6px; left: 7px; } .datepicker > div { display: none; } .datepicker table { width: 100%; margin: 0; } .datepicker td, .datepicker th { text-align: center; width: 20px; height: 20px; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .datepicker td.day:hover { background: #eeeeee; cursor: pointer; } .datepicker td.old, .datepicker td.new { color: #999999; } .datepicker td.active, .datepicker td.active:hover { background-color: #006dcc; background-image: -moz-linear-gradient(top, #0088cc, #0044cc); background-image: -ms-linear-gradient(top, #0088cc, #0044cc); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); background-image: -o-linear-gradient(top, #0088cc, #0044cc); background-image: linear-gradient(top, #0088cc, #0044cc); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); border-color: #0044cc #0044cc #002a80; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); color: #fff; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } .datepicker td.active:hover, .datepicker td.active:hover:hover, .datepicker td.active:active, .datepicker td.active:hover:active, .datepicker td.active.active, .datepicker td.active:hover.active, .datepicker td.active.disabled, .datepicker td.active:hover.disabled, .datepicker td.active[disabled], .datepicker td.active:hover[disabled] { background-color: #0044cc; } .datepicker td.active:active, .datepicker td.active:hover:active, .datepicker td.active.active, .datepicker td.active:hover.active { background-color: #003399 \9; } .datepicker td span { display: block; width: 47px; height: 54px; line-height: 54px; float: left; margin: 2px; cursor: pointer; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .datepicker td span:hover { background: #eeeeee; } .datepicker td span.active { background-color: #006dcc; background-image: -moz-linear-gradient(top, #0088cc, #0044cc); background-image: -ms-linear-gradient(top, #0088cc, #0044cc); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); background-image: -o-linear-gradient(top, #0088cc, #0044cc); background-image: linear-gradient(top, #0088cc, #0044cc); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); border-color: #0044cc #0044cc #002a80; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); color: #fff; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } .datepicker td span.active:hover, .datepicker td span.active:active, .datepicker td span.active.active, .datepicker td span.active.disabled, .datepicker td span.active[disabled] { background-color: #0044cc; } .datepicker td span.active:active, .datepicker td span.active.active { background-color: #003399 \9; } .datepicker td span.old { color: #999999; } .datepicker th.switch { width: 145px; } .datepicker th.next, .datepicker th.prev { font-size: 19.5px; } .datepicker thead tr:first-child th { cursor: pointer; } .datepicker thead tr:first-child th:hover { background: #eeeeee; } .input-append.date .add-on i, .input-prepend.date .add-on i { display: block; cursor: pointer; width: 16px; height: 16px; } |
@ -0,0 +1,454 @@ |
|||||||
|
/* ========================================================= |
||||||
|
* bootstrap-datepicker.js
|
||||||
|
* http://www.eyecon.ro/bootstrap-datepicker
|
||||||
|
* ========================================================= |
||||||
|
* Copyright 2012 Stefan Petre |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
* ========================================================= */ |
||||||
|
|
||||||
|
!function( $ ) { |
||||||
|
|
||||||
|
// Picker object
|
||||||
|
|
||||||
|
var Datepicker = function(element, options){ |
||||||
|
this.element = $(element); |
||||||
|
this.format = DPGlobal.parseFormat(options.format||this.element.data('date-format')||'mm/dd/yyyy'); |
||||||
|
this.picker = $(DPGlobal.template) |
||||||
|
.appendTo('body') |
||||||
|
.on({ |
||||||
|
click: $.proxy(this.click, this), |
||||||
|
mousedown: $.proxy(this.mousedown, this) |
||||||
|
}); |
||||||
|
this.isInput = this.element.is('input'); |
||||||
|
this.component = this.element.is('.date') ? this.element.find('.add-on') : false; |
||||||
|
|
||||||
|
if (this.isInput) { |
||||||
|
this.element.on({ |
||||||
|
focus: $.proxy(this.show, this), |
||||||
|
blur: $.proxy(this.hide, this), |
||||||
|
keyup: $.proxy(this.update, this) |
||||||
|
}); |
||||||
|
} else { |
||||||
|
if (this.component){ |
||||||
|
this.component.on('click', $.proxy(this.show, this)); |
||||||
|
} else { |
||||||
|
this.element.on('click', $.proxy(this.show, this)); |
||||||
|
} |
||||||
|
} |
||||||
|
this.minViewMode = options.minViewMode||this.element.data('date-minviewmode')||0; |
||||||
|
if (typeof this.minViewMode === 'string') { |
||||||
|
switch (this.minViewMode) { |
||||||
|
case 'months': |
||||||
|
this.minViewMode = 1; |
||||||
|
break; |
||||||
|
case 'years': |
||||||
|
this.minViewMode = 2; |
||||||
|
break; |
||||||
|
default: |
||||||
|
this.minViewMode = 0; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
this.viewMode = options.viewMode||this.element.data('date-viewmode')||0; |
||||||
|
if (typeof this.viewMode === 'string') { |
||||||
|
switch (this.viewMode) { |
||||||
|
case 'months': |
||||||
|
this.viewMode = 1; |
||||||
|
break; |
||||||
|
case 'years': |
||||||
|
this.viewMode = 2; |
||||||
|
break; |
||||||
|
default: |
||||||
|
this.viewMode = 0; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
this.startViewMode = this.viewMode; |
||||||
|
this.weekStart = options.weekStart||this.element.data('date-weekstart')||0; |
||||||
|
this.weekEnd = this.weekStart === 0 ? 6 : this.weekStart - 1; |
||||||
|
this.fillDow(); |
||||||
|
this.fillMonths(); |
||||||
|
this.update(); |
||||||
|
this.showMode(); |
||||||
|
}; |
||||||
|
|
||||||
|
Datepicker.prototype = { |
||||||
|
constructor: Datepicker, |
||||||
|
|
||||||
|
show: function(e) { |
||||||
|
this.picker.show(); |
||||||
|
this.height = this.component ? this.component.outerHeight() : this.element.outerHeight(); |
||||||
|
this.place(); |
||||||
|
$(window).on('resize', $.proxy(this.place, this)); |
||||||
|
if (e ) { |
||||||
|
e.stopPropagation(); |
||||||
|
e.preventDefault(); |
||||||
|
} |
||||||
|
if (!this.isInput) { |
||||||
|
$(document).on('mousedown', $.proxy(this.hide, this)); |
||||||
|
} |
||||||
|
this.element.trigger({ |
||||||
|
type: 'show', |
||||||
|
date: this.date |
||||||
|
}); |
||||||
|
}, |
||||||
|
|
||||||
|
hide: function(){ |
||||||
|
this.picker.hide(); |
||||||
|
$(window).off('resize', this.place); |
||||||
|
this.viewMode = this.startViewMode; |
||||||
|
this.showMode(); |
||||||
|
if (!this.isInput) { |
||||||
|
$(document).off('mousedown', this.hide); |
||||||
|
} |
||||||
|
this.set(); |
||||||
|
this.element.trigger({ |
||||||
|
type: 'hide', |
||||||
|
date: this.date |
||||||
|
}); |
||||||
|
}, |
||||||
|
|
||||||
|
set: function() { |
||||||
|
var formated = DPGlobal.formatDate(this.date, this.format); |
||||||
|
if (!this.isInput) { |
||||||
|
if (this.component){ |
||||||
|
this.element.find('input').prop('value', formated); |
||||||
|
} |
||||||
|
this.element.data('date', formated); |
||||||
|
} else { |
||||||
|
this.element.prop('value', formated); |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
setValue: function(newDate) { |
||||||
|
if (typeof newDate === 'string') { |
||||||
|
this.date = DPGlobal.parseDate(newDate, this.format); |
||||||
|
} else { |
||||||
|
this.date = new Date(newDate); |
||||||
|
} |
||||||
|
this.set(); |
||||||
|
this.viewDate = new Date(this.date.getFullYear(), this.date.getMonth(), 1, 0, 0, 0, 0); |
||||||
|
this.fill(); |
||||||
|
}, |
||||||
|
|
||||||
|
place: function(){ |
||||||
|
var offset = this.component ? this.component.offset() : this.element.offset(); |
||||||
|
this.picker.css({ |
||||||
|
top: offset.top + this.height, |
||||||
|
left: offset.left |
||||||
|
}); |
||||||
|
}, |
||||||
|
|
||||||
|
update: function(newDate){ |
||||||
|
this.date = DPGlobal.parseDate( |
||||||
|
typeof newDate === 'string' ? newDate : (this.isInput ? this.element.prop('value') : this.element.data('date')), |
||||||
|
this.format |
||||||
|
); |
||||||
|
this.viewDate = new Date(this.date.getFullYear(), this.date.getMonth(), 1, 0, 0, 0, 0); |
||||||
|
this.fill(); |
||||||
|
}, |
||||||
|
|
||||||
|
fillDow: function(){ |
||||||
|
var dowCnt = this.weekStart; |
||||||
|
var html = '<tr>'; |
||||||
|
while (dowCnt < this.weekStart + 7) { |
||||||
|
html += '<th class="dow">'+DPGlobal.dates.daysMin[(dowCnt++)%7]+'</th>'; |
||||||
|
} |
||||||
|
html += '</tr>'; |
||||||
|
this.picker.find('.datepicker-days thead').append(html); |
||||||
|
}, |
||||||
|
|
||||||
|
fillMonths: function(){ |
||||||
|
var html = ''; |
||||||
|
var i = 0 |
||||||
|
while (i < 12) { |
||||||
|
html += '<span class="month">'+DPGlobal.dates.monthsShort[i++]+'</span>'; |
||||||
|
} |
||||||
|
this.picker.find('.datepicker-months td').append(html); |
||||||
|
}, |
||||||
|
|
||||||
|
fill: function() { |
||||||
|
var d = new Date(this.viewDate), |
||||||
|
year = d.getFullYear(), |
||||||
|
month = d.getMonth(), |
||||||
|
currentDate = this.date.valueOf(); |
||||||
|
this.picker.find('.datepicker-days th:eq(1)') |
||||||
|
.text(DPGlobal.dates.months[month]+' '+year); |
||||||
|
var prevMonth = new Date(year, month-1, 28,0,0,0,0), |
||||||
|
day = DPGlobal.getDaysInMonth(prevMonth.getFullYear(), prevMonth.getMonth()); |
||||||
|
prevMonth.setDate(day); |
||||||
|
prevMonth.setDate(day - (prevMonth.getDay() - this.weekStart + 7)%7); |
||||||
|
var nextMonth = new Date(prevMonth); |
||||||
|
nextMonth.setDate(nextMonth.getDate() + 42); |
||||||
|
nextMonth = nextMonth.valueOf(); |
||||||
|
html = []; |
||||||
|
var clsName; |
||||||
|
while(prevMonth.valueOf() < nextMonth) { |
||||||
|
if (prevMonth.getDay() === this.weekStart) { |
||||||
|
html.push('<tr>'); |
||||||
|
} |
||||||
|
clsName = ''; |
||||||
|
if (prevMonth.getMonth() < month) { |
||||||
|
clsName += ' old'; |
||||||
|
} else if (prevMonth.getMonth() > month) { |
||||||
|
clsName += ' new'; |
||||||
|
} |
||||||
|
if (prevMonth.valueOf() === currentDate) { |
||||||
|
clsName += ' active'; |
||||||
|
} |
||||||
|
html.push('<td class="day'+clsName+'">'+prevMonth.getDate() + '</td>'); |
||||||
|
if (prevMonth.getDay() === this.weekEnd) { |
||||||
|
html.push('</tr>'); |
||||||
|
} |
||||||
|
prevMonth.setDate(prevMonth.getDate()+1); |
||||||
|
} |
||||||
|
this.picker.find('.datepicker-days tbody').empty().append(html.join('')); |
||||||
|
var currentYear = this.date.getFullYear(); |
||||||
|
|
||||||
|
var months = this.picker.find('.datepicker-months') |
||||||
|
.find('th:eq(1)') |
||||||
|
.text(year) |
||||||
|
.end() |
||||||
|
.find('span').removeClass('active'); |
||||||
|
if (currentYear === year) { |
||||||
|
months.eq(this.date.getMonth()).addClass('active'); |
||||||
|
} |
||||||
|
|
||||||
|
html = ''; |
||||||
|
year = parseInt(year/10, 10) * 10; |
||||||
|
var yearCont = this.picker.find('.datepicker-years') |
||||||
|
.find('th:eq(1)') |
||||||
|
.text(year + '-' + (year + 9)) |
||||||
|
.end() |
||||||
|
.find('td'); |
||||||
|
year -= 1; |
||||||
|
for (var i = -1; i < 11; i++) { |
||||||
|
html += '<span class="year'+(i === -1 || i === 10 ? ' old' : '')+(currentYear === year ? ' active' : '')+'">'+year+'</span>'; |
||||||
|
year += 1; |
||||||
|
} |
||||||
|
yearCont.html(html); |
||||||
|
}, |
||||||
|
|
||||||
|
click: function(e) { |
||||||
|
e.stopPropagation(); |
||||||
|
e.preventDefault(); |
||||||
|
var target = $(e.target).closest('span, td, th'); |
||||||
|
if (target.length === 1) { |
||||||
|
switch(target[0].nodeName.toLowerCase()) { |
||||||
|
case 'th': |
||||||
|
switch(target[0].className) { |
||||||
|
case 'switch': |
||||||
|
this.showMode(1); |
||||||
|
break; |
||||||
|
case 'prev': |
||||||
|
case 'next': |
||||||
|
this.viewDate['set'+DPGlobal.modes[this.viewMode].navFnc].call( |
||||||
|
this.viewDate, |
||||||
|
this.viewDate['get'+DPGlobal.modes[this.viewMode].navFnc].call(this.viewDate) +
|
||||||
|
DPGlobal.modes[this.viewMode].navStep * (target[0].className === 'prev' ? -1 : 1) |
||||||
|
); |
||||||
|
this.fill(); |
||||||
|
this.set(); |
||||||
|
break; |
||||||
|
} |
||||||
|
break; |
||||||
|
case 'span': |
||||||
|
if (target.is('.month')) { |
||||||
|
var month = target.parent().find('span').index(target); |
||||||
|
this.viewDate.setMonth(month); |
||||||
|
} else { |
||||||
|
var year = parseInt(target.text(), 10)||0; |
||||||
|
this.viewDate.setFullYear(year); |
||||||
|
} |
||||||
|
if (this.viewMode !== 0) { |
||||||
|
this.date = new Date(this.viewDate); |
||||||
|
this.element.trigger({ |
||||||
|
type: 'changeDate', |
||||||
|
date: this.date, |
||||||
|
viewMode: DPGlobal.modes[this.viewMode].clsName |
||||||
|
}); |
||||||
|
} |
||||||
|
this.showMode(-1); |
||||||
|
this.fill(); |
||||||
|
this.set(); |
||||||
|
break; |
||||||
|
case 'td': |
||||||
|
if (target.is('.day')){ |
||||||
|
var day = parseInt(target.text(), 10)||1; |
||||||
|
var month = this.viewDate.getMonth(); |
||||||
|
if (target.is('.old')) { |
||||||
|
month -= 1; |
||||||
|
} else if (target.is('.new')) { |
||||||
|
month += 1; |
||||||
|
} |
||||||
|
var year = this.viewDate.getFullYear(); |
||||||
|
this.date = new Date(year, month, day,0,0,0,0); |
||||||
|
this.viewDate = new Date(year, month, Math.min(28, day),0,0,0,0); |
||||||
|
this.fill(); |
||||||
|
this.set(); |
||||||
|
this.element.trigger({ |
||||||
|
type: 'changeDate', |
||||||
|
date: this.date, |
||||||
|
viewMode: DPGlobal.modes[this.viewMode].clsName |
||||||
|
}); |
||||||
|
} |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
mousedown: function(e){ |
||||||
|
e.stopPropagation(); |
||||||
|
e.preventDefault(); |
||||||
|
}, |
||||||
|
|
||||||
|
showMode: function(dir) { |
||||||
|
if (dir) { |
||||||
|
this.viewMode = Math.max(this.minViewMode, Math.min(2, this.viewMode + dir)); |
||||||
|
} |
||||||
|
this.picker.find('>div').hide().filter('.datepicker-'+DPGlobal.modes[this.viewMode].clsName).show(); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
$.fn.datepicker = function ( option, val ) { |
||||||
|
return this.each(function () { |
||||||
|
var $this = $(this), |
||||||
|
data = $this.data('datepicker'), |
||||||
|
options = typeof option === 'object' && option; |
||||||
|
if (!data) { |
||||||
|
$this.data('datepicker', (data = new Datepicker(this, $.extend({}, $.fn.datepicker.defaults,options)))); |
||||||
|
} |
||||||
|
if (typeof option === 'string') data[option](val); |
||||||
|
}); |
||||||
|
}; |
||||||
|
|
||||||
|
$.fn.datepicker.defaults = { |
||||||
|
}; |
||||||
|
$.fn.datepicker.Constructor = Datepicker; |
||||||
|
|
||||||
|
var DPGlobal = { |
||||||
|
modes: [ |
||||||
|
{ |
||||||
|
clsName: 'days', |
||||||
|
navFnc: 'Month', |
||||||
|
navStep: 1 |
||||||
|
}, |
||||||
|
{ |
||||||
|
clsName: 'months', |
||||||
|
navFnc: 'FullYear', |
||||||
|
navStep: 1 |
||||||
|
}, |
||||||
|
{ |
||||||
|
clsName: 'years', |
||||||
|
navFnc: 'FullYear', |
||||||
|
navStep: 10 |
||||||
|
}], |
||||||
|
dates:{ |
||||||
|
days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], |
||||||
|
daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], |
||||||
|
daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"], |
||||||
|
months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], |
||||||
|
monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] |
||||||
|
}, |
||||||
|
isLeapYear: function (year) { |
||||||
|
return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)) |
||||||
|
}, |
||||||
|
getDaysInMonth: function (year, month) { |
||||||
|
return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month] |
||||||
|
}, |
||||||
|
parseFormat: function(format){ |
||||||
|
var separator = format.match(/[.\/\-\s].*?/), |
||||||
|
parts = format.split(/\W+/); |
||||||
|
if (!separator || !parts || parts.length === 0){ |
||||||
|
throw new Error("Invalid date format."); |
||||||
|
} |
||||||
|
return {separator: separator, parts: parts}; |
||||||
|
}, |
||||||
|
parseDate: function(date, format) { |
||||||
|
var parts = date.split(format.separator), |
||||||
|
date = new Date(), |
||||||
|
val; |
||||||
|
date.setHours(0); |
||||||
|
date.setMinutes(0); |
||||||
|
date.setSeconds(0); |
||||||
|
date.setMilliseconds(0); |
||||||
|
if (parts.length === format.parts.length) { |
||||||
|
for (var i=0, cnt = format.parts.length; i < cnt; i++) { |
||||||
|
val = parseInt(parts[i], 10)||1; |
||||||
|
switch(format.parts[i]) { |
||||||
|
case 'dd': |
||||||
|
case 'd': |
||||||
|
date.setDate(val); |
||||||
|
break; |
||||||
|
case 'mm': |
||||||
|
case 'm': |
||||||
|
date.setMonth(val - 1); |
||||||
|
break; |
||||||
|
case 'yy': |
||||||
|
date.setFullYear(2000 + val); |
||||||
|
break; |
||||||
|
case 'yyyy': |
||||||
|
date.setFullYear(val); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return date; |
||||||
|
}, |
||||||
|
formatDate: function(date, format){ |
||||||
|
var val = { |
||||||
|
d: date.getDate(), |
||||||
|
m: date.getMonth() + 1, |
||||||
|
yy: date.getFullYear().toString().substring(2), |
||||||
|
yyyy: date.getFullYear() |
||||||
|
}; |
||||||
|
val.dd = (val.d < 10 ? '0' : '') + val.d; |
||||||
|
val.mm = (val.m < 10 ? '0' : '') + val.m; |
||||||
|
var date = []; |
||||||
|
for (var i=0, cnt = format.parts.length; i < cnt; i++) { |
||||||
|
date.push(val[format.parts[i]]); |
||||||
|
} |
||||||
|
return date.join(format.separator); |
||||||
|
}, |
||||||
|
headTemplate: '<thead>'+ |
||||||
|
'<tr>'+ |
||||||
|
'<th class="prev">‹</th>'+ |
||||||
|
'<th colspan="5" class="switch"></th>'+ |
||||||
|
'<th class="next">›</th>'+ |
||||||
|
'</tr>'+ |
||||||
|
'</thead>', |
||||||
|
contTemplate: '<tbody><tr><td colspan="7"></td></tr></tbody>' |
||||||
|
}; |
||||||
|
DPGlobal.template = '<div class="datepicker dropdown-menu">'+ |
||||||
|
'<div class="datepicker-days">'+ |
||||||
|
'<table class=" table-condensed">'+ |
||||||
|
DPGlobal.headTemplate+ |
||||||
|
'<tbody></tbody>'+ |
||||||
|
'</table>'+ |
||||||
|
'</div>'+ |
||||||
|
'<div class="datepicker-months">'+ |
||||||
|
'<table class="table-condensed">'+ |
||||||
|
DPGlobal.headTemplate+ |
||||||
|
DPGlobal.contTemplate+ |
||||||
|
'</table>'+ |
||||||
|
'</div>'+ |
||||||
|
'<div class="datepicker-years">'+ |
||||||
|
'<table class="table-condensed">'+ |
||||||
|
DPGlobal.headTemplate+ |
||||||
|
DPGlobal.contTemplate+ |
||||||
|
'</table>'+ |
||||||
|
'</div>'+ |
||||||
|
'</div>'; |
||||||
|
|
||||||
|
}( window.jQuery ) |
@ -0,0 +1,119 @@ |
|||||||
|
/*! |
||||||
|
* Datepicker for Bootstrap |
||||||
|
* |
||||||
|
* Copyright 2012 Stefan Petre |
||||||
|
* Licensed under the Apache License v2.0 |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
.datepicker { |
||||||
|
top: 0; |
||||||
|
left: 0; |
||||||
|
padding: 4px; |
||||||
|
margin-top: 1px; |
||||||
|
.border-radius(4px); |
||||||
|
&:before { |
||||||
|
content: ''; |
||||||
|
display: inline-block; |
||||||
|
border-left: 7px solid transparent; |
||||||
|
border-right: 7px solid transparent; |
||||||
|
border-bottom: 7px solid #ccc; |
||||||
|
border-bottom-color: rgba(0,0,0,.2); |
||||||
|
position: absolute; |
||||||
|
top: -7px; |
||||||
|
left: 6px; |
||||||
|
} |
||||||
|
&:after { |
||||||
|
content: ''; |
||||||
|
display: inline-block; |
||||||
|
border-left: 6px solid transparent; |
||||||
|
border-right: 6px solid transparent; |
||||||
|
border-bottom: 6px solid @white; |
||||||
|
position: absolute; |
||||||
|
top: -6px; |
||||||
|
left: 7px; |
||||||
|
} |
||||||
|
>div { |
||||||
|
display: none; |
||||||
|
} |
||||||
|
table{ |
||||||
|
width: 100%; |
||||||
|
margin: 0; |
||||||
|
} |
||||||
|
td, |
||||||
|
th{ |
||||||
|
text-align: center; |
||||||
|
width: 20px; |
||||||
|
height: 20px; |
||||||
|
.border-radius(4px); |
||||||
|
} |
||||||
|
td { |
||||||
|
&.day:hover { |
||||||
|
background: @grayLighter; |
||||||
|
cursor: pointer; |
||||||
|
} |
||||||
|
&.old, |
||||||
|
&.new { |
||||||
|
color: @grayLight; |
||||||
|
} |
||||||
|
&.active, |
||||||
|
&.active:hover { |
||||||
|
.buttonBackground(@primaryButtonBackground, spin(@primaryButtonBackground, 20)); |
||||||
|
color: #fff; |
||||||
|
text-shadow: 0 -1px 0 rgba(0,0,0,.25); |
||||||
|
} |
||||||
|
span { |
||||||
|
display: block; |
||||||
|
width: 47px; |
||||||
|
height: 54px; |
||||||
|
line-height: 54px; |
||||||
|
float: left; |
||||||
|
margin: 2px; |
||||||
|
cursor: pointer; |
||||||
|
.border-radius(4px); |
||||||
|
&:hover { |
||||||
|
background: @grayLighter; |
||||||
|
} |
||||||
|
&.active { |
||||||
|
.buttonBackground(@primaryButtonBackground, spin(@primaryButtonBackground, 20)); |
||||||
|
color: #fff; |
||||||
|
text-shadow: 0 -1px 0 rgba(0,0,0,.25); |
||||||
|
} |
||||||
|
&.old { |
||||||
|
color: @grayLight; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
th { |
||||||
|
&.switch { |
||||||
|
width: 145px; |
||||||
|
} |
||||||
|
&.next, |
||||||
|
&.prev { |
||||||
|
font-size: @baseFontSize * 1.5; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
thead tr:first-child th { |
||||||
|
cursor: pointer; |
||||||
|
&:hover{ |
||||||
|
background: @grayLighter; |
||||||
|
} |
||||||
|
} |
||||||
|
/*.dow { |
||||||
|
border-top: 1px solid #ddd !important; |
||||||
|
}*/ |
||||||
|
} |
||||||
|
.input-append, |
||||||
|
.input-prepend { |
||||||
|
&.date { |
||||||
|
.add-on i { |
||||||
|
display: block; |
||||||
|
cursor: pointer; |
||||||
|
width: 16px; |
||||||
|
height: 16px; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,221 @@ |
|||||||
|
<?php |
||||||
|
// This program is free software; you can redistribute it and/or modify |
||||||
|
// it under the terms of the GNU General Public License as published by |
||||||
|
// the Free Software Foundation; either version 2 of the License, or |
||||||
|
// (at your option) any later version. |
||||||
|
|
||||||
|
// This program 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 General Public License for more details. |
||||||
|
|
||||||
|
// You should have received a copy of the GNU General Public License |
||||||
|
// along with this program; if not, write to the Free Software |
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
|
||||||
|
require_once(dirname(__FILE__) . "/includes/funcLib.php"); |
||||||
|
require_once(dirname(__FILE__) . "/includes/MySmarty.class.php"); |
||||||
|
$smarty = new MySmarty(); |
||||||
|
$opt = $smarty->opt(); |
||||||
|
|
||||||
|
session_start(); |
||||||
|
if (!isset($_SESSION["userid"])) { |
||||||
|
header("Location: " . getFullPath("login.php")); |
||||||
|
exit; |
||||||
|
} |
||||||
|
else { |
||||||
|
$userid = $_SESSION["userid"]; |
||||||
|
} |
||||||
|
|
||||||
|
if (!empty($_GET["message"])) { |
||||||
|
$message = $_GET["message"]; |
||||||
|
} |
||||||
|
|
||||||
|
if (isset($_GET["eventid"])) { |
||||||
|
$eventid = $_GET["eventid"]; |
||||||
|
} |
||||||
|
|
||||||
|
// for security, let's make sure that if an eventid was passed in, it belongs |
||||||
|
// to $userid (or is a system event and the user is an admin). |
||||||
|
// all operations on this page should only be performed by the event's owner. |
||||||
|
if (isset($eventid)) { |
||||||
|
try { |
||||||
|
$query = "SELECT * FROM {$opt["table_prefix"]}events WHERE eventid = ? AND "; |
||||||
|
if ($_SESSION["admin"] == 1) |
||||||
|
$query .= "(userid = ? OR userid IS NULL)"; |
||||||
|
else |
||||||
|
$query .= "userid = ?"; |
||||||
|
$stmt = $smarty->dbh()->prepare($query); |
||||||
|
$stmt->bindParam(1, $eventid, PDO::PARAM_INT); |
||||||
|
$stmt->bindParam(2, $userid, PDO::PARAM_INT); |
||||||
|
|
||||||
|
$stmt->execute(); |
||||||
|
if (!$stmt->fetch()) |
||||||
|
die("Nice try! (That's not your event.)"); |
||||||
|
} |
||||||
|
catch (PDOException $e) { |
||||||
|
die("sql exception: " . $e->getMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
$action = isset($_GET["action"]) ? $_GET["action"] : ""; |
||||||
|
|
||||||
|
if ($action == "insert" || $action == "update") { |
||||||
|
/* validate the data. */ |
||||||
|
$description = trim($_GET["description"]); |
||||||
|
try { |
||||||
|
$eventdate = new DateTime($_GET["eventdate"]); |
||||||
|
} |
||||||
|
catch (Exception $e) { |
||||||
|
$eventdate = FALSE; |
||||||
|
} |
||||||
|
$recurring = (strtoupper($_GET["recurring"]) == "ON" ? 1 : 0); |
||||||
|
$systemevent = (strtoupper($_GET["systemevent"]) == "ON" ? 1 : 0); |
||||||
|
|
||||||
|
$haserror = false; |
||||||
|
if ($description == "") { |
||||||
|
$haserror = true; |
||||||
|
$description_error = "A description is required."; |
||||||
|
} |
||||||
|
if ($eventdate == FALSE) { |
||||||
|
$haserror = true; |
||||||
|
$eventdate_error = "Date is out of range for this server."; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if ($action == "delete") { |
||||||
|
try { |
||||||
|
$stmt = $smarty->dbh()->prepare("DELETE FROM {$opt["table_prefix"]}events WHERE eventid = ?"); |
||||||
|
$stmt->bindParam(1, $eventid, PDO::PARAM_INT); |
||||||
|
|
||||||
|
$stmt->execute(); |
||||||
|
|
||||||
|
header("Location: " . getFullPath("event.php?message=Event+deleted.")); |
||||||
|
exit; |
||||||
|
} |
||||||
|
catch (PDOException $e) { |
||||||
|
die("sql exception: " . $e->getMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
else if ($action == "edit") { |
||||||
|
try { |
||||||
|
$stmt = $smarty->dbh()->prepare("SELECT description, eventdate, recurring, userid FROM {$opt["table_prefix"]}events WHERE eventid = ?"); |
||||||
|
$stmt->bindParam(1, $eventid, PDO::PARAM_INT); |
||||||
|
|
||||||
|
$stmt->execute(); |
||||||
|
|
||||||
|
// we know this will work, see above. |
||||||
|
$row = $stmt->fetch(); |
||||||
|
$description = $row["description"]; |
||||||
|
$eventdate = new DateTime($row["eventdate"]); |
||||||
|
$recurring = $row["recurring"]; |
||||||
|
$systemevent = ($row["userid"] == ""); |
||||||
|
} |
||||||
|
catch (PDOException $e) { |
||||||
|
die("sql exception: " . $e->getMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
else if ($action == "") { |
||||||
|
$description = ""; |
||||||
|
$eventdate = new DateTime(); |
||||||
|
$recurring = 1; |
||||||
|
$systemevent = 0; |
||||||
|
} |
||||||
|
else if ($action == "insert") { |
||||||
|
if (!$haserror) { |
||||||
|
try { |
||||||
|
$stmt = $smarty->dbh()->prepare("INSERT INTO {$opt["table_prefix"]}events(userid,description,eventdate,recurring) VALUES(?, ?, ?, ?)"); |
||||||
|
$stmt->bindValue(1, $systemevent ? NULL : $userid, PDO::PARAM_BOOL); |
||||||
|
$stmt->bindParam(2, $description, PDO::PARAM_STR); |
||||||
|
$stmt->bindValue(3, $eventdate->format("Y-m-d"), PDO::PARAM_STR); |
||||||
|
$stmt->bindParam(4, $recurring, PDO::PARAM_BOOL); |
||||||
|
|
||||||
|
$stmt->execute(); |
||||||
|
|
||||||
|
header("Location: " . getFullPath("event.php?message=Event+added.")); |
||||||
|
exit; |
||||||
|
} |
||||||
|
catch (PDOException $e) { |
||||||
|
die("sql exception: " . $e->getMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
else if ($action == "update") { |
||||||
|
if (!$haserror) { |
||||||
|
try { |
||||||
|
$stmt = $smarty->dbh()->prepare("UPDATE {$opt["table_prefix"]}events SET " . |
||||||
|
"userid = ?, " . |
||||||
|
"description = ?, " . |
||||||
|
"eventdate = ?, " . |
||||||
|
"recurring = ? " . |
||||||
|
"WHERE eventid = ?"); |
||||||
|
$stmt->bindValue(1, $systemevent ? NULL : $userid, PDO::PARAM_BOOL); |
||||||
|
$stmt->bindParam(2, $description, PDO::PARAM_STR); |
||||||
|
$stmt->bindValue(3, $eventdate->format("Y-m-d"), PDO::PARAM_STR); |
||||||
|
$stmt->bindParam(4, $recurring, PDO::PARAM_BOOL); |
||||||
|
$stmt->bindParam(5, $eventid, PDO::PARAM_INT); |
||||||
|
|
||||||
|
$stmt->execute(); |
||||||
|
|
||||||
|
header("Location: " . getFullPath("event.php?message=Event+updated.")); |
||||||
|
exit; |
||||||
|
} |
||||||
|
catch (PDOException $e) { |
||||||
|
die("sql exception: " . $e->getMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
else { |
||||||
|
die("Unknown verb."); |
||||||
|
} |
||||||
|
|
||||||
|
try { |
||||||
|
$query = "SELECT eventid, userid, description, eventdate, recurring " . |
||||||
|
"FROM {$opt["table_prefix"]}events " . |
||||||
|
"WHERE userid = ?"; |
||||||
|
if ($_SESSION["admin"] == 1) |
||||||
|
$query .= " OR userid IS NULL"; // add in system events |
||||||
|
$query .= " ORDER BY userid, eventdate"; |
||||||
|
$stmt = $smarty->dbh()->prepare($query); |
||||||
|
$stmt->bindParam(1, $userid, PDO::PARAM_INT); |
||||||
|
|
||||||
|
$stmt->execute(); |
||||||
|
|
||||||
|
$events = array(); |
||||||
|
while ($row = $stmt->fetch()) { |
||||||
|
try { |
||||||
|
$eventDateTime = new DateTime($row['eventdate']); |
||||||
|
} |
||||||
|
catch (Exception $e) { |
||||||
|
die("There was an error with an event with datetime " . $row['eventdate']); |
||||||
|
} |
||||||
|
$row['eventdate'] = $eventDateTime->format($opt["date_format"]); |
||||||
|
$events[] = $row; |
||||||
|
} |
||||||
|
|
||||||
|
if (isset($message)) { |
||||||
|
$smarty->assign('message', $message); |
||||||
|
} |
||||||
|
$smarty->assign('action', $action); |
||||||
|
$smarty->assign('haserror', isset($haserror) ? $haserror : false); |
||||||
|
$smarty->assign('events', $events); |
||||||
|
$smarty->assign('eventdate', $eventdate->format($opt["date_format"])); |
||||||
|
if (isset($eventdate_error)) { |
||||||
|
$smarty->assign('eventdate_error', $eventdate_error); |
||||||
|
} |
||||||
|
$smarty->assign('description', $description); |
||||||
|
if (isset($description_error)) { |
||||||
|
$smarty->assign('description_error', $description_error); |
||||||
|
} |
||||||
|
$smarty->assign('recurring', $recurring); |
||||||
|
$smarty->assign('systemevent', $systemevent); |
||||||
|
if (isset($eventid)) { |
||||||
|
$smarty->assign('eventid', $eventid); |
||||||
|
} |
||||||
|
$smarty->assign('userid', $userid); |
||||||
|
$smarty->display('event.tpl'); |
||||||
|
} |
||||||
|
catch (PDOException $e) { |
||||||
|
die("sql exception: " . $e->getMessage()); |
||||||
|
} |
||||||
|
?> |
@ -0,0 +1,193 @@ |
|||||||
|
<?php |
||||||
|
// This program is free software; you can redistribute it and/or modify |
||||||
|
// it under the terms of the GNU General Public License as published by |
||||||
|
// the Free Software Foundation; either version 2 of the License, or |
||||||
|
// (at your option) any later version. |
||||||
|
|
||||||
|
// This program 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 General Public License for more details. |
||||||
|
|
||||||
|
// You should have received a copy of the GNU General Public License |
||||||
|
// along with this program; if not, write to the Free Software |
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
|
||||||
|
require_once(dirname(__FILE__) . "/includes/funcLib.php"); |
||||||
|
require_once(dirname(__FILE__) . "/includes/MySmarty.class.php"); |
||||||
|
$smarty = new MySmarty(); |
||||||
|
$opt = $smarty->opt(); |
||||||
|
|
||||||
|
session_start(); |
||||||
|
if (!isset($_SESSION["userid"])) { |
||||||
|
header("Location: " . getFullPath("login.php")); |
||||||
|
exit; |
||||||
|
} |
||||||
|
else if ($_SESSION["admin"] != 1) { |
||||||
|
echo "You don't have admin privileges."; |
||||||
|
exit; |
||||||
|
} |
||||||
|
else { |
||||||
|
$userid = $_SESSION["userid"]; |
||||||
|
} |
||||||
|
if (!empty($_GET["message"])) { |
||||||
|
$message = $_GET["message"]; |
||||||
|
} |
||||||
|
|
||||||
|
$action = empty($_GET["action"]) ? "" : $_GET["action"]; |
||||||
|
|
||||||
|
if (!empty($_GET["familyid"])) |
||||||
|
$familyid = (int) $_GET["familyid"]; |
||||||
|
|
||||||
|
if ($action == "insert" || $action == "update") { |
||||||
|
/* validate the data. */ |
||||||
|
$familyname = trim($_GET["familyname"]); |
||||||
|
|
||||||
|
$haserror = false; |
||||||
|
if ($familyname == "") { |
||||||
|
$haserror = true; |
||||||
|
$familyname_error = "A family name is required."; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if ($action == "delete") { |
||||||
|
try { |
||||||
|
/* first, delete all memberships for this family. */ |
||||||
|
$stmt = $smarty->dbh()->prepare("DELETE FROM {$opt["table_prefix"]}memberships WHERE familyid = ?"); |
||||||
|
$stmt->bindParam(1, $familyid, PDO::PARAM_INT); |
||||||
|
$stmt->execute(); |
||||||
|
|
||||||
|
$stmt = $smarty->dbh()->prepare("DELETE FROM {$opt["table_prefix"]}families WHERE familyid = ?"); |
||||||
|
$stmt->bindValue(1, $familyid, PDO::PARAM_INT); |
||||||
|
$stmt->execute(); |
||||||
|
|
||||||
|
header("Location: " . getFullPath("families.php?message=Family+deleted.")); |
||||||
|
exit; |
||||||
|
} |
||||||
|
catch (PDOException $e) { |
||||||
|
die("sql exception: " . $e->getMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
else if ($action == "edit") { |
||||||
|
try { |
||||||
|
$stmt = $smarty->dbh()->prepare("SELECT familyname FROM {$opt["table_prefix"]}families WHERE familyid = ?"); |
||||||
|
$stmt->bindValue(1, $familyid, PDO::PARAM_INT); |
||||||
|
$stmt->execute(); |
||||||
|
if ($row = $stmt->fetch()) { |
||||||
|
$familyname = $row["familyname"]; |
||||||
|
} |
||||||
|
else { |
||||||
|
die("family doesn't exist."); |
||||||
|
} |
||||||
|
} |
||||||
|
catch (PDOException $e) { |
||||||
|
die("sql exception: " . $e->getMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
else if ($action == "") { |
||||||
|
$familyname = ""; |
||||||
|
} |
||||||
|
else if ($action == "insert") { |
||||||
|
if (!$haserror) { |
||||||
|
try { |
||||||
|
$stmt = $smarty->dbh()->prepare("INSERT INTO {$opt["table_prefix"]}families(familyid,familyname) VALUES(NULL, ?)"); |
||||||
|
$stmt->bindParam(1, $familyname, PDO::PARAM_STR); |
||||||
|
$stmt->execute(); |
||||||
|
} |
||||||
|
catch (PDOException $e) { |
||||||
|
die("sql exception: " . $e->getMessage()); |
||||||
|
} |
||||||
|
|
||||||
|
header("Location: " . getFullPath("families.php?message=Family+added.")); |
||||||
|
exit; |
||||||
|
} |
||||||
|
} |
||||||
|
else if ($action == "update") { |
||||||
|
if (!$haserror) { |
||||||
|
try { |
||||||
|
$stmt = $smarty->dbh()->prepare("UPDATE {$opt["table_prefix"]}families " . |
||||||
|
"SET familyname = ? " . |
||||||
|
"WHERE familyid = ?"); |
||||||
|
$stmt->bindParam(1, $familyname, PDO::PARAM_STR); |
||||||
|
$stmt->bindValue(2, $familyid, PDO::PARAM_INT); |
||||||
|
$stmt->execute(); |
||||||
|
} |
||||||
|
catch (PDOException $e) { |
||||||
|
die("sql exception: " . $e->getMessage()); |
||||||
|
} |
||||||
|
|
||||||
|
header("Location: " . getFullPath("families.php?message=Family+updated.")); |
||||||
|
exit; |
||||||
|
} |
||||||
|
} |
||||||
|
else if ($action == "members") { |
||||||
|
$members = isset($_GET["members"]) ? $_GET["members"] : array(); |
||||||
|
try { |
||||||
|
/* first, delete all memberships for this family. */ |
||||||
|
$stmt = $smarty->dbh()->prepare("DELETE FROM {$opt["table_prefix"]}memberships WHERE familyid = ?"); |
||||||
|
$stmt->bindValue(1, $familyid, PDO::PARAM_INT); |
||||||
|
$stmt->execute(); |
||||||
|
|
||||||
|
/* now add them back. */ |
||||||
|
foreach ($members as $userid) { |
||||||
|
$stmt = $smarty->dbh()->prepare("INSERT INTO {$opt["table_prefix"]}memberships(userid,familyid) VALUES(?, ?)"); |
||||||
|
$stmt->bindParam(1, $userid, PDO::PARAM_INT); |
||||||
|
$stmt->bindParam(2, $familyid, PDO::PARAM_INT); |
||||||
|
$stmt->execute(); |
||||||
|
} |
||||||
|
} |
||||||
|
catch (PDOException $e) { |
||||||
|
die("sql exception: " . $e->getMessage()); |
||||||
|
} |
||||||
|
|
||||||
|
header("Location: " . getFullPath("families.php?message=Members+changed.")); |
||||||
|
exit; |
||||||
|
} |
||||||
|
else { |
||||||
|
die("Unknown verb."); |
||||||
|
} |
||||||
|
|
||||||
|
try { |
||||||
|
$stmt = $smarty->dbh()->prepare("SELECT f.familyid, familyname, COUNT(userid) AS members " . |
||||||
|
"FROM {$opt["table_prefix"]}families f " . |
||||||
|
"LEFT OUTER JOIN {$opt["table_prefix"]}memberships m ON m.familyid = f.familyid " . |
||||||
|
"GROUP BY f.familyid " . |
||||||
|
"ORDER BY familyname"); |
||||||
|
$stmt->execute(); |
||||||
|
$families = array(); |
||||||
|
while ($row = $stmt->fetch()) { |
||||||
|
$families[] = $row; |
||||||
|
} |
||||||
|
|
||||||
|
if ($action == "edit") { |
||||||
|
$stmt = $smarty->dbh()->prepare("SELECT u.userid, u.fullname, m.familyid FROM {$opt["table_prefix"]}users u " . |
||||||
|
"LEFT OUTER JOIN {$opt["table_prefix"]}memberships m ON m.userid = u.userid AND m.familyid = ? " . |
||||||
|
"ORDER BY u.fullname"); |
||||||
|
$stmt->bindParam(1, $familyid, PDO::PARAM_INT); |
||||||
|
$stmt->execute(); |
||||||
|
$nonmembers = array(); |
||||||
|
while ($row = $stmt->fetch()) { |
||||||
|
$nonmembers[] = $row; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
$smarty->assign('action', $action); |
||||||
|
$smarty->assign('haserror', $haserror); |
||||||
|
if (isset($familyname_error)) { |
||||||
|
$smarty->assign('familyname_error', $familyname_error); |
||||||
|
} |
||||||
|
$smarty->assign('families', $families); |
||||||
|
$smarty->assign('familyid', $familyid); |
||||||
|
$smarty->assign('familyname', $familyname); |
||||||
|
if (isset($nonmembers)) { |
||||||
|
$smarty->assign('nonmembers', $nonmembers); |
||||||
|
} |
||||||
|
if (isset($message)) { |
||||||
|
$smarty->assign('message', $message); |
||||||
|
} |
||||||
|
$smarty->display('families.tpl'); |
||||||
|
} |
||||||
|
catch (PDOException $e) { |
||||||
|
die("sql exception: " . $e->getMessage()); |
||||||
|
} |
||||||
|
?> |
@ -0,0 +1,69 @@ |
|||||||
|
<?php |
||||||
|
/// This program is free software; you can redistribute it and/or modify |
||||||
|
// it under the terms of the GNU General Public License as published by |
||||||
|
// the Free Software Foundation; either version 2 of the License, or |
||||||
|
// (at your option) any later version. |
||||||
|
|
||||||
|
// This program 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 General Public License for more details. |
||||||
|
|
||||||
|
// You should have received a copy of the GNU General Public License |
||||||
|
// along with this program; if not, write to the Free Software |
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
|
||||||
|
require_once(dirname(__FILE__) . "/includes/funcLib.php"); |
||||||
|
require_once(dirname(__FILE__) . "/includes/MySmarty.class.php"); |
||||||
|
$smarty = new MySmarty(); |
||||||
|
$opt = $smarty->opt(); |
||||||
|
|
||||||
|
if (isset($_POST["action"]) && $_POST["action"] == "forgot") { |
||||||
|
$username = $_POST["username"]; |
||||||
|
|
||||||
|
try { |
||||||
|
// make sure that username is valid |
||||||
|
$stmt = $smarty->dbh()->prepare("SELECT email FROM {$opt["table_prefix"]}users WHERE username = ?"); |
||||||
|
$stmt->bindParam(1, $username, PDO::PARAM_STR); |
||||||
|
|
||||||
|
$stmt->execute(); |
||||||
|
if ($row = $stmt->fetch()) { |
||||||
|
$email = $row["email"]; |
||||||
|
|
||||||
|
if ($email == "") |
||||||
|
$error = "The username '" . $username . "' does not have an e-mail address, so the password could not be sent."; |
||||||
|
else { |
||||||
|
$pwd = generatePassword($opt); |
||||||
|
$stmt = $smarty->dbh()->prepare("UPDATE {$opt["table_prefix"]}users SET password = {$opt["password_hasher"]}(?) WHERE username = ?"); |
||||||
|
$stmt->bindParam(1, $pwd, PDO::PARAM_STR); |
||||||
|
$stmt->bindParam(2, $username, PDO::PARAM_STR); |
||||||
|
|
||||||
|
$stmt->execute(); |
||||||
|
mail( |
||||||
|
$email, |
||||||
|
"Gift Registry password reset", |
||||||
|
"Your Gift Registry account information:\r\n" . |
||||||
|
"Your username is '" . $username . "' and your new password is '$pwd'.", |
||||||
|
"From: {$opt["email_from"]}\r\nReply-To: {$opt["email_reply_to"]}\r\nX-Mailer: {$opt["email_xmailer"]}\r\n" |
||||||
|
) or die("Mail not accepted for $email"); |
||||||
|
} |
||||||
|
} |
||||||
|
else { |
||||||
|
$error = "The username '" . $username . "' could not be found."; |
||||||
|
} |
||||||
|
|
||||||
|
if (!empty($error)) { |
||||||
|
$smarty->assign('error', $error); |
||||||
|
} |
||||||
|
$smarty->assign('action', $_POST["action"]); |
||||||
|
$smarty->assign('username', $username); |
||||||
|
$smarty->display('forgot.tpl'); |
||||||
|
} |
||||||
|
catch (PDOException $e) { |
||||||
|
die("sql exception: " . $e->getMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
else { |
||||||
|
$smarty->display('forgot.tpl'); |
||||||
|
} |
||||||
|
?> |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 150 B |
After Width: | Height: | Size: 178 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.1 KiB |
@ -0,0 +1,36 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
define('SMARTY_DIR', dirname(__FILE__) . "/Smarty-3.1.12/libs/"); |
||||||
|
require_once(SMARTY_DIR . "Smarty.class.php"); |
||||||
|
require_once(dirname(__FILE__) . "/config.php"); |
||||||
|
|
||||||
|
class MySmarty extends Smarty { |
||||||
|
public function __construct() { |
||||||
|
parent::__construct(); |
||||||
|
|
||||||
|
date_default_timezone_set("GMT+0"); |
||||||
|
} |
||||||
|
|
||||||
|
public function dbh() { |
||||||
|
$opt = $this->opt(); |
||||||
|
return new PDO( |
||||||
|
$opt["pdo_connection_string"], |
||||||
|
$opt["pdo_username"], |
||||||
|
$opt["pdo_password"]); |
||||||
|
} |
||||||
|
|
||||||
|
public function opt() { |
||||||
|
static $opt; |
||||||
|
if (!isset($opt)) { |
||||||
|
$opt = getGlobalOptions(); |
||||||
|
} |
||||||
|
return $opt; |
||||||
|
} |
||||||
|
|
||||||
|
public function display($template, $cache_id = "", $compile_id = "") { |
||||||
|
parent::assign('isadmin', isset($_SESSION['admin']) ? $_SESSION['admin'] : false); |
||||||
|
parent::assign('opt', $this->opt()); |
||||||
|
parent::display($template, $cache_id, $compile_id); |
||||||
|
} |
||||||
|
} |
||||||
|
?> |
@ -0,0 +1,165 @@ |
|||||||
|
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. |
@ -0,0 +1,574 @@ |
|||||||
|
Smarty 3.1.12 |
||||||
|
|
||||||
|
Author: Monte Ohrt <monte at ohrt dot com > |
||||||
|
Author: Uwe Tews |
||||||
|
|
||||||
|
AN INTRODUCTION TO SMARTY 3 |
||||||
|
|
||||||
|
NOTICE FOR 3.1 release: |
||||||
|
|
||||||
|
Please see the SMARTY_3.1_NOTES.txt file that comes with the distribution. |
||||||
|
|
||||||
|
NOTICE for 3.0.5 release: |
||||||
|
|
||||||
|
Smarty now follows the PHP error_reporting level by default. If PHP does not mask E_NOTICE and you try to access an unset template variable, you will now get an E_NOTICE warning. To revert to the old behavior: |
||||||
|
|
||||||
|
$smarty->error_reporting = E_ALL & ~E_NOTICE; |
||||||
|
|
||||||
|
NOTICE for 3.0 release: |
||||||
|
|
||||||
|
IMPORTANT: Some API adjustments have been made between the RC4 and 3.0 release. |
||||||
|
We felt it is better to make these now instead of after a 3.0 release, then have to |
||||||
|
immediately deprecate APIs in 3.1. Online documentation has been updated |
||||||
|
to reflect these changes. Specifically: |
||||||
|
|
||||||
|
---- API CHANGES RC4 -> 3.0 ---- |
||||||
|
|
||||||
|
$smarty->register->* |
||||||
|
$smarty->unregister->* |
||||||
|
$smarty->utility->* |
||||||
|
$samrty->cache->* |
||||||
|
|
||||||
|
Have all been changed to local method calls such as: |
||||||
|
|
||||||
|
$smarty->clearAllCache() |
||||||
|
$smarty->registerFoo() |
||||||
|
$smarty->unregisterFoo() |
||||||
|
$smarty->testInstall() |
||||||
|
etc. |
||||||
|
|
||||||
|
Registration of function, block, compiler, and modifier plugins have been |
||||||
|
consolidated under two API calls: |
||||||
|
|
||||||
|
$smarty->registerPlugin(...) |
||||||
|
$smarty->unregisterPlugin(...) |
||||||
|
|
||||||
|
Registration of pre, post, output and variable filters have been |
||||||
|
consolidated under two API calls: |
||||||
|
|
||||||
|
$smarty->registerFilter(...) |
||||||
|
$smarty->unregisterFilter(...) |
||||||
|
|
||||||
|
Please refer to the online documentation for all specific changes: |
||||||
|
|
||||||
|
http://www.smarty.net/documentation |
||||||
|
|
||||||
|
---- |
||||||
|
|
||||||
|
The Smarty 3 API has been refactored to a syntax geared |
||||||
|
for consistency and modularity. The Smarty 2 API syntax is still supported, but |
||||||
|
will throw a deprecation notice. You can disable the notices, but it is highly |
||||||
|
recommended to adjust your syntax to Smarty 3, as the Smarty 2 syntax must run |
||||||
|
through an extra rerouting wrapper. |
||||||
|
|
||||||
|
Basically, all Smarty methods now follow the "fooBarBaz" camel case syntax. Also, |
||||||
|
all Smarty properties now have getters and setters. So for example, the property |
||||||
|
$smarty->cache_dir can be set with $smarty->setCacheDir('foo/') and can be |
||||||
|
retrieved with $smarty->getCacheDir(). |
||||||
|
|
||||||
|
Some of the Smarty 3 APIs have been revoked such as the "is*" methods that were |
||||||
|
just duplicate functions of the now available "get*" methods. |
||||||
|
|
||||||
|
Here is a rundown of the Smarty 3 API: |
||||||
|
|
||||||
|
$smarty->fetch($template, $cache_id = null, $compile_id = null, $parent = null) |
||||||
|
$smarty->display($template, $cache_id = null, $compile_id = null, $parent = null) |
||||||
|
$smarty->isCached($template, $cache_id = null, $compile_id = null) |
||||||
|
$smarty->createData($parent = null) |
||||||
|
$smarty->createTemplate($template, $cache_id = null, $compile_id = null, $parent = null) |
||||||
|
$smarty->enableSecurity() |
||||||
|
$smarty->disableSecurity() |
||||||
|
$smarty->setTemplateDir($template_dir) |
||||||
|
$smarty->addTemplateDir($template_dir) |
||||||
|
$smarty->templateExists($resource_name) |
||||||
|
$smarty->loadPlugin($plugin_name, $check = true) |
||||||
|
$smarty->loadFilter($type, $name) |
||||||
|
$smarty->setExceptionHandler($handler) |
||||||
|
$smarty->addPluginsDir($plugins_dir) |
||||||
|
$smarty->getGlobal($varname = null) |
||||||
|
$smarty->getRegisteredObject($name) |
||||||
|
$smarty->getDebugTemplate() |
||||||
|
$smarty->setDebugTemplate($tpl_name) |
||||||
|
$smarty->assign($tpl_var, $value = null, $nocache = false) |
||||||
|
$smarty->assignGlobal($varname, $value = null, $nocache = false) |
||||||
|
$smarty->assignByRef($tpl_var, &$value, $nocache = false) |
||||||
|
$smarty->append($tpl_var, $value = null, $merge = false, $nocache = false) |
||||||
|
$smarty->appendByRef($tpl_var, &$value, $merge = false) |
||||||
|
$smarty->clearAssign($tpl_var) |
||||||
|
$smarty->clearAllAssign() |
||||||
|
$smarty->configLoad($config_file, $sections = null) |
||||||
|
$smarty->getVariable($variable, $_ptr = null, $search_parents = true, $error_enable = true) |
||||||
|
$smarty->getConfigVariable($variable) |
||||||
|
$smarty->getStreamVariable($variable) |
||||||
|
$smarty->getConfigVars($varname = null) |
||||||
|
$smarty->clearConfig($varname = null) |
||||||
|
$smarty->getTemplateVars($varname = null, $_ptr = null, $search_parents = true) |
||||||
|
$smarty->clearAllCache($exp_time = null, $type = null) |
||||||
|
$smarty->clearCache($template_name, $cache_id = null, $compile_id = null, $exp_time = null, $type = null) |
||||||
|
|
||||||
|
$smarty->registerPlugin($type, $tag, $callback, $cacheable = true, $cache_attr = array()) |
||||||
|
|
||||||
|
$smarty->registerObject($object_name, $object_impl, $allowed = array(), $smarty_args = true, $block_methods = array()) |
||||||
|
|
||||||
|
$smarty->registerFilter($type, $function_name) |
||||||
|
$smarty->registerResource($resource_type, $function_names) |
||||||
|
$smarty->registerDefaultPluginHandler($function_name) |
||||||
|
$smarty->registerDefaultTemplateHandler($function_name) |
||||||
|
|
||||||
|
$smarty->unregisterPlugin($type, $tag) |
||||||
|
$smarty->unregisterObject($object_name) |
||||||
|
$smarty->unregisterFilter($type, $function_name) |
||||||
|
$smarty->unregisterResource($resource_type) |
||||||
|
|
||||||
|
$smarty->compileAllTemplates($extention = '.tpl', $force_compile = false, $time_limit = 0, $max_errors = null) |
||||||
|
$smarty->clearCompiledTemplate($resource_name = null, $compile_id = null, $exp_time = null) |
||||||
|
$smarty->testInstall() |
||||||
|
|
||||||
|
// then all the getters/setters, available for all properties. Here are a few: |
||||||
|
|
||||||
|
$caching = $smarty->getCaching(); // get $smarty->caching |
||||||
|
$smarty->setCaching(true); // set $smarty->caching |
||||||
|
$smarty->setDeprecationNotices(false); // set $smarty->deprecation_notices |
||||||
|
$smarty->setCacheId($id); // set $smarty->cache_id |
||||||
|
$debugging = $smarty->getDebugging(); // get $smarty->debugging |
||||||
|
|
||||||
|
|
||||||
|
FILE STRUCTURE |
||||||
|
|
||||||
|
The Smarty 3 file structure is similar to Smarty 2: |
||||||
|
|
||||||
|
/libs/ |
||||||
|
Smarty.class.php |
||||||
|
/libs/sysplugins/ |
||||||
|
internal.* |
||||||
|
/libs/plugins/ |
||||||
|
function.mailto.php |
||||||
|
modifier.escape.php |
||||||
|
... |
||||||
|
|
||||||
|
A lot of Smarty 3 core functionality lies in the sysplugins directory; you do |
||||||
|
not need to change any files here. The /libs/plugins/ folder is where Smarty |
||||||
|
plugins are located. You can add your own here, or create a separate plugin |
||||||
|
directory, just the same as Smarty 2. You will still need to create your own |
||||||
|
/cache/, /templates/, /templates_c/, /configs/ folders. Be sure /cache/ and |
||||||
|
/templates_c/ are writable. |
||||||
|
|
||||||
|
The typical way to use Smarty 3 should also look familiar: |
||||||
|
|
||||||
|
require('Smarty.class.php'); |
||||||
|
$smarty = new Smarty; |
||||||
|
$smarty->assign('foo','bar'); |
||||||
|
$smarty->display('index.tpl'); |
||||||
|
|
||||||
|
|
||||||
|
However, Smarty 3 works completely different on the inside. Smarty 3 is mostly |
||||||
|
backward compatible with Smarty 2, except for the following items: |
||||||
|
|
||||||
|
*) Smarty 3 is PHP 5 only. It will not work with PHP 4. |
||||||
|
*) The {php} tag is disabled by default. Enable with $smarty->allow_php_tag=true. |
||||||
|
*) Delimiters surrounded by whitespace are no longer treated as Smarty tags. |
||||||
|
Therefore, { foo } will not compile as a tag, you must use {foo}. This change |
||||||
|
Makes Javascript/CSS easier to work with, eliminating the need for {literal}. |
||||||
|
This can be disabled by setting $smarty->auto_literal = false; |
||||||
|
*) The Smarty 3 API is a bit different. Many Smarty 2 API calls are deprecated |
||||||
|
but still work. You will want to update your calls to Smarty 3 for maximum |
||||||
|
efficiency. |
||||||
|
|
||||||
|
|
||||||
|
There are many things that are new to Smarty 3. Here are the notable items: |
||||||
|
|
||||||
|
LEXER/PARSER |
||||||
|
============ |
||||||
|
|
||||||
|
Smarty 3 now uses a lexing tokenizer for its parser/compiler. Basically, this |
||||||
|
means Smarty has some syntax additions that make life easier such as in-template |
||||||
|
math, shorter/intuitive function parameter options, infinite function recursion, |
||||||
|
more accurate error handling, etc. |
||||||
|
|
||||||
|
|
||||||
|
WHAT IS NEW IN SMARTY TEMPLATE SYNTAX |
||||||
|
===================================== |
||||||
|
|
||||||
|
Smarty 3 allows expressions almost anywhere. Expressions can include PHP |
||||||
|
functions as long as they are not disabled by the security policy, object |
||||||
|
methods and properties, etc. The {math} plugin is no longer necessary but |
||||||
|
is still supported for BC. |
||||||
|
|
||||||
|
Examples: |
||||||
|
{$x+$y} will output the sum of x and y. |
||||||
|
{$foo = strlen($bar)} function in assignment |
||||||
|
{assign var=foo value= $x+$y} in attributes |
||||||
|
{$foo = myfunct( ($x+$y)*3 )} as function parameter |
||||||
|
{$foo[$x+3]} as array index |
||||||
|
|
||||||
|
Smarty tags can be used as values within other tags. |
||||||
|
Example: {$foo={counter}+3} |
||||||
|
|
||||||
|
Smarty tags can also be used inside double quoted strings. |
||||||
|
Example: {$foo="this is message {counter}"} |
||||||
|
|
||||||
|
You can define arrays within templates. |
||||||
|
Examples: |
||||||
|
{assign var=foo value=[1,2,3]} |
||||||
|
{assign var=foo value=['y'=>'yellow','b'=>'blue']} |
||||||
|
Arrays can be nested. |
||||||
|
{assign var=foo value=[1,[9,8],3]} |
||||||
|
|
||||||
|
There is a new short syntax supported for assigning variables. |
||||||
|
Example: {$foo=$bar+2} |
||||||
|
|
||||||
|
You can assign a value to a specific array element. If the variable exists but |
||||||
|
is not an array, it is converted to an array before the new values are assigned. |
||||||
|
Examples: |
||||||
|
{$foo['bar']=1} |
||||||
|
{$foo['bar']['blar']=1} |
||||||
|
|
||||||
|
You can append values to an array. If the variable exists but is not an array, |
||||||
|
it is converted to an array before the new values are assigned. |
||||||
|
Example: {$foo[]=1} |
||||||
|
|
||||||
|
You can use a PHP-like syntax for accessing array elements, as well as the |
||||||
|
original "dot" notation. |
||||||
|
Examples: |
||||||
|
{$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! |
||||||
|
|
||||||
|
The original "dot" notation stays, and with improvements. |
||||||
|
Examples: |
||||||
|
{$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 |
||||||
|
|
||||||
|
note that { and } are used to address ambiguties when nesting the dot syntax. |
||||||
|
|
||||||
|
Variable names themselves can be variable and contain expressions. |
||||||
|
Examples: |
||||||
|
$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 method chaining is implemented. |
||||||
|
Example: {$object->method1($x)->method2($y)} |
||||||
|
|
||||||
|
{for} tag added for looping (replacement for {section} tag): |
||||||
|
{for $x=0, $y=count($foo); $x<$y; $x++} .... {/for} |
||||||
|
Any number of statements can be used separated by comma as the first |
||||||
|
inital expression at {for}. |
||||||
|
|
||||||
|
{for $x = $start to $end step $step} ... {/for}is in the SVN now . |
||||||
|
You can use also |
||||||
|
{for $x = $start to $end} ... {/for} |
||||||
|
In this case the step value will be automaticall 1 or -1 depending on the start and end values. |
||||||
|
Instead of $start and $end you can use any valid expression. |
||||||
|
Inside the loop the following special vars can be accessed: |
||||||
|
$x@iteration = number of iteration |
||||||
|
$x@total = total number of iterations |
||||||
|
$x@first = true on first iteration |
||||||
|
$x@last = true on last iteration |
||||||
|
|
||||||
|
|
||||||
|
The Smarty 2 {section} syntax is still supported. |
||||||
|
|
||||||
|
New shorter {foreach} syntax to loop over an array. |
||||||
|
Example: {foreach $myarray as $var}...{/foreach} |
||||||
|
|
||||||
|
Within the foreach loop, properties are access via: |
||||||
|
|
||||||
|
$var@key foreach $var array key |
||||||
|
$var@iteration foreach current iteration count (1,2,3...) |
||||||
|
$var@index foreach current index count (0,1,2...) |
||||||
|
$var@total foreach $var array total |
||||||
|
$var@first true on first iteration |
||||||
|
$var@last true on last iteration |
||||||
|
|
||||||
|
The Smarty 2 {foreach} tag syntax is still supported. |
||||||
|
|
||||||
|
NOTE: {$bar[foo]} still indicates a variable inside of a {section} named foo. |
||||||
|
If you want to access an array element with index foo, you must use quotes |
||||||
|
such as {$bar['foo']}, or use the dot syntax {$bar.foo}. |
||||||
|
|
||||||
|
while block tag is now implemented: |
||||||
|
{while $foo}...{/while} |
||||||
|
{while $x lt 10}...{/while} |
||||||
|
|
||||||
|
Direct access to PHP functions: |
||||||
|
Just as you can use PHP functions as modifiers directly, you can now access |
||||||
|
PHP functions directly, provided they are permitted by security settings: |
||||||
|
{time()} |
||||||
|
|
||||||
|
There is a new {function}...{/function} block tag to implement a template function. |
||||||
|
This enables reuse of code sequences like a plugin function. It can call itself recursively. |
||||||
|
Template function must be called with the new {call name=foo...} tag. |
||||||
|
|
||||||
|
Example: |
||||||
|
|
||||||
|
Template file: |
||||||
|
{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} |
||||||
|
|
||||||
|
{$menu = ['item1','item2','item3' => ['item3-1','item3-2','item3-3' => |
||||||
|
['item3-3-1','item3-3-2']],'item4']} |
||||||
|
|
||||||
|
{call name=menu data=$menu} |
||||||
|
|
||||||
|
|
||||||
|
Generated output: |
||||||
|
* item1 |
||||||
|
* item2 |
||||||
|
* item3 |
||||||
|
o item3-1 |
||||||
|
o item3-2 |
||||||
|
o item3-3 |
||||||
|
+ item3-3-1 |
||||||
|
+ item3-3-2 |
||||||
|
* item4 |
||||||
|
|
||||||
|
The function tag itself must have the "name" attribute. This name is the tag |
||||||
|
name when calling the function. The function tag may have any number of |
||||||
|
additional attributes. These will be default settings for local variables. |
||||||
|
|
||||||
|
New {nocache} block function: |
||||||
|
{nocache}...{/nocache} will declare a section of the template to be non-cached |
||||||
|
when template caching is enabled. |
||||||
|
|
||||||
|
New nocache attribute: |
||||||
|
You can declare variable/function output as non-cached with the nocache attribute. |
||||||
|
Examples: |
||||||
|
|
||||||
|
{$foo nocache=true} |
||||||
|
{$foo nocache} /* same */ |
||||||
|
|
||||||
|
{foo bar="baz" nocache=true} |
||||||
|
{foo bar="baz" nocache} /* same */ |
||||||
|
|
||||||
|
{time() nocache=true} |
||||||
|
{time() nocache} /* same */ |
||||||
|
|
||||||
|
Or you can also assign the variable in your script as nocache: |
||||||
|
$smarty->assign('foo',$something,true); // third param is nocache setting |
||||||
|
{$foo} /* non-cached */ |
||||||
|
|
||||||
|
$smarty.current_dir returns the directory name of the current template. |
||||||
|
|
||||||
|
You can use strings directly as templates with the "string" resource type. |
||||||
|
Examples: |
||||||
|
$smarty->display('string:This is my template, {$foo}!'); // php |
||||||
|
{include file="string:This is my template, {$foo}!"} // template |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
VARIABLE SCOPE / VARIABLE STORAGE |
||||||
|
================================= |
||||||
|
|
||||||
|
In Smarty 2, all assigned variables were stored within the Smarty object. |
||||||
|
Therefore, all variables assigned in PHP were accessible by all subsequent |
||||||
|
fetch and display template calls. |
||||||
|
|
||||||
|
In Smarty 3, we have the choice to assign variables to the main Smarty object, |
||||||
|
to user-created data objects, and to user-created template objects. |
||||||
|
These objects can be chained. The object at the end of a chain can access all |
||||||
|
variables belonging to that template and all variables within the parent objects. |
||||||
|
The Smarty object can only be the root of a chain, but a chain can be isolated |
||||||
|
from the Smarty object. |
||||||
|
|
||||||
|
All known Smarty assignment interfaces will work on the data and template objects. |
||||||
|
|
||||||
|
Besides the above mentioned objects, there is also a special storage area for |
||||||
|
global variables. |
||||||
|
|
||||||
|
A Smarty data object can be created as follows: |
||||||
|
$data = $smarty->createData(); // create root data object |
||||||
|
$data->assign('foo','bar'); // assign variables as usual |
||||||
|
$data->config_load('my.conf'); // load config file |
||||||
|
|
||||||
|
$data= $smarty->createData($smarty); // create data object having a parent link to |
||||||
|
the Smarty object |
||||||
|
|
||||||
|
$data2= $smarty->createData($data); // create data object having a parent link to |
||||||
|
the $data data object |
||||||
|
|
||||||
|
A template object can be created by using the createTemplate method. It has the |
||||||
|
same parameter assignments as the fetch() or display() method. |
||||||
|
Function definition: |
||||||
|
function createTemplate($template, $cache_id = null, $compile_id = null, $parent = null) |
||||||
|
|
||||||
|
The first parameter can be a template name, a smarty object or a data object. |
||||||
|
|
||||||
|
Examples: |
||||||
|
$tpl = $smarty->createTemplate('mytpl.tpl'); // create template object not linked to any parent |
||||||
|
$tpl->assign('foo','bar'); // directly assign variables |
||||||
|
$tpl->config_load('my.conf'); // load config file |
||||||
|
|
||||||
|
$tpl = $smarty->createTemplate('mytpl.tpl',$smarty); // create template having a parent link to the Smarty object |
||||||
|
$tpl = $smarty->createTemplate('mytpl.tpl',$data); // create template having a parent link to the $data object |
||||||
|
|
||||||
|
The standard fetch() and display() methods will implicitly create a template object. |
||||||
|
If the $parent parameter is not specified in these method calls, the template object |
||||||
|
is will link back to the Smarty object as it's parent. |
||||||
|
|
||||||
|
If a template is called by an {include...} tag from another template, the |
||||||
|
subtemplate links back to the calling template as it's parent. |
||||||
|
|
||||||
|
All variables assigned locally or from a parent template are accessible. If the |
||||||
|
template creates or modifies a variable by using the {assign var=foo...} or |
||||||
|
{$foo=...} tags, these new values are only known locally (local scope). When the |
||||||
|
template exits, none of the new variables or modifications can be seen in the |
||||||
|
parent template(s). This is same behavior as in Smarty 2. |
||||||
|
|
||||||
|
With Smarty 3, we can assign variables with a scope attribute which allows the |
||||||
|
availablility of these new variables or modifications globally (ie in the parent |
||||||
|
templates.) |
||||||
|
|
||||||
|
Possible scopes are local, parent, root and global. |
||||||
|
Examples: |
||||||
|
{assign var=foo value='bar'} // no scope is specified, the default 'local' |
||||||
|
{$foo='bar'} // same, local scope |
||||||
|
{assign var=foo value='bar' scope='local'} // same, local scope |
||||||
|
|
||||||
|
{assign var=foo value='bar' scope='parent'} // Values will be available to the parent object |
||||||
|
{$foo='bar' scope='parent'} // (normally the calling template) |
||||||
|
|
||||||
|
{assign var=foo value='bar' scope='root'} // Values will be exported up to the root object, so they can |
||||||
|
{$foo='bar' scope='root'} // be seen from all templates using the same root. |
||||||
|
|
||||||
|
{assign var=foo value='bar' scope='global'} // Values will be exported to global variable storage, |
||||||
|
{$foo='bar' scope='global'} // they are available to any and all templates. |
||||||
|
|
||||||
|
|
||||||
|
The scope attribute can also be attached to the {include...} tag. In this case, |
||||||
|
the specified scope will be the default scope for all assignments within the |
||||||
|
included template. |
||||||
|
|
||||||
|
|
||||||
|
PLUGINS |
||||||
|
======= |
||||||
|
|
||||||
|
Smarty3 are following the same coding rules as in Smarty2. |
||||||
|
The only difference is that the template object is passed as additional third parameter. |
||||||
|
|
||||||
|
smarty_plugintype_name (array $params, object $smarty, object $template) |
||||||
|
|
||||||
|
The Smarty 2 plugins are still compatible as long as they do not make use of specific Smarty2 internals. |
||||||
|
|
||||||
|
|
||||||
|
TEMPLATE INHERITANCE: |
||||||
|
===================== |
||||||
|
|
||||||
|
With template inheritance you can define blocks, which are areas that can be |
||||||
|
overriden by child templates, so your templates could look like this: |
||||||
|
|
||||||
|
parent.tpl: |
||||||
|
<html> |
||||||
|
<head> |
||||||
|
<title>{block name='title'}My site name{/block}</title> |
||||||
|
</head> |
||||||
|
<body> |
||||||
|
<h1>{block name='page-title'}Default page title{/block}</h1> |
||||||
|
<div id="content"> |
||||||
|
{block name='content'} |
||||||
|
Default content |
||||||
|
{/block} |
||||||
|
</div> |
||||||
|
</body> |
||||||
|
</html> |
||||||
|
|
||||||
|
child.tpl: |
||||||
|
{extends file='parent.tpl'} |
||||||
|
{block name='title'} |
||||||
|
Child title |
||||||
|
{/block} |
||||||
|
|
||||||
|
grandchild.tpl: |
||||||
|
{extends file='child.tpl'} |
||||||
|
{block name='title'}Home - {$smarty.block.parent}{/block} |
||||||
|
{block name='page-title'}My home{/block} |
||||||
|
{block name='content'} |
||||||
|
{foreach $images as $img} |
||||||
|
<img src="{$img.url}" alt="{$img.description}" /> |
||||||
|
{/foreach} |
||||||
|
{/block} |
||||||
|
|
||||||
|
We redefined all the blocks here, however in the title block we used {$smarty.block.parent}, |
||||||
|
which tells Smarty to insert the default content from the parent template in its place. |
||||||
|
The content block was overriden to display the image files, and page-title has also be |
||||||
|
overriden to display a completely different title. |
||||||
|
|
||||||
|
If we render grandchild.tpl we will get this: |
||||||
|
<html> |
||||||
|
<head> |
||||||
|
<title>Home - Child title</title> |
||||||
|
</head> |
||||||
|
<body> |
||||||
|
<h1>My home</h1> |
||||||
|
<div id="content"> |
||||||
|
<img src="/example.jpg" alt="image" /> |
||||||
|
<img src="/example2.jpg" alt="image" /> |
||||||
|
<img src="/example3.jpg" alt="image" /> |
||||||
|
</div> |
||||||
|
</body> |
||||||
|
</html> |
||||||
|
|
||||||
|
NOTE: In the child templates everything outside the {extends} or {block} tag sections |
||||||
|
is ignored. |
||||||
|
|
||||||
|
The inheritance tree can be as big as you want (meaning you can extend a file that |
||||||
|
extends another one that extends another one and so on..), but be aware that all files |
||||||
|
have to be checked for modifications at runtime so the more inheritance the more overhead you add. |
||||||
|
|
||||||
|
Instead of defining the parent/child relationships with the {extends} tag in the child template you |
||||||
|
can use the resource as follow: |
||||||
|
|
||||||
|
$smarty->display('extends:parent.tpl|child.tpl|grandchild.tpl'); |
||||||
|
|
||||||
|
Child {block} tags may optionally have a append or prepend attribute. In this case the parent block content |
||||||
|
is appended or prepended to the child block content. |
||||||
|
|
||||||
|
{block name='title' append} My title {/block} |
||||||
|
|
||||||
|
|
||||||
|
PHP STREAMS: |
||||||
|
============ |
||||||
|
|
||||||
|
(see online documentation) |
||||||
|
|
||||||
|
VARIBLE FILTERS: |
||||||
|
================ |
||||||
|
|
||||||
|
(see online documentation) |
||||||
|
|
||||||
|
|
||||||
|
STATIC CLASS ACCESS AND NAMESPACE SUPPORT |
||||||
|
========================================= |
||||||
|
|
||||||
|
You can register a class with optional namespace for the use in the template like: |
||||||
|
|
||||||
|
$smarty->register->templateClass('foo','name\name2\myclass'); |
||||||
|
|
||||||
|
In the template you can use it like this: |
||||||
|
{foo::method()} etc. |
||||||
|
|
||||||
|
|
||||||
|
======================= |
||||||
|
|
||||||
|
Please look through it and send any questions/suggestions/etc to the forums. |
||||||
|
|
||||||
|
http://www.phpinsider.com/smarty-forum/viewtopic.php?t=14168 |
||||||
|
|
||||||
|
Monte and Uwe |
@ -0,0 +1,109 @@ |
|||||||
|
= Known incompatibilities with Smarty 2 = |
||||||
|
|
||||||
|
== Syntax == |
||||||
|
|
||||||
|
Smarty 3 API has a new syntax. Much of the Smarty 2 syntax is supported |
||||||
|
by a wrapper but deprecated. See the README that comes with Smarty 3 for more |
||||||
|
information. |
||||||
|
|
||||||
|
The {$array|@mod} syntax has always been a bit confusing, where an "@" is required |
||||||
|
to apply a modifier to an array instead of the individual elements. Normally you |
||||||
|
always want the modifier to apply to the variable regardless of its type. In Smarty 3, |
||||||
|
{$array|mod} and {$array|@mod} behave identical. It is safe to drop the "@" and the |
||||||
|
modifier will still apply to the array. If you really want the modifier to apply to |
||||||
|
each array element, you must loop the array in-template, or use a custom modifier that |
||||||
|
supports array iteration. Most smarty functions already escape values where necessary |
||||||
|
such as {html_options} |
||||||
|
|
||||||
|
== PHP Version == |
||||||
|
Smarty 3 is PHP 5 only. It will not work with PHP 4. |
||||||
|
|
||||||
|
== {php} Tag == |
||||||
|
The {php} tag is disabled by default. The use of {php} tags is |
||||||
|
deprecated. It can be enabled with $smarty->allow_php_tag=true. |
||||||
|
|
||||||
|
But if you scatter PHP code which belongs together into several |
||||||
|
{php} tags it may not work any longer. |
||||||
|
|
||||||
|
== Delimiters and whitespace == |
||||||
|
Delimiters surrounded by whitespace are no longer treated as Smarty tags. |
||||||
|
Therefore, { foo } will not compile as a tag, you must use {foo}. This change |
||||||
|
Makes Javascript/CSS easier to work with, eliminating the need for {literal}. |
||||||
|
This can be disabled by setting $smarty->auto_literal = false; |
||||||
|
|
||||||
|
== Unquoted Strings == |
||||||
|
Smarty 2 was a bit more forgiving (and ambiguous) when it comes to unquoted strings |
||||||
|
in parameters. Smarty3 is more restrictive. You can still pass strings without quotes |
||||||
|
so long as they contain no special characters. (anything outside of A-Za-z0-9_) |
||||||
|
|
||||||
|
For example filename strings must be quoted |
||||||
|
<source lang="smarty"> |
||||||
|
{include file='path/foo.tpl'} |
||||||
|
</source> |
||||||
|
|
||||||
|
== Extending the Smarty class == |
||||||
|
Smarty 3 makes use of the __construct method for initialization. If you are extending |
||||||
|
the Smarty class, its constructor is not called implicitly if the your child class defines |
||||||
|
its own constructor. In order to run Smarty's constructor, a call to parent::__construct() |
||||||
|
within your child constructor is required. |
||||||
|
|
||||||
|
<source lang="php"> |
||||||
|
class MySmarty extends Smarty { |
||||||
|
function __construct() { |
||||||
|
parent::__construct(); |
||||||
|
|
||||||
|
// your initialization code goes here |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
</source> |
||||||
|
|
||||||
|
== Autoloader == |
||||||
|
Smarty 3 does register its own autoloader with spl_autoload_register. If your code has |
||||||
|
an existing __autoload function then this function must be explicitly registered on |
||||||
|
the __autoload stack. See http://us3.php.net/manual/en/function.spl-autoload-register.php |
||||||
|
for further details. |
||||||
|
|
||||||
|
== Plugin Filenames == |
||||||
|
Smarty 3 optionally supports the PHP spl_autoloader. The autoloader requires filenames |
||||||
|
to be lower case. Because of this, Smarty plugin file names must also be lowercase. |
||||||
|
In Smarty 2, mixed case file names did work. |
||||||
|
|
||||||
|
== Scope of Special Smarty Variables == |
||||||
|
In Smarty 2 the special Smarty variables $smarty.section... and $smarty.foreach... |
||||||
|
had global scope. If you had loops with the same name in subtemplates you could accidentally |
||||||
|
overwrite values of parent template. |
||||||
|
|
||||||
|
In Smarty 3 these special Smarty variable have only local scope in the template which |
||||||
|
is defining the loop. If you need their value in a subtemplate you have to pass them |
||||||
|
as parameter. |
||||||
|
<source lang="smarty"> |
||||||
|
{include file='path/foo.tpl' index=$smarty.section.foo.index} |
||||||
|
</source> |
||||||
|
|
||||||
|
== SMARTY_RESOURCE_CHAR_SET == |
||||||
|
Smarty 3 sets the constant SMARTY_RESOURCE_CHAR_SET to utf-8 as default template charset. |
||||||
|
This is now used also on modifiers like escape as default charset. If your templates use |
||||||
|
other charsets make sure that you define the constant accordingly. Otherwise you may not |
||||||
|
get any output. |
||||||
|
|
||||||
|
== newline at {if} tags == |
||||||
|
A \n was added to the compiled code of the {if},{else},{elseif},{/if} tags to get output of newlines as expected by the template source. |
||||||
|
If one of the {if} tags is at the line end you will now get a newline in the HTML output. |
||||||
|
|
||||||
|
== trigger_error() == |
||||||
|
The API function trigger_error() has been removed because it did just map to PHP trigger_error. |
||||||
|
However it's still included in the Smarty2 API wrapper. |
||||||
|
|
||||||
|
== Smarty constants == |
||||||
|
The constants |
||||||
|
SMARTY_PHP_PASSTHRU |
||||||
|
SMARTY_PHP_QUOTE |
||||||
|
SMARTY_PHP_REMOVE |
||||||
|
SMARTY_PHP_ALLOW |
||||||
|
have been replaced with class constants |
||||||
|
Smarty::PHP_PASSTHRU |
||||||
|
Smarty::PHP_QUOTE |
||||||
|
Smarty::PHP_REMOVE |
||||||
|
Smarty::PHP_ALLOW |
||||||
|
|
@ -0,0 +1,24 @@ |
|||||||
|
== Smarty2 backward compatibility == |
||||||
|
All Smarty2 specific API functions and deprecated functionallity has been moved |
||||||
|
to the SmartyBC class. |
||||||
|
|
||||||
|
== {php} Tag == |
||||||
|
The {php} tag is no longer available in the standard Smarty calls. |
||||||
|
The use of {php} tags is deprecated and only available in the SmartyBC class. |
||||||
|
|
||||||
|
== {include_php} Tag == |
||||||
|
The {include_php} tag is no longer available in the standard Smarty calls. |
||||||
|
The use of {include_php} tags is deprecated and only available in the SmartyBC class. |
||||||
|
|
||||||
|
== php template resource == |
||||||
|
The support of the php template resource is removed. |
||||||
|
|
||||||
|
== $cache_dir, $compile_dir, $config_dir, $template_dir access == |
||||||
|
The mentioned properties can't be accessed directly any longer. You must use |
||||||
|
corresponding getter/setters like addConfigDir(), setConfigDir(), getConfigDir() |
||||||
|
|
||||||
|
== obsolete Smarty class properties == |
||||||
|
The following no longer used properties are removed: |
||||||
|
$allow_php_tag |
||||||
|
$allow_php_template |
||||||
|
$deprecation_notices |
@ -0,0 +1,306 @@ |
|||||||
|
Smarty 3.1 Notes |
||||||
|
================ |
||||||
|
|
||||||
|
Smarty 3.1 is a departure from 2.0 compatibility. Most notably, all |
||||||
|
backward compatibility has been moved to a separate class file named |
||||||
|
SmartyBC.class.php. If you require compatibility with 2.0, you will |
||||||
|
need to use this class. |
||||||
|
|
||||||
|
Some differences from 3.0 are also present. 3.1 begins the journey of |
||||||
|
requiring setters/getters for property access. So far this is only |
||||||
|
implemented on the five directory properties: template_dir, |
||||||
|
plugins_dir, configs_dir, compile_dir and cache_dir. These properties |
||||||
|
are now protected, it is required to use the setters/getters instead. |
||||||
|
That said, direct property access will still work, however slightly |
||||||
|
slower since they will now fall through __set() and __get() and in |
||||||
|
turn passed through the setter/getter methods. 3.2 will exhibit a full |
||||||
|
list of setter/getter methods for all (currently) public properties, |
||||||
|
so code-completion in your IDE will work as expected. |
||||||
|
|
||||||
|
There is absolutely no PHP allowed in templates any more. All |
||||||
|
deprecated features of Smarty 2.0 are gone. Again, use the SmartyBC |
||||||
|
class if you need any backward compatibility. |
||||||
|
|
||||||
|
Internal Changes |
||||||
|
|
||||||
|
Full UTF-8 Compatibility |
||||||
|
|
||||||
|
The plugins shipped with Smarty 3.1 have been rewritten to fully |
||||||
|
support UTF-8 strings if Multibyte String is available. Without |
||||||
|
MBString UTF-8 cannot be handled properly. For those rare cases where |
||||||
|
templates themselves have to juggle encodings, the new modifiers |
||||||
|
to_charset and from_charset may come in handy. |
||||||
|
|
||||||
|
Plugin API and Performance |
||||||
|
|
||||||
|
All Plugins (modifiers, functions, blocks, resources, |
||||||
|
default_template_handlers, etc) are now receiving the |
||||||
|
Smarty_Internal_Template instance, where they were supplied with the |
||||||
|
Smarty instance in Smarty 3.0. *. As The Smarty_Internal_Template |
||||||
|
mimics the behavior of Smarty, this API simplification should not |
||||||
|
require any changes to custom plugins. |
||||||
|
|
||||||
|
The plugins shipped with Smarty 3.1 have been rewritten for better |
||||||
|
performance. Most notably {html_select_date} and {html_select_time} |
||||||
|
have been improved vastly. Performance aside, plugins have also been |
||||||
|
reviewed and generalized in their API. {html_select_date} and |
||||||
|
{html_select_time} now share almost all available options. |
||||||
|
|
||||||
|
The escape modifier now knows the $double_encode option, which will |
||||||
|
prevent entities from being encoded again. |
||||||
|
|
||||||
|
The capitalize modifier now know the $lc_rest option, which makes sure |
||||||
|
all letters following a captial letter are lower-cased. |
||||||
|
|
||||||
|
The count_sentences modifier now accepts (.?!) as |
||||||
|
legitimate endings of a sentence - previously only (.) was |
||||||
|
accepted |
||||||
|
|
||||||
|
The new unescape modifier is there to reverse the effects of the |
||||||
|
escape modifier. This applies to the escape formats html, htmlall and |
||||||
|
entity. |
||||||
|
|
||||||
|
default_template_handler_func |
||||||
|
|
||||||
|
The invocation of $smarty->$default_template_handler_func had to be |
||||||
|
altered. Instead of a Smarty_Internal_Template, the fifth argument is |
||||||
|
now provided with the Smarty instance. New footprint: |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Default Template Handler |
||||||
|
* |
||||||
|
* called when Smarty's file: resource is unable to load a requested file |
||||||
|
* |
||||||
|
* @param string $type resource type (e.g. "file", "string", "eval", "resource") |
||||||
|
* @param string $name resource name (e.g. "foo/bar.tpl") |
||||||
|
* @param string &$content template's content |
||||||
|
* @param integer &$modified template's modification time |
||||||
|
* @param Smarty $smarty Smarty instance |
||||||
|
* @return string|boolean path to file or boolean true if $content and $modified |
||||||
|
* have been filled, boolean false if no default template |
||||||
|
* could be loaded |
||||||
|
*/ |
||||||
|
function default_template_handler_func($type, $name, &$content, &$modified, Smarty $smarty) { |
||||||
|
if (false) { |
||||||
|
// return corrected filepath |
||||||
|
return "/tmp/some/foobar.tpl"; |
||||||
|
} elseif (false) { |
||||||
|
// return a template directly |
||||||
|
$content = "the template source"; |
||||||
|
$modified = time(); |
||||||
|
return true; |
||||||
|
} else { |
||||||
|
// tell smarty that we failed |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
Stuff done to the compiler |
||||||
|
|
||||||
|
Many performance improvements have happened internally. One notable |
||||||
|
improvement is that all compiled templates are now handled as PHP |
||||||
|
functions. This speeds up repeated templates tremendously, as each one |
||||||
|
calls an (in-memory) PHP function instead of performing another file |
||||||
|
include/scan. |
||||||
|
|
||||||
|
New Features |
||||||
|
|
||||||
|
Template syntax |
||||||
|
|
||||||
|
{block}..{/block} |
||||||
|
|
||||||
|
The {block} tag has a new hide option flag. It does suppress the block |
||||||
|
content if no corresponding child block exists. |
||||||
|
EXAMPLE: |
||||||
|
parent.tpl |
||||||
|
{block name=body hide} child content "{$smarty.block.child}" was |
||||||
|
inserted {block} |
||||||
|
In the above example the whole block will be suppressed if no child |
||||||
|
block "body" is existing. |
||||||
|
|
||||||
|
{setfilter}..{/setfilter} |
||||||
|
|
||||||
|
The new {setfilter} block tag allows the definition of filters which |
||||||
|
run on variable output. |
||||||
|
SYNTAX: |
||||||
|
{setfilter filter1|filter2|filter3....} |
||||||
|
Smarty3 will lookup up matching filters in the following search order: |
||||||
|
1. varibale filter plugin in plugins_dir. |
||||||
|
2. a valid modifier. A modifier specification will also accept |
||||||
|
additional parameter like filter2:'foo' |
||||||
|
3. a PHP function |
||||||
|
{/setfilter} will turn previous filter setting off again. |
||||||
|
{setfilter} tags can be nested. |
||||||
|
EXAMPLE: |
||||||
|
{setfilter filter1} |
||||||
|
{$foo} |
||||||
|
{setfilter filter2} |
||||||
|
{$bar} |
||||||
|
{/setfilter} |
||||||
|
{$buh} |
||||||
|
{/setfilter} |
||||||
|
{$blar} |
||||||
|
In the above example filter1 will run on the output of $foo, filter2 |
||||||
|
on $bar, filter1 again on $buh and no filter on $blar. |
||||||
|
NOTES: |
||||||
|
- {$foo nofilter} will suppress the filters |
||||||
|
- These filters will run in addition to filters defined by |
||||||
|
registerFilter('variable',...), autoLoadFilter('variable',...) and |
||||||
|
defined default modifier. |
||||||
|
- {setfilter} will effect only the current template, not included |
||||||
|
subtemplates. |
||||||
|
|
||||||
|
Resource API |
||||||
|
|
||||||
|
Smarty 3.1 features a new approach to resource management. The |
||||||
|
Smarty_Resource API allows simple, yet powerful integration of custom |
||||||
|
resources for templates and configuration files. It offers simple |
||||||
|
functions for loading data from a custom resource (e.g. database) as |
||||||
|
well as define new template types adhering to the special |
||||||
|
non-compiling (e,g, plain php) and non-compile-caching (e.g. eval: |
||||||
|
resource type) resources. |
||||||
|
|
||||||
|
See demo/plugins/resource.mysql.php for an example custom database |
||||||
|
resource. |
||||||
|
|
||||||
|
Note that old-fashioned registration of callbacks for resource |
||||||
|
management has been deprecated but is still possible with SmartyBC. |
||||||
|
|
||||||
|
CacheResource API |
||||||
|
|
||||||
|
In line with the Resource API, the CacheResource API offers a more |
||||||
|
comfortable handling of output-cache data. With the |
||||||
|
Smarty_CacheResource_Custom accessing databases is made simple. With |
||||||
|
the introduction of Smarty_CacheResource_KeyValueStore the |
||||||
|
implementation of resources like memcache or APC became a no-brainer; |
||||||
|
simple hash-based storage systems are now supporting hierarchical |
||||||
|
output-caches. |
||||||
|
|
||||||
|
See demo/plugins/cacheresource.mysql.php for an example custom |
||||||
|
database CacheResource. |
||||||
|
See demo/plugins/cacheresource.memcache.php for an example custom |
||||||
|
memcache CacheResource using the KeyValueStore helper. |
||||||
|
|
||||||
|
Note that old-fashioned registration of $cache_handler is not possible |
||||||
|
anymore. As the functionality had not been ported to Smarty 3.0.x |
||||||
|
properly, it has been dropped from 3.1 completely. |
||||||
|
|
||||||
|
Locking facilities have been implemented to avoid concurrent cache |
||||||
|
generation. Enable cache locking by setting |
||||||
|
$smarty->cache_locking = true; |
||||||
|
|
||||||
|
Relative Paths in Templates (File-Resource) |
||||||
|
|
||||||
|
As of Smarty 3.1 {include file="../foo.tpl"} and {include |
||||||
|
file="./foo.tpl"} will resolve relative to the template they're in. |
||||||
|
Relative paths are available with {include file="..."} and |
||||||
|
{extends file="..."}. As $smarty->fetch('../foo.tpl') and |
||||||
|
$smarty->fetch('./foo.tpl') cannot be relative to a template, an |
||||||
|
exception is thrown. |
||||||
|
|
||||||
|
Adressing a specific $template_dir |
||||||
|
|
||||||
|
Smarty 3.1 introduces the $template_dir index notation. |
||||||
|
$smarty->fetch('[foo]bar.tpl') and {include file="[foo]bar.tpl"} |
||||||
|
require the template bar.tpl to be loaded from $template_dir['foo']; |
||||||
|
Smarty::setTemplateDir() and Smarty::addTemplateDir() offer ways to |
||||||
|
define indexes along with the actual directories. |
||||||
|
|
||||||
|
Mixing Resources in extends-Resource |
||||||
|
|
||||||
|
Taking the php extends: template resource one step further, it is now |
||||||
|
possible to mix resources within an extends: call like |
||||||
|
$smarty->fetch("extends:file:foo.tpl|db:bar.tpl"); |
||||||
|
|
||||||
|
To make eval: and string: resources available to the inheritance |
||||||
|
chain, eval:base64:TPL_STRING and eval:urlencode:TPL_STRING have been |
||||||
|
introduced. Supplying the base64 or urlencode flags will trigger |
||||||
|
decoding the TPL_STRING in with either base64_decode() or urldecode(). |
||||||
|
|
||||||
|
extends-Resource in template inheritance |
||||||
|
|
||||||
|
Template based inheritance may now inherit from php's extends: |
||||||
|
resource like {extends file="extends:foo.tpl|db:bar.tpl"}. |
||||||
|
|
||||||
|
New Smarty property escape_html |
||||||
|
|
||||||
|
$smarty->escape_html = true will autoescape all template variable |
||||||
|
output by calling htmlspecialchars({$output}, ENT_QUOTES, |
||||||
|
SMARTY_RESOURCE_CHAR_SET). |
||||||
|
NOTE: |
||||||
|
This is a compile time option. If you change the setting you must make |
||||||
|
sure that the templates get recompiled. |
||||||
|
|
||||||
|
New option at Smarty property compile_check |
||||||
|
|
||||||
|
The automatic recompilation of modified templates can now be |
||||||
|
controlled by the following settings: |
||||||
|
$smarty->compile_check = COMPILECHECK_OFF (false) - template files |
||||||
|
will not be checked |
||||||
|
$smarty->compile_check = COMPILECHECK_ON (true) - template files will |
||||||
|
always be checked |
||||||
|
$smarty->compile_check = COMPILECHECK_CACHEMISS - template files will |
||||||
|
be checked if caching is enabled and there is no existing cache file |
||||||
|
or it has expired |
||||||
|
|
||||||
|
Automatic recompilation on Smarty version change |
||||||
|
|
||||||
|
Templates will now be automatically recompiled on Smarty version |
||||||
|
changes to avoide incompatibillities in the compiled code. Compiled |
||||||
|
template checked against the current setting of the SMARTY_VERSION |
||||||
|
constant. |
||||||
|
|
||||||
|
default_config_handler_func() |
||||||
|
|
||||||
|
Analogous to the default_template_handler_func() |
||||||
|
default_config_handler_func() has been introduced. |
||||||
|
|
||||||
|
default_plugin_handler_func() |
||||||
|
|
||||||
|
An optional default_plugin_handler_func() can be defined which gets called |
||||||
|
by the compiler on tags which can't be resolved internally or by plugins. |
||||||
|
The default_plugin_handler() can map tags to plugins on the fly. |
||||||
|
|
||||||
|
New getters/setters |
||||||
|
|
||||||
|
The following setters/getters will be part of the official |
||||||
|
documentation, and will be strongly recommended. Direct property |
||||||
|
access will still work for the foreseeable future... it will be |
||||||
|
transparently routed through the setters/getters, and consequently a |
||||||
|
bit slower. |
||||||
|
|
||||||
|
array|string getTemplateDir( [string $index] ) |
||||||
|
replaces $smarty->template_dir; and $smarty->template_dir[$index]; |
||||||
|
Smarty setTemplateDir( array|string $path ) |
||||||
|
replaces $smarty->template_dir = "foo"; and $smarty->template_dir = |
||||||
|
array("foo", "bar"); |
||||||
|
Smarty addTemplateDir( array|string $path, [string $index]) |
||||||
|
replaces $smarty->template_dir[] = "bar"; and |
||||||
|
$smarty->template_dir[$index] = "bar"; |
||||||
|
|
||||||
|
array|string getConfigDir( [string $index] ) |
||||||
|
replaces $smarty->config_dir; and $smarty->config_dir[$index]; |
||||||
|
Smarty setConfigDir( array|string $path ) |
||||||
|
replaces $smarty->config_dir = "foo"; and $smarty->config_dir = |
||||||
|
array("foo", "bar"); |
||||||
|
Smarty addConfigDir( array|string $path, [string $index]) |
||||||
|
replaces $smarty->config_dir[] = "bar"; and |
||||||
|
$smarty->config_dir[$index] = "bar"; |
||||||
|
|
||||||
|
array getPluginsDir() |
||||||
|
replaces $smarty->plugins_dir; |
||||||
|
Smarty setPluginsDir( array|string $path ) |
||||||
|
replaces $smarty->plugins_dir = "foo"; |
||||||
|
Smarty addPluginsDir( array|string $path ) |
||||||
|
replaces $smarty->plugins_dir[] = "bar"; |
||||||
|
|
||||||
|
string getCompileDir() |
||||||
|
replaces $smarty->compile_dir; |
||||||
|
Smarty setCompileDir( string $path ) |
||||||
|
replaces $smarty->compile_dir = "foo"; |
||||||
|
|
||||||
|
string getCacheDir() |
||||||
|
replaces $smarty->cache_dir; |
||||||
|
Smarty setCacheDir( string $path ) |
||||||
|
replaces $smarty->cache_dir; |
@ -0,0 +1,5 @@ |
|||||||
|
title = Welcome to Smarty! |
||||||
|
cutoff_size = 40 |
||||||
|
|
||||||
|
[setup] |
||||||
|
bold = true |
@ -0,0 +1,33 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Example Application |
||||||
|
|
||||||
|
* @package Example-application |
||||||
|
*/ |
||||||
|
|
||||||
|
require('../libs/Smarty.class.php'); |
||||||
|
|
||||||
|
$smarty = new Smarty; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//$smarty->force_compile = 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("option_selected", "NE"); |
||||||
|
|
||||||
|
$smarty->display('index.tpl'); |
||||||
|
?> |
@ -0,0 +1,77 @@ |
|||||||
|
<?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 { |
||||||
|
|
||||||
|
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'); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,91 @@ |
|||||||
|
<?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; |
||||||
|
|
||||||
|
public function __construct() |
||||||
|
{ |
||||||
|
$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) |
||||||
|
{ |
||||||
|
$_keys = $lookup = array(); |
||||||
|
foreach ($keys as $k) { |
||||||
|
$_k = sha1($k); |
||||||
|
$_keys[] = $_k; |
||||||
|
$lookup[$_k] = $k; |
||||||
|
} |
||||||
|
$_res = array(); |
||||||
|
$res = $this->memcache->get($_keys); |
||||||
|
foreach ($res as $k => $v) { |
||||||
|
$_res[$lookup[$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) { |
||||||
|
$k = sha1($k); |
||||||
|
$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(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,152 @@ |
|||||||
|
<?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 { |
||||||
|
// PDO instance |
||||||
|
protected $db; |
||||||
|
protected $fetch; |
||||||
|
protected $fetchTimestamp; |
||||||
|
protected $save; |
||||||
|
|
||||||
|
public function __construct() { |
||||||
|
try { |
||||||
|
$this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty", "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(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,60 @@ |
|||||||
|
<?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(); |
||||||
|
$exists = true; |
||||||
|
foreach ($_template->smarty->getTemplateDir() as $key => $directory) { |
||||||
|
try { |
||||||
|
$s = Smarty_Resource::source(null, $source->smarty, '[' . $key . ']' . $source->name ); |
||||||
|
if (!$s->exists) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
$sources[$s->uid] = $s; |
||||||
|
$uid .= $s->filepath; |
||||||
|
} |
||||||
|
catch (SmartyException $e) {} |
||||||
|
} |
||||||
|
|
||||||
|
if (!$sources) { |
||||||
|
$source->exists = false; |
||||||
|
$source->template = $_template; |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
$sources = array_reverse($sources, true); |
||||||
|
reset($sources); |
||||||
|
$s = current($sources); |
||||||
|
|
||||||
|
$source->components = $sources; |
||||||
|
$source->filepath = $s->filepath; |
||||||
|
$source->uid = sha1($uid); |
||||||
|
$source->exists = $exists; |
||||||
|
if ($_template && $_template->smarty->compile_check) { |
||||||
|
$source->timestamp = $s->timestamp; |
||||||
|
} |
||||||
|
// need the template at getContent() |
||||||
|
$source->template = $_template; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,76 @@ |
|||||||
|
<?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 |
||||||
|
protected $db; |
||||||
|
// prepared fetch() statement |
||||||
|
protected $fetch; |
||||||
|
// prepared fetchTimestamp() statement |
||||||
|
protected $mtime; |
||||||
|
|
||||||
|
public function __construct() { |
||||||
|
try { |
||||||
|
$this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty", "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); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,62 @@ |
|||||||
|
<?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 seperate 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 |
||||||
|
protected $db; |
||||||
|
// prepared fetch() statement |
||||||
|
protected $fetch; |
||||||
|
|
||||||
|
public function __construct() { |
||||||
|
try { |
||||||
|
$this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty", "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; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,2 @@ |
|||||||
|
</BODY> |
||||||
|
</HTML> |
@ -0,0 +1,5 @@ |
|||||||
|
<HTML> |
||||||
|
<HEAD> |
||||||
|
<TITLE>{$title} - {$Name}</TITLE> |
||||||
|
</HEAD> |
||||||
|
<BODY bgcolor="#ffffff"> |
@ -0,0 +1,82 @@ |
|||||||
|
{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} |
||||||
|
|
||||||
|
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} |
||||||
|
|
||||||
|
Example of accessing server environment variable SERVER_NAME: {$smarty.server.SERVER_NAME} |
||||||
|
|
||||||
|
The value of {ldelim}$Name{rdelim} is <b>{$Name}</b> |
||||||
|
|
||||||
|
variable modifier example of {ldelim}$Name|upper{rdelim} |
||||||
|
|
||||||
|
<b>{$Name|upper}</b> |
||||||
|
|
||||||
|
|
||||||
|
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} |
||||||
|
|
||||||
|
An example of section looped key values: |
||||||
|
|
||||||
|
{section name=sec1 loop=$contacts} |
||||||
|
phone: {$contacts[sec1].phone}<br> |
||||||
|
fax: {$contacts[sec1].fax}<br> |
||||||
|
cell: {$contacts[sec1].cell}<br> |
||||||
|
{/section} |
||||||
|
<p> |
||||||
|
|
||||||
|
testing strip tags |
||||||
|
{strip} |
||||||
|
<table border=0> |
||||||
|
<tr> |
||||||
|
<td> |
||||||
|
<A HREF="{$SCRIPT_NAME}"> |
||||||
|
<font color="red">This is a test </font> |
||||||
|
</A> |
||||||
|
</td> |
||||||
|
</tr> |
||||||
|
</table> |
||||||
|
{/strip} |
||||||
|
|
||||||
|
</PRE> |
||||||
|
|
||||||
|
This is an example of the html_select_date function: |
||||||
|
|
||||||
|
<form> |
||||||
|
{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} |
||||||
|
</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> |
||||||
|
</form> |
||||||
|
|
||||||
|
{include file="footer.tpl"} |
@ -0,0 +1,460 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Project: Smarty: the PHP compiling template engine |
||||||
|
* File: SmartyBC.class.php |
||||||
|
* SVN: $Id: $ |
||||||
|
* |
||||||
|
* 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 2.1 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 for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public |
||||||
|
* License along with this library; if not, write to the Free Software |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
* |
||||||
|
* For questions, help, comments, discussion, etc., please join the |
||||||
|
* Smarty mailing list. Send a blank e-mail to |
||||||
|
* smarty-discussion-subscribe@googlegroups.com |
||||||
|
* |
||||||
|
* @link http://www.smarty.net/ |
||||||
|
* @copyright 2008 New Digital Group, Inc. |
||||||
|
* @author Monte Ohrt <monte at ohrt dot com> |
||||||
|
* @author Uwe Tews |
||||||
|
* @author Rodney Rehm |
||||||
|
* @package Smarty |
||||||
|
*/ |
||||||
|
/** |
||||||
|
* @ignore |
||||||
|
*/ |
||||||
|
require(dirname(__FILE__) . '/Smarty.class.php'); |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty Backward Compatability Wrapper Class |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
*/ |
||||||
|
class SmartyBC extends Smarty { |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty 2 BC |
||||||
|
* @var string |
||||||
|
*/ |
||||||
|
public $_version = self::SMARTY_VERSION; |
||||||
|
|
||||||
|
/** |
||||||
|
* Initialize new SmartyBC object |
||||||
|
* |
||||||
|
* @param array $options options to set during initialization, e.g. array( 'forceCompile' => false ) |
||||||
|
*/ |
||||||
|
public function __construct(array $options=array()) |
||||||
|
{ |
||||||
|
parent::__construct($options); |
||||||
|
// register {php} tag |
||||||
|
$this->registerPlugin('block', 'php', 'smarty_php_tag'); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* wrapper for assign_by_ref |
||||||
|
* |
||||||
|
* @param string $tpl_var the template variable name |
||||||
|
* @param mixed &$value the referenced value to assign |
||||||
|
*/ |
||||||
|
public function assign_by_ref($tpl_var, &$value) |
||||||
|
{ |
||||||
|
$this->assignByRef($tpl_var, $value); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* wrapper for append_by_ref |
||||||
|
* |
||||||
|
* @param string $tpl_var the template variable name |
||||||
|
* @param mixed &$value the referenced value to append |
||||||
|
* @param boolean $merge flag if array elements shall be merged |
||||||
|
*/ |
||||||
|
public function append_by_ref($tpl_var, &$value, $merge = false) |
||||||
|
{ |
||||||
|
$this->appendByRef($tpl_var, $value, $merge); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* clear the given assigned template variable. |
||||||
|
* |
||||||
|
* @param string $tpl_var the template variable to clear |
||||||
|
*/ |
||||||
|
public function clear_assign($tpl_var) |
||||||
|
{ |
||||||
|
$this->clearAssign($tpl_var); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Registers custom function to be used in templates |
||||||
|
* |
||||||
|
* @param string $function the name of the template function |
||||||
|
* @param string $function_impl the name of the PHP function to register |
||||||
|
* @param bool $cacheable |
||||||
|
* @param mixed $cache_attrs |
||||||
|
*/ |
||||||
|
public function register_function($function, $function_impl, $cacheable=true, $cache_attrs=null) |
||||||
|
{ |
||||||
|
$this->registerPlugin('function', $function, $function_impl, $cacheable, $cache_attrs); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Unregisters custom function |
||||||
|
* |
||||||
|
* @param string $function name of template function |
||||||
|
*/ |
||||||
|
public function unregister_function($function) |
||||||
|
{ |
||||||
|
$this->unregisterPlugin('function', $function); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Registers object to be used in templates |
||||||
|
* |
||||||
|
* @param string $object name of template object |
||||||
|
* @param object $object_impl the referenced PHP object to register |
||||||
|
* @param array $allowed list of allowed methods (empty = all) |
||||||
|
* @param boolean $smarty_args smarty argument format, else traditional |
||||||
|
* @param array $block_functs list of methods that are block format |
||||||
|
*/ |
||||||
|
public function register_object($object, $object_impl, $allowed = array(), $smarty_args = true, $block_methods = array()) |
||||||
|
{ |
||||||
|
settype($allowed, 'array'); |
||||||
|
settype($smarty_args, 'boolean'); |
||||||
|
$this->registerObject($object, $object_impl, $allowed, $smarty_args, $block_methods); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Unregisters object |
||||||
|
* |
||||||
|
* @param string $object name of template object |
||||||
|
*/ |
||||||
|
public function unregister_object($object) |
||||||
|
{ |
||||||
|
$this->unregisterObject($object); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Registers block function to be used in templates |
||||||
|
* |
||||||
|
* @param string $block name of template block |
||||||
|
* @param string $block_impl PHP function to register |
||||||
|
* @param bool $cacheable |
||||||
|
* @param mixed $cache_attrs |
||||||
|
*/ |
||||||
|
public function register_block($block, $block_impl, $cacheable=true, $cache_attrs=null) |
||||||
|
{ |
||||||
|
$this->registerPlugin('block', $block, $block_impl, $cacheable, $cache_attrs); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Unregisters block function |
||||||
|
* |
||||||
|
* @param string $block name of template function |
||||||
|
*/ |
||||||
|
public function unregister_block($block) |
||||||
|
{ |
||||||
|
$this->unregisterPlugin('block', $block); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Registers compiler function |
||||||
|
* |
||||||
|
* @param string $function name of template function |
||||||
|
* @param string $function_impl name of PHP function to register |
||||||
|
* @param bool $cacheable |
||||||
|
*/ |
||||||
|
public function register_compiler_function($function, $function_impl, $cacheable=true) |
||||||
|
{ |
||||||
|
$this->registerPlugin('compiler', $function, $function_impl, $cacheable); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Unregisters compiler function |
||||||
|
* |
||||||
|
* @param string $function name of template function |
||||||
|
*/ |
||||||
|
public function unregister_compiler_function($function) |
||||||
|
{ |
||||||
|
$this->unregisterPlugin('compiler', $function); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Registers modifier to be used in templates |
||||||
|
* |
||||||
|
* @param string $modifier name of template modifier |
||||||
|
* @param string $modifier_impl name of PHP function to register |
||||||
|
*/ |
||||||
|
public function register_modifier($modifier, $modifier_impl) |
||||||
|
{ |
||||||
|
$this->registerPlugin('modifier', $modifier, $modifier_impl); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Unregisters modifier |
||||||
|
* |
||||||
|
* @param string $modifier name of template modifier |
||||||
|
*/ |
||||||
|
public function unregister_modifier($modifier) |
||||||
|
{ |
||||||
|
$this->unregisterPlugin('modifier', $modifier); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Registers a resource to fetch a template |
||||||
|
* |
||||||
|
* @param string $type name of resource |
||||||
|
* @param array $functions array of functions to handle resource |
||||||
|
*/ |
||||||
|
public function register_resource($type, $functions) |
||||||
|
{ |
||||||
|
$this->registerResource($type, $functions); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Unregisters a resource |
||||||
|
* |
||||||
|
* @param string $type name of resource |
||||||
|
*/ |
||||||
|
public function unregister_resource($type) |
||||||
|
{ |
||||||
|
$this->unregisterResource($type); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Registers a prefilter function to apply |
||||||
|
* to a template before compiling |
||||||
|
* |
||||||
|
* @param callable $function |
||||||
|
*/ |
||||||
|
public function register_prefilter($function) |
||||||
|
{ |
||||||
|
$this->registerFilter('pre', $function); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Unregisters a prefilter function |
||||||
|
* |
||||||
|
* @param callable $function |
||||||
|
*/ |
||||||
|
public function unregister_prefilter($function) |
||||||
|
{ |
||||||
|
$this->unregisterFilter('pre', $function); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Registers a postfilter function to apply |
||||||
|
* to a compiled template after compilation |
||||||
|
* |
||||||
|
* @param callable $function |
||||||
|
*/ |
||||||
|
public function register_postfilter($function) |
||||||
|
{ |
||||||
|
$this->registerFilter('post', $function); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Unregisters a postfilter function |
||||||
|
* |
||||||
|
* @param callable $function |
||||||
|
*/ |
||||||
|
public function unregister_postfilter($function) |
||||||
|
{ |
||||||
|
$this->unregisterFilter('post', $function); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Registers an output filter function to apply |
||||||
|
* to a template output |
||||||
|
* |
||||||
|
* @param callable $function |
||||||
|
*/ |
||||||
|
public function register_outputfilter($function) |
||||||
|
{ |
||||||
|
$this->registerFilter('output', $function); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Unregisters an outputfilter function |
||||||
|
* |
||||||
|
* @param callable $function |
||||||
|
*/ |
||||||
|
public function unregister_outputfilter($function) |
||||||
|
{ |
||||||
|
$this->unregisterFilter('output', $function); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* load a filter of specified type and name |
||||||
|
* |
||||||
|
* @param string $type filter type |
||||||
|
* @param string $name filter name |
||||||
|
*/ |
||||||
|
public function load_filter($type, $name) |
||||||
|
{ |
||||||
|
$this->loadFilter($type, $name); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* clear cached content for the given template and cache id |
||||||
|
* |
||||||
|
* @param string $tpl_file name of template file |
||||||
|
* @param string $cache_id name of cache_id |
||||||
|
* @param string $compile_id name of compile_id |
||||||
|
* @param string $exp_time expiration time |
||||||
|
* @return boolean |
||||||
|
*/ |
||||||
|
public function clear_cache($tpl_file = null, $cache_id = null, $compile_id = null, $exp_time = null) |
||||||
|
{ |
||||||
|
return $this->clearCache($tpl_file, $cache_id, $compile_id, $exp_time); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* clear the entire contents of cache (all templates) |
||||||
|
* |
||||||
|
* @param string $exp_time expire time |
||||||
|
* @return boolean |
||||||
|
*/ |
||||||
|
public function clear_all_cache($exp_time = null) |
||||||
|
{ |
||||||
|
return $this->clearCache(null, null, null, $exp_time); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* test to see if valid cache exists for this template |
||||||
|
* |
||||||
|
* @param string $tpl_file name of template file |
||||||
|
* @param string $cache_id |
||||||
|
* @param string $compile_id |
||||||
|
* @return boolean |
||||||
|
*/ |
||||||
|
public function is_cached($tpl_file, $cache_id = null, $compile_id = null) |
||||||
|
{ |
||||||
|
return $this->isCached($tpl_file, $cache_id, $compile_id); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* clear all the assigned template variables. |
||||||
|
*/ |
||||||
|
public function clear_all_assign() |
||||||
|
{ |
||||||
|
$this->clearAllAssign(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* clears compiled version of specified template resource, |
||||||
|
* or all compiled template files if one is not specified. |
||||||
|
* This function is for advanced use only, not normally needed. |
||||||
|
* |
||||||
|
* @param string $tpl_file |
||||||
|
* @param string $compile_id |
||||||
|
* @param string $exp_time |
||||||
|
* @return boolean results of {@link smarty_core_rm_auto()} |
||||||
|
*/ |
||||||
|
public function clear_compiled_tpl($tpl_file = null, $compile_id = null, $exp_time = null) |
||||||
|
{ |
||||||
|
return $this->clearCompiledTemplate($tpl_file, $compile_id, $exp_time); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Checks whether requested template exists. |
||||||
|
* |
||||||
|
* @param string $tpl_file |
||||||
|
* @return boolean |
||||||
|
*/ |
||||||
|
public function template_exists($tpl_file) |
||||||
|
{ |
||||||
|
return $this->templateExists($tpl_file); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns an array containing template variables |
||||||
|
* |
||||||
|
* @param string $name |
||||||
|
* @return array |
||||||
|
*/ |
||||||
|
public function get_template_vars($name=null) |
||||||
|
{ |
||||||
|
return $this->getTemplateVars($name); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns an array containing config variables |
||||||
|
* |
||||||
|
* @param string $name |
||||||
|
* @return array |
||||||
|
*/ |
||||||
|
public function get_config_vars($name=null) |
||||||
|
{ |
||||||
|
return $this->getConfigVars($name); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* load configuration values |
||||||
|
* |
||||||
|
* @param string $file |
||||||
|
* @param string $section |
||||||
|
* @param string $scope |
||||||
|
*/ |
||||||
|
public function config_load($file, $section = null, $scope = 'global') |
||||||
|
{ |
||||||
|
$this->ConfigLoad($file, $section, $scope); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* return a reference to a registered object |
||||||
|
* |
||||||
|
* @param string $name |
||||||
|
* @return object |
||||||
|
*/ |
||||||
|
public function get_registered_object($name) |
||||||
|
{ |
||||||
|
return $this->getRegisteredObject($name); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* clear configuration values |
||||||
|
* |
||||||
|
* @param string $var |
||||||
|
*/ |
||||||
|
public function clear_config($var = null) |
||||||
|
{ |
||||||
|
$this->clearConfig($var); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* trigger Smarty error |
||||||
|
* |
||||||
|
* @param string $error_msg |
||||||
|
* @param integer $error_type |
||||||
|
*/ |
||||||
|
public function trigger_error($error_msg, $error_type = E_USER_WARNING) |
||||||
|
{ |
||||||
|
trigger_error("Smarty error: $error_msg", $error_type); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty {php}{/php} block function |
||||||
|
* |
||||||
|
* @param array $params parameter list |
||||||
|
* @param string $content contents of the block |
||||||
|
* @param object $template template object |
||||||
|
* @param boolean &$repeat repeat flag |
||||||
|
* @return string content re-formatted |
||||||
|
*/ |
||||||
|
function smarty_php_tag($params, $content, $template, &$repeat) |
||||||
|
{ |
||||||
|
eval($content); |
||||||
|
return ''; |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,133 @@ |
|||||||
|
{capture name='_smarty_debug' assign=debug_output} |
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> |
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> |
||||||
|
<head> |
||||||
|
<title>Smarty Debug Console</title> |
||||||
|
<style type="text/css"> |
||||||
|
{literal} |
||||||
|
body, h1, h2, td, th, p { |
||||||
|
font-family: sans-serif; |
||||||
|
font-weight: normal; |
||||||
|
font-size: 0.9em; |
||||||
|
margin: 1px; |
||||||
|
padding: 0; |
||||||
|
} |
||||||
|
|
||||||
|
h1 { |
||||||
|
margin: 0; |
||||||
|
text-align: left; |
||||||
|
padding: 2px; |
||||||
|
background-color: #f0c040; |
||||||
|
color: black; |
||||||
|
font-weight: bold; |
||||||
|
font-size: 1.2em; |
||||||
|
} |
||||||
|
|
||||||
|
h2 { |
||||||
|
background-color: #9B410E; |
||||||
|
color: white; |
||||||
|
text-align: left; |
||||||
|
font-weight: bold; |
||||||
|
padding: 2px; |
||||||
|
border-top: 1px solid black; |
||||||
|
} |
||||||
|
|
||||||
|
body { |
||||||
|
background: black; |
||||||
|
} |
||||||
|
|
||||||
|
p, table, div { |
||||||
|
background: #f0ead8; |
||||||
|
} |
||||||
|
|
||||||
|
p { |
||||||
|
margin: 0; |
||||||
|
font-style: italic; |
||||||
|
text-align: center; |
||||||
|
} |
||||||
|
|
||||||
|
table { |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
th, td { |
||||||
|
font-family: monospace; |
||||||
|
vertical-align: top; |
||||||
|
text-align: left; |
||||||
|
width: 50%; |
||||||
|
} |
||||||
|
|
||||||
|
td { |
||||||
|
color: green; |
||||||
|
} |
||||||
|
|
||||||
|
.odd { |
||||||
|
background-color: #eeeeee; |
||||||
|
} |
||||||
|
|
||||||
|
.even { |
||||||
|
background-color: #fafafa; |
||||||
|
} |
||||||
|
|
||||||
|
.exectime { |
||||||
|
font-size: 0.8em; |
||||||
|
font-style: italic; |
||||||
|
} |
||||||
|
|
||||||
|
#table_assigned_vars th { |
||||||
|
color: blue; |
||||||
|
} |
||||||
|
|
||||||
|
#table_config_vars th { |
||||||
|
color: maroon; |
||||||
|
} |
||||||
|
{/literal} |
||||||
|
</style> |
||||||
|
</head> |
||||||
|
<body> |
||||||
|
|
||||||
|
<h1>Smarty Debug Console - {if isset($template_name)}{$template_name|debug_print_var nofilter}{else}Total Time {$execution_time|string_format:"%.5f"}{/if}</h1> |
||||||
|
|
||||||
|
{if !empty($template_data)} |
||||||
|
<h2>included templates & config files (load time in seconds)</h2> |
||||||
|
|
||||||
|
<div> |
||||||
|
{foreach $template_data as $template} |
||||||
|
<font color=brown>{$template.name}</font> |
||||||
|
<span class="exectime"> |
||||||
|
(compile {$template['compile_time']|string_format:"%.5f"}) (render {$template['render_time']|string_format:"%.5f"}) (cache {$template['cache_time']|string_format:"%.5f"}) |
||||||
|
</span> |
||||||
|
<br> |
||||||
|
{/foreach} |
||||||
|
</div> |
||||||
|
{/if} |
||||||
|
|
||||||
|
<h2>assigned template variables</h2> |
||||||
|
|
||||||
|
<table id="table_assigned_vars"> |
||||||
|
{foreach $assigned_vars as $vars} |
||||||
|
<tr class="{if $vars@iteration % 2 eq 0}odd{else}even{/if}"> |
||||||
|
<th>${$vars@key|escape:'html'}</th> |
||||||
|
<td>{$vars|debug_print_var nofilter}</td></tr> |
||||||
|
{/foreach} |
||||||
|
</table> |
||||||
|
|
||||||
|
<h2>assigned config file variables (outer template scope)</h2> |
||||||
|
|
||||||
|
<table id="table_config_vars"> |
||||||
|
{foreach $config_vars as $vars} |
||||||
|
<tr class="{if $vars@iteration % 2 eq 0}odd{else}even{/if}"> |
||||||
|
<th>{$vars@key|escape:'html'}</th> |
||||||
|
<td>{$vars|debug_print_var nofilter}</td></tr> |
||||||
|
{/foreach} |
||||||
|
|
||||||
|
</table> |
||||||
|
</body> |
||||||
|
</html> |
||||||
|
{/capture} |
||||||
|
<script type="text/javascript"> |
||||||
|
{$id = $template_name|default:''|md5} |
||||||
|
_smarty_console = window.open("","console{$id}","width=680,height=600,resizable,scrollbars=yes"); |
||||||
|
_smarty_console.document.write("{$debug_output|escape:'javascript' nofilter}"); |
||||||
|
_smarty_console.document.close(); |
||||||
|
</script> |
@ -0,0 +1,113 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin to format text blocks |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsBlock |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty {textformat}{/textformat} block plugin |
||||||
|
* |
||||||
|
* Type: block function<br> |
||||||
|
* Name: textformat<br> |
||||||
|
* Purpose: format text a certain way with preset styles |
||||||
|
* or custom wrap/indent settings<br> |
||||||
|
* Params: |
||||||
|
* <pre> |
||||||
|
* - style - string (email) |
||||||
|
* - indent - integer (0) |
||||||
|
* - wrap - integer (80) |
||||||
|
* - wrap_char - string ("\n") |
||||||
|
* - indent_char - string (" ") |
||||||
|
* - wrap_boundary - boolean (true) |
||||||
|
* </pre> |
||||||
|
* |
||||||
|
* @link http://www.smarty.net/manual/en/language.function.textformat.php {textformat} |
||||||
|
* (Smarty online manual) |
||||||
|
* @param array $params parameters |
||||||
|
* @param string $content contents of the block |
||||||
|
* @param Smarty_Internal_Template $template template object |
||||||
|
* @param boolean &$repeat repeat flag |
||||||
|
* @return string content re-formatted |
||||||
|
* @author Monte Ohrt <monte at ohrt dot com> |
||||||
|
*/ |
||||||
|
function smarty_block_textformat($params, $content, $template, &$repeat) |
||||||
|
{ |
||||||
|
if (is_null($content)) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
$style = null; |
||||||
|
$indent = 0; |
||||||
|
$indent_first = 0; |
||||||
|
$indent_char = ' '; |
||||||
|
$wrap = 80; |
||||||
|
$wrap_char = "\n"; |
||||||
|
$wrap_cut = false; |
||||||
|
$assign = null; |
||||||
|
|
||||||
|
foreach ($params as $_key => $_val) { |
||||||
|
switch ($_key) { |
||||||
|
case 'style': |
||||||
|
case 'indent_char': |
||||||
|
case 'wrap_char': |
||||||
|
case 'assign': |
||||||
|
$$_key = (string)$_val; |
||||||
|
break; |
||||||
|
|
||||||
|
case 'indent': |
||||||
|
case 'indent_first': |
||||||
|
case 'wrap': |
||||||
|
$$_key = (int)$_val; |
||||||
|
break; |
||||||
|
|
||||||
|
case 'wrap_cut': |
||||||
|
$$_key = (bool)$_val; |
||||||
|
break; |
||||||
|
|
||||||
|
default: |
||||||
|
trigger_error("textformat: unknown attribute '$_key'"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if ($style == 'email') { |
||||||
|
$wrap = 72; |
||||||
|
} |
||||||
|
// split into paragraphs |
||||||
|
$_paragraphs = preg_split('![\r\n]{2}!', $content); |
||||||
|
$_output = ''; |
||||||
|
|
||||||
|
|
||||||
|
foreach ($_paragraphs as &$_paragraph) { |
||||||
|
if (!$_paragraph) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
// convert mult. spaces & special chars to single space |
||||||
|
$_paragraph = preg_replace(array('!\s+!' . Smarty::$_UTF8_MODIFIER, '!(^\s+)|(\s+$)!' . Smarty::$_UTF8_MODIFIER), array(' ', ''), $_paragraph); |
||||||
|
// indent first line |
||||||
|
if ($indent_first > 0) { |
||||||
|
$_paragraph = str_repeat($indent_char, $indent_first) . $_paragraph; |
||||||
|
} |
||||||
|
// wordwrap sentences |
||||||
|
if (Smarty::$_MBSTRING) { |
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.mb_wordwrap.php'); |
||||||
|
$_paragraph = smarty_mb_wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut); |
||||||
|
} else { |
||||||
|
$_paragraph = wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut); |
||||||
|
} |
||||||
|
// indent lines |
||||||
|
if ($indent > 0) { |
||||||
|
$_paragraph = preg_replace('!^!m', str_repeat($indent_char, $indent), $_paragraph); |
||||||
|
} |
||||||
|
} |
||||||
|
$_output = implode($wrap_char . $wrap_char, $_paragraphs); |
||||||
|
|
||||||
|
if ($assign) { |
||||||
|
$template->assign($assign, $_output); |
||||||
|
} else { |
||||||
|
return $_output; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,78 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsFunction |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty {counter} function plugin |
||||||
|
* |
||||||
|
* Type: function<br> |
||||||
|
* Name: counter<br> |
||||||
|
* Purpose: print out a counter value |
||||||
|
* |
||||||
|
* @author Monte Ohrt <monte at ohrt dot com> |
||||||
|
* @link http://www.smarty.net/manual/en/language.function.counter.php {counter} |
||||||
|
* (Smarty online manual) |
||||||
|
* @param array $params parameters |
||||||
|
* @param Smarty_Internal_Template $template template object |
||||||
|
* @return string|null |
||||||
|
*/ |
||||||
|
function smarty_function_counter($params, $template) |
||||||
|
{ |
||||||
|
static $counters = array(); |
||||||
|
|
||||||
|
$name = (isset($params['name'])) ? $params['name'] : 'default'; |
||||||
|
if (!isset($counters[$name])) { |
||||||
|
$counters[$name] = array( |
||||||
|
'start'=>1, |
||||||
|
'skip'=>1, |
||||||
|
'direction'=>'up', |
||||||
|
'count'=>1 |
||||||
|
); |
||||||
|
} |
||||||
|
$counter =& $counters[$name]; |
||||||
|
|
||||||
|
if (isset($params['start'])) { |
||||||
|
$counter['start'] = $counter['count'] = (int)$params['start']; |
||||||
|
} |
||||||
|
|
||||||
|
if (!empty($params['assign'])) { |
||||||
|
$counter['assign'] = $params['assign']; |
||||||
|
} |
||||||
|
|
||||||
|
if (isset($counter['assign'])) { |
||||||
|
$template->assign($counter['assign'], $counter['count']); |
||||||
|
} |
||||||
|
|
||||||
|
if (isset($params['print'])) { |
||||||
|
$print = (bool)$params['print']; |
||||||
|
} else { |
||||||
|
$print = empty($counter['assign']); |
||||||
|
} |
||||||
|
|
||||||
|
if ($print) { |
||||||
|
$retval = $counter['count']; |
||||||
|
} else { |
||||||
|
$retval = null; |
||||||
|
} |
||||||
|
|
||||||
|
if (isset($params['skip'])) { |
||||||
|
$counter['skip'] = $params['skip']; |
||||||
|
} |
||||||
|
|
||||||
|
if (isset($params['direction'])) { |
||||||
|
$counter['direction'] = $params['direction']; |
||||||
|
} |
||||||
|
|
||||||
|
if ($counter['direction'] == "down") |
||||||
|
$counter['count'] -= $counter['skip']; |
||||||
|
else |
||||||
|
$counter['count'] += $counter['skip']; |
||||||
|
|
||||||
|
return $retval; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,106 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsFunction |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty {cycle} function plugin |
||||||
|
* |
||||||
|
* Type: function<br> |
||||||
|
* Name: cycle<br> |
||||||
|
* Date: May 3, 2002<br> |
||||||
|
* Purpose: cycle through given values<br> |
||||||
|
* Params: |
||||||
|
* <pre> |
||||||
|
* - name - name of cycle (optional) |
||||||
|
* - values - comma separated list of values to cycle, or an array of values to cycle |
||||||
|
* (this can be left out for subsequent calls) |
||||||
|
* - reset - boolean - resets given var to true |
||||||
|
* - print - boolean - print var or not. default is true |
||||||
|
* - advance - boolean - whether or not to advance the cycle |
||||||
|
* - delimiter - the value delimiter, default is "," |
||||||
|
* - assign - boolean, assigns to template var instead of printed. |
||||||
|
* </pre> |
||||||
|
* Examples:<br> |
||||||
|
* <pre> |
||||||
|
* {cycle values="#eeeeee,#d0d0d0d"} |
||||||
|
* {cycle name=row values="one,two,three" reset=true} |
||||||
|
* {cycle name=row} |
||||||
|
* </pre> |
||||||
|
* |
||||||
|
* @link http://www.smarty.net/manual/en/language.function.cycle.php {cycle} |
||||||
|
* (Smarty online manual) |
||||||
|
* @author Monte Ohrt <monte at ohrt dot com> |
||||||
|
* @author credit to Mark Priatel <mpriatel@rogers.com> |
||||||
|
* @author credit to Gerard <gerard@interfold.com> |
||||||
|
* @author credit to Jason Sweat <jsweat_php@yahoo.com> |
||||||
|
* @version 1.3 |
||||||
|
* @param array $params parameters |
||||||
|
* @param Smarty_Internal_Template $template template object |
||||||
|
* @return string|null |
||||||
|
*/ |
||||||
|
|
||||||
|
function smarty_function_cycle($params, $template) |
||||||
|
{ |
||||||
|
static $cycle_vars; |
||||||
|
|
||||||
|
$name = (empty($params['name'])) ? 'default' : $params['name']; |
||||||
|
$print = (isset($params['print'])) ? (bool)$params['print'] : true; |
||||||
|
$advance = (isset($params['advance'])) ? (bool)$params['advance'] : true; |
||||||
|
$reset = (isset($params['reset'])) ? (bool)$params['reset'] : false; |
||||||
|
|
||||||
|
if (!isset($params['values'])) { |
||||||
|
if(!isset($cycle_vars[$name]['values'])) { |
||||||
|
trigger_error("cycle: missing 'values' parameter"); |
||||||
|
return; |
||||||
|
} |
||||||
|
} else { |
||||||
|
if(isset($cycle_vars[$name]['values']) |
||||||
|
&& $cycle_vars[$name]['values'] != $params['values'] ) { |
||||||
|
$cycle_vars[$name]['index'] = 0; |
||||||
|
} |
||||||
|
$cycle_vars[$name]['values'] = $params['values']; |
||||||
|
} |
||||||
|
|
||||||
|
if (isset($params['delimiter'])) { |
||||||
|
$cycle_vars[$name]['delimiter'] = $params['delimiter']; |
||||||
|
} elseif (!isset($cycle_vars[$name]['delimiter'])) { |
||||||
|
$cycle_vars[$name]['delimiter'] = ','; |
||||||
|
} |
||||||
|
|
||||||
|
if(is_array($cycle_vars[$name]['values'])) { |
||||||
|
$cycle_array = $cycle_vars[$name]['values']; |
||||||
|
} else { |
||||||
|
$cycle_array = explode($cycle_vars[$name]['delimiter'],$cycle_vars[$name]['values']); |
||||||
|
} |
||||||
|
|
||||||
|
if(!isset($cycle_vars[$name]['index']) || $reset ) { |
||||||
|
$cycle_vars[$name]['index'] = 0; |
||||||
|
} |
||||||
|
|
||||||
|
if (isset($params['assign'])) { |
||||||
|
$print = false; |
||||||
|
$template->assign($params['assign'], $cycle_array[$cycle_vars[$name]['index']]); |
||||||
|
} |
||||||
|
|
||||||
|
if($print) { |
||||||
|
$retval = $cycle_array[$cycle_vars[$name]['index']]; |
||||||
|
} else { |
||||||
|
$retval = null; |
||||||
|
} |
||||||
|
|
||||||
|
if($advance) { |
||||||
|
if ( $cycle_vars[$name]['index'] >= count($cycle_array) -1 ) { |
||||||
|
$cycle_vars[$name]['index'] = 0; |
||||||
|
} else { |
||||||
|
$cycle_vars[$name]['index']++; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return $retval; |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,214 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsFunction |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty {fetch} plugin |
||||||
|
* |
||||||
|
* Type: function<br> |
||||||
|
* Name: fetch<br> |
||||||
|
* Purpose: fetch file, web or ftp data and display results |
||||||
|
* |
||||||
|
* @link http://www.smarty.net/manual/en/language.function.fetch.php {fetch} |
||||||
|
* (Smarty online manual) |
||||||
|
* @author Monte Ohrt <monte at ohrt dot com> |
||||||
|
* @param array $params parameters |
||||||
|
* @param Smarty_Internal_Template $template template object |
||||||
|
* @return string|null if the assign parameter is passed, Smarty assigns the result to a template variable |
||||||
|
*/ |
||||||
|
function smarty_function_fetch($params, $template) |
||||||
|
{ |
||||||
|
if (empty($params['file'])) { |
||||||
|
trigger_error("[plugin] fetch parameter 'file' cannot be empty",E_USER_NOTICE); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
// strip file protocol |
||||||
|
if (stripos($params['file'], 'file://') === 0) { |
||||||
|
$params['file'] = substr($params['file'], 7); |
||||||
|
} |
||||||
|
|
||||||
|
$protocol = strpos($params['file'], '://'); |
||||||
|
if ($protocol !== false) { |
||||||
|
$protocol = strtolower(substr($params['file'], 0, $protocol)); |
||||||
|
} |
||||||
|
|
||||||
|
if (isset($template->smarty->security_policy)) { |
||||||
|
if ($protocol) { |
||||||
|
// remote resource (or php stream, …) |
||||||
|
if(!$template->smarty->security_policy->isTrustedUri($params['file'])) { |
||||||
|
return; |
||||||
|
} |
||||||
|
} else { |
||||||
|
// local file |
||||||
|
if(!$template->smarty->security_policy->isTrustedResourceDir($params['file'])) { |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
$content = ''; |
||||||
|
if ($protocol == 'http') { |
||||||
|
// http fetch |
||||||
|
if($uri_parts = parse_url($params['file'])) { |
||||||
|
// set defaults |
||||||
|
$host = $server_name = $uri_parts['host']; |
||||||
|
$timeout = 30; |
||||||
|
$accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*"; |
||||||
|
$agent = "Smarty Template Engine ". Smarty::SMARTY_VERSION; |
||||||
|
$referer = ""; |
||||||
|
$uri = !empty($uri_parts['path']) ? $uri_parts['path'] : '/'; |
||||||
|
$uri .= !empty($uri_parts['query']) ? '?' . $uri_parts['query'] : ''; |
||||||
|
$_is_proxy = false; |
||||||
|
if(empty($uri_parts['port'])) { |
||||||
|
$port = 80; |
||||||
|
} else { |
||||||
|
$port = $uri_parts['port']; |
||||||
|
} |
||||||
|
if(!empty($uri_parts['user'])) { |
||||||
|
$user = $uri_parts['user']; |
||||||
|
} |
||||||
|
if(!empty($uri_parts['pass'])) { |
||||||
|
$pass = $uri_parts['pass']; |
||||||
|
} |
||||||
|
// loop through parameters, setup headers |
||||||
|
foreach($params as $param_key => $param_value) { |
||||||
|
switch($param_key) { |
||||||
|
case "file": |
||||||
|
case "assign": |
||||||
|
case "assign_headers": |
||||||
|
break; |
||||||
|
case "user": |
||||||
|
if(!empty($param_value)) { |
||||||
|
$user = $param_value; |
||||||
|
} |
||||||
|
break; |
||||||
|
case "pass": |
||||||
|
if(!empty($param_value)) { |
||||||
|
$pass = $param_value; |
||||||
|
} |
||||||
|
break; |
||||||
|
case "accept": |
||||||
|
if(!empty($param_value)) { |
||||||
|
$accept = $param_value; |
||||||
|
} |
||||||
|
break; |
||||||
|
case "header": |
||||||
|
if(!empty($param_value)) { |
||||||
|
if(!preg_match('![\w\d-]+: .+!',$param_value)) { |
||||||
|
trigger_error("[plugin] invalid header format '".$param_value."'",E_USER_NOTICE); |
||||||
|
return; |
||||||
|
} else { |
||||||
|
$extra_headers[] = $param_value; |
||||||
|
} |
||||||
|
} |
||||||
|
break; |
||||||
|
case "proxy_host": |
||||||
|
if(!empty($param_value)) { |
||||||
|
$proxy_host = $param_value; |
||||||
|
} |
||||||
|
break; |
||||||
|
case "proxy_port": |
||||||
|
if(!preg_match('!\D!', $param_value)) { |
||||||
|
$proxy_port = (int) $param_value; |
||||||
|
} else { |
||||||
|
trigger_error("[plugin] invalid value for attribute '".$param_key."'",E_USER_NOTICE); |
||||||
|
return; |
||||||
|
} |
||||||
|
break; |
||||||
|
case "agent": |
||||||
|
if(!empty($param_value)) { |
||||||
|
$agent = $param_value; |
||||||
|
} |
||||||
|
break; |
||||||
|
case "referer": |
||||||
|
if(!empty($param_value)) { |
||||||
|
$referer = $param_value; |
||||||
|
} |
||||||
|
break; |
||||||
|
case "timeout": |
||||||
|
if(!preg_match('!\D!', $param_value)) { |
||||||
|
$timeout = (int) $param_value; |
||||||
|
} else { |
||||||
|
trigger_error("[plugin] invalid value for attribute '".$param_key."'",E_USER_NOTICE); |
||||||
|
return; |
||||||
|
} |
||||||
|
break; |
||||||
|
default: |
||||||
|
trigger_error("[plugin] unrecognized attribute '".$param_key."'",E_USER_NOTICE); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
if(!empty($proxy_host) && !empty($proxy_port)) { |
||||||
|
$_is_proxy = true; |
||||||
|
$fp = fsockopen($proxy_host,$proxy_port,$errno,$errstr,$timeout); |
||||||
|
} else { |
||||||
|
$fp = fsockopen($server_name,$port,$errno,$errstr,$timeout); |
||||||
|
} |
||||||
|
|
||||||
|
if(!$fp) { |
||||||
|
trigger_error("[plugin] unable to fetch: $errstr ($errno)",E_USER_NOTICE); |
||||||
|
return; |
||||||
|
} else { |
||||||
|
if($_is_proxy) { |
||||||
|
fputs($fp, 'GET ' . $params['file'] . " HTTP/1.0\r\n"); |
||||||
|
} else { |
||||||
|
fputs($fp, "GET $uri HTTP/1.0\r\n"); |
||||||
|
} |
||||||
|
if(!empty($host)) { |
||||||
|
fputs($fp, "Host: $host\r\n"); |
||||||
|
} |
||||||
|
if(!empty($accept)) { |
||||||
|
fputs($fp, "Accept: $accept\r\n"); |
||||||
|
} |
||||||
|
if(!empty($agent)) { |
||||||
|
fputs($fp, "User-Agent: $agent\r\n"); |
||||||
|
} |
||||||
|
if(!empty($referer)) { |
||||||
|
fputs($fp, "Referer: $referer\r\n"); |
||||||
|
} |
||||||
|
if(isset($extra_headers) && is_array($extra_headers)) { |
||||||
|
foreach($extra_headers as $curr_header) { |
||||||
|
fputs($fp, $curr_header."\r\n"); |
||||||
|
} |
||||||
|
} |
||||||
|
if(!empty($user) && !empty($pass)) { |
||||||
|
fputs($fp, "Authorization: BASIC ".base64_encode("$user:$pass")."\r\n"); |
||||||
|
} |
||||||
|
|
||||||
|
fputs($fp, "\r\n"); |
||||||
|
while(!feof($fp)) { |
||||||
|
$content .= fgets($fp,4096); |
||||||
|
} |
||||||
|
fclose($fp); |
||||||
|
$csplit = preg_split("!\r\n\r\n!",$content,2); |
||||||
|
|
||||||
|
$content = $csplit[1]; |
||||||
|
|
||||||
|
if(!empty($params['assign_headers'])) { |
||||||
|
$template->assign($params['assign_headers'],preg_split("!\r\n!",$csplit[0])); |
||||||
|
} |
||||||
|
} |
||||||
|
} else { |
||||||
|
trigger_error("[plugin fetch] unable to parse URL, check syntax",E_USER_NOTICE); |
||||||
|
return; |
||||||
|
} |
||||||
|
} else { |
||||||
|
$content = @file_get_contents($params['file']); |
||||||
|
if ($content === false) { |
||||||
|
throw new SmartyException("{fetch} cannot read resource '" . $params['file'] ."'"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (!empty($params['assign'])) { |
||||||
|
$template->assign($params['assign'], $content); |
||||||
|
} else { |
||||||
|
return $content; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,216 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsFunction |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty {html_checkboxes} function plugin |
||||||
|
* |
||||||
|
* File: function.html_checkboxes.php<br> |
||||||
|
* Type: function<br> |
||||||
|
* Name: html_checkboxes<br> |
||||||
|
* Date: 24.Feb.2003<br> |
||||||
|
* Purpose: Prints out a list of checkbox input types<br> |
||||||
|
* Examples: |
||||||
|
* <pre> |
||||||
|
* {html_checkboxes values=$ids output=$names} |
||||||
|
* {html_checkboxes values=$ids name='box' separator='<br>' output=$names} |
||||||
|
* {html_checkboxes values=$ids checked=$checked separator='<br>' output=$names} |
||||||
|
* </pre> |
||||||
|
* Params: |
||||||
|
* <pre> |
||||||
|
* - name (optional) - string default "checkbox" |
||||||
|
* - values (required) - array |
||||||
|
* - options (optional) - associative array |
||||||
|
* - checked (optional) - array default not set |
||||||
|
* - separator (optional) - ie <br> or |
||||||
|
* - output (optional) - the output next to each checkbox |
||||||
|
* - assign (optional) - assign the output as an array to this variable |
||||||
|
* - escape (optional) - escape the content (not value), defaults to true |
||||||
|
* </pre> |
||||||
|
* |
||||||
|
* @link http://www.smarty.net/manual/en/language.function.html.checkboxes.php {html_checkboxes} |
||||||
|
* (Smarty online manual) |
||||||
|
* @author Christopher Kvarme <christopher.kvarme@flashjab.com> |
||||||
|
* @author credits to Monte Ohrt <monte at ohrt dot com> |
||||||
|
* @version 1.0 |
||||||
|
* @param array $params parameters |
||||||
|
* @param object $template template object |
||||||
|
* @return string |
||||||
|
* @uses smarty_function_escape_special_chars() |
||||||
|
*/ |
||||||
|
function smarty_function_html_checkboxes($params, $template) |
||||||
|
{ |
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); |
||||||
|
|
||||||
|
$name = 'checkbox'; |
||||||
|
$values = null; |
||||||
|
$options = null; |
||||||
|
$selected = array(); |
||||||
|
$separator = ''; |
||||||
|
$escape = true; |
||||||
|
$labels = true; |
||||||
|
$label_ids = false; |
||||||
|
$output = null; |
||||||
|
|
||||||
|
$extra = ''; |
||||||
|
|
||||||
|
foreach($params as $_key => $_val) { |
||||||
|
switch($_key) { |
||||||
|
case 'name': |
||||||
|
case 'separator': |
||||||
|
$$_key = (string) $_val; |
||||||
|
break; |
||||||
|
|
||||||
|
case 'escape': |
||||||
|
case 'labels': |
||||||
|
case 'label_ids': |
||||||
|
$$_key = (bool) $_val; |
||||||
|
break; |
||||||
|
|
||||||
|
case 'options': |
||||||
|
$$_key = (array) $_val; |
||||||
|
break; |
||||||
|
|
||||||
|
case 'values': |
||||||
|
case 'output': |
||||||
|
$$_key = array_values((array) $_val); |
||||||
|
break; |
||||||
|
|
||||||
|
case 'checked': |
||||||
|
case 'selected': |
||||||
|
if (is_array($_val)) { |
||||||
|
$selected = array(); |
||||||
|
foreach ($_val as $_sel) { |
||||||
|
if (is_object($_sel)) { |
||||||
|
if (method_exists($_sel, "__toString")) { |
||||||
|
$_sel = smarty_function_escape_special_chars((string) $_sel->__toString()); |
||||||
|
} else { |
||||||
|
trigger_error("html_checkboxes: selected attribute contains an object of class '". get_class($_sel) ."' without __toString() method", E_USER_NOTICE); |
||||||
|
continue; |
||||||
|
} |
||||||
|
} else { |
||||||
|
$_sel = smarty_function_escape_special_chars((string) $_sel); |
||||||
|
} |
||||||
|
$selected[$_sel] = true; |
||||||
|
} |
||||||
|
} elseif (is_object($_val)) { |
||||||
|
if (method_exists($_val, "__toString")) { |
||||||
|
$selected = smarty_function_escape_special_chars((string) $_val->__toString()); |
||||||
|
} else { |
||||||
|
trigger_error("html_checkboxes: selected attribute is an object of class '". get_class($_val) ."' without __toString() method", E_USER_NOTICE); |
||||||
|
} |
||||||
|
} else { |
||||||
|
$selected = smarty_function_escape_special_chars((string) $_val); |
||||||
|
} |
||||||
|
break; |
||||||
|
|
||||||
|
case 'checkboxes': |
||||||
|
trigger_error('html_checkboxes: the use of the "checkboxes" attribute is deprecated, use "options" instead', E_USER_WARNING); |
||||||
|
$options = (array) $_val; |
||||||
|
break; |
||||||
|
|
||||||
|
case 'assign': |
||||||
|
break; |
||||||
|
|
||||||
|
default: |
||||||
|
if(!is_array($_val)) { |
||||||
|
$extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"'; |
||||||
|
} else { |
||||||
|
trigger_error("html_checkboxes: extra attribute '$_key' cannot be an array", E_USER_NOTICE); |
||||||
|
} |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (!isset($options) && !isset($values)) |
||||||
|
return ''; /* raise error here? */ |
||||||
|
|
||||||
|
$_html_result = array(); |
||||||
|
|
||||||
|
if (isset($options)) { |
||||||
|
foreach ($options as $_key=>$_val) { |
||||||
|
$_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids, $escape); |
||||||
|
} |
||||||
|
} else { |
||||||
|
foreach ($values as $_i=>$_key) { |
||||||
|
$_val = isset($output[$_i]) ? $output[$_i] : ''; |
||||||
|
$_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids, $escape); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if(!empty($params['assign'])) { |
||||||
|
$template->assign($params['assign'], $_html_result); |
||||||
|
} else { |
||||||
|
return implode("\n", $_html_result); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
function smarty_function_html_checkboxes_output($name, $value, $output, $selected, $extra, $separator, $labels, $label_ids, $escape=true) { |
||||||
|
$_output = ''; |
||||||
|
|
||||||
|
if (is_object($value)) { |
||||||
|
if (method_exists($value, "__toString")) { |
||||||
|
$value = (string) $value->__toString(); |
||||||
|
} else { |
||||||
|
trigger_error("html_options: value is an object of class '". get_class($value) ."' without __toString() method", E_USER_NOTICE); |
||||||
|
return ''; |
||||||
|
} |
||||||
|
} else { |
||||||
|
$value = (string) $value; |
||||||
|
} |
||||||
|
|
||||||
|
if (is_object($output)) { |
||||||
|
if (method_exists($output, "__toString")) { |
||||||
|
$output = (string) $output->__toString(); |
||||||
|
} else { |
||||||
|
trigger_error("html_options: output is an object of class '". get_class($output) ."' without __toString() method", E_USER_NOTICE); |
||||||
|
return ''; |
||||||
|
} |
||||||
|
} else { |
||||||
|
$output = (string) $output; |
||||||
|
} |
||||||
|
|
||||||
|
if ($labels) { |
||||||
|
if ($label_ids) { |
||||||
|
$_id = smarty_function_escape_special_chars(preg_replace('![^\w\-\.]!' . Smarty::$_UTF8_MODIFIER, '_', $name . '_' . $value)); |
||||||
|
$_output .= '<label for="' . $_id . '">'; |
||||||
|
} else { |
||||||
|
$_output .= '<label>'; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
$name = smarty_function_escape_special_chars($name); |
||||||
|
$value = smarty_function_escape_special_chars($value); |
||||||
|
if ($escape) { |
||||||
|
$output = smarty_function_escape_special_chars($output); |
||||||
|
} |
||||||
|
|
||||||
|
$_output .= '<input type="checkbox" name="' . $name . '[]" value="' . $value . '"'; |
||||||
|
|
||||||
|
if ($labels && $label_ids) { |
||||||
|
$_output .= ' id="' . $_id . '"'; |
||||||
|
} |
||||||
|
|
||||||
|
if (is_array($selected)) { |
||||||
|
if (isset($selected[$value])) { |
||||||
|
$_output .= ' checked="checked"'; |
||||||
|
} |
||||||
|
} elseif ($value === $selected) { |
||||||
|
$_output .= ' checked="checked"'; |
||||||
|
} |
||||||
|
|
||||||
|
$_output .= $extra . ' />' . $output; |
||||||
|
if ($labels) { |
||||||
|
$_output .= '</label>'; |
||||||
|
} |
||||||
|
|
||||||
|
$_output .= $separator; |
||||||
|
return $_output; |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,159 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsFunction |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty {html_image} function plugin |
||||||
|
* |
||||||
|
* Type: function<br> |
||||||
|
* Name: html_image<br> |
||||||
|
* Date: Feb 24, 2003<br> |
||||||
|
* Purpose: format HTML tags for the image<br> |
||||||
|
* Examples: {html_image file="/images/masthead.gif"}<br> |
||||||
|
* Output: <img src="/images/masthead.gif" width=400 height=23><br> |
||||||
|
* Params: |
||||||
|
* <pre> |
||||||
|
* - file - (required) - file (and path) of image |
||||||
|
* - height - (optional) - image height (default actual height) |
||||||
|
* - width - (optional) - image width (default actual width) |
||||||
|
* - basedir - (optional) - base directory for absolute paths, default is environment variable DOCUMENT_ROOT |
||||||
|
* - path_prefix - prefix for path output (optional, default empty) |
||||||
|
* </pre> |
||||||
|
* |
||||||
|
* @link http://www.smarty.net/manual/en/language.function.html.image.php {html_image} |
||||||
|
* (Smarty online manual) |
||||||
|
* @author Monte Ohrt <monte at ohrt dot com> |
||||||
|
* @author credits to Duda <duda@big.hu> |
||||||
|
* @version 1.0 |
||||||
|
* @param array $params parameters |
||||||
|
* @param Smarty_Internal_Template $template template object |
||||||
|
* @return string |
||||||
|
* @uses smarty_function_escape_special_chars() |
||||||
|
*/ |
||||||
|
function smarty_function_html_image($params, $template) |
||||||
|
{ |
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); |
||||||
|
|
||||||
|
$alt = ''; |
||||||
|
$file = ''; |
||||||
|
$height = ''; |
||||||
|
$width = ''; |
||||||
|
$extra = ''; |
||||||
|
$prefix = ''; |
||||||
|
$suffix = ''; |
||||||
|
$path_prefix = ''; |
||||||
|
$basedir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : ''; |
||||||
|
foreach($params as $_key => $_val) { |
||||||
|
switch ($_key) { |
||||||
|
case 'file': |
||||||
|
case 'height': |
||||||
|
case 'width': |
||||||
|
case 'dpi': |
||||||
|
case 'path_prefix': |
||||||
|
case 'basedir': |
||||||
|
$$_key = $_val; |
||||||
|
break; |
||||||
|
|
||||||
|
case 'alt': |
||||||
|
if (!is_array($_val)) { |
||||||
|
$$_key = smarty_function_escape_special_chars($_val); |
||||||
|
} else { |
||||||
|
throw new SmartyException ("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE); |
||||||
|
} |
||||||
|
break; |
||||||
|
|
||||||
|
case 'link': |
||||||
|
case 'href': |
||||||
|
$prefix = '<a href="' . $_val . '">'; |
||||||
|
$suffix = '</a>'; |
||||||
|
break; |
||||||
|
|
||||||
|
default: |
||||||
|
if (!is_array($_val)) { |
||||||
|
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; |
||||||
|
} else { |
||||||
|
throw new SmartyException ("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE); |
||||||
|
} |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (empty($file)) { |
||||||
|
trigger_error("html_image: missing 'file' parameter", E_USER_NOTICE); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
if ($file[0] == '/') { |
||||||
|
$_image_path = $basedir . $file; |
||||||
|
} else { |
||||||
|
$_image_path = $file; |
||||||
|
} |
||||||
|
|
||||||
|
// strip file protocol |
||||||
|
if (stripos($params['file'], 'file://') === 0) { |
||||||
|
$params['file'] = substr($params['file'], 7); |
||||||
|
} |
||||||
|
|
||||||
|
$protocol = strpos($params['file'], '://'); |
||||||
|
if ($protocol !== false) { |
||||||
|
$protocol = strtolower(substr($params['file'], 0, $protocol)); |
||||||
|
} |
||||||
|
|
||||||
|
if (isset($template->smarty->security_policy)) { |
||||||
|
if ($protocol) { |
||||||
|
// remote resource (or php stream, …) |
||||||
|
if(!$template->smarty->security_policy->isTrustedUri($params['file'])) { |
||||||
|
return; |
||||||
|
} |
||||||
|
} else { |
||||||
|
// local file |
||||||
|
if(!$template->smarty->security_policy->isTrustedResourceDir($params['file'])) { |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (!isset($params['width']) || !isset($params['height'])) { |
||||||
|
// FIXME: (rodneyrehm) getimagesize() loads the complete file off a remote resource, use custom [jpg,png,gif]header reader! |
||||||
|
if (!$_image_data = @getimagesize($_image_path)) { |
||||||
|
if (!file_exists($_image_path)) { |
||||||
|
trigger_error("html_image: unable to find '$_image_path'", E_USER_NOTICE); |
||||||
|
return; |
||||||
|
} else if (!is_readable($_image_path)) { |
||||||
|
trigger_error("html_image: unable to read '$_image_path'", E_USER_NOTICE); |
||||||
|
return; |
||||||
|
} else { |
||||||
|
trigger_error("html_image: '$_image_path' is not a valid image file", E_USER_NOTICE); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (!isset($params['width'])) { |
||||||
|
$width = $_image_data[0]; |
||||||
|
} |
||||||
|
if (!isset($params['height'])) { |
||||||
|
$height = $_image_data[1]; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (isset($params['dpi'])) { |
||||||
|
if (strstr($_SERVER['HTTP_USER_AGENT'], 'Mac')) { |
||||||
|
// FIXME: (rodneyrehm) wrong dpi assumption |
||||||
|
// don't know who thought this up… even if it was true in 1998, it's definitely wrong in 2011. |
||||||
|
$dpi_default = 72; |
||||||
|
} else { |
||||||
|
$dpi_default = 96; |
||||||
|
} |
||||||
|
$_resize = $dpi_default / $params['dpi']; |
||||||
|
$width = round($width * $_resize); |
||||||
|
$height = round($height * $_resize); |
||||||
|
} |
||||||
|
|
||||||
|
return $prefix . '<img src="' . $path_prefix . $file . '" alt="' . $alt . '" width="' . $width . '" height="' . $height . '"' . $extra . ' />' . $suffix; |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,176 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsFunction |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty {html_options} function plugin |
||||||
|
* |
||||||
|
* Type: function<br> |
||||||
|
* Name: html_options<br> |
||||||
|
* Purpose: Prints the list of <option> tags generated from |
||||||
|
* the passed parameters<br> |
||||||
|
* Params: |
||||||
|
* <pre> |
||||||
|
* - name (optional) - string default "select" |
||||||
|
* - values (required) - if no options supplied) - array |
||||||
|
* - options (required) - if no values supplied) - associative array |
||||||
|
* - selected (optional) - string default not set |
||||||
|
* - output (required) - if not options supplied) - array |
||||||
|
* - id (optional) - string default not set |
||||||
|
* - class (optional) - string default not set |
||||||
|
* </pre> |
||||||
|
* |
||||||
|
* @link http://www.smarty.net/manual/en/language.function.html.options.php {html_image} |
||||||
|
* (Smarty online manual) |
||||||
|
* @author Monte Ohrt <monte at ohrt dot com> |
||||||
|
* @author Ralf Strehle (minor optimization) <ralf dot strehle at yahoo dot de> |
||||||
|
* @param array $params parameters |
||||||
|
* @param Smarty_Internal_Template $template template object |
||||||
|
* @return string |
||||||
|
* @uses smarty_function_escape_special_chars() |
||||||
|
*/ |
||||||
|
function smarty_function_html_options($params, $template) |
||||||
|
{ |
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); |
||||||
|
|
||||||
|
$name = null; |
||||||
|
$values = null; |
||||||
|
$options = null; |
||||||
|
$selected = null; |
||||||
|
$output = null; |
||||||
|
$id = null; |
||||||
|
$class = null; |
||||||
|
|
||||||
|
$extra = ''; |
||||||
|
|
||||||
|
foreach ($params as $_key => $_val) { |
||||||
|
switch ($_key) { |
||||||
|
case 'name': |
||||||
|
case 'class': |
||||||
|
case 'id': |
||||||
|
$$_key = (string) $_val; |
||||||
|
break; |
||||||
|
|
||||||
|
case 'options': |
||||||
|
$options = (array) $_val; |
||||||
|
break; |
||||||
|
|
||||||
|
case 'values': |
||||||
|
case 'output': |
||||||
|
$$_key = array_values((array) $_val); |
||||||
|
break; |
||||||
|
|
||||||
|
case 'selected': |
||||||
|
if (is_array($_val)) { |
||||||
|
$selected = array(); |
||||||
|
foreach ($_val as $_sel) { |
||||||
|
if (is_object($_sel)) { |
||||||
|
if (method_exists($_sel, "__toString")) { |
||||||
|
$_sel = smarty_function_escape_special_chars((string) $_sel->__toString()); |
||||||
|
} else { |
||||||
|
trigger_error("html_options: selected attribute contains an object of class '". get_class($_sel) ."' without __toString() method", E_USER_NOTICE); |
||||||
|
continue; |
||||||
|
} |
||||||
|
} else { |
||||||
|
$_sel = smarty_function_escape_special_chars((string) $_sel); |
||||||
|
} |
||||||
|
$selected[$_sel] = true; |
||||||
|
} |
||||||
|
} elseif (is_object($_val)) { |
||||||
|
if (method_exists($_val, "__toString")) { |
||||||
|
$selected = smarty_function_escape_special_chars((string) $_val->__toString()); |
||||||
|
} else { |
||||||
|
trigger_error("html_options: selected attribute is an object of class '". get_class($_val) ."' without __toString() method", E_USER_NOTICE); |
||||||
|
} |
||||||
|
} else { |
||||||
|
$selected = smarty_function_escape_special_chars((string) $_val); |
||||||
|
} |
||||||
|
break; |
||||||
|
|
||||||
|
default: |
||||||
|
if (!is_array($_val)) { |
||||||
|
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; |
||||||
|
} else { |
||||||
|
trigger_error("html_options: extra attribute '$_key' cannot be an array", E_USER_NOTICE); |
||||||
|
} |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (!isset($options) && !isset($values)) { |
||||||
|
/* raise error here? */ |
||||||
|
return ''; |
||||||
|
} |
||||||
|
|
||||||
|
$_html_result = ''; |
||||||
|
$_idx = 0; |
||||||
|
|
||||||
|
if (isset($options)) { |
||||||
|
foreach ($options as $_key => $_val) { |
||||||
|
$_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected, $id, $class, $_idx); |
||||||
|
} |
||||||
|
} else { |
||||||
|
foreach ($values as $_i => $_key) { |
||||||
|
$_val = isset($output[$_i]) ? $output[$_i] : ''; |
||||||
|
$_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected, $id, $class, $_idx); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (!empty($name)) { |
||||||
|
$_html_class = !empty($class) ? ' class="'.$class.'"' : ''; |
||||||
|
$_html_id = !empty($id) ? ' id="'.$id.'"' : ''; |
||||||
|
$_html_result = '<select name="' . $name . '"' . $_html_class . $_html_id . $extra . '>' . "\n" . $_html_result . '</select>' . "\n"; |
||||||
|
} |
||||||
|
|
||||||
|
return $_html_result; |
||||||
|
} |
||||||
|
|
||||||
|
function smarty_function_html_options_optoutput($key, $value, $selected, $id, $class, &$idx) |
||||||
|
{ |
||||||
|
if (!is_array($value)) { |
||||||
|
$_key = smarty_function_escape_special_chars($key); |
||||||
|
$_html_result = '<option value="' . $_key . '"'; |
||||||
|
if (is_array($selected)) { |
||||||
|
if (isset($selected[$_key])) { |
||||||
|
$_html_result .= ' selected="selected"'; |
||||||
|
} |
||||||
|
} elseif ($_key === $selected) { |
||||||
|
$_html_result .= ' selected="selected"'; |
||||||
|
} |
||||||
|
$_html_class = !empty($class) ? ' class="'.$class.' option"' : ''; |
||||||
|
$_html_id = !empty($id) ? ' id="'.$id.'-'.$idx.'"' : ''; |
||||||
|
if (is_object($value)) { |
||||||
|
if (method_exists($value, "__toString")) { |
||||||
|
$value = smarty_function_escape_special_chars((string) $value->__toString()); |
||||||
|
} else { |
||||||
|
trigger_error("html_options: value is an object of class '". get_class($value) ."' without __toString() method", E_USER_NOTICE); |
||||||
|
return ''; |
||||||
|
} |
||||||
|
} else { |
||||||
|
$value = smarty_function_escape_special_chars((string) $value); |
||||||
|
} |
||||||
|
$_html_result .= $_html_class . $_html_id . '>' . $value . '</option>' . "\n"; |
||||||
|
$idx++; |
||||||
|
} else { |
||||||
|
$_idx = 0; |
||||||
|
$_html_result = smarty_function_html_options_optgroup($key, $value, $selected, !empty($id) ? ($id.'-'.$idx) : null, $class, $_idx); |
||||||
|
$idx++; |
||||||
|
} |
||||||
|
return $_html_result; |
||||||
|
} |
||||||
|
|
||||||
|
function smarty_function_html_options_optgroup($key, $values, $selected, $id, $class, &$idx) |
||||||
|
{ |
||||||
|
$optgroup_html = '<optgroup label="' . smarty_function_escape_special_chars($key) . '">' . "\n"; |
||||||
|
foreach ($values as $key => $value) { |
||||||
|
$optgroup_html .= smarty_function_html_options_optoutput($key, $value, $selected, $id, $class, $idx); |
||||||
|
} |
||||||
|
$optgroup_html .= "</optgroup>\n"; |
||||||
|
return $optgroup_html; |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,200 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsFunction |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty {html_radios} function plugin |
||||||
|
* |
||||||
|
* File: function.html_radios.php<br> |
||||||
|
* Type: function<br> |
||||||
|
* Name: html_radios<br> |
||||||
|
* Date: 24.Feb.2003<br> |
||||||
|
* Purpose: Prints out a list of radio input types<br> |
||||||
|
* Params: |
||||||
|
* <pre> |
||||||
|
* - name (optional) - string default "radio" |
||||||
|
* - values (required) - array |
||||||
|
* - options (required) - associative array |
||||||
|
* - checked (optional) - array default not set |
||||||
|
* - separator (optional) - ie <br> or |
||||||
|
* - output (optional) - the output next to each radio button |
||||||
|
* - assign (optional) - assign the output as an array to this variable |
||||||
|
* - escape (optional) - escape the content (not value), defaults to true |
||||||
|
* </pre> |
||||||
|
* Examples: |
||||||
|
* <pre> |
||||||
|
* {html_radios values=$ids output=$names} |
||||||
|
* {html_radios values=$ids name='box' separator='<br>' output=$names} |
||||||
|
* {html_radios values=$ids checked=$checked separator='<br>' output=$names} |
||||||
|
* </pre> |
||||||
|
* |
||||||
|
* @link http://smarty.php.net/manual/en/language.function.html.radios.php {html_radios} |
||||||
|
* (Smarty online manual) |
||||||
|
* @author Christopher Kvarme <christopher.kvarme@flashjab.com> |
||||||
|
* @author credits to Monte Ohrt <monte at ohrt dot com> |
||||||
|
* @version 1.0 |
||||||
|
* @param array $params parameters |
||||||
|
* @param Smarty_Internal_Template $template template object |
||||||
|
* @return string |
||||||
|
* @uses smarty_function_escape_special_chars() |
||||||
|
*/ |
||||||
|
function smarty_function_html_radios($params, $template) |
||||||
|
{ |
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); |
||||||
|
|
||||||
|
$name = 'radio'; |
||||||
|
$values = null; |
||||||
|
$options = null; |
||||||
|
$selected = null; |
||||||
|
$separator = ''; |
||||||
|
$escape = true; |
||||||
|
$labels = true; |
||||||
|
$label_ids = false; |
||||||
|
$output = null; |
||||||
|
$extra = ''; |
||||||
|
|
||||||
|
foreach($params as $_key => $_val) { |
||||||
|
switch ($_key) { |
||||||
|
case 'name': |
||||||
|
case 'separator': |
||||||
|
$$_key = (string) $_val; |
||||||
|
break; |
||||||
|
|
||||||
|
case 'checked': |
||||||
|
case 'selected': |
||||||
|
if (is_array($_val)) { |
||||||
|
trigger_error('html_radios: the "' . $_key . '" attribute cannot be an array', E_USER_WARNING); |
||||||
|
} elseif (is_object($_val)) { |
||||||
|
if (method_exists($_val, "__toString")) { |
||||||
|
$selected = smarty_function_escape_special_chars((string) $_val->__toString()); |
||||||
|
} else { |
||||||
|
trigger_error("html_radios: selected attribute is an object of class '". get_class($_val) ."' without __toString() method", E_USER_NOTICE); |
||||||
|
} |
||||||
|
} else { |
||||||
|
$selected = (string) $_val; |
||||||
|
} |
||||||
|
break; |
||||||
|
|
||||||
|
case 'escape': |
||||||
|
case 'labels': |
||||||
|
case 'label_ids': |
||||||
|
$$_key = (bool) $_val; |
||||||
|
break; |
||||||
|
|
||||||
|
case 'options': |
||||||
|
$$_key = (array) $_val; |
||||||
|
break; |
||||||
|
|
||||||
|
case 'values': |
||||||
|
case 'output': |
||||||
|
$$_key = array_values((array) $_val); |
||||||
|
break; |
||||||
|
|
||||||
|
case 'radios': |
||||||
|
trigger_error('html_radios: the use of the "radios" attribute is deprecated, use "options" instead', E_USER_WARNING); |
||||||
|
$options = (array) $_val; |
||||||
|
break; |
||||||
|
|
||||||
|
case 'assign': |
||||||
|
break; |
||||||
|
|
||||||
|
default: |
||||||
|
if (!is_array($_val)) { |
||||||
|
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; |
||||||
|
} else { |
||||||
|
trigger_error("html_radios: extra attribute '$_key' cannot be an array", E_USER_NOTICE); |
||||||
|
} |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (!isset($options) && !isset($values)) { |
||||||
|
/* raise error here? */ |
||||||
|
return ''; |
||||||
|
} |
||||||
|
|
||||||
|
$_html_result = array(); |
||||||
|
|
||||||
|
if (isset($options)) { |
||||||
|
foreach ($options as $_key => $_val) { |
||||||
|
$_html_result[] = smarty_function_html_radios_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids, $escape); |
||||||
|
} |
||||||
|
} else { |
||||||
|
foreach ($values as $_i => $_key) { |
||||||
|
$_val = isset($output[$_i]) ? $output[$_i] : ''; |
||||||
|
$_html_result[] = smarty_function_html_radios_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids, $escape); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (!empty($params['assign'])) { |
||||||
|
$template->assign($params['assign'], $_html_result); |
||||||
|
} else { |
||||||
|
return implode("\n", $_html_result); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function smarty_function_html_radios_output($name, $value, $output, $selected, $extra, $separator, $labels, $label_ids, $escape) |
||||||
|
{ |
||||||
|
$_output = ''; |
||||||
|
|
||||||
|
if (is_object($value)) { |
||||||
|
if (method_exists($value, "__toString")) { |
||||||
|
$value = (string) $value->__toString(); |
||||||
|
} else { |
||||||
|
trigger_error("html_options: value is an object of class '". get_class($value) ."' without __toString() method", E_USER_NOTICE); |
||||||
|
return ''; |
||||||
|
} |
||||||
|
} else { |
||||||
|
$value = (string) $value; |
||||||
|
} |
||||||
|
|
||||||
|
if (is_object($output)) { |
||||||
|
if (method_exists($output, "__toString")) { |
||||||
|
$output = (string) $output->__toString(); |
||||||
|
} else { |
||||||
|
trigger_error("html_options: output is an object of class '". get_class($output) ."' without __toString() method", E_USER_NOTICE); |
||||||
|
return ''; |
||||||
|
} |
||||||
|
} else { |
||||||
|
$output = (string) $output; |
||||||
|
} |
||||||
|
|
||||||
|
if ($labels) { |
||||||
|
if ($label_ids) { |
||||||
|
$_id = smarty_function_escape_special_chars(preg_replace('![^\w\-\.]!' . Smarty::$_UTF8_MODIFIER, '_', $name . '_' . $value)); |
||||||
|
$_output .= '<label for="' . $_id . '">'; |
||||||
|
} else { |
||||||
|
$_output .= '<label>'; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
$name = smarty_function_escape_special_chars($name); |
||||||
|
$value = smarty_function_escape_special_chars($value); |
||||||
|
if ($escape) { |
||||||
|
$output = smarty_function_escape_special_chars($output); |
||||||
|
} |
||||||
|
|
||||||
|
$_output .= '<input type="radio" name="' . $name . '" value="' . $value . '"'; |
||||||
|
|
||||||
|
if ($labels && $label_ids) { |
||||||
|
$_output .= ' id="' . $_id . '"'; |
||||||
|
} |
||||||
|
|
||||||
|
if ($value === $selected) { |
||||||
|
$_output .= ' checked="checked"'; |
||||||
|
} |
||||||
|
|
||||||
|
$_output .= $extra . ' />' . $output; |
||||||
|
if ($labels) { |
||||||
|
$_output .= '</label>'; |
||||||
|
} |
||||||
|
|
||||||
|
$_output .= $separator; |
||||||
|
return $_output; |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,394 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsFunction |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* @ignore |
||||||
|
*/ |
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); |
||||||
|
/** |
||||||
|
* @ignore |
||||||
|
*/ |
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'); |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty {html_select_date} plugin |
||||||
|
* |
||||||
|
* Type: function<br> |
||||||
|
* Name: html_select_date<br> |
||||||
|
* Purpose: Prints the dropdowns for date selection. |
||||||
|
* |
||||||
|
* ChangeLog: |
||||||
|
* <pre> |
||||||
|
* - 1.0 initial release |
||||||
|
* - 1.1 added support for +/- N syntax for begin |
||||||
|
* and end year values. (Monte) |
||||||
|
* - 1.2 added support for yyyy-mm-dd syntax for |
||||||
|
* time value. (Jan Rosier) |
||||||
|
* - 1.3 added support for choosing format for |
||||||
|
* month values (Gary Loescher) |
||||||
|
* - 1.3.1 added support for choosing format for |
||||||
|
* day values (Marcus Bointon) |
||||||
|
* - 1.3.2 support negative timestamps, force year |
||||||
|
* dropdown to include given date unless explicitly set (Monte) |
||||||
|
* - 1.3.4 fix behaviour of 0000-00-00 00:00:00 dates to match that |
||||||
|
* of 0000-00-00 dates (cybot, boots) |
||||||
|
* - 2.0 complete rewrite for performance, |
||||||
|
* added attributes month_names, *_id |
||||||
|
* </pre> |
||||||
|
* |
||||||
|
* @link http://www.smarty.net/manual/en/language.function.html.select.date.php {html_select_date} |
||||||
|
* (Smarty online manual) |
||||||
|
* @version 2.0 |
||||||
|
* @author Andrei Zmievski |
||||||
|
* @author Monte Ohrt <monte at ohrt dot com> |
||||||
|
* @author Rodney Rehm |
||||||
|
* @param array $params parameters |
||||||
|
* @param Smarty_Internal_Template $template template object |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
function smarty_function_html_select_date($params, $template) |
||||||
|
{ |
||||||
|
// generate timestamps used for month names only |
||||||
|
static $_month_timestamps = null; |
||||||
|
static $_current_year = null; |
||||||
|
if ($_month_timestamps === null) { |
||||||
|
$_current_year = date('Y'); |
||||||
|
$_month_timestamps = array(); |
||||||
|
for ($i = 1; $i <= 12; $i++) { |
||||||
|
$_month_timestamps[$i] = mktime(0, 0, 0, $i, 1, 2000); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/* Default values. */ |
||||||
|
$prefix = "Date_"; |
||||||
|
$start_year = null; |
||||||
|
$end_year = null; |
||||||
|
$display_days = true; |
||||||
|
$display_months = true; |
||||||
|
$display_years = true; |
||||||
|
$month_format = "%B"; |
||||||
|
/* Write months as numbers by default GL */ |
||||||
|
$month_value_format = "%m"; |
||||||
|
$day_format = "%02d"; |
||||||
|
/* Write day values using this format MB */ |
||||||
|
$day_value_format = "%d"; |
||||||
|
$year_as_text = false; |
||||||
|
/* Display years in reverse order? Ie. 2000,1999,.... */ |
||||||
|
$reverse_years = false; |
||||||
|
/* Should the select boxes be part of an array when returned from PHP? |
||||||
|
e.g. setting it to "birthday", would create "birthday[Day]", |
||||||
|
"birthday[Month]" & "birthday[Year]". Can be combined with prefix */ |
||||||
|
$field_array = null; |
||||||
|
/* <select size>'s of the different <select> tags. |
||||||
|
If not set, uses default dropdown. */ |
||||||
|
$day_size = null; |
||||||
|
$month_size = null; |
||||||
|
$year_size = null; |
||||||
|
/* Unparsed attributes common to *ALL* the <select>/<input> tags. |
||||||
|
An example might be in the template: all_extra ='class ="foo"'. */ |
||||||
|
$all_extra = null; |
||||||
|
/* Separate attributes for the tags. */ |
||||||
|
$day_extra = null; |
||||||
|
$month_extra = null; |
||||||
|
$year_extra = null; |
||||||
|
/* Order in which to display the fields. |
||||||
|
"D" -> day, "M" -> month, "Y" -> year. */ |
||||||
|
$field_order = 'MDY'; |
||||||
|
/* String printed between the different fields. */ |
||||||
|
$field_separator = "\n"; |
||||||
|
$option_separator = "\n"; |
||||||
|
$time = null; |
||||||
|
// $all_empty = null; |
||||||
|
// $day_empty = null; |
||||||
|
// $month_empty = null; |
||||||
|
// $year_empty = null; |
||||||
|
$extra_attrs = ''; |
||||||
|
$all_id = null; |
||||||
|
$day_id = null; |
||||||
|
$month_id = null; |
||||||
|
$year_id = null; |
||||||
|
|
||||||
|
foreach ($params as $_key => $_value) { |
||||||
|
switch ($_key) { |
||||||
|
case 'time': |
||||||
|
if (!is_array($_value) && $_value !== null) { |
||||||
|
$time = smarty_make_timestamp($_value); |
||||||
|
} |
||||||
|
break; |
||||||
|
|
||||||
|
case 'month_names': |
||||||
|
if (is_array($_value) && count($_value) == 12) { |
||||||
|
$$_key = $_value; |
||||||
|
} else { |
||||||
|
trigger_error("html_select_date: month_names must be an array of 12 strings", E_USER_NOTICE); |
||||||
|
} |
||||||
|
break; |
||||||
|
|
||||||
|
case 'prefix': |
||||||
|
case 'field_array': |
||||||
|
case 'start_year': |
||||||
|
case 'end_year': |
||||||
|
case 'day_format': |
||||||
|
case 'day_value_format': |
||||||
|
case 'month_format': |
||||||
|
case 'month_value_format': |
||||||
|
case 'day_size': |
||||||
|
case 'month_size': |
||||||
|
case 'year_size': |
||||||
|
case 'all_extra': |
||||||
|
case 'day_extra': |
||||||
|
case 'month_extra': |
||||||
|
case 'year_extra': |
||||||
|
case 'field_order': |
||||||
|
case 'field_separator': |
||||||
|
case 'option_separator': |
||||||
|
case 'all_empty': |
||||||
|
case 'month_empty': |
||||||
|
case 'day_empty': |
||||||
|
case 'year_empty': |
||||||
|
case 'all_id': |
||||||
|
case 'month_id': |
||||||
|
case 'day_id': |
||||||
|
case 'year_id': |
||||||
|
$$_key = (string)$_value; |
||||||
|
break; |
||||||
|
|
||||||
|
case 'display_days': |
||||||
|
case 'display_months': |
||||||
|
case 'display_years': |
||||||
|
case 'year_as_text': |
||||||
|
case 'reverse_years': |
||||||
|
$$_key = (bool)$_value; |
||||||
|
break; |
||||||
|
|
||||||
|
default: |
||||||
|
if (!is_array($_value)) { |
||||||
|
$extra_attrs .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_value) . '"'; |
||||||
|
} else { |
||||||
|
trigger_error("html_select_date: extra attribute '$_key' cannot be an array", E_USER_NOTICE); |
||||||
|
} |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Note: date() is faster than strftime() |
||||||
|
// Note: explode(date()) is faster than date() date() date() |
||||||
|
if (isset($params['time']) && is_array($params['time'])) { |
||||||
|
if (isset($params['time'][$prefix . 'Year'])) { |
||||||
|
// $_REQUEST[$field_array] given |
||||||
|
foreach (array('Y' => 'Year', 'm' => 'Month', 'd' => 'Day') as $_elementKey => $_elementName) { |
||||||
|
$_variableName = '_' . strtolower($_elementName); |
||||||
|
$$_variableName = isset($params['time'][$prefix . $_elementName]) |
||||||
|
? $params['time'][$prefix . $_elementName] |
||||||
|
: date($_elementKey); |
||||||
|
} |
||||||
|
$time = mktime(0, 0, 0, $_month, $_day, $_year); |
||||||
|
} elseif (isset($params['time'][$field_array][$prefix . 'Year'])) { |
||||||
|
// $_REQUEST given |
||||||
|
foreach (array('Y' => 'Year', 'm' => 'Month', 'd' => 'Day') as $_elementKey => $_elementName) { |
||||||
|
$_variableName = '_' . strtolower($_elementName); |
||||||
|
$$_variableName = isset($params['time'][$field_array][$prefix . $_elementName]) |
||||||
|
? $params['time'][$field_array][$prefix . $_elementName] |
||||||
|
: date($_elementKey); |
||||||
|
} |
||||||
|
$time = mktime(0, 0, 0, $_month, $_day, $_year); |
||||||
|
} else { |
||||||
|
// no date found, use NOW |
||||||
|
list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d')); |
||||||
|
} |
||||||
|
} elseif ($time === null) { |
||||||
|
if (array_key_exists('time', $params)) { |
||||||
|
$_year = $_month = $_day = $time = null; |
||||||
|
} else { |
||||||
|
list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d')); |
||||||
|
} |
||||||
|
} else { |
||||||
|
list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d', $time)); |
||||||
|
} |
||||||
|
|
||||||
|
// make syntax "+N" or "-N" work with $start_year and $end_year |
||||||
|
// Note preg_match('!^(\+|\-)\s*(\d+)$!', $end_year, $match) is slower than trim+substr |
||||||
|
foreach (array('start', 'end') as $key) { |
||||||
|
$key .= '_year'; |
||||||
|
$t = $$key; |
||||||
|
if ($t === null) { |
||||||
|
$$key = (int)$_current_year; |
||||||
|
} else if ($t[0] == '+') { |
||||||
|
$$key = (int)($_current_year + trim(substr($t, 1))); |
||||||
|
} else if ($t[0] == '-') { |
||||||
|
$$key = (int)($_current_year - trim(substr($t, 1))); |
||||||
|
} else { |
||||||
|
$$key = (int)$$key; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// flip for ascending or descending |
||||||
|
if (($start_year > $end_year && !$reverse_years) || ($start_year < $end_year && $reverse_years)) { |
||||||
|
$t = $end_year; |
||||||
|
$end_year = $start_year; |
||||||
|
$start_year = $t; |
||||||
|
} |
||||||
|
|
||||||
|
// generate year <select> or <input> |
||||||
|
if ($display_years) { |
||||||
|
$_html_years = ''; |
||||||
|
$_extra = ''; |
||||||
|
$_name = $field_array ? ($field_array . '[' . $prefix . 'Year]') : ($prefix . 'Year'); |
||||||
|
if ($all_extra) { |
||||||
|
$_extra .= ' ' . $all_extra; |
||||||
|
} |
||||||
|
if ($year_extra) { |
||||||
|
$_extra .= ' ' . $year_extra; |
||||||
|
} |
||||||
|
|
||||||
|
if ($year_as_text) { |
||||||
|
$_html_years = '<input type="text" name="' . $_name . '" value="' . $_year . '" size="4" maxlength="4"' . $_extra . $extra_attrs . ' />'; |
||||||
|
} else { |
||||||
|
$_html_years = '<select name="' . $_name . '"'; |
||||||
|
if ($year_id !== null || $all_id !== null) { |
||||||
|
$_html_years .= ' id="' . smarty_function_escape_special_chars( |
||||||
|
$year_id !== null ? ( $year_id ? $year_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) |
||||||
|
) . '"'; |
||||||
|
} |
||||||
|
if ($year_size) { |
||||||
|
$_html_years .= ' size="' . $year_size . '"'; |
||||||
|
} |
||||||
|
$_html_years .= $_extra . $extra_attrs . '>' . $option_separator; |
||||||
|
|
||||||
|
if (isset($year_empty) || isset($all_empty)) { |
||||||
|
$_html_years .= '<option value="">' . ( isset($year_empty) ? $year_empty : $all_empty ) . '</option>' . $option_separator; |
||||||
|
} |
||||||
|
|
||||||
|
$op = $start_year > $end_year ? -1 : 1; |
||||||
|
for ($i=$start_year; $op > 0 ? $i <= $end_year : $i >= $end_year; $i += $op) { |
||||||
|
$_html_years .= '<option value="' . $i . '"' |
||||||
|
. ($_year == $i ? ' selected="selected"' : '') |
||||||
|
. '>' . $i . '</option>' . $option_separator; |
||||||
|
} |
||||||
|
|
||||||
|
$_html_years .= '</select>'; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// generate month <select> or <input> |
||||||
|
if ($display_months) { |
||||||
|
$_html_month = ''; |
||||||
|
$_extra = ''; |
||||||
|
$_name = $field_array ? ($field_array . '[' . $prefix . 'Month]') : ($prefix . 'Month'); |
||||||
|
if ($all_extra) { |
||||||
|
$_extra .= ' ' . $all_extra; |
||||||
|
} |
||||||
|
if ($month_extra) { |
||||||
|
$_extra .= ' ' . $month_extra; |
||||||
|
} |
||||||
|
|
||||||
|
$_html_months = '<select name="' . $_name . '"'; |
||||||
|
if ($month_id !== null || $all_id !== null) { |
||||||
|
$_html_months .= ' id="' . smarty_function_escape_special_chars( |
||||||
|
$month_id !== null ? ( $month_id ? $month_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) |
||||||
|
) . '"'; |
||||||
|
} |
||||||
|
if ($month_size) { |
||||||
|
$_html_months .= ' size="' . $month_size . '"'; |
||||||
|
} |
||||||
|
$_html_months .= $_extra . $extra_attrs . '>' . $option_separator; |
||||||
|
|
||||||
|
if (isset($month_empty) || isset($all_empty)) { |
||||||
|
$_html_months .= '<option value="">' . ( isset($month_empty) ? $month_empty : $all_empty ) . '</option>' . $option_separator; |
||||||
|
} |
||||||
|
|
||||||
|
for ($i = 1; $i <= 12; $i++) { |
||||||
|
$_val = sprintf('%02d', $i); |
||||||
|
$_text = isset($month_names) ? smarty_function_escape_special_chars($month_names[$i]) : ($month_format == "%m" ? $_val : strftime($month_format, $_month_timestamps[$i])); |
||||||
|
$_value = $month_value_format == "%m" ? $_val : strftime($month_value_format, $_month_timestamps[$i]); |
||||||
|
$_html_months .= '<option value="' . $_value . '"' |
||||||
|
. ($_val == $_month ? ' selected="selected"' : '') |
||||||
|
. '>' . $_text . '</option>' . $option_separator; |
||||||
|
} |
||||||
|
|
||||||
|
$_html_months .= '</select>'; |
||||||
|
} |
||||||
|
|
||||||
|
// generate day <select> or <input> |
||||||
|
if ($display_days) { |
||||||
|
$_html_day = ''; |
||||||
|
$_extra = ''; |
||||||
|
$_name = $field_array ? ($field_array . '[' . $prefix . 'Day]') : ($prefix . 'Day'); |
||||||
|
if ($all_extra) { |
||||||
|
$_extra .= ' ' . $all_extra; |
||||||
|
} |
||||||
|
if ($day_extra) { |
||||||
|
$_extra .= ' ' . $day_extra; |
||||||
|
} |
||||||
|
|
||||||
|
$_html_days = '<select name="' . $_name . '"'; |
||||||
|
if ($day_id !== null || $all_id !== null) { |
||||||
|
$_html_days .= ' id="' . smarty_function_escape_special_chars( |
||||||
|
$day_id !== null ? ( $day_id ? $day_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) |
||||||
|
) . '"'; |
||||||
|
} |
||||||
|
if ($day_size) { |
||||||
|
$_html_days .= ' size="' . $day_size . '"'; |
||||||
|
} |
||||||
|
$_html_days .= $_extra . $extra_attrs . '>' . $option_separator; |
||||||
|
|
||||||
|
if (isset($day_empty) || isset($all_empty)) { |
||||||
|
$_html_days .= '<option value="">' . ( isset($day_empty) ? $day_empty : $all_empty ) . '</option>' . $option_separator; |
||||||
|
} |
||||||
|
|
||||||
|
for ($i = 1; $i <= 31; $i++) { |
||||||
|
$_val = sprintf('%02d', $i); |
||||||
|
$_text = $day_format == '%02d' ? $_val : sprintf($day_format, $i); |
||||||
|
$_value = $day_value_format == '%02d' ? $_val : sprintf($day_value_format, $i); |
||||||
|
$_html_days .= '<option value="' . $_value . '"' |
||||||
|
. ($_val == $_day ? ' selected="selected"' : '') |
||||||
|
. '>' . $_text . '</option>' . $option_separator; |
||||||
|
} |
||||||
|
|
||||||
|
$_html_days .= '</select>'; |
||||||
|
} |
||||||
|
|
||||||
|
// order the fields for output |
||||||
|
$_html = ''; |
||||||
|
for ($i=0; $i <= 2; $i++) { |
||||||
|
switch ($field_order[$i]) { |
||||||
|
case 'Y': |
||||||
|
case 'y': |
||||||
|
if (isset($_html_years)) { |
||||||
|
if ($_html) { |
||||||
|
$_html .= $field_separator; |
||||||
|
} |
||||||
|
$_html .= $_html_years; |
||||||
|
} |
||||||
|
break; |
||||||
|
|
||||||
|
case 'm': |
||||||
|
case 'M': |
||||||
|
if (isset($_html_months)) { |
||||||
|
if ($_html) { |
||||||
|
$_html .= $field_separator; |
||||||
|
} |
||||||
|
$_html .= $_html_months; |
||||||
|
} |
||||||
|
break; |
||||||
|
|
||||||
|
case 'd': |
||||||
|
case 'D': |
||||||
|
if (isset($_html_days)) { |
||||||
|
if ($_html) { |
||||||
|
$_html .= $field_separator; |
||||||
|
} |
||||||
|
$_html .= $_html_days; |
||||||
|
} |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
return $_html; |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,366 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsFunction |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* @ignore |
||||||
|
*/ |
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); |
||||||
|
/** |
||||||
|
* @ignore |
||||||
|
*/ |
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'); |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty {html_select_time} function plugin |
||||||
|
* |
||||||
|
* Type: function<br> |
||||||
|
* Name: html_select_time<br> |
||||||
|
* Purpose: Prints the dropdowns for time selection |
||||||
|
* |
||||||
|
* @link http://www.smarty.net/manual/en/language.function.html.select.time.php {html_select_time} |
||||||
|
* (Smarty online manual) |
||||||
|
* @author Roberto Berto <roberto@berto.net> |
||||||
|
* @author Monte Ohrt <monte AT ohrt DOT com> |
||||||
|
* @param array $params parameters |
||||||
|
* @param Smarty_Internal_Template $template template object |
||||||
|
* @return string |
||||||
|
* @uses smarty_make_timestamp() |
||||||
|
*/ |
||||||
|
function smarty_function_html_select_time($params, $template) |
||||||
|
{ |
||||||
|
$prefix = "Time_"; |
||||||
|
$field_array = null; |
||||||
|
$field_separator = "\n"; |
||||||
|
$option_separator = "\n"; |
||||||
|
$time = null; |
||||||
|
|
||||||
|
$display_hours = true; |
||||||
|
$display_minutes = true; |
||||||
|
$display_seconds = true; |
||||||
|
$display_meridian = true; |
||||||
|
|
||||||
|
$hour_format = '%02d'; |
||||||
|
$hour_value_format = '%02d'; |
||||||
|
$minute_format = '%02d'; |
||||||
|
$minute_value_format = '%02d'; |
||||||
|
$second_format = '%02d'; |
||||||
|
$second_value_format = '%02d'; |
||||||
|
|
||||||
|
$hour_size = null; |
||||||
|
$minute_size = null; |
||||||
|
$second_size = null; |
||||||
|
$meridian_size = null; |
||||||
|
|
||||||
|
$all_empty = null; |
||||||
|
$hour_empty = null; |
||||||
|
$minute_empty = null; |
||||||
|
$second_empty = null; |
||||||
|
$meridian_empty = null; |
||||||
|
|
||||||
|
$all_id = null; |
||||||
|
$hour_id = null; |
||||||
|
$minute_id = null; |
||||||
|
$second_id = null; |
||||||
|
$meridian_id = null; |
||||||
|
|
||||||
|
$use_24_hours = true; |
||||||
|
$minute_interval = 1; |
||||||
|
$second_interval = 1; |
||||||
|
|
||||||
|
$extra_attrs = ''; |
||||||
|
$all_extra = null; |
||||||
|
$hour_extra = null; |
||||||
|
$minute_extra = null; |
||||||
|
$second_extra = null; |
||||||
|
$meridian_extra = null; |
||||||
|
|
||||||
|
foreach ($params as $_key => $_value) { |
||||||
|
switch ($_key) { |
||||||
|
case 'time': |
||||||
|
if (!is_array($_value) && $_value !== null) { |
||||||
|
$time = smarty_make_timestamp($_value); |
||||||
|
} |
||||||
|
break; |
||||||
|
|
||||||
|
case 'prefix': |
||||||
|
case 'field_array': |
||||||
|
|
||||||
|
case 'field_separator': |
||||||
|
case 'option_separator': |
||||||
|
|
||||||
|
case 'all_extra': |
||||||
|
case 'hour_extra': |
||||||
|
case 'minute_extra': |
||||||
|
case 'second_extra': |
||||||
|
case 'meridian_extra': |
||||||
|
|
||||||
|
case 'all_empty': |
||||||
|
case 'hour_empty': |
||||||
|
case 'minute_empty': |
||||||
|
case 'second_empty': |
||||||
|
case 'meridian_empty': |
||||||
|
|
||||||
|
case 'all_id': |
||||||
|
case 'hour_id': |
||||||
|
case 'minute_id': |
||||||
|
case 'second_id': |
||||||
|
case 'meridian_id': |
||||||
|
|
||||||
|
case 'hour_format': |
||||||
|
case 'hour_value_format': |
||||||
|
case 'minute_format': |
||||||
|
case 'minute_value_format': |
||||||
|
case 'second_format': |
||||||
|
case 'second_value_format': |
||||||
|
$$_key = (string)$_value; |
||||||
|
break; |
||||||
|
|
||||||
|
case 'display_hours': |
||||||
|
case 'display_minutes': |
||||||
|
case 'display_seconds': |
||||||
|
case 'display_meridian': |
||||||
|
case 'use_24_hours': |
||||||
|
$$_key = (bool)$_value; |
||||||
|
break; |
||||||
|
|
||||||
|
case 'minute_interval': |
||||||
|
case 'second_interval': |
||||||
|
|
||||||
|
case 'hour_size': |
||||||
|
case 'minute_size': |
||||||
|
case 'second_size': |
||||||
|
case 'meridian_size': |
||||||
|
$$_key = (int)$_value; |
||||||
|
break; |
||||||
|
|
||||||
|
default: |
||||||
|
if (!is_array($_value)) { |
||||||
|
$extra_attrs .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_value) . '"'; |
||||||
|
} else { |
||||||
|
trigger_error("html_select_date: extra attribute '$_key' cannot be an array", E_USER_NOTICE); |
||||||
|
} |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (isset($params['time']) && is_array($params['time'])) { |
||||||
|
if (isset($params['time'][$prefix . 'Hour'])) { |
||||||
|
// $_REQUEST[$field_array] given |
||||||
|
foreach (array('H' => 'Hour', 'i' => 'Minute', 's' => 'Second') as $_elementKey => $_elementName) { |
||||||
|
$_variableName = '_' . strtolower($_elementName); |
||||||
|
$$_variableName = isset($params['time'][$prefix . $_elementName]) |
||||||
|
? $params['time'][$prefix . $_elementName] |
||||||
|
: date($_elementKey); |
||||||
|
} |
||||||
|
$_meridian = isset($params['time'][$prefix . 'Meridian']) |
||||||
|
? (' ' . $params['time'][$prefix . 'Meridian']) |
||||||
|
: ''; |
||||||
|
$time = strtotime( $_hour . ':' . $_minute . ':' . $_second . $_meridian ); |
||||||
|
list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time)); |
||||||
|
} elseif (isset($params['time'][$field_array][$prefix . 'Hour'])) { |
||||||
|
// $_REQUEST given |
||||||
|
foreach (array('H' => 'Hour', 'i' => 'Minute', 's' => 'Second') as $_elementKey => $_elementName) { |
||||||
|
$_variableName = '_' . strtolower($_elementName); |
||||||
|
$$_variableName = isset($params['time'][$field_array][$prefix . $_elementName]) |
||||||
|
? $params['time'][$field_array][$prefix . $_elementName] |
||||||
|
: date($_elementKey); |
||||||
|
} |
||||||
|
$_meridian = isset($params['time'][$field_array][$prefix . 'Meridian']) |
||||||
|
? (' ' . $params['time'][$field_array][$prefix . 'Meridian']) |
||||||
|
: ''; |
||||||
|
$time = strtotime( $_hour . ':' . $_minute . ':' . $_second . $_meridian ); |
||||||
|
list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time)); |
||||||
|
} else { |
||||||
|
// no date found, use NOW |
||||||
|
list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d')); |
||||||
|
} |
||||||
|
} elseif ($time === null) { |
||||||
|
if (array_key_exists('time', $params)) { |
||||||
|
$_hour = $_minute = $_second = $time = null; |
||||||
|
} else { |
||||||
|
list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s')); |
||||||
|
} |
||||||
|
} else { |
||||||
|
list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time)); |
||||||
|
} |
||||||
|
|
||||||
|
// generate hour <select> |
||||||
|
if ($display_hours) { |
||||||
|
$_html_hours = ''; |
||||||
|
$_extra = ''; |
||||||
|
$_name = $field_array ? ($field_array . '[' . $prefix . 'Hour]') : ($prefix . 'Hour'); |
||||||
|
if ($all_extra) { |
||||||
|
$_extra .= ' ' . $all_extra; |
||||||
|
} |
||||||
|
if ($hour_extra) { |
||||||
|
$_extra .= ' ' . $hour_extra; |
||||||
|
} |
||||||
|
|
||||||
|
$_html_hours = '<select name="' . $_name . '"'; |
||||||
|
if ($hour_id !== null || $all_id !== null) { |
||||||
|
$_html_hours .= ' id="' . smarty_function_escape_special_chars( |
||||||
|
$hour_id !== null ? ( $hour_id ? $hour_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) |
||||||
|
) . '"'; |
||||||
|
} |
||||||
|
if ($hour_size) { |
||||||
|
$_html_hours .= ' size="' . $hour_size . '"'; |
||||||
|
} |
||||||
|
$_html_hours .= $_extra . $extra_attrs . '>' . $option_separator; |
||||||
|
|
||||||
|
if (isset($hour_empty) || isset($all_empty)) { |
||||||
|
$_html_hours .= '<option value="">' . ( isset($hour_empty) ? $hour_empty : $all_empty ) . '</option>' . $option_separator; |
||||||
|
} |
||||||
|
|
||||||
|
$start = $use_24_hours ? 0 : 1; |
||||||
|
$end = $use_24_hours ? 23 : 12; |
||||||
|
for ($i=$start; $i <= $end; $i++) { |
||||||
|
$_val = sprintf('%02d', $i); |
||||||
|
$_text = $hour_format == '%02d' ? $_val : sprintf($hour_format, $i); |
||||||
|
$_value = $hour_value_format == '%02d' ? $_val : sprintf($hour_value_format, $i); |
||||||
|
|
||||||
|
if (!$use_24_hours) { |
||||||
|
$_hour12 = $_hour == 0 |
||||||
|
? 12 |
||||||
|
: ($_hour <= 12 ? $_hour : $_hour -12); |
||||||
|
} |
||||||
|
|
||||||
|
$selected = $_hour !== null ? ($use_24_hours ? $_hour == $_val : $_hour12 == $_val) : null; |
||||||
|
$_html_hours .= '<option value="' . $_value . '"' |
||||||
|
. ($selected ? ' selected="selected"' : '') |
||||||
|
. '>' . $_text . '</option>' . $option_separator; |
||||||
|
} |
||||||
|
|
||||||
|
$_html_hours .= '</select>'; |
||||||
|
} |
||||||
|
|
||||||
|
// generate minute <select> |
||||||
|
if ($display_minutes) { |
||||||
|
$_html_minutes = ''; |
||||||
|
$_extra = ''; |
||||||
|
$_name = $field_array ? ($field_array . '[' . $prefix . 'Minute]') : ($prefix . 'Minute'); |
||||||
|
if ($all_extra) { |
||||||
|
$_extra .= ' ' . $all_extra; |
||||||
|
} |
||||||
|
if ($minute_extra) { |
||||||
|
$_extra .= ' ' . $minute_extra; |
||||||
|
} |
||||||
|
|
||||||
|
$_html_minutes = '<select name="' . $_name . '"'; |
||||||
|
if ($minute_id !== null || $all_id !== null) { |
||||||
|
$_html_minutes .= ' id="' . smarty_function_escape_special_chars( |
||||||
|
$minute_id !== null ? ( $minute_id ? $minute_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) |
||||||
|
) . '"'; |
||||||
|
} |
||||||
|
if ($minute_size) { |
||||||
|
$_html_minutes .= ' size="' . $minute_size . '"'; |
||||||
|
} |
||||||
|
$_html_minutes .= $_extra . $extra_attrs . '>' . $option_separator; |
||||||
|
|
||||||
|
if (isset($minute_empty) || isset($all_empty)) { |
||||||
|
$_html_minutes .= '<option value="">' . ( isset($minute_empty) ? $minute_empty : $all_empty ) . '</option>' . $option_separator; |
||||||
|
} |
||||||
|
|
||||||
|
$selected = $_minute !== null ? ($_minute - $_minute % $minute_interval) : null; |
||||||
|
for ($i=0; $i <= 59; $i += $minute_interval) { |
||||||
|
$_val = sprintf('%02d', $i); |
||||||
|
$_text = $minute_format == '%02d' ? $_val : sprintf($minute_format, $i); |
||||||
|
$_value = $minute_value_format == '%02d' ? $_val : sprintf($minute_value_format, $i); |
||||||
|
$_html_minutes .= '<option value="' . $_value . '"' |
||||||
|
. ($selected === $i ? ' selected="selected"' : '') |
||||||
|
. '>' . $_text . '</option>' . $option_separator; |
||||||
|
} |
||||||
|
|
||||||
|
$_html_minutes .= '</select>'; |
||||||
|
} |
||||||
|
|
||||||
|
// generate second <select> |
||||||
|
if ($display_seconds) { |
||||||
|
$_html_seconds = ''; |
||||||
|
$_extra = ''; |
||||||
|
$_name = $field_array ? ($field_array . '[' . $prefix . 'Second]') : ($prefix . 'Second'); |
||||||
|
if ($all_extra) { |
||||||
|
$_extra .= ' ' . $all_extra; |
||||||
|
} |
||||||
|
if ($second_extra) { |
||||||
|
$_extra .= ' ' . $second_extra; |
||||||
|
} |
||||||
|
|
||||||
|
$_html_seconds = '<select name="' . $_name . '"'; |
||||||
|
if ($second_id !== null || $all_id !== null) { |
||||||
|
$_html_seconds .= ' id="' . smarty_function_escape_special_chars( |
||||||
|
$second_id !== null ? ( $second_id ? $second_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) |
||||||
|
) . '"'; |
||||||
|
} |
||||||
|
if ($second_size) { |
||||||
|
$_html_seconds .= ' size="' . $second_size . '"'; |
||||||
|
} |
||||||
|
$_html_seconds .= $_extra . $extra_attrs . '>' . $option_separator; |
||||||
|
|
||||||
|
if (isset($second_empty) || isset($all_empty)) { |
||||||
|
$_html_seconds .= '<option value="">' . ( isset($second_empty) ? $second_empty : $all_empty ) . '</option>' . $option_separator; |
||||||
|
} |
||||||
|
|
||||||
|
$selected = $_second !== null ? ($_second - $_second % $second_interval) : null; |
||||||
|
for ($i=0; $i <= 59; $i += $second_interval) { |
||||||
|
$_val = sprintf('%02d', $i); |
||||||
|
$_text = $second_format == '%02d' ? $_val : sprintf($second_format, $i); |
||||||
|
$_value = $second_value_format == '%02d' ? $_val : sprintf($second_value_format, $i); |
||||||
|
$_html_seconds .= '<option value="' . $_value . '"' |
||||||
|
. ($selected === $i ? ' selected="selected"' : '') |
||||||
|
. '>' . $_text . '</option>' . $option_separator; |
||||||
|
} |
||||||
|
|
||||||
|
$_html_seconds .= '</select>'; |
||||||
|
} |
||||||
|
|
||||||
|
// generate meridian <select> |
||||||
|
if ($display_meridian && !$use_24_hours) { |
||||||
|
$_html_meridian = ''; |
||||||
|
$_extra = ''; |
||||||
|
$_name = $field_array ? ($field_array . '[' . $prefix . 'Meridian]') : ($prefix . 'Meridian'); |
||||||
|
if ($all_extra) { |
||||||
|
$_extra .= ' ' . $all_extra; |
||||||
|
} |
||||||
|
if ($meridian_extra) { |
||||||
|
$_extra .= ' ' . $meridian_extra; |
||||||
|
} |
||||||
|
|
||||||
|
$_html_meridian = '<select name="' . $_name . '"'; |
||||||
|
if ($meridian_id !== null || $all_id !== null) { |
||||||
|
$_html_meridian .= ' id="' . smarty_function_escape_special_chars( |
||||||
|
$meridian_id !== null ? ( $meridian_id ? $meridian_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) |
||||||
|
) . '"'; |
||||||
|
} |
||||||
|
if ($meridian_size) { |
||||||
|
$_html_meridian .= ' size="' . $meridian_size . '"'; |
||||||
|
} |
||||||
|
$_html_meridian .= $_extra . $extra_attrs . '>' . $option_separator; |
||||||
|
|
||||||
|
if (isset($meridian_empty) || isset($all_empty)) { |
||||||
|
$_html_meridian .= '<option value="">' . ( isset($meridian_empty) ? $meridian_empty : $all_empty ) . '</option>' . $option_separator; |
||||||
|
} |
||||||
|
|
||||||
|
$_html_meridian .= '<option value="am"'. ($_hour < 12 ? ' selected="selected"' : '') .'>AM</option>' . $option_separator |
||||||
|
. '<option value="pm"'. ($_hour < 12 ? '' : ' selected="selected"') .'>PM</option>' . $option_separator |
||||||
|
. '</select>'; |
||||||
|
} |
||||||
|
|
||||||
|
$_html = ''; |
||||||
|
foreach (array('_html_hours', '_html_minutes', '_html_seconds', '_html_meridian') as $k) { |
||||||
|
if (isset($$k)) { |
||||||
|
if ($_html) { |
||||||
|
$_html .= $field_separator; |
||||||
|
} |
||||||
|
$_html .= $$k; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return $_html; |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,177 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsFunction |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty {html_table} function plugin |
||||||
|
* |
||||||
|
* Type: function<br> |
||||||
|
* Name: html_table<br> |
||||||
|
* Date: Feb 17, 2003<br> |
||||||
|
* Purpose: make an html table from an array of data<br> |
||||||
|
* Params: |
||||||
|
* <pre> |
||||||
|
* - loop - array to loop through |
||||||
|
* - cols - number of columns, comma separated list of column names |
||||||
|
* or array of column names |
||||||
|
* - rows - number of rows |
||||||
|
* - table_attr - table attributes |
||||||
|
* - th_attr - table heading attributes (arrays are cycled) |
||||||
|
* - tr_attr - table row attributes (arrays are cycled) |
||||||
|
* - td_attr - table cell attributes (arrays are cycled) |
||||||
|
* - trailpad - value to pad trailing cells with |
||||||
|
* - caption - text for caption element |
||||||
|
* - vdir - vertical direction (default: "down", means top-to-bottom) |
||||||
|
* - hdir - horizontal direction (default: "right", means left-to-right) |
||||||
|
* - inner - inner loop (default "cols": print $loop line by line, |
||||||
|
* $loop will be printed column by column otherwise) |
||||||
|
* </pre> |
||||||
|
* Examples: |
||||||
|
* <pre> |
||||||
|
* {table loop=$data} |
||||||
|
* {table loop=$data cols=4 tr_attr='"bgcolor=red"'} |
||||||
|
* {table loop=$data cols="first,second,third" tr_attr=$colors} |
||||||
|
* </pre> |
||||||
|
* |
||||||
|
* @author Monte Ohrt <monte at ohrt dot com> |
||||||
|
* @author credit to Messju Mohr <messju at lammfellpuschen dot de> |
||||||
|
* @author credit to boots <boots dot smarty at yahoo dot com> |
||||||
|
* @version 1.1 |
||||||
|
* @link http://www.smarty.net/manual/en/language.function.html.table.php {html_table} |
||||||
|
* (Smarty online manual) |
||||||
|
* @param array $params parameters |
||||||
|
* @param Smarty_Internal_Template $template template object |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
function smarty_function_html_table($params, $template) |
||||||
|
{ |
||||||
|
$table_attr = 'border="1"'; |
||||||
|
$tr_attr = ''; |
||||||
|
$th_attr = ''; |
||||||
|
$td_attr = ''; |
||||||
|
$cols = $cols_count = 3; |
||||||
|
$rows = 3; |
||||||
|
$trailpad = ' '; |
||||||
|
$vdir = 'down'; |
||||||
|
$hdir = 'right'; |
||||||
|
$inner = 'cols'; |
||||||
|
$caption = ''; |
||||||
|
$loop = null; |
||||||
|
|
||||||
|
if (!isset($params['loop'])) { |
||||||
|
trigger_error("html_table: missing 'loop' parameter",E_USER_WARNING); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
foreach ($params as $_key => $_value) { |
||||||
|
switch ($_key) { |
||||||
|
case 'loop': |
||||||
|
$$_key = (array)$_value; |
||||||
|
break; |
||||||
|
|
||||||
|
case 'cols': |
||||||
|
if (is_array($_value) && !empty($_value)) { |
||||||
|
$cols = $_value; |
||||||
|
$cols_count = count($_value); |
||||||
|
} elseif (!is_numeric($_value) && is_string($_value) && !empty($_value)) { |
||||||
|
$cols = explode(',', $_value); |
||||||
|
$cols_count = count($cols); |
||||||
|
} elseif (!empty($_value)) { |
||||||
|
$cols_count = (int)$_value; |
||||||
|
} else { |
||||||
|
$cols_count = $cols; |
||||||
|
} |
||||||
|
break; |
||||||
|
|
||||||
|
case 'rows': |
||||||
|
$$_key = (int)$_value; |
||||||
|
break; |
||||||
|
|
||||||
|
case 'table_attr': |
||||||
|
case 'trailpad': |
||||||
|
case 'hdir': |
||||||
|
case 'vdir': |
||||||
|
case 'inner': |
||||||
|
case 'caption': |
||||||
|
$$_key = (string)$_value; |
||||||
|
break; |
||||||
|
|
||||||
|
case 'tr_attr': |
||||||
|
case 'td_attr': |
||||||
|
case 'th_attr': |
||||||
|
$$_key = $_value; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
$loop_count = count($loop); |
||||||
|
if (empty($params['rows'])) { |
||||||
|
/* no rows specified */ |
||||||
|
$rows = ceil($loop_count / $cols_count); |
||||||
|
} elseif (empty($params['cols'])) { |
||||||
|
if (!empty($params['rows'])) { |
||||||
|
/* no cols specified, but rows */ |
||||||
|
$cols_count = ceil($loop_count / $rows); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
$output = "<table $table_attr>\n"; |
||||||
|
|
||||||
|
if (!empty($caption)) { |
||||||
|
$output .= '<caption>' . $caption . "</caption>\n"; |
||||||
|
} |
||||||
|
|
||||||
|
if (is_array($cols)) { |
||||||
|
$cols = ($hdir == 'right') ? $cols : array_reverse($cols); |
||||||
|
$output .= "<thead><tr>\n"; |
||||||
|
|
||||||
|
for ($r = 0; $r < $cols_count; $r++) { |
||||||
|
$output .= '<th' . smarty_function_html_table_cycle('th', $th_attr, $r) . '>'; |
||||||
|
$output .= $cols[$r]; |
||||||
|
$output .= "</th>\n"; |
||||||
|
} |
||||||
|
$output .= "</tr></thead>\n"; |
||||||
|
} |
||||||
|
|
||||||
|
$output .= "<tbody>\n"; |
||||||
|
for ($r = 0; $r < $rows; $r++) { |
||||||
|
$output .= "<tr" . smarty_function_html_table_cycle('tr', $tr_attr, $r) . ">\n"; |
||||||
|
$rx = ($vdir == 'down') ? $r * $cols_count : ($rows-1 - $r) * $cols_count; |
||||||
|
|
||||||
|
for ($c = 0; $c < $cols_count; $c++) { |
||||||
|
$x = ($hdir == 'right') ? $rx + $c : $rx + $cols_count-1 - $c; |
||||||
|
if ($inner != 'cols') { |
||||||
|
/* shuffle x to loop over rows*/ |
||||||
|
$x = floor($x / $cols_count) + ($x % $cols_count) * $rows; |
||||||
|
} |
||||||
|
|
||||||
|
if ($x < $loop_count) { |
||||||
|
$output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">" . $loop[$x] . "</td>\n"; |
||||||
|
} else { |
||||||
|
$output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">$trailpad</td>\n"; |
||||||
|
} |
||||||
|
} |
||||||
|
$output .= "</tr>\n"; |
||||||
|
} |
||||||
|
$output .= "</tbody>\n"; |
||||||
|
$output .= "</table>\n"; |
||||||
|
|
||||||
|
return $output; |
||||||
|
} |
||||||
|
|
||||||
|
function smarty_function_html_table_cycle($name, $var, $no) |
||||||
|
{ |
||||||
|
if (!is_array($var)) { |
||||||
|
$ret = $var; |
||||||
|
} else { |
||||||
|
$ret = $var[$no % count($var)]; |
||||||
|
} |
||||||
|
|
||||||
|
return ($ret) ? ' ' . $ret : ''; |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,152 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsFunction |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty {mailto} function plugin |
||||||
|
* |
||||||
|
* Type: function<br> |
||||||
|
* Name: mailto<br> |
||||||
|
* Date: May 21, 2002 |
||||||
|
* Purpose: automate mailto address link creation, and optionally encode them.<br> |
||||||
|
* Params: |
||||||
|
* <pre> |
||||||
|
* - address - (required) - e-mail address |
||||||
|
* - text - (optional) - text to display, default is address |
||||||
|
* - encode - (optional) - can be one of: |
||||||
|
* * none : no encoding (default) |
||||||
|
* * javascript : encode with javascript |
||||||
|
* * javascript_charcode : encode with javascript charcode |
||||||
|
* * hex : encode with hexidecimal (no javascript) |
||||||
|
* - cc - (optional) - address(es) to carbon copy |
||||||
|
* - bcc - (optional) - address(es) to blind carbon copy |
||||||
|
* - subject - (optional) - e-mail subject |
||||||
|
* - newsgroups - (optional) - newsgroup(s) to post to |
||||||
|
* - followupto - (optional) - address(es) to follow up to |
||||||
|
* - extra - (optional) - extra tags for the href link |
||||||
|
* </pre> |
||||||
|
* Examples: |
||||||
|
* <pre> |
||||||
|
* {mailto address="me@domain.com"} |
||||||
|
* {mailto address="me@domain.com" encode="javascript"} |
||||||
|
* {mailto address="me@domain.com" encode="hex"} |
||||||
|
* {mailto address="me@domain.com" subject="Hello to you!"} |
||||||
|
* {mailto address="me@domain.com" cc="you@domain.com,they@domain.com"} |
||||||
|
* {mailto address="me@domain.com" extra='class="mailto"'} |
||||||
|
* </pre> |
||||||
|
* |
||||||
|
* @link http://www.smarty.net/manual/en/language.function.mailto.php {mailto} |
||||||
|
* (Smarty online manual) |
||||||
|
* @version 1.2 |
||||||
|
* @author Monte Ohrt <monte at ohrt dot com> |
||||||
|
* @author credits to Jason Sweat (added cc, bcc and subject functionality) |
||||||
|
* @param array $params parameters |
||||||
|
* @param Smarty_Internal_Template $template template object |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
function smarty_function_mailto($params, $template) |
||||||
|
{ |
||||||
|
static $_allowed_encoding = array('javascript' => true, 'javascript_charcode' => true, 'hex' => true, 'none' => true); |
||||||
|
$extra = ''; |
||||||
|
|
||||||
|
if (empty($params['address'])) { |
||||||
|
trigger_error("mailto: missing 'address' parameter",E_USER_WARNING); |
||||||
|
return; |
||||||
|
} else { |
||||||
|
$address = $params['address']; |
||||||
|
} |
||||||
|
|
||||||
|
$text = $address; |
||||||
|
// netscape and mozilla do not decode %40 (@) in BCC field (bug?) |
||||||
|
// so, don't encode it. |
||||||
|
$search = array('%40', '%2C'); |
||||||
|
$replace = array('@', ','); |
||||||
|
$mail_parms = array(); |
||||||
|
foreach ($params as $var => $value) { |
||||||
|
switch ($var) { |
||||||
|
case 'cc': |
||||||
|
case 'bcc': |
||||||
|
case 'followupto': |
||||||
|
if (!empty($value)) |
||||||
|
$mail_parms[] = $var . '=' . str_replace($search, $replace, rawurlencode($value)); |
||||||
|
break; |
||||||
|
|
||||||
|
case 'subject': |
||||||
|
case 'newsgroups': |
||||||
|
$mail_parms[] = $var . '=' . rawurlencode($value); |
||||||
|
break; |
||||||
|
|
||||||
|
case 'extra': |
||||||
|
case 'text': |
||||||
|
$$var = $value; |
||||||
|
|
||||||
|
default: |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if ($mail_parms) { |
||||||
|
$address .= '?' . join('&', $mail_parms); |
||||||
|
} |
||||||
|
|
||||||
|
$encode = (empty($params['encode'])) ? 'none' : $params['encode']; |
||||||
|
if (!isset($_allowed_encoding[$encode])) { |
||||||
|
trigger_error("mailto: 'encode' parameter must be none, javascript, javascript_charcode or hex", E_USER_WARNING); |
||||||
|
return; |
||||||
|
} |
||||||
|
// FIXME: (rodneyrehm) document.write() excues me what? 1998 has passed! |
||||||
|
if ($encode == 'javascript') { |
||||||
|
$string = 'document.write(\'<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>\');'; |
||||||
|
|
||||||
|
$js_encode = ''; |
||||||
|
for ($x = 0, $_length = strlen($string); $x < $_length; $x++) { |
||||||
|
$js_encode .= '%' . bin2hex($string[$x]); |
||||||
|
} |
||||||
|
|
||||||
|
return '<script type="text/javascript">eval(unescape(\'' . $js_encode . '\'))</script>'; |
||||||
|
} elseif ($encode == 'javascript_charcode') { |
||||||
|
$string = '<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>'; |
||||||
|
|
||||||
|
for($x = 0, $y = strlen($string); $x < $y; $x++) { |
||||||
|
$ord[] = ord($string[$x]); |
||||||
|
} |
||||||
|
|
||||||
|
$_ret = "<script type=\"text/javascript\" language=\"javascript\">\n" |
||||||
|
. "{document.write(String.fromCharCode(" |
||||||
|
. implode(',', $ord) |
||||||
|
. "))" |
||||||
|
. "}\n" |
||||||
|
. "</script>\n"; |
||||||
|
|
||||||
|
return $_ret; |
||||||
|
} elseif ($encode == 'hex') { |
||||||
|
preg_match('!^(.*)(\?.*)$!', $address, $match); |
||||||
|
if (!empty($match[2])) { |
||||||
|
trigger_error("mailto: hex encoding does not work with extra attributes. Try javascript.",E_USER_WARNING); |
||||||
|
return; |
||||||
|
} |
||||||
|
$address_encode = ''; |
||||||
|
for ($x = 0, $_length = strlen($address); $x < $_length; $x++) { |
||||||
|
if (preg_match('!\w!' . Smarty::$_UTF8_MODIFIER, $address[$x])) { |
||||||
|
$address_encode .= '%' . bin2hex($address[$x]); |
||||||
|
} else { |
||||||
|
$address_encode .= $address[$x]; |
||||||
|
} |
||||||
|
} |
||||||
|
$text_encode = ''; |
||||||
|
for ($x = 0, $_length = strlen($text); $x < $_length; $x++) { |
||||||
|
$text_encode .= '&#x' . bin2hex($text[$x]) . ';'; |
||||||
|
} |
||||||
|
|
||||||
|
$mailto = "mailto:"; |
||||||
|
return '<a href="' . $mailto . $address_encode . '" ' . $extra . '>' . $text_encode . '</a>'; |
||||||
|
} else { |
||||||
|
// no encoding |
||||||
|
return '<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>'; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,87 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* |
||||||
|
* This plugin is only for Smarty2 BC |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsFunction |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty {math} function plugin |
||||||
|
* |
||||||
|
* Type: function<br> |
||||||
|
* Name: math<br> |
||||||
|
* Purpose: handle math computations in template |
||||||
|
* |
||||||
|
* @link http://www.smarty.net/manual/en/language.function.math.php {math} |
||||||
|
* (Smarty online manual) |
||||||
|
* @author Monte Ohrt <monte at ohrt dot com> |
||||||
|
* @param array $params parameters |
||||||
|
* @param Smarty_Internal_Template $template template object |
||||||
|
* @return string|null |
||||||
|
*/ |
||||||
|
function smarty_function_math($params, $template) |
||||||
|
{ |
||||||
|
static $_allowed_funcs = array( |
||||||
|
'int' => true, 'abs' => true, 'ceil' => true, 'cos' => true, 'exp' => true, 'floor' => true, |
||||||
|
'log' => true, 'log10' => true, 'max' => true, 'min' => true, 'pi' => true, 'pow' => true, |
||||||
|
'rand' => true, 'round' => true, 'sin' => true, 'sqrt' => true, 'srand' => true ,'tan' => true |
||||||
|
); |
||||||
|
// be sure equation parameter is present |
||||||
|
if (empty($params['equation'])) { |
||||||
|
trigger_error("math: missing equation parameter",E_USER_WARNING); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
$equation = $params['equation']; |
||||||
|
|
||||||
|
// make sure parenthesis are balanced |
||||||
|
if (substr_count($equation,"(") != substr_count($equation,")")) { |
||||||
|
trigger_error("math: unbalanced parenthesis",E_USER_WARNING); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
// match all vars in equation, make sure all are passed |
||||||
|
preg_match_all("!(?:0x[a-fA-F0-9]+)|([a-zA-Z][a-zA-Z0-9_]*)!",$equation, $match); |
||||||
|
|
||||||
|
foreach($match[1] as $curr_var) { |
||||||
|
if ($curr_var && !isset($params[$curr_var]) && !isset($_allowed_funcs[$curr_var])) { |
||||||
|
trigger_error("math: function call $curr_var not allowed",E_USER_WARNING); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
foreach($params as $key => $val) { |
||||||
|
if ($key != "equation" && $key != "format" && $key != "assign") { |
||||||
|
// make sure value is not empty |
||||||
|
if (strlen($val)==0) { |
||||||
|
trigger_error("math: parameter $key is empty",E_USER_WARNING); |
||||||
|
return; |
||||||
|
} |
||||||
|
if (!is_numeric($val)) { |
||||||
|
trigger_error("math: parameter $key: is not numeric",E_USER_WARNING); |
||||||
|
return; |
||||||
|
} |
||||||
|
$equation = preg_replace("/\b$key\b/", " \$params['$key'] ", $equation); |
||||||
|
} |
||||||
|
} |
||||||
|
$smarty_math_result = null; |
||||||
|
eval("\$smarty_math_result = ".$equation.";"); |
||||||
|
|
||||||
|
if (empty($params['format'])) { |
||||||
|
if (empty($params['assign'])) { |
||||||
|
return $smarty_math_result; |
||||||
|
} else { |
||||||
|
$template->assign($params['assign'],$smarty_math_result); |
||||||
|
} |
||||||
|
} else { |
||||||
|
if (empty($params['assign'])){ |
||||||
|
printf($params['format'],$smarty_math_result); |
||||||
|
} else { |
||||||
|
$template->assign($params['assign'],sprintf($params['format'],$smarty_math_result)); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,65 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsModifier |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty capitalize modifier plugin |
||||||
|
* |
||||||
|
* Type: modifier<br> |
||||||
|
* Name: capitalize<br> |
||||||
|
* Purpose: capitalize words in the string |
||||||
|
* |
||||||
|
* {@internal {$string|capitalize:true:true} is the fastest option for MBString enabled systems }} |
||||||
|
* |
||||||
|
* @param string $string string to capitalize |
||||||
|
* @param boolean $uc_digits also capitalize "x123" to "X123" |
||||||
|
* @param boolean $lc_rest capitalize first letters, lowercase all following letters "aAa" to "Aaa" |
||||||
|
* @return string capitalized string |
||||||
|
* @author Monte Ohrt <monte at ohrt dot com> |
||||||
|
* @author Rodney Rehm |
||||||
|
*/ |
||||||
|
function smarty_modifier_capitalize($string, $uc_digits = false, $lc_rest = false) |
||||||
|
{ |
||||||
|
if (Smarty::$_MBSTRING) { |
||||||
|
if ($lc_rest) { |
||||||
|
// uppercase (including hyphenated words) |
||||||
|
$upper_string = mb_convert_case( $string, MB_CASE_TITLE, Smarty::$_CHARSET ); |
||||||
|
} else { |
||||||
|
// uppercase word breaks |
||||||
|
$upper_string = preg_replace("!(^|[^\p{L}'])([\p{Ll}])!eS" . Smarty::$_UTF8_MODIFIER, "stripslashes('\\1').mb_convert_case(stripslashes('\\2'),MB_CASE_UPPER, '" . addslashes(Smarty::$_CHARSET) . "')", $string); |
||||||
|
} |
||||||
|
// check uc_digits case |
||||||
|
if (!$uc_digits) { |
||||||
|
if (preg_match_all("!\b([\p{L}]*[\p{N}]+[\p{L}]*)\b!" . Smarty::$_UTF8_MODIFIER, $string, $matches, PREG_OFFSET_CAPTURE)) { |
||||||
|
foreach($matches[1] as $match) { |
||||||
|
$upper_string = substr_replace($upper_string, mb_strtolower($match[0], Smarty::$_CHARSET), $match[1], strlen($match[0])); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
$upper_string = preg_replace("!((^|\s)['\"])(\w)!e" . Smarty::$_UTF8_MODIFIER, "stripslashes('\\1').mb_convert_case(stripslashes('\\3'),MB_CASE_UPPER, '" . addslashes(Smarty::$_CHARSET) . "')", $upper_string); |
||||||
|
return $upper_string; |
||||||
|
} |
||||||
|
|
||||||
|
// lowercase first |
||||||
|
if ($lc_rest) { |
||||||
|
$string = strtolower($string); |
||||||
|
} |
||||||
|
// uppercase (including hyphenated words) |
||||||
|
$upper_string = preg_replace("!(^|[^\p{L}'])([\p{Ll}])!eS" . Smarty::$_UTF8_MODIFIER, "stripslashes('\\1').ucfirst(stripslashes('\\2'))", $string); |
||||||
|
// check uc_digits case |
||||||
|
if (!$uc_digits) { |
||||||
|
if (preg_match_all("!\b([\p{L}]*[\p{N}]+[\p{L}]*)\b!" . Smarty::$_UTF8_MODIFIER, $string, $matches, PREG_OFFSET_CAPTURE)) { |
||||||
|
foreach($matches[1] as $match) { |
||||||
|
$upper_string = substr_replace($upper_string, strtolower($match[0]), $match[1], strlen($match[0])); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
$upper_string = preg_replace("!((^|\s)['\"])(\w)!e" . Smarty::$_UTF8_MODIFIER, "stripslashes('\\1').strtoupper(stripslashes('\\3'))", $upper_string); |
||||||
|
return $upper_string; |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,65 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsModifier |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty date_format modifier plugin |
||||||
|
* |
||||||
|
* Type: modifier<br> |
||||||
|
* Name: date_format<br> |
||||||
|
* Purpose: format datestamps via strftime<br> |
||||||
|
* Input:<br> |
||||||
|
* - string: input date string |
||||||
|
* - format: strftime format for output |
||||||
|
* - default_date: default date if $string is empty |
||||||
|
* |
||||||
|
* @link http://www.smarty.net/manual/en/language.modifier.date.format.php date_format (Smarty online manual) |
||||||
|
* @author Monte Ohrt <monte at ohrt dot com> |
||||||
|
* @param string $string input date string |
||||||
|
* @param string $format strftime format for output |
||||||
|
* @param string $default_date default date if $string is empty |
||||||
|
* @param string $formatter either 'strftime' or 'auto' |
||||||
|
* @return string |void |
||||||
|
* @uses smarty_make_timestamp() |
||||||
|
*/ |
||||||
|
function smarty_modifier_date_format($string, $format=null, $default_date='', $formatter='auto') |
||||||
|
{ |
||||||
|
if ($format === null) { |
||||||
|
$format = Smarty::$_DATE_FORMAT; |
||||||
|
} |
||||||
|
/** |
||||||
|
* Include the {@link shared.make_timestamp.php} plugin |
||||||
|
*/ |
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'); |
||||||
|
if ($string != '' && $string != '0000-00-00' && $string != '0000-00-00 00:00:00') { |
||||||
|
$timestamp = smarty_make_timestamp($string); |
||||||
|
} elseif ($default_date != '') { |
||||||
|
$timestamp = smarty_make_timestamp($default_date); |
||||||
|
} else { |
||||||
|
return; |
||||||
|
} |
||||||
|
if($formatter=='strftime'||($formatter=='auto'&&strpos($format,'%')!==false)) { |
||||||
|
if (DS == '\\') { |
||||||
|
$_win_from = array('%D', '%h', '%n', '%r', '%R', '%t', '%T'); |
||||||
|
$_win_to = array('%m/%d/%y', '%b', "\n", '%I:%M:%S %p', '%H:%M', "\t", '%H:%M:%S'); |
||||||
|
if (strpos($format, '%e') !== false) { |
||||||
|
$_win_from[] = '%e'; |
||||||
|
$_win_to[] = sprintf('%\' 2d', date('j', $timestamp)); |
||||||
|
} |
||||||
|
if (strpos($format, '%l') !== false) { |
||||||
|
$_win_from[] = '%l'; |
||||||
|
$_win_to[] = sprintf('%\' 2d', date('h', $timestamp)); |
||||||
|
} |
||||||
|
$format = str_replace($_win_from, $_win_to, $format); |
||||||
|
} |
||||||
|
return strftime($format, $timestamp); |
||||||
|
} else { |
||||||
|
return date($format, $timestamp); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,105 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
* @subpackage Debug |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty debug_print_var modifier plugin |
||||||
|
* |
||||||
|
* Type: modifier<br> |
||||||
|
* Name: debug_print_var<br> |
||||||
|
* Purpose: formats variable contents for display in the console |
||||||
|
* |
||||||
|
* @author Monte Ohrt <monte at ohrt dot com> |
||||||
|
* @param array|object $var variable to be formatted |
||||||
|
* @param integer $depth maximum recursion depth if $var is an array |
||||||
|
* @param integer $length maximum string length if $var is a string |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
function smarty_modifier_debug_print_var ($var, $depth = 0, $length = 40) |
||||||
|
{ |
||||||
|
$_replace = array("\n" => '<i>\n</i>', |
||||||
|
"\r" => '<i>\r</i>', |
||||||
|
"\t" => '<i>\t</i>' |
||||||
|
); |
||||||
|
|
||||||
|
switch (gettype($var)) { |
||||||
|
case 'array' : |
||||||
|
$results = '<b>Array (' . count($var) . ')</b>'; |
||||||
|
foreach ($var as $curr_key => $curr_val) { |
||||||
|
$results .= '<br>' . str_repeat(' ', $depth * 2) |
||||||
|
. '<b>' . strtr($curr_key, $_replace) . '</b> => ' |
||||||
|
. smarty_modifier_debug_print_var($curr_val, ++$depth, $length); |
||||||
|
$depth--; |
||||||
|
} |
||||||
|
break; |
||||||
|
|
||||||
|
case 'object' : |
||||||
|
$object_vars = get_object_vars($var); |
||||||
|
$results = '<b>' . get_class($var) . ' Object (' . count($object_vars) . ')</b>'; |
||||||
|
foreach ($object_vars as $curr_key => $curr_val) { |
||||||
|
$results .= '<br>' . str_repeat(' ', $depth * 2) |
||||||
|
. '<b> ->' . strtr($curr_key, $_replace) . '</b> = ' |
||||||
|
. smarty_modifier_debug_print_var($curr_val, ++$depth, $length); |
||||||
|
$depth--; |
||||||
|
} |
||||||
|
break; |
||||||
|
|
||||||
|
case 'boolean' : |
||||||
|
case 'NULL' : |
||||||
|
case 'resource' : |
||||||
|
if (true === $var) { |
||||||
|
$results = 'true'; |
||||||
|
} elseif (false === $var) { |
||||||
|
$results = 'false'; |
||||||
|
} elseif (null === $var) { |
||||||
|
$results = 'null'; |
||||||
|
} else { |
||||||
|
$results = htmlspecialchars((string) $var); |
||||||
|
} |
||||||
|
$results = '<i>' . $results . '</i>'; |
||||||
|
break; |
||||||
|
|
||||||
|
case 'integer' : |
||||||
|
case 'float' : |
||||||
|
$results = htmlspecialchars((string) $var); |
||||||
|
break; |
||||||
|
|
||||||
|
case 'string' : |
||||||
|
$results = strtr($var, $_replace); |
||||||
|
if (Smarty::$_MBSTRING) { |
||||||
|
if (mb_strlen($var, Smarty::$_CHARSET) > $length) { |
||||||
|
$results = mb_substr($var, 0, $length - 3, Smarty::$_CHARSET) . '...'; |
||||||
|
} |
||||||
|
} else { |
||||||
|
if (isset($var[$length])) { |
||||||
|
$results = substr($var, 0, $length - 3) . '...'; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
$results = htmlspecialchars('"' . $results . '"'); |
||||||
|
break; |
||||||
|
|
||||||
|
case 'unknown type' : |
||||||
|
default : |
||||||
|
$results = strtr((string) $var, $_replace); |
||||||
|
if (Smarty::$_MBSTRING) { |
||||||
|
if (mb_strlen($results, Smarty::$_CHARSET) > $length) { |
||||||
|
$results = mb_substr($results, 0, $length - 3, Smarty::$_CHARSET) . '...'; |
||||||
|
} |
||||||
|
} else { |
||||||
|
if (strlen($results) > $length) { |
||||||
|
$results = substr($results, 0, $length - 3) . '...'; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
$results = htmlspecialchars($results); |
||||||
|
} |
||||||
|
|
||||||
|
return $results; |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,188 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsModifier |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty escape modifier plugin |
||||||
|
* |
||||||
|
* Type: modifier<br> |
||||||
|
* Name: escape<br> |
||||||
|
* Purpose: escape string for output |
||||||
|
* |
||||||
|
* @link http://www.smarty.net/manual/en/language.modifier.count.characters.php count_characters (Smarty online manual) |
||||||
|
* @author Monte Ohrt <monte at ohrt dot com> |
||||||
|
* @param string $string input string |
||||||
|
* @param string $esc_type escape type |
||||||
|
* @param string $char_set character set, used for htmlspecialchars() or htmlentities() |
||||||
|
* @param boolean $double_encode encode already encoded entitites again, used for htmlspecialchars() or htmlentities() |
||||||
|
* @return string escaped input string |
||||||
|
*/ |
||||||
|
function smarty_modifier_escape($string, $esc_type = 'html', $char_set = null, $double_encode = true) |
||||||
|
{ |
||||||
|
static $_double_encode = null; |
||||||
|
if ($_double_encode === null) { |
||||||
|
$_double_encode = version_compare(PHP_VERSION, '5.2.3', '>='); |
||||||
|
} |
||||||
|
|
||||||
|
if (!$char_set) { |
||||||
|
$char_set = Smarty::$_CHARSET; |
||||||
|
} |
||||||
|
|
||||||
|
switch ($esc_type) { |
||||||
|
case 'html': |
||||||
|
if ($_double_encode) { |
||||||
|
// php >=5.3.2 - go native |
||||||
|
return htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode); |
||||||
|
} else { |
||||||
|
if ($double_encode) { |
||||||
|
// php <5.2.3 - only handle double encoding |
||||||
|
return htmlspecialchars($string, ENT_QUOTES, $char_set); |
||||||
|
} else { |
||||||
|
// php <5.2.3 - prevent double encoding |
||||||
|
$string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); |
||||||
|
$string = htmlspecialchars($string, ENT_QUOTES, $char_set); |
||||||
|
$string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string); |
||||||
|
return $string; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
case 'htmlall': |
||||||
|
if (Smarty::$_MBSTRING) { |
||||||
|
// mb_convert_encoding ignores htmlspecialchars() |
||||||
|
if ($_double_encode) { |
||||||
|
// php >=5.3.2 - go native |
||||||
|
$string = htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode); |
||||||
|
} else { |
||||||
|
if ($double_encode) { |
||||||
|
// php <5.2.3 - only handle double encoding |
||||||
|
$string = htmlspecialchars($string, ENT_QUOTES, $char_set); |
||||||
|
} else { |
||||||
|
// php <5.2.3 - prevent double encoding |
||||||
|
$string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); |
||||||
|
$string = htmlspecialchars($string, ENT_QUOTES, $char_set); |
||||||
|
$string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string); |
||||||
|
return $string; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// htmlentities() won't convert everything, so use mb_convert_encoding |
||||||
|
return mb_convert_encoding($string, 'HTML-ENTITIES', $char_set); |
||||||
|
} |
||||||
|
|
||||||
|
// no MBString fallback |
||||||
|
if ($_double_encode) { |
||||||
|
return htmlentities($string, ENT_QUOTES, $char_set, $double_encode); |
||||||
|
} else { |
||||||
|
if ($double_encode) { |
||||||
|
return htmlentities($string, ENT_QUOTES, $char_set); |
||||||
|
} else { |
||||||
|
$string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); |
||||||
|
$string = htmlentities($string, ENT_QUOTES, $char_set); |
||||||
|
$string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string); |
||||||
|
return $string; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
case 'url': |
||||||
|
return rawurlencode($string); |
||||||
|
|
||||||
|
case 'urlpathinfo': |
||||||
|
return str_replace('%2F', '/', rawurlencode($string)); |
||||||
|
|
||||||
|
case 'quotes': |
||||||
|
// escape unescaped single quotes |
||||||
|
return preg_replace("%(?<!\\\\)'%", "\\'", $string); |
||||||
|
|
||||||
|
case 'hex': |
||||||
|
// escape every byte into hex |
||||||
|
// Note that the UTF-8 encoded character ä will be represented as %c3%a4 |
||||||
|
$return = ''; |
||||||
|
$_length = strlen($string); |
||||||
|
for ($x = 0; $x < $_length; $x++) { |
||||||
|
$return .= '%' . bin2hex($string[$x]); |
||||||
|
} |
||||||
|
return $return; |
||||||
|
|
||||||
|
case 'hexentity': |
||||||
|
$return = ''; |
||||||
|
if (Smarty::$_MBSTRING) { |
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php'); |
||||||
|
$return = ''; |
||||||
|
foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) { |
||||||
|
$return .= '&#x' . strtoupper(dechex($unicode)) . ';'; |
||||||
|
} |
||||||
|
return $return; |
||||||
|
} |
||||||
|
// no MBString fallback |
||||||
|
$_length = strlen($string); |
||||||
|
for ($x = 0; $x < $_length; $x++) { |
||||||
|
$return .= '&#x' . bin2hex($string[$x]) . ';'; |
||||||
|
} |
||||||
|
return $return; |
||||||
|
|
||||||
|
case 'decentity': |
||||||
|
$return = ''; |
||||||
|
if (Smarty::$_MBSTRING) { |
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php'); |
||||||
|
$return = ''; |
||||||
|
foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) { |
||||||
|
$return .= '&#' . $unicode . ';'; |
||||||
|
} |
||||||
|
return $return; |
||||||
|
} |
||||||
|
// no MBString fallback |
||||||
|
$_length = strlen($string); |
||||||
|
for ($x = 0; $x < $_length; $x++) { |
||||||
|
$return .= '&#' . ord($string[$x]) . ';'; |
||||||
|
} |
||||||
|
return $return; |
||||||
|
|
||||||
|
case 'javascript': |
||||||
|
// escape quotes and backslashes, newlines, etc. |
||||||
|
return strtr($string, array('\\' => '\\\\', "'" => "\\'", '"' => '\\"', "\r" => '\\r', "\n" => '\\n', '</' => '<\/')); |
||||||
|
|
||||||
|
case 'mail': |
||||||
|
if (Smarty::$_MBSTRING) { |
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php'); |
||||||
|
return smarty_mb_str_replace(array('@', '.'), array(' [AT] ', ' [DOT] '), $string); |
||||||
|
} |
||||||
|
// no MBString fallback |
||||||
|
return str_replace(array('@', '.'), array(' [AT] ', ' [DOT] '), $string); |
||||||
|
|
||||||
|
case 'nonstd': |
||||||
|
// escape non-standard chars, such as ms document quotes |
||||||
|
$return = ''; |
||||||
|
if (Smarty::$_MBSTRING) { |
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php'); |
||||||
|
foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) { |
||||||
|
if ($unicode >= 126) { |
||||||
|
$return .= '&#' . $unicode . ';'; |
||||||
|
} else { |
||||||
|
$return .= chr($unicode); |
||||||
|
} |
||||||
|
} |
||||||
|
return $return; |
||||||
|
} |
||||||
|
|
||||||
|
$_length = strlen($string); |
||||||
|
for ($_i = 0; $_i < $_length; $_i++) { |
||||||
|
$_ord = ord(substr($string, $_i, 1)); |
||||||
|
// non-standard char, escape it |
||||||
|
if ($_ord >= 126) { |
||||||
|
$return .= '&#' . $_ord . ';'; |
||||||
|
} else { |
||||||
|
$return .= substr($string, $_i, 1); |
||||||
|
} |
||||||
|
} |
||||||
|
return $return; |
||||||
|
|
||||||
|
default: |
||||||
|
return $string; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,55 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsModifier |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty regex_replace modifier plugin |
||||||
|
* |
||||||
|
* Type: modifier<br> |
||||||
|
* Name: regex_replace<br> |
||||||
|
* Purpose: regular expression search/replace |
||||||
|
* |
||||||
|
* @link http://smarty.php.net/manual/en/language.modifier.regex.replace.php |
||||||
|
* regex_replace (Smarty online manual) |
||||||
|
* @author Monte Ohrt <monte at ohrt dot com> |
||||||
|
* @param string $string input string |
||||||
|
* @param string|array $search regular expression(s) to search for |
||||||
|
* @param string|array $replace string(s) that should be replaced |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
function smarty_modifier_regex_replace($string, $search, $replace) |
||||||
|
{ |
||||||
|
if(is_array($search)) { |
||||||
|
foreach($search as $idx => $s) { |
||||||
|
$search[$idx] = _smarty_regex_replace_check($s); |
||||||
|
} |
||||||
|
} else { |
||||||
|
$search = _smarty_regex_replace_check($search); |
||||||
|
} |
||||||
|
return preg_replace($search, $replace, $string); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @param string $search string(s) that should be replaced |
||||||
|
* @return string |
||||||
|
* @ignore |
||||||
|
*/ |
||||||
|
function _smarty_regex_replace_check($search) |
||||||
|
{ |
||||||
|
// null-byte injection detection |
||||||
|
// anything behind the first null-byte is ignored |
||||||
|
if (($pos = strpos($search,"\0")) !== false) { |
||||||
|
$search = substr($search,0,$pos); |
||||||
|
} |
||||||
|
// remove eval-modifier from $search |
||||||
|
if (preg_match('!([a-zA-Z\s]+)$!s', $search, $match) && (strpos($match[1], 'e') !== false)) { |
||||||
|
$search = substr($search, 0, -strlen($match[1])) . preg_replace('![e\s]+!', '', $match[1]); |
||||||
|
} |
||||||
|
return $search; |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,33 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsModifier |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty replace modifier plugin |
||||||
|
* |
||||||
|
* Type: modifier<br> |
||||||
|
* Name: replace<br> |
||||||
|
* Purpose: simple search/replace |
||||||
|
* |
||||||
|
* @link http://smarty.php.net/manual/en/language.modifier.replace.php replace (Smarty online manual) |
||||||
|
* @author Monte Ohrt <monte at ohrt dot com> |
||||||
|
* @author Uwe Tews |
||||||
|
* @param string $string input string |
||||||
|
* @param string $search text to search for |
||||||
|
* @param string $replace replacement text |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
function smarty_modifier_replace($string, $search, $replace) |
||||||
|
{ |
||||||
|
if (Smarty::$_MBSTRING) { |
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php'); |
||||||
|
return smarty_mb_str_replace($search, $replace, $string); |
||||||
|
} |
||||||
|
|
||||||
|
return str_replace($search, $replace, $string); |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,27 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsModifier |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty spacify modifier plugin |
||||||
|
* |
||||||
|
* Type: modifier<br> |
||||||
|
* Name: spacify<br> |
||||||
|
* Purpose: add spaces between characters in a string |
||||||
|
* |
||||||
|
* @link http://smarty.php.net/manual/en/language.modifier.spacify.php spacify (Smarty online manual) |
||||||
|
* @author Monte Ohrt <monte at ohrt dot com> |
||||||
|
* @param string $string input string |
||||||
|
* @param string $spacify_char string to insert between characters. |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
function smarty_modifier_spacify($string, $spacify_char = ' ') |
||||||
|
{ |
||||||
|
// well… what about charsets besides latin and UTF-8? |
||||||
|
return implode($spacify_char, preg_split('//' . Smarty::$_UTF8_MODIFIER, $string, -1, PREG_SPLIT_NO_EMPTY)); |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,59 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsModifier |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty truncate modifier plugin |
||||||
|
* |
||||||
|
* Type: modifier<br> |
||||||
|
* Name: truncate<br> |
||||||
|
* Purpose: Truncate a string to a certain length if necessary, |
||||||
|
* optionally splitting in the middle of a word, and |
||||||
|
* appending the $etc string or inserting $etc into the middle. |
||||||
|
* |
||||||
|
* @link http://smarty.php.net/manual/en/language.modifier.truncate.php truncate (Smarty online manual) |
||||||
|
* @author Monte Ohrt <monte at ohrt dot com> |
||||||
|
* @param string $string input string |
||||||
|
* @param integer $length length of truncated text |
||||||
|
* @param string $etc end string |
||||||
|
* @param boolean $break_words truncate at word boundary |
||||||
|
* @param boolean $middle truncate in the middle of text |
||||||
|
* @return string truncated string |
||||||
|
*/ |
||||||
|
function smarty_modifier_truncate($string, $length = 80, $etc = '...', $break_words = false, $middle = false) { |
||||||
|
if ($length == 0) |
||||||
|
return ''; |
||||||
|
|
||||||
|
if (Smarty::$_MBSTRING) { |
||||||
|
if (mb_strlen($string, Smarty::$_CHARSET) > $length) { |
||||||
|
$length -= min($length, mb_strlen($etc, Smarty::$_CHARSET)); |
||||||
|
if (!$break_words && !$middle) { |
||||||
|
$string = preg_replace('/\s+?(\S+)?$/' . Smarty::$_UTF8_MODIFIER, '', mb_substr($string, 0, $length + 1, Smarty::$_CHARSET)); |
||||||
|
} |
||||||
|
if (!$middle) { |
||||||
|
return mb_substr($string, 0, $length, Smarty::$_CHARSET) . $etc; |
||||||
|
} |
||||||
|
return mb_substr($string, 0, $length / 2, Smarty::$_CHARSET) . $etc . mb_substr($string, - $length / 2, $length, Smarty::$_CHARSET); |
||||||
|
} |
||||||
|
return $string; |
||||||
|
} |
||||||
|
|
||||||
|
// no MBString fallback |
||||||
|
if (isset($string[$length])) { |
||||||
|
$length -= min($length, strlen($etc)); |
||||||
|
if (!$break_words && !$middle) { |
||||||
|
$string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length + 1)); |
||||||
|
} |
||||||
|
if (!$middle) { |
||||||
|
return substr($string, 0, $length) . $etc; |
||||||
|
} |
||||||
|
return substr($string, 0, $length / 2) . $etc . substr($string, - $length / 2); |
||||||
|
} |
||||||
|
return $string; |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,30 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsModifierCompiler |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty cat modifier plugin |
||||||
|
* |
||||||
|
* Type: modifier<br> |
||||||
|
* Name: cat<br> |
||||||
|
* Date: Feb 24, 2003<br> |
||||||
|
* Purpose: catenate a value to a variable<br> |
||||||
|
* Input: string to catenate<br> |
||||||
|
* Example: {$var|cat:"foo"} |
||||||
|
* |
||||||
|
* @link http://smarty.php.net/manual/en/language.modifier.cat.php cat |
||||||
|
* (Smarty online manual) |
||||||
|
* @author Uwe Tews |
||||||
|
* @param array $params parameters |
||||||
|
* @return string with compiled code |
||||||
|
*/ |
||||||
|
function smarty_modifiercompiler_cat($params, $compiler) |
||||||
|
{ |
||||||
|
return '('.implode(').(', $params).')'; |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,33 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsModifierCompiler |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty count_characters modifier plugin |
||||||
|
* |
||||||
|
* Type: modifier<br> |
||||||
|
* Name: count_characteres<br> |
||||||
|
* Purpose: count the number of characters in a text |
||||||
|
* |
||||||
|
* @link http://www.smarty.net/manual/en/language.modifier.count.characters.php count_characters (Smarty online manual) |
||||||
|
* @author Uwe Tews |
||||||
|
* @param array $params parameters |
||||||
|
* @return string with compiled code |
||||||
|
*/ |
||||||
|
function smarty_modifiercompiler_count_characters($params, $compiler) |
||||||
|
{ |
||||||
|
if (!isset($params[1]) || $params[1] != 'true') { |
||||||
|
return 'preg_match_all(\'/[^\s]/' . Smarty::$_UTF8_MODIFIER . '\',' . $params[0] . ', $tmp)'; |
||||||
|
} |
||||||
|
if (Smarty::$_MBSTRING) { |
||||||
|
return 'mb_strlen(' . $params[0] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')'; |
||||||
|
} |
||||||
|
// no MBString fallback |
||||||
|
return 'strlen(' . $params[0] . ')'; |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,28 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsModifierCompiler |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty count_paragraphs modifier plugin |
||||||
|
* |
||||||
|
* Type: modifier<br> |
||||||
|
* Name: count_paragraphs<br> |
||||||
|
* Purpose: count the number of paragraphs in a text |
||||||
|
* |
||||||
|
* @link http://www.smarty.net/manual/en/language.modifier.count.paragraphs.php |
||||||
|
* count_paragraphs (Smarty online manual) |
||||||
|
* @author Uwe Tews |
||||||
|
* @param array $params parameters |
||||||
|
* @return string with compiled code |
||||||
|
*/ |
||||||
|
function smarty_modifiercompiler_count_paragraphs($params, $compiler) |
||||||
|
{ |
||||||
|
// count \r or \n characters |
||||||
|
return '(preg_match_all(\'#[\r\n]+#\', ' . $params[0] . ', $tmp)+1)'; |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,28 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsModifierCompiler |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty count_sentences modifier plugin |
||||||
|
* |
||||||
|
* Type: modifier<br> |
||||||
|
* Name: count_sentences |
||||||
|
* Purpose: count the number of sentences in a text |
||||||
|
* |
||||||
|
* @link http://www.smarty.net/manual/en/language.modifier.count.paragraphs.php |
||||||
|
* count_sentences (Smarty online manual) |
||||||
|
* @author Uwe Tews |
||||||
|
* @param array $params parameters |
||||||
|
* @return string with compiled code |
||||||
|
*/ |
||||||
|
function smarty_modifiercompiler_count_sentences($params, $compiler) |
||||||
|
{ |
||||||
|
// find periods, question marks, exclamation marks with a word before but not after. |
||||||
|
return 'preg_match_all("#\w[\.\?\!](\W|$)#S' . Smarty::$_UTF8_MODIFIER . '", ' . $params[0] . ', $tmp)'; |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,32 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsModifierCompiler |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty count_words modifier plugin |
||||||
|
* |
||||||
|
* Type: modifier<br> |
||||||
|
* Name: count_words<br> |
||||||
|
* Purpose: count the number of words in a text |
||||||
|
* |
||||||
|
* @link http://www.smarty.net/manual/en/language.modifier.count.words.php count_words (Smarty online manual) |
||||||
|
* @author Uwe Tews |
||||||
|
* @param array $params parameters |
||||||
|
* @return string with compiled code |
||||||
|
*/ |
||||||
|
function smarty_modifiercompiler_count_words($params, $compiler) |
||||||
|
{ |
||||||
|
if (Smarty::$_MBSTRING) { |
||||||
|
// return 'preg_match_all(\'#[\w\pL]+#' . Smarty::$_UTF8_MODIFIER . '\', ' . $params[0] . ', $tmp)'; |
||||||
|
// expression taken from http://de.php.net/manual/en/function.str-word-count.php#85592 |
||||||
|
return 'preg_match_all(\'/\p{L}[\p{L}\p{Mn}\p{Pd}\\\'\x{2019}]*/' . Smarty::$_UTF8_MODIFIER . '\', ' . $params[0] . ', $tmp)'; |
||||||
|
} |
||||||
|
// no MBString fallback |
||||||
|
return 'str_word_count(' . $params[0] . ')'; |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,35 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsModifierCompiler |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty default modifier plugin |
||||||
|
* |
||||||
|
* Type: modifier<br> |
||||||
|
* Name: default<br> |
||||||
|
* Purpose: designate default value for empty variables |
||||||
|
* |
||||||
|
* @link http://www.smarty.net/manual/en/language.modifier.default.php default (Smarty online manual) |
||||||
|
* @author Uwe Tews |
||||||
|
* @param array $params parameters |
||||||
|
* @return string with compiled code |
||||||
|
*/ |
||||||
|
function smarty_modifiercompiler_default ($params, $compiler) |
||||||
|
{ |
||||||
|
$output = $params[0]; |
||||||
|
if (!isset($params[1])) { |
||||||
|
$params[1] = "''"; |
||||||
|
} |
||||||
|
|
||||||
|
array_shift($params); |
||||||
|
foreach ($params as $param) { |
||||||
|
$output = '(($tmp = @' . $output . ')===null||$tmp===\'\' ? ' . $param . ' : $tmp)'; |
||||||
|
} |
||||||
|
return $output; |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,125 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsModifierCompiler |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* @ignore |
||||||
|
*/ |
||||||
|
require_once( SMARTY_PLUGINS_DIR .'shared.literal_compiler_param.php' ); |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty escape modifier plugin |
||||||
|
* |
||||||
|
* Type: modifier<br> |
||||||
|
* Name: escape<br> |
||||||
|
* Purpose: escape string for output |
||||||
|
* |
||||||
|
* @link http://www.smarty.net/docsv2/en/language.modifier.escape count_characters (Smarty online manual) |
||||||
|
* @author Rodney Rehm |
||||||
|
* @param array $params parameters |
||||||
|
* @return string with compiled code |
||||||
|
*/ |
||||||
|
function smarty_modifiercompiler_escape($params, $compiler) |
||||||
|
{ |
||||||
|
static $_double_encode = null; |
||||||
|
if ($_double_encode === null) { |
||||||
|
$_double_encode = version_compare(PHP_VERSION, '5.2.3', '>='); |
||||||
|
} |
||||||
|
|
||||||
|
try { |
||||||
|
$esc_type = smarty_literal_compiler_param($params, 1, 'html'); |
||||||
|
$char_set = smarty_literal_compiler_param($params, 2, Smarty::$_CHARSET); |
||||||
|
$double_encode = smarty_literal_compiler_param($params, 3, true); |
||||||
|
|
||||||
|
if (!$char_set) { |
||||||
|
$char_set = Smarty::$_CHARSET; |
||||||
|
} |
||||||
|
|
||||||
|
switch ($esc_type) { |
||||||
|
case 'html': |
||||||
|
if ($_double_encode) { |
||||||
|
return 'htmlspecialchars(' |
||||||
|
. $params[0] .', ENT_QUOTES, ' |
||||||
|
. var_export($char_set, true) . ', ' |
||||||
|
. var_export($double_encode, true) . ')'; |
||||||
|
} else if ($double_encode) { |
||||||
|
return 'htmlspecialchars(' |
||||||
|
. $params[0] .', ENT_QUOTES, ' |
||||||
|
. var_export($char_set, true) . ')'; |
||||||
|
} else { |
||||||
|
// fall back to modifier.escape.php |
||||||
|
} |
||||||
|
|
||||||
|
case 'htmlall': |
||||||
|
if (Smarty::$_MBSTRING) { |
||||||
|
if ($_double_encode) { |
||||||
|
// php >=5.2.3 - go native |
||||||
|
return 'mb_convert_encoding(htmlspecialchars(' |
||||||
|
. $params[0] .', ENT_QUOTES, ' |
||||||
|
. var_export($char_set, true) . ', ' |
||||||
|
. var_export($double_encode, true) |
||||||
|
. '), "HTML-ENTITIES", ' |
||||||
|
. var_export($char_set, true) . ')'; |
||||||
|
} else if ($double_encode) { |
||||||
|
// php <5.2.3 - only handle double encoding |
||||||
|
return 'mb_convert_encoding(htmlspecialchars(' |
||||||
|
. $params[0] .', ENT_QUOTES, ' |
||||||
|
. var_export($char_set, true) |
||||||
|
. '), "HTML-ENTITIES", ' |
||||||
|
. var_export($char_set, true) . ')'; |
||||||
|
} else { |
||||||
|
// fall back to modifier.escape.php |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// no MBString fallback |
||||||
|
if ($_double_encode) { |
||||||
|
// php >=5.2.3 - go native |
||||||
|
return 'htmlentities(' |
||||||
|
. $params[0] .', ENT_QUOTES, ' |
||||||
|
. var_export($char_set, true) . ', ' |
||||||
|
. var_export($double_encode, true) . ')'; |
||||||
|
} else if ($double_encode) { |
||||||
|
// php <5.2.3 - only handle double encoding |
||||||
|
return 'htmlentities(' |
||||||
|
. $params[0] .', ENT_QUOTES, ' |
||||||
|
. var_export($char_set, true) . ')'; |
||||||
|
} else { |
||||||
|
// fall back to modifier.escape.php |
||||||
|
} |
||||||
|
|
||||||
|
case 'url': |
||||||
|
return 'rawurlencode(' . $params[0] . ')'; |
||||||
|
|
||||||
|
case 'urlpathinfo': |
||||||
|
return 'str_replace("%2F", "/", rawurlencode(' . $params[0] . '))'; |
||||||
|
|
||||||
|
case 'quotes': |
||||||
|
// escape unescaped single quotes |
||||||
|
return 'preg_replace("%(?<!\\\\\\\\)\'%", "\\\'",' . $params[0] . ')'; |
||||||
|
|
||||||
|
case 'javascript': |
||||||
|
// escape quotes and backslashes, newlines, etc. |
||||||
|
return 'strtr(' . $params[0] . ', array("\\\\" => "\\\\\\\\", "\'" => "\\\\\'", "\"" => "\\\\\"", "\\r" => "\\\\r", "\\n" => "\\\n", "</" => "<\/" ))'; |
||||||
|
|
||||||
|
} |
||||||
|
} catch(SmartyException $e) { |
||||||
|
// pass through to regular plugin fallback |
||||||
|
} |
||||||
|
|
||||||
|
// could not optimize |escape call, so fallback to regular plugin |
||||||
|
if ($compiler->tag_nocache | $compiler->nocache) { |
||||||
|
$compiler->template->required_plugins['nocache']['escape']['modifier']['file'] = SMARTY_PLUGINS_DIR .'modifier.escape.php'; |
||||||
|
$compiler->template->required_plugins['nocache']['escape']['modifier']['function'] = 'smarty_modifier_escape'; |
||||||
|
} else { |
||||||
|
$compiler->template->required_plugins['compiled']['escape']['modifier']['file'] = SMARTY_PLUGINS_DIR .'modifier.escape.php'; |
||||||
|
$compiler->template->required_plugins['compiled']['escape']['modifier']['function'] = 'smarty_modifier_escape'; |
||||||
|
} |
||||||
|
return 'smarty_modifier_escape(' . join( ', ', $params ) . ')'; |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,34 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsModifierCompiler |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty from_charset modifier plugin |
||||||
|
* |
||||||
|
* Type: modifier<br> |
||||||
|
* Name: from_charset<br> |
||||||
|
* Purpose: convert character encoding from $charset to internal encoding |
||||||
|
* |
||||||
|
* @author Rodney Rehm |
||||||
|
* @param array $params parameters |
||||||
|
* @return string with compiled code |
||||||
|
*/ |
||||||
|
function smarty_modifiercompiler_from_charset($params, $compiler) |
||||||
|
{ |
||||||
|
if (!Smarty::$_MBSTRING) { |
||||||
|
// FIXME: (rodneyrehm) shouldn't this throw an error? |
||||||
|
return $params[0]; |
||||||
|
} |
||||||
|
|
||||||
|
if (!isset($params[1])) { |
||||||
|
$params[1] = '"ISO-8859-1"'; |
||||||
|
} |
||||||
|
|
||||||
|
return 'mb_convert_encoding(' . $params[0] . ', "' . addslashes(Smarty::$_CHARSET) . '", ' . $params[1] . ')'; |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,32 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsModifierCompiler |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty indent modifier plugin |
||||||
|
* |
||||||
|
* Type: modifier<br> |
||||||
|
* Name: indent<br> |
||||||
|
* Purpose: indent lines of text |
||||||
|
* |
||||||
|
* @link http://www.smarty.net/manual/en/language.modifier.indent.php indent (Smarty online manual) |
||||||
|
* @author Uwe Tews |
||||||
|
* @param array $params parameters |
||||||
|
* @return string with compiled code |
||||||
|
*/ |
||||||
|
|
||||||
|
function smarty_modifiercompiler_indent($params, $compiler) |
||||||
|
{ |
||||||
|
if (!isset($params[1])) { |
||||||
|
$params[1] = 4; |
||||||
|
} |
||||||
|
if (!isset($params[2])) { |
||||||
|
$params[2] = "' '"; |
||||||
|
} |
||||||
|
return 'preg_replace(\'!^!m\',str_repeat(' . $params[2] . ',' . $params[1] . '),' . $params[0] . ')'; |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,31 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsModifierCompiler |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty lower modifier plugin |
||||||
|
* |
||||||
|
* Type: modifier<br> |
||||||
|
* Name: lower<br> |
||||||
|
* Purpose: convert string to lowercase |
||||||
|
* |
||||||
|
* @link http://www.smarty.net/manual/en/language.modifier.lower.php lower (Smarty online manual) |
||||||
|
* @author Monte Ohrt <monte at ohrt dot com> |
||||||
|
* @author Uwe Tews |
||||||
|
* @param array $params parameters |
||||||
|
* @return string with compiled code |
||||||
|
*/ |
||||||
|
|
||||||
|
function smarty_modifiercompiler_lower($params, $compiler) |
||||||
|
{ |
||||||
|
if (Smarty::$_MBSTRING) { |
||||||
|
return 'mb_strtolower(' . $params[0] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')' ; |
||||||
|
} |
||||||
|
// no MBString fallback |
||||||
|
return 'strtolower(' . $params[0] . ')'; |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,25 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsModifierCompiler |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty noprint modifier plugin |
||||||
|
* |
||||||
|
* Type: modifier<br> |
||||||
|
* Name: noprint<br> |
||||||
|
* Purpose: return an empty string |
||||||
|
* |
||||||
|
* @author Uwe Tews |
||||||
|
* @param array $params parameters |
||||||
|
* @return string with compiled code |
||||||
|
*/ |
||||||
|
function smarty_modifiercompiler_noprint($params, $compiler) |
||||||
|
{ |
||||||
|
return "''"; |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,26 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsModifierCompiler |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty string_format modifier plugin |
||||||
|
* |
||||||
|
* Type: modifier<br> |
||||||
|
* Name: string_format<br> |
||||||
|
* Purpose: format strings via sprintf |
||||||
|
* |
||||||
|
* @link http://www.smarty.net/manual/en/language.modifier.string.format.php string_format (Smarty online manual) |
||||||
|
* @author Uwe Tews |
||||||
|
* @param array $params parameters |
||||||
|
* @return string with compiled code |
||||||
|
*/ |
||||||
|
function smarty_modifiercompiler_string_format($params, $compiler) |
||||||
|
{ |
||||||
|
return 'sprintf(' . $params[1] . ',' . $params[0] . ')'; |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,33 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsModifierCompiler |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty strip modifier plugin |
||||||
|
* |
||||||
|
* Type: modifier<br> |
||||||
|
* Name: strip<br> |
||||||
|
* Purpose: Replace all repeated spaces, newlines, tabs |
||||||
|
* with a single space or supplied replacement string.<br> |
||||||
|
* Example: {$var|strip} {$var|strip:" "}<br> |
||||||
|
* Date: September 25th, 2002 |
||||||
|
* |
||||||
|
* @link http://www.smarty.net/manual/en/language.modifier.strip.php strip (Smarty online manual) |
||||||
|
* @author Uwe Tews |
||||||
|
* @param array $params parameters |
||||||
|
* @return string with compiled code |
||||||
|
*/ |
||||||
|
|
||||||
|
function smarty_modifiercompiler_strip($params, $compiler) |
||||||
|
{ |
||||||
|
if (!isset($params[1])) { |
||||||
|
$params[1] = "' '"; |
||||||
|
} |
||||||
|
return "preg_replace('!\s+!" . Smarty::$_UTF8_MODIFIER . "', {$params[1]},{$params[0]})"; |
||||||
|
} |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,33 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Smarty plugin |
||||||
|
* |
||||||
|
* @package Smarty |
||||||
|
* @subpackage PluginsModifierCompiler |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Smarty strip_tags modifier plugin |
||||||
|
* |
||||||
|
* Type: modifier<br> |
||||||
|
* Name: strip_tags<br> |
||||||
|
* Purpose: strip html tags from text |
||||||
|
* |
||||||
|
* @link http://www.smarty.net/manual/en/language.modifier.strip.tags.php strip_tags (Smarty online manual) |
||||||
|
* @author Uwe Tews |
||||||
|
* @param array $params parameters |
||||||
|
* @return string with compiled code |
||||||
|
*/ |
||||||
|
function smarty_modifiercompiler_strip_tags($params, $compiler) |
||||||
|
{ |
||||||
|
if (!isset($params[1])) { |
||||||
|
$params[1] = true; |
||||||
|
} |
||||||
|
if ($params[1] === true) { |
||||||
|
return "preg_replace('!<[^>]*?>!', ' ', {$params[0]})"; |
||||||
|
} else { |
||||||
|
return 'strip_tags(' . $params[0] . ')'; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
?> |