@ -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] . ')'; |
||||
} |
||||
} |
||||
|
||||
?> |