update smarty, ganti SQL

This commit is contained in:
Ibnu Maksum 2021-08-18 20:21:16 +07:00
parent fc9ddcd425
commit f5c3a68d80
No known key found for this signature in database
GPG key ID: 7FC82848810579E5
222 changed files with 33463 additions and 25238 deletions

View file

@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<title>PHPMixBill v5.0 Installer</title> <title>PHPMixBill Installer</title>
<link rel="shortcut icon" type="image/x-icon" href="img/favicon.png"> <link rel="shortcut icon" type="image/x-icon" href="img/favicon.png">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
@ -23,31 +23,29 @@
<!-- contents area start --> <!-- contents area start -->
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<h4> PHPMixBill v5.0 Installer </h4> <h4> PHPMixBill Installer </h4>
<div class="box box-two">
<h5>Please Read Before Continue</h5> <h5>Please Read Before Continue</h5>
<p><strong>Informasi Aplikasi</strong><br> <p><strong>Informasi Aplikasi</strong><br>
Application Name: PHPMixBill v5.0<br> Application Name: PHPMixBill <br>
Release Date: 30/10/2015<br> Release Date: 30/10/2015<br>
By: PHPMixBill [ <a href="http://phpmixbill.blogspot.com" target="_blank">hhtp://phpmixbill.blogspot.com</a> ]<br> By: PHPMixBill [ <a href="https://github.com/ibnux/phpmixbill" target="_blank">https://github.com/ibnux/phpmixbill</a> ]<br>
Donasi Paypal: <b>iesien22@yahoo.com</b><br> Donasi Paypal: <b>me@ibnux.et</b><br>
<br> <br>
<strong>Syarat Penggunaan:</strong><br> <strong>Syarat Penggunaan:</strong><br>
Syarat Penggunaan ini berlaku untuk semua versi.<br><br> Syarat Penggunaan ini berlaku untuk semua versi.<br><br>
<ul> <ul>
<li>Silahkan Anda menggunakan aplikasi ini dengan bijak, Anda dapat mendesain ulang script maupun tampilan pada <li>Silahkan Anda menggunakan aplikasi ini dengan bijak, Anda dapat mendesain ulang script maupun tampilan pada
aplikasi ini sesuai dengan kebutuhan anda, memperbayak jumlah copy atau mendistribusikan aplikasi ini. aplikasi ini sesuai dengan kebutuhan anda, memperbayak jumlah copy atau mendistribusikan aplikasi ini.
Dengan catatan tidak menghapus link developer.</li> Dengan catatan tidak menghapus link developer.</li>
<li>Tidak ada garansi dari kami jika anda mengalami error atau merasa rugi ketika menggunakan aplikasi ini, <li>Tidak ada garansi dari kami jika anda mengalami error atau merasa rugi ketika menggunakan aplikasi ini,
Anda hanya dapat memberikan feedback yang berisi laporan error, dengan syarat dan ketentuan yang berlaku.</li> Anda hanya dapat memberikan feedback yang berisi laporan error, dengan syarat dan ketentuan yang berlaku.</li>
<li>Semua yang terkait biaya atau donasi apapun versi-nya, Anda dapat update seumur hidup atau selama aplikasi <li>Semua yang terkait biaya atau donasi apapun versi-nya, Anda dapat update seumur hidup atau selama aplikasi
ini masih dikembangkan. Mohon jangan salah pengertian bahwa kami tim pengembang mengkomersilkan produk ini ini masih dikembangkan. Mohon jangan salah pengertian bahwa kami tim pengembang mengkomersilkan produk ini
dan anda membeli produk kami.</li> dan anda membeli produk kami.</li>
<li>Aplikasi ini bersifat sosial untuk dapat dikembangkan bersama. Karena itu kami juga mengundang relawan-relawan <li>Aplikasi ini bersifat sosial untuk dapat dikembangkan bersama. Karena itu kami juga mengundang relawan-relawan
yang mau menjadi pengembangkan aplikasi ini.</li> yang mau menjadi pengembangkan aplikasi ini.</li>
<li>Penulis berhak setiap saat untuk mengubah ketentuan Syarat Penggunaan tanpa pemberitahuan sebelumnya.</li> <li>Penulis berhak setiap saat untuk mengubah ketentuan Syarat Penggunaan tanpa pemberitahuan sebelumnya.</li>
</ul> </ul>
</div>
</div> </div>
<div class="col-md-12"><br> <div class="col-md-12"><br>
<a href="step2.php" class="btn btn-primary">Accept &amp; Continue</a> <a href="step2.php" class="btn btn-primary">Accept &amp; Continue</a>
@ -55,7 +53,7 @@
</div> </div>
<!-- contents area end --> <!-- contents area end -->
</div> </div>
<div class="footer">Copyright &copy; 2015 PHPMixBill. All Rights Reserved<br/><br/></div> <div class="footer">Copyright &copy; 2021 PHPMixBill. All Rights Reserved<br/><br/></div>
</body> </body>
</html> </html>

View file

@ -1,240 +1,433 @@
-- pjl SQL Dump
-- Server version:5.6.25 --
-- Generated: 2015-10-30 08:21:49 -- Database: `phpmixbill`
-- Current PHP version: 5.6.11
-- Host: localhost
-- Database:biling
-- --------------------------------------------------------
-- Structure for 'tbl_appconfig'
-- --
-- --------------------------------------------------------
--
-- Struktur dari tabel `tbl_appconfig`
--
DROP TABLE IF EXISTS `tbl_appconfig`;
CREATE TABLE `tbl_appconfig` ( CREATE TABLE `tbl_appconfig` (
`id` int(11) NOT NULL AUTO_INCREMENT, `id` int(11) NOT NULL,
`setting` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `setting` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`value` text CHARACTER SET utf8 COLLATE utf8_unicode_ci, `value` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;
-- -------------------------------------------------------- --
-- Dump Data for `tbl_appconfig` -- Dumping data untuk tabel `tbl_appconfig`
-- --
INSERT INTO tbl_appconfig (`id`,`setting`,`value`) VALUES ("1","CompanyName","PHPMixBill"); INSERT INTO `tbl_appconfig` (`id`, `setting`, `value`) VALUES
INSERT INTO tbl_appconfig (`id`,`setting`,`value`) VALUES ("2","theme","default"); (1, 'CompanyName', 'PHPMixBill'),
INSERT INTO tbl_appconfig (`id`,`setting`,`value`) VALUES ("3","currency_code","Rp."); (2, 'theme', 'default'),
INSERT INTO tbl_appconfig (`id`,`setting`,`value`) VALUES ("4","language","english"); (3, 'currency_code', 'Rp.'),
INSERT INTO tbl_appconfig (`id`,`setting`,`value`) VALUES ("5","show-logo","1"); (4, 'language', 'english'),
INSERT INTO tbl_appconfig (`id`,`setting`,`value`) VALUES ("6","nstyle","blue"); (5, 'show-logo', '1'),
INSERT INTO tbl_appconfig (`id`,`setting`,`value`) VALUES ("7","timezone","Asia/Jakarta"); (6, 'nstyle', 'blue'),
INSERT INTO tbl_appconfig (`id`,`setting`,`value`) VALUES ("8","dec_point",","); (7, 'timezone', 'Asia/Jakarta'),
INSERT INTO tbl_appconfig (`id`,`setting`,`value`) VALUES ("9","thousands_sep","."); (8, 'dec_point', ','),
INSERT INTO tbl_appconfig (`id`,`setting`,`value`) VALUES ("10","rtl","0"); (9, 'thousands_sep', '.'),
INSERT INTO tbl_appconfig (`id`,`setting`,`value`) VALUES ("11","address",""); (10, 'rtl', '0'),
INSERT INTO tbl_appconfig (`id`,`setting`,`value`) VALUES ("12","phone",""); (11, 'address', ''),
INSERT INTO tbl_appconfig (`id`,`setting`,`value`) VALUES ("13","date_format","d M Y"); (12, 'phone', ''),
INSERT INTO tbl_appconfig (`id`,`setting`,`value`) VALUES ("14","note","Thank you..."); (13, 'date_format', 'd M Y'),
(14, 'note', 'Thank you...');
-- -------------------------------------------------------- -- --------------------------------------------------------
-- Structure for 'tbl_bandwidth'
--
-- Struktur dari tabel `tbl_bandwidth`
-- --
DROP TABLE IF EXISTS `tbl_bandwidth`;
CREATE TABLE `tbl_bandwidth` ( CREATE TABLE `tbl_bandwidth` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, `id` int(10) UNSIGNED NOT NULL,
`name_bw` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `name_bw` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`rate_down` int(10) unsigned NOT NULL, `rate_down` int(10) UNSIGNED NOT NULL,
`rate_down_unit` enum('Kbps','Mbps') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `rate_down_unit` enum('Kbps','Mbps') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`rate_up` int(10) unsigned NOT NULL, `rate_up` int(10) UNSIGNED NOT NULL,
`rate_up_unit` enum('Kbps','Mbps') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `rate_up_unit` enum('Kbps','Mbps') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL
PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- -------------------------------------------------------- -- --------------------------------------------------------
-- Structure for 'tbl_customers'
--
-- Struktur dari tabel `tbl_customers`
-- --
DROP TABLE IF EXISTS `tbl_customers`;
CREATE TABLE `tbl_customers` ( CREATE TABLE `tbl_customers` (
`id` int(10) NOT NULL AUTO_INCREMENT, `id` int(10) NOT NULL,
`username` varchar(45) CHARACTER SET latin1 NOT NULL, `username` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`password` varchar(45) CHARACTER SET latin1 NOT NULL, `password` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`fullname` varchar(45) CHARACTER SET latin1 NOT NULL, `fullname` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`address` text CHARACTER SET latin1, `address` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci,
`phonenumber` varchar(20) CHARACTER SET latin1 DEFAULT '0', `phonenumber` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`last_login` datetime DEFAULT NULL, `last_login` datetime DEFAULT NULL
PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- -------------------------------------------------------- -- --------------------------------------------------------
-- Structure for 'tbl_language'
--
-- Struktur dari tabel `tbl_language`
-- --
DROP TABLE IF EXISTS `tbl_language`;
CREATE TABLE `tbl_language` ( CREATE TABLE `tbl_language` (
`id` int(10) NOT NULL AUTO_INCREMENT, `id` int(10) NOT NULL,
`name` varchar(32) NOT NULL, `name` varchar(32) COLLATE utf8mb4_general_ci NOT NULL,
`folder` varchar(32) NOT NULL, `folder` varchar(32) COLLATE utf8mb4_general_ci NOT NULL,
`author` varchar(60) DEFAULT NULL, `author` varchar(60) COLLATE utf8mb4_general_ci DEFAULT NULL
PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
-- -------------------------------------------------------- --
-- Dump Data for `tbl_language` -- Dumping data untuk tabel `tbl_language`
-- --
INSERT INTO tbl_language (`id`,`name`,`folder`,`author`) VALUES ("1","Indonesia","indonesia","Ismail Marzuqi"); INSERT INTO `tbl_language` (`id`, `name`, `folder`, `author`) VALUES
INSERT INTO tbl_language (`id`,`name`,`folder`,`author`) VALUES ("2","English","english","Ismail Marzuqi"); (1, 'Indonesia', 'indonesia', 'Ismail Marzuqi'),
INSERT INTO tbl_language (`id`,`name`,`folder`,`author`) VALUES ("4","Türkçe","turkish","Goktug Bogac Ogel"); (2, 'English', 'english', 'Ismail Marzuqi'),
(4, 'Türkçe', 'turkish', 'Goktug Bogac Ogel');
-- -------------------------------------------------------- -- --------------------------------------------------------
-- Structure for 'tbl_logs'
--
-- Struktur dari tabel `tbl_logs`
-- --
DROP TABLE IF EXISTS `tbl_logs`;
CREATE TABLE `tbl_logs` ( CREATE TABLE `tbl_logs` (
`id` int(10) NOT NULL AUTO_INCREMENT, `id` int(10) NOT NULL,
`date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `date` datetime DEFAULT NULL,
`type` varchar(50) NOT NULL, `type` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
`description` text NOT NULL, `description` mediumtext COLLATE utf8mb4_general_ci NOT NULL,
`userid` int(10) NOT NULL, `userid` int(10) NOT NULL,
`ip` text NOT NULL, `ip` mediumtext COLLATE utf8mb4_general_ci NOT NULL
PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- -------------------------------------------------------- -- --------------------------------------------------------
-- Structure for 'tbl_message'
--
-- Struktur dari tabel `tbl_message`
-- --
DROP TABLE IF EXISTS `tbl_message`;
CREATE TABLE `tbl_message` ( CREATE TABLE `tbl_message` (
`id` int(10) NOT NULL AUTO_INCREMENT, `id` int(10) NOT NULL,
`from_user` varchar(32) CHARACTER SET latin1 NOT NULL, `from_user` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`to_user` varchar(32) CHARACTER SET latin1 NOT NULL, `to_user` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`title` varchar(60) CHARACTER SET latin1 NOT NULL, `title` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`message` text CHARACTER SET latin1 NOT NULL, `message` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`status` enum('0','1') CHARACTER SET latin1 NOT NULL DEFAULT '0', `status` enum('0','1') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0',
`date` datetime NOT NULL, `date` datetime NOT NULL
PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- -------------------------------------------------------- -- --------------------------------------------------------
-- Structure for 'tbl_plans'
--
-- Struktur dari tabel `tbl_plans`
-- --
DROP TABLE IF EXISTS `tbl_plans`;
CREATE TABLE `tbl_plans` ( CREATE TABLE `tbl_plans` (
`id` int(10) NOT NULL AUTO_INCREMENT, `id` int(10) NOT NULL,
`name_plan` varchar(40) CHARACTER SET latin1 NOT NULL, `name_plan` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`id_bw` int(10) NOT NULL, `id_bw` int(10) NOT NULL,
`price` varchar(40) CHARACTER SET latin1 NOT NULL, `price` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`type` enum('Hotspot','PPPOE') CHARACTER SET latin1 NOT NULL, `type` enum('Hotspot','PPPOE') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`typebp` enum('Unlimited','Limited') CHARACTER SET latin1 DEFAULT NULL, `typebp` enum('Unlimited','Limited') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`limit_type` enum('Time_Limit','Data_Limit','Both_Limit') CHARACTER SET latin1 DEFAULT NULL, `limit_type` enum('Time_Limit','Data_Limit','Both_Limit') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`time_limit` int(10) unsigned DEFAULT NULL, `time_limit` int(10) UNSIGNED DEFAULT NULL,
`time_unit` enum('Mins','Hrs') CHARACTER SET latin1 DEFAULT NULL, `time_unit` enum('Mins','Hrs') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`data_limit` int(10) unsigned DEFAULT NULL, `data_limit` int(10) UNSIGNED DEFAULT NULL,
`data_unit` enum('MB','GB') CHARACTER SET latin1 DEFAULT NULL, `data_unit` enum('MB','GB') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`validity` int(10) NOT NULL, `validity` int(10) NOT NULL,
`validity_unit` enum('Days','Months') CHARACTER SET latin1 NOT NULL, `validity_unit` enum('Days','Months') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`shared_users` int(10) DEFAULT NULL, `shared_users` int(10) DEFAULT NULL,
`routers` varchar(32) CHARACTER SET latin1 NOT NULL, `routers` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`pool` varchar(40) CHARACTER SET latin1 DEFAULT NULL, `pool` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL
PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- -------------------------------------------------------- -- --------------------------------------------------------
-- Structure for 'tbl_pool'
--
-- Struktur dari tabel `tbl_pool`
-- --
DROP TABLE IF EXISTS `tbl_pool`;
CREATE TABLE `tbl_pool` ( CREATE TABLE `tbl_pool` (
`id` int(10) NOT NULL AUTO_INCREMENT, `id` int(10) NOT NULL,
`pool_name` varchar(40) NOT NULL, `pool_name` varchar(40) COLLATE utf8mb4_general_ci NOT NULL,
`range_ip` varchar(40) NOT NULL, `range_ip` varchar(40) COLLATE utf8mb4_general_ci NOT NULL,
`routers` varchar(40) NOT NULL, `routers` varchar(40) COLLATE utf8mb4_general_ci NOT NULL
PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- -------------------------------------------------------- -- --------------------------------------------------------
-- Structure for 'tbl_routers'
--
-- Struktur dari tabel `tbl_routers`
-- --
DROP TABLE IF EXISTS `tbl_routers`;
CREATE TABLE `tbl_routers` ( CREATE TABLE `tbl_routers` (
`id` int(10) NOT NULL AUTO_INCREMENT, `id` int(10) NOT NULL,
`name` varchar(32) CHARACTER SET latin1 NOT NULL, `name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`ip_address` varchar(128) CHARACTER SET latin1 NOT NULL, `ip_address` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`username` varchar(50) CHARACTER SET latin1 NOT NULL, `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`password` varchar(60) CHARACTER SET latin1 NOT NULL, `password` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`description` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `description` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL
PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- -------------------------------------------------------- -- --------------------------------------------------------
-- Structure for 'tbl_transactions'
--
-- Struktur dari tabel `tbl_transactions`
-- --
DROP TABLE IF EXISTS `tbl_transactions`;
CREATE TABLE `tbl_transactions` ( CREATE TABLE `tbl_transactions` (
`id` int(10) NOT NULL AUTO_INCREMENT, `id` int(10) NOT NULL,
`invoice` varchar(25) NOT NULL, `invoice` varchar(25) COLLATE utf8mb4_general_ci NOT NULL,
`username` varchar(32) NOT NULL, `username` varchar(32) COLLATE utf8mb4_general_ci NOT NULL,
`plan_name` varchar(40) NOT NULL, `plan_name` varchar(40) COLLATE utf8mb4_general_ci NOT NULL,
`price` varchar(40) NOT NULL, `price` varchar(40) COLLATE utf8mb4_general_ci NOT NULL,
`recharged_on` date NOT NULL, `recharged_on` date NOT NULL,
`expiration` date NOT NULL, `expiration` date NOT NULL,
`time` time NOT NULL, `time` time NOT NULL,
`method` enum('voucher','admin') NOT NULL, `method` enum('voucher','admin') COLLATE utf8mb4_general_ci NOT NULL,
`routers` varchar(32) NOT NULL, `routers` varchar(32) COLLATE utf8mb4_general_ci NOT NULL,
`type` enum('Hotspot','PPPOE') NOT NULL, `type` enum('Hotspot','PPPOE') COLLATE utf8mb4_general_ci NOT NULL
PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- -------------------------------------------------------- -- --------------------------------------------------------
-- Structure for 'tbl_user_recharges'
-- --
-- Struktur dari tabel `tbl_users`
CREATE TABLE `tbl_user_recharges` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`customer_id` int(10) NOT NULL,
`username` varchar(32) CHARACTER SET latin1 NOT NULL,
`plan_id` int(10) NOT NULL,
`namebp` varchar(40) CHARACTER SET latin1 NOT NULL,
`recharged_on` date NOT NULL,
`expiration` date NOT NULL,
`time` time NOT NULL,
`status` varchar(20) CHARACTER SET latin1 NOT NULL,
`method` enum('voucher','admin') CHARACTER SET latin1 NOT NULL,
`routers` varchar(32) CHARACTER SET latin1 NOT NULL,
`type` varchar(15) CHARACTER SET latin1 NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
-- Structure for 'tbl_users'
-- --
DROP TABLE IF EXISTS `tbl_users`;
CREATE TABLE `tbl_users` ( CREATE TABLE `tbl_users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, `id` int(10) UNSIGNED NOT NULL,
`username` varchar(45) CHARACTER SET latin1 NOT NULL DEFAULT '', `username` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
`fullname` varchar(45) CHARACTER SET latin1 NOT NULL DEFAULT '', `fullname` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
`password` text CHARACTER SET latin1 NOT NULL, `password` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`user_type` enum('Admin','Sales') CHARACTER SET latin1 NOT NULL, `user_type` enum('Admin','Sales') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`status` enum('Active','Inactive') CHARACTER SET latin1 NOT NULL DEFAULT 'Active', `status` enum('Active','Inactive') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'Active',
`last_login` datetime DEFAULT NULL, `last_login` datetime DEFAULT NULL,
`creationdate` datetime NOT NULL, `creationdate` datetime NOT NULL
PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
-- -------------------------------------------------------- --
-- Dump Data for `tbl_users` -- Dumping data untuk tabel `tbl_users`
-- --
INSERT INTO tbl_users (`id`,`username`,`fullname`,`password`,`user_type`,`status`,`last_login`,`creationdate`) VALUES ("1","admin","Administrator","$1$W44.ns/.$MUnR0NeBH9xAcXm0Oku2h1","Admin","Active","2015-10-30 18:27:02","2014-06-23 01:43:07"); INSERT INTO `tbl_users` (`id`, `username`, `fullname`, `password`, `user_type`, `status`, `last_login`, `creationdate`) VALUES
(1, 'admin', 'Administrator', '$1$W44.ns/.$MUnR0NeBH9xAcXm0Oku2h1', 'Admin', 'Active', '2015-10-30 18:27:02', '2014-06-23 01:43:07');
-- -------------------------------------------------------- -- --------------------------------------------------------
-- Structure for 'tbl_voucher'
--
-- Struktur dari tabel `tbl_user_recharges`
-- --
DROP TABLE IF EXISTS `tbl_user_recharges`;
CREATE TABLE `tbl_user_recharges` (
`id` int(10) NOT NULL,
`customer_id` int(10) NOT NULL,
`username` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`plan_id` int(10) NOT NULL,
`namebp` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`recharged_on` date NOT NULL,
`expiration` date NOT NULL,
`time` time NOT NULL,
`status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`method` enum('voucher','admin') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`routers` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`type` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-- --------------------------------------------------------
--
-- Struktur dari tabel `tbl_voucher`
--
DROP TABLE IF EXISTS `tbl_voucher`;
CREATE TABLE `tbl_voucher` ( CREATE TABLE `tbl_voucher` (
`id` int(10) NOT NULL AUTO_INCREMENT, `id` int(10) NOT NULL,
`type` enum('Hotspot','PPPOE') CHARACTER SET latin1 NOT NULL, `type` enum('Hotspot','PPPOE') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`routers` varchar(32) CHARACTER SET latin1 NOT NULL, `routers` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`id_plan` int(10) NOT NULL, `id_plan` int(10) NOT NULL,
`code` varchar(55) CHARACTER SET latin1 NOT NULL, `code` varchar(55) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`user` varchar(45) CHARACTER SET latin1 NOT NULL, `user` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`status` varchar(25) CHARACTER SET latin1 NOT NULL, `status` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL
PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Indexes for dumped tables
--
--
-- Indeks untuk tabel `tbl_appconfig`
--
ALTER TABLE `tbl_appconfig`
ADD PRIMARY KEY (`id`);
--
-- Indeks untuk tabel `tbl_bandwidth`
--
ALTER TABLE `tbl_bandwidth`
ADD PRIMARY KEY (`id`);
--
-- Indeks untuk tabel `tbl_customers`
--
ALTER TABLE `tbl_customers`
ADD PRIMARY KEY (`id`);
--
-- Indeks untuk tabel `tbl_language`
--
ALTER TABLE `tbl_language`
ADD PRIMARY KEY (`id`);
--
-- Indeks untuk tabel `tbl_logs`
--
ALTER TABLE `tbl_logs`
ADD PRIMARY KEY (`id`);
--
-- Indeks untuk tabel `tbl_message`
--
ALTER TABLE `tbl_message`
ADD PRIMARY KEY (`id`);
--
-- Indeks untuk tabel `tbl_plans`
--
ALTER TABLE `tbl_plans`
ADD PRIMARY KEY (`id`);
--
-- Indeks untuk tabel `tbl_pool`
--
ALTER TABLE `tbl_pool`
ADD PRIMARY KEY (`id`);
--
-- Indeks untuk tabel `tbl_routers`
--
ALTER TABLE `tbl_routers`
ADD PRIMARY KEY (`id`);
--
-- Indeks untuk tabel `tbl_transactions`
--
ALTER TABLE `tbl_transactions`
ADD PRIMARY KEY (`id`);
--
-- Indeks untuk tabel `tbl_users`
--
ALTER TABLE `tbl_users`
ADD PRIMARY KEY (`id`);
--
-- Indeks untuk tabel `tbl_user_recharges`
--
ALTER TABLE `tbl_user_recharges`
ADD PRIMARY KEY (`id`);
--
-- Indeks untuk tabel `tbl_voucher`
--
ALTER TABLE `tbl_voucher`
ADD PRIMARY KEY (`id`);
--
-- AUTO_INCREMENT untuk tabel yang dibuang
--
--
-- AUTO_INCREMENT untuk tabel `tbl_appconfig`
--
ALTER TABLE `tbl_appconfig`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=15;
--
-- AUTO_INCREMENT untuk tabel `tbl_bandwidth`
--
ALTER TABLE `tbl_bandwidth`
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT untuk tabel `tbl_customers`
--
ALTER TABLE `tbl_customers`
MODIFY `id` int(10) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT untuk tabel `tbl_language`
--
ALTER TABLE `tbl_language`
MODIFY `id` int(10) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;
--
-- AUTO_INCREMENT untuk tabel `tbl_logs`
--
ALTER TABLE `tbl_logs`
MODIFY `id` int(10) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT untuk tabel `tbl_message`
--
ALTER TABLE `tbl_message`
MODIFY `id` int(10) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT untuk tabel `tbl_plans`
--
ALTER TABLE `tbl_plans`
MODIFY `id` int(10) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT untuk tabel `tbl_pool`
--
ALTER TABLE `tbl_pool`
MODIFY `id` int(10) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT untuk tabel `tbl_routers`
--
ALTER TABLE `tbl_routers`
MODIFY `id` int(10) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT untuk tabel `tbl_transactions`
--
ALTER TABLE `tbl_transactions`
MODIFY `id` int(10) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT untuk tabel `tbl_users`
--
ALTER TABLE `tbl_users`
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
--
-- AUTO_INCREMENT untuk tabel `tbl_user_recharges`
--
ALTER TABLE `tbl_user_recharges`
MODIFY `id` int(10) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT untuk tabel `tbl_voucher`
--
ALTER TABLE `tbl_voucher`
MODIFY `id` int(10) NOT NULL AUTO_INCREMENT;
COMMIT;

View file

@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<title>PHPMixBill v5.0 Installer</title> <title>PHPMixBill Installer</title>
<link rel="shortcut icon" type="image/x-icon" href="img/favicon.ico"> <link rel="shortcut icon" type="image/x-icon" href="img/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
@ -22,16 +22,16 @@
</div> </div>
<div class="span12"> <div class="span12">
<h4> PHPMixBill v5.0 Installer </h4> <h4> PHPMixBill Installer </h4>
<?php <?php
$passed = ''; $passed = '';
$ltext = ''; $ltext = '';
if (version_compare(PHP_VERSION, '5.2.0') >= 0) { if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
$ltext .= 'To Run PHPMixBill v5.0 You need at least PHP version 5.2.0, Your PHP Version is: ' . PHP_VERSION . " Tested <strong>---PASSED---</strong><br/>"; $ltext .= 'To Run PHPMixBill You need at least PHP version 5.2.0, Your PHP Version is: ' . PHP_VERSION . " Tested <strong>---PASSED---</strong><br/>";
$passed .= '1'; $passed .= '1';
} else { } else {
$ltext .= 'To Run PHPMixBill v5.0 You need at least PHP version 5.2.0, Your PHP Version is: ' . PHP_VERSION . " Tested <strong>---FAILED---</strong><br/>"; $ltext .= 'To Run PHPMixBill You need at least PHP version 5.2.0, Your PHP Version is: ' . PHP_VERSION . " Tested <strong>---FAILED---</strong><br/>";
$passed .= '0'; $passed .= '0';
} }
@ -57,7 +57,7 @@
<br><br> <br><br>
<a href=\"step3.php\" class=\"btn btn-primary\">Continue</a>"); <a href=\"step3.php\" class=\"btn btn-primary\">Continue</a>");
} else { } else {
echo("<br/> $ltext <br/> Sorry. The requirements of PHPMixBill v5.0 is not available on your server. echo("<br/> $ltext <br/> Sorry. The requirements of PHPMixBill is not available on your server.
Please contact with us- iesien22@yahoo.com with this code- $passed Or contact with your server administrator Please contact with us- iesien22@yahoo.com with this code- $passed Or contact with your server administrator
<br><br> <br><br>
<a href=\"#\" class=\"btn btn-primary disabled\">Correct The Problem To Continue</a>"); <a href=\"#\" class=\"btn btn-primary disabled\">Correct The Problem To Continue</a>");
@ -65,7 +65,7 @@
?> ?>
</div> </div>
</div> </div>
<div class="footer">Copyright &copy; 2015 PHPMixBill. All Rights Reserved<br/><br/></div> <div class="footer">Copyright &copy; 2021 PHPMixBill. All Rights Reserved<br/><br/></div>
</body> </body>
</html> </html>

View file

@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<title>PHPMixBill v5.0 Installer</title> <title>PHPMixBill Installer</title>
<link rel="shortcut icon" type="image/x-icon" href="img/favicon.ico"> <link rel="shortcut icon" type="image/x-icon" href="img/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
@ -22,7 +22,7 @@
</div> </div>
<div class="span12"> <div class="span12">
<h4> PHPMixBill v5.0 Installer </h4> <h4> PHPMixBill Installer </h4>
<?php <?php
if (isset($_GET['_error']) && ($_GET['_error']) == '1') { if (isset($_GET['_error']) && ($_GET['_error']) == '1') {
echo '<h4 style="color: red;"> Unable to Connect Database, Please make sure database info is correct and try again ! </h4>'; echo '<h4 style="color: red;"> Unable to Connect Database, Please make sure database info is correct and try again ! </h4>';
@ -66,7 +66,7 @@
</form> </form>
</div> </div>
</div> </div>
<div class="footer">Copyright &copy; 2015 PHPMixBill. All Rights Reserved<br/><br/></div> <div class="footer">Copyright &copy; 2021 PHPMixBill. All Rights Reserved<br/><br/></div>
</body> </body>
</html> </html>

View file

@ -53,7 +53,7 @@ if ($cn == '1') {
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<title>PHPMixBill v5.0 Installer</title> <title>PHPMixBill Installer</title>
<link rel="shortcut icon" type="image/x-icon" href="img/favicon.ico"> <link rel="shortcut icon" type="image/x-icon" href="img/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
@ -74,7 +74,7 @@ if ($cn == '1') {
</div> </div>
<div class="span12"> <div class="span12">
<h4> PHPMixBill v5.0 Installer </h4> <h4> PHPMixBill Installer </h4>
<?php <?php
if ($cn == '1') { if ($cn == '1') {
?> ?>
@ -101,7 +101,7 @@ if ($cn == '1') {
</div> </div>
</div> </div>
<div class="footer">Copyright &copy; 2015 PHPMixBill. All Rights Reserved<br/><br/></div> <div class="footer">Copyright &copy; 2021 PHPMixBill. All Rights Reserved<br/><br/></div>
</body> </body>
</html> </html>

View file

@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<title>PHPMixBill v5.0 Installer</title> <title>PHPMixBill Installer</title>
<link rel="shortcut icon" type="image/x-icon" href="img/favicon.ico"> <link rel="shortcut icon" type="image/x-icon" href="img/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
@ -22,10 +22,10 @@
</div> </div>
<div class="span12"> <div class="span12">
<h4> PHPMixBill v5.0 Installer </h4> <h4> PHPMixBill Installer </h4>
<p> <p>
<strong>Congratulations!</strong><br> <strong>Congratulations!</strong><br>
You have just install PHPMixBill v5.0!<br> You have just install PHPMixBill !<br>
To Login Admin Portal:<br> To Login Admin Portal:<br>
Use this link - Use this link -
<?php <?php
@ -41,6 +41,6 @@
</p> </p>
</div> </div>
</div> </div>
<div class="footer">Copyright &copy; 2015 PHPMixBill. All Rights Reserved<br/><br/></div> <div class="footer">Copyright &copy; 2021 PHPMixBill. All Rights Reserved<br/><br/></div>
</body> </body>
</html> </html>

View file

@ -762,7 +762,7 @@ Column sums
----------- -----------
(Also changed some preg_replace to str_replace to improve performance) (Also changed some preg_replace to str_replace to improve performance)
To use: just add {colsum} to any cells of the table footer <tfoot> To use: just add {colsum} to any cells of the table footer <tfoot>
Add a number to specify a fixed number of decimal points e.g. <td>£{colsum2}</td> will give you £123.40 Add a number to specify a fixed number of decimal points e.g. <td><EFBFBD>{colsum2}</td> will give you <20>123.40
The width of the column will be calculated using the actual string {colsum} as a placeholder. The width of the column will be calculated using the actual string {colsum} as a placeholder.
If you need the column to be wider, use underscores "_" to pad it e.g. {colsum2_____} If you need the column to be wider, use underscores "_" to pad it e.g. {colsum2_____}
@ -1064,7 +1064,7 @@ New set of Indic fonts for PostScript compatibilty - and clearer font display
=========================== ===========================
mPDF v5.1 (27/02/2011) mPDF (27/02/2011)
=========================== ===========================
New Features New Features
@ -2920,7 +2920,7 @@ function AddExtGState() edited to check if graphics state already exists before
ASCII-proof code ASCII-proof code
================ ================
"»¤¬" used as a special identifier in the program changed to "\xbb\xa4\xac" to make the mpdf.php script file immune from someone saving it as a utf-8 encoded file "<EFBFBD><EFBFBD><EFBFBD>" used as a special identifier in the program changed to "\xbb\xa4\xac" to make the mpdf.php script file immune from someone saving it as a utf-8 encoded file
Images Images
====== ======

View file

@ -0,0 +1,110 @@
<?php
/**
* Smarty Autoloader
*
* @package Smarty
*/
/**
* Smarty Autoloader
*
* @package Smarty
* @author Uwe Tews
* Usage:
* require_once '...path/Autoloader.php';
* Smarty_Autoloader::register();
* or
* include '...path/bootstrap.php';
*
* $smarty = new Smarty();
*/
class Smarty_Autoloader
{
/**
* Filepath to Smarty root
*
* @var string
*/
public static $SMARTY_DIR = null;
/**
* Filepath to Smarty internal plugins
*
* @var string
*/
public static $SMARTY_SYSPLUGINS_DIR = null;
/**
* Array with Smarty core classes and their filename
*
* @var array
*/
public static $rootClasses = array('smarty' => 'Smarty.class.php', 'smartybc' => 'SmartyBC.class.php',);
/**
* Registers Smarty_Autoloader backward compatible to older installations.
*
* @param bool $prepend Whether to prepend the autoloader or not.
*/
public static function registerBC($prepend = false)
{
/**
* register the class autoloader
*/
if (!defined('SMARTY_SPL_AUTOLOAD')) {
define('SMARTY_SPL_AUTOLOAD', 0);
}
if (SMARTY_SPL_AUTOLOAD
&& set_include_path(get_include_path() . PATH_SEPARATOR . SMARTY_SYSPLUGINS_DIR) !== false
) {
$registeredAutoLoadFunctions = spl_autoload_functions();
if (!isset($registeredAutoLoadFunctions[ 'spl_autoload' ])) {
spl_autoload_register();
}
} else {
self::register($prepend);
}
}
/**
* Registers Smarty_Autoloader as an SPL autoloader.
*
* @param bool $prepend Whether to prepend the autoloader or not.
*/
public static function register($prepend = false)
{
self::$SMARTY_DIR = defined('SMARTY_DIR') ? SMARTY_DIR : dirname(__FILE__) . DIRECTORY_SEPARATOR;
self::$SMARTY_SYSPLUGINS_DIR = defined('SMARTY_SYSPLUGINS_DIR') ? SMARTY_SYSPLUGINS_DIR :
self::$SMARTY_DIR . 'sysplugins' . DIRECTORY_SEPARATOR;
if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
spl_autoload_register(array(__CLASS__, 'autoload'), true, $prepend);
} else {
spl_autoload_register(array(__CLASS__, 'autoload'));
}
}
/**
* Handles auto loading of classes.
*
* @param string $class A class name.
*/
public static function autoload($class)
{
if ($class[ 0 ] !== 'S' || strpos($class, 'Smarty') !== 0) {
return;
}
$_class = strtolower($class);
if (isset(self::$rootClasses[ $_class ])) {
$file = self::$SMARTY_DIR . self::$rootClasses[ $_class ];
if (is_file($file)) {
include $file;
}
} else {
$file = self::$SMARTY_SYSPLUGINS_DIR . $_class . '.php';
if (is_file($file)) {
include $file;
}
}
return;
}
}

File diff suppressed because it is too large Load diff

View file

@ -1,460 +1,477 @@
<?php <?php
/** /**
* Project: Smarty: the PHP compiling template engine * Project: Smarty: the PHP compiling template engine
* File: SmartyBC.class.php * File: SmartyBC.class.php
* SVN: $Id: $ * SVN: $Id: $
* * This library is free software; you can redistribute it and/or
* This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public
* modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either
* License as published by the Free Software Foundation; either * version 3.0 of the License, or (at your option) any later version.
* 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
* This library is distributed in the hope that it will be useful, * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* but WITHOUT ANY WARRANTY; without even the implied warranty of * Lesser General Public License for more details.
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * You should have received a copy of the GNU Lesser General Public
* Lesser General Public License for more details. * License along with this library; if not, write to the Free Software
* * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* You should have received a copy of the GNU Lesser General Public * For questions, help, comments, discussion, etc., please join the
* License along with this library; if not, write to the Free Software * Smarty mailing list. Send a blank e-mail to
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * smarty-discussion-subscribe@googlegroups.com
* *
* For questions, help, comments, discussion, etc., please join the * @link http://www.smarty.net/
* Smarty mailing list. Send a blank e-mail to * @copyright 2008 New Digital Group, Inc.
* smarty-discussion-subscribe@googlegroups.com * @author Monte Ohrt <monte at ohrt dot com>
* * @author Uwe Tews
* @link http://www.smarty.net/ * @author Rodney Rehm
* @copyright 2008 New Digital Group, Inc. * @package Smarty
* @author Monte Ohrt <monte at ohrt dot com> */
* @author Uwe Tews /**
* @author Rodney Rehm * @ignore
* @package Smarty */
*/ require_once dirname(__FILE__) . '/Smarty.class.php';
/**
* @ignore /**
*/ * Smarty Backward Compatibility Wrapper Class
require(dirname(__FILE__) . '/Smarty.class.php'); *
* @package Smarty
/** */
* Smarty Backward Compatability Wrapper Class class SmartyBC extends Smarty
* {
* @package Smarty /**
*/ * Smarty 2 BC
class SmartyBC extends Smarty { *
* @var string
/** */
* Smarty 2 BC public $_version = self::SMARTY_VERSION;
* @var string
*/ /**
public $_version = self::SMARTY_VERSION; * This is an array of directories where trusted php scripts reside.
*
/** * @var array
* Initialize new SmartyBC object */
* public $trusted_dir = array();
* @param array $options options to set during initialization, e.g. array( 'forceCompile' => false )
*/ /**
public function __construct(array $options=array()) * Initialize new SmartyBC object
{ */
parent::__construct($options); public function __construct()
// register {php} tag {
$this->registerPlugin('block', 'php', 'smarty_php_tag'); parent::__construct();
} }
/** /**
* wrapper for assign_by_ref * wrapper for assign_by_ref
* *
* @param string $tpl_var the template variable name * @param string $tpl_var the template variable name
* @param mixed &$value the referenced value to assign * @param mixed &$value the referenced value to assign
*/ */
public function assign_by_ref($tpl_var, &$value) public function assign_by_ref($tpl_var, &$value)
{ {
$this->assignByRef($tpl_var, $value); $this->assignByRef($tpl_var, $value);
} }
/** /**
* wrapper for append_by_ref * wrapper for append_by_ref
* *
* @param string $tpl_var the template variable name * @param string $tpl_var the template variable name
* @param mixed &$value the referenced value to append * @param mixed &$value the referenced value to append
* @param boolean $merge flag if array elements shall be merged * @param boolean $merge flag if array elements shall be merged
*/ */
public function append_by_ref($tpl_var, &$value, $merge = false) public function append_by_ref($tpl_var, &$value, $merge = false)
{ {
$this->appendByRef($tpl_var, $value, $merge); $this->appendByRef($tpl_var, $value, $merge);
} }
/** /**
* clear the given assigned template variable. * clear the given assigned template variable.
* *
* @param string $tpl_var the template variable to clear * @param string $tpl_var the template variable to clear
*/ */
public function clear_assign($tpl_var) public function clear_assign($tpl_var)
{ {
$this->clearAssign($tpl_var); $this->clearAssign($tpl_var);
} }
/** /**
* Registers custom function to be used in templates * Registers custom function to be used in templates
* *
* @param string $function the name of the template function * @param string $function the name of the template function
* @param string $function_impl the name of the PHP function to register * @param string $function_impl the name of the PHP function to register
* @param bool $cacheable * @param bool $cacheable
* @param mixed $cache_attrs * @param mixed $cache_attrs
*/ *
public function register_function($function, $function_impl, $cacheable=true, $cache_attrs=null) * @throws \SmartyException
{ */
$this->registerPlugin('function', $function, $function_impl, $cacheable, $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 * Unregister custom function
*/ *
public function unregister_function($function) * @param string $function name of template function
{ */
$this->unregisterPlugin('function', $function); public function unregister_function($function)
} {
$this->unregisterPlugin('function', $function);
/** }
* Registers object to be used in templates
* /**
* @param string $object name of template object * Registers object to be used in templates
* @param object $object_impl the referenced PHP object to register *
* @param array $allowed list of allowed methods (empty = all) * @param string $object name of template object
* @param boolean $smarty_args smarty argument format, else traditional * @param object $object_impl the referenced PHP object to register
* @param array $block_functs list of methods that are block format * @param array $allowed list of allowed methods (empty = all)
*/ * @param boolean $smarty_args smarty argument format, else traditional
public function register_object($object, $object_impl, $allowed = array(), $smarty_args = true, $block_methods = array()) * @param array $block_methods list of methods that are block format
{ *
settype($allowed, 'array'); * @throws SmartyException
settype($smarty_args, 'boolean'); * @internal param array $block_functs list of methods that are block format
$this->registerObject($object, $object_impl, $allowed, $smarty_args, $block_methods); */
} public function register_object(
$object,
/** $object_impl,
* Unregisters object $allowed = array(),
* $smarty_args = true,
* @param string $object name of template object $block_methods = array()
*/ ) {
public function unregister_object($object) settype($allowed, 'array');
{ settype($smarty_args, 'boolean');
$this->unregisterObject($object); $this->registerObject($object, $object_impl, $allowed, $smarty_args, $block_methods);
} }
/** /**
* Registers block function to be used in templates * Unregister object
* *
* @param string $block name of template block * @param string $object name of template object
* @param string $block_impl PHP function to register */
* @param bool $cacheable public function unregister_object($object)
* @param mixed $cache_attrs {
*/ $this->unregisterObject($object);
public function register_block($block, $block_impl, $cacheable=true, $cache_attrs=null) }
{
$this->registerPlugin('block', $block, $block_impl, $cacheable, $cache_attrs); /**
} * Registers block function to be used in templates
*
/** * @param string $block name of template block
* Unregisters block function * @param string $block_impl PHP function to register
* * @param bool $cacheable
* @param string $block name of template function * @param mixed $cache_attrs
*/ *
public function unregister_block($block) * @throws \SmartyException
{ */
$this->unregisterPlugin('block', $block); public function register_block($block, $block_impl, $cacheable = true, $cache_attrs = null)
} {
$this->registerPlugin('block', $block, $block_impl, $cacheable, $cache_attrs);
/** }
* Registers compiler function
* /**
* @param string $function name of template function * Unregister block function
* @param string $function_impl name of PHP function to register *
* @param bool $cacheable * @param string $block name of template function
*/ */
public function register_compiler_function($function, $function_impl, $cacheable=true) public function unregister_block($block)
{ {
$this->registerPlugin('compiler', $function, $function_impl, $cacheable); $this->unregisterPlugin('block', $block);
} }
/** /**
* Unregisters compiler function * Registers compiler function
* *
* @param string $function name of template function * @param string $function name of template function
*/ * @param string $function_impl name of PHP function to register
public function unregister_compiler_function($function) * @param bool $cacheable
{ *
$this->unregisterPlugin('compiler', $function); * @throws \SmartyException
} */
public function register_compiler_function($function, $function_impl, $cacheable = true)
/** {
* Registers modifier to be used in templates $this->registerPlugin('compiler', $function, $function_impl, $cacheable);
* }
* @param string $modifier name of template modifier
* @param string $modifier_impl name of PHP function to register /**
*/ * Unregister compiler function
public function register_modifier($modifier, $modifier_impl) *
{ * @param string $function name of template function
$this->registerPlugin('modifier', $modifier, $modifier_impl); */
} public function unregister_compiler_function($function)
{
/** $this->unregisterPlugin('compiler', $function);
* Unregisters modifier }
*
* @param string $modifier name of template modifier /**
*/ * Registers modifier to be used in templates
public function unregister_modifier($modifier) *
{ * @param string $modifier name of template modifier
$this->unregisterPlugin('modifier', $modifier); * @param string $modifier_impl name of PHP function to register
} *
* @throws \SmartyException
/** */
* Registers a resource to fetch a template public function register_modifier($modifier, $modifier_impl)
* {
* @param string $type name of resource $this->registerPlugin('modifier', $modifier, $modifier_impl);
* @param array $functions array of functions to handle resource }
*/
public function register_resource($type, $functions) /**
{ * Unregister modifier
$this->registerResource($type, $functions); *
} * @param string $modifier name of template modifier
*/
/** public function unregister_modifier($modifier)
* Unregisters a resource {
* $this->unregisterPlugin('modifier', $modifier);
* @param string $type name of resource }
*/
public function unregister_resource($type) /**
{ * Registers a resource to fetch a template
$this->unregisterResource($type); *
} * @param string $type name of resource
* @param array $functions array of functions to handle resource
/** */
* Registers a prefilter function to apply public function register_resource($type, $functions)
* to a template before compiling {
* $this->registerResource($type, $functions);
* @param callable $function }
*/
public function register_prefilter($function) /**
{ * Unregister a resource
$this->registerFilter('pre', $function); *
} * @param string $type name of resource
*/
/** public function unregister_resource($type)
* Unregisters a prefilter function {
* $this->unregisterResource($type);
* @param callable $function }
*/
public function unregister_prefilter($function) /**
{ * Registers a prefilter function to apply
$this->unregisterFilter('pre', $function); * to a template before compiling
} *
* @param callable $function
/** *
* Registers a postfilter function to apply * @throws \SmartyException
* to a compiled template after compilation */
* public function register_prefilter($function)
* @param callable $function {
*/ $this->registerFilter('pre', $function);
public function register_postfilter($function) }
{
$this->registerFilter('post', $function); /**
} * Unregister a prefilter function
*
/** * @param callable $function
* Unregisters a postfilter function */
* public function unregister_prefilter($function)
* @param callable $function {
*/ $this->unregisterFilter('pre', $function);
public function unregister_postfilter($function) }
{
$this->unregisterFilter('post', $function); /**
} * Registers a postfilter function to apply
* to a compiled template after compilation
/** *
* Registers an output filter function to apply * @param callable $function
* to a template output *
* * @throws \SmartyException
* @param callable $function */
*/ public function register_postfilter($function)
public function register_outputfilter($function) {
{ $this->registerFilter('post', $function);
$this->registerFilter('output', $function); }
}
/**
/** * Unregister a postfilter function
* Unregisters an outputfilter function *
* * @param callable $function
* @param callable $function */
*/ public function unregister_postfilter($function)
public function unregister_outputfilter($function) {
{ $this->unregisterFilter('post', $function);
$this->unregisterFilter('output', $function); }
}
/**
/** * Registers an output filter function to apply
* load a filter of specified type and name * to a template output
* *
* @param string $type filter type * @param callable $function
* @param string $name filter name *
*/ * @throws \SmartyException
public function load_filter($type, $name) */
{ public function register_outputfilter($function)
$this->loadFilter($type, $name); {
} $this->registerFilter('output', $function);
}
/**
* clear cached content for the given template and cache id /**
* * Unregister an outputfilter function
* @param string $tpl_file name of template file *
* @param string $cache_id name of cache_id * @param callable $function
* @param string $compile_id name of compile_id */
* @param string $exp_time expiration time public function unregister_outputfilter($function)
* @return boolean {
*/ $this->unregisterFilter('output', $function);
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); /**
} * load a filter of specified type and name
*
/** * @param string $type filter type
* clear the entire contents of cache (all templates) * @param string $name filter name
* *
* @param string $exp_time expire time * @throws \SmartyException
* @return boolean */
*/ public function load_filter($type, $name)
public function clear_all_cache($exp_time = null) {
{ $this->loadFilter($type, $name);
return $this->clearCache(null, null, null, $exp_time); }
}
/**
/** * clear cached content for the given template and cache id
* test to see if valid cache exists for this template *
* * @param string $tpl_file name of template file
* @param string $tpl_file name of template file * @param string $cache_id name of cache_id
* @param string $cache_id * @param string $compile_id name of compile_id
* @param string $compile_id * @param string $exp_time expiration time
* @return boolean *
*/ * @return boolean
public function is_cached($tpl_file, $cache_id = null, $compile_id = null) */
{ public function clear_cache($tpl_file = null, $cache_id = null, $compile_id = null, $exp_time = null)
return $this->isCached($tpl_file, $cache_id, $compile_id); {
} return $this->clearCache($tpl_file, $cache_id, $compile_id, $exp_time);
}
/**
* clear all the assigned template variables. /**
*/ * clear the entire contents of cache (all templates)
public function clear_all_assign() *
{ * @param string $exp_time expire time
$this->clearAllAssign(); *
} * @return boolean
*/
/** public function clear_all_cache($exp_time = null)
* clears compiled version of specified template resource, {
* or all compiled template files if one is not specified. return $this->clearCache(null, null, null, $exp_time);
* This function is for advanced use only, not normally needed. }
*
* @param string $tpl_file /**
* @param string $compile_id * test to see if valid cache exists for this template
* @param string $exp_time *
* @return boolean results of {@link smarty_core_rm_auto()} * @param string $tpl_file name of template file
*/ * @param string $cache_id
public function clear_compiled_tpl($tpl_file = null, $compile_id = null, $exp_time = null) * @param string $compile_id
{ *
return $this->clearCompiledTemplate($tpl_file, $compile_id, $exp_time); * @return bool
} * @throws \Exception
* @throws \SmartyException
/** */
* Checks whether requested template exists. public function is_cached($tpl_file, $cache_id = null, $compile_id = null)
* {
* @param string $tpl_file return $this->isCached($tpl_file, $cache_id, $compile_id);
* @return boolean }
*/
public function template_exists($tpl_file) /**
{ * clear all the assigned template variables.
return $this->templateExists($tpl_file); */
} public function clear_all_assign()
{
/** $this->clearAllAssign();
* Returns an array containing template variables }
*
* @param string $name /**
* @return array * clears compiled version of specified template resource,
*/ * or all compiled template files if one is not specified.
public function get_template_vars($name=null) * This function is for advanced use only, not normally needed.
{ *
return $this->getTemplateVars($name); * @param string $tpl_file
} * @param string $compile_id
* @param string $exp_time
/** *
* Returns an array containing config variables * @return boolean results of {@link smarty_core_rm_auto()}
* */
* @param string $name public function clear_compiled_tpl($tpl_file = null, $compile_id = null, $exp_time = null)
* @return array {
*/ return $this->clearCompiledTemplate($tpl_file, $compile_id, $exp_time);
public function get_config_vars($name=null) }
{
return $this->getConfigVars($name); /**
} * Checks whether requested template exists.
*
/** * @param string $tpl_file
* load configuration values *
* * @return bool
* @param string $file * @throws \SmartyException
* @param string $section */
* @param string $scope public function template_exists($tpl_file)
*/ {
public function config_load($file, $section = null, $scope = 'global') return $this->templateExists($tpl_file);
{ }
$this->ConfigLoad($file, $section, $scope);
} /**
* Returns an array containing template variables
/** *
* return a reference to a registered object * @param string $name
* *
* @param string $name * @return array
* @return object */
*/ public function get_template_vars($name = null)
public function get_registered_object($name) {
{ return $this->getTemplateVars($name);
return $this->getRegisteredObject($name); }
}
/**
/** * Returns an array containing config variables
* clear configuration values *
* * @param string $name
* @param string $var *
*/ * @return array
public function clear_config($var = null) */
{ public function get_config_vars($name = null)
$this->clearConfig($var); {
} return $this->getConfigVars($name);
}
/**
* trigger Smarty error /**
* * load configuration values
* @param string $error_msg *
* @param integer $error_type * @param string $file
*/ * @param string $section
public function trigger_error($error_msg, $error_type = E_USER_WARNING) * @param string $scope
{ */
trigger_error("Smarty error: $error_msg", $error_type); public function config_load($file, $section = null, $scope = 'global')
} {
$this->ConfigLoad($file, $section, $scope);
} }
/** /**
* Smarty {php}{/php} block function * return a reference to a registered object
* *
* @param array $params parameter list * @param string $name
* @param string $content contents of the block *
* @param object $template template object * @return object
* @param boolean &$repeat repeat flag */
* @return string content re-formatted public function get_registered_object($name)
*/ {
function smarty_php_tag($params, $content, $template, &$repeat) return $this->getRegisteredObject($name);
{ }
eval($content);
return ''; /**
} * 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);
}
}

View file

@ -0,0 +1,16 @@
<?php
/**
* This file is part of the Smarty package.
*
* (c) Sebastian Bergmann <sebastian@phpunit.de>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
/**
* Load and register Smarty Autoloader
*/
if (!class_exists('Smarty_Autoloader')) {
include dirname(__FILE__) . '/Autoloader.php';
}
Smarty_Autoloader::register(true);

View file

@ -1,133 +1,160 @@
{capture name='_smarty_debug' assign=debug_output} {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"> <!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"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head> <head>
<title>Smarty Debug Console</title> <title>Smarty Debug Console</title>
<style type="text/css"> <style type="text/css">
{literal} {literal}
body, h1, h2, td, th, p { body, h1, h2, h3, td, th, p {
font-family: sans-serif; font-family: sans-serif;
font-weight: normal; font-weight: normal;
font-size: 0.9em; font-size: 0.9em;
margin: 1px; margin: 1px;
padding: 0; padding: 0;
} }
h1 { h1 {
margin: 0; margin: 0;
text-align: left; text-align: left;
padding: 2px; padding: 2px;
background-color: #f0c040; background-color: #f0c040;
color: black; color: black;
font-weight: bold; font-weight: bold;
font-size: 1.2em; font-size: 1.2em;
} }
h2 { h2 {
background-color: #9B410E; background-color: #9B410E;
color: white; color: white;
text-align: left; text-align: left;
font-weight: bold; font-weight: bold;
padding: 2px; padding: 2px;
border-top: 1px solid black; border-top: 1px solid black;
} }
h3 {
body { text-align: left;
background: black; font-weight: bold;
} color: black;
font-size: 0.7em;
p, table, div { padding: 2px;
background: #f0ead8; }
}
body {
p { background: black;
margin: 0; }
font-style: italic;
text-align: center; p, table, div {
} background: #f0ead8;
}
table {
width: 100%; p {
} margin: 0;
font-style: italic;
th, td { text-align: center;
font-family: monospace; }
vertical-align: top;
text-align: left; table {
width: 50%; width: 100%;
} }
td { th, td {
color: green; font-family: monospace;
} vertical-align: top;
text-align: left;
.odd { }
background-color: #eeeeee;
} td {
color: green;
.even { }
background-color: #fafafa;
} .odd {
background-color: #eeeeee;
.exectime { }
font-size: 0.8em;
font-style: italic; .even {
} background-color: #fafafa;
}
#table_assigned_vars th {
color: blue; .exectime {
} font-size: 0.8em;
font-style: italic;
#table_config_vars th { }
color: maroon;
} #bold div {
{/literal} color: black;
</style> font-weight: bold;
</head> }
<body> #blue h3 {
color: blue;
<h1>Smarty Debug Console - {if isset($template_name)}{$template_name|debug_print_var nofilter}{else}Total Time {$execution_time|string_format:"%.5f"}{/if}</h1> }
#normal div {
{if !empty($template_data)} color: black;
<h2>included templates &amp; config files (load time in seconds)</h2> font-weight: normal;
}
<div> #table_assigned_vars th {
{foreach $template_data as $template} color: blue;
<font color=brown>{$template.name}</font> font-weight: bold;
<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> #table_config_vars th {
<br> color: maroon;
{/foreach} }
</div>
{/if} {/literal}
</style>
<h2>assigned template variables</h2> </head>
<body>
<table id="table_assigned_vars">
{foreach $assigned_vars as $vars} <h1>Smarty {Smarty::SMARTY_VERSION} Debug Console
<tr class="{if $vars@iteration % 2 eq 0}odd{else}even{/if}"> - {if isset($template_name)}{$template_name|debug_print_var nofilter} {/if}{if !empty($template_data)}Total Time {$execution_time|string_format:"%.5f"}{/if}</h1>
<th>${$vars@key|escape:'html'}</th>
<td>{$vars|debug_print_var nofilter}</td></tr> {if !empty($template_data)}
{/foreach} <h2>included templates &amp; config files (load time in seconds)</h2>
</table> <div>
{foreach $template_data as $template}
<h2>assigned config file variables (outer template scope)</h2> <font color=brown>{$template.name}</font>
<br />&nbsp;&nbsp;<span class="exectime">
<table id="table_config_vars"> (compile {$template['compile_time']|string_format:"%.5f"}) (render {$template['render_time']|string_format:"%.5f"}) (cache {$template['cache_time']|string_format:"%.5f"})
{foreach $config_vars as $vars} </span>
<tr class="{if $vars@iteration % 2 eq 0}odd{else}even{/if}"> <br />
<th>{$vars@key|escape:'html'}</th> {/foreach}
<td>{$vars|debug_print_var nofilter}</td></tr> </div>
{/foreach} {/if}
</table> <h2>assigned template variables</h2>
</body>
</html> <table id="table_assigned_vars">
{/capture} {foreach $assigned_vars as $vars}
<script type="text/javascript"> <tr class="{if $vars@iteration % 2 eq 0}odd{else}even{/if}">
{$id = $template_name|default:''|md5} <td><h3><font color=blue>${$vars@key}</font></h3>
_smarty_console = window.open("","console{$id}","width=680,height=600,resizable,scrollbars=yes"); {if isset($vars['nocache'])}<b>Nocache</b><br />{/if}
_smarty_console.document.write("{$debug_output|escape:'javascript' nofilter}"); {if isset($vars['scope'])}<b>Origin:</b> {$vars['scope']|debug_print_var nofilter}{/if}
_smarty_console.document.close(); </td>
</script> <td><h3>Value</h3>{$vars['value']|debug_print_var:10:80 nofilter}</td>
<td>{if isset($vars['attributes'])}<h3>Attributes</h3>{$vars['attributes']|debug_print_var nofilter} {/if}</td>
{/foreach}
</table>
<h2>assigned config file variables</h2>
<table id="table_config_vars">
{foreach $config_vars as $vars}
<tr class="{if $vars@iteration % 2 eq 0}odd{else}even{/if}">
<td><h3><font color=blue>#{$vars@key}#</font></h3>
{if isset($vars['scope'])}<b>Origin:</b> {$vars['scope']|debug_print_var nofilter}{/if}
</td>
<td>{$vars['value']|debug_print_var:10:80 nofilter}</td>
</tr>
{/foreach}
</table>
</body>
</html>
{/capture}
<script type="text/javascript">
{$id = '__Smarty__'}
{if $display_mode}{$id = "$offset$template_name"|md5}{/if}
_smarty_console = window.open("", "console{$id}", "width=1024,height=600,left={$offset},top={$offset},resizable,scrollbars=yes");
_smarty_console.document.write("{$debug_output|escape:'javascript' nofilter}");
_smarty_console.document.close();
</script>

View file

@ -1,8 +0,0 @@
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
<p>Directory access is forbidden.</p>
</body>
</html>

View file

@ -1,113 +1,121 @@
<?php <?php
/** /**
* Smarty plugin to format text blocks * Smarty plugin to format text blocks
* *
* @package Smarty * @package Smarty
* @subpackage PluginsBlock * @subpackage PluginsBlock
*/ */
/**
/** * Smarty {textformat}{/textformat} block plugin
* Smarty {textformat}{/textformat} block plugin * Type: block function
* * Name: textformat
* Type: block function<br> * Purpose: format text a certain way with preset styles
* Name: textformat<br> * or custom wrap/indent settings
* Purpose: format text a certain way with preset styles * Params:
* or custom wrap/indent settings<br> *
* Params: * - style - string (email)
* <pre> * - indent - integer (0)
* - style - string (email) * - wrap - integer (80)
* - indent - integer (0) * - wrap_char - string ("\n")
* - wrap - integer (80) * - indent_char - string (" ")
* - wrap_char - string ("\n") * - wrap_boundary - boolean (true)
* - indent_char - string (" ") *
* - wrap_boundary - boolean (true) * @link http://www.smarty.net/manual/en/language.function.textformat.php {textformat}
* </pre> * (Smarty online manual)
* *
* @link http://www.smarty.net/manual/en/language.function.textformat.php {textformat} * @param array $params parameters
* (Smarty online manual) * @param string $content contents of the block
* @param array $params parameters * @param Smarty_Internal_Template $template template object
* @param string $content contents of the block * @param boolean &$repeat repeat flag
* @param Smarty_Internal_Template $template template object *
* @param boolean &$repeat repeat flag * @return string content re-formatted
* @return string content re-formatted * @author Monte Ohrt <monte at ohrt dot com>
* @author Monte Ohrt <monte at ohrt dot com> * @throws \SmartyException
*/ */
function smarty_block_textformat($params, $content, $template, &$repeat) function smarty_block_textformat($params, $content, Smarty_Internal_Template $template, &$repeat)
{ {
if (is_null($content)) { if (is_null($content)) {
return; return;
} }
if (Smarty::$_MBSTRING) {
$style = null; $template->_checkPlugins(
$indent = 0; array(
$indent_first = 0; array(
$indent_char = ' '; 'function' => 'smarty_modifier_mb_wordwrap',
$wrap = 80; 'file' => SMARTY_PLUGINS_DIR . 'modifier.mb_wordwrap.php'
$wrap_char = "\n"; )
$wrap_cut = false; )
$assign = null; );
}
foreach ($params as $_key => $_val) { $style = null;
switch ($_key) { $indent = 0;
case 'style': $indent_first = 0;
case 'indent_char': $indent_char = ' ';
case 'wrap_char': $wrap = 80;
case 'assign': $wrap_char = "\n";
$$_key = (string)$_val; $wrap_cut = false;
break; $assign = null;
foreach ($params as $_key => $_val) {
case 'indent': switch ($_key) {
case 'indent_first': case 'style':
case 'wrap': case 'indent_char':
$$_key = (int)$_val; case 'wrap_char':
break; case 'assign':
$$_key = (string)$_val;
case 'wrap_cut': break;
$$_key = (bool)$_val; case 'indent':
break; case 'indent_first':
case 'wrap':
default: $$_key = (int)$_val;
trigger_error("textformat: unknown attribute '$_key'"); break;
} case 'wrap_cut':
} $$_key = (bool)$_val;
break;
if ($style == 'email') { default:
$wrap = 72; trigger_error("textformat: unknown attribute '{$_key}'");
} }
// split into paragraphs }
$_paragraphs = preg_split('![\r\n]{2}!', $content); if ($style === 'email') {
$_output = ''; $wrap = 72;
}
// split into paragraphs
foreach ($_paragraphs as &$_paragraph) { $_paragraphs = preg_split('![\r\n]{2}!', $content);
if (!$_paragraph) { foreach ($_paragraphs as &$_paragraph) {
continue; 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); // convert mult. spaces & special chars to single space
// indent first line $_paragraph =
if ($indent_first > 0) { preg_replace(
$_paragraph = str_repeat($indent_char, $indent_first) . $_paragraph; array(
} '!\s+!' . Smarty::$_UTF8_MODIFIER,
// wordwrap sentences '!(^\s+)|(\s+$)!' . Smarty::$_UTF8_MODIFIER
if (Smarty::$_MBSTRING) { ),
require_once(SMARTY_PLUGINS_DIR . 'shared.mb_wordwrap.php'); array(
$_paragraph = smarty_mb_wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut); ' ',
} else { ''
$_paragraph = wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut); ),
} $_paragraph
// indent lines );
if ($indent > 0) { // indent first line
$_paragraph = preg_replace('!^!m', str_repeat($indent_char, $indent), $_paragraph); if ($indent_first > 0) {
} $_paragraph = str_repeat($indent_char, $indent_first) . $_paragraph;
} }
$_output = implode($wrap_char . $wrap_char, $_paragraphs); // wordwrap sentences
if (Smarty::$_MBSTRING) {
if ($assign) { $_paragraph = smarty_modifier_mb_wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut);
$template->assign($assign, $_output); } else {
} else { $_paragraph = wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut);
return $_output; }
} // 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;
}
}

View file

@ -1,78 +1,62 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* @package Smarty *
* @subpackage PluginsFunction * @package Smarty
*/ * @subpackage PluginsFunction
*/
/** /**
* Smarty {counter} function plugin * Smarty {counter} function plugin
* * Type: function
* Type: function<br> * Name: counter
* Name: counter<br> * Purpose: print out a counter value
* Purpose: print out a counter value *
* * @author Monte Ohrt <monte at ohrt dot com>
* @author Monte Ohrt <monte at ohrt dot com> * @link http://www.smarty.net/manual/en/language.function.counter.php {counter}
* @link http://www.smarty.net/manual/en/language.function.counter.php {counter} * (Smarty online manual)
* (Smarty online manual) *
* @param array $params parameters * @param array $params parameters
* @param Smarty_Internal_Template $template template object * @param Smarty_Internal_Template $template template object
* @return string|null *
*/ * @return string|null
function smarty_function_counter($params, $template) */
{ function smarty_function_counter($params, $template)
static $counters = array(); {
static $counters = array();
$name = (isset($params['name'])) ? $params['name'] : 'default'; $name = (isset($params[ 'name' ])) ? $params[ 'name' ] : 'default';
if (!isset($counters[$name])) { if (!isset($counters[ $name ])) {
$counters[$name] = array( $counters[ $name ] = array('start' => 1, 'skip' => 1, 'direction' => 'up', 'count' => 1);
'start'=>1, }
'skip'=>1, $counter =& $counters[ $name ];
'direction'=>'up', if (isset($params[ 'start' ])) {
'count'=>1 $counter[ 'start' ] = $counter[ 'count' ] = (int)$params[ 'start' ];
); }
} if (!empty($params[ 'assign' ])) {
$counter =& $counters[$name]; $counter[ 'assign' ] = $params[ 'assign' ];
}
if (isset($params['start'])) { if (isset($counter[ 'assign' ])) {
$counter['start'] = $counter['count'] = (int)$params['start']; $template->assign($counter[ 'assign' ], $counter[ 'count' ]);
} }
if (isset($params[ 'print' ])) {
if (!empty($params['assign'])) { $print = (bool)$params[ 'print' ];
$counter['assign'] = $params['assign']; } else {
} $print = empty($counter[ 'assign' ]);
}
if (isset($counter['assign'])) { if ($print) {
$template->assign($counter['assign'], $counter['count']); $retval = $counter[ 'count' ];
} } else {
$retval = null;
if (isset($params['print'])) { }
$print = (bool)$params['print']; if (isset($params[ 'skip' ])) {
} else { $counter[ 'skip' ] = $params[ 'skip' ];
$print = empty($counter['assign']); }
} if (isset($params[ 'direction' ])) {
$counter[ 'direction' ] = $params[ 'direction' ];
if ($print) { }
$retval = $counter['count']; if ($counter[ 'direction' ] === 'down') {
} else { $counter[ 'count' ] -= $counter[ 'skip' ];
$retval = null; } else {
} $counter[ 'count' ] += $counter[ 'skip' ];
}
if (isset($params['skip'])) { return $retval;
$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;
}
?>

View file

@ -1,106 +1,92 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsFunction * @subpackage PluginsFunction
*/ */
/**
/** * Smarty {cycle} function plugin
* Smarty {cycle} function plugin * Type: function
* * Name: cycle
* Type: function<br> * Date: May 3, 2002
* Name: cycle<br> * Purpose: cycle through given values
* Date: May 3, 2002<br> * Params:
* Purpose: cycle through given values<br> *
* Params: * - name - name of cycle (optional)
* <pre> * - values - comma separated list of values to cycle, or an array of values to cycle
* - name - name of cycle (optional) * (this can be left out for subsequent calls)
* - values - comma separated list of values to cycle, or an array of values to cycle * - reset - boolean - resets given var to true
* (this can be left out for subsequent calls) * - print - boolean - print var or not. default is true
* - reset - boolean - resets given var to true * - advance - boolean - whether or not to advance the cycle
* - print - boolean - print var or not. default is true * - delimiter - the value delimiter, default is ","
* - advance - boolean - whether or not to advance the cycle * - assign - boolean, assigns to template var instead of printed.
* - delimiter - the value delimiter, default is "," *
* - assign - boolean, assigns to template var instead of printed. * Examples:
* </pre> *
* Examples:<br> * {cycle values="#eeeeee,#d0d0d0d"}
* <pre> * {cycle name=row values="one,two,three" reset=true}
* {cycle values="#eeeeee,#d0d0d0d"} * {cycle name=row}
* {cycle name=row values="one,two,three" reset=true} *
* {cycle name=row} * @link http://www.smarty.net/manual/en/language.function.cycle.php {cycle}
* </pre> * (Smarty online manual)
* * @author Monte Ohrt <monte at ohrt dot com>
* @link http://www.smarty.net/manual/en/language.function.cycle.php {cycle} * @author credit to Mark Priatel <mpriatel@rogers.com>
* (Smarty online manual) * @author credit to Gerard <gerard@interfold.com>
* @author Monte Ohrt <monte at ohrt dot com> * @author credit to Jason Sweat <jsweat_php@yahoo.com>
* @author credit to Mark Priatel <mpriatel@rogers.com> * @version 1.3
* @author credit to Gerard <gerard@interfold.com> *
* @author credit to Jason Sweat <jsweat_php@yahoo.com> * @param array $params parameters
* @version 1.3 * @param Smarty_Internal_Template $template template object
* @param array $params parameters *
* @param Smarty_Internal_Template $template template object * @return string|null
* @return string|null */
*/ function smarty_function_cycle($params, $template)
{
function smarty_function_cycle($params, $template) static $cycle_vars;
{ $name = (empty($params[ 'name' ])) ? 'default' : $params[ 'name' ];
static $cycle_vars; $print = (isset($params[ 'print' ])) ? (bool)$params[ 'print' ] : true;
$advance = (isset($params[ 'advance' ])) ? (bool)$params[ 'advance' ] : true;
$name = (empty($params['name'])) ? 'default' : $params['name']; $reset = (isset($params[ 'reset' ])) ? (bool)$params[ 'reset' ] : false;
$print = (isset($params['print'])) ? (bool)$params['print'] : true; if (!isset($params[ 'values' ])) {
$advance = (isset($params['advance'])) ? (bool)$params['advance'] : true; if (!isset($cycle_vars[ $name ][ 'values' ])) {
$reset = (isset($params['reset'])) ? (bool)$params['reset'] : false; trigger_error('cycle: missing \'values\' parameter');
return;
if (!isset($params['values'])) { }
if(!isset($cycle_vars[$name]['values'])) { } else {
trigger_error("cycle: missing 'values' parameter"); if (isset($cycle_vars[ $name ][ 'values' ]) && $cycle_vars[ $name ][ 'values' ] !== $params[ 'values' ]) {
return; $cycle_vars[ $name ][ 'index' ] = 0;
} }
} else { $cycle_vars[ $name ][ 'values' ] = $params[ 'values' ];
if(isset($cycle_vars[$name]['values']) }
&& $cycle_vars[$name]['values'] != $params['values'] ) { if (isset($params[ 'delimiter' ])) {
$cycle_vars[$name]['index'] = 0; $cycle_vars[ $name ][ 'delimiter' ] = $params[ 'delimiter' ];
} } elseif (!isset($cycle_vars[ $name ][ 'delimiter' ])) {
$cycle_vars[$name]['values'] = $params['values']; $cycle_vars[ $name ][ 'delimiter' ] = ',';
} }
if (is_array($cycle_vars[ $name ][ 'values' ])) {
if (isset($params['delimiter'])) { $cycle_array = $cycle_vars[ $name ][ 'values' ];
$cycle_vars[$name]['delimiter'] = $params['delimiter']; } else {
} elseif (!isset($cycle_vars[$name]['delimiter'])) { $cycle_array = explode($cycle_vars[ $name ][ 'delimiter' ], $cycle_vars[ $name ][ 'values' ]);
$cycle_vars[$name]['delimiter'] = ','; }
} if (!isset($cycle_vars[ $name ][ 'index' ]) || $reset) {
$cycle_vars[ $name ][ 'index' ] = 0;
if(is_array($cycle_vars[$name]['values'])) { }
$cycle_array = $cycle_vars[$name]['values']; if (isset($params[ 'assign' ])) {
} else { $print = false;
$cycle_array = explode($cycle_vars[$name]['delimiter'],$cycle_vars[$name]['values']); $template->assign($params[ 'assign' ], $cycle_array[ $cycle_vars[ $name ][ 'index' ] ]);
} }
if ($print) {
if(!isset($cycle_vars[$name]['index']) || $reset ) { $retval = $cycle_array[ $cycle_vars[ $name ][ 'index' ] ];
$cycle_vars[$name]['index'] = 0; } else {
} $retval = null;
}
if (isset($params['assign'])) { if ($advance) {
$print = false; if ($cycle_vars[ $name ][ 'index' ] >= count($cycle_array) - 1) {
$template->assign($params['assign'], $cycle_array[$cycle_vars[$name]['index']]); $cycle_vars[ $name ][ 'index' ] = 0;
} } else {
$cycle_vars[ $name ][ 'index' ]++;
if($print) { }
$retval = $cycle_array[$cycle_vars[$name]['index']]; }
} else { return $retval;
$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;
}
?>

View file

@ -1,214 +1,204 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsFunction * @subpackage PluginsFunction
*/ */
/**
/** * Smarty {fetch} plugin
* Smarty {fetch} plugin * Type: function
* * Name: fetch
* Type: function<br> * Purpose: fetch file, web or ftp data and display results
* 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)
* @link http://www.smarty.net/manual/en/language.function.fetch.php {fetch} * @author Monte Ohrt <monte at ohrt dot com>
* (Smarty online manual) *
* @author Monte Ohrt <monte at ohrt dot com> * @param array $params parameters
* @param array $params parameters * @param Smarty_Internal_Template $template template object
* @param Smarty_Internal_Template $template template object *
* @return string|null if the assign parameter is passed, Smarty assigns the result to a template variable * @throws SmartyException
*/ * @return string|null if the assign parameter is passed, Smarty assigns the result to a template variable
function smarty_function_fetch($params, $template) */
{ function smarty_function_fetch($params, $template)
if (empty($params['file'])) { {
trigger_error("[plugin] fetch parameter 'file' cannot be empty",E_USER_NOTICE); if (empty($params[ 'file' ])) {
return; trigger_error('[plugin] fetch parameter \'file\' cannot be empty', E_USER_NOTICE);
} return;
}
// strip file protocol // strip file protocol
if (stripos($params['file'], 'file://') === 0) { if (stripos($params[ 'file' ], 'file://') === 0) {
$params['file'] = substr($params['file'], 7); $params[ 'file' ] = substr($params[ 'file' ], 7);
} }
$protocol = strpos($params[ 'file' ], '://');
$protocol = strpos($params['file'], '://'); if ($protocol !== false) {
if ($protocol !== false) { $protocol = strtolower(substr($params[ 'file' ], 0, $protocol));
$protocol = strtolower(substr($params['file'], 0, $protocol)); }
} if (isset($template->smarty->security_policy)) {
if ($protocol) {
if (isset($template->smarty->security_policy)) { // remote resource (or php stream, …)
if ($protocol) { if (!$template->smarty->security_policy->isTrustedUri($params[ 'file' ])) {
// remote resource (or php stream, …) return;
if(!$template->smarty->security_policy->isTrustedUri($params['file'])) { }
return; } else {
} // local file
} else { if (!$template->smarty->security_policy->isTrustedResourceDir($params[ 'file' ])) {
// local file return;
if(!$template->smarty->security_policy->isTrustedResourceDir($params['file'])) { }
return; }
} }
} $content = '';
} if ($protocol === 'http') {
// http fetch
$content = ''; if ($uri_parts = parse_url($params[ 'file' ])) {
if ($protocol == 'http') { // set defaults
// http fetch $host = $server_name = $uri_parts[ 'host' ];
if($uri_parts = parse_url($params['file'])) { $timeout = 30;
// set defaults $accept = 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*';
$host = $server_name = $uri_parts['host']; $agent = 'Smarty Template Engine ' . Smarty::SMARTY_VERSION;
$timeout = 30; $referer = '';
$accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*"; $uri = !empty($uri_parts[ 'path' ]) ? $uri_parts[ 'path' ] : '/';
$agent = "Smarty Template Engine ". Smarty::SMARTY_VERSION; $uri .= !empty($uri_parts[ 'query' ]) ? '?' . $uri_parts[ 'query' ] : '';
$referer = ""; $_is_proxy = false;
$uri = !empty($uri_parts['path']) ? $uri_parts['path'] : '/'; if (empty($uri_parts[ 'port' ])) {
$uri .= !empty($uri_parts['query']) ? '?' . $uri_parts['query'] : ''; $port = 80;
$_is_proxy = false; } else {
if(empty($uri_parts['port'])) { $port = $uri_parts[ 'port' ];
$port = 80; }
} else { if (!empty($uri_parts[ 'user' ])) {
$port = $uri_parts['port']; $user = $uri_parts[ 'user' ];
} }
if(!empty($uri_parts['user'])) { if (!empty($uri_parts[ 'pass' ])) {
$user = $uri_parts['user']; $pass = $uri_parts[ 'pass' ];
} }
if(!empty($uri_parts['pass'])) { // loop through parameters, setup headers
$pass = $uri_parts['pass']; foreach ($params as $param_key => $param_value) {
} switch ($param_key) {
// loop through parameters, setup headers case 'file':
foreach($params as $param_key => $param_value) { case 'assign':
switch($param_key) { case 'assign_headers':
case "file": break;
case "assign": case 'user':
case "assign_headers": if (!empty($param_value)) {
break; $user = $param_value;
case "user": }
if(!empty($param_value)) { break;
$user = $param_value; case 'pass':
} if (!empty($param_value)) {
break; $pass = $param_value;
case "pass": }
if(!empty($param_value)) { break;
$pass = $param_value; case 'accept':
} if (!empty($param_value)) {
break; $accept = $param_value;
case "accept": }
if(!empty($param_value)) { break;
$accept = $param_value; case 'header':
} if (!empty($param_value)) {
break; if (!preg_match('![\w\d-]+: .+!', $param_value)) {
case "header": trigger_error("[plugin] invalid header format '{$param_value}'", E_USER_NOTICE);
if(!empty($param_value)) { return;
if(!preg_match('![\w\d-]+: .+!',$param_value)) { } else {
trigger_error("[plugin] invalid header format '".$param_value."'",E_USER_NOTICE); $extra_headers[] = $param_value;
return; }
} else { }
$extra_headers[] = $param_value; break;
} case 'proxy_host':
} if (!empty($param_value)) {
break; $proxy_host = $param_value;
case "proxy_host": }
if(!empty($param_value)) { break;
$proxy_host = $param_value; case 'proxy_port':
} if (!preg_match('!\D!', $param_value)) {
break; $proxy_port = (int)$param_value;
case "proxy_port": } else {
if(!preg_match('!\D!', $param_value)) { trigger_error("[plugin] invalid value for attribute '{$param_key }'", E_USER_NOTICE);
$proxy_port = (int) $param_value; return;
} else { }
trigger_error("[plugin] invalid value for attribute '".$param_key."'",E_USER_NOTICE); break;
return; case 'agent':
} if (!empty($param_value)) {
break; $agent = $param_value;
case "agent": }
if(!empty($param_value)) { break;
$agent = $param_value; case 'referer':
} if (!empty($param_value)) {
break; $referer = $param_value;
case "referer": }
if(!empty($param_value)) { break;
$referer = $param_value; case 'timeout':
} if (!preg_match('!\D!', $param_value)) {
break; $timeout = (int)$param_value;
case "timeout": } else {
if(!preg_match('!\D!', $param_value)) { trigger_error("[plugin] invalid value for attribute '{$param_key}'", E_USER_NOTICE);
$timeout = (int) $param_value; return;
} else { }
trigger_error("[plugin] invalid value for attribute '".$param_key."'",E_USER_NOTICE); break;
return; default:
} trigger_error("[plugin] unrecognized attribute '{$param_key}'", E_USER_NOTICE);
break; return;
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);
if(!empty($proxy_host) && !empty($proxy_port)) { } else {
$_is_proxy = true; $fp = fsockopen($server_name, $port, $errno, $errstr, $timeout);
$fp = fsockopen($proxy_host,$proxy_port,$errno,$errstr,$timeout); }
} else { if (!$fp) {
$fp = fsockopen($server_name,$port,$errno,$errstr,$timeout); trigger_error("[plugin] unable to fetch: $errstr ($errno)", E_USER_NOTICE);
} return;
} else {
if(!$fp) { if ($_is_proxy) {
trigger_error("[plugin] unable to fetch: $errstr ($errno)",E_USER_NOTICE); fputs($fp, 'GET ' . $params[ 'file' ] . " HTTP/1.0\r\n");
return; } else {
} else { fputs($fp, "GET $uri HTTP/1.0\r\n");
if($_is_proxy) { }
fputs($fp, 'GET ' . $params['file'] . " HTTP/1.0\r\n"); if (!empty($host)) {
} else { fputs($fp, "Host: $host\r\n");
fputs($fp, "GET $uri HTTP/1.0\r\n"); }
} if (!empty($accept)) {
if(!empty($host)) { fputs($fp, "Accept: $accept\r\n");
fputs($fp, "Host: $host\r\n"); }
} if (!empty($agent)) {
if(!empty($accept)) { fputs($fp, "User-Agent: $agent\r\n");
fputs($fp, "Accept: $accept\r\n"); }
} if (!empty($referer)) {
if(!empty($agent)) { fputs($fp, "Referer: $referer\r\n");
fputs($fp, "User-Agent: $agent\r\n"); }
} if (isset($extra_headers) && is_array($extra_headers)) {
if(!empty($referer)) { foreach ($extra_headers as $curr_header) {
fputs($fp, "Referer: $referer\r\n"); fputs($fp, $curr_header . "\r\n");
} }
if(isset($extra_headers) && is_array($extra_headers)) { }
foreach($extra_headers as $curr_header) { if (!empty($user) && !empty($pass)) {
fputs($fp, $curr_header."\r\n"); fputs($fp, 'Authorization: BASIC ' . base64_encode("$user:$pass") . "\r\n");
} }
} fputs($fp, "\r\n");
if(!empty($user) && !empty($pass)) { while (!feof($fp)) {
fputs($fp, "Authorization: BASIC ".base64_encode("$user:$pass")."\r\n"); $content .= fgets($fp, 4096);
} }
fclose($fp);
fputs($fp, "\r\n"); $csplit = preg_split("!\r\n\r\n!", $content, 2);
while(!feof($fp)) { $content = $csplit[ 1 ];
$content .= fgets($fp,4096); if (!empty($params[ 'assign_headers' ])) {
} $template->assign($params[ 'assign_headers' ], preg_split("!\r\n!", $csplit[ 0 ]));
fclose($fp); }
$csplit = preg_split("!\r\n\r\n!",$content,2); }
} else {
$content = $csplit[1]; trigger_error("[plugin fetch] unable to parse URL, check syntax", E_USER_NOTICE);
return;
if(!empty($params['assign_headers'])) { }
$template->assign($params['assign_headers'],preg_split("!\r\n!",$csplit[0])); } else {
} $content = @file_get_contents($params[ 'file' ]);
} if ($content === false) {
} else { throw new SmartyException("{fetch} cannot read resource '" . $params[ 'file' ] . "'");
trigger_error("[plugin fetch] unable to parse URL, check syntax",E_USER_NOTICE); }
return; }
} if (!empty($params[ 'assign' ])) {
} else { $template->assign($params[ 'assign' ], $content);
$content = @file_get_contents($params['file']); } else {
if ($content === false) { return $content;
throw new SmartyException("{fetch} cannot read resource '" . $params['file'] ."'"); }
} }
}
if (!empty($params['assign'])) {
$template->assign($params['assign'], $content);
} else {
return $content;
}
}
?>

View file

@ -1,233 +1,286 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsFunction * @subpackage PluginsFunction
*/ */
/**
/** * Smarty {html_checkboxes} function plugin
* Smarty {html_checkboxes} function plugin * File: function.html_checkboxes.php
* * Type: function
* File: function.html_checkboxes.php<br> * Name: html_checkboxes
* Type: function<br> * Date: 24.Feb.2003
* Name: html_checkboxes<br> * Purpose: Prints out a list of checkbox input types
* Date: 24.Feb.2003<br> * Examples:
* Purpose: Prints out a list of checkbox input types<br> *
* Examples: * {html_checkboxes values=$ids output=$names}
* <pre> * {html_checkboxes values=$ids name='box' separator='<br>' output=$names}
* {html_checkboxes values=$ids output=$names} * {html_checkboxes values=$ids checked=$checked separator='<br>' output=$names}
* {html_checkboxes values=$ids name='box' separator='<br>' output=$names} *
* {html_checkboxes values=$ids checked=$checked separator='<br>' output=$names} * Params:
* </pre> *
* Params: * - name (optional) - string default "checkbox"
* <pre> * - values (required) - array
* - name (optional) - string default "checkbox" * - options (optional) - associative array
* - values (required) - array * - checked (optional) - array default not set
* - options (optional) - associative array * - separator (optional) - ie <br> or &nbsp;
* - checked (optional) - array default not set * - output (optional) - the output next to each checkbox
* - separator (optional) - ie <br> or &nbsp; * - assign (optional) - assign the output as an array to this variable
* - output (optional) - the output next to each checkbox * - escape (optional) - escape the content (not value), defaults to true
* - assign (optional) - assign the output as an array to this variable *
* - escape (optional) - escape the content (not value), defaults to true * @link http://www.smarty.net/manual/en/language.function.html.checkboxes.php {html_checkboxes}
* </pre> * (Smarty online manual)
* * @author Christopher Kvarme <christopher.kvarme@flashjab.com>
* @link http://www.smarty.net/manual/en/language.function.html.checkboxes.php {html_checkboxes} * @author credits to Monte Ohrt <monte at ohrt dot com>
* (Smarty online manual) * @version 1.0
* @author Christopher Kvarme <christopher.kvarme@flashjab.com> *
* @author credits to Monte Ohrt <monte at ohrt dot com> * @param array $params parameters
* @version 1.0 * @param Smarty_Internal_Template $template template object
* @param array $params parameters *
* @param object $template template object * @return string
* @return string * @uses smarty_function_escape_special_chars()
* @uses smarty_function_escape_special_chars() * @throws \SmartyException
*/ */
function smarty_function_html_checkboxes($params, $template) function smarty_function_html_checkboxes($params, Smarty_Internal_Template $template)
{ {
require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); $template->_checkPlugins(
array(
$name = 'checkbox'; array(
$values = null; 'function' => 'smarty_function_escape_special_chars',
$options = null; 'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'
$selected = array(); )
$separator = ''; )
$escape = true; );
$labels = true; $name = 'checkbox';
$label_ids = false; $values = null;
$output = null; $options = null;
$selected = array();
$extra = ''; $separator = '';
$escape = true;
foreach($params as $_key => $_val) { $labels = true;
switch($_key) { $label_ids = false;
case 'name': $output = null;
case 'separator': $extra = '';
$$_key = (string) $_val; foreach ($params as $_key => $_val) {
break; switch ($_key) {
case 'name':
case 'escape': case 'separator':
case 'labels': $$_key = (string)$_val;
case 'label_ids': break;
$$_key = (bool) $_val; case 'escape':
break; case 'labels':
case 'label_ids':
case 'options': $$_key = (bool)$_val;
$$_key = (array) $_val; break;
break; case 'options':
$$_key = (array)$_val;
case 'values': break;
case 'output': case 'values':
$$_key = array_values((array) $_val); case 'output':
break; $$_key = array_values((array)$_val);
break;
case 'checked': case 'checked':
case 'selected': case 'selected':
if (is_array($_val)) { if (is_array($_val)) {
$selected = array(); $selected = array();
foreach ($_val as $_sel) { foreach ($_val as $_sel) {
if (is_object($_sel)) { if (is_object($_sel)) {
if (method_exists($_sel, "__toString")) { if (method_exists($_sel, '__toString')) {
$_sel = smarty_function_escape_special_chars((string) $_sel->__toString()); $_sel = smarty_function_escape_special_chars((string)$_sel->__toString());
} else { } else {
trigger_error("html_checkboxes: selected attribute contains an object of class '". get_class($_sel) ."' without __toString() method", E_USER_NOTICE); trigger_error(
continue; 'html_checkboxes: selected attribute contains an object of class \'' .
} get_class($_sel) . '\' without __toString() method',
} else { E_USER_NOTICE
$_sel = smarty_function_escape_special_chars((string) $_sel); );
} continue;
$selected[$_sel] = true; }
} } else {
} elseif (is_object($_val)) { $_sel = smarty_function_escape_special_chars((string)$_sel);
if (method_exists($_val, "__toString")) { }
$selected = smarty_function_escape_special_chars((string) $_val->__toString()); $selected[ $_sel ] = true;
} else { }
trigger_error("html_checkboxes: selected attribute is an object of class '". get_class($_val) ."' without __toString() method", E_USER_NOTICE); } elseif (is_object($_val)) {
} if (method_exists($_val, '__toString')) {
} else { $selected = smarty_function_escape_special_chars((string)$_val->__toString());
$selected = smarty_function_escape_special_chars((string) $_val); } else {
} trigger_error(
break; 'html_checkboxes: selected attribute is an object of class \'' . get_class($_val) .
'\' without __toString() method',
case 'checkboxes': E_USER_NOTICE
trigger_error('html_checkboxes: the use of the "checkboxes" attribute is deprecated, use "options" instead', E_USER_WARNING); );
$options = (array) $_val; }
break; } else {
$selected = smarty_function_escape_special_chars((string)$_val);
case 'assign': }
break; break;
case 'checkboxes':
case 'strict': break; trigger_error(
'html_checkboxes: the use of the "checkboxes" attribute is deprecated, use "options" instead',
case 'disabled': E_USER_WARNING
case 'readonly': );
if (!empty($params['strict'])) { $options = (array)$_val;
if (!is_scalar($_val)) { break;
trigger_error("html_options: $_key attribute must be a scalar, only boolean true or string '$_key' will actually add the attribute", E_USER_NOTICE); case 'assign':
} break;
case 'strict':
if ($_val === true || $_val === $_key) { break;
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"'; case 'disabled':
} case 'readonly':
if (!empty($params[ 'strict' ])) {
break; if (!is_scalar($_val)) {
} trigger_error(
// omit break; to fall through! "html_options: {$_key} attribute must be a scalar, only boolean true or string '{$_key}' will actually add the attribute",
E_USER_NOTICE
default: );
if(!is_array($_val)) { }
$extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"'; if ($_val === true || $_val === $_key) {
} else { $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"';
trigger_error("html_checkboxes: extra attribute '$_key' cannot be an array", E_USER_NOTICE); }
} break;
break; }
} // omit break; to fall through!
} // no break
default:
if (!isset($options) && !isset($values)) if (!is_array($_val)) {
return ''; /* raise error here? */ $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"';
} else {
$_html_result = array(); trigger_error("html_checkboxes: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE);
}
if (isset($options)) { break;
foreach ($options as $_key=>$_val) { }
$_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids, $escape); }
} if (!isset($options) && !isset($values)) {
} else { return '';
foreach ($values as $_i=>$_key) { } /* raise error here? */
$_val = isset($output[$_i]) ? $output[$_i] : ''; $_html_result = array();
$_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids, $escape); if (isset($options)) {
} foreach ($options as $_key => $_val) {
} $_html_result[] =
smarty_function_html_checkboxes_output(
if(!empty($params['assign'])) { $name,
$template->assign($params['assign'], $_html_result); $_key,
} else { $_val,
return implode("\n", $_html_result); $selected,
} $extra,
$separator,
} $labels,
$label_ids,
function smarty_function_html_checkboxes_output($name, $value, $output, $selected, $extra, $separator, $labels, $label_ids, $escape=true) { $escape
$_output = ''; );
}
if (is_object($value)) { } else {
if (method_exists($value, "__toString")) { foreach ($values as $_i => $_key) {
$value = (string) $value->__toString(); $_val = isset($output[ $_i ]) ? $output[ $_i ] : '';
} else { $_html_result[] =
trigger_error("html_options: value is an object of class '". get_class($value) ."' without __toString() method", E_USER_NOTICE); smarty_function_html_checkboxes_output(
return ''; $name,
} $_key,
} else { $_val,
$value = (string) $value; $selected,
} $extra,
$separator,
if (is_object($output)) { $labels,
if (method_exists($output, "__toString")) { $label_ids,
$output = (string) $output->__toString(); $escape
} else { );
trigger_error("html_options: output is an object of class '". get_class($output) ."' without __toString() method", E_USER_NOTICE); }
return ''; }
} if (!empty($params[ 'assign' ])) {
} else { $template->assign($params[ 'assign' ], $_html_result);
$output = (string) $output; } else {
} return implode("\n", $_html_result);
}
if ($labels) { }
if ($label_ids) {
$_id = smarty_function_escape_special_chars(preg_replace('![^\w\-\.]!' . Smarty::$_UTF8_MODIFIER, '_', $name . '_' . $value)); /**
$_output .= '<label for="' . $_id . '">'; * @param $name
} else { * @param $value
$_output .= '<label>'; * @param $output
} * @param $selected
} * @param $extra
* @param $separator
$name = smarty_function_escape_special_chars($name); * @param $labels
$value = smarty_function_escape_special_chars($value); * @param $label_ids
if ($escape) { * @param bool $escape
$output = smarty_function_escape_special_chars($output); *
} * @return string
*/
$_output .= '<input type="checkbox" name="' . $name . '[]" value="' . $value . '"'; function smarty_function_html_checkboxes_output(
$name,
if ($labels && $label_ids) { $value,
$_output .= ' id="' . $_id . '"'; $output,
} $selected,
$extra,
if (is_array($selected)) { $separator,
if (isset($selected[$value])) { $labels,
$_output .= ' checked="checked"'; $label_ids,
} $escape = true
} elseif ($value === $selected) { ) {
$_output .= ' checked="checked"'; $_output = '';
} if (is_object($value)) {
if (method_exists($value, '__toString')) {
$_output .= $extra . ' />' . $output; $value = (string)$value->__toString();
if ($labels) { } else {
$_output .= '</label>'; trigger_error(
} 'html_options: value is an object of class \'' . get_class($value) .
'\' without __toString() method',
$_output .= $separator; E_USER_NOTICE
return $_output; );
} 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;
}

View file

@ -1,159 +1,158 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsFunction * @subpackage PluginsFunction
*/ */
/**
/** * Smarty {html_image} function plugin
* Smarty {html_image} function plugin * Type: function
* * Name: html_image
* Type: function<br> * Date: Feb 24, 2003
* Name: html_image<br> * Purpose: format HTML tags for the image
* Date: Feb 24, 2003<br> * Examples: {html_image file="/images/masthead.gif"}
* Purpose: format HTML tags for the image<br> * Output: <img src="/images/masthead.gif" width=400 height=23>
* Examples: {html_image file="/images/masthead.gif"}<br> * Params:
* Output: <img src="/images/masthead.gif" width=400 height=23><br> *
* Params: * - file - (required) - file (and path) of image
* <pre> * - height - (optional) - image height (default actual height)
* - file - (required) - file (and path) of image * - width - (optional) - image width (default actual width)
* - height - (optional) - image height (default actual height) * - basedir - (optional) - base directory for absolute paths, default is environment variable DOCUMENT_ROOT
* - width - (optional) - image width (default actual width) * - path_prefix - prefix for path output (optional, default empty)
* - basedir - (optional) - base directory for absolute paths, default is environment variable DOCUMENT_ROOT *
* - path_prefix - prefix for path output (optional, default empty) * @link http://www.smarty.net/manual/en/language.function.html.image.php {html_image}
* </pre> * (Smarty online manual)
* * @author Monte Ohrt <monte at ohrt dot com>
* @link http://www.smarty.net/manual/en/language.function.html.image.php {html_image} * @author credits to Duda <duda@big.hu>
* (Smarty online manual) * @version 1.0
* @author Monte Ohrt <monte at ohrt dot com> *
* @author credits to Duda <duda@big.hu> * @param array $params parameters
* @version 1.0 * @param Smarty_Internal_Template $template template object
* @param array $params parameters *
* @param Smarty_Internal_Template $template template object * @throws SmartyException
* @return string * @return string
* @uses smarty_function_escape_special_chars() * @uses smarty_function_escape_special_chars()
*/ */
function smarty_function_html_image($params, $template) function smarty_function_html_image($params, Smarty_Internal_Template $template)
{ {
require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); $template->_checkPlugins(
array(
$alt = ''; array(
$file = ''; 'function' => 'smarty_function_escape_special_chars',
$height = ''; 'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'
$width = ''; )
$extra = ''; )
$prefix = ''; );
$suffix = ''; $alt = '';
$path_prefix = ''; $file = '';
$basedir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : ''; $height = '';
foreach($params as $_key => $_val) { $width = '';
switch ($_key) { $extra = '';
case 'file': $prefix = '';
case 'height': $suffix = '';
case 'width': $path_prefix = '';
case 'dpi': $basedir = isset($_SERVER[ 'DOCUMENT_ROOT' ]) ? $_SERVER[ 'DOCUMENT_ROOT' ] : '';
case 'path_prefix': foreach ($params as $_key => $_val) {
case 'basedir': switch ($_key) {
$$_key = $_val; case 'file':
break; case 'height':
case 'width':
case 'alt': case 'dpi':
if (!is_array($_val)) { case 'path_prefix':
$$_key = smarty_function_escape_special_chars($_val); case 'basedir':
} else { $$_key = $_val;
throw new SmartyException ("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE); break;
} case 'alt':
break; if (!is_array($_val)) {
$$_key = smarty_function_escape_special_chars($_val);
case 'link': } else {
case 'href': throw new SmartyException(
$prefix = '<a href="' . $_val . '">'; "html_image: extra attribute '{$_key}' cannot be an array",
$suffix = '</a>'; E_USER_NOTICE
break; );
}
default: break;
if (!is_array($_val)) { case 'link':
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; case 'href':
} else { $prefix = '<a href="' . $_val . '">';
throw new SmartyException ("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE); $suffix = '</a>';
} break;
break; default:
} if (!is_array($_val)) {
} $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"';
} else {
if (empty($file)) { throw new SmartyException(
trigger_error("html_image: missing 'file' parameter", E_USER_NOTICE); "html_image: extra attribute '{$_key}' cannot be an array",
return; E_USER_NOTICE
} );
}
if ($file[0] == '/') { break;
$_image_path = $basedir . $file; }
} else { }
$_image_path = $file; if (empty($file)) {
} trigger_error('html_image: missing \'file\' parameter', E_USER_NOTICE);
return;
// strip file protocol }
if (stripos($params['file'], 'file://') === 0) { if ($file[ 0 ] === '/') {
$params['file'] = substr($params['file'], 7); $_image_path = $basedir . $file;
} } else {
$_image_path = $file;
$protocol = strpos($params['file'], '://'); }
if ($protocol !== false) { // strip file protocol
$protocol = strtolower(substr($params['file'], 0, $protocol)); if (stripos($params[ 'file' ], 'file://') === 0) {
} $params[ 'file' ] = substr($params[ 'file' ], 7);
}
if (isset($template->smarty->security_policy)) { $protocol = strpos($params[ 'file' ], '://');
if ($protocol) { if ($protocol !== false) {
// remote resource (or php stream, …) $protocol = strtolower(substr($params[ 'file' ], 0, $protocol));
if(!$template->smarty->security_policy->isTrustedUri($params['file'])) { }
return; if (isset($template->smarty->security_policy)) {
} if ($protocol) {
} else { // remote resource (or php stream, …)
// local file if (!$template->smarty->security_policy->isTrustedUri($params[ 'file' ])) {
if(!$template->smarty->security_policy->isTrustedResourceDir($params['file'])) { return;
return; }
} } else {
} // local file
} if (!$template->smarty->security_policy->isTrustedResourceDir($_image_path)) {
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)) { if (!isset($params[ 'width' ]) || !isset($params[ 'height' ])) {
trigger_error("html_image: unable to find '$_image_path'", E_USER_NOTICE); // FIXME: (rodneyrehm) getimagesize() loads the complete file off a remote resource, use custom [jpg,png,gif]header reader!
return; if (!$_image_data = @getimagesize($_image_path)) {
} else if (!is_readable($_image_path)) { if (!file_exists($_image_path)) {
trigger_error("html_image: unable to read '$_image_path'", E_USER_NOTICE); trigger_error("html_image: unable to find '{$_image_path}'", E_USER_NOTICE);
return; return;
} else { } elseif (!is_readable($_image_path)) {
trigger_error("html_image: '$_image_path' is not a valid image file", E_USER_NOTICE); trigger_error("html_image: unable to read '{$_image_path}'", E_USER_NOTICE);
return; 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[ 'width' ])) {
if (!isset($params['height'])) { $width = $_image_data[ 0 ];
$height = $_image_data[1]; }
} if (!isset($params[ 'height' ])) {
} $height = $_image_data[ 1 ];
}
if (isset($params['dpi'])) { }
if (strstr($_SERVER['HTTP_USER_AGENT'], 'Mac')) { if (isset($params[ 'dpi' ])) {
// FIXME: (rodneyrehm) wrong dpi assumption if (strstr($_SERVER[ 'HTTP_USER_AGENT' ], 'Mac')) {
// don't know who thought this up… even if it was true in 1998, it's definitely wrong in 2011. // FIXME: (rodneyrehm) wrong dpi assumption
$dpi_default = 72; // don't know who thought this up… even if it was true in 1998, it's definitely wrong in 2011.
} else { $dpi_default = 72;
$dpi_default = 96; } else {
} $dpi_default = 96;
$_resize = $dpi_default / $params['dpi']; }
$width = round($width * $_resize); $_resize = $dpi_default / $params[ 'dpi' ];
$height = round($height * $_resize); $width = round($width * $_resize);
} $height = round($height * $_resize);
}
return $prefix . '<img src="' . $path_prefix . $file . '" alt="' . $alt . '" width="' . $width . '" height="' . $height . '"' . $extra . ' />' . $suffix; return $prefix . '<img src="' . $path_prefix . $file . '" alt="' . $alt . '" width="' . $width . '" height="' .
} $height . '"' . $extra . ' />' . $suffix;
}
?>

View file

@ -1,193 +1,230 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsFunction * @subpackage PluginsFunction
*/ */
/**
/** * Smarty {html_options} function plugin
* Smarty {html_options} function plugin * Type: function
* * Name: html_options
* Type: function<br> * Purpose: Prints the list of <option> tags generated from
* Name: html_options<br> * the passed parameters
* Purpose: Prints the list of <option> tags generated from * Params:
* the passed parameters<br> *
* Params: * - name (optional) - string default "select"
* <pre> * - values (required) - if no options supplied) - array
* - name (optional) - string default "select" * - options (required) - if no values supplied) - associative array
* - values (required) - if no options supplied) - array * - selected (optional) - string default not set
* - options (required) - if no values supplied) - associative array * - output (required) - if not options supplied) - array
* - selected (optional) - string default not set * - id (optional) - string default not set
* - output (required) - if not options supplied) - array * - class (optional) - string default not set
* - id (optional) - string default not set *
* - class (optional) - string default not set * @link http://www.smarty.net/manual/en/language.function.html.options.php {html_image}
* </pre> * (Smarty online manual)
* * @author Monte Ohrt <monte at ohrt dot com>
* @link http://www.smarty.net/manual/en/language.function.html.options.php {html_image} * @author Ralf Strehle (minor optimization) <ralf dot strehle at yahoo dot de>
* (Smarty online manual) *
* @author Monte Ohrt <monte at ohrt dot com> * @param array $params parameters
* @author Ralf Strehle (minor optimization) <ralf dot strehle at yahoo dot de> *
* @param array $params parameters * @param \Smarty_Internal_Template $template
* @param Smarty_Internal_Template $template template object *
* @return string * @return string
* @uses smarty_function_escape_special_chars() * @uses smarty_function_escape_special_chars()
*/ * @throws \SmartyException
function smarty_function_html_options($params, $template) */
{ function smarty_function_html_options($params, Smarty_Internal_Template $template)
require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); {
$template->_checkPlugins(
$name = null; array(
$values = null; array(
$options = null; 'function' => 'smarty_function_escape_special_chars',
$selected = null; 'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'
$output = null; )
$id = null; )
$class = null; );
$name = null;
$extra = ''; $values = null;
$options = null;
foreach ($params as $_key => $_val) { $selected = null;
switch ($_key) { $output = null;
case 'name': $id = null;
case 'class': $class = null;
case 'id': $extra = '';
$$_key = (string) $_val; foreach ($params as $_key => $_val) {
break; switch ($_key) {
case 'name':
case 'options': case 'class':
$options = (array) $_val; case 'id':
break; $$_key = (string)$_val;
break;
case 'values': case 'options':
case 'output': $options = (array)$_val;
$$_key = array_values((array) $_val); break;
break; case 'values':
case 'output':
case 'selected': $$_key = array_values((array)$_val);
if (is_array($_val)) { break;
$selected = array(); case 'selected':
foreach ($_val as $_sel) { if (is_array($_val)) {
if (is_object($_sel)) { $selected = array();
if (method_exists($_sel, "__toString")) { foreach ($_val as $_sel) {
$_sel = smarty_function_escape_special_chars((string) $_sel->__toString()); if (is_object($_sel)) {
} else { if (method_exists($_sel, '__toString')) {
trigger_error("html_options: selected attribute contains an object of class '". get_class($_sel) ."' without __toString() method", E_USER_NOTICE); $_sel = smarty_function_escape_special_chars((string)$_sel->__toString());
continue; } else {
} trigger_error(
} else { 'html_options: selected attribute contains an object of class \'' .
$_sel = smarty_function_escape_special_chars((string) $_sel); get_class($_sel) . '\' without __toString() method',
} E_USER_NOTICE
$selected[$_sel] = true; );
} continue;
} elseif (is_object($_val)) { }
if (method_exists($_val, "__toString")) { } else {
$selected = smarty_function_escape_special_chars((string) $_val->__toString()); $_sel = smarty_function_escape_special_chars((string)$_sel);
} else { }
trigger_error("html_options: selected attribute is an object of class '". get_class($_val) ."' without __toString() method", E_USER_NOTICE); $selected[ $_sel ] = true;
} }
} else { } elseif (is_object($_val)) {
$selected = smarty_function_escape_special_chars((string) $_val); if (method_exists($_val, '__toString')) {
} $selected = smarty_function_escape_special_chars((string)$_val->__toString());
break; } else {
trigger_error(
case 'strict': break; 'html_options: selected attribute is an object of class \'' . get_class($_val) .
'\' without __toString() method',
case 'disabled': E_USER_NOTICE
case 'readonly': );
if (!empty($params['strict'])) { }
if (!is_scalar($_val)) { } else {
trigger_error("html_options: $_key attribute must be a scalar, only boolean true or string '$_key' will actually add the attribute", E_USER_NOTICE); $selected = smarty_function_escape_special_chars((string)$_val);
} }
break;
if ($_val === true || $_val === $_key) { case 'strict':
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"'; break;
} case 'disabled':
case 'readonly':
break; if (!empty($params[ 'strict' ])) {
} if (!is_scalar($_val)) {
// omit break; to fall through! trigger_error(
"html_options: {$_key} attribute must be a scalar, only boolean true or string '{$_key}' will actually add the attribute",
default: E_USER_NOTICE
if (!is_array($_val)) { );
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; }
} else { if ($_val === true || $_val === $_key) {
trigger_error("html_options: extra attribute '$_key' cannot be an array", E_USER_NOTICE); $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"';
} }
break; break;
} }
} // omit break; to fall through!
// no break
if (!isset($options) && !isset($values)) { default:
/* raise error here? */ if (!is_array($_val)) {
return ''; $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"';
} } else {
trigger_error("html_options: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE);
$_html_result = ''; }
$_idx = 0; break;
}
if (isset($options)) { }
foreach ($options as $_key => $_val) { if (!isset($options) && !isset($values)) {
$_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected, $id, $class, $_idx); /* raise error here? */
} return '';
} else { }
foreach ($values as $_i => $_key) { $_html_result = '';
$_val = isset($output[$_i]) ? $output[$_i] : ''; $_idx = 0;
$_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected, $id, $class, $_idx); if (isset($options)) {
} foreach ($options as $_key => $_val) {
} $_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected, $id, $class, $_idx);
}
if (!empty($name)) { } else {
$_html_class = !empty($class) ? ' class="'.$class.'"' : ''; foreach ($values as $_i => $_key) {
$_html_id = !empty($id) ? ' id="'.$id.'"' : ''; $_val = isset($output[ $_i ]) ? $output[ $_i ] : '';
$_html_result = '<select name="' . $name . '"' . $_html_class . $_html_id . $extra . '>' . "\n" . $_html_result . '</select>' . "\n"; $_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected, $id, $class, $_idx);
} }
}
return $_html_result; if (!empty($name)) {
} $_html_class = !empty($class) ? ' class="' . $class . '"' : '';
$_html_id = !empty($id) ? ' id="' . $id . '"' : '';
function smarty_function_html_options_optoutput($key, $value, $selected, $id, $class, &$idx) $_html_result =
{ '<select name="' . $name . '"' . $_html_class . $_html_id . $extra . '>' . "\n" . $_html_result .
if (!is_array($value)) { '</select>' . "\n";
$_key = smarty_function_escape_special_chars($key); }
$_html_result = '<option value="' . $_key . '"'; return $_html_result;
if (is_array($selected)) { }
if (isset($selected[$_key])) {
$_html_result .= ' selected="selected"'; /**
} * @param $key
} elseif ($_key === $selected) { * @param $value
$_html_result .= ' selected="selected"'; * @param $selected
} * @param $id
$_html_class = !empty($class) ? ' class="'.$class.' option"' : ''; * @param $class
$_html_id = !empty($id) ? ' id="'.$id.'-'.$idx.'"' : ''; * @param $idx
if (is_object($value)) { *
if (method_exists($value, "__toString")) { * @return string
$value = smarty_function_escape_special_chars((string) $value->__toString()); */
} else { function smarty_function_html_options_optoutput($key, $value, $selected, $id, $class, &$idx)
trigger_error("html_options: value is an object of class '". get_class($value) ."' without __toString() method", E_USER_NOTICE); {
return ''; if (!is_array($value)) {
} $_key = smarty_function_escape_special_chars($key);
} else { $_html_result = '<option value="' . $_key . '"';
$value = smarty_function_escape_special_chars((string) $value); if (is_array($selected)) {
} if (isset($selected[ $_key ])) {
$_html_result .= $_html_class . $_html_id . '>' . $value . '</option>' . "\n"; $_html_result .= ' selected="selected"';
$idx++; }
} else { } elseif ($_key === $selected) {
$_idx = 0; $_html_result .= ' selected="selected"';
$_html_result = smarty_function_html_options_optgroup($key, $value, $selected, !empty($id) ? ($id.'-'.$idx) : null, $class, $_idx); }
$idx++; $_html_class = !empty($class) ? ' class="' . $class . ' option"' : '';
} $_html_id = !empty($id) ? ' id="' . $id . '-' . $idx . '"' : '';
return $_html_result; if (is_object($value)) {
} if (method_exists($value, '__toString')) {
$value = smarty_function_escape_special_chars((string)$value->__toString());
function smarty_function_html_options_optgroup($key, $values, $selected, $id, $class, &$idx) } else {
{ trigger_error(
$optgroup_html = '<optgroup label="' . smarty_function_escape_special_chars($key) . '">' . "\n"; 'html_options: value is an object of class \'' . get_class($value) .
foreach ($values as $key => $value) { '\' without __toString() method',
$optgroup_html .= smarty_function_html_options_optoutput($key, $value, $selected, $id, $class, $idx); E_USER_NOTICE
} );
$optgroup_html .= "</optgroup>\n"; return '';
return $optgroup_html; }
} } 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;
}
/**
* @param $key
* @param $values
* @param $selected
* @param $id
* @param $class
* @param $idx
*
* @return string
*/
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;
}

View file

@ -1,217 +1,266 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsFunction * @subpackage PluginsFunction
*/ */
/**
/** * Smarty {html_radios} function plugin
* Smarty {html_radios} function plugin * File: function.html_radios.php
* * Type: function
* File: function.html_radios.php<br> * Name: html_radios
* Type: function<br> * Date: 24.Feb.2003
* Name: html_radios<br> * Purpose: Prints out a list of radio input types
* Date: 24.Feb.2003<br> * Params:
* Purpose: Prints out a list of radio input types<br> *
* Params: * - name (optional) - string default "radio"
* <pre> * - values (required) - array
* - name (optional) - string default "radio" * - options (required) - associative array
* - values (required) - array * - checked (optional) - array default not set
* - options (required) - associative array * - separator (optional) - ie <br> or &nbsp;
* - checked (optional) - array default not set * - output (optional) - the output next to each radio button
* - separator (optional) - ie <br> or &nbsp; * - assign (optional) - assign the output as an array to this variable
* - output (optional) - the output next to each radio button * - escape (optional) - escape the content (not value), defaults to true
* - assign (optional) - assign the output as an array to this variable *
* - escape (optional) - escape the content (not value), defaults to true * Examples:
* </pre> *
* Examples: * {html_radios values=$ids output=$names}
* <pre> * {html_radios values=$ids name='box' separator='<br>' output=$names}
* {html_radios values=$ids output=$names} * {html_radios values=$ids checked=$checked separator='<br>' output=$names}
* {html_radios values=$ids name='box' separator='<br>' output=$names} *
* {html_radios values=$ids checked=$checked separator='<br>' output=$names} * @link http://smarty.php.net/manual/en/language.function.html.radios.php {html_radios}
* </pre> * (Smarty online manual)
* * @author Christopher Kvarme <christopher.kvarme@flashjab.com>
* @link http://smarty.php.net/manual/en/language.function.html.radios.php {html_radios} * @author credits to Monte Ohrt <monte at ohrt dot com>
* (Smarty online manual) * @version 1.0
* @author Christopher Kvarme <christopher.kvarme@flashjab.com> *
* @author credits to Monte Ohrt <monte at ohrt dot com> * @param array $params parameters
* @version 1.0 * @param Smarty_Internal_Template $template template object
* @param array $params parameters *
* @param Smarty_Internal_Template $template template object * @return string
* @return string * @uses smarty_function_escape_special_chars()
* @uses smarty_function_escape_special_chars() * @throws \SmartyException
*/ */
function smarty_function_html_radios($params, $template) function smarty_function_html_radios($params, Smarty_Internal_Template $template)
{ {
require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); $template->_checkPlugins(
array(
$name = 'radio'; array(
$values = null; 'function' => 'smarty_function_escape_special_chars',
$options = null; 'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'
$selected = null; )
$separator = ''; )
$escape = true; );
$labels = true; $name = 'radio';
$label_ids = false; $values = null;
$output = null; $options = null;
$extra = ''; $selected = null;
$separator = '';
foreach($params as $_key => $_val) { $escape = true;
switch ($_key) { $labels = true;
case 'name': $label_ids = false;
case 'separator': $output = null;
$$_key = (string) $_val; $extra = '';
break; foreach ($params as $_key => $_val) {
switch ($_key) {
case 'checked': case 'name':
case 'selected': case 'separator':
if (is_array($_val)) { $$_key = (string)$_val;
trigger_error('html_radios: the "' . $_key . '" attribute cannot be an array', E_USER_WARNING); break;
} elseif (is_object($_val)) { case 'checked':
if (method_exists($_val, "__toString")) { case 'selected':
$selected = smarty_function_escape_special_chars((string) $_val->__toString()); if (is_array($_val)) {
} else { trigger_error('html_radios: the "' . $_key . '" attribute cannot be an array', E_USER_WARNING);
trigger_error("html_radios: selected attribute is an object of class '". get_class($_val) ."' without __toString() method", E_USER_NOTICE); } elseif (is_object($_val)) {
} if (method_exists($_val, '__toString')) {
} else { $selected = smarty_function_escape_special_chars((string)$_val->__toString());
$selected = (string) $_val; } else {
} trigger_error(
break; 'html_radios: selected attribute is an object of class \'' . get_class($_val) .
'\' without __toString() method',
case 'escape': E_USER_NOTICE
case 'labels': );
case 'label_ids': }
$$_key = (bool) $_val; } else {
break; $selected = (string)$_val;
}
case 'options': break;
$$_key = (array) $_val; case 'escape':
break; case 'labels':
case 'label_ids':
case 'values': $$_key = (bool)$_val;
case 'output': break;
$$_key = array_values((array) $_val); case 'options':
break; $$_key = (array)$_val;
break;
case 'radios': case 'values':
trigger_error('html_radios: the use of the "radios" attribute is deprecated, use "options" instead', E_USER_WARNING); case 'output':
$options = (array) $_val; $$_key = array_values((array)$_val);
break; break;
case 'radios':
case 'assign': trigger_error(
break; 'html_radios: the use of the "radios" attribute is deprecated, use "options" instead',
E_USER_WARNING
case 'strict': break; );
$options = (array)$_val;
case 'disabled': break;
case 'readonly': case 'assign':
if (!empty($params['strict'])) { break;
if (!is_scalar($_val)) { case 'strict':
trigger_error("html_options: $_key attribute must be a scalar, only boolean true or string '$_key' will actually add the attribute", E_USER_NOTICE); break;
} case 'disabled':
case 'readonly':
if ($_val === true || $_val === $_key) { if (!empty($params[ 'strict' ])) {
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"'; if (!is_scalar($_val)) {
} trigger_error(
"html_options: {$_key} attribute must be a scalar, only boolean true or string '$_key' will actually add the attribute",
break; E_USER_NOTICE
} );
// omit break; to fall through! }
if ($_val === true || $_val === $_key) {
default: $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"';
if (!is_array($_val)) { }
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; break;
} else { }
trigger_error("html_radios: extra attribute '$_key' cannot be an array", E_USER_NOTICE); // omit break; to fall through!
} // no break
break; default:
} if (!is_array($_val)) {
} $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"';
} else {
if (!isset($options) && !isset($values)) { trigger_error("html_radios: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE);
/* raise error here? */ }
return ''; break;
} }
}
$_html_result = array(); if (!isset($options) && !isset($values)) {
/* raise error here? */
if (isset($options)) { return '';
foreach ($options as $_key => $_val) { }
$_html_result[] = smarty_function_html_radios_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids, $escape); $_html_result = array();
} if (isset($options)) {
} else { foreach ($options as $_key => $_val) {
foreach ($values as $_i => $_key) { $_html_result[] =
$_val = isset($output[$_i]) ? $output[$_i] : ''; smarty_function_html_radios_output(
$_html_result[] = smarty_function_html_radios_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids, $escape); $name,
} $_key,
} $_val,
$selected,
if (!empty($params['assign'])) { $extra,
$template->assign($params['assign'], $_html_result); $separator,
} else { $labels,
return implode("\n", $_html_result); $label_ids,
} $escape
} );
}
function smarty_function_html_radios_output($name, $value, $output, $selected, $extra, $separator, $labels, $label_ids, $escape) } else {
{ foreach ($values as $_i => $_key) {
$_output = ''; $_val = isset($output[ $_i ]) ? $output[ $_i ] : '';
$_html_result[] =
if (is_object($value)) { smarty_function_html_radios_output(
if (method_exists($value, "__toString")) { $name,
$value = (string) $value->__toString(); $_key,
} else { $_val,
trigger_error("html_options: value is an object of class '". get_class($value) ."' without __toString() method", E_USER_NOTICE); $selected,
return ''; $extra,
} $separator,
} else { $labels,
$value = (string) $value; $label_ids,
} $escape
);
if (is_object($output)) { }
if (method_exists($output, "__toString")) { }
$output = (string) $output->__toString(); if (!empty($params[ 'assign' ])) {
} else { $template->assign($params[ 'assign' ], $_html_result);
trigger_error("html_options: output is an object of class '". get_class($output) ."' without __toString() method", E_USER_NOTICE); } else {
return ''; return implode("\n", $_html_result);
} }
} else { }
$output = (string) $output;
} /**
* @param $name
if ($labels) { * @param $value
if ($label_ids) { * @param $output
$_id = smarty_function_escape_special_chars(preg_replace('![^\w\-\.]!' . Smarty::$_UTF8_MODIFIER, '_', $name . '_' . $value)); * @param $selected
$_output .= '<label for="' . $_id . '">'; * @param $extra
} else { * @param $separator
$_output .= '<label>'; * @param $labels
} * @param $label_ids
} * @param $escape
*
$name = smarty_function_escape_special_chars($name); * @return string
$value = smarty_function_escape_special_chars($value); */
if ($escape) { function smarty_function_html_radios_output(
$output = smarty_function_escape_special_chars($output); $name,
} $value,
$output,
$_output .= '<input type="radio" name="' . $name . '" value="' . $value . '"'; $selected,
$extra,
if ($labels && $label_ids) { $separator,
$_output .= ' id="' . $_id . '"'; $labels,
} $label_ids,
$escape
if ($value === $selected) { ) {
$_output .= ' checked="checked"'; $_output = '';
} if (is_object($value)) {
if (method_exists($value, '__toString')) {
$_output .= $extra . ' />' . $output; $value = (string)$value->__toString();
if ($labels) { } else {
$_output .= '</label>'; trigger_error(
} 'html_options: value is an object of class \'' . get_class($value) .
'\' without __toString() method',
$_output .= $separator; E_USER_NOTICE
return $_output; );
} 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;
}

View file

@ -1,394 +1,388 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsFunction * @subpackage PluginsFunction
*/ */
/**
/** * Smarty {html_select_date} plugin
* @ignore * Type: function
*/ * Name: html_select_date
require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); * Purpose: Prints the dropdowns for date selection.
/** * ChangeLog:
* @ignore *
*/ * - 1.0 initial release
require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'); * - 1.1 added support for +/- N syntax for begin
* and end year values. (Monte)
/** * - 1.2 added support for yyyy-mm-dd syntax for
* Smarty {html_select_date} plugin * time value. (Jan Rosier)
* * - 1.3 added support for choosing format for
* Type: function<br> * month values (Gary Loescher)
* Name: html_select_date<br> * - 1.3.1 added support for choosing format for
* Purpose: Prints the dropdowns for date selection. * day values (Marcus Bointon)
* * - 1.3.2 support negative timestamps, force year
* ChangeLog: * dropdown to include given date unless explicitly set (Monte)
* <pre> * - 1.3.4 fix behaviour of 0000-00-00 00:00:00 dates to match that
* - 1.0 initial release * of 0000-00-00 dates (cybot, boots)
* - 1.1 added support for +/- N syntax for begin * - 2.0 complete rewrite for performance,
* and end year values. (Monte) * added attributes month_names, *_id
* - 1.2 added support for yyyy-mm-dd syntax for *
* time value. (Jan Rosier) * @link http://www.smarty.net/manual/en/language.function.html.select.date.php {html_select_date}
* - 1.3 added support for choosing format for * (Smarty online manual)
* month values (Gary Loescher) * @version 2.0
* - 1.3.1 added support for choosing format for * @author Andrei Zmievski
* day values (Marcus Bointon) * @author Monte Ohrt <monte at ohrt dot com>
* - 1.3.2 support negative timestamps, force year * @author Rodney Rehm
* 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 * @param array $params parameters
* of 0000-00-00 dates (cybot, boots) *
* - 2.0 complete rewrite for performance, * @param \Smarty_Internal_Template $template
* added attributes month_names, *_id *
* </pre> * @return string
* * @throws \SmartyException
* @link http://www.smarty.net/manual/en/language.function.html.select.date.php {html_select_date} */
* (Smarty online manual) function smarty_function_html_select_date($params, Smarty_Internal_Template $template)
* @version 2.0 {
* @author Andrei Zmievski $template->_checkPlugins(
* @author Monte Ohrt <monte at ohrt dot com> array(
* @author Rodney Rehm array(
* @param array $params parameters 'function' => 'smarty_function_escape_special_chars',
* @param Smarty_Internal_Template $template template object 'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'
* @return string )
*/ )
function smarty_function_html_select_date($params, $template) );
{ // generate timestamps used for month names only
// generate timestamps used for month names only static $_month_timestamps = null;
static $_month_timestamps = null; static $_current_year = null;
static $_current_year = null; if ($_month_timestamps === null) {
if ($_month_timestamps === null) { $_current_year = date('Y');
$_current_year = date('Y'); $_month_timestamps = array();
$_month_timestamps = array(); for ($i = 1; $i <= 12; $i++) {
for ($i = 1; $i <= 12; $i++) { $_month_timestamps[ $i ] = mktime(0, 0, 0, $i, 1, 2000);
$_month_timestamps[$i] = mktime(0, 0, 0, $i, 1, 2000); }
} }
} /* Default values. */
$prefix = 'Date_';
/* Default values. */ $start_year = null;
$prefix = "Date_"; $end_year = null;
$start_year = null; $display_days = true;
$end_year = null; $display_months = true;
$display_days = true; $display_years = true;
$display_months = true; $month_format = '%B';
$display_years = true; /* Write months as numbers by default GL */
$month_format = "%B"; $month_value_format = '%m';
/* Write months as numbers by default GL */ $day_format = '%02d';
$month_value_format = "%m"; /* Write day values using this format MB */
$day_format = "%02d"; $day_value_format = '%d';
/* Write day values using this format MB */ $year_as_text = false;
$day_value_format = "%d"; /* Display years in reverse order? Ie. 2000,1999,.... */
$year_as_text = false; $reverse_years = false;
/* Display years in reverse order? Ie. 2000,1999,.... */ /* Should the select boxes be part of an array when returned from PHP?
$reverse_years = false; e.g. setting it to "birthday", would create "birthday[Day]",
/* Should the select boxes be part of an array when returned from PHP? "birthday[Month]" & "birthday[Year]". Can be combined with prefix */
e.g. setting it to "birthday", would create "birthday[Day]", $field_array = null;
"birthday[Month]" & "birthday[Year]". Can be combined with prefix */ /* <select size>'s of the different <select> tags.
$field_array = null; If not set, uses default dropdown. */
/* <select size>'s of the different <select> tags. $day_size = null;
If not set, uses default dropdown. */ $month_size = null;
$day_size = null; $year_size = null;
$month_size = null; /* Unparsed attributes common to *ALL* the <select>/<input> tags.
$year_size = null; An example might be in the template: all_extra ='class ="foo"'. */
/* Unparsed attributes common to *ALL* the <select>/<input> tags. $all_extra = null;
An example might be in the template: all_extra ='class ="foo"'. */ /* Separate attributes for the tags. */
$all_extra = null; $day_extra = null;
/* Separate attributes for the tags. */ $month_extra = null;
$day_extra = null; $year_extra = null;
$month_extra = null; /* Order in which to display the fields.
$year_extra = null; "D" -> day, "M" -> month, "Y" -> year. */
/* Order in which to display the fields. $field_order = 'MDY';
"D" -> day, "M" -> month, "Y" -> year. */ /* String printed between the different fields. */
$field_order = 'MDY'; $field_separator = "\n";
/* String printed between the different fields. */ $option_separator = "\n";
$field_separator = "\n"; $time = null;
$option_separator = "\n"; // $all_empty = null;
$time = null; // $day_empty = null;
// $all_empty = null; // $month_empty = null;
// $day_empty = null; // $year_empty = null;
// $month_empty = null; $extra_attrs = '';
// $year_empty = null; $all_id = null;
$extra_attrs = ''; $day_id = null;
$all_id = null; $month_id = null;
$day_id = null; $year_id = null;
$month_id = null; foreach ($params as $_key => $_value) {
$year_id = null; switch ($_key) {
case 'time':
foreach ($params as $_key => $_value) { if (!is_array($_value) && $_value !== null) {
switch ($_key) { $template->_checkPlugins(
case 'time': array(
if (!is_array($_value) && $_value !== null) { array(
$time = smarty_make_timestamp($_value); 'function' => 'smarty_make_timestamp',
} 'file' => SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'
break; )
)
case 'month_names': );
if (is_array($_value) && count($_value) == 12) { $time = smarty_make_timestamp($_value);
$$_key = $_value; }
} else { break;
trigger_error("html_select_date: month_names must be an array of 12 strings", E_USER_NOTICE); case 'month_names':
} if (is_array($_value) && count($_value) === 12) {
break; $$_key = $_value;
} else {
case 'prefix': trigger_error('html_select_date: month_names must be an array of 12 strings', E_USER_NOTICE);
case 'field_array': }
case 'start_year': break;
case 'end_year': case 'prefix':
case 'day_format': case 'field_array':
case 'day_value_format': case 'start_year':
case 'month_format': case 'end_year':
case 'month_value_format': case 'day_format':
case 'day_size': case 'day_value_format':
case 'month_size': case 'month_format':
case 'year_size': case 'month_value_format':
case 'all_extra': case 'day_size':
case 'day_extra': case 'month_size':
case 'month_extra': case 'year_size':
case 'year_extra': case 'all_extra':
case 'field_order': case 'day_extra':
case 'field_separator': case 'month_extra':
case 'option_separator': case 'year_extra':
case 'all_empty': case 'field_order':
case 'month_empty': case 'field_separator':
case 'day_empty': case 'option_separator':
case 'year_empty': case 'all_empty':
case 'all_id': case 'month_empty':
case 'month_id': case 'day_empty':
case 'day_id': case 'year_empty':
case 'year_id': case 'all_id':
$$_key = (string)$_value; case 'month_id':
break; case 'day_id':
case 'year_id':
case 'display_days': $$_key = (string)$_value;
case 'display_months': break;
case 'display_years': case 'display_days':
case 'year_as_text': case 'display_months':
case 'reverse_years': case 'display_years':
$$_key = (bool)$_value; case 'year_as_text':
break; case 'reverse_years':
$$_key = (bool)$_value;
default: break;
if (!is_array($_value)) { default:
$extra_attrs .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_value) . '"'; if (!is_array($_value)) {
} else { $extra_attrs .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_value) . '"';
trigger_error("html_select_date: extra attribute '$_key' cannot be an array", E_USER_NOTICE); } else {
} trigger_error("html_select_date: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE);
break; }
} break;
} }
}
// Note: date() is faster than strftime() // Note: date() is faster than strftime()
// Note: explode(date()) is faster than date() date() date() // Note: explode(date()) is faster than date() date() date()
if (isset($params['time']) && is_array($params['time'])) { if (isset($params[ 'time' ]) && is_array($params[ 'time' ])) {
if (isset($params['time'][$prefix . 'Year'])) { if (isset($params[ 'time' ][ $prefix . 'Year' ])) {
// $_REQUEST[$field_array] given // $_REQUEST[$field_array] given
foreach (array('Y' => 'Year', 'm' => 'Month', 'd' => 'Day') as $_elementKey => $_elementName) { foreach (array(
$_variableName = '_' . strtolower($_elementName); 'Y' => 'Year',
$$_variableName = isset($params['time'][$prefix . $_elementName]) 'm' => 'Month',
? $params['time'][$prefix . $_elementName] 'd' => 'Day'
: date($_elementKey); ) as $_elementKey => $_elementName) {
} $_variableName = '_' . strtolower($_elementName);
$time = mktime(0, 0, 0, $_month, $_day, $_year); $$_variableName =
} elseif (isset($params['time'][$field_array][$prefix . 'Year'])) { isset($params[ 'time' ][ $prefix . $_elementName ]) ? $params[ 'time' ][ $prefix . $_elementName ] :
// $_REQUEST given date($_elementKey);
foreach (array('Y' => 'Year', 'm' => 'Month', 'd' => 'Day') as $_elementKey => $_elementName) { }
$_variableName = '_' . strtolower($_elementName); } elseif (isset($params[ 'time' ][ $field_array ][ $prefix . 'Year' ])) {
$$_variableName = isset($params['time'][$field_array][$prefix . $_elementName]) // $_REQUEST given
? $params['time'][$field_array][$prefix . $_elementName] foreach (array(
: date($_elementKey); 'Y' => 'Year',
} 'm' => 'Month',
$time = mktime(0, 0, 0, $_month, $_day, $_year); 'd' => 'Day'
} else { ) as $_elementKey => $_elementName) {
// no date found, use NOW $_variableName = '_' . strtolower($_elementName);
list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d')); $$_variableName = isset($params[ 'time' ][ $field_array ][ $prefix . $_elementName ]) ?
} $params[ 'time' ][ $field_array ][ $prefix . $_elementName ] : date($_elementKey);
} elseif ($time === null) { }
if (array_key_exists('time', $params)) { } else {
$_year = $_month = $_day = $time = null; // no date found, use NOW
} else { list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d'));
list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d')); }
} } elseif ($time === null) {
} else { if (array_key_exists('time', $params)) {
list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d', $time)); $_year = $_month = $_day = $time = null;
} } else {
list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d'));
// 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 } else {
foreach (array('start', 'end') as $key) { list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d', $time));
$key .= '_year'; }
$t = $$key; // make syntax "+N" or "-N" work with $start_year and $end_year
if ($t === null) { // Note preg_match('!^(\+|\-)\s*(\d+)$!', $end_year, $match) is slower than trim+substr
$$key = (int)$_current_year; foreach (array(
} else if ($t[0] == '+') { 'start',
$$key = (int)($_current_year + trim(substr($t, 1))); 'end'
} else if ($t[0] == '-') { ) as $key) {
$$key = (int)($_current_year - trim(substr($t, 1))); $key .= '_year';
} else { $t = $$key;
$$key = (int)$$key; if ($t === null) {
} $$key = (int)$_current_year;
} } elseif ($t[ 0 ] === '+') {
$$key = (int)($_current_year + (int)trim(substr($t, 1)));
// flip for ascending or descending } elseif ($t[ 0 ] === '-') {
if (($start_year > $end_year && !$reverse_years) || ($start_year < $end_year && $reverse_years)) { $$key = (int)($_current_year - (int)trim(substr($t, 1)));
$t = $end_year; } else {
$end_year = $start_year; $$key = (int)$$key;
$start_year = $t; }
} }
// flip for ascending or descending
// generate year <select> or <input> if (($start_year > $end_year && !$reverse_years) || ($start_year < $end_year && $reverse_years)) {
if ($display_years) { $t = $end_year;
$_html_years = ''; $end_year = $start_year;
$_extra = ''; $start_year = $t;
$_name = $field_array ? ($field_array . '[' . $prefix . 'Year]') : ($prefix . 'Year'); }
if ($all_extra) { // generate year <select> or <input>
$_extra .= ' ' . $all_extra; if ($display_years) {
} $_extra = '';
if ($year_extra) { $_name = $field_array ? ($field_array . '[' . $prefix . 'Year]') : ($prefix . 'Year');
$_extra .= ' ' . $year_extra; if ($all_extra) {
} $_extra .= ' ' . $all_extra;
}
if ($year_as_text) { if ($year_extra) {
$_html_years = '<input type="text" name="' . $_name . '" value="' . $_year . '" size="4" maxlength="4"' . $_extra . $extra_attrs . ' />'; $_extra .= ' ' . $year_extra;
} else { }
$_html_years = '<select name="' . $_name . '"'; if ($year_as_text) {
if ($year_id !== null || $all_id !== null) { $_html_years =
$_html_years .= ' id="' . smarty_function_escape_special_chars( '<input type="text" name="' . $_name . '" value="' . $_year . '" size="4" maxlength="4"' . $_extra .
$year_id !== null ? ( $year_id ? $year_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) $extra_attrs . ' />';
) . '"'; } else {
} $_html_years = '<select name="' . $_name . '"';
if ($year_size) { if ($year_id !== null || $all_id !== null) {
$_html_years .= ' size="' . $year_size . '"'; $_html_years .= ' id="' . smarty_function_escape_special_chars(
} $year_id !== null ?
$_html_years .= $_extra . $extra_attrs . '>' . $option_separator; ($year_id ? $year_id : $_name) :
($all_id ? ($all_id . $_name) :
if (isset($year_empty) || isset($all_empty)) { $_name)
$_html_years .= '<option value="">' . ( isset($year_empty) ? $year_empty : $all_empty ) . '</option>' . $option_separator; ) . '"';
} }
if ($year_size) {
$op = $start_year > $end_year ? -1 : 1; $_html_years .= ' size="' . $year_size . '"';
for ($i=$start_year; $op > 0 ? $i <= $end_year : $i >= $end_year; $i += $op) { }
$_html_years .= '<option value="' . $i . '"' $_html_years .= $_extra . $extra_attrs . '>' . $option_separator;
. ($_year == $i ? ' selected="selected"' : '') if (isset($year_empty) || isset($all_empty)) {
. '>' . $i . '</option>' . $option_separator; $_html_years .= '<option value="">' . (isset($year_empty) ? $year_empty : $all_empty) . '</option>' .
} $option_separator;
}
$_html_years .= '</select>'; $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;
// generate month <select> or <input> }
if ($display_months) { $_html_years .= '</select>';
$_html_month = ''; }
$_extra = ''; }
$_name = $field_array ? ($field_array . '[' . $prefix . 'Month]') : ($prefix . 'Month'); // generate month <select> or <input>
if ($all_extra) { if ($display_months) {
$_extra .= ' ' . $all_extra; $_extra = '';
} $_name = $field_array ? ($field_array . '[' . $prefix . 'Month]') : ($prefix . 'Month');
if ($month_extra) { if ($all_extra) {
$_extra .= ' ' . $month_extra; $_extra .= ' ' . $all_extra;
} }
if ($month_extra) {
$_html_months = '<select name="' . $_name . '"'; $_extra .= ' ' . $month_extra;
if ($month_id !== null || $all_id !== null) { }
$_html_months .= ' id="' . smarty_function_escape_special_chars( $_html_months = '<select name="' . $_name . '"';
$month_id !== null ? ( $month_id ? $month_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) if ($month_id !== null || $all_id !== null) {
) . '"'; $_html_months .= ' id="' . smarty_function_escape_special_chars(
} $month_id !== null ?
if ($month_size) { ($month_id ? $month_id : $_name) :
$_html_months .= ' size="' . $month_size . '"'; ($all_id ? ($all_id . $_name) :
} $_name)
$_html_months .= $_extra . $extra_attrs . '>' . $option_separator; ) . '"';
}
if (isset($month_empty) || isset($all_empty)) { if ($month_size) {
$_html_months .= '<option value="">' . ( isset($month_empty) ? $month_empty : $all_empty ) . '</option>' . $option_separator; $_html_months .= ' size="' . $month_size . '"';
} }
$_html_months .= $_extra . $extra_attrs . '>' . $option_separator;
for ($i = 1; $i <= 12; $i++) { if (isset($month_empty) || isset($all_empty)) {
$_val = sprintf('%02d', $i); $_html_months .= '<option value="">' . (isset($month_empty) ? $month_empty : $all_empty) . '</option>' .
$_text = isset($month_names) ? smarty_function_escape_special_chars($month_names[$i]) : ($month_format == "%m" ? $_val : strftime($month_format, $_month_timestamps[$i])); $option_separator;
$_value = $month_value_format == "%m" ? $_val : strftime($month_value_format, $_month_timestamps[$i]); }
$_html_months .= '<option value="' . $_value . '"' for ($i = 1; $i <= 12; $i++) {
. ($_val == $_month ? ' selected="selected"' : '') $_val = sprintf('%02d', $i);
. '>' . $_text . '</option>' . $option_separator; $_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 .= '</select>'; $_html_months .= '<option value="' . $_value . '"' . ($_val == $_month ? ' selected="selected"' : '') .
} '>' . $_text . '</option>' . $option_separator;
}
// generate day <select> or <input> $_html_months .= '</select>';
if ($display_days) { }
$_html_day = ''; // generate day <select> or <input>
$_extra = ''; if ($display_days) {
$_name = $field_array ? ($field_array . '[' . $prefix . 'Day]') : ($prefix . 'Day'); $_extra = '';
if ($all_extra) { $_name = $field_array ? ($field_array . '[' . $prefix . 'Day]') : ($prefix . 'Day');
$_extra .= ' ' . $all_extra; if ($all_extra) {
} $_extra .= ' ' . $all_extra;
if ($day_extra) { }
$_extra .= ' ' . $day_extra; if ($day_extra) {
} $_extra .= ' ' . $day_extra;
}
$_html_days = '<select name="' . $_name . '"'; $_html_days = '<select name="' . $_name . '"';
if ($day_id !== null || $all_id !== null) { if ($day_id !== null || $all_id !== null) {
$_html_days .= ' id="' . smarty_function_escape_special_chars( $_html_days .= ' id="' .
$day_id !== null ? ( $day_id ? $day_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) 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 . '"'; }
} if ($day_size) {
$_html_days .= $_extra . $extra_attrs . '>' . $option_separator; $_html_days .= ' size="' . $day_size . '"';
}
if (isset($day_empty) || isset($all_empty)) { $_html_days .= $_extra . $extra_attrs . '>' . $option_separator;
$_html_days .= '<option value="">' . ( isset($day_empty) ? $day_empty : $all_empty ) . '</option>' . $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); for ($i = 1; $i <= 31; $i++) {
$_text = $day_format == '%02d' ? $_val : sprintf($day_format, $i); $_val = sprintf('%02d', $i);
$_value = $day_value_format == '%02d' ? $_val : sprintf($day_value_format, $i); $_text = $day_format === '%02d' ? $_val : sprintf($day_format, $i);
$_html_days .= '<option value="' . $_value . '"' $_value = $day_value_format === '%02d' ? $_val : sprintf($day_value_format, $i);
. ($_val == $_day ? ' selected="selected"' : '') $_html_days .= '<option value="' . $_value . '"' . ($_val == $_day ? ' selected="selected"' : '') . '>' .
. '>' . $_text . '</option>' . $option_separator; $_text . '</option>' . $option_separator;
} }
$_html_days .= '</select>';
$_html_days .= '</select>'; }
} // order the fields for output
$_html = '';
// order the fields for output for ($i = 0; $i <= 2; $i++) {
$_html = ''; switch ($field_order[ $i ]) {
for ($i=0; $i <= 2; $i++) { case 'Y':
switch ($field_order[$i]) { case 'y':
case 'Y': if (isset($_html_years)) {
case 'y': if ($_html) {
if (isset($_html_years)) { $_html .= $field_separator;
if ($_html) { }
$_html .= $field_separator; $_html .= $_html_years;
} }
$_html .= $_html_years; break;
} case 'm':
break; case 'M':
if (isset($_html_months)) {
case 'm': if ($_html) {
case 'M': $_html .= $field_separator;
if (isset($_html_months)) { }
if ($_html) { $_html .= $_html_months;
$_html .= $field_separator; }
} break;
$_html .= $_html_months; case 'd':
} case 'D':
break; if (isset($_html_days)) {
if ($_html) {
case 'd': $_html .= $field_separator;
case 'D': }
if (isset($_html_days)) { $_html .= $_html_days;
if ($_html) { }
$_html .= $field_separator; break;
} }
$_html .= $_html_days; }
} return $_html;
break; }
}
}
return $_html;
}
?>

View file

@ -1,366 +1,354 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsFunction * @subpackage PluginsFunction
*/ */
/**
/** * Smarty {html_select_time} function plugin
* @ignore * Type: function
*/ * Name: html_select_time
require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); * Purpose: Prints the dropdowns for time selection
/** *
* @ignore * @link http://www.smarty.net/manual/en/language.function.html.select.time.php {html_select_time}
*/ * (Smarty online manual)
require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'); * @author Roberto Berto <roberto@berto.net>
* @author Monte Ohrt <monte AT ohrt DOT com>
/** *
* Smarty {html_select_time} function plugin * @param array $params parameters
* *
* Type: function<br> * @param \Smarty_Internal_Template $template
* Name: html_select_time<br> *
* Purpose: Prints the dropdowns for time selection * @return string
* * @uses smarty_make_timestamp()
* @link http://www.smarty.net/manual/en/language.function.html.select.time.php {html_select_time} * @throws \SmartyException
* (Smarty online manual) */
* @author Roberto Berto <roberto@berto.net> function smarty_function_html_select_time($params, Smarty_Internal_Template $template)
* @author Monte Ohrt <monte AT ohrt DOT com> {
* @param array $params parameters $template->_checkPlugins(
* @param Smarty_Internal_Template $template template object array(
* @return string array(
* @uses smarty_make_timestamp() 'function' => 'smarty_function_escape_special_chars',
*/ 'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'
function smarty_function_html_select_time($params, $template) )
{ )
$prefix = "Time_"; );
$field_array = null; $prefix = 'Time_';
$field_separator = "\n"; $field_array = null;
$option_separator = "\n"; $field_separator = "\n";
$time = null; $option_separator = "\n";
$time = null;
$display_hours = true; $display_hours = true;
$display_minutes = true; $display_minutes = true;
$display_seconds = true; $display_seconds = true;
$display_meridian = true; $display_meridian = true;
$hour_format = '%02d';
$hour_format = '%02d'; $hour_value_format = '%02d';
$hour_value_format = '%02d'; $minute_format = '%02d';
$minute_format = '%02d'; $minute_value_format = '%02d';
$minute_value_format = '%02d'; $second_format = '%02d';
$second_format = '%02d'; $second_value_format = '%02d';
$second_value_format = '%02d'; $hour_size = null;
$minute_size = null;
$hour_size = null; $second_size = null;
$minute_size = null; $meridian_size = null;
$second_size = null; $all_empty = null;
$meridian_size = null; $hour_empty = null;
$minute_empty = null;
$all_empty = null; $second_empty = null;
$hour_empty = null; $meridian_empty = null;
$minute_empty = null; $all_id = null;
$second_empty = null; $hour_id = null;
$meridian_empty = null; $minute_id = null;
$second_id = null;
$all_id = null; $meridian_id = null;
$hour_id = null; $use_24_hours = true;
$minute_id = null; $minute_interval = 1;
$second_id = null; $second_interval = 1;
$meridian_id = null; $extra_attrs = '';
$all_extra = null;
$use_24_hours = true; $hour_extra = null;
$minute_interval = 1; $minute_extra = null;
$second_interval = 1; $second_extra = null;
$meridian_extra = null;
$extra_attrs = ''; foreach ($params as $_key => $_value) {
$all_extra = null; switch ($_key) {
$hour_extra = null; case 'time':
$minute_extra = null; if (!is_array($_value) && $_value !== null) {
$second_extra = null; $template->_checkPlugins(
$meridian_extra = null; array(
array(
foreach ($params as $_key => $_value) { 'function' => 'smarty_make_timestamp',
switch ($_key) { 'file' => SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'
case 'time': )
if (!is_array($_value) && $_value !== null) { )
$time = smarty_make_timestamp($_value); );
} $time = smarty_make_timestamp($_value);
break; }
break;
case 'prefix': case 'prefix':
case 'field_array': case 'field_array':
case 'field_separator':
case 'field_separator': case 'option_separator':
case 'option_separator': case 'all_extra':
case 'hour_extra':
case 'all_extra': case 'minute_extra':
case 'hour_extra': case 'second_extra':
case 'minute_extra': case 'meridian_extra':
case 'second_extra': case 'all_empty':
case 'meridian_extra': case 'hour_empty':
case 'minute_empty':
case 'all_empty': case 'second_empty':
case 'hour_empty': case 'meridian_empty':
case 'minute_empty': case 'all_id':
case 'second_empty': case 'hour_id':
case 'meridian_empty': case 'minute_id':
case 'second_id':
case 'all_id': case 'meridian_id':
case 'hour_id': case 'hour_format':
case 'minute_id': case 'hour_value_format':
case 'second_id': case 'minute_format':
case 'meridian_id': case 'minute_value_format':
case 'second_format':
case 'hour_format': case 'second_value_format':
case 'hour_value_format': $$_key = (string)$_value;
case 'minute_format': break;
case 'minute_value_format': case 'display_hours':
case 'second_format': case 'display_minutes':
case 'second_value_format': case 'display_seconds':
$$_key = (string)$_value; case 'display_meridian':
break; case 'use_24_hours':
$$_key = (bool)$_value;
case 'display_hours': break;
case 'display_minutes': case 'minute_interval':
case 'display_seconds': case 'second_interval':
case 'display_meridian': case 'hour_size':
case 'use_24_hours': case 'minute_size':
$$_key = (bool)$_value; case 'second_size':
break; case 'meridian_size':
$$_key = (int)$_value;
case 'minute_interval': break;
case 'second_interval': default:
if (!is_array($_value)) {
case 'hour_size': $extra_attrs .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_value) . '"';
case 'minute_size': } else {
case 'second_size': trigger_error("html_select_date: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE);
case 'meridian_size': }
$$_key = (int)$_value; break;
break; }
}
default: if (isset($params[ 'time' ]) && is_array($params[ 'time' ])) {
if (!is_array($_value)) { if (isset($params[ 'time' ][ $prefix . 'Hour' ])) {
$extra_attrs .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_value) . '"'; // $_REQUEST[$field_array] given
} else { foreach (array(
trigger_error("html_select_date: extra attribute '$_key' cannot be an array", E_USER_NOTICE); 'H' => 'Hour',
} 'i' => 'Minute',
break; 's' => 'Second'
} ) as $_elementKey => $_elementName) {
} $_variableName = '_' . strtolower($_elementName);
$$_variableName =
if (isset($params['time']) && is_array($params['time'])) { isset($params[ 'time' ][ $prefix . $_elementName ]) ? $params[ 'time' ][ $prefix . $_elementName ] :
if (isset($params['time'][$prefix . 'Hour'])) { date($_elementKey);
// $_REQUEST[$field_array] given }
foreach (array('H' => 'Hour', 'i' => 'Minute', 's' => 'Second') as $_elementKey => $_elementName) { $_meridian =
$_variableName = '_' . strtolower($_elementName); isset($params[ 'time' ][ $prefix . 'Meridian' ]) ? (' ' . $params[ 'time' ][ $prefix . 'Meridian' ]) :
$$_variableName = isset($params['time'][$prefix . $_elementName]) '';
? $params['time'][$prefix . $_elementName] $time = strtotime($_hour . ':' . $_minute . ':' . $_second . $_meridian);
: date($_elementKey); list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time));
} } elseif (isset($params[ 'time' ][ $field_array ][ $prefix . 'Hour' ])) {
$_meridian = isset($params['time'][$prefix . 'Meridian']) // $_REQUEST given
? (' ' . $params['time'][$prefix . 'Meridian']) foreach (array(
: ''; 'H' => 'Hour',
$time = strtotime( $_hour . ':' . $_minute . ':' . $_second . $_meridian ); 'i' => 'Minute',
list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time)); 's' => 'Second'
} elseif (isset($params['time'][$field_array][$prefix . 'Hour'])) { ) as $_elementKey => $_elementName) {
// $_REQUEST given $_variableName = '_' . strtolower($_elementName);
foreach (array('H' => 'Hour', 'i' => 'Minute', 's' => 'Second') as $_elementKey => $_elementName) { $$_variableName = isset($params[ 'time' ][ $field_array ][ $prefix . $_elementName ]) ?
$_variableName = '_' . strtolower($_elementName); $params[ 'time' ][ $field_array ][ $prefix . $_elementName ] : date($_elementKey);
$$_variableName = isset($params['time'][$field_array][$prefix . $_elementName]) }
? $params['time'][$field_array][$prefix . $_elementName] $_meridian = isset($params[ 'time' ][ $field_array ][ $prefix . 'Meridian' ]) ?
: date($_elementKey); (' ' . $params[ 'time' ][ $field_array ][ $prefix . 'Meridian' ]) : '';
} $time = strtotime($_hour . ':' . $_minute . ':' . $_second . $_meridian);
$_meridian = isset($params['time'][$field_array][$prefix . 'Meridian']) list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time));
? (' ' . $params['time'][$field_array][$prefix . 'Meridian']) } else {
: ''; // no date found, use NOW
$time = strtotime( $_hour . ':' . $_minute . ':' . $_second . $_meridian ); list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d'));
list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time)); }
} else { } elseif ($time === null) {
// no date found, use NOW if (array_key_exists('time', $params)) {
list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d')); $_hour = $_minute = $_second = $time = null;
} } else {
} elseif ($time === null) { list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s'));
if (array_key_exists('time', $params)) { }
$_hour = $_minute = $_second = $time = null; } else {
} else { list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time));
list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s')); }
} // generate hour <select>
} else { if ($display_hours) {
list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time)); $_html_hours = '';
} $_extra = '';
$_name = $field_array ? ($field_array . '[' . $prefix . 'Hour]') : ($prefix . 'Hour');
// generate hour <select> if ($all_extra) {
if ($display_hours) { $_extra .= ' ' . $all_extra;
$_html_hours = ''; }
$_extra = ''; if ($hour_extra) {
$_name = $field_array ? ($field_array . '[' . $prefix . 'Hour]') : ($prefix . 'Hour'); $_extra .= ' ' . $hour_extra;
if ($all_extra) { }
$_extra .= ' ' . $all_extra; $_html_hours = '<select name="' . $_name . '"';
} if ($hour_id !== null || $all_id !== null) {
if ($hour_extra) { $_html_hours .= ' id="' .
$_extra .= ' ' . $hour_extra; smarty_function_escape_special_chars(
} $hour_id !== null ? ($hour_id ? $hour_id : $_name) :
($all_id ? ($all_id . $_name) : $_name)
$_html_hours = '<select name="' . $_name . '"'; ) . '"';
if ($hour_id !== null || $all_id !== null) { }
$_html_hours .= ' id="' . smarty_function_escape_special_chars( if ($hour_size) {
$hour_id !== null ? ( $hour_id ? $hour_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) $_html_hours .= ' size="' . $hour_size . '"';
) . '"'; }
} $_html_hours .= $_extra . $extra_attrs . '>' . $option_separator;
if ($hour_size) { if (isset($hour_empty) || isset($all_empty)) {
$_html_hours .= ' size="' . $hour_size . '"'; $_html_hours .= '<option value="">' . (isset($hour_empty) ? $hour_empty : $all_empty) . '</option>' .
} $option_separator;
$_html_hours .= $_extra . $extra_attrs . '>' . $option_separator; }
$start = $use_24_hours ? 0 : 1;
if (isset($hour_empty) || isset($all_empty)) { $end = $use_24_hours ? 23 : 12;
$_html_hours .= '<option value="">' . ( isset($hour_empty) ? $hour_empty : $all_empty ) . '</option>' . $option_separator; for ($i = $start; $i <= $end; $i++) {
} $_val = sprintf('%02d', $i);
$_text = $hour_format === '%02d' ? $_val : sprintf($hour_format, $i);
$start = $use_24_hours ? 0 : 1; $_value = $hour_value_format === '%02d' ? $_val : sprintf($hour_value_format, $i);
$end = $use_24_hours ? 23 : 12; if (!$use_24_hours) {
for ($i=$start; $i <= $end; $i++) { $_hour12 = $_hour == 0 ? 12 : ($_hour <= 12 ? $_hour : $_hour - 12);
$_val = sprintf('%02d', $i); }
$_text = $hour_format == '%02d' ? $_val : sprintf($hour_format, $i); $selected = $_hour !== null ? ($use_24_hours ? $_hour == $_val : $_hour12 == $_val) : null;
$_value = $hour_value_format == '%02d' ? $_val : sprintf($hour_value_format, $i); $_html_hours .= '<option value="' . $_value . '"' . ($selected ? ' selected="selected"' : '') . '>' .
$_text . '</option>' . $option_separator;
if (!$use_24_hours) { }
$_hour12 = $_hour == 0 $_html_hours .= '</select>';
? 12 }
: ($_hour <= 12 ? $_hour : $_hour -12); // generate minute <select>
} if ($display_minutes) {
$_html_minutes = '';
$selected = $_hour !== null ? ($use_24_hours ? $_hour == $_val : $_hour12 == $_val) : null; $_extra = '';
$_html_hours .= '<option value="' . $_value . '"' $_name = $field_array ? ($field_array . '[' . $prefix . 'Minute]') : ($prefix . 'Minute');
. ($selected ? ' selected="selected"' : '') if ($all_extra) {
. '>' . $_text . '</option>' . $option_separator; $_extra .= ' ' . $all_extra;
} }
if ($minute_extra) {
$_html_hours .= '</select>'; $_extra .= ' ' . $minute_extra;
} }
$_html_minutes = '<select name="' . $_name . '"';
// generate minute <select> if ($minute_id !== null || $all_id !== null) {
if ($display_minutes) { $_html_minutes .= ' id="' . smarty_function_escape_special_chars(
$_html_minutes = ''; $minute_id !== null ?
$_extra = ''; ($minute_id ? $minute_id : $_name) :
$_name = $field_array ? ($field_array . '[' . $prefix . 'Minute]') : ($prefix . 'Minute'); ($all_id ? ($all_id . $_name) :
if ($all_extra) { $_name)
$_extra .= ' ' . $all_extra; ) . '"';
} }
if ($minute_extra) { if ($minute_size) {
$_extra .= ' ' . $minute_extra; $_html_minutes .= ' size="' . $minute_size . '"';
} }
$_html_minutes .= $_extra . $extra_attrs . '>' . $option_separator;
$_html_minutes = '<select name="' . $_name . '"'; if (isset($minute_empty) || isset($all_empty)) {
if ($minute_id !== null || $all_id !== null) { $_html_minutes .= '<option value="">' . (isset($minute_empty) ? $minute_empty : $all_empty) . '</option>' .
$_html_minutes .= ' id="' . smarty_function_escape_special_chars( $option_separator;
$minute_id !== null ? ( $minute_id ? $minute_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) }
) . '"'; $selected = $_minute !== null ? ($_minute - $_minute % $minute_interval) : null;
} for ($i = 0; $i <= 59; $i += $minute_interval) {
if ($minute_size) { $_val = sprintf('%02d', $i);
$_html_minutes .= ' size="' . $minute_size . '"'; $_text = $minute_format === '%02d' ? $_val : sprintf($minute_format, $i);
} $_value = $minute_value_format === '%02d' ? $_val : sprintf($minute_value_format, $i);
$_html_minutes .= $_extra . $extra_attrs . '>' . $option_separator; $_html_minutes .= '<option value="' . $_value . '"' . ($selected === $i ? ' selected="selected"' : '') .
'>' . $_text . '</option>' . $option_separator;
if (isset($minute_empty) || isset($all_empty)) { }
$_html_minutes .= '<option value="">' . ( isset($minute_empty) ? $minute_empty : $all_empty ) . '</option>' . $option_separator; $_html_minutes .= '</select>';
} }
// generate second <select>
$selected = $_minute !== null ? ($_minute - $_minute % $minute_interval) : null; if ($display_seconds) {
for ($i=0; $i <= 59; $i += $minute_interval) { $_html_seconds = '';
$_val = sprintf('%02d', $i); $_extra = '';
$_text = $minute_format == '%02d' ? $_val : sprintf($minute_format, $i); $_name = $field_array ? ($field_array . '[' . $prefix . 'Second]') : ($prefix . 'Second');
$_value = $minute_value_format == '%02d' ? $_val : sprintf($minute_value_format, $i); if ($all_extra) {
$_html_minutes .= '<option value="' . $_value . '"' $_extra .= ' ' . $all_extra;
. ($selected === $i ? ' selected="selected"' : '') }
. '>' . $_text . '</option>' . $option_separator; if ($second_extra) {
} $_extra .= ' ' . $second_extra;
}
$_html_minutes .= '</select>'; $_html_seconds = '<select name="' . $_name . '"';
} if ($second_id !== null || $all_id !== null) {
$_html_seconds .= ' id="' . smarty_function_escape_special_chars(
// generate second <select> $second_id !== null ?
if ($display_seconds) { ($second_id ? $second_id : $_name) :
$_html_seconds = ''; ($all_id ? ($all_id . $_name) :
$_extra = ''; $_name)
$_name = $field_array ? ($field_array . '[' . $prefix . 'Second]') : ($prefix . 'Second'); ) . '"';
if ($all_extra) { }
$_extra .= ' ' . $all_extra; if ($second_size) {
} $_html_seconds .= ' size="' . $second_size . '"';
if ($second_extra) { }
$_extra .= ' ' . $second_extra; $_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>' .
$_html_seconds = '<select name="' . $_name . '"'; $option_separator;
if ($second_id !== null || $all_id !== null) { }
$_html_seconds .= ' id="' . smarty_function_escape_special_chars( $selected = $_second !== null ? ($_second - $_second % $second_interval) : null;
$second_id !== null ? ( $second_id ? $second_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) for ($i = 0; $i <= 59; $i += $second_interval) {
) . '"'; $_val = sprintf('%02d', $i);
} $_text = $second_format === '%02d' ? $_val : sprintf($second_format, $i);
if ($second_size) { $_value = $second_value_format === '%02d' ? $_val : sprintf($second_value_format, $i);
$_html_seconds .= ' size="' . $second_size . '"'; $_html_seconds .= '<option value="' . $_value . '"' . ($selected === $i ? ' selected="selected"' : '') .
} '>' . $_text . '</option>' . $option_separator;
$_html_seconds .= $_extra . $extra_attrs . '>' . $option_separator; }
$_html_seconds .= '</select>';
if (isset($second_empty) || isset($all_empty)) { }
$_html_seconds .= '<option value="">' . ( isset($second_empty) ? $second_empty : $all_empty ) . '</option>' . $option_separator; // generate meridian <select>
} if ($display_meridian && !$use_24_hours) {
$_html_meridian = '';
$selected = $_second !== null ? ($_second - $_second % $second_interval) : null; $_extra = '';
for ($i=0; $i <= 59; $i += $second_interval) { $_name = $field_array ? ($field_array . '[' . $prefix . 'Meridian]') : ($prefix . 'Meridian');
$_val = sprintf('%02d', $i); if ($all_extra) {
$_text = $second_format == '%02d' ? $_val : sprintf($second_format, $i); $_extra .= ' ' . $all_extra;
$_value = $second_value_format == '%02d' ? $_val : sprintf($second_value_format, $i); }
$_html_seconds .= '<option value="' . $_value . '"' if ($meridian_extra) {
. ($selected === $i ? ' selected="selected"' : '') $_extra .= ' ' . $meridian_extra;
. '>' . $_text . '</option>' . $option_separator; }
} $_html_meridian = '<select name="' . $_name . '"';
if ($meridian_id !== null || $all_id !== null) {
$_html_seconds .= '</select>'; $_html_meridian .= ' id="' . smarty_function_escape_special_chars(
} $meridian_id !== null ?
($meridian_id ? $meridian_id :
// generate meridian <select> $_name) :
if ($display_meridian && !$use_24_hours) { ($all_id ? ($all_id . $_name) :
$_html_meridian = ''; $_name)
$_extra = ''; ) . '"';
$_name = $field_array ? ($field_array . '[' . $prefix . 'Meridian]') : ($prefix . 'Meridian'); }
if ($all_extra) { if ($meridian_size) {
$_extra .= ' ' . $all_extra; $_html_meridian .= ' size="' . $meridian_size . '"';
} }
if ($meridian_extra) { $_html_meridian .= $_extra . $extra_attrs . '>' . $option_separator;
$_extra .= ' ' . $meridian_extra; if (isset($meridian_empty) || isset($all_empty)) {
} $_html_meridian .= '<option value="">' . (isset($meridian_empty) ? $meridian_empty : $all_empty) .
'</option>' . $option_separator;
$_html_meridian = '<select name="' . $_name . '"'; }
if ($meridian_id !== null || $all_id !== null) { $_html_meridian .= '<option value="am"' . ($_hour > 0 && $_hour < 12 ? ' selected="selected"' : '') .
$_html_meridian .= ' id="' . smarty_function_escape_special_chars( '>AM</option>' . $option_separator . '<option value="pm"' .
$meridian_id !== null ? ( $meridian_id ? $meridian_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) ($_hour < 12 ? '' : ' selected="selected"') . '>PM</option>' . $option_separator .
) . '"'; '</select>';
} }
if ($meridian_size) { $_html = '';
$_html_meridian .= ' size="' . $meridian_size . '"'; foreach (array(
} '_html_hours',
$_html_meridian .= $_extra . $extra_attrs . '>' . $option_separator; '_html_minutes',
'_html_seconds',
if (isset($meridian_empty) || isset($all_empty)) { '_html_meridian'
$_html_meridian .= '<option value="">' . ( isset($meridian_empty) ? $meridian_empty : $all_empty ) . '</option>' . $option_separator; ) as $k) {
} if (isset($$k)) {
if ($_html) {
$_html_meridian .= '<option value="am"'. ($_hour < 12 ? ' selected="selected"' : '') .'>AM</option>' . $option_separator $_html .= $field_separator;
. '<option value="pm"'. ($_hour < 12 ? '' : ' selected="selected"') .'>PM</option>' . $option_separator }
. '</select>'; $_html .= $$k;
} }
}
$_html = ''; return $_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;
}
?>

View file

@ -1,177 +1,164 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsFunction * @subpackage PluginsFunction
*/ */
/**
/** * Smarty {html_table} function plugin
* Smarty {html_table} function plugin * Type: function
* * Name: html_table
* Type: function<br> * Date: Feb 17, 2003
* Name: html_table<br> * Purpose: make an html table from an array of data
* Date: Feb 17, 2003<br> * Params:
* Purpose: make an html table from an array of data<br> *
* Params: * - loop - array to loop through
* <pre> * - cols - number of columns, comma separated list of column names
* - loop - array to loop through * or array of column names
* - cols - number of columns, comma separated list of column names * - rows - number of rows
* or array of column names * - table_attr - table attributes
* - rows - number of rows * - th_attr - table heading attributes (arrays are cycled)
* - table_attr - table attributes * - tr_attr - table row attributes (arrays are cycled)
* - th_attr - table heading attributes (arrays are cycled) * - td_attr - table cell attributes (arrays are cycled)
* - tr_attr - table row attributes (arrays are cycled) * - trailpad - value to pad trailing cells with
* - td_attr - table cell attributes (arrays are cycled) * - caption - text for caption element
* - trailpad - value to pad trailing cells with * - vdir - vertical direction (default: "down", means top-to-bottom)
* - caption - text for caption element * - hdir - horizontal direction (default: "right", means left-to-right)
* - vdir - vertical direction (default: "down", means top-to-bottom) * - inner - inner loop (default "cols": print $loop line by line,
* - hdir - horizontal direction (default: "right", means left-to-right) * $loop will be printed column by column otherwise)
* - inner - inner loop (default "cols": print $loop line by line, *
* $loop will be printed column by column otherwise) * Examples:
* </pre> *
* Examples: * {table loop=$data}
* <pre> * {table loop=$data cols=4 tr_attr='"bgcolor=red"'}
* {table loop=$data} * {table loop=$data cols="first,second,third" tr_attr=$colors}
* {table loop=$data cols=4 tr_attr='"bgcolor=red"'} *
* {table loop=$data cols="first,second,third" tr_attr=$colors} * @author Monte Ohrt <monte at ohrt dot com>
* </pre> * @author credit to Messju Mohr <messju at lammfellpuschen dot de>
* * @author credit to boots <boots dot smarty at yahoo dot com>
* @author Monte Ohrt <monte at ohrt dot com> * @version 1.1
* @author credit to Messju Mohr <messju at lammfellpuschen dot de> * @link http://www.smarty.net/manual/en/language.function.html.table.php {html_table}
* @author credit to boots <boots dot smarty at yahoo dot com> * (Smarty online manual)
* @version 1.1 *
* @link http://www.smarty.net/manual/en/language.function.html.table.php {html_table} * @param array $params parameters
* (Smarty online manual) *
* @param array $params parameters * @return string
* @param Smarty_Internal_Template $template template object */
* @return string function smarty_function_html_table($params)
*/ {
function smarty_function_html_table($params, $template) $table_attr = 'border="1"';
{ $tr_attr = '';
$table_attr = 'border="1"'; $th_attr = '';
$tr_attr = ''; $td_attr = '';
$th_attr = ''; $cols = $cols_count = 3;
$td_attr = ''; $rows = 3;
$cols = $cols_count = 3; $trailpad = '&nbsp;';
$rows = 3; $vdir = 'down';
$trailpad = '&nbsp;'; $hdir = 'right';
$vdir = 'down'; $inner = 'cols';
$hdir = 'right'; $caption = '';
$inner = 'cols'; $loop = null;
$caption = ''; if (!isset($params[ 'loop' ])) {
$loop = null; trigger_error("html_table: missing 'loop' parameter", E_USER_WARNING);
return;
if (!isset($params['loop'])) { }
trigger_error("html_table: missing 'loop' parameter",E_USER_WARNING); foreach ($params as $_key => $_value) {
return; switch ($_key) {
} case 'loop':
$$_key = (array)$_value;
foreach ($params as $_key => $_value) { break;
switch ($_key) { case 'cols':
case 'loop': if (is_array($_value) && !empty($_value)) {
$$_key = (array)$_value; $cols = $_value;
break; $cols_count = count($_value);
} elseif (!is_numeric($_value) && is_string($_value) && !empty($_value)) {
case 'cols': $cols = explode(',', $_value);
if (is_array($_value) && !empty($_value)) { $cols_count = count($cols);
$cols = $_value; } elseif (!empty($_value)) {
$cols_count = count($_value); $cols_count = (int)$_value;
} elseif (!is_numeric($_value) && is_string($_value) && !empty($_value)) { } else {
$cols = explode(',', $_value); $cols_count = $cols;
$cols_count = count($cols); }
} elseif (!empty($_value)) { break;
$cols_count = (int)$_value; case 'rows':
} else { $$_key = (int)$_value;
$cols_count = $cols; break;
} case 'table_attr':
break; case 'trailpad':
case 'hdir':
case 'rows': case 'vdir':
$$_key = (int)$_value; case 'inner':
break; case 'caption':
$$_key = (string)$_value;
case 'table_attr': break;
case 'trailpad': case 'tr_attr':
case 'hdir': case 'td_attr':
case 'vdir': case 'th_attr':
case 'inner': $$_key = $_value;
case 'caption': break;
$$_key = (string)$_value; }
break; }
$loop_count = count($loop);
case 'tr_attr': if (empty($params[ 'rows' ])) {
case 'td_attr': /* no rows specified */
case 'th_attr': $rows = ceil($loop_count / $cols_count);
$$_key = $_value; } elseif (empty($params[ 'cols' ])) {
break; if (!empty($params[ 'rows' ])) {
} /* no cols specified, but rows */
} $cols_count = ceil($loop_count / $rows);
}
$loop_count = count($loop); }
if (empty($params['rows'])) { $output = "<table $table_attr>\n";
/* no rows specified */ if (!empty($caption)) {
$rows = ceil($loop_count / $cols_count); $output .= '<caption>' . $caption . "</caption>\n";
} elseif (empty($params['cols'])) { }
if (!empty($params['rows'])) { if (is_array($cols)) {
/* no cols specified, but rows */ $cols = ($hdir === 'right') ? $cols : array_reverse($cols);
$cols_count = ceil($loop_count / $rows); $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 = "<table $table_attr>\n"; $output .= "</th>\n";
}
if (!empty($caption)) { $output .= "</tr></thead>\n";
$output .= '<caption>' . $caption . "</caption>\n"; }
} $output .= "<tbody>\n";
for ($r = 0; $r < $rows; $r++) {
if (is_array($cols)) { $output .= "<tr" . smarty_function_html_table_cycle('tr', $tr_attr, $r) . ">\n";
$cols = ($hdir == 'right') ? $cols : array_reverse($cols); $rx = ($vdir === 'down') ? $r * $cols_count : ($rows - 1 - $r) * $cols_count;
$output .= "<thead><tr>\n"; for ($c = 0; $c < $cols_count; $c++) {
$x = ($hdir === 'right') ? $rx + $c : $rx + $cols_count - 1 - $c;
for ($r = 0; $r < $cols_count; $r++) { if ($inner !== 'cols') {
$output .= '<th' . smarty_function_html_table_cycle('th', $th_attr, $r) . '>'; /* shuffle x to loop over rows*/
$output .= $cols[$r]; $x = floor($x / $cols_count) + ($x % $cols_count) * $rows;
$output .= "</th>\n"; }
} if ($x < $loop_count) {
$output .= "</tr></thead>\n"; $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 .= "<tbody>\n"; }
for ($r = 0; $r < $rows; $r++) { }
$output .= "<tr" . smarty_function_html_table_cycle('tr', $tr_attr, $r) . ">\n"; $output .= "</tr>\n";
$rx = ($vdir == 'down') ? $r * $cols_count : ($rows-1 - $r) * $cols_count; }
$output .= "</tbody>\n";
for ($c = 0; $c < $cols_count; $c++) { $output .= "</table>\n";
$x = ($hdir == 'right') ? $rx + $c : $rx + $cols_count-1 - $c; return $output;
if ($inner != 'cols') { }
/* shuffle x to loop over rows*/
$x = floor($x / $cols_count) + ($x % $cols_count) * $rows; /**
} * @param $name
* @param $var
if ($x < $loop_count) { * @param $no
$output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">" . $loop[$x] . "</td>\n"; *
} else { * @return string
$output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">$trailpad</td>\n"; */
} function smarty_function_html_table_cycle($name, $var, $no)
} {
$output .= "</tr>\n"; if (!is_array($var)) {
} $ret = $var;
$output .= "</tbody>\n"; } else {
$output .= "</table>\n"; $ret = $var[ $no % count($var) ];
}
return $output; return ($ret) ? ' ' . $ret : '';
} }
function smarty_function_html_table_cycle($name, $var, $no)
{
if (!is_array($var)) {
$ret = $var;
} else {
$ret = $var[$no % count($var)];
}
return ($ret) ? ' ' . $ret : '';
}
?>

View file

@ -1,152 +1,137 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsFunction * @subpackage PluginsFunction
*/ */
/**
/** * Smarty {mailto} function plugin
* Smarty {mailto} function plugin * Type: function
* * Name: mailto
* Type: function<br> * Date: May 21, 2002
* Name: mailto<br> * Purpose: automate mailto address link creation, and optionally encode them.
* Date: May 21, 2002 * Params:
* Purpose: automate mailto address link creation, and optionally encode them.<br> *
* Params: * - address - (required) - e-mail address
* <pre> * - text - (optional) - text to display, default is address
* - address - (required) - e-mail address * - encode - (optional) - can be one of:
* - text - (optional) - text to display, default is address * * none : no encoding (default)
* - encode - (optional) - can be one of: * * javascript : encode with javascript
* * none : no encoding (default) * * javascript_charcode : encode with javascript charcode
* * javascript : encode with javascript * * hex : encode with hexadecimal (no javascript)
* * javascript_charcode : encode with javascript charcode * - cc - (optional) - address(es) to carbon copy
* * hex : encode with hexidecimal (no javascript) * - bcc - (optional) - address(es) to blind carbon copy
* - cc - (optional) - address(es) to carbon copy * - subject - (optional) - e-mail subject
* - bcc - (optional) - address(es) to blind carbon copy * - newsgroups - (optional) - newsgroup(s) to post to
* - subject - (optional) - e-mail subject * - followupto - (optional) - address(es) to follow up to
* - newsgroups - (optional) - newsgroup(s) to post to * - extra - (optional) - extra tags for the href link
* - followupto - (optional) - address(es) to follow up to *
* - extra - (optional) - extra tags for the href link * Examples:
* </pre> *
* Examples: * {mailto address="me@domain.com"}
* <pre> * {mailto address="me@domain.com" encode="javascript"}
* {mailto address="me@domain.com"} * {mailto address="me@domain.com" encode="hex"}
* {mailto address="me@domain.com" encode="javascript"} * {mailto address="me@domain.com" subject="Hello to you!"}
* {mailto address="me@domain.com" encode="hex"} * {mailto address="me@domain.com" cc="you@domain.com,they@domain.com"}
* {mailto address="me@domain.com" subject="Hello to you!"} * {mailto address="me@domain.com" extra='class="mailto"'}
* {mailto address="me@domain.com" cc="you@domain.com,they@domain.com"} *
* {mailto address="me@domain.com" extra='class="mailto"'} * @link http://www.smarty.net/manual/en/language.function.mailto.php {mailto}
* </pre> * (Smarty online manual)
* * @version 1.2
* @link http://www.smarty.net/manual/en/language.function.mailto.php {mailto} * @author Monte Ohrt <monte at ohrt dot com>
* (Smarty online manual) * @author credits to Jason Sweat (added cc, bcc and subject functionality)
* @version 1.2 *
* @author Monte Ohrt <monte at ohrt dot com> * @param array $params parameters
* @author credits to Jason Sweat (added cc, bcc and subject functionality) *
* @param array $params parameters * @return string
* @param Smarty_Internal_Template $template template object */
* @return string function smarty_function_mailto($params)
*/ {
function smarty_function_mailto($params, $template) static $_allowed_encoding =
{ array('javascript' => true, 'javascript_charcode' => true, 'hex' => true, 'none' => true);
static $_allowed_encoding = array('javascript' => true, 'javascript_charcode' => true, 'hex' => true, 'none' => true); $extra = '';
$extra = ''; if (empty($params[ 'address' ])) {
trigger_error("mailto: missing 'address' parameter", E_USER_WARNING);
if (empty($params['address'])) { return;
trigger_error("mailto: missing 'address' parameter",E_USER_WARNING); } else {
return; $address = $params[ 'address' ];
} else { }
$address = $params['address']; $text = $address;
} // netscape and mozilla do not decode %40 (@) in BCC field (bug?)
// so, don't encode it.
$text = $address; $search = array('%40', '%2C');
// netscape and mozilla do not decode %40 (@) in BCC field (bug?) $replace = array('@', ',');
// so, don't encode it. $mail_parms = array();
$search = array('%40', '%2C'); foreach ($params as $var => $value) {
$replace = array('@', ','); switch ($var) {
$mail_parms = array(); case 'cc':
foreach ($params as $var => $value) { case 'bcc':
switch ($var) { case 'followupto':
case 'cc': if (!empty($value)) {
case 'bcc': $mail_parms[] = $var . '=' . str_replace($search, $replace, rawurlencode($value));
case 'followupto': }
if (!empty($value)) break;
$mail_parms[] = $var . '=' . str_replace($search, $replace, rawurlencode($value)); case 'subject':
break; case 'newsgroups':
$mail_parms[] = $var . '=' . rawurlencode($value);
case 'subject': break;
case 'newsgroups': case 'extra':
$mail_parms[] = $var . '=' . rawurlencode($value); case 'text':
break; $$var = $value;
// no break
case 'extra': default:
case 'text': }
$$var = $value; }
if ($mail_parms) {
default: $address .= '?' . join('&', $mail_parms);
} }
} $encode = (empty($params[ 'encode' ])) ? 'none' : $params[ 'encode' ];
if (!isset($_allowed_encoding[ $encode ])) {
if ($mail_parms) { trigger_error(
$address .= '?' . join('&', $mail_parms); "mailto: 'encode' parameter must be none, javascript, javascript_charcode or hex",
} E_USER_WARNING
);
$encode = (empty($params['encode'])) ? 'none' : $params['encode']; return;
if (!isset($_allowed_encoding[$encode])) { }
trigger_error("mailto: 'encode' parameter must be none, javascript, javascript_charcode or hex", E_USER_WARNING); // FIXME: (rodneyrehm) document.write() excues me what? 1998 has passed!
return; if ($encode === 'javascript') {
} $string = 'document.write(\'<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>\');';
// FIXME: (rodneyrehm) document.write() excues me what? 1998 has passed! $js_encode = '';
if ($encode == 'javascript') { for ($x = 0, $_length = strlen($string); $x < $_length; $x++) {
$string = 'document.write(\'<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>\');'; $js_encode .= '%' . bin2hex($string[ $x ]);
}
$js_encode = ''; return '<script type="text/javascript">eval(unescape(\'' . $js_encode . '\'))</script>';
for ($x = 0, $_length = strlen($string); $x < $_length; $x++) { } elseif ($encode === 'javascript_charcode') {
$js_encode .= '%' . bin2hex($string[$x]); $string = '<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>';
} for ($x = 0, $y = strlen($string); $x < $y; $x++) {
$ord[] = ord($string[ $x ]);
return '<script type="text/javascript">eval(unescape(\'' . $js_encode . '\'))</script>'; }
} elseif ($encode == 'javascript_charcode') { $_ret = "<script type=\"text/javascript\" language=\"javascript\">\n" . "{document.write(String.fromCharCode(" .
$string = '<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>'; implode(',', $ord) . "))" . "}\n" . "</script>\n";
return $_ret;
for($x = 0, $y = strlen($string); $x < $y; $x++) { } elseif ($encode === 'hex') {
$ord[] = ord($string[$x]); preg_match('!^(.*)(\?.*)$!', $address, $match);
} if (!empty($match[ 2 ])) {
trigger_error("mailto: hex encoding does not work with extra attributes. Try javascript.", E_USER_WARNING);
$_ret = "<script type=\"text/javascript\" language=\"javascript\">\n" return;
. "{document.write(String.fromCharCode(" }
. implode(',', $ord) $address_encode = '';
. "))" for ($x = 0, $_length = strlen($address); $x < $_length; $x++) {
. "}\n" if (preg_match('!\w!' . Smarty::$_UTF8_MODIFIER, $address[ $x ])) {
. "</script>\n"; $address_encode .= '%' . bin2hex($address[ $x ]);
} else {
return $_ret; $address_encode .= $address[ $x ];
} elseif ($encode == 'hex') { }
preg_match('!^(.*)(\?.*)$!', $address, $match); }
if (!empty($match[2])) { $text_encode = '';
trigger_error("mailto: hex encoding does not work with extra attributes. Try javascript.",E_USER_WARNING); for ($x = 0, $_length = strlen($text); $x < $_length; $x++) {
return; $text_encode .= '&#x' . bin2hex($text[ $x ]) . ';';
} }
$address_encode = ''; $mailto = "&#109;&#97;&#105;&#108;&#116;&#111;&#58;";
for ($x = 0, $_length = strlen($address); $x < $_length; $x++) { return '<a href="' . $mailto . $address_encode . '" ' . $extra . '>' . $text_encode . '</a>';
if (preg_match('!\w!' . Smarty::$_UTF8_MODIFIER, $address[$x])) { } else {
$address_encode .= '%' . bin2hex($address[$x]); // no encoding
} else { return '<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>';
$address_encode .= $address[$x]; }
} }
}
$text_encode = '';
for ($x = 0, $_length = strlen($text); $x < $_length; $x++) {
$text_encode .= '&#x' . bin2hex($text[$x]) . ';';
}
$mailto = "&#109;&#97;&#105;&#108;&#116;&#111;&#58;";
return '<a href="' . $mailto . $address_encode . '" ' . $extra . '>' . $text_encode . '</a>';
} else {
// no encoding
return '<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>';
}
}
?>

View file

@ -1,87 +1,112 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* * This plugin is only for Smarty2 BC
* This plugin is only for Smarty2 BC *
* @package Smarty * @package Smarty
* @subpackage PluginsFunction * @subpackage PluginsFunction
*/ */
/**
/** * Smarty {math} function plugin
* Smarty {math} function plugin * Type: function
* * Name: math
* Type: function<br> * Purpose: handle math computations in template
* Name: math<br> *
* Purpose: handle math computations in template * @link http://www.smarty.net/manual/en/language.function.math.php {math}
* * (Smarty online manual)
* @link http://www.smarty.net/manual/en/language.function.math.php {math} * @author Monte Ohrt <monte at ohrt dot com>
* (Smarty online manual) *
* @author Monte Ohrt <monte at ohrt dot com> * @param array $params parameters
* @param array $params parameters * @param Smarty_Internal_Template $template template object
* @param Smarty_Internal_Template $template template object *
* @return string|null * @return string|null
*/ */
function smarty_function_math($params, $template) function smarty_function_math($params, $template)
{ {
static $_allowed_funcs = array( static $_allowed_funcs =
'int' => true, 'abs' => true, 'ceil' => true, 'cos' => true, 'exp' => true, 'floor' => true, array(
'log' => true, 'log10' => true, 'max' => true, 'min' => true, 'pi' => true, 'pow' => true, 'int' => true,
'rand' => true, 'round' => true, 'sin' => true, 'sqrt' => true, 'srand' => true ,'tan' => true 'abs' => true,
); 'ceil' => true,
// be sure equation parameter is present 'cos' => true,
if (empty($params['equation'])) { 'exp' => true,
trigger_error("math: missing equation parameter",E_USER_WARNING); 'floor' => true,
return; 'log' => true,
} 'log10' => true,
'max' => true,
$equation = $params['equation']; 'min' => true,
'pi' => true,
// make sure parenthesis are balanced 'pow' => true,
if (substr_count($equation,"(") != substr_count($equation,")")) { 'rand' => true,
trigger_error("math: unbalanced parenthesis",E_USER_WARNING); 'round' => true,
return; 'sin' => true,
} 'sqrt' => true,
'srand' => true,
// match all vars in equation, make sure all are passed 'tan' => true
preg_match_all("!(?:0x[a-fA-F0-9]+)|([a-zA-Z][a-zA-Z0-9_]*)!",$equation, $match); );
// be sure equation parameter is present
foreach($match[1] as $curr_var) { if (empty($params[ 'equation' ])) {
if ($curr_var && !isset($params[$curr_var]) && !isset($_allowed_funcs[$curr_var])) { trigger_error("math: missing equation parameter", E_USER_WARNING);
trigger_error("math: function call $curr_var not allowed",E_USER_WARNING); return;
return; }
} $equation = $params[ 'equation' ];
} // make sure parenthesis are balanced
if (substr_count($equation, '(') !== substr_count($equation, ')')) {
foreach($params as $key => $val) { trigger_error("math: unbalanced parenthesis", E_USER_WARNING);
if ($key != "equation" && $key != "format" && $key != "assign") { return;
// make sure value is not empty }
if (strlen($val)==0) { // disallow backticks
trigger_error("math: parameter $key is empty",E_USER_WARNING); if (strpos($equation, '`') !== false) {
return; trigger_error("math: backtick character not allowed in equation", E_USER_WARNING);
} return;
if (!is_numeric($val)) { }
trigger_error("math: parameter $key: is not numeric",E_USER_WARNING); // also disallow dollar signs
return; if (strpos($equation, '$') !== false) {
} trigger_error("math: dollar signs not allowed in equation", E_USER_WARNING);
$equation = preg_replace("/\b$key\b/", " \$params['$key'] ", $equation); return;
} }
} foreach ($params as $key => $val) {
$smarty_math_result = null; if ($key !== 'equation' && $key !== 'format' && $key !== 'assign') {
eval("\$smarty_math_result = ".$equation.";"); // make sure value is not empty
if (strlen($val) === 0) {
if (empty($params['format'])) { trigger_error("math: parameter '{$key}' is empty", E_USER_WARNING);
if (empty($params['assign'])) { return;
return $smarty_math_result; }
} else { if (!is_numeric($val)) {
$template->assign($params['assign'],$smarty_math_result); trigger_error("math: parameter '{$key}' is not numeric", E_USER_WARNING);
} return;
} else { }
if (empty($params['assign'])){ }
printf($params['format'],$smarty_math_result); }
} else { // match all vars in equation, make sure all are passed
$template->assign($params['assign'],sprintf($params['format'],$smarty_math_result)); preg_match_all('!(?:0x[a-fA-F0-9]+)|([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)!', $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, or missing parameter '{$curr_var}'",
?> E_USER_WARNING
);
return;
}
}
foreach ($params as $key => $val) {
if ($key !== 'equation' && $key !== 'format' && $key !== 'assign') {
$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));
}
}
}

View file

@ -1,8 +0,0 @@
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
<p>Directory access is forbidden.</p>
</body>
</html>

View file

@ -1,65 +1,145 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsModifier * @subpackage PluginsModifier
*/ */
/**
/** * Smarty capitalize modifier plugin
* Smarty capitalize modifier plugin * Type: modifier
* * Name: capitalize
* Type: modifier<br> * Purpose: capitalize words in the string
* Name: capitalize<br> * {@internal {$string|capitalize:true:true} is the fastest option for MBString enabled systems }}
* Purpose: capitalize words in the string *
* * @param string $string string to capitalize
* {@internal {$string|capitalize:true:true} is the fastest option for MBString enabled systems }} * @param boolean $uc_digits also capitalize "x123" to "X123"
* * @param boolean $lc_rest capitalize first letters, lowercase all following letters "aAa" to "Aaa"
* @param string $string string to capitalize *
* @param boolean $uc_digits also capitalize "x123" to "X123" * @return string capitalized string
* @param boolean $lc_rest capitalize first letters, lowercase all following letters "aAa" to "Aaa" * @author Monte Ohrt <monte at ohrt dot com>
* @return string capitalized string * @author Rodney Rehm
* @author Monte Ohrt <monte at ohrt dot com> */
* @author Rodney Rehm function smarty_modifier_capitalize($string, $uc_digits = false, $lc_rest = false)
*/ {
function smarty_modifier_capitalize($string, $uc_digits = false, $lc_rest = false) if (Smarty::$_MBSTRING) {
{ if ($lc_rest) {
if (Smarty::$_MBSTRING) { // uppercase (including hyphenated words)
if ($lc_rest) { $upper_string = mb_convert_case($string, MB_CASE_TITLE, Smarty::$_CHARSET);
// uppercase (including hyphenated words) } else {
$upper_string = mb_convert_case( $string, MB_CASE_TITLE, Smarty::$_CHARSET ); // uppercase word breaks
} else { $upper_string = preg_replace_callback(
// uppercase word breaks "!(^|[^\p{L}'])([\p{Ll}])!S" . Smarty::$_UTF8_MODIFIER,
$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); 'smarty_mod_cap_mbconvert_cb',
} $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)) { // check uc_digits case
foreach($matches[1] as $match) { if (!$uc_digits) {
$upper_string = substr_replace($upper_string, mb_strtolower($match[0], Smarty::$_CHARSET), $match[1], strlen($match[0])); if (preg_match_all(
} "!\b([\p{L}]*[\p{N}]+[\p{L}]*)\b!" . Smarty::$_UTF8_MODIFIER,
} $string,
} $matches,
$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); PREG_OFFSET_CAPTURE
return $upper_string; )
} ) {
foreach ($matches[ 1 ] as $match) {
// lowercase first $upper_string =
if ($lc_rest) { substr_replace(
$string = strtolower($string); $upper_string,
} mb_strtolower($match[ 0 ], Smarty::$_CHARSET),
// uppercase (including hyphenated words) $match[ 1 ],
$upper_string = preg_replace("!(^|[^\p{L}'])([\p{Ll}])!eS" . Smarty::$_UTF8_MODIFIER, "stripslashes('\\1').ucfirst(stripslashes('\\2'))", $string); strlen($match[ 0 ])
// 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_callback(
} "!((^|\s)['\"])(\w)!" . Smarty::$_UTF8_MODIFIER,
} 'smarty_mod_cap_mbconvert2_cb',
$upper_string = preg_replace("!((^|\s)['\"])(\w)!e" . Smarty::$_UTF8_MODIFIER, "stripslashes('\\1').strtoupper(stripslashes('\\3'))", $upper_string); $upper_string
return $upper_string; );
} return $upper_string;
}
?> // lowercase first
if ($lc_rest) {
$string = strtolower($string);
}
// uppercase (including hyphenated words)
$upper_string =
preg_replace_callback(
"!(^|[^\p{L}'])([\p{Ll}])!S" . Smarty::$_UTF8_MODIFIER,
'smarty_mod_cap_ucfirst_cb',
$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_callback(
"!((^|\s)['\"])(\w)!" . Smarty::$_UTF8_MODIFIER,
'smarty_mod_cap_ucfirst2_cb',
$upper_string
);
return $upper_string;
}
/**
*
* Bug: create_function() use exhausts memory when used in long loops
* Fix: use declared functions for callbacks instead of using create_function()
* Note: This can be fixed using anonymous functions instead, but that requires PHP >= 5.3
*
* @author Kyle Renfrow
*/
/**
* @param $matches
*
* @return string
*/
function smarty_mod_cap_mbconvert_cb($matches)
{
return stripslashes($matches[ 1 ]) . mb_convert_case(stripslashes($matches[ 2 ]), MB_CASE_UPPER, Smarty::$_CHARSET);
}
/**
* @param $matches
*
* @return string
*/
function smarty_mod_cap_mbconvert2_cb($matches)
{
return stripslashes($matches[ 1 ]) . mb_convert_case(stripslashes($matches[ 3 ]), MB_CASE_UPPER, Smarty::$_CHARSET);
}
/**
* @param $matches
*
* @return string
*/
function smarty_mod_cap_ucfirst_cb($matches)
{
return stripslashes($matches[ 1 ]) . ucfirst(stripslashes($matches[ 2 ]));
}
/**
* @param $matches
*
* @return string
*/
function smarty_mod_cap_ucfirst2_cb($matches)
{
return stripslashes($matches[ 1 ]) . ucfirst(stripslashes($matches[ 3 ]));
}

View file

@ -1,65 +1,85 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsModifier * @subpackage PluginsModifier
*/ */
/**
/** * Smarty date_format modifier plugin
* Smarty date_format modifier plugin * Type: modifier
* * Name: date_format
* Type: modifier<br> * Purpose: format datestamps via strftime
* Name: date_format<br> * Input:
* Purpose: format datestamps via strftime<br> * - string: input date string
* Input:<br> * - format: strftime format for output
* - string: input date string * - default_date: default date if $string is empty
* - 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>
* @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 $string input date string * @param string $format strftime format for output
* @param string $format strftime format for output * @param string $default_date default date if $string is empty
* @param string $default_date default date if $string is empty * @param string $formatter either 'strftime' or 'auto'
* @param string $formatter either 'strftime' or 'auto' *
* @return string |void * @return string |void
* @uses smarty_make_timestamp() * @uses smarty_make_timestamp()
*/ */
function smarty_modifier_date_format($string, $format=null, $default_date='', $formatter='auto') function smarty_modifier_date_format($string, $format = null, $default_date = '', $formatter = 'auto')
{ {
if ($format === null) { if ($format === null) {
$format = Smarty::$_DATE_FORMAT; $format = Smarty::$_DATE_FORMAT;
} }
/** /**
* Include the {@link shared.make_timestamp.php} plugin * require_once the {@link shared.make_timestamp.php} plugin
*/ */
require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'); static $is_loaded = false;
if ($string != '' && $string != '0000-00-00' && $string != '0000-00-00 00:00:00') { if (!$is_loaded) {
$timestamp = smarty_make_timestamp($string); if (!is_callable('smarty_make_timestamp')) {
} elseif ($default_date != '') { include_once SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php';
$timestamp = smarty_make_timestamp($default_date); }
} else { $is_loaded = true;
return; }
} if (!empty($string) && $string !== '0000-00-00' && $string !== '0000-00-00 00:00:00') {
if($formatter=='strftime'||($formatter=='auto'&&strpos($format,'%')!==false)) { $timestamp = smarty_make_timestamp($string);
if (DS == '\\') { } elseif (!empty($default_date)) {
$_win_from = array('%D', '%h', '%n', '%r', '%R', '%t', '%T'); $timestamp = smarty_make_timestamp($default_date);
$_win_to = array('%m/%d/%y', '%b', "\n", '%I:%M:%S %p', '%H:%M', "\t", '%H:%M:%S'); } else {
if (strpos($format, '%e') !== false) { return;
$_win_from[] = '%e'; }
$_win_to[] = sprintf('%\' 2d', date('j', $timestamp)); if ($formatter === 'strftime' || ($formatter === 'auto' && strpos($format, '%') !== false)) {
} if (Smarty::$_IS_WINDOWS) {
if (strpos($format, '%l') !== false) { $_win_from = array(
$_win_from[] = '%l'; '%D',
$_win_to[] = sprintf('%\' 2d', date('h', $timestamp)); '%h',
} '%n',
$format = str_replace($_win_from, $_win_to, $format); '%r',
} '%R',
return strftime($format, $timestamp); '%t',
} else { '%T'
return date($format, $timestamp); );
} $_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);
}
}

View file

@ -1,105 +1,103 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage Debug * @subpackage Debug
*/ */
/**
/** * Smarty debug_print_var modifier plugin
* Smarty debug_print_var modifier plugin * Type: modifier
* * Name: debug_print_var
* Type: modifier<br> * Purpose: formats variable contents for display in the console
* Name: debug_print_var<br> *
* Purpose: formats variable contents for display in the console * @author Monte Ohrt <monte at ohrt dot com>
* *
* @author Monte Ohrt <monte at ohrt dot com> * @param array|object $var variable to be formatted
* @param array|object $var variable to be formatted * @param int $max maximum recursion depth if $var is an array or object
* @param integer $depth maximum recursion depth if $var is an array * @param int $length maximum string length if $var is a string
* @param integer $length maximum string length if $var is a string * @param int $depth actual recursion depth
* @return string * @param array $objects processed objects in actual depth to prevent recursive object processing
*/ *
function smarty_modifier_debug_print_var ($var, $depth = 0, $length = 40) * @return string
{ */
$_replace = array("\n" => '<i>\n</i>', function smarty_modifier_debug_print_var($var, $max = 10, $length = 40, $depth = 0, $objects = array())
"\r" => '<i>\r</i>', {
"\t" => '<i>\t</i>' $_replace = array("\n" => '\n', "\r" => '\r', "\t" => '\t');
); switch (gettype($var)) {
case 'array':
switch (gettype($var)) { $results = '<b>Array (' . count($var) . ')</b>';
case 'array' : if ($depth === $max) {
$results = '<b>Array (' . count($var) . ')</b>'; break;
foreach ($var as $curr_key => $curr_val) { }
$results .= '<br>' . str_repeat('&nbsp;', $depth * 2) foreach ($var as $curr_key => $curr_val) {
. '<b>' . strtr($curr_key, $_replace) . '</b> =&gt; ' $results .= '<br>' . str_repeat('&nbsp;', $depth * 2) . '<b>' . strtr($curr_key, $_replace) .
. smarty_modifier_debug_print_var($curr_val, ++$depth, $length); '</b> =&gt; ' .
$depth--; smarty_modifier_debug_print_var($curr_val, $max, $length, ++$depth, $objects);
} $depth--;
break; }
break;
case 'object' : case 'object':
$object_vars = get_object_vars($var); $object_vars = get_object_vars($var);
$results = '<b>' . get_class($var) . ' Object (' . count($object_vars) . ')</b>'; $results = '<b>' . get_class($var) . ' Object (' . count($object_vars) . ')</b>';
foreach ($object_vars as $curr_key => $curr_val) { if (in_array($var, $objects)) {
$results .= '<br>' . str_repeat('&nbsp;', $depth * 2) $results .= ' called recursive';
. '<b> -&gt;' . strtr($curr_key, $_replace) . '</b> = ' break;
. smarty_modifier_debug_print_var($curr_val, ++$depth, $length); }
$depth--; if ($depth === $max) {
} break;
break; }
$objects[] = $var;
case 'boolean' : foreach ($object_vars as $curr_key => $curr_val) {
case 'NULL' : $results .= '<br>' . str_repeat('&nbsp;', $depth * 2) . '<b> -&gt;' . strtr($curr_key, $_replace) .
case 'resource' : '</b> = ' . smarty_modifier_debug_print_var($curr_val, $max, $length, ++$depth, $objects);
if (true === $var) { $depth--;
$results = 'true'; }
} elseif (false === $var) { break;
$results = 'false'; case 'boolean':
} elseif (null === $var) { case 'NULL':
$results = 'null'; case 'resource':
} else { if (true === $var) {
$results = htmlspecialchars((string) $var); $results = 'true';
} } elseif (false === $var) {
$results = '<i>' . $results . '</i>'; $results = 'false';
break; } elseif (null === $var) {
$results = 'null';
case 'integer' : } else {
case 'float' : $results = htmlspecialchars((string)$var);
$results = htmlspecialchars((string) $var); }
break; $results = '<i>' . $results . '</i>';
break;
case 'string' : case 'integer':
$results = strtr($var, $_replace); case 'float':
if (Smarty::$_MBSTRING) { $results = htmlspecialchars((string)$var);
if (mb_strlen($var, Smarty::$_CHARSET) > $length) { break;
$results = mb_substr($var, 0, $length - 3, Smarty::$_CHARSET) . '...'; case 'string':
} $results = strtr($var, $_replace);
} else { if (Smarty::$_MBSTRING) {
if (isset($var[$length])) { if (mb_strlen($var, Smarty::$_CHARSET) > $length) {
$results = substr($var, 0, $length - 3) . '...'; $results = mb_substr($var, 0, $length - 3, Smarty::$_CHARSET) . '...';
} }
} } else {
if (isset($var[ $length ])) {
$results = htmlspecialchars('"' . $results . '"'); $results = substr($var, 0, $length - 3) . '...';
break; }
}
case 'unknown type' : $results = htmlspecialchars('"' . $results . '"', ENT_QUOTES, Smarty::$_CHARSET);
default : break;
$results = strtr((string) $var, $_replace); case 'unknown type':
if (Smarty::$_MBSTRING) { default:
if (mb_strlen($results, Smarty::$_CHARSET) > $length) { $results = strtr((string)$var, $_replace);
$results = mb_substr($results, 0, $length - 3, Smarty::$_CHARSET) . '...'; if (Smarty::$_MBSTRING) {
} if (mb_strlen($results, Smarty::$_CHARSET) > $length) {
} else { $results = mb_substr($results, 0, $length - 3, Smarty::$_CHARSET) . '...';
if (strlen($results) > $length) { }
$results = substr($results, 0, $length - 3) . '...'; } else {
} if (strlen($results) > $length) {
} $results = substr($results, 0, $length - 3) . '...';
}
$results = htmlspecialchars($results); }
} $results = htmlspecialchars($results, ENT_QUOTES, Smarty::$_CHARSET);
}
return $results; return $results;
} }
?>

View file

@ -1,188 +1,255 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsModifier * @subpackage PluginsModifier
*/ */
/**
/** * Smarty escape modifier plugin
* Smarty escape modifier plugin * Type: modifier
* * Name: escape
* Type: modifier<br> * Purpose: escape string for output
* Name: escape<br> *
* Purpose: escape string for output * @link http://www.smarty.net/docs/en/language.modifier.escape
* * @author Monte Ohrt <monte at ohrt dot com>
* @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 $string input string * @param string $esc_type escape type
* @param string $esc_type escape type * @param string $char_set character set, used for htmlspecialchars() or htmlentities()
* @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()
* @param boolean $double_encode encode already encoded entitites again, used for htmlspecialchars() or htmlentities() *
* @return string escaped input string * @return string escaped input string
*/ */
function smarty_modifier_escape($string, $esc_type = 'html', $char_set = null, $double_encode = true) function smarty_modifier_escape($string, $esc_type = 'html', $char_set = null, $double_encode = true)
{ {
static $_double_encode = null; static $_double_encode = null;
if ($_double_encode === null) { static $is_loaded_1 = false;
$_double_encode = version_compare(PHP_VERSION, '5.2.3', '>='); static $is_loaded_2 = false;
} if ($_double_encode === null) {
$_double_encode = version_compare(PHP_VERSION, '5.2.3', '>=');
if (!$char_set) { }
$char_set = Smarty::$_CHARSET; if (!$char_set) {
} $char_set = Smarty::$_CHARSET;
}
switch ($esc_type) { switch ($esc_type) {
case 'html': case 'html':
if ($_double_encode) { if ($_double_encode) {
// php >=5.3.2 - go native // php >=5.3.2 - go native
return htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode); return htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode);
} else { } else {
if ($double_encode) { if ($double_encode) {
// php <5.2.3 - only handle double encoding // php <5.2.3 - only handle double encoding
return htmlspecialchars($string, ENT_QUOTES, $char_set); return htmlspecialchars($string, ENT_QUOTES, $char_set);
} else { } else {
// php <5.2.3 - prevent double encoding // php <5.2.3 - prevent double encoding
$string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string);
$string = htmlspecialchars($string, ENT_QUOTES, $char_set); $string = htmlspecialchars($string, ENT_QUOTES, $char_set);
$string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string); $string = str_replace(
return $string; array(
} '%%%SMARTY_START%%%',
} '%%%SMARTY_END%%%'
),
case 'htmlall': array(
if (Smarty::$_MBSTRING) { '&',
// mb_convert_encoding ignores htmlspecialchars() ';'
if ($_double_encode) { ),
// php >=5.3.2 - go native $string
$string = htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode); );
} else { return $string;
if ($double_encode) { }
// php <5.2.3 - only handle double encoding }
$string = htmlspecialchars($string, ENT_QUOTES, $char_set); // no break
} else { case 'htmlall':
// php <5.2.3 - prevent double encoding if (Smarty::$_MBSTRING) {
$string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); // mb_convert_encoding ignores htmlspecialchars()
$string = htmlspecialchars($string, ENT_QUOTES, $char_set); if ($_double_encode) {
$string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string); // php >=5.3.2 - go native
return $string; $string = htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode);
} } else {
} if ($double_encode) {
// php <5.2.3 - only handle double encoding
// htmlentities() won't convert everything, so use mb_convert_encoding $string = htmlspecialchars($string, ENT_QUOTES, $char_set);
return mb_convert_encoding($string, 'HTML-ENTITIES', $char_set); } else {
} // php <5.2.3 - prevent double encoding
$string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string);
// no MBString fallback $string = htmlspecialchars($string, ENT_QUOTES, $char_set);
if ($_double_encode) { $string =
return htmlentities($string, ENT_QUOTES, $char_set, $double_encode); str_replace(
} else { array(
if ($double_encode) { '%%%SMARTY_START%%%',
return htmlentities($string, ENT_QUOTES, $char_set); '%%%SMARTY_END%%%'
} else { ),
$string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); array(
$string = htmlentities($string, ENT_QUOTES, $char_set); '&',
$string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string); ';'
return $string; ),
} $string
} );
return $string;
case 'url': }
return rawurlencode($string); }
// htmlentities() won't convert everything, so use mb_convert_encoding
case 'urlpathinfo': return mb_convert_encoding($string, 'HTML-ENTITIES', $char_set);
return str_replace('%2F', '/', rawurlencode($string)); }
// no MBString fallback
case 'quotes': if ($_double_encode) {
// escape unescaped single quotes return htmlentities($string, ENT_QUOTES, $char_set, $double_encode);
return preg_replace("%(?<!\\\\)'%", "\\'", $string); } else {
if ($double_encode) {
case 'hex': return htmlentities($string, ENT_QUOTES, $char_set);
// escape every byte into hex } else {
// Note that the UTF-8 encoded character ä will be represented as %c3%a4 $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string);
$return = ''; $string = htmlentities($string, ENT_QUOTES, $char_set);
$_length = strlen($string); $string = str_replace(
for ($x = 0; $x < $_length; $x++) { array(
$return .= '%' . bin2hex($string[$x]); '%%%SMARTY_START%%%',
} '%%%SMARTY_END%%%'
return $return; ),
array(
case 'hexentity': '&',
$return = ''; ';'
if (Smarty::$_MBSTRING) { ),
require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php'); $string
$return = ''; );
foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) { return $string;
$return .= '&#x' . strtoupper(dechex($unicode)) . ';'; }
} }
return $return; // no break
} case 'url':
// no MBString fallback return rawurlencode($string);
$_length = strlen($string); case 'urlpathinfo':
for ($x = 0; $x < $_length; $x++) { return str_replace('%2F', '/', rawurlencode($string));
$return .= '&#x' . bin2hex($string[$x]) . ';'; case 'quotes':
} // escape unescaped single quotes
return $return; return preg_replace("%(?<!\\\\)'%", "\\'", $string);
case 'hex':
case 'decentity': // escape every byte into hex
$return = ''; // Note that the UTF-8 encoded character ä will be represented as %c3%a4
if (Smarty::$_MBSTRING) { $return = '';
require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php'); $_length = strlen($string);
$return = ''; for ($x = 0; $x < $_length; $x++) {
foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) { $return .= '%' . bin2hex($string[ $x ]);
$return .= '&#' . $unicode . ';'; }
} return $return;
return $return; case 'hexentity':
} $return = '';
// no MBString fallback if (Smarty::$_MBSTRING) {
$_length = strlen($string); if (!$is_loaded_1) {
for ($x = 0; $x < $_length; $x++) { if (!is_callable('smarty_mb_to_unicode')) {
$return .= '&#' . ord($string[$x]) . ';'; include_once SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php';
} }
return $return; $is_loaded_1 = true;
}
case 'javascript': $return = '';
// escape quotes and backslashes, newlines, etc. foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) {
return strtr($string, array('\\' => '\\\\', "'" => "\\'", '"' => '\\"', "\r" => '\\r', "\n" => '\\n', '</' => '<\/')); $return .= '&#x' . strtoupper(dechex($unicode)) . ';';
}
case 'mail': return $return;
if (Smarty::$_MBSTRING) { }
require_once(SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php'); // no MBString fallback
return smarty_mb_str_replace(array('@', '.'), array(' [AT] ', ' [DOT] '), $string); $_length = strlen($string);
} for ($x = 0; $x < $_length; $x++) {
// no MBString fallback $return .= '&#x' . bin2hex($string[ $x ]) . ';';
return str_replace(array('@', '.'), array(' [AT] ', ' [DOT] '), $string); }
return $return;
case 'nonstd': case 'decentity':
// escape non-standard chars, such as ms document quotes $return = '';
$return = ''; if (Smarty::$_MBSTRING) {
if (Smarty::$_MBSTRING) { if (!$is_loaded_1) {
require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php'); if (!is_callable('smarty_mb_to_unicode')) {
foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) { include_once SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php';
if ($unicode >= 126) { }
$return .= '&#' . $unicode . ';'; $is_loaded_1 = true;
} else { }
$return .= chr($unicode); $return = '';
} foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) {
} $return .= '&#' . $unicode . ';';
return $return; }
} return $return;
}
$_length = strlen($string); // no MBString fallback
for ($_i = 0; $_i < $_length; $_i++) { $_length = strlen($string);
$_ord = ord(substr($string, $_i, 1)); for ($x = 0; $x < $_length; $x++) {
// non-standard char, escape it $return .= '&#' . ord($string[ $x ]) . ';';
if ($_ord >= 126) { }
$return .= '&#' . $_ord . ';'; return $return;
} else { case 'javascript':
$return .= substr($string, $_i, 1); // escape quotes and backslashes, newlines, etc.
} return strtr(
} $string,
return $return; array(
'\\' => '\\\\',
default: "'" => "\\'",
return $string; '"' => '\\"',
} "\r" => '\\r',
} "\n" => '\\n',
'</' => '<\/'
?> )
);
case 'mail':
if (Smarty::$_MBSTRING) {
if (!$is_loaded_2) {
if (!is_callable('smarty_mb_str_replace')) {
include_once SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php';
}
$is_loaded_2 = true;
}
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) {
if (!$is_loaded_1) {
if (!is_callable('smarty_mb_to_unicode')) {
include_once SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php';
}
$is_loaded_1 = true;
}
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;
}
}

View file

@ -0,0 +1,71 @@
<?php
/**
* Smarty plugin
*
* @package Smarty
* @subpackage PluginsModifier
*/
/**
* Smarty wordwrap modifier plugin
* Type: modifier
* Name: mb_wordwrap
* Purpose: Wrap a string to a given number of characters
*
* @link http://php.net/manual/en/function.wordwrap.php for similarity
*
* @param string $str the string to wrap
* @param int $width the width of the output
* @param string $break the character used to break the line
* @param boolean $cut ignored parameter, just for the sake of
*
* @return string wrapped string
* @author Rodney Rehm
*/
function smarty_modifier_mb_wordwrap($str, $width = 75, $break = "\n", $cut = false)
{
// break words into tokens using white space as a delimiter
$tokens = preg_split('!(\s)!S' . Smarty::$_UTF8_MODIFIER, $str, -1, PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE);
$length = 0;
$t = '';
$_previous = false;
$_space = false;
foreach ($tokens as $_token) {
$token_length = mb_strlen($_token, Smarty::$_CHARSET);
$_tokens = array($_token);
if ($token_length > $width) {
if ($cut) {
$_tokens = preg_split(
'!(.{' . $width . '})!S' . Smarty::$_UTF8_MODIFIER,
$_token,
-1,
PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE
);
}
}
foreach ($_tokens as $token) {
$_space = !!preg_match('!^\s$!S' . Smarty::$_UTF8_MODIFIER, $token);
$token_length = mb_strlen($token, Smarty::$_CHARSET);
$length += $token_length;
if ($length > $width) {
// remove space before inserted break
if ($_previous) {
$t = mb_substr($t, 0, -1, Smarty::$_CHARSET);
}
if (!$_space) {
// add the break before the token
if (!empty($t)) {
$t .= $break;
}
$length = $token_length;
}
} elseif ($token === "\n") {
// hard break must reset counters
$length = 0;
}
$_previous = $_space;
// add the token
$t .= $token;
}
}
return $t;
}

View file

@ -1,55 +1,55 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsModifier * @subpackage PluginsModifier
*/ */
/**
/** * Smarty regex_replace modifier plugin
* Smarty regex_replace modifier plugin * Type: modifier
* * Name: regex_replace
* Type: modifier<br> * Purpose: regular expression search/replace
* 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)
* @link http://smarty.php.net/manual/en/language.modifier.regex.replace.php * @author Monte Ohrt <monte at ohrt dot com>
* regex_replace (Smarty online manual) *
* @author Monte Ohrt <monte at ohrt dot com> * @param string $string input string
* @param string $string input string * @param string|array $search regular expression(s) to search for
* @param string|array $search regular expression(s) to search for * @param string|array $replace string(s) that should be replaced
* @param string|array $replace string(s) that should be replaced * @param int $limit the maximum number of replacements
* @return string *
*/ * @return string
function smarty_modifier_regex_replace($string, $search, $replace) */
{ function smarty_modifier_regex_replace($string, $search, $replace, $limit = -1)
if(is_array($search)) { {
foreach($search as $idx => $s) { if (is_array($search)) {
$search[$idx] = _smarty_regex_replace_check($s); foreach ($search as $idx => $s) {
} $search[ $idx ] = _smarty_regex_replace_check($s);
} else { }
$search = _smarty_regex_replace_check($search); } else {
} $search = _smarty_regex_replace_check($search);
return preg_replace($search, $replace, $string); }
} return preg_replace($search, $replace, $string, $limit);
}
/**
* @param string $search string(s) that should be replaced /**
* @return string * @param string $search string(s) that should be replaced
* @ignore *
*/ * @return string
function _smarty_regex_replace_check($search) * @ignore
{ */
// null-byte injection detection function _smarty_regex_replace_check($search)
// anything behind the first null-byte is ignored {
if (($pos = strpos($search,"\0")) !== false) { // null-byte injection detection
$search = substr($search,0,$pos); // anything behind the first null-byte is ignored
} if (($pos = strpos($search, "\0")) !== false) {
// remove eval-modifier from $search $search = substr($search, 0, $pos);
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]); // remove eval-modifier from $search
} if (preg_match('!([a-zA-Z\s]+)$!s', $search, $match) && (strpos($match[ 1 ], 'e') !== false)) {
return $search; $search = substr($search, 0, -strlen($match[ 1 ])) . preg_replace('![e\s]+!', '', $match[ 1 ]);
} }
return $search;
?> }

View file

@ -1,33 +1,37 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* @package Smarty *
* @subpackage PluginsModifier * @package Smarty
*/ * @subpackage PluginsModifier
*/
/** /**
* Smarty replace modifier plugin * Smarty replace modifier plugin
* * Type: modifier
* Type: modifier<br> * Name: replace
* Name: replace<br> * Purpose: simple search/replace
* Purpose: simple search/replace *
* * @link http://smarty.php.net/manual/en/language.modifier.replace.php replace (Smarty online manual)
* @link http://smarty.php.net/manual/en/language.modifier.replace.php replace (Smarty online manual) * @author Monte Ohrt <monte at ohrt dot com>
* @author Monte Ohrt <monte at ohrt dot com> * @author Uwe Tews
* @author Uwe Tews *
* @param string $string input string * @param string $string input string
* @param string $search text to search for * @param string $search text to search for
* @param string $replace replacement text * @param string $replace replacement text
* @return string *
*/ * @return string
function smarty_modifier_replace($string, $search, $replace) */
{ function smarty_modifier_replace($string, $search, $replace)
if (Smarty::$_MBSTRING) { {
require_once(SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php'); static $is_loaded = false;
return smarty_mb_str_replace($search, $replace, $string); if (Smarty::$_MBSTRING) {
} if (!$is_loaded) {
if (!is_callable('smarty_mb_str_replace')) {
return str_replace($search, $replace, $string); include_once SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php';
} }
$is_loaded = true;
?> }
return smarty_mb_str_replace($search, $replace, $string);
}
return str_replace($search, $replace, $string);
}

View file

@ -1,27 +1,26 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* @package Smarty *
* @subpackage PluginsModifier * @package Smarty
*/ * @subpackage PluginsModifier
*/
/** /**
* Smarty spacify modifier plugin * Smarty spacify modifier plugin
* * Type: modifier
* Type: modifier<br> * Name: spacify
* Name: spacify<br> * Purpose: add spaces between characters in a string
* Purpose: add spaces between characters in a string *
* * @link http://smarty.php.net/manual/en/language.modifier.spacify.php spacify (Smarty online manual)
* @link http://smarty.php.net/manual/en/language.modifier.spacify.php spacify (Smarty online manual) * @author Monte Ohrt <monte at ohrt dot com>
* @author Monte Ohrt <monte at ohrt dot com> *
* @param string $string input string * @param string $string input string
* @param string $spacify_char string to insert between characters. * @param string $spacify_char string to insert between characters.
* @return string *
*/ * @return string
function smarty_modifier_spacify($string, $spacify_char = ' ') */
{ 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)); // well… what about charsets besides latin and UTF-8?
} return implode($spacify_char, preg_split('//' . Smarty::$_UTF8_MODIFIER, $string, -1, PREG_SPLIT_NO_EMPTY));
}
?>

View file

@ -1,59 +1,62 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsModifier * @subpackage PluginsModifier
*/ */
/**
/** * Smarty truncate modifier plugin
* Smarty truncate modifier plugin * Type: modifier
* * Name: truncate
* Type: modifier<br> * Purpose: Truncate a string to a certain length if necessary,
* Name: truncate<br> * optionally splitting in the middle of a word, and
* Purpose: Truncate a string to a certain length if necessary, * appending the $etc string or inserting $etc into the middle.
* 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>
* @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 string $string input string * @param integer $length length of truncated text
* @param integer $length length of truncated text * @param string $etc end string
* @param string $etc end string * @param boolean $break_words truncate at word boundary
* @param boolean $break_words truncate at word boundary * @param boolean $middle truncate in the middle of text
* @param boolean $middle truncate in the middle of text *
* @return string truncated string * @return string truncated string
*/ */
function smarty_modifier_truncate($string, $length = 80, $etc = '...', $break_words = false, $middle = false) { function smarty_modifier_truncate($string, $length = 80, $etc = '...', $break_words = false, $middle = false)
if ($length == 0) {
return ''; if ($length === 0) {
return '';
if (Smarty::$_MBSTRING) { }
if (mb_strlen($string, Smarty::$_CHARSET) > $length) { if (Smarty::$_MBSTRING) {
$length -= min($length, mb_strlen($etc, Smarty::$_CHARSET)); if (mb_strlen($string, Smarty::$_CHARSET) > $length) {
if (!$break_words && !$middle) { $length -= min($length, mb_strlen($etc, Smarty::$_CHARSET));
$string = preg_replace('/\s+?(\S+)?$/' . Smarty::$_UTF8_MODIFIER, '', mb_substr($string, 0, $length + 1, Smarty::$_CHARSET)); if (!$break_words && !$middle) {
} $string = preg_replace(
if (!$middle) { '/\s+?(\S+)?$/' . Smarty::$_UTF8_MODIFIER,
return mb_substr($string, 0, $length, Smarty::$_CHARSET) . $etc; '',
} mb_substr($string, 0, $length + 1, Smarty::$_CHARSET)
return mb_substr($string, 0, $length / 2, Smarty::$_CHARSET) . $etc . mb_substr($string, - $length / 2, $length, Smarty::$_CHARSET); );
} }
return $string; if (!$middle) {
} return mb_substr($string, 0, $length, Smarty::$_CHARSET) . $etc;
}
// no MBString fallback return mb_substr($string, 0, $length / 2, Smarty::$_CHARSET) . $etc .
if (isset($string[$length])) { mb_substr($string, -$length / 2, $length, Smarty::$_CHARSET);
$length -= min($length, strlen($etc)); }
if (!$break_words && !$middle) { return $string;
$string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length + 1)); }
} // no MBString fallback
if (!$middle) { if (isset($string[ $length ])) {
return substr($string, 0, $length) . $etc; $length -= min($length, strlen($etc));
} if (!$break_words && !$middle) {
return substr($string, 0, $length / 2) . $etc . substr($string, - $length / 2); $string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length + 1));
} }
return $string; if (!$middle) {
} return substr($string, 0, $length) . $etc;
}
?> return substr($string, 0, $length / 2) . $etc . substr($string, -$length / 2);
}
return $string;
}

View file

@ -1,30 +1,28 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsModifierCompiler * @subpackage PluginsModifierCompiler
*/ */
/**
/** * Smarty cat modifier plugin
* Smarty cat modifier plugin * Type: modifier
* * Name: cat
* Type: modifier<br> * Date: Feb 24, 2003
* Name: cat<br> * Purpose: catenate a value to a variable
* Date: Feb 24, 2003<br> * Input: string to catenate
* Purpose: catenate a value to a variable<br> * Example: {$var|cat:"foo"}
* Input: string to catenate<br> *
* Example: {$var|cat:"foo"} * @link http://smarty.php.net/manual/en/language.modifier.cat.php cat
* * (Smarty online manual)
* @link http://smarty.php.net/manual/en/language.modifier.cat.php cat * @author Uwe Tews
* (Smarty online manual) *
* @author Uwe Tews * @param array $params parameters
* @param array $params parameters *
* @return string with compiled code * @return string with compiled code
*/ */
function smarty_modifiercompiler_cat($params, $compiler) function smarty_modifiercompiler_cat($params)
{ {
return '('.implode(').(', $params).')'; return '(' . implode(').(', $params) . ')';
} }
?>

View file

@ -1,33 +1,32 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsModifierCompiler * @subpackage PluginsModifierCompiler
*/ */
/**
/** * Smarty count_characters modifier plugin
* Smarty count_characters modifier plugin * Type: modifier
* * Name: count_characters
* Type: modifier<br> * Purpose: count the number of characters in a text
* 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)
* @link http://www.smarty.net/manual/en/language.modifier.count.characters.php count_characters (Smarty online manual) * @author Uwe Tews
* @author Uwe Tews *
* @param array $params parameters * @param array $params parameters
* @return string with compiled code *
*/ * @return string with compiled code
function smarty_modifiercompiler_count_characters($params, $compiler) */
{ function smarty_modifiercompiler_count_characters($params)
if (!isset($params[1]) || $params[1] != 'true') { {
return 'preg_match_all(\'/[^\s]/' . Smarty::$_UTF8_MODIFIER . '\',' . $params[0] . ', $tmp)'; 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) . '\')'; if (Smarty::$_MBSTRING) {
} return 'mb_strlen(' . $params[ 0 ] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')';
// no MBString fallback }
return 'strlen(' . $params[0] . ')'; // no MBString fallback
} return 'strlen(' . $params[ 0 ] . ')';
}
?>

View file

@ -1,28 +1,26 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsModifierCompiler * @subpackage PluginsModifierCompiler
*/ */
/**
/** * Smarty count_paragraphs modifier plugin
* Smarty count_paragraphs modifier plugin * Type: modifier
* * Name: count_paragraphs
* Type: modifier<br> * Purpose: count the number of paragraphs in a text
* 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)
* @link http://www.smarty.net/manual/en/language.modifier.count.paragraphs.php * @author Uwe Tews
* count_paragraphs (Smarty online manual) *
* @author Uwe Tews * @param array $params parameters
* @param array $params parameters *
* @return string with compiled code * @return string with compiled code
*/ */
function smarty_modifiercompiler_count_paragraphs($params, $compiler) function smarty_modifiercompiler_count_paragraphs($params)
{ {
// count \r or \n characters // count \r or \n characters
return '(preg_match_all(\'#[\r\n]+#\', ' . $params[0] . ', $tmp)+1)'; return '(preg_match_all(\'#[\r\n]+#\', ' . $params[ 0 ] . ', $tmp)+1)';
} }
?>

View file

@ -1,28 +1,26 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsModifierCompiler * @subpackage PluginsModifierCompiler
*/ */
/**
/** * Smarty count_sentences modifier plugin
* Smarty count_sentences modifier plugin * Type: modifier
* * Name: count_sentences
* Type: modifier<br> * Purpose: count the number of sentences in a text
* 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)
* @link http://www.smarty.net/manual/en/language.modifier.count.paragraphs.php * @author Uwe Tews
* count_sentences (Smarty online manual) *
* @author Uwe Tews * @param array $params parameters
* @param array $params parameters *
* @return string with compiled code * @return string with compiled code
*/ */
function smarty_modifiercompiler_count_sentences($params, $compiler) function smarty_modifiercompiler_count_sentences($params)
{ {
// find periods, question marks, exclamation marks with a word before but not after. // 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)'; return 'preg_match_all("#\w[\.\?\!](\W|$)#S' . Smarty::$_UTF8_MODIFIER . '", ' . $params[ 0 ] . ', $tmp)';
} }
?>

View file

@ -1,32 +1,31 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsModifierCompiler * @subpackage PluginsModifierCompiler
*/ */
/**
/** * Smarty count_words modifier plugin
* Smarty count_words modifier plugin * Type: modifier
* * Name: count_words
* Type: modifier<br> * Purpose: count the number of words in a text
* 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
* @link http://www.smarty.net/manual/en/language.modifier.count.words.php count_words (Smarty online manual) *
* @author Uwe Tews * @param array $params parameters
* @param array $params parameters *
* @return string with compiled code * @return string with compiled code
*/ */
function smarty_modifiercompiler_count_words($params, $compiler) function smarty_modifiercompiler_count_words($params)
{ {
if (Smarty::$_MBSTRING) { if (Smarty::$_MBSTRING) {
// return 'preg_match_all(\'#[\w\pL]+#' . Smarty::$_UTF8_MODIFIER . '\', ' . $params[0] . ', $tmp)'; // 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 // 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)'; 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] . ')'; // no MBString fallback
} return 'str_word_count(' . $params[ 0 ] . ')';
}
?>

View file

@ -1,35 +1,32 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsModifierCompiler * @subpackage PluginsModifierCompiler
*/ */
/**
/** * Smarty default modifier plugin
* Smarty default modifier plugin * Type: modifier
* * Name: default
* Type: modifier<br> * Purpose: designate default value for empty variables
* 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
* @link http://www.smarty.net/manual/en/language.modifier.default.php default (Smarty online manual) *
* @author Uwe Tews * @param array $params parameters
* @param array $params parameters *
* @return string with compiled code * @return string with compiled code
*/ */
function smarty_modifiercompiler_default ($params, $compiler) function smarty_modifiercompiler_default($params)
{ {
$output = $params[0]; $output = $params[ 0 ];
if (!isset($params[1])) { if (!isset($params[ 1 ])) {
$params[1] = "''"; $params[ 1 ] = "''";
} }
array_shift($params);
array_shift($params); foreach ($params as $param) {
foreach ($params as $param) { $output = '(($tmp = @' . $output . ')===null||$tmp===\'\' ? ' . $param . ' : $tmp)';
$output = '(($tmp = @' . $output . ')===null||$tmp===\'\' ? ' . $param . ' : $tmp)'; }
} return $output;
return $output; }
}
?>

View file

@ -1,125 +1,112 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsModifierCompiler * @subpackage PluginsModifierCompiler
*/ */
/**
/** * Smarty escape modifier plugin
* @ignore * Type: modifier
*/ * Name: escape
require_once( SMARTY_PLUGINS_DIR .'shared.literal_compiler_param.php' ); * Purpose: escape string for output
*
/** * @link http://www.smarty.net/docsv2/en/language.modifier.escape count_characters (Smarty online manual)
* Smarty escape modifier plugin * @author Rodney Rehm
* *
* Type: modifier<br> * @param array $params parameters
* Name: escape<br> * @param Smarty_Internal_TemplateCompilerBase $compiler
* Purpose: escape string for output *
* * @return string with compiled code
* @link http://www.smarty.net/docsv2/en/language.modifier.escape count_characters (Smarty online manual) * @throws \SmartyException
* @author Rodney Rehm */
* @param array $params parameters function smarty_modifiercompiler_escape($params, Smarty_Internal_TemplateCompilerBase $compiler)
* @return string with compiled code {
*/ static $_double_encode = null;
function smarty_modifiercompiler_escape($params, $compiler) static $is_loaded = false;
{ $compiler->template->_checkPlugins(
static $_double_encode = null; array(
if ($_double_encode === null) { array(
$_double_encode = version_compare(PHP_VERSION, '5.2.3', '>='); 'function' => 'smarty_literal_compiler_param',
} 'file' => SMARTY_PLUGINS_DIR . 'shared.literal_compiler_param.php'
)
try { )
$esc_type = smarty_literal_compiler_param($params, 1, 'html'); );
$char_set = smarty_literal_compiler_param($params, 2, Smarty::$_CHARSET); if ($_double_encode === null) {
$double_encode = smarty_literal_compiler_param($params, 3, true); $_double_encode = version_compare(PHP_VERSION, '5.2.3', '>=');
}
if (!$char_set) { try {
$char_set = Smarty::$_CHARSET; $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);
switch ($esc_type) { if (!$char_set) {
case 'html': $char_set = Smarty::$_CHARSET;
if ($_double_encode) { }
return 'htmlspecialchars(' switch ($esc_type) {
. $params[0] .', ENT_QUOTES, ' case 'html':
. var_export($char_set, true) . ', ' if ($_double_encode) {
. var_export($double_encode, true) . ')'; return 'htmlspecialchars(' . $params[ 0 ] . ', ENT_QUOTES, ' . var_export($char_set, true) . ', ' .
} else if ($double_encode) { var_export($double_encode, true) . ')';
return 'htmlspecialchars(' } elseif ($double_encode) {
. $params[0] .', ENT_QUOTES, ' return 'htmlspecialchars(' . $params[ 0 ] . ', ENT_QUOTES, ' . var_export($char_set, true) . ')';
. var_export($char_set, true) . ')'; } else {
} else { // fall back to modifier.escape.php
// fall back to modifier.escape.php }
} // no break
case 'htmlall':
case 'htmlall': if (Smarty::$_MBSTRING) {
if (Smarty::$_MBSTRING) { if ($_double_encode) {
if ($_double_encode) { // php >=5.2.3 - go native
// php >=5.2.3 - go native return 'mb_convert_encoding(htmlspecialchars(' . $params[ 0 ] . ', ENT_QUOTES, ' .
return 'mb_convert_encoding(htmlspecialchars(' var_export($char_set, true) . ', ' . var_export($double_encode, true) .
. $params[0] .', ENT_QUOTES, ' '), "HTML-ENTITIES", ' . var_export($char_set, true) . ')';
. var_export($char_set, true) . ', ' } elseif ($double_encode) {
. var_export($double_encode, true) // php <5.2.3 - only handle double encoding
. '), "HTML-ENTITIES", ' return 'mb_convert_encoding(htmlspecialchars(' . $params[ 0 ] . ', ENT_QUOTES, ' .
. var_export($char_set, true) . ')'; var_export($char_set, true) . '), "HTML-ENTITIES", ' . var_export($char_set, true) . ')';
} else if ($double_encode) { } else {
// php <5.2.3 - only handle double encoding // fall back to modifier.escape.php
return 'mb_convert_encoding(htmlspecialchars(' }
. $params[0] .', ENT_QUOTES, ' }
. var_export($char_set, true) // no MBString fallback
. '), "HTML-ENTITIES", ' if ($_double_encode) {
. var_export($char_set, true) . ')'; // php >=5.2.3 - go native
} else { return 'htmlentities(' . $params[ 0 ] . ', ENT_QUOTES, ' . var_export($char_set, true) . ', ' .
// fall back to modifier.escape.php var_export($double_encode, true) . ')';
} } elseif ($double_encode) {
} // php <5.2.3 - only handle double encoding
return 'htmlentities(' . $params[ 0 ] . ', ENT_QUOTES, ' . var_export($char_set, true) . ')';
// no MBString fallback } else {
if ($_double_encode) { // fall back to modifier.escape.php
// php >=5.2.3 - go native }
return 'htmlentities(' // no break
. $params[0] .', ENT_QUOTES, ' case 'url':
. var_export($char_set, true) . ', ' return 'rawurlencode(' . $params[ 0 ] . ')';
. var_export($double_encode, true) . ')'; case 'urlpathinfo':
} else if ($double_encode) { return 'str_replace("%2F", "/", rawurlencode(' . $params[ 0 ] . '))';
// php <5.2.3 - only handle double encoding case 'quotes':
return 'htmlentities(' // escape unescaped single quotes
. $params[0] .', ENT_QUOTES, ' return 'preg_replace("%(?<!\\\\\\\\)\'%", "\\\'",' . $params[ 0 ] . ')';
. var_export($char_set, true) . ')'; case 'javascript':
} else { // escape quotes and backslashes, newlines, etc.
// fall back to modifier.escape.php return 'strtr(' .
} $params[ 0 ] .
', array("\\\\" => "\\\\\\\\", "\'" => "\\\\\'", "\"" => "\\\\\"", "\\r" => "\\\\r", "\\n" => "\\\n", "</" => "<\/" ))';
case 'url': }
return 'rawurlencode(' . $params[0] . ')'; } catch (SmartyException $e) {
// pass through to regular plugin fallback
case 'urlpathinfo': }
return 'str_replace("%2F", "/", rawurlencode(' . $params[0] . '))'; // could not optimize |escape call, so fallback to regular plugin
if ($compiler->template->caching && ($compiler->tag_nocache | $compiler->nocache)) {
case 'quotes': $compiler->required_plugins[ 'nocache' ][ 'escape' ][ 'modifier' ][ 'file' ] =
// escape unescaped single quotes SMARTY_PLUGINS_DIR . 'modifier.escape.php';
return 'preg_replace("%(?<!\\\\\\\\)\'%", "\\\'",' . $params[0] . ')'; $compiler->required_plugins[ 'nocache' ][ 'escape' ][ 'modifier' ][ 'function' ] =
'smarty_modifier_escape';
case 'javascript': } else {
// escape quotes and backslashes, newlines, etc. $compiler->required_plugins[ 'compiled' ][ 'escape' ][ 'modifier' ][ 'file' ] =
return 'strtr(' . $params[0] . ', array("\\\\" => "\\\\\\\\", "\'" => "\\\\\'", "\"" => "\\\\\"", "\\r" => "\\\\r", "\\n" => "\\\n", "</" => "<\/" ))'; SMARTY_PLUGINS_DIR . 'modifier.escape.php';
$compiler->required_plugins[ 'compiled' ][ 'escape' ][ 'modifier' ][ 'function' ] =
} 'smarty_modifier_escape';
} catch(SmartyException $e) { }
// pass through to regular plugin fallback return 'smarty_modifier_escape(' . join(', ', $params) . ')';
} }
// 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 ) . ')';
}
?>

View file

@ -1,34 +1,30 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsModifierCompiler * @subpackage PluginsModifierCompiler
*/ */
/**
/** * Smarty from_charset modifier plugin
* Smarty from_charset modifier plugin * Type: modifier
* * Name: from_charset
* Type: modifier<br> * Purpose: convert character encoding from $charset to internal encoding
* Name: from_charset<br> *
* Purpose: convert character encoding from $charset to internal encoding * @author Rodney Rehm
* *
* @author Rodney Rehm * @param array $params parameters
* @param array $params parameters *
* @return string with compiled code * @return string with compiled code
*/ */
function smarty_modifiercompiler_from_charset($params, $compiler) function smarty_modifiercompiler_from_charset($params)
{ {
if (!Smarty::$_MBSTRING) { if (!Smarty::$_MBSTRING) {
// FIXME: (rodneyrehm) shouldn't this throw an error? // FIXME: (rodneyrehm) shouldn't this throw an error?
return $params[0]; return $params[ 0 ];
} }
if (!isset($params[ 1 ])) {
if (!isset($params[1])) { $params[ 1 ] = '"ISO-8859-1"';
$params[1] = '"ISO-8859-1"'; }
} return 'mb_convert_encoding(' . $params[ 0 ] . ', "' . addslashes(Smarty::$_CHARSET) . '", ' . $params[ 1 ] . ')';
}
return 'mb_convert_encoding(' . $params[0] . ', "' . addslashes(Smarty::$_CHARSET) . '", ' . $params[1] . ')';
}
?>

View file

@ -1,32 +1,30 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* @package Smarty *
* @subpackage PluginsModifierCompiler * @package Smarty
*/ * @subpackage PluginsModifierCompiler
*/
/** /**
* Smarty indent modifier plugin * Smarty indent modifier plugin
* * Type: modifier
* Type: modifier<br> * Name: indent
* Name: indent<br> * Purpose: indent lines of text
* Purpose: indent lines of text *
* * @link http://www.smarty.net/manual/en/language.modifier.indent.php indent (Smarty online manual)
* @link http://www.smarty.net/manual/en/language.modifier.indent.php indent (Smarty online manual) * @author Uwe Tews
* @author Uwe Tews *
* @param array $params parameters * @param array $params parameters
* @return string with compiled code *
*/ * @return string with compiled code
*/
function smarty_modifiercompiler_indent($params, $compiler) function smarty_modifiercompiler_indent($params)
{ {
if (!isset($params[1])) { if (!isset($params[ 1 ])) {
$params[1] = 4; $params[ 1 ] = 4;
} }
if (!isset($params[2])) { if (!isset($params[ 2 ])) {
$params[2] = "' '"; $params[ 2 ] = "' '";
} }
return 'preg_replace(\'!^!m\',str_repeat(' . $params[2] . ',' . $params[1] . '),' . $params[0] . ')'; return 'preg_replace(\'!^!m\',str_repeat(' . $params[ 2 ] . ',' . $params[ 1 ] . '),' . $params[ 0 ] . ')';
} }
?>

View file

@ -1,31 +1,29 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* @package Smarty *
* @subpackage PluginsModifierCompiler * @package Smarty
*/ * @subpackage PluginsModifierCompiler
*/
/** /**
* Smarty lower modifier plugin * Smarty lower modifier plugin
* * Type: modifier
* Type: modifier<br> * Name: lower
* Name: lower<br> * Purpose: convert string to lowercase
* Purpose: convert string to lowercase *
* * @link http://www.smarty.net/manual/en/language.modifier.lower.php lower (Smarty online manual)
* @link http://www.smarty.net/manual/en/language.modifier.lower.php lower (Smarty online manual) * @author Monte Ohrt <monte at ohrt dot com>
* @author Monte Ohrt <monte at ohrt dot com> * @author Uwe Tews
* @author Uwe Tews *
* @param array $params parameters * @param array $params parameters
* @return string with compiled code *
*/ * @return string with compiled code
*/
function smarty_modifiercompiler_lower($params, $compiler) function smarty_modifiercompiler_lower($params)
{ {
if (Smarty::$_MBSTRING) { if (Smarty::$_MBSTRING) {
return 'mb_strtolower(' . $params[0] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')' ; return 'mb_strtolower(' . $params[ 0 ] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')';
} }
// no MBString fallback // no MBString fallback
return 'strtolower(' . $params[0] . ')'; return 'strtolower(' . $params[ 0 ] . ')';
} }
?>

View file

@ -1,25 +1,20 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsModifierCompiler * @subpackage PluginsModifierCompiler
*/ */
/**
/** * Smarty noprint modifier plugin
* Smarty noprint modifier plugin * Type: modifier
* * Name: noprint
* Type: modifier<br> * Purpose: return an empty string
* Name: noprint<br> *
* Purpose: return an empty string * @author Uwe Tews
* * @return string with compiled code
* @author Uwe Tews */
* @param array $params parameters function smarty_modifiercompiler_noprint()
* @return string with compiled code {
*/ return "''";
function smarty_modifiercompiler_noprint($params, $compiler) }
{
return "''";
}
?>

View file

@ -1,26 +1,24 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsModifierCompiler * @subpackage PluginsModifierCompiler
*/ */
/**
/** * Smarty string_format modifier plugin
* Smarty string_format modifier plugin * Type: modifier
* * Name: string_format
* Type: modifier<br> * Purpose: format strings via sprintf
* 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
* @link http://www.smarty.net/manual/en/language.modifier.string.format.php string_format (Smarty online manual) *
* @author Uwe Tews * @param array $params parameters
* @param array $params parameters *
* @return string with compiled code * @return string with compiled code
*/ */
function smarty_modifiercompiler_string_format($params, $compiler) function smarty_modifiercompiler_string_format($params)
{ {
return 'sprintf(' . $params[1] . ',' . $params[0] . ')'; return 'sprintf(' . $params[ 1 ] . ',' . $params[ 0 ] . ')';
} }
?>

View file

@ -1,33 +1,30 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsModifierCompiler * @subpackage PluginsModifierCompiler
*/ */
/**
/** * Smarty strip modifier plugin
* Smarty strip modifier plugin * Type: modifier
* * Name: strip
* Type: modifier<br> * Purpose: Replace all repeated spaces, newlines, tabs
* Name: strip<br> * with a single space or supplied replacement string.
* Purpose: Replace all repeated spaces, newlines, tabs * Example: {$var|strip} {$var|strip:"&nbsp;"}
* with a single space or supplied replacement string.<br> * Date: September 25th, 2002
* Example: {$var|strip} {$var|strip:"&nbsp;"}<br> *
* Date: September 25th, 2002 * @link http://www.smarty.net/manual/en/language.modifier.strip.php strip (Smarty online manual)
* * @author Uwe Tews
* @link http://www.smarty.net/manual/en/language.modifier.strip.php strip (Smarty online manual) *
* @author Uwe Tews * @param array $params parameters
* @param array $params parameters *
* @return string with compiled code * @return string with compiled code
*/ */
function smarty_modifiercompiler_strip($params)
function smarty_modifiercompiler_strip($params, $compiler) {
{ if (!isset($params[ 1 ])) {
if (!isset($params[1])) { $params[ 1 ] = "' '";
$params[1] = "' '"; }
} return "preg_replace('!\s+!" . Smarty::$_UTF8_MODIFIER . "', {$params[1]},{$params[0]})";
return "preg_replace('!\s+!" . Smarty::$_UTF8_MODIFIER . "', {$params[1]},{$params[0]})"; }
}
?>

View file

@ -1,33 +1,28 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsModifierCompiler * @subpackage PluginsModifierCompiler
*/ */
/**
/** * Smarty strip_tags modifier plugin
* Smarty strip_tags modifier plugin * Type: modifier
* * Name: strip_tags
* Type: modifier<br> * Purpose: strip html tags from text
* Name: strip_tags<br> *
* Purpose: strip html tags from text * @link http://www.smarty.net/docs/en/language.modifier.strip.tags.tpl strip_tags (Smarty online manual)
* * @author Uwe Tews
* @link http://www.smarty.net/manual/en/language.modifier.strip.tags.php strip_tags (Smarty online manual) *
* @author Uwe Tews * @param array $params parameters
* @param array $params parameters *
* @return string with compiled code * @return string with compiled code
*/ */
function smarty_modifiercompiler_strip_tags($params, $compiler) function smarty_modifiercompiler_strip_tags($params)
{ {
if (!isset($params[1])) { if (!isset($params[ 1 ]) || $params[ 1 ] === true || trim($params[ 1 ], '"') === 'true') {
$params[1] = true; return "preg_replace('!<[^>]*?>!', ' ', {$params[0]})";
} } else {
if ($params[1] === true) { return 'strip_tags(' . $params[ 0 ] . ')';
return "preg_replace('!<[^>]*?>!', ' ', {$params[0]})"; }
} else { }
return 'strip_tags(' . $params[0] . ')';
}
}
?>

View file

@ -1,34 +1,30 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsModifierCompiler * @subpackage PluginsModifierCompiler
*/ */
/**
/** * Smarty to_charset modifier plugin
* Smarty to_charset modifier plugin * Type: modifier
* * Name: to_charset
* Type: modifier<br> * Purpose: convert character encoding from internal encoding to $charset
* Name: to_charset<br> *
* Purpose: convert character encoding from internal encoding to $charset * @author Rodney Rehm
* *
* @author Rodney Rehm * @param array $params parameters
* @param array $params parameters *
* @return string with compiled code * @return string with compiled code
*/ */
function smarty_modifiercompiler_to_charset($params, $compiler) function smarty_modifiercompiler_to_charset($params)
{ {
if (!Smarty::$_MBSTRING) { if (!Smarty::$_MBSTRING) {
// FIXME: (rodneyrehm) shouldn't this throw an error? // FIXME: (rodneyrehm) shouldn't this throw an error?
return $params[0]; return $params[ 0 ];
} }
if (!isset($params[ 1 ])) {
if (!isset($params[1])) { $params[ 1 ] = '"ISO-8859-1"';
$params[1] = '"ISO-8859-1"'; }
} return 'mb_convert_encoding(' . $params[ 0 ] . ', ' . $params[ 1 ] . ', "' . addslashes(Smarty::$_CHARSET) . '")';
}
return 'mb_convert_encoding(' . $params[0] . ', ' . $params[1] . ', "' . addslashes(Smarty::$_CHARSET) . '")';
}
?>

View file

@ -1,51 +1,44 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsModifierCompiler * @subpackage PluginsModifierCompiler
*/ */
/**
/** * Smarty unescape modifier plugin
* Smarty unescape modifier plugin * Type: modifier
* * Name: unescape
* Type: modifier<br> * Purpose: unescape html entities
* Name: unescape<br> *
* Purpose: unescape html entities * @author Rodney Rehm
* *
* @author Rodney Rehm * @param array $params parameters
* @param array $params parameters *
* @return string with compiled code * @return string with compiled code
*/ */
function smarty_modifiercompiler_unescape($params, $compiler) function smarty_modifiercompiler_unescape($params)
{ {
if (!isset($params[1])) { if (!isset($params[ 1 ])) {
$params[1] = 'html'; $params[ 1 ] = 'html';
} }
if (!isset($params[2])) { if (!isset($params[ 2 ])) {
$params[2] = '\'' . addslashes(Smarty::$_CHARSET) . '\''; $params[ 2 ] = '\'' . addslashes(Smarty::$_CHARSET) . '\'';
} else { } else {
$params[2] = "'" . $params[2] . "'"; $params[ 2 ] = "'{$params[ 2 ]}'";
} }
switch (trim($params[ 1 ], '"\'')) {
switch (trim($params[1], '"\'')) { case 'entity':
case 'entity': case 'htmlall':
case 'htmlall': if (Smarty::$_MBSTRING) {
if (Smarty::$_MBSTRING) { return 'mb_convert_encoding(' . $params[ 0 ] . ', ' . $params[ 2 ] . ', \'HTML-ENTITIES\')';
return 'mb_convert_encoding(' . $params[0] . ', ' . $params[2] . ', \'HTML-ENTITIES\')'; }
} return 'html_entity_decode(' . $params[ 0 ] . ', ENT_NOQUOTES, ' . $params[ 2 ] . ')';
case 'html':
return 'html_entity_decode(' . $params[0] . ', ENT_NOQUOTES, ' . $params[2] . ')'; return 'htmlspecialchars_decode(' . $params[ 0 ] . ', ENT_QUOTES)';
case 'url':
case 'html': return 'rawurldecode(' . $params[ 0 ] . ')';
return 'htmlspecialchars_decode(' . $params[0] . ', ENT_QUOTES)'; default:
return $params[ 0 ];
case 'url': }
return 'rawurldecode(' . $params[0] . ')'; }
default:
return $params[0];
}
}
?>

View file

@ -1,30 +1,28 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsModifierCompiler * @subpackage PluginsModifierCompiler
*/ */
/**
/** * Smarty upper modifier plugin
* Smarty upper modifier plugin * Type: modifier
* * Name: lower
* Type: modifier<br> * Purpose: convert string to uppercase
* Name: lower<br> *
* Purpose: convert string to uppercase * @link http://smarty.php.net/manual/en/language.modifier.upper.php lower (Smarty online manual)
* * @author Uwe Tews
* @link http://smarty.php.net/manual/en/language.modifier.upper.php lower (Smarty online manual) *
* @author Uwe Tews * @param array $params parameters
* @param array $params parameters *
* @return string with compiled code * @return string with compiled code
*/ */
function smarty_modifiercompiler_upper($params, $compiler) function smarty_modifiercompiler_upper($params)
{ {
if (Smarty::$_MBSTRING) { if (Smarty::$_MBSTRING) {
return 'mb_strtoupper(' . $params[0] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')' ; return 'mb_strtoupper(' . $params[ 0 ] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')';
} }
// no MBString fallback // no MBString fallback
return 'strtoupper(' . $params[0] . ')'; return 'strtoupper(' . $params[ 0 ] . ')';
} }
?>

View file

@ -1,46 +1,39 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsModifierCompiler * @subpackage PluginsModifierCompiler
*/ */
/**
/** * Smarty wordwrap modifier plugin
* Smarty wordwrap modifier plugin * Type: modifier
* * Name: wordwrap
* Type: modifier<br> * Purpose: wrap a string of text at a given length
* Name: wordwrap<br> *
* Purpose: wrap a string of text at a given length * @link http://smarty.php.net/manual/en/language.modifier.wordwrap.php wordwrap (Smarty online manual)
* * @author Uwe Tews
* @link http://smarty.php.net/manual/en/language.modifier.wordwrap.php wordwrap (Smarty online manual) *
* @author Uwe Tews * @param array $params parameters
* @param array $params parameters * @param \Smarty_Internal_TemplateCompilerBase $compiler
* @return string with compiled code *
*/ * @return string with compiled code
function smarty_modifiercompiler_wordwrap($params, $compiler) * @throws \SmartyException
{ */
if (!isset($params[1])) { function smarty_modifiercompiler_wordwrap($params, Smarty_Internal_TemplateCompilerBase $compiler)
$params[1] = 80; {
} if (!isset($params[ 1 ])) {
if (!isset($params[2])) { $params[ 1 ] = 80;
$params[2] = '"\n"'; }
} if (!isset($params[ 2 ])) {
if (!isset($params[3])) { $params[ 2 ] = '"\n"';
$params[3] = 'false'; }
} if (!isset($params[ 3 ])) {
$function = 'wordwrap'; $params[ 3 ] = 'false';
if (Smarty::$_MBSTRING) { }
if ($compiler->tag_nocache | $compiler->nocache) { $function = 'wordwrap';
$compiler->template->required_plugins['nocache']['wordwrap']['modifier']['file'] = SMARTY_PLUGINS_DIR .'shared.mb_wordwrap.php'; if (Smarty::$_MBSTRING) {
$compiler->template->required_plugins['nocache']['wordwrap']['modifier']['function'] = 'smarty_mb_wordwrap'; $function = $compiler->getPlugin('mb_wordwrap', 'modifier');
} else { }
$compiler->template->required_plugins['compiled']['wordwrap']['modifier']['file'] = SMARTY_PLUGINS_DIR .'shared.mb_wordwrap.php'; return $function . '(' . $params[ 0 ] . ',' . $params[ 1 ] . ',' . $params[ 2 ] . ',' . $params[ 3 ] . ')';
$compiler->template->required_plugins['compiled']['wordwrap']['modifier']['function'] = 'smarty_mb_wordwrap'; }
}
$function = 'smarty_mb_wordwrap';
}
return $function . '(' . $params[0] . ',' . $params[1] . ',' . $params[2] . ',' . $params[3] . ')';
}
?>

View file

@ -1,94 +1,89 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsFilter * @subpackage PluginsFilter
*/ */
/**
/** * Smarty trimwhitespace outputfilter plugin
* Smarty trimwhitespace outputfilter plugin * Trim unnecessary whitespace from HTML markup.
* *
* Trim unnecessary whitespace from HTML markup. * @author Rodney Rehm
* *
* @author Rodney Rehm * @param string $source input string
* @param string $source input string *
* @param Smarty_Internal_Template $smarty Smarty object * @return string filtered output
* @return string filtered output * @todo substr_replace() is not overloaded by mbstring.func_overload - so this function might fail!
* @todo substr_replace() is not overloaded by mbstring.func_overload - so this function might fail! */
*/ function smarty_outputfilter_trimwhitespace($source)
function smarty_outputfilter_trimwhitespace($source, Smarty_Internal_Template $smarty) {
{ $store = array();
$store = array(); $_store = 0;
$_store = 0; $_offset = 0;
$_offset = 0; // Unify Line-Breaks to \n
$source = preg_replace('/\015\012|\015|\012/', "\n", $source);
// Unify Line-Breaks to \n // capture Internet Explorer and KnockoutJS Conditional Comments
$source = preg_replace("/\015\012|\015|\012/", "\n", $source); if (preg_match_all(
'#<!--((\[[^\]]+\]>.*?<!\[[^\]]+\])|(\s*/?ko\s+.+))-->#is',
// capture Internet Explorer Conditional Comments $source,
if (preg_match_all('#<!--\[[^\]]+\]>.*?<!\[[^\]]+\]-->#is', $source, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) { $matches,
foreach ($matches as $match) { PREG_OFFSET_CAPTURE | PREG_SET_ORDER
$store[] = $match[0][0]; )
$_length = strlen($match[0][0]); ) {
$replace = '@!@SMARTY:' . $_store . ':SMARTY@!@'; foreach ($matches as $match) {
$source = substr_replace($source, $replace, $match[0][1] - $_offset, $_length); $store[] = $match[ 0 ][ 0 ];
$_length = strlen($match[ 0 ][ 0 ]);
$_offset += $_length - strlen($replace); $replace = '@!@SMARTY:' . $_store . ':SMARTY@!@';
$_store++; $source = substr_replace($source, $replace, $match[ 0 ][ 1 ] - $_offset, $_length);
} $_offset += $_length - strlen($replace);
} $_store++;
}
// Strip all HTML-Comments }
// yes, even the ones in <script> - see http://stackoverflow.com/a/808850/515124 // Strip all HTML-Comments
$source = preg_replace( '#<!--.*?-->#ms', '', $source ); // yes, even the ones in <script> - see http://stackoverflow.com/a/808850/515124
$source = preg_replace('#<!--.*?-->#ms', '', $source);
// capture html elements not to be messed with // capture html elements not to be messed with
$_offset = 0; $_offset = 0;
if (preg_match_all('#<(script|pre|textarea)[^>]*>.*?</\\1>#is', $source, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) { if (preg_match_all(
foreach ($matches as $match) { '#(<script[^>]*>.*?</script[^>]*>)|(<textarea[^>]*>.*?</textarea[^>]*>)|(<pre[^>]*>.*?</pre[^>]*>)#is',
$store[] = $match[0][0]; $source,
$_length = strlen($match[0][0]); $matches,
$replace = '@!@SMARTY:' . $_store . ':SMARTY@!@'; PREG_OFFSET_CAPTURE | PREG_SET_ORDER
$source = substr_replace($source, $replace, $match[0][1] - $_offset, $_length); )
) {
$_offset += $_length - strlen($replace); foreach ($matches as $match) {
$_store++; $store[] = $match[ 0 ][ 0 ];
} $_length = strlen($match[ 0 ][ 0 ]);
} $replace = '@!@SMARTY:' . $_store . ':SMARTY@!@';
$source = substr_replace($source, $replace, $match[ 0 ][ 1 ] - $_offset, $_length);
$expressions = array( $_offset += $_length - strlen($replace);
// replace multiple spaces between tags by a single space $_store++;
// can't remove them entirely, becaue that might break poorly implemented CSS display:inline-block elements }
'#(:SMARTY@!@|>)\s+(?=@!@SMARTY:|<)#s' => '\1 \2', }
// remove spaces between attributes (but not in attribute values!) $expressions = array(// replace multiple spaces between tags by a single space
'#(([a-z0-9]\s*=\s*(["\'])[^\3]*?\3)|<[a-z0-9_]+)\s+([a-z/>])#is' => '\1 \4', // can't remove them entirely, becaue that might break poorly implemented CSS display:inline-block elements
// note: for some very weird reason trim() seems to remove spaces inside attributes. '#(:SMARTY@!@|>)\s+(?=@!@SMARTY:|<)#s' => '\1 \2',
// maybe a \0 byte or something is interfering? // remove spaces between attributes (but not in attribute values!)
'#^\s+<#Ss' => '<', '#(([a-z0-9]\s*=\s*("[^"]*?")|(\'[^\']*?\'))|<[a-z0-9_]+)\s+([a-z/>])#is' => '\1 \5',
'#>\s+$#Ss' => '>', // note: for some very weird reason trim() seems to remove spaces inside attributes.
); // maybe a \0 byte or something is interfering?
'#^\s+<#Ss' => '<',
$source = preg_replace( array_keys($expressions), array_values($expressions), $source ); '#>\s+$#Ss' => '>',
// note: for some very weird reason trim() seems to remove spaces inside attributes. );
// maybe a \0 byte or something is interfering? $source = preg_replace(array_keys($expressions), array_values($expressions), $source);
// $source = trim( $source ); // note: for some very weird reason trim() seems to remove spaces inside attributes.
// maybe a \0 byte or something is interfering?
// capture html elements not to be messed with // $source = trim( $source );
$_offset = 0; $_offset = 0;
if (preg_match_all('#@!@SMARTY:([0-9]+):SMARTY@!@#is', $source, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) { if (preg_match_all('#@!@SMARTY:([0-9]+):SMARTY@!@#is', $source, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) {
foreach ($matches as $match) { foreach ($matches as $match) {
$store[] = $match[0][0]; $_length = strlen($match[ 0 ][ 0 ]);
$_length = strlen($match[0][0]); $replace = $store[ $match[ 1 ][ 0 ] ];
$replace = array_shift($store); $source = substr_replace($source, $replace, $match[ 0 ][ 1 ] + $_offset, $_length);
$source = substr_replace($source, $replace, $match[0][1] + $_offset, $_length); $_offset += strlen($replace) - $_length;
$_store++;
$_offset += strlen($replace) - $_length; }
$_store++; }
} return $source;
} }
return $source;
}
?>

View file

@ -1,51 +1,32 @@
<?php <?php
/** /**
* Smarty shared plugin * Smarty shared plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsShared * @subpackage PluginsShared
*/ */
/**
if (version_compare(PHP_VERSION, '5.2.3', '>=')) { * escape_special_chars common function
/** * Function: smarty_function_escape_special_chars
* escape_special_chars common function * Purpose: used by other smarty functions to escape
* * special chars except for already escaped ones
* Function: smarty_function_escape_special_chars<br> *
* Purpose: used by other smarty functions to escape * @author Monte Ohrt <monte at ohrt dot com>
* special chars except for already escaped ones *
* * @param string $string text that should by escaped
* @author Monte Ohrt <monte at ohrt dot com> *
* @param string $string text that should by escaped * @return string
* @return string */
*/ function smarty_function_escape_special_chars($string)
function smarty_function_escape_special_chars($string) {
{ if (!is_array($string)) {
if (!is_array($string)) { if (version_compare(PHP_VERSION, '5.2.3', '>=')) {
$string = htmlspecialchars($string, ENT_COMPAT, Smarty::$_CHARSET, false); $string = htmlspecialchars($string, ENT_COMPAT, Smarty::$_CHARSET, false);
} } else {
return $string; $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string);
} $string = htmlspecialchars($string);
} else { $string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string);
/** }
* escape_special_chars common function }
* return $string;
* Function: smarty_function_escape_special_chars<br> }
* Purpose: used by other smarty functions to escape
* special chars except for already escaped ones
*
* @author Monte Ohrt <monte at ohrt dot com>
* @param string $string text that should by escaped
* @return string
*/
function smarty_function_escape_special_chars($string)
{
if (!is_array($string)) {
$string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string);
$string = htmlspecialchars($string);
$string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string);
}
return $string;
}
}
?>

View file

@ -1,33 +1,35 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsShared * @subpackage PluginsShared
*/ */
/**
/** * evaluate compiler parameter
* evaluate compiler parameter *
* * @param array $params parameter array as given to the compiler function
* @param array $params parameter array as given to the compiler function * @param integer $index array index of the parameter to convert
* @param integer $index array index of the parameter to convert * @param mixed $default value to be returned if the parameter is not present
* @param mixed $default value to be returned if the parameter is not present *
* @return mixed evaluated value of parameter or $default * @return mixed evaluated value of parameter or $default
* @throws SmartyException if parameter is not a literal (but an expression, variable, ) * @throws SmartyException if parameter is not a literal (but an expression, variable, )
* @author Rodney Rehm * @author Rodney Rehm
*/ */
function smarty_literal_compiler_param($params, $index, $default=null) function smarty_literal_compiler_param($params, $index, $default = null)
{ {
// not set, go default // not set, go default
if (!isset($params[$index])) { if (!isset($params[ $index ])) {
return $default; return $default;
} }
// test if param is a literal // test if param is a literal
if (!preg_match('/^([\'"]?)[a-zA-Z0-9]+(\\1)$/', $params[$index])) { if (!preg_match('/^([\'"]?)[a-zA-Z0-9-]+(\\1)$/', $params[ $index ])) {
throw new SmartyException('$param[' . $index . '] is not a literal and is thus not evaluatable at compile time'); throw new SmartyException(
} '$param[' . $index .
'] is not a literal and is thus not evaluatable at compile time'
$t = null; );
eval("\$t = " . $params[$index] . ";"); }
return $t; $t = null;
} eval("\$t = " . $params[ $index ] . ";");
return $t;
}

View file

@ -1,42 +1,49 @@
<?php <?php
/** /**
* Smarty shared plugin * Smarty shared plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsShared * @subpackage PluginsShared
*/ */
/**
/** * Function: smarty_make_timestamp
* Function: smarty_make_timestamp<br> * Purpose: used by other smarty functions to make a timestamp from a string.
* Purpose: used by other smarty functions to make a timestamp from a string. *
* * @author Monte Ohrt <monte at ohrt dot com>
* @author Monte Ohrt <monte at ohrt dot com> *
* @param DateTime|int|string $string date object, timestamp or string that can be converted using strtotime() * @param DateTime|int|string $string date object, timestamp or string that can be converted using strtotime()
* @return int *
*/ * @return int
function smarty_make_timestamp($string) */
{ function smarty_make_timestamp($string)
if (empty($string)) { {
// use "now": if (empty($string)) {
return time(); // use "now":
} elseif ($string instanceof DateTime) { return time();
return $string->getTimestamp(); } elseif ($string instanceof DateTime
} elseif (strlen($string) == 14 && ctype_digit($string)) { || (interface_exists('DateTimeInterface', false) && $string instanceof DateTimeInterface)
// it is mysql timestamp format of YYYYMMDDHHMMSS? ) {
return mktime(substr($string, 8, 2),substr($string, 10, 2),substr($string, 12, 2), return (int)$string->format('U'); // PHP 5.2 BC
substr($string, 4, 2),substr($string, 6, 2),substr($string, 0, 4)); } elseif (strlen($string) === 14 && ctype_digit($string)) {
} elseif (is_numeric($string)) { // it is mysql timestamp format of YYYYMMDDHHMMSS?
// it is a numeric string, we handle it as timestamp return mktime(
return (int) $string; substr($string, 8, 2),
} else { substr($string, 10, 2),
// strtotime should handle it substr($string, 12, 2),
$time = strtotime($string); substr($string, 4, 2),
if ($time == -1 || $time === false) { substr($string, 6, 2),
// strtotime() was not able to parse $string, use "now": substr($string, 0, 4)
return time(); );
} } elseif (is_numeric($string)) {
return $time; // it is a numeric string, we handle it as timestamp
} return (int)$string;
} } else {
// strtotime should handle it
?> $time = strtotime($string);
if ($time === -1 || $time === false) {
// strtotime() was not able to parse $string, use "now":
return time();
}
return $time;
}
}

View file

@ -1,55 +1,53 @@
<?php <?php
/** /**
* Smarty shared plugin * Smarty shared plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsShared * @subpackage PluginsShared
*/ */
if (!function_exists('smarty_mb_str_replace')) { if (!function_exists('smarty_mb_str_replace')) {
/**
/** * Multibyte string replace
* Multibyte string replace *
* * @param string|string[] $search the string to be searched
* @param string $search the string to be searched * @param string|string[] $replace the replacement string
* @param string $replace the replacement string * @param string $subject the source string
* @param string $subject the source string * @param int &$count number of matches found
* @param int &$count number of matches found *
* @return string replaced string * @return string replaced string
* @author Rodney Rehm * @author Rodney Rehm
*/ */
function smarty_mb_str_replace($search, $replace, $subject, &$count=0) function smarty_mb_str_replace($search, $replace, $subject, &$count = 0)
{ {
if (!is_array($search) && is_array($replace)) { if (!is_array($search) && is_array($replace)) {
return false; return false;
} }
if (is_array($subject)) { if (is_array($subject)) {
// call mb_replace for each single string in $subject // call mb_replace for each single string in $subject
foreach ($subject as &$string) { foreach ($subject as &$string) {
$string = &smarty_mb_str_replace($search, $replace, $string, $c); $string = smarty_mb_str_replace($search, $replace, $string, $c);
$count += $c; $count += $c;
} }
} elseif (is_array($search)) { } elseif (is_array($search)) {
if (!is_array($replace)) { if (!is_array($replace)) {
foreach ($search as &$string) { foreach ($search as &$string) {
$subject = smarty_mb_str_replace($string, $replace, $subject, $c); $subject = smarty_mb_str_replace($string, $replace, $subject, $c);
$count += $c; $count += $c;
} }
} else { } else {
$n = max(count($search), count($replace)); $n = max(count($search), count($replace));
while ($n--) { while ($n--) {
$subject = smarty_mb_str_replace(current($search), current($replace), $subject, $c); $subject = smarty_mb_str_replace(current($search), current($replace), $subject, $c);
$count += $c; $count += $c;
next($search); next($search);
next($replace); next($replace);
} }
} }
} else { } else {
$parts = mb_split(preg_quote($search), $subject); $parts = mb_split(preg_quote($search), $subject);
$count = count($parts) - 1; $count = count($parts) - 1;
$subject = implode($replace, $parts); $subject = implode($replace, $parts);
} }
return $subject; return $subject;
} }
}
}
?>

View file

@ -1,48 +1,51 @@
<?php <?php
/** /**
* Smarty shared plugin * Smarty shared plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsShared * @subpackage PluginsShared
*/ */
/**
/** * convert characters to their decimal unicode equivalents
* convert characters to their decimal unicode equivalents *
* * @link http://www.ibm.com/developerworks/library/os-php-unicode/index.html#listing3 for inspiration
* @link http://www.ibm.com/developerworks/library/os-php-unicode/index.html#listing3 for inspiration *
* @param string $string characters to calculate unicode of * @param string $string characters to calculate unicode of
* @param string $encoding encoding of $string, if null mb_internal_encoding() is used * @param string $encoding encoding of $string, if null mb_internal_encoding() is used
* @return array sequence of unicodes *
* @author Rodney Rehm * @return array sequence of unicodes
*/ * @author Rodney Rehm
function smarty_mb_to_unicode($string, $encoding=null) { */
if ($encoding) { function smarty_mb_to_unicode($string, $encoding = null)
$expanded = mb_convert_encoding($string, "UTF-32BE", $encoding); {
} else { if ($encoding) {
$expanded = mb_convert_encoding($string, "UTF-32BE"); $expanded = mb_convert_encoding($string, 'UTF-32BE', $encoding);
} } else {
return unpack("N*", $expanded); $expanded = mb_convert_encoding($string, 'UTF-32BE');
} }
return unpack('N*', $expanded);
/** }
* convert unicodes to the character of given encoding
* /**
* @link http://www.ibm.com/developerworks/library/os-php-unicode/index.html#listing3 for inspiration * convert unicodes to the character of given encoding
* @param integer|array $unicode single unicode or list of unicodes to convert *
* @param string $encoding encoding of returned string, if null mb_internal_encoding() is used * @link http://www.ibm.com/developerworks/library/os-php-unicode/index.html#listing3 for inspiration
* @return string unicode as character sequence in given $encoding *
* @author Rodney Rehm * @param integer|array $unicode single unicode or list of unicodes to convert
*/ * @param string $encoding encoding of returned string, if null mb_internal_encoding() is used
function smarty_mb_from_unicode($unicode, $encoding=null) { *
$t = ''; * @return string unicode as character sequence in given $encoding
if (!$encoding) { * @author Rodney Rehm
$encoding = mb_internal_encoding(); */
} function smarty_mb_from_unicode($unicode, $encoding = null)
foreach((array) $unicode as $utf32be) { {
$character = pack("N*", $utf32be); $t = '';
$t .= mb_convert_encoding($character, $encoding, "UTF-32BE"); if (!$encoding) {
} $encoding = mb_internal_encoding();
return $t; }
} foreach ((array)$unicode as $utf32be) {
$character = pack('N*', $utf32be);
?> $t .= mb_convert_encoding($character, $encoding, 'UTF-32BE');
}
return $t;
}

View file

@ -1,83 +0,0 @@
<?php
/**
* Smarty shared plugin
*
* @package Smarty
* @subpackage PluginsShared
*/
if(!function_exists('smarty_mb_wordwrap')) {
/**
* Wrap a string to a given number of characters
*
* @link http://php.net/manual/en/function.wordwrap.php for similarity
* @param string $str the string to wrap
* @param int $width the width of the output
* @param string $break the character used to break the line
* @param boolean $cut ignored parameter, just for the sake of
* @return string wrapped string
* @author Rodney Rehm
*/
function smarty_mb_wordwrap($str, $width=75, $break="\n", $cut=false)
{
// break words into tokens using white space as a delimiter
$tokens = preg_split('!(\s)!S' . Smarty::$_UTF8_MODIFIER, $str, -1, PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE);
$length = 0;
$t = '';
$_previous = false;
foreach ($tokens as $_token) {
$token_length = mb_strlen($_token, Smarty::$_CHARSET);
$_tokens = array($_token);
if ($token_length > $width) {
// remove last space
$t = mb_substr($t, 0, -1, Smarty::$_CHARSET);
$_previous = false;
$length = 0;
if ($cut) {
$_tokens = preg_split('!(.{' . $width . '})!S' . Smarty::$_UTF8_MODIFIER, $_token, -1, PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE);
// broken words go on a new line
$t .= $break;
}
}
foreach ($_tokens as $token) {
$_space = !!preg_match('!^\s$!S' . Smarty::$_UTF8_MODIFIER, $token);
$token_length = mb_strlen($token, Smarty::$_CHARSET);
$length += $token_length;
if ($length > $width) {
// remove space before inserted break
if ($_previous && $token_length < $width) {
$t = mb_substr($t, 0, -1, Smarty::$_CHARSET);
}
// add the break before the token
$t .= $break;
$length = $token_length;
// skip space after inserting a break
if ($_space) {
$length = 0;
continue;
}
} else if ($token == "\n") {
// hard break must reset counters
$_previous = 0;
$length = 0;
} else {
// remember if we had a space or not
$_previous = $_space;
}
// add the token
$t .= $token;
}
}
return $t;
}
}
?>

View file

@ -1,21 +1,19 @@
<?php <?php
/** /**
* Smarty plugin * Smarty plugin
* *
* @package Smarty * @package Smarty
* @subpackage PluginsFilter * @subpackage PluginsFilter
*/ */
/**
/** * Smarty htmlspecialchars variablefilter plugin
* Smarty htmlspecialchars variablefilter plugin *
* * @param string $source input string
* @param string $source input string * @param \Smarty_Internal_Template $template
* @param Smarty_Internal_Template $smarty Smarty object *
* @return string filtered output * @return string filtered output
*/ */
function smarty_variablefilter_htmlspecialchars($source, $smarty) function smarty_variablefilter_htmlspecialchars($source, Smarty_Internal_Template $template)
{ {
return htmlspecialchars($source, ENT_QUOTES, Smarty::$_CHARSET); return htmlspecialchars($source, ENT_QUOTES, Smarty::$_CHARSET);
} }
?>

View file

@ -1,8 +0,0 @@
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
<p>Directory access is forbidden.</p>
</body>
</html>

View file

@ -1,381 +1,219 @@
<?php <?php
/** /**
* Smarty Internal Plugin * Smarty Internal Plugin
* *
* @package Smarty * @package Smarty
* @subpackage Cacher * @subpackage Cacher
*/ */
/** /**
* Cache Handler API * Cache Handler API
* *
* @package Smarty * @package Smarty
* @subpackage Cacher * @subpackage Cacher
* @author Rodney Rehm * @author Rodney Rehm
*/ */
abstract class Smarty_CacheResource { abstract class Smarty_CacheResource
/** {
* cache for Smarty_CacheResource instances /**
* @var array * resource types provided by the core
*/ *
public static $resources = array(); * @var array
*/
/** protected static $sysplugins = array('file' => 'smarty_internal_cacheresource_file.php',);
* resource types provided by the core
* @var array /**
*/ * populate Cached Object with meta data from Resource
protected static $sysplugins = array( *
'file' => true, * @param \Smarty_Template_Cached $cached cached object
); * @param Smarty_Internal_Template $_template template object
*
/** * @return void
* populate Cached Object with meta data from Resource */
* abstract public function populate(\Smarty_Template_Cached $cached, Smarty_Internal_Template $_template);
* @param Smarty_Template_Cached $cached cached object
* @param Smarty_Internal_Template $_template template object /**
* @return void * populate Cached Object with timestamp and exists from Resource
*/ *
public abstract function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template); * @param Smarty_Template_Cached $cached
*
/** * @return void
* populate Cached Object with timestamp and exists from Resource */
* abstract public function populateTimestamp(Smarty_Template_Cached $cached);
* @param Smarty_Template_Cached $source cached object
* @return void /**
*/ * Read the cached template and process header
public abstract function populateTimestamp(Smarty_Template_Cached $cached); *
* @param Smarty_Internal_Template $_template template object
/** * @param Smarty_Template_Cached $cached cached object
* Read the cached template and process header * @param boolean $update flag if called because cache update
* *
* @param Smarty_Internal_Template $_template template object * @return boolean true or false if the cached content does not exist
* @param Smarty_Template_Cached $cached cached object */
* @return booelan true or false if the cached content does not exist abstract public function process(
*/ Smarty_Internal_Template $_template,
public abstract function process(Smarty_Internal_Template $_template, Smarty_Template_Cached $cached=null); Smarty_Template_Cached $cached = null,
$update = false
/** );
* Write the rendered template output to cache
* /**
* @param Smarty_Internal_Template $_template template object * Write the rendered template output to cache
* @param string $content content to cache *
* @return boolean success * @param Smarty_Internal_Template $_template template object
*/ * @param string $content content to cache
public abstract function writeCachedContent(Smarty_Internal_Template $_template, $content); *
* @return boolean success
/** */
* Return cached content abstract public function writeCachedContent(Smarty_Internal_Template $_template, $content);
*
* @param Smarty_Internal_Template $_template template object /**
* @param string $content content of cache * Read cached template from cache
*/ *
public function getCachedContent(Smarty_Internal_Template $_template) * @param Smarty_Internal_Template $_template template object
{ *
if ($_template->cached->handler->process($_template)) { * @return string content
ob_start(); */
$_template->properties['unifunc']($_template); abstract public function readCachedContent(Smarty_Internal_Template $_template);
return ob_get_clean();
} /**
return null; * Return cached content
} *
* @param Smarty_Internal_Template $_template template object
/** *
* Empty cache * @return null|string
* */
* @param Smarty $smarty Smarty object public function getCachedContent(Smarty_Internal_Template $_template)
* @param integer $exp_time expiration time (number of seconds, not timestamp) {
* @return integer number of cache files deleted if ($_template->cached->handler->process($_template)) {
*/ ob_start();
public abstract function clearAll(Smarty $smarty, $exp_time=null); $unifunc = $_template->cached->unifunc;
$unifunc($_template);
/** return ob_get_clean();
* Empty cache for a specific template }
* return null;
* @param Smarty $smarty Smarty object }
* @param string $resource_name template name
* @param string $cache_id cache id /**
* @param string $compile_id compile id * Empty cache
* @param integer $exp_time expiration time (number of seconds, not timestamp) *
* @return integer number of cache files deleted * @param Smarty $smarty Smarty object
*/ * @param integer $exp_time expiration time (number of seconds, not timestamp)
public abstract function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time); *
* @return integer number of cache files deleted
*/
public function locked(Smarty $smarty, Smarty_Template_Cached $cached) abstract public function clearAll(Smarty $smarty, $exp_time = null);
{
// theoretically locking_timeout should be checked against time_limit (max_execution_time) /**
$start = microtime(true); * Empty cache for a specific template
$hadLock = null; *
while ($this->hasLock($smarty, $cached)) { * @param Smarty $smarty Smarty object
$hadLock = true; * @param string $resource_name template name
if (microtime(true) - $start > $smarty->locking_timeout) { * @param string $cache_id cache id
// abort waiting for lock release * @param string $compile_id compile id
return false; * @param integer $exp_time expiration time (number of seconds, not timestamp)
} *
sleep(1); * @return integer number of cache files deleted
} */
return $hadLock; abstract public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time);
}
/**
public function hasLock(Smarty $smarty, Smarty_Template_Cached $cached) * @param Smarty $smarty
{ * @param Smarty_Template_Cached $cached
// check if lock exists *
return false; * @return bool|null
} */
public function locked(Smarty $smarty, Smarty_Template_Cached $cached)
public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached) {
{ // theoretically locking_timeout should be checked against time_limit (max_execution_time)
// create lock $start = microtime(true);
return true; $hadLock = null;
} while ($this->hasLock($smarty, $cached)) {
$hadLock = true;
public function releaseLock(Smarty $smarty, Smarty_Template_Cached $cached) if (microtime(true) - $start > $smarty->locking_timeout) {
{ // abort waiting for lock release
// release lock return false;
return true; }
} sleep(1);
}
return $hadLock;
/** }
* Load Cache Resource Handler
* /**
* @param Smarty $smarty Smarty object * Check is cache is locked for this template
* @param string $type name of the cache resource *
* @return Smarty_CacheResource Cache Resource Handler * @param Smarty $smarty
*/ * @param Smarty_Template_Cached $cached
public static function load(Smarty $smarty, $type = null) *
{ * @return bool
if (!isset($type)) { */
$type = $smarty->caching_type; public function hasLock(Smarty $smarty, Smarty_Template_Cached $cached)
} {
// check if lock exists
// try smarty's cache return false;
if (isset($smarty->_cacheresource_handlers[$type])) { }
return $smarty->_cacheresource_handlers[$type];
} /**
* Lock cache for this template
// try registered resource *
if (isset($smarty->registered_cache_resources[$type])) { * @param Smarty $smarty
// do not cache these instances as they may vary from instance to instance * @param Smarty_Template_Cached $cached
return $smarty->_cacheresource_handlers[$type] = $smarty->registered_cache_resources[$type]; *
} * @return bool
// try sysplugins dir */
if (isset(self::$sysplugins[$type])) { public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached)
if (!isset(self::$resources[$type])) { {
$cache_resource_class = 'Smarty_Internal_CacheResource_' . ucfirst($type); // create lock
self::$resources[$type] = new $cache_resource_class(); return true;
} }
return $smarty->_cacheresource_handlers[$type] = self::$resources[$type];
} /**
// try plugins dir * Unlock cache for this template
$cache_resource_class = 'Smarty_CacheResource_' . ucfirst($type); *
if ($smarty->loadPlugin($cache_resource_class)) { * @param Smarty $smarty
if (!isset(self::$resources[$type])) { * @param Smarty_Template_Cached $cached
self::$resources[$type] = new $cache_resource_class(); *
} * @return bool
return $smarty->_cacheresource_handlers[$type] = self::$resources[$type]; */
} public function releaseLock(Smarty $smarty, Smarty_Template_Cached $cached)
// give up {
throw new SmartyException("Unable to load cache resource '{$type}'"); // release lock
} return true;
}
/**
* Invalid Loaded Cache Files /**
* * Load Cache Resource Handler
* @param Smarty $smarty Smarty object *
*/ * @param Smarty $smarty Smarty object
public static function invalidLoadedCache(Smarty $smarty) * @param string $type name of the cache resource
{ *
foreach ($smarty->template_objects as $tpl) { * @throws SmartyException
if (isset($tpl->cached)) { * @return Smarty_CacheResource Cache Resource Handler
$tpl->cached->valid = false; */
$tpl->cached->processed = false; public static function load(Smarty $smarty, $type = null)
} {
} if (!isset($type)) {
} $type = $smarty->caching_type;
} }
// try smarty's cache
/** if (isset($smarty->_cache[ 'cacheresource_handlers' ][ $type ])) {
* Smarty Resource Data Object return $smarty->_cache[ 'cacheresource_handlers' ][ $type ];
* }
* Cache Data Container for Template Files // try registered resource
* if (isset($smarty->registered_cache_resources[ $type ])) {
* @package Smarty // do not cache these instances as they may vary from instance to instance
* @subpackage TemplateResources return $smarty->_cache[ 'cacheresource_handlers' ][ $type ] = $smarty->registered_cache_resources[ $type ];
* @author Rodney Rehm }
*/ // try sysplugins dir
class Smarty_Template_Cached { if (isset(self::$sysplugins[ $type ])) {
/** $cache_resource_class = 'Smarty_Internal_CacheResource_' . ucfirst($type);
* Source Filepath return $smarty->_cache[ 'cacheresource_handlers' ][ $type ] = new $cache_resource_class();
* @var string }
*/ // try plugins dir
public $filepath = false; $cache_resource_class = 'Smarty_CacheResource_' . ucfirst($type);
if ($smarty->loadPlugin($cache_resource_class)) {
/** return $smarty->_cache[ 'cacheresource_handlers' ][ $type ] = new $cache_resource_class();
* Source Content }
* @var string // give up
*/ throw new SmartyException("Unable to load cache resource '{$type}'");
public $content = null; }
}
/**
* Source Timestamp
* @var integer
*/
public $timestamp = false;
/**
* Source Existance
* @var boolean
*/
public $exists = false;
/**
* Cache Is Valid
* @var boolean
*/
public $valid = false;
/**
* Cache was processed
* @var boolean
*/
public $processed = false;
/**
* CacheResource Handler
* @var Smarty_CacheResource
*/
public $handler = null;
/**
* Template Compile Id (Smarty_Internal_Template::$compile_id)
* @var string
*/
public $compile_id = null;
/**
* Template Cache Id (Smarty_Internal_Template::$cache_id)
* @var string
*/
public $cache_id = null;
/**
* Id for cache locking
* @var string
*/
public $lock_id = null;
/**
* flag that cache is locked by this instance
* @var bool
*/
public $is_locked = false;
/**
* Source Object
* @var Smarty_Template_Source
*/
public $source = null;
/**
* create Cached Object container
*
* @param Smarty_Internal_Template $_template template object
*/
public function __construct(Smarty_Internal_Template $_template)
{
$this->compile_id = $_template->compile_id;
$this->cache_id = $_template->cache_id;
$this->source = $_template->source;
$_template->cached = $this;
$smarty = $_template->smarty;
//
// load resource handler
//
$this->handler = $handler = Smarty_CacheResource::load($smarty); // Note: prone to circular references
//
// check if cache is valid
//
if (!($_template->caching == Smarty::CACHING_LIFETIME_CURRENT || $_template->caching == Smarty::CACHING_LIFETIME_SAVED) || $_template->source->recompiled) {
$handler->populate($this, $_template);
return;
}
while (true) {
while (true) {
$handler->populate($this, $_template);
if ($this->timestamp === false || $smarty->force_compile || $smarty->force_cache) {
$this->valid = false;
} else {
$this->valid = true;
}
if ($this->valid && $_template->caching == Smarty::CACHING_LIFETIME_CURRENT && $_template->cache_lifetime >= 0 && time() > ($this->timestamp + $_template->cache_lifetime)) {
// lifetime expired
$this->valid = false;
}
if ($this->valid || !$_template->smarty->cache_locking) {
break;
}
if (!$this->handler->locked($_template->smarty, $this)) {
$this->handler->acquireLock($_template->smarty, $this);
break 2;
}
}
if ($this->valid) {
if (!$_template->smarty->cache_locking || $this->handler->locked($_template->smarty, $this) === null) {
// load cache file for the following checks
if ($smarty->debugging) {
Smarty_Internal_Debug::start_cache($_template);
}
if($handler->process($_template, $this) === false) {
$this->valid = false;
} else {
$this->processed = true;
}
if ($smarty->debugging) {
Smarty_Internal_Debug::end_cache($_template);
}
} else {
continue;
}
} else {
return;
}
if ($this->valid && $_template->caching === Smarty::CACHING_LIFETIME_SAVED && $_template->properties['cache_lifetime'] >= 0 && (time() > ($_template->cached->timestamp + $_template->properties['cache_lifetime']))) {
$this->valid = false;
}
if (!$this->valid && $_template->smarty->cache_locking) {
$this->handler->acquireLock($_template->smarty, $this);
return;
} else {
return;
}
}
}
/**
* Write this cache object to handler
*
* @param Smarty_Internal_Template $_template template object
* @param string $content content to cache
* @return boolean success
*/
public function write(Smarty_Internal_Template $_template, $content)
{
if (!$_template->source->recompiled) {
if ($this->handler->writeCachedContent($_template, $content)) {
$this->timestamp = time();
$this->exists = true;
$this->valid = true;
if ($_template->smarty->cache_locking) {
$this->handler->releaseLock($_template->smarty, $this);
}
return true;
}
}
return false;
}
}
?>

View file

@ -1,237 +1,297 @@
<?php <?php
/** /**
* Smarty Internal Plugin * Smarty Internal Plugin
* *
* @package Smarty * @package Smarty
* @subpackage Cacher * @subpackage Cacher
*/ */
/** /**
* Cache Handler API * Cache Handler API
* *
* @package Smarty * @package Smarty
* @subpackage Cacher * @subpackage Cacher
* @author Rodney Rehm * @author Rodney Rehm
*/ */
abstract class Smarty_CacheResource_Custom extends Smarty_CacheResource { abstract class Smarty_CacheResource_Custom extends Smarty_CacheResource
{
/** /**
* fetch cached content and its modification time from data source * fetch cached content and its modification time from data source
* *
* @param string $id unique cache content identifier * @param string $id unique cache content identifier
* @param string $name template name * @param string $name template name
* @param string $cache_id cache id * @param string $cache_id cache id
* @param string $compile_id compile id * @param string $compile_id compile id
* @param string $content cached content * @param string $content cached content
* @param integer $mtime cache modification timestamp (epoch) * @param integer $mtime cache modification timestamp (epoch)
* @return void *
*/ * @return void
protected abstract function fetch($id, $name, $cache_id, $compile_id, &$content, &$mtime); */
abstract protected function fetch($id, $name, $cache_id, $compile_id, &$content, &$mtime);
/**
* Fetch cached content's modification timestamp from data source /**
* * Fetch cached content's modification timestamp from data source
* {@internal implementing this method is optional. * {@internal implementing this method is optional.
* Only implement it if modification times can be accessed faster than loading the complete cached content.}} * 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 $id unique cache content identifier
* @param string $name template name * @param string $name template name
* @param string $cache_id cache id * @param string $cache_id cache id
* @param string $compile_id compile id * @param string $compile_id compile id
* @return integer|boolean timestamp (epoch) the template was modified, or false if not found *
*/ * @return integer|boolean timestamp (epoch) the template was modified, or false if not found
protected function fetchTimestamp($id, $name, $cache_id, $compile_id) */
{ protected function fetchTimestamp($id, $name, $cache_id, $compile_id)
return null; {
} return false;
}
/**
* Save content to cache /**
* * Save content to cache
* @param string $id unique cache content identifier *
* @param string $name template name * @param string $id unique cache content identifier
* @param string $cache_id cache id * @param string $name template name
* @param string $compile_id compile id * @param string $cache_id cache id
* @param integer|null $exp_time seconds till expiration or null * @param string $compile_id compile id
* @param string $content content to cache * @param integer|null $exp_time seconds till expiration or null
* @return boolean success * @param string $content content to cache
*/ *
protected abstract function save($id, $name, $cache_id, $compile_id, $exp_time, $content); * @return boolean success
*/
/** abstract protected function save($id, $name, $cache_id, $compile_id, $exp_time, $content);
* Delete content from cache
* /**
* @param string $name template name * Delete content from cache
* @param string $cache_id cache id *
* @param string $compile_id compile id * @param string|null $name template name
* @param integer|null $exp_time seconds till expiration time in seconds or null * @param string|null $cache_id cache id
* @return integer number of deleted caches * @param string|null $compile_id compile id
*/ * @param integer|null $exp_time seconds till expiration time in seconds or null
protected abstract function delete($name, $cache_id, $compile_id, $exp_time); *
* @return integer number of deleted caches
/** */
* populate Cached Object with meta data from Resource abstract protected function delete($name, $cache_id, $compile_id, $exp_time);
*
* @param Smarty_Template_Cached $cached cached object /**
* @param Smarty_Internal_Template $_template template object * populate Cached Object with meta data from Resource
* @return void *
*/ * @param Smarty_Template_Cached $cached cached object
public function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template) * @param Smarty_Internal_Template $_template template object
{ *
$_cache_id = isset($cached->cache_id) ? preg_replace('![^\w\|]+!', '_', $cached->cache_id) : null; * @return void
$_compile_id = isset($cached->compile_id) ? preg_replace('![^\w\|]+!', '_', $cached->compile_id) : null; */
public function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template)
$cached->filepath = sha1($cached->source->filepath . $_cache_id . $_compile_id); {
$this->populateTimestamp($cached); $_cache_id = isset($cached->cache_id) ? preg_replace('![^\w\|]+!', '_', $cached->cache_id) : null;
} $_compile_id = isset($cached->compile_id) ? preg_replace('![^\w]+!', '_', $cached->compile_id) : null;
$path = $cached->source->uid . $_cache_id . $_compile_id;
/** $cached->filepath = sha1($path);
* populate Cached Object with timestamp and exists from Resource if ($_template->smarty->cache_locking) {
* $cached->lock_id = sha1('lock.' . $path);
* @param Smarty_Template_Cached $source cached object }
* @return void $this->populateTimestamp($cached);
*/ }
public function populateTimestamp(Smarty_Template_Cached $cached)
{ /**
$mtime = $this->fetchTimestamp($cached->filepath, $cached->source->name, $cached->cache_id, $cached->compile_id); * populate Cached Object with timestamp and exists from Resource
if ($mtime !== null) { *
$cached->timestamp = $mtime; * @param Smarty_Template_Cached $cached
$cached->exists = !!$cached->timestamp; *
return; * @return void
} */
$timestamp = null; public function populateTimestamp(Smarty_Template_Cached $cached)
$this->fetch($cached->filepath, $cached->source->name, $cached->cache_id, $cached->compile_id, $cached->content, $timestamp); {
$cached->timestamp = isset($timestamp) ? $timestamp : false; $mtime =
$cached->exists = !!$cached->timestamp; $this->fetchTimestamp($cached->filepath, $cached->source->name, $cached->cache_id, $cached->compile_id);
} if ($mtime !== null) {
$cached->timestamp = $mtime;
/** $cached->exists = !!$cached->timestamp;
* Read the cached template and process the header return;
* }
* @param Smarty_Internal_Template $_template template object $timestamp = null;
* @param Smarty_Template_Cached $cached cached object $this->fetch(
* @return booelan true or false if the cached content does not exist $cached->filepath,
*/ $cached->source->name,
public function process(Smarty_Internal_Template $_template, Smarty_Template_Cached $cached=null) $cached->cache_id,
{ $cached->compile_id,
if (!$cached) { $cached->content,
$cached = $_template->cached; $timestamp
} );
$content = $cached->content ? $cached->content : null; $cached->timestamp = isset($timestamp) ? $timestamp : false;
$timestamp = $cached->timestamp ? $cached->timestamp : null; $cached->exists = !!$cached->timestamp;
if ($content === null || !$timestamp) { }
$this->fetch(
$_template->cached->filepath, /**
$_template->source->name, * Read the cached template and process the header
$_template->cache_id, *
$_template->compile_id, * @param \Smarty_Internal_Template $_smarty_tpl do not change variable name, is used by compiled template
$content, * @param Smarty_Template_Cached $cached cached object
$timestamp * @param boolean $update flag if called because cache update
); *
} * @return boolean true or false if the cached content does not exist
if (isset($content)) { */
$_smarty_tpl = $_template; public function process(
eval("?>" . $content); Smarty_Internal_Template $_smarty_tpl,
return true; Smarty_Template_Cached $cached = null,
} $update = false
return false; ) {
} if (!$cached) {
$cached = $_smarty_tpl->cached;
/** }
* Write the rendered template output to cache $content = $cached->content ? $cached->content : null;
* $timestamp = $cached->timestamp ? $cached->timestamp : null;
* @param Smarty_Internal_Template $_template template object if ($content === null || !$timestamp) {
* @param string $content content to cache $this->fetch(
* @return boolean success $_smarty_tpl->cached->filepath,
*/ $_smarty_tpl->source->name,
public function writeCachedContent(Smarty_Internal_Template $_template, $content) $_smarty_tpl->cache_id,
{ $_smarty_tpl->compile_id,
return $this->save( $content,
$_template->cached->filepath, $timestamp
$_template->source->name, );
$_template->cache_id, }
$_template->compile_id, if (isset($content)) {
$_template->properties['cache_lifetime'], eval('?>' . $content);
$content $cached->content = null;
); return true;
} }
return false;
/** }
* Empty cache
* /**
* @param Smarty $smarty Smarty object * Write the rendered template output to cache
* @param integer $exp_time expiration time (number of seconds, not timestamp) *
* @return integer number of cache files deleted * @param Smarty_Internal_Template $_template template object
*/ * @param string $content content to cache
public function clearAll(Smarty $smarty, $exp_time=null) *
{ * @return boolean success
$this->cache = array(); */
return $this->delete(null, null, null, $exp_time); public function writeCachedContent(Smarty_Internal_Template $_template, $content)
} {
return $this->save(
/** $_template->cached->filepath,
* Empty cache for a specific template $_template->source->name,
* $_template->cache_id,
* @param Smarty $smarty Smarty object $_template->compile_id,
* @param string $resource_name template name $_template->cache_lifetime,
* @param string $cache_id cache id $content
* @param string $compile_id compile id );
* @param integer $exp_time expiration time (number of seconds, not timestamp) }
* @return integer number of cache files deleted
*/ /**
public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time) * Read cached template from cache
{ *
$this->cache = array(); * @param Smarty_Internal_Template $_template template object
return $this->delete($resource_name, $cache_id, $compile_id, $exp_time); *
} * @return string|boolean content
*/
/** public function readCachedContent(Smarty_Internal_Template $_template)
* Check is cache is locked for this template {
* $content = $_template->cached->content ? $_template->cached->content : null;
* @param Smarty $smarty Smarty object $timestamp = null;
* @param Smarty_Template_Cached $cached cached object if ($content === null) {
* @return booelan true or false if cache is locked $timestamp = null;
*/ $this->fetch(
public function hasLock(Smarty $smarty, Smarty_Template_Cached $cached) $_template->cached->filepath,
{ $_template->source->name,
$id = $cached->filepath; $_template->cache_id,
$name = $cached->source->name . '.lock'; $_template->compile_id,
$content,
$mtime = $this->fetchTimestamp($id, $name, null, null); $timestamp
if ($mtime === null) { );
$this->fetch($id, $name, null, null, $content, $mtime); }
} if (isset($content)) {
return $content;
return $mtime && time() - $mtime < $smarty->locking_timeout; }
} return false;
}
/**
* Lock cache for this template /**
* * Empty cache
* @param Smarty $smarty Smarty object *
* @param Smarty_Template_Cached $cached cached object * @param Smarty $smarty Smarty object
*/ * @param integer $exp_time expiration time (number of seconds, not timestamp)
public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached) *
{ * @return integer number of cache files deleted
$cached->is_locked = true; */
public function clearAll(Smarty $smarty, $exp_time = null)
$id = $cached->filepath; {
$name = $cached->source->name . '.lock'; return $this->delete(null, null, null, $exp_time);
$this->save($id, $name, null, null, $smarty->locking_timeout, ''); }
}
/**
/** * Empty cache for a specific template
* Unlock cache for this template *
* * @param Smarty $smarty Smarty object
* @param Smarty $smarty Smarty object * @param string $resource_name template name
* @param Smarty_Template_Cached $cached cached object * @param string $cache_id cache id
*/ * @param string $compile_id compile id
public function releaseLock(Smarty $smarty, Smarty_Template_Cached $cached) * @param integer $exp_time expiration time (number of seconds, not timestamp)
{ *
$cached->is_locked = false; * @return int number of cache files deleted
* @throws \SmartyException
$name = $cached->source->name . '.lock'; */
$this->delete($name, null, null, null); public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time)
} {
} $cache_name = null;
?> if (isset($resource_name)) {
$source = Smarty_Template_Source::load(null, $smarty, $resource_name);
if ($source->exists) {
$cache_name = $source->name;
} else {
return 0;
}
}
return $this->delete($cache_name, $cache_id, $compile_id, $exp_time);
}
/**
* Check is cache is locked for this template
*
* @param Smarty $smarty Smarty object
* @param Smarty_Template_Cached $cached cached object
*
* @return boolean true or false if cache is locked
*/
public function hasLock(Smarty $smarty, Smarty_Template_Cached $cached)
{
$id = $cached->lock_id;
$name = $cached->source->name . '.lock';
$mtime = $this->fetchTimestamp($id, $name, $cached->cache_id, $cached->compile_id);
if ($mtime === null) {
$this->fetch($id, $name, $cached->cache_id, $cached->compile_id, $content, $mtime);
}
return $mtime && ($t = time()) - $mtime < $smarty->locking_timeout;
}
/**
* Lock cache for this template
*
* @param Smarty $smarty Smarty object
* @param Smarty_Template_Cached $cached cached object
*
* @return bool|void
*/
public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached)
{
$cached->is_locked = true;
$id = $cached->lock_id;
$name = $cached->source->name . '.lock';
$this->save($id, $name, $cached->cache_id, $cached->compile_id, $smarty->locking_timeout, '');
}
/**
* Unlock cache for this template
*
* @param Smarty $smarty Smarty object
* @param Smarty_Template_Cached $cached cached object
*
* @return bool|void
*/
public function releaseLock(Smarty $smarty, Smarty_Template_Cached $cached)
{
$cached->is_locked = false;
$name = $cached->source->name . '.lock';
$this->delete($name, $cached->cache_id, $cached->compile_id, null);
}
}

File diff suppressed because it is too large Load diff

View file

@ -1,95 +0,0 @@
<?php
/**
* Smarty Internal Plugin
*
* @package Smarty
* @subpackage TemplateResources
*/
/**
* Smarty Resource Data Object
*
* Meta Data Container for Config Files
*
* @package Smarty
* @subpackage TemplateResources
* @author Rodney Rehm
*
* @property string $content
* @property int $timestamp
* @property bool $exists
*/
class Smarty_Config_Source extends Smarty_Template_Source {
/**
* create Config Object container
*
* @param Smarty_Resource $handler Resource Handler this source object communicates with
* @param Smarty $smarty Smarty instance this source object belongs to
* @param string $resource full config_resource
* @param string $type type of resource
* @param string $name resource name
* @param string $unique_resource unqiue resource name
*/
public function __construct(Smarty_Resource $handler, Smarty $smarty, $resource, $type, $name, $unique_resource)
{
$this->handler = $handler; // Note: prone to circular references
// Note: these may be ->config_compiler_class etc in the future
//$this->config_compiler_class = $handler->config_compiler_class;
//$this->config_lexer_class = $handler->config_lexer_class;
//$this->config_parser_class = $handler->config_parser_class;
$this->smarty = $smarty;
$this->resource = $resource;
$this->type = $type;
$this->name = $name;
$this->unique_resource = $unique_resource;
}
/**
* <<magic>> Generic setter.
*
* @param string $property_name valid: content, timestamp, exists
* @param mixed $value newly assigned value (not check for correct type)
* @throws SmartyException when the given property name is not valid
*/
public function __set($property_name, $value)
{
switch ($property_name) {
case 'content':
case 'timestamp':
case 'exists':
$this->$property_name = $value;
break;
default:
throw new SmartyException("invalid config property '$property_name'.");
}
}
/**
* <<magic>> Generic getter.
*
* @param string $property_name valid: content, timestamp, exists
* @throws SmartyException when the given property name is not valid
*/
public function __get($property_name)
{
switch ($property_name) {
case 'timestamp':
case 'exists':
$this->handler->populateTimestamp($this);
return $this->$property_name;
case 'content':
return $this->content = $this->handler->getContent($this);
default:
throw new SmartyException("config property '$property_name' does not exist.");
}
}
}
?>

View file

@ -0,0 +1,68 @@
<?php
/**
* Smarty Plugin Data
* This file contains the data object
*
* @package Smarty
* @subpackage Template
* @author Uwe Tews
*/
/**
* class for the Smarty data object
* The Smarty data object will hold Smarty variables in the current scope
*
* @package Smarty
* @subpackage Template
*/
class Smarty_Data extends Smarty_Internal_Data
{
/**
* Counter
*
* @var int
*/
public static $count = 0;
/**
* Data block name
*
* @var string
*/
public $dataObjectName = '';
/**
* Smarty object
*
* @var Smarty
*/
public $smarty = null;
/**
* create Smarty data object
*
* @param Smarty|array $_parent parent template
* @param Smarty|Smarty_Internal_Template $smarty global smarty instance
* @param string $name optional data block name
*
* @throws SmartyException
*/
public function __construct($_parent = null, $smarty = null, $name = null)
{
parent::__construct();
self::$count++;
$this->dataObjectName = 'Data_object ' . (isset($name) ? "'{$name}'" : self::$count);
$this->smarty = $smarty;
if (is_object($_parent)) {
// when object set up back pointer
$this->parent = $_parent;
} elseif (is_array($_parent)) {
// set up variable values
foreach ($_parent as $_key => $_val) {
$this->tpl_vars[ $_key ] = new Smarty_Variable($_val);
}
} elseif ($_parent !== null) {
throw new SmartyException('Wrong type for template variables');
}
}
}

View file

@ -0,0 +1,90 @@
<?php
/**
* Smarty {block} tag class
*
* @package Smarty
* @subpackage PluginsInternal
* @author Uwe Tews
*/
class Smarty_Internal_Block
{
/**
* Block name
*
* @var string
*/
public $name = '';
/**
* Hide attribute
*
* @var bool
*/
public $hide = false;
/**
* Append attribute
*
* @var bool
*/
public $append = false;
/**
* prepend attribute
*
* @var bool
*/
public $prepend = false;
/**
* Block calls $smarty.block.child
*
* @var bool
*/
public $callsChild = false;
/**
* Inheritance child block
*
* @var Smarty_Internal_Block|null
*/
public $child = null;
/**
* Inheritance calling parent block
*
* @var Smarty_Internal_Block|null
*/
public $parent = null;
/**
* Inheritance Template index
*
* @var int
*/
public $tplIndex = 0;
/**
* Smarty_Internal_Block constructor.
* - if outer level {block} of child template ($state === 1) save it as child root block
* - otherwise process inheritance and render
*
* @param string $name block name
* @param int|null $tplIndex index of outer level {block} if nested
*/
public function __construct($name, $tplIndex)
{
$this->name = $name;
$this->tplIndex = $tplIndex;
}
/**
* Compiled block code overloaded by {block} class
*
* @param \Smarty_Internal_Template $tpl
*/
public function callBlock(Smarty_Internal_Template $tpl)
{
}
}

View file

@ -1,266 +1,239 @@
<?php <?php
/** /**
* Smarty Internal Plugin CacheResource File * Smarty Internal Plugin CacheResource File
* *
* @package Smarty * @package Smarty
* @subpackage Cacher * @subpackage Cacher
* @author Uwe Tews * @author Uwe Tews
* @author Rodney Rehm * @author Rodney Rehm
*/ */
/** /**
* This class does contain all necessary methods for the HTML cache on file system * This class does contain all necessary methods for the HTML cache on file system
* * Implements the file system as resource for the HTML cache Version ussing nocache inserts.
* Implements the file system as resource for the HTML cache Version ussing nocache inserts. *
* * @package Smarty
* @package Smarty * @subpackage Cacher
* @subpackage Cacher */
*/ class Smarty_Internal_CacheResource_File extends Smarty_CacheResource
class Smarty_Internal_CacheResource_File extends Smarty_CacheResource { {
/**
/** * populate Cached Object with meta data from Resource
* populate Cached Object with meta data from Resource *
* * @param Smarty_Template_Cached $cached cached object
* @param Smarty_Template_Cached $cached cached object * @param Smarty_Internal_Template $_template template object
* @param Smarty_Internal_Template $_template template object *
* @return void * @return void
*/ */
public function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template) public function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template)
{ {
$_source_file_path = str_replace(':', '.', $_template->source->filepath); $source = &$_template->source;
$_cache_id = isset($_template->cache_id) ? preg_replace('![^\w\|]+!', '_', $_template->cache_id) : null; $smarty = &$_template->smarty;
$_compile_id = isset($_template->compile_id) ? preg_replace('![^\w\|]+!', '_', $_template->compile_id) : null; $_compile_dir_sep = $smarty->use_sub_dirs ? DIRECTORY_SEPARATOR : '^';
$_filepath = $_template->source->uid; $_filepath = sha1($source->uid . $smarty->_joined_template_dir);
// if use_sub_dirs, break file into directories $cached->filepath = $smarty->getCacheDir();
if ($_template->smarty->use_sub_dirs) { if (isset($_template->cache_id)) {
$_filepath = substr($_filepath, 0, 2) . DS $cached->filepath .= preg_replace(
. substr($_filepath, 2, 2) . DS array(
. substr($_filepath, 4, 2) . DS '![^\w|]+!',
. $_filepath; '![|]+!'
} ),
$_compile_dir_sep = $_template->smarty->use_sub_dirs ? DS : '^'; array(
if (isset($_cache_id)) { '_',
$_cache_id = str_replace('|', $_compile_dir_sep, $_cache_id) . $_compile_dir_sep; $_compile_dir_sep
} else { ),
$_cache_id = ''; $_template->cache_id
} ) . $_compile_dir_sep;
if (isset($_compile_id)) { }
$_compile_id = $_compile_id . $_compile_dir_sep; if (isset($_template->compile_id)) {
} else { $cached->filepath .= preg_replace('![^\w]+!', '_', $_template->compile_id) . $_compile_dir_sep;
$_compile_id = ''; }
} // if use_sub_dirs, break file into directories
$_cache_dir = $_template->smarty->getCacheDir(); if ($smarty->use_sub_dirs) {
if ($_template->smarty->cache_locking) { $cached->filepath .= $_filepath[ 0 ] . $_filepath[ 1 ] . DIRECTORY_SEPARATOR . $_filepath[ 2 ] .
// create locking file name $_filepath[ 3 ] .
// relative file name? DIRECTORY_SEPARATOR .
if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_cache_dir)) { $_filepath[ 4 ] . $_filepath[ 5 ] . DIRECTORY_SEPARATOR;
$_lock_dir = rtrim(getcwd(), '/\\') . DS . $_cache_dir; }
} else { $cached->filepath .= $_filepath;
$_lock_dir = $_cache_dir; $basename = $source->handler->getBasename($source);
} if (!empty($basename)) {
$cached->lock_id = $_lock_dir.sha1($_cache_id.$_compile_id.$_template->source->uid).'.lock'; $cached->filepath .= '.' . $basename;
} }
$cached->filepath = $_cache_dir . $_cache_id . $_compile_id . $_filepath . '.' . basename($_source_file_path) . '.php'; if ($smarty->cache_locking) {
$cached->timestamp = @filemtime($cached->filepath); $cached->lock_id = $cached->filepath . '.lock';
$cached->exists = !!$cached->timestamp; }
} $cached->filepath .= '.php';
$cached->timestamp = $cached->exists = is_file($cached->filepath);
/** if ($cached->exists) {
* populate Cached Object with timestamp and exists from Resource $cached->timestamp = filemtime($cached->filepath);
* }
* @param Smarty_Template_Cached $cached cached object }
* @return void
*/ /**
public function populateTimestamp(Smarty_Template_Cached $cached) * populate Cached Object with timestamp and exists from Resource
{ *
$cached->timestamp = @filemtime($cached->filepath); * @param Smarty_Template_Cached $cached cached object
$cached->exists = !!$cached->timestamp; *
} * @return void
*/
/** public function populateTimestamp(Smarty_Template_Cached $cached)
* Read the cached template and process its header {
* $cached->timestamp = $cached->exists = is_file($cached->filepath);
* @param Smarty_Internal_Template $_template template object if ($cached->exists) {
* @param Smarty_Template_Cached $cached cached object $cached->timestamp = filemtime($cached->filepath);
* @return booelan true or false if the cached content does not exist }
*/ }
public function process(Smarty_Internal_Template $_template, Smarty_Template_Cached $cached=null)
{ /**
$_smarty_tpl = $_template; * Read the cached template and process its header
return @include $_template->cached->filepath; *
} * @param \Smarty_Internal_Template $_smarty_tpl do not change variable name, is used by compiled template
* @param Smarty_Template_Cached $cached cached object
/** * @param bool $update flag if called because cache update
* Write the rendered template output to cache *
* * @return boolean true or false if the cached content does not exist
* @param Smarty_Internal_Template $_template template object */
* @param string $content content to cache public function process(
* @return boolean success Smarty_Internal_Template $_smarty_tpl,
*/ Smarty_Template_Cached $cached = null,
public function writeCachedContent(Smarty_Internal_Template $_template, $content) $update = false
{ ) {
if (Smarty_Internal_Write_File::writeFile($_template->cached->filepath, $content, $_template->smarty) === true) { $_smarty_tpl->cached->valid = false;
$_template->cached->timestamp = @filemtime($_template->cached->filepath); if ($update && defined('HHVM_VERSION')) {
$_template->cached->exists = !!$_template->cached->timestamp; eval('?>' . file_get_contents($_smarty_tpl->cached->filepath));
if ($_template->cached->exists) { return true;
return true; } else {
} return @include $_smarty_tpl->cached->filepath;
} }
return false; }
}
/**
/** * Write the rendered template output to cache
* Empty cache *
* * @param Smarty_Internal_Template $_template template object
* @param Smarty_Internal_Template $_template template object * @param string $content content to cache
* @param integer $exp_time expiration time (number of seconds, not timestamp) *
* @return integer number of cache files deleted * @return bool success
*/ * @throws \SmartyException
public function clearAll(Smarty $smarty, $exp_time = null) */
{ public function writeCachedContent(Smarty_Internal_Template $_template, $content)
return $this->clear($smarty, null, null, null, $exp_time); {
} if ($_template->smarty->ext->_writeFile->writeFile(
$_template->cached->filepath,
/** $content,
* Empty cache for a specific template $_template->smarty
* ) === true
* @param Smarty $_template template object ) {
* @param string $resource_name template name if (function_exists('opcache_invalidate')
* @param string $cache_id cache id && (!function_exists('ini_get') || strlen(ini_get('opcache.restrict_api'))) < 1
* @param string $compile_id compile id ) {
* @param integer $exp_time expiration time (number of seconds, not timestamp) opcache_invalidate($_template->cached->filepath, true);
* @return integer number of cache files deleted } elseif (function_exists('apc_compile_file')) {
*/ apc_compile_file($_template->cached->filepath);
public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time) }
{ $cached = $_template->cached;
$_cache_id = isset($cache_id) ? preg_replace('![^\w\|]+!', '_', $cache_id) : null; $cached->timestamp = $cached->exists = is_file($cached->filepath);
$_compile_id = isset($compile_id) ? preg_replace('![^\w\|]+!', '_', $compile_id) : null; if ($cached->exists) {
$_dir_sep = $smarty->use_sub_dirs ? '/' : '^'; $cached->timestamp = filemtime($cached->filepath);
$_compile_id_offset = $smarty->use_sub_dirs ? 3 : 0; return true;
$_dir = $smarty->getCacheDir(); }
$_dir_length = strlen($_dir); }
if (isset($_cache_id)) { return false;
$_cache_id_parts = explode('|', $_cache_id); }
$_cache_id_parts_count = count($_cache_id_parts);
if ($smarty->use_sub_dirs) { /**
foreach ($_cache_id_parts as $id_part) { * Read cached template from cache
$_dir .= $id_part . DS; *
} * @param Smarty_Internal_Template $_template template object
} *
} * @return string content
if (isset($resource_name)) { */
$_save_stat = $smarty->caching; public function readCachedContent(Smarty_Internal_Template $_template)
$smarty->caching = true; {
$tpl = new $smarty->template_class($resource_name, $smarty); if (is_file($_template->cached->filepath)) {
$smarty->caching = $_save_stat; return file_get_contents($_template->cached->filepath);
}
// remove from template cache return false;
$tpl->source; // have the template registered before unset() }
if ($smarty->allow_ambiguous_resources) {
$_templateId = $tpl->source->unique_resource . $tpl->cache_id . $tpl->compile_id; /**
} else { * Empty cache
$_templateId = $smarty->joined_template_dir . '#' . $resource_name . $tpl->cache_id . $tpl->compile_id; *
} * @param Smarty $smarty
if (isset($_templateId[150])) { * @param integer $exp_time expiration time (number of seconds, not timestamp)
$_templateId = sha1($_templateId); *
} * @return integer number of cache files deleted
unset($smarty->template_objects[$_templateId]); */
public function clearAll(Smarty $smarty, $exp_time = null)
if ($tpl->source->exists) { {
$_resourcename_parts = basename(str_replace('^', '/', $tpl->cached->filepath)); return $smarty->ext->_cacheResourceFile->clear($smarty, null, null, null, $exp_time);
} else { }
return 0;
} /**
} * Empty cache for a specific template
$_count = 0; *
$_time = time(); * @param Smarty $smarty
if (file_exists($_dir)) { * @param string $resource_name template name
$_cacheDirs = new RecursiveDirectoryIterator($_dir); * @param string $cache_id cache id
$_cache = new RecursiveIteratorIterator($_cacheDirs, RecursiveIteratorIterator::CHILD_FIRST); * @param string $compile_id compile id
foreach ($_cache as $_file) { * @param integer $exp_time expiration time (number of seconds, not timestamp)
if (substr(basename($_file->getPathname()),0,1) == '.' || strpos($_file, '.svn') !== false) continue; *
// directory ? * @return integer number of cache files deleted
if ($_file->isDir()) { */
if (!$_cache->isDot()) { public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time)
// delete folder if empty {
@rmdir($_file->getPathname()); return $smarty->ext->_cacheResourceFile->clear($smarty, $resource_name, $cache_id, $compile_id, $exp_time);
} }
} else {
$_parts = explode($_dir_sep, str_replace('\\', '/', substr((string)$_file, $_dir_length))); /**
$_parts_count = count($_parts); * Check is cache is locked for this template
// check name *
if (isset($resource_name)) { * @param Smarty $smarty Smarty object
if ($_parts[$_parts_count-1] != $_resourcename_parts) { * @param Smarty_Template_Cached $cached cached object
continue; *
} * @return boolean true or false if cache is locked
} */
// check compile id public function hasLock(Smarty $smarty, Smarty_Template_Cached $cached)
if (isset($_compile_id) && (!isset($_parts[$_parts_count-2 - $_compile_id_offset]) || $_parts[$_parts_count-2 - $_compile_id_offset] != $_compile_id)) { {
continue; if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
} clearstatcache(true, $cached->lock_id);
// check cache id } else {
if (isset($_cache_id)) { clearstatcache();
// count of cache id parts }
$_parts_count = (isset($_compile_id)) ? $_parts_count - 2 - $_compile_id_offset : $_parts_count - 1 - $_compile_id_offset; if (is_file($cached->lock_id)) {
if ($_parts_count < $_cache_id_parts_count) { $t = filemtime($cached->lock_id);
continue; return $t && (time() - $t < $smarty->locking_timeout);
} } else {
for ($i = 0; $i < $_cache_id_parts_count; $i++) { return false;
if ($_parts[$i] != $_cache_id_parts[$i]) continue 2; }
} }
}
// expired ? /**
if (isset($exp_time) && $_time - @filemtime($_file) < $exp_time) { * Lock cache for this template
continue; *
} * @param Smarty $smarty Smarty object
$_count += @unlink((string) $_file) ? 1 : 0; * @param Smarty_Template_Cached $cached cached object
} *
} * @return bool|void
} */
return $_count; public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached)
} {
$cached->is_locked = true;
/** touch($cached->lock_id);
* Check is cache is locked for this template }
*
* @param Smarty $smarty Smarty object /**
* @param Smarty_Template_Cached $cached cached object * Unlock cache for this template
* @return booelan true or false if cache is locked *
*/ * @param Smarty $smarty Smarty object
public function hasLock(Smarty $smarty, Smarty_Template_Cached $cached) * @param Smarty_Template_Cached $cached cached object
{ *
if (version_compare(PHP_VERSION, '5.3.0', '>=')) { * @return bool|void
clearstatcache(true, $cached->lock_id); */
} else { public function releaseLock(Smarty $smarty, Smarty_Template_Cached $cached)
clearstatcache(); {
} $cached->is_locked = false;
$t = @filemtime($cached->lock_id); @unlink($cached->lock_id);
return $t && (time() - $t < $smarty->locking_timeout); }
} }
/**
* Lock cache for this template
*
* @param Smarty $smarty Smarty object
* @param Smarty_Template_Cached $cached cached object
*/
public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached)
{
$cached->is_locked = true;
touch($cached->lock_id);
}
/**
* Unlock cache for this template
*
* @param Smarty $smarty Smarty object
* @param Smarty_Template_Cached $cached cached object
*/
public function releaseLock(Smarty $smarty, Smarty_Template_Cached $cached)
{
$cached->is_locked = false;
@unlink($cached->lock_id);
}
}
?>

View file

@ -1,53 +1,52 @@
<?php <?php
/** /**
* Smarty Internal Plugin Compile Append * Smarty Internal Plugin Compile Append
* * Compiles the {append} tag
* Compiles the {append} tag *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler * @author Uwe Tews
* @author Uwe Tews */
*/
/**
/** * Smarty Internal Plugin Compile Append Class
* Smarty Internal Plugin Compile Append Class *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler */
*/ class Smarty_Internal_Compile_Append extends Smarty_Internal_Compile_Assign
class Smarty_Internal_Compile_Append extends Smarty_Internal_Compile_Assign { {
/**
/** * Compiles code for the {append} tag
* Compiles code for the {append} tag *
* * @param array $args array with attributes from parser
* @param array $args array with attributes from parser * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
* @param object $compiler compiler object * @param array $parameter array with compilation parameter
* @param array $parameter array with compilation parameter *
* @return string compiled code * @return string compiled code
*/ * @throws \SmartyCompilerException
public function compile($args, $compiler, $parameter) */
{ public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
// the following must be assigned at runtime because it will be overwritten in parent class {
$this->required_attributes = array('var', 'value'); // the following must be assigned at runtime because it will be overwritten in parent class
$this->shorttag_order = array('var', 'value'); $this->required_attributes = array('var', 'value');
$this->optional_attributes = array('scope', 'index'); $this->shorttag_order = array('var', 'value');
// check and get attributes $this->optional_attributes = array('scope', 'index');
$_attr = $this->getAttributes($compiler, $args); $this->mapCache = array();
// map to compile assign attributes // check and get attributes
if (isset($_attr['index'])) { $_attr = $this->getAttributes($compiler, $args);
$_params['smarty_internal_index'] = '[' . $_attr['index'] . ']'; // map to compile assign attributes
unset($_attr['index']); if (isset($_attr[ 'index' ])) {
} else { $_params[ 'smarty_internal_index' ] = '[' . $_attr[ 'index' ] . ']';
$_params['smarty_internal_index'] = '[]'; unset($_attr[ 'index' ]);
} } else {
$_new_attr = array(); $_params[ 'smarty_internal_index' ] = '[]';
foreach ($_attr as $key => $value) { }
$_new_attr[] = array($key => $value); $_new_attr = array();
} foreach ($_attr as $key => $value) {
// call compile assign $_new_attr[] = array($key => $value);
return parent::compile($_new_attr, $compiler, $_params); }
} // call compile assign
return parent::compile($_new_attr, $compiler, $_params);
} }
}
?>

View file

@ -1,88 +1,96 @@
<?php <?php
/** /**
* Smarty Internal Plugin Compile Assign * Smarty Internal Plugin Compile Assign
* * Compiles the {assign} tag
* Compiles the {assign} tag *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler * @author Uwe Tews
* @author Uwe Tews */
*/
/**
/** * Smarty Internal Plugin Compile Assign Class
* Smarty Internal Plugin Compile Assign Class *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler */
*/ class Smarty_Internal_Compile_Assign extends Smarty_Internal_CompileBase
class Smarty_Internal_Compile_Assign extends Smarty_Internal_CompileBase { {
/**
/** * Attribute definition: Overwrites base class.
* Compiles code for the {assign} tag *
* * @var array
* @param array $args array with attributes from parser * @see Smarty_Internal_CompileBase
* @param object $compiler compiler object */
* @param array $parameter array with compilation parameter public $option_flags = array('nocache', 'noscope');
* @return string compiled code
*/ /**
public function compile($args, $compiler, $parameter) * Valid scope names
{ *
// the following must be assigned at runtime because it will be overwritten in Smarty_Internal_Compile_Append * @var array
$this->required_attributes = array('var', 'value'); */
$this->shorttag_order = array('var', 'value'); public $valid_scopes = array(
$this->optional_attributes = array('scope'); 'local' => Smarty::SCOPE_LOCAL, 'parent' => Smarty::SCOPE_PARENT,
$_nocache = 'null'; 'root' => Smarty::SCOPE_ROOT, 'global' => Smarty::SCOPE_GLOBAL,
$_scope = Smarty::SCOPE_LOCAL; 'tpl_root' => Smarty::SCOPE_TPL_ROOT, 'smarty' => Smarty::SCOPE_SMARTY
// check and get attributes );
$_attr = $this->getAttributes($compiler, $args);
// nocache ? /**
if ($compiler->tag_nocache || $compiler->nocache) { * Compiles code for the {assign} tag
$_nocache = 'true'; *
// create nocache var to make it know for further compiling * @param array $args array with attributes from parser
if (isset($compiler->template->tpl_vars[trim($_attr['var'], "'")])) { * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
$compiler->template->tpl_vars[trim($_attr['var'], "'")]->nocache = true; * @param array $parameter array with compilation parameter
} else { *
$compiler->template->tpl_vars[trim($_attr['var'], "'")] = new Smarty_variable(null, true); * @return string compiled code
} * @throws \SmartyCompilerException
} */
// scope setup public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
if (isset($_attr['scope'])) { {
$_attr['scope'] = trim($_attr['scope'], "'\""); // the following must be assigned at runtime because it will be overwritten in Smarty_Internal_Compile_Append
if ($_attr['scope'] == 'parent') { $this->required_attributes = array('var', 'value');
$_scope = Smarty::SCOPE_PARENT; $this->shorttag_order = array('var', 'value');
} elseif ($_attr['scope'] == 'root') { $this->optional_attributes = array('scope');
$_scope = Smarty::SCOPE_ROOT; $this->mapCache = array();
} elseif ($_attr['scope'] == 'global') { $_nocache = false;
$_scope = Smarty::SCOPE_GLOBAL; // check and get attributes
} else { $_attr = $this->getAttributes($compiler, $args);
$compiler->trigger_template_error('illegal value for "scope" attribute', $compiler->lex->taglineno); // nocache ?
} if ($_var = $compiler->getId($_attr[ 'var' ])) {
} $_var = "'{$_var}'";
// compiled output } else {
if (isset($parameter['smarty_internal_index'])) { $_var = $_attr[ 'var' ];
$output = "<?php \$_smarty_tpl->createLocalArrayVariable($_attr[var], $_nocache, $_scope);\n\$_smarty_tpl->tpl_vars[$_attr[var]]->value$parameter[smarty_internal_index] = $_attr[value];"; }
} else { if ($compiler->tag_nocache || $compiler->nocache) {
// implement Smarty2's behaviour of variables assigned by reference $_nocache = true;
if ($compiler->template->smarty instanceof SmartyBC) { // create nocache var to make it know for further compiling
$output = "<?php if (isset(\$_smarty_tpl->tpl_vars[$_attr[var]])) {\$_smarty_tpl->tpl_vars[$_attr[var]] = clone \$_smarty_tpl->tpl_vars[$_attr[var]];"; $compiler->setNocacheInVariable($_attr[ 'var' ]);
$output .= "\n\$_smarty_tpl->tpl_vars[$_attr[var]]->value = $_attr[value]; \$_smarty_tpl->tpl_vars[$_attr[var]]->nocache = $_nocache; \$_smarty_tpl->tpl_vars[$_attr[var]]->scope = $_scope;"; }
$output .= "\n} else \$_smarty_tpl->tpl_vars[$_attr[var]] = new Smarty_variable($_attr[value], $_nocache, $_scope);"; // scope setup
} else { if ($_attr[ 'noscope' ]) {
$output = "<?php \$_smarty_tpl->tpl_vars[$_attr[var]] = new Smarty_variable($_attr[value], $_nocache, $_scope);"; $_scope = -1;
} } else {
} $_scope = $compiler->convertScope($_attr, $this->valid_scopes);
if ($_scope == Smarty::SCOPE_PARENT) { }
$output .= "\nif (\$_smarty_tpl->parent != null) \$_smarty_tpl->parent->tpl_vars[$_attr[var]] = clone \$_smarty_tpl->tpl_vars[$_attr[var]];"; // optional parameter
} elseif ($_scope == Smarty::SCOPE_ROOT || $_scope == Smarty::SCOPE_GLOBAL) { $_params = '';
$output .= "\n\$_ptr = \$_smarty_tpl->parent; while (\$_ptr != null) {\$_ptr->tpl_vars[$_attr[var]] = clone \$_smarty_tpl->tpl_vars[$_attr[var]]; \$_ptr = \$_ptr->parent; }"; if ($_nocache || $_scope) {
} $_params .= ' ,' . var_export($_nocache, true);
if ( $_scope == Smarty::SCOPE_GLOBAL) { }
$output .= "\nSmarty::\$global_tpl_vars[$_attr[var]] = clone \$_smarty_tpl->tpl_vars[$_attr[var]];"; if ($_scope) {
} $_params .= ' ,' . $_scope;
$output .= '?>'; }
return $output; if (isset($parameter[ 'smarty_internal_index' ])) {
} $output =
"<?php \$_tmp_array = isset(\$_smarty_tpl->tpl_vars[{$_var}]) ? \$_smarty_tpl->tpl_vars[{$_var}]->value : array();\n";
} $output .= "if (!(is_array(\$_tmp_array) || \$_tmp_array instanceof ArrayAccess)) {\n";
$output .= "settype(\$_tmp_array, 'array');\n";
?> $output .= "}\n";
$output .= "\$_tmp_array{$parameter['smarty_internal_index']} = {$_attr['value']};\n";
$output .= "\$_smarty_tpl->_assignInScope({$_var}, \$_tmp_array{$_params});?>";
} else {
$output = "<?php \$_smarty_tpl->_assignInScope({$_var}, {$_attr['value']}{$_params});?>";
}
return $output;
}
}

View file

@ -1,282 +1,189 @@
<?php <?php
/**
/** * This file is part of Smarty.
* Smarty Internal Plugin Compile Block *
* * (c) 2015 Uwe Tews
* Compiles the {block}{/block} tags *
* * For the full copyright and license information, please view the LICENSE
* @package Smarty * file that was distributed with this source code.
* @subpackage Compiler */
* @author Uwe Tews
*/ /**
* Smarty Internal Plugin Compile Block Class
/** *
* Smarty Internal Plugin Compile Block Class * @author Uwe Tews <uwe.tews@googlemail.com>
* */
* @package Smarty class Smarty_Internal_Compile_Block extends Smarty_Internal_Compile_Shared_Inheritance
* @subpackage Compiler {
*/ /**
class Smarty_Internal_Compile_Block extends Smarty_Internal_CompileBase { * Attribute definition: Overwrites base class.
*
/** * @var array
* Attribute definition: Overwrites base class. * @see Smarty_Internal_CompileBase
* */
* @var array public $required_attributes = array('name');
* @see Smarty_Internal_CompileBase
*/ /**
public $required_attributes = array('name'); * Attribute definition: Overwrites base class.
*
/** * @var array
* Attribute definition: Overwrites base class. * @see Smarty_Internal_CompileBase
* */
* @var array public $shorttag_order = array('name');
* @see Smarty_Internal_CompileBase
*/ /**
public $shorttag_order = array('name', 'hide'); * Attribute definition: Overwrites base class.
*
/** * @var array
* Attribute definition: Overwrites base class. * @see Smarty_Internal_CompileBase
* */
* @var array public $option_flags = array('hide', 'nocache');
* @see Smarty_Internal_CompileBase
*/ /**
public $optional_attributes = array('hide'); * Attribute definition: Overwrites base class.
*
/** * @var array
* Compiles code for the {block} tag * @see Smarty_Internal_CompileBase
* */
* @param array $args array with attributes from parser public $optional_attributes = array('assign');
* @param object $compiler compiler object
* @return boolean true /**
*/ * Compiles code for the {block} tag
public function compile($args, $compiler) { *
// check and get attributes * @param array $args array with attributes from parser
$_attr = $this->getAttributes($compiler, $args); * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
$save = array($_attr, $compiler->parser->current_buffer, $compiler->nocache, $compiler->smarty->merge_compiled_includes, $compiler->merged_templates, $compiler->smarty->merged_templates_func, $compiler->template->properties, $compiler->template->has_nocache_code); * @param array $parameter array with compilation parameter
$this->openTag($compiler, 'block', $save); */
if ($_attr['nocache'] == true) { public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
$compiler->nocache = true; {
} if (!isset($compiler->_cache[ 'blockNesting' ])) {
// set flag for {block} tag $compiler->_cache[ 'blockNesting' ] = 0;
$compiler->inheritance = true; }
// must merge includes if ($compiler->_cache[ 'blockNesting' ] === 0) {
$compiler->smarty->merge_compiled_includes = true; // make sure that inheritance gets initialized in template code
$this->registerInit($compiler);
$compiler->parser->current_buffer = new _smarty_template_buffer($compiler->parser); $this->option_flags = array('hide', 'nocache', 'append', 'prepend');
$compiler->has_code = false; } else {
return true; $this->option_flags = array('hide', 'nocache');
} }
// check and get attributes
/** $_attr = $this->getAttributes($compiler, $args);
* Save or replace child block source by block name during parsing ++$compiler->_cache[ 'blockNesting' ];
* $_className = 'Block_' . preg_replace('![^\w]+!', '_', uniqid(mt_rand(), true));
* @param string $block_content block source content $compiler->_cache[ 'blockName' ][ $compiler->_cache[ 'blockNesting' ] ] = $_attr[ 'name' ];
* @param string $block_tag opening block tag $compiler->_cache[ 'blockClass' ][ $compiler->_cache[ 'blockNesting' ] ] = $_className;
* @param object $template template object $compiler->_cache[ 'blockParams' ][ $compiler->_cache[ 'blockNesting' ] ] = array();
* @param string $filepath filepath of template source $compiler->_cache[ 'blockParams' ][ 1 ][ 'subBlocks' ][ trim($_attr[ 'name' ], '"\'') ][] = $_className;
*/ $this->openTag(
public static function saveBlockData($block_content, $block_tag, $template, $filepath) { $compiler,
$_rdl = preg_quote($template->smarty->right_delimiter); 'block',
$_ldl = preg_quote($template->smarty->left_delimiter); array(
if (!$template->smarty->auto_literal) { $_attr, $compiler->nocache, $compiler->parser->current_buffer,
$al = '\s*'; $compiler->template->compiled->has_nocache_code,
} else { $compiler->template->caching
$al = ''; )
} );
if (0 == preg_match("!({$_ldl}{$al}block\s+)(name=)?(\w+|'.*'|\".*\")(\s*?)?((append|prepend|nocache)?(\s*)?(hide)?)?(\s*{$_rdl})!", $block_tag, $_match)) { $compiler->saveRequiredPlugins(true);
$error_text = 'Syntax Error in template "' . $template->source->filepath . '" "' . htmlspecialchars($block_tag) . '" illegal options'; $compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
throw new SmartyCompilerException($error_text); $compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template();
} else { $compiler->template->compiled->has_nocache_code = false;
$_name = trim($_match[3], '\'"'); $compiler->suppressNocacheProcessing = true;
if ($_match[8] != 'hide' || isset($template->block_data[$_name])) { // replace {$smarty.block.child} }
// get nested block tags }
if (0 != preg_match_all("!({$_ldl}{$al}block\s+)(name=)?(\w+|'.*'|\".*\")([\s\S]*?)(hide)?(\s*{$_rdl})([\s\S]*?)(.*)?({$_ldl}{$al}/block\s*{$_rdl})!", $block_content, $_match2)) {
foreach ($_match2[3] as $key => $name) { /**
// get it's replacement * Smarty Internal Plugin Compile BlockClose Class
$_name2 = trim($name, '\'"'); */
if ($_match2[5][$key] != 'hide' || isset($template->block_data[$_name2])) { class Smarty_Internal_Compile_Blockclose extends Smarty_Internal_Compile_Shared_Inheritance
if (isset($template->block_data[$_name2])) { {
$replacement = $template->block_data[$_name2]['source']; /**
} else { * Compiles code for the {/block} tag
$replacement = ''; *
} * @param array $args array with attributes from parser
// replace {$smarty.block.child} tag * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
if (preg_match("!{$_ldl}{$al}\\\$smarty\.block\.child\s*{$_rdl}!",$_match2[7][$key])) { * @param array $parameter array with compilation parameter
$replacement = preg_replace("!({$_ldl}{$al}\\\$smarty\.block\.child\s*{$_rdl})!", $replacement, $_match2[7][$key]); *
$block_content = preg_replace("!(({$_ldl}{$al}block)(.*)?{$name}(.*)?({$_rdl}[\s\S]*?{$_ldl}{$al}/block\s*{$_rdl}))!", $replacement, $block_content); * @return bool true
} */
if (preg_match("!{$_ldl}{$al}\\\$smarty\.block\.child\s*{$_rdl}!",$_match2[8][$key])) { public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
$replacement = preg_replace("!{$_ldl}{$al}\\\$smarty\.block\.child\s*{$_rdl}!", $replacement, $_match2[8][$key]); {
$block_content = preg_replace("!(({$_ldl}{$al}block)(.*)?{$name}(.*)?({$_rdl})(.*)?({$_ldl}{$al}/block\s*{$_rdl}))!", $replacement, $block_content); list($_attr, $_nocache, $_buffer, $_has_nocache_code, $_caching) = $this->closeTag($compiler, array('block'));
} // init block parameter
} else { $_block = $compiler->_cache[ 'blockParams' ][ $compiler->_cache[ 'blockNesting' ] ];
// remove hidden blocks unset($compiler->_cache[ 'blockParams' ][ $compiler->_cache[ 'blockNesting' ] ]);
$block_content = preg_replace("!(({$_ldl}{$al}block)(.*)?{$name}(.*)?({$_rdl}[\s\S]*?{$_ldl}{$al}/block\s*{$_rdl}))!", '', $block_content); $_name = $_attr[ 'name' ];
} $_assign = isset($_attr[ 'assign' ]) ? $_attr[ 'assign' ] : null;
} unset($_attr[ 'assign' ], $_attr[ 'name' ]);
} foreach ($_attr as $name => $stat) {
// do we have not nested {$smart.block.child} if ((is_bool($stat) && $stat !== false) || (!is_bool($stat) && $stat !== 'false')) {
if (0 != preg_match("!({$_ldl}{$al}\\\$smarty\.block\.child\s*{$_rdl})!", $block_content, $_match2)) { $_block[ $name ] = 'true';
// get child replacement for this block }
if (isset($template->block_data[$_name])) { }
$replacement = $template->block_data[$_name]['source']; $_className = $compiler->_cache[ 'blockClass' ][ $compiler->_cache[ 'blockNesting' ] ];
unset($template->block_data[$_name]); // get compiled block code
} else { $_functionCode = $compiler->parser->current_buffer;
$replacement = ''; // setup buffer for template function code
} $compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template();
$block_content = preg_replace("!({$_ldl}{$al}\\\$smarty\.block\.child\s*{$_rdl})!", $replacement, $block_content); $output = "<?php\n";
} $output .= "/* {block {$_name}} */\n";
if (isset($template->block_data[$_name])) { $output .= "class {$_className} extends Smarty_Internal_Block\n";
if (strpos($template->block_data[$_name]['source'], '%%%%SMARTY_PARENT%%%%') !== false) { $output .= "{\n";
$template->block_data[$_name]['source'] = foreach ($_block as $property => $value) {
str_replace('%%%%SMARTY_PARENT%%%%', $block_content, $template->block_data[$_name]['source']); $output .= "public \${$property} = " . var_export($value, true) . ";\n";
} elseif ($template->block_data[$_name]['mode'] == 'prepend') { }
$template->block_data[$_name]['source'] .= $block_content; $output .= "public function callBlock(Smarty_Internal_Template \$_smarty_tpl) {\n";
} elseif ($template->block_data[$_name]['mode'] == 'append') { $output .= $compiler->compileRequiredPlugins();
$template->block_data[$_name]['source'] = $block_content . $template->block_data[$_name]['source']; $compiler->restoreRequiredPlugins();
} if ($compiler->template->compiled->has_nocache_code) {
} else { $output .= "\$_smarty_tpl->cached->hashes['{$compiler->template->compiled->nocache_hash}'] = true;\n";
$template->block_data[$_name]['source'] = $block_content; }
$template->block_data[$_name]['file'] = $filepath; if (isset($_assign)) {
} $output .= "ob_start();\n";
if ($_match[6] == 'append') { }
$template->block_data[$_name]['mode'] = 'append'; $output .= "?>\n";
} elseif ($_match[6] == 'prepend') { $compiler->parser->current_buffer->append_subtree(
$template->block_data[$_name]['mode'] = 'prepend'; $compiler->parser,
} else { new Smarty_Internal_ParseTree_Tag(
$template->block_data[$_name]['mode'] = 'replace'; $compiler->parser,
} $output
} )
} );
} $compiler->parser->current_buffer->append_subtree($compiler->parser, $_functionCode);
$output = "<?php\n";
/** if (isset($_assign)) {
* Compile saved child block source $output .= "\$_smarty_tpl->assign({$_assign}, ob_get_clean());\n";
* }
* @param object $compiler compiler object $output .= "}\n";
* @param string $_name optional name of child block $output .= "}\n";
* @return string compiled code of schild block $output .= "/* {/block {$_name}} */\n\n";
*/ $output .= "?>\n";
public static function compileChildBlock($compiler, $_name = null) { $compiler->parser->current_buffer->append_subtree(
$_output = ''; $compiler->parser,
// if called by {$smarty.block.child} we must search the name of enclosing {block} new Smarty_Internal_ParseTree_Tag(
if ($_name == null) { $compiler->parser,
$stack_count = count($compiler->_tag_stack); $output
while (--$stack_count >= 0) { )
if ($compiler->_tag_stack[$stack_count][0] == 'block') { );
$_name = trim($compiler->_tag_stack[$stack_count][1][0]['name'], "'\""); $compiler->blockOrFunctionCode .= $compiler->parser->current_buffer->to_smarty_php($compiler->parser);
break; $compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template();
} // restore old status
} $compiler->template->compiled->has_nocache_code = $_has_nocache_code;
// flag that child is already compile by {$smarty.block.child} inclusion $compiler->tag_nocache = $compiler->nocache;
$compiler->template->block_data[$_name]['compiled'] = true; $compiler->nocache = $_nocache;
} $compiler->parser->current_buffer = $_buffer;
if ($_name == null) { $output = "<?php \n";
$compiler->trigger_template_error('{$smarty.block.child} used out of context', $compiler->lex->taglineno); if ($compiler->_cache[ 'blockNesting' ] === 1) {
} $output .= "\$_smarty_tpl->inheritance->instanceBlock(\$_smarty_tpl, '$_className', $_name);\n";
// undefined child? } else {
if (!isset($compiler->template->block_data[$_name]['source'])) { $output .= "\$_smarty_tpl->inheritance->instanceBlock(\$_smarty_tpl, '$_className', $_name, \$this->tplIndex);\n";
return ''; }
} $output .= "?>\n";
$_tpl = new Smarty_Internal_template('string:' . $compiler->template->block_data[$_name]['source'], $compiler->smarty, $compiler->template, $compiler->template->cache_id, --$compiler->_cache[ 'blockNesting' ];
$compiler->template->compile_id = null, $compiler->template->caching, $compiler->template->cache_lifetime); if ($compiler->_cache[ 'blockNesting' ] === 0) {
$_tpl->variable_filters = $compiler->template->variable_filters; unset($compiler->_cache[ 'blockNesting' ]);
$_tpl->properties['nocache_hash'] = $compiler->template->properties['nocache_hash']; }
$_tpl->source->filepath = $compiler->template->block_data[$_name]['file']; $compiler->has_code = true;
$_tpl->allow_relative_path = true; $compiler->suppressNocacheProcessing = true;
if ($compiler->nocache) { return $output;
$_tpl->compiler->forceNocache = 2; }
} else { }
$_tpl->compiler->forceNocache = 1;
}
$_tpl->compiler->suppressHeader = true;
$_tpl->compiler->suppressTemplatePropertyHeader = true;
$_tpl->compiler->suppressMergedTemplates = true;
if (strpos($compiler->template->block_data[$_name]['source'], '%%%%SMARTY_PARENT%%%%') !== false) {
$_output = str_replace('%%%%SMARTY_PARENT%%%%', $compiler->parser->current_buffer->to_smarty_php(), $_tpl->compiler->compileTemplate($_tpl));
} elseif ($compiler->template->block_data[$_name]['mode'] == 'prepend') {
$_output = $_tpl->compiler->compileTemplate($_tpl) . $compiler->parser->current_buffer->to_smarty_php();
} elseif ($compiler->template->block_data[$_name]['mode'] == 'append') {
$_output = $compiler->parser->current_buffer->to_smarty_php() . $_tpl->compiler->compileTemplate($_tpl);
} elseif (!empty($compiler->template->block_data[$_name])) {
$_output = $_tpl->compiler->compileTemplate($_tpl);
}
$compiler->template->properties['file_dependency'] = array_merge($compiler->template->properties['file_dependency'], $_tpl->properties['file_dependency']);
$compiler->template->properties['function'] = array_merge($compiler->template->properties['function'], $_tpl->properties['function']);
$compiler->merged_templates = array_merge($compiler->merged_templates, $_tpl->compiler->merged_templates);
$compiler->template->variable_filters = $_tpl->variable_filters;
if ($_tpl->has_nocache_code) {
$compiler->template->has_nocache_code = true;
}
foreach ($_tpl->required_plugins as $key => $tmp1) {
if ($compiler->nocache && $compiler->template->caching) {
$code = 'nocache';
} else {
$code = $key;
}
foreach ($tmp1 as $name => $tmp) {
foreach ($tmp as $type => $data) {
$compiler->template->required_plugins[$code][$name][$type] = $data;
}
}
}
unset($_tpl);
return $_output;
}
}
/**
* Smarty Internal Plugin Compile BlockClose Class
*
* @package Smarty
* @subpackage Compiler
*/
class Smarty_Internal_Compile_Blockclose extends Smarty_Internal_CompileBase {
/**
* Compiles code for the {/block} tag
*
* @param array $args array with attributes from parser
* @param object $compiler compiler object
* @return string compiled code
*/
public function compile($args, $compiler) {
$compiler->has_code = true;
// check and get attributes
$_attr = $this->getAttributes($compiler, $args);
$saved_data = $this->closeTag($compiler, array('block'));
$_name = trim($saved_data[0]['name'], "\"'");
if (isset($compiler->template->block_data[$_name]) && !isset($compiler->template->block_data[$_name]['compiled'])) {
// restore to status before {block} tag as new subtemplate code of parent {block} is not needed
// TODO: Below code was disabled in 3.1.8 because of problems with {include} in nested {block} tags in child templates
// combined with append/prepend or $smarty.block.parent
// For later versions it should be checked under which conditions it could run for optimisation
//
//$compiler->merged_templates = $saved_data[4];
//$compiler->smarty->merged_templates_func = $saved_data[5];
//$compiler->template->properties = $saved_data[6];
//$compiler->template->has_nocache_code = $saved_data[7];
$_output = Smarty_Internal_Compile_Block::compileChildBlock($compiler, $_name);
} else {
if (isset($saved_data[0]['hide']) && !isset($compiler->template->block_data[$_name]['source'])) {
$_output = '';
} else {
$_output = $compiler->parser->current_buffer->to_smarty_php();
}
unset($compiler->template->block_data[$_name]['compiled']);
}
// reset flags
$compiler->parser->current_buffer = $saved_data[1];
$compiler->nocache = $saved_data[2];
$compiler->smarty->merge_compiled_includes = $saved_data[3];
// reset flag for {block} tag
$compiler->inheritance = false;
// $_output content has already nocache code processed
$compiler->suppressNocacheProcessing = true;
return $_output;
}
}
?>

View file

@ -0,0 +1,24 @@
<?php
/**
* This file is part of Smarty.
*
* (c) 2015 Uwe Tews
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
/**
* Smarty Internal Plugin Compile Block Child Class
*
* @author Uwe Tews <uwe.tews@googlemail.com>
*/
class Smarty_Internal_Compile_Block_Child extends Smarty_Internal_Compile_Child
{
/**
* Tag name
*
* @var string
*/
public $tag = 'block_child';
}

View file

@ -0,0 +1,31 @@
<?php
/**
* This file is part of Smarty.
*
* (c) 2015 Uwe Tews
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
/**
* Smarty Internal Plugin Compile Block Parent Class
*
* @author Uwe Tews <uwe.tews@googlemail.com>
*/
class Smarty_Internal_Compile_Block_Parent extends Smarty_Internal_Compile_Child
{
/**
* Tag name
*
* @var string
*/
public $tag = 'block_parent';
/**
* Block type
*
* @var string
*/
public $blockType = 'Parent';
}

View file

@ -1,77 +1,117 @@
<?php <?php
/** /**
* Smarty Internal Plugin Compile Break * Smarty Internal Plugin Compile Break
* * Compiles the {break} tag
* Compiles the {break} tag *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler * @author Uwe Tews
* @author Uwe Tews */
*/
/** /**
* Smarty Internal Plugin Compile Break Class * Smarty Internal Plugin Compile Break Class
* *
* @package Smarty * @package Smarty
* @subpackage Compiler * @subpackage Compiler
*/ */
class Smarty_Internal_Compile_Break extends Smarty_Internal_CompileBase { class Smarty_Internal_Compile_Break extends Smarty_Internal_CompileBase
{
/** /**
* Attribute definition: Overwrites base class. * Attribute definition: Overwrites base class.
* *
* @var array * @var array
* @see Smarty_Internal_CompileBase * @see Smarty_Internal_CompileBase
*/ */
public $optional_attributes = array('levels'); public $optional_attributes = array('levels');
/**
* Attribute definition: Overwrites base class. /**
* * Attribute definition: Overwrites base class.
* @var array *
* @see Smarty_Internal_CompileBase * @var array
*/ * @see Smarty_Internal_CompileBase
public $shorttag_order = array('levels'); */
public $shorttag_order = array('levels');
/**
* Compiles code for the {break} tag /**
* * Tag name may be overloaded by Smarty_Internal_Compile_Continue
* @param array $args array with attributes from parser *
* @param object $compiler compiler object * @var string
* @param array $parameter array with compilation parameter */
* @return string compiled code public $tag = 'break';
*/
public function compile($args, $compiler, $parameter) /**
{ * Compiles code for the {break} tag
static $_is_loopy = array('for' => true, 'foreach' => true, 'while' => true, 'section' => true); *
// check and get attributes * @param array $args array with attributes from parser
$_attr = $this->getAttributes($compiler, $args); * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
*
if ($_attr['nocache'] === true) { * @return string compiled code
$compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno); * @throws \SmartyCompilerException
} */
public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
if (isset($_attr['levels'])) { {
if (!is_numeric($_attr['levels'])) { list($levels, $foreachLevels) = $this->checkLevels($args, $compiler);
$compiler->trigger_template_error('level attribute must be a numeric constant', $compiler->lex->taglineno); $output = "<?php ";
} if ($foreachLevels > 0 && $this->tag === 'continue') {
$_levels = $_attr['levels']; $foreachLevels--;
} else { }
$_levels = 1; if ($foreachLevels > 0) {
} /* @var Smarty_Internal_Compile_Foreach $foreachCompiler */
$level_count = $_levels; $foreachCompiler = $compiler->getTagCompiler('foreach');
$stack_count = count($compiler->_tag_stack) - 1; $output .= $foreachCompiler->compileRestore($foreachLevels);
while ($level_count > 0 && $stack_count >= 0) { }
if (isset($_is_loopy[$compiler->_tag_stack[$stack_count][0]])) { $output .= "{$this->tag} {$levels};?>";
$level_count--; return $output;
} }
$stack_count--;
} /**
if ($level_count != 0) { * check attributes and return array of break and foreach levels
$compiler->trigger_template_error("cannot break {$_levels} level(s)", $compiler->lex->taglineno); *
} * @param array $args array with attributes from parser
$compiler->has_code = true; * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
return "<?php break {$_levels}?>"; *
} * @return array
* @throws \SmartyCompilerException
} */
public function checkLevels($args, Smarty_Internal_TemplateCompilerBase $compiler)
?> {
static $_is_loopy = array('for' => true, 'foreach' => true, 'while' => true, 'section' => true);
// check and get attributes
$_attr = $this->getAttributes($compiler, $args);
if ($_attr[ 'nocache' ] === true) {
$compiler->trigger_template_error('nocache option not allowed', null, true);
}
if (isset($_attr[ 'levels' ])) {
if (!is_numeric($_attr[ 'levels' ])) {
$compiler->trigger_template_error('level attribute must be a numeric constant', null, true);
}
$levels = $_attr[ 'levels' ];
} else {
$levels = 1;
}
$level_count = $levels;
$stack_count = count($compiler->_tag_stack) - 1;
$foreachLevels = 0;
$lastTag = '';
while ($level_count > 0 && $stack_count >= 0) {
if (isset($_is_loopy[ $compiler->_tag_stack[ $stack_count ][ 0 ] ])) {
$lastTag = $compiler->_tag_stack[ $stack_count ][ 0 ];
if ($level_count === 0) {
break;
}
$level_count--;
if ($compiler->_tag_stack[ $stack_count ][ 0 ] === 'foreach') {
$foreachLevels++;
}
}
$stack_count--;
}
if ($level_count !== 0) {
$compiler->trigger_template_error("cannot {$this->tag} {$levels} level(s)", null, true);
}
if ($lastTag === 'foreach' && $this->tag === 'break' && $foreachLevels > 0) {
$foreachLevels--;
}
return array($levels, $foreachLevels);
}
}

View file

@ -1,130 +1,89 @@
<?php <?php
/** /**
* Smarty Internal Plugin Compile Function_Call * Smarty Internal Plugin Compile Function_Call
* * Compiles the calls of user defined tags defined by {function}
* Compiles the calls of user defined tags defined by {function} *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler * @author Uwe Tews
* @author Uwe Tews */
*/
/**
/** * Smarty Internal Plugin Compile Function_Call Class
* Smarty Internal Plugin Compile Function_Call Class *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler */
*/ class Smarty_Internal_Compile_Call extends Smarty_Internal_CompileBase
class Smarty_Internal_Compile_Call extends Smarty_Internal_CompileBase { {
/**
/** * Attribute definition: Overwrites base class.
* Attribute definition: Overwrites base class. *
* * @var array
* @var array * @see Smarty_Internal_CompileBase
* @see Smarty_Internal_CompileBase */
*/ public $required_attributes = array('name');
public $required_attributes = array('name');
/** /**
* Attribute definition: Overwrites base class. * Attribute definition: Overwrites base class.
* *
* @var array * @var array
* @see Smarty_Internal_CompileBase * @see Smarty_Internal_CompileBase
*/ */
public $shorttag_order = array('name'); public $shorttag_order = array('name');
/**
* Attribute definition: Overwrites base class. /**
* * Attribute definition: Overwrites base class.
* @var array *
* @see Smarty_Internal_CompileBase * @var array
*/ * @see Smarty_Internal_CompileBase
public $optional_attributes = array('_any'); */
public $optional_attributes = array('_any');
/**
* Compiles the calls of user defined tags defined by {function} /**
* * Compiles the calls of user defined tags defined by {function}
* @param array $args array with attributes from parser *
* @param object $compiler compiler object * @param array $args array with attributes from parser
* @param array $parameter array with compilation parameter * @param object $compiler compiler object
* @return string compiled code *
*/ * @return string compiled code
public function compile($args, $compiler) */
{ public function compile($args, $compiler)
// check and get attributes {
$_attr = $this->getAttributes($compiler, $args); // check and get attributes
// save possible attributes $_attr = $this->getAttributes($compiler, $args);
if (isset($_attr['assign'])) { // save possible attributes
// output will be stored in a smarty variable instead of beind displayed if (isset($_attr[ 'assign' ])) {
$_assign = $_attr['assign']; // output will be stored in a smarty variable instead of being displayed
} $_assign = $_attr[ 'assign' ];
$_name = $_attr['name']; }
if ($compiler->compiles_template_function) { //$_name = trim($_attr['name'], "''");
$compiler->called_functions[] = trim($_name, "'\""); $_name = $_attr[ 'name' ];
} unset($_attr[ 'name' ], $_attr[ 'assign' ], $_attr[ 'nocache' ]);
unset($_attr['name'], $_attr['assign'], $_attr['nocache']); // set flag (compiled code of {function} must be included in cache file
// set flag (compiled code of {function} must be included in cache file if (!$compiler->template->caching || $compiler->nocache || $compiler->tag_nocache) {
if ($compiler->nocache || $compiler->tag_nocache) { $_nocache = 'true';
$_nocache = 'true'; } else {
} else { $_nocache = 'false';
$_nocache = 'false'; }
} $_paramsArray = array();
$_paramsArray = array(); foreach ($_attr as $_key => $_value) {
foreach ($_attr as $_key => $_value) { if (is_int($_key)) {
if (is_int($_key)) { $_paramsArray[] = "$_key=>$_value";
$_paramsArray[] = "$_key=>$_value"; } else {
} else { $_paramsArray[] = "'$_key'=>$_value";
$_paramsArray[] = "'$_key'=>$_value"; }
} }
} $_params = 'array(' . implode(',', $_paramsArray) . ')';
if (isset($compiler->template->properties['function'][$_name]['parameter'])) { //$compiler->suppressNocacheProcessing = true;
foreach ($compiler->template->properties['function'][$_name]['parameter'] as $_key => $_value) { // was there an assign attribute
if (!isset($_attr[$_key])) { if (isset($_assign)) {
if (is_int($_key)) { $_output =
$_paramsArray[] = "$_key=>$_value"; "<?php ob_start();\n\$_smarty_tpl->smarty->ext->_tplFunction->callTemplateFunction(\$_smarty_tpl, {$_name}, {$_params}, {$_nocache});\n\$_smarty_tpl->assign({$_assign}, ob_get_clean());?>\n";
} else { } else {
$_paramsArray[] = "'$_key'=>$_value"; $_output =
} "<?php \$_smarty_tpl->smarty->ext->_tplFunction->callTemplateFunction(\$_smarty_tpl, {$_name}, {$_params}, {$_nocache});?>\n";
} }
} return $_output;
} elseif (isset($compiler->smarty->template_functions[$_name]['parameter'])) { }
foreach ($compiler->smarty->template_functions[$_name]['parameter'] as $_key => $_value) { }
if (!isset($_attr[$_key])) {
if (is_int($_key)) {
$_paramsArray[] = "$_key=>$_value";
} else {
$_paramsArray[] = "'$_key'=>$_value";
}
}
}
}
//varibale name?
if (!(strpos($_name, '$') === false)) {
$call_cache = $_name;
$call_function = '$tmp = "smarty_template_function_".' . $_name . '; $tmp';
} else {
$_name = trim($_name, "'\"");
$call_cache = "'{$_name}'";
$call_function = 'smarty_template_function_' . $_name;
}
$_params = 'array(' . implode(",", $_paramsArray) . ')';
$_hash = str_replace('-', '_', $compiler->template->properties['nocache_hash']);
// was there an assign attribute
if (isset($_assign)) {
if ($compiler->template->caching) {
$_output = "<?php ob_start(); Smarty_Internal_Function_Call_Handler::call ({$call_cache},\$_smarty_tpl,{$_params},'{$_hash}',{$_nocache}); \$_smarty_tpl->assign({$_assign}, ob_get_clean());?>\n";
} else {
$_output = "<?php ob_start(); {$call_function}(\$_smarty_tpl,{$_params}); \$_smarty_tpl->assign({$_assign}, ob_get_clean());?>\n";
}
} else {
if ($compiler->template->caching) {
$_output = "<?php Smarty_Internal_Function_Call_Handler::call ({$call_cache},\$_smarty_tpl,{$_params},'{$_hash}',{$_nocache});?>\n";
} else {
$_output = "<?php {$call_function}(\$_smarty_tpl,{$_params});?>\n";
}
}
return $_output;
}
}
?>

View file

@ -1,98 +1,105 @@
<?php <?php
/** /**
* Smarty Internal Plugin Compile Capture * Smarty Internal Plugin Compile Capture
* * Compiles the {capture} tag
* Compiles the {capture} tag *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler * @author Uwe Tews
* @author Uwe Tews */
*/
/**
/** * Smarty Internal Plugin Compile Capture Class
* Smarty Internal Plugin Compile Capture Class *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler */
*/ class Smarty_Internal_Compile_Capture extends Smarty_Internal_CompileBase
class Smarty_Internal_Compile_Capture extends Smarty_Internal_CompileBase { {
/**
/** * Attribute definition: Overwrites base class.
* Attribute definition: Overwrites base class. *
* * @var array
* @var array * @see Smarty_Internal_CompileBase
* @see Smarty_Internal_CompileBase */
*/ public $shorttag_order = array('name');
public $shorttag_order = array('name');
/** /**
* Attribute definition: Overwrites base class. * Attribute definition: Overwrites base class.
* *
* @var array * @var array
* @see Smarty_Internal_CompileBase * @see Smarty_Internal_CompileBase
*/ */
public $optional_attributes = array('name', 'assign', 'append'); public $optional_attributes = array('name', 'assign', 'append');
/** /**
* Compiles code for the {capture} tag * Compiles code for the {$smarty.capture.xxx}
* *
* @param array $args array with attributes from parser * @param array $args array with attributes from parser
* @param object $compiler compiler object * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
* @return string compiled code * @param array $parameter array with compilation parameter
*/ *
public function compile($args, $compiler) * @return string compiled code
{ */
// check and get attributes public static function compileSpecialVariable(
$_attr = $this->getAttributes($compiler, $args); $args,
Smarty_Internal_TemplateCompilerBase $compiler,
$buffer = isset($_attr['name']) ? $_attr['name'] : "'default'"; $parameter = null
$assign = isset($_attr['assign']) ? $_attr['assign'] : 'null'; ) {
$append = isset($_attr['append']) ? $_attr['append'] : 'null'; return '$_smarty_tpl->smarty->ext->_capture->getBuffer($_smarty_tpl' .
(isset($parameter[ 1 ]) ? ", {$parameter[ 1 ]})" : ')');
$compiler->_capture_stack[0][] = array($buffer, $assign, $append, $compiler->nocache); }
// maybe nocache because of nocache variables
$compiler->nocache = $compiler->nocache | $compiler->tag_nocache; /**
$_output = "<?php \$_smarty_tpl->_capture_stack[0][] = array($buffer, $assign, $append); ob_start(); ?>"; * Compiles code for the {capture} tag
*
return $_output; * @param array $args array with attributes from parser
} * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
* @param null $parameter
} *
* @return string compiled code
/** */
* Smarty Internal Plugin Compile Captureclose Class public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter = null)
* {
* @package Smarty // check and get attributes
* @subpackage Compiler $_attr = $this->getAttributes($compiler, $args, $parameter, 'capture');
*/ $buffer = isset($_attr[ 'name' ]) ? $_attr[ 'name' ] : "'default'";
class Smarty_Internal_Compile_CaptureClose extends Smarty_Internal_CompileBase { $assign = isset($_attr[ 'assign' ]) ? $_attr[ 'assign' ] : 'null';
$append = isset($_attr[ 'append' ]) ? $_attr[ 'append' ] : 'null';
/** $compiler->_cache[ 'capture_stack' ][] = array($compiler->nocache);
* Compiles code for the {/capture} tag // maybe nocache because of nocache variables
* $compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
* @param array $args array with attributes from parser $_output = "<?php \$_smarty_tpl->smarty->ext->_capture->open(\$_smarty_tpl, $buffer, $assign, $append);?>";
* @param object $compiler compiler object return $_output;
* @return string compiled code }
*/ }
public function compile($args, $compiler)
{ /**
// check and get attributes * Smarty Internal Plugin Compile Captureclose Class
$_attr = $this->getAttributes($compiler, $args); *
// must endblock be nocache? * @package Smarty
if ($compiler->nocache) { * @subpackage Compiler
$compiler->tag_nocache = true; */
} class Smarty_Internal_Compile_CaptureClose extends Smarty_Internal_CompileBase
{
list($buffer, $assign, $append, $compiler->nocache) = array_pop($compiler->_capture_stack[0]); /**
* Compiles code for the {/capture} tag
$_output = "<?php list(\$_capture_buffer, \$_capture_assign, \$_capture_append) = array_pop(\$_smarty_tpl->_capture_stack[0]);\n"; *
$_output .= "if (!empty(\$_capture_buffer)) {\n"; * @param array $args array with attributes from parser
$_output .= " if (isset(\$_capture_assign)) \$_smarty_tpl->assign(\$_capture_assign, ob_get_contents());\n"; * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
$_output .= " if (isset( \$_capture_append)) \$_smarty_tpl->append( \$_capture_append, ob_get_contents());\n"; * @param null $parameter
$_output .= " Smarty::\$_smarty_vars['capture'][\$_capture_buffer]=ob_get_clean();\n"; *
$_output .= "} else \$_smarty_tpl->capture_error();?>"; * @return string compiled code
return $_output; */
} public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
{
} // check and get attributes
$_attr = $this->getAttributes($compiler, $args, $parameter, '/capture');
?> // must endblock be nocache?
if ($compiler->nocache) {
$compiler->tag_nocache = true;
}
list($compiler->nocache) = array_pop($compiler->_cache[ 'capture_stack' ]);
return "<?php \$_smarty_tpl->smarty->ext->_capture->close(\$_smarty_tpl);?>";
}
}

View file

@ -0,0 +1,79 @@
<?php
/**
* This file is part of Smarty.
*
* (c) 2015 Uwe Tews
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
/**
* Smarty Internal Plugin Compile Child Class
*
* @author Uwe Tews <uwe.tews@googlemail.com>
*/
class Smarty_Internal_Compile_Child extends Smarty_Internal_CompileBase
{
/**
* Attribute definition: Overwrites base class.
*
* @var array
* @see Smarty_Internal_CompileBase
*/
public $optional_attributes = array('assign');
/**
* Tag name
*
* @var string
*/
public $tag = 'child';
/**
* Block type
*
* @var string
*/
public $blockType = 'Child';
/**
* Compiles code for the {child} tag
*
* @param array $args array with attributes from parser
* @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
* @param array $parameter array with compilation parameter
*
* @return string compiled code
* @throws \SmartyCompilerException
*/
public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
{
// check and get attributes
$_attr = $this->getAttributes($compiler, $args);
$tag = isset($parameter[ 0 ]) ? "'{$parameter[0]}'" : "'{{$this->tag}}'";
if (!isset($compiler->_cache[ 'blockNesting' ])) {
$compiler->trigger_template_error(
"{$tag} used outside {block} tags ",
$compiler->parser->lex->taglineno
);
}
$compiler->has_code = true;
$compiler->suppressNocacheProcessing = true;
if ($this->blockType === 'Child') {
$compiler->_cache[ 'blockParams' ][ $compiler->_cache[ 'blockNesting' ] ][ 'callsChild' ] = 'true';
}
$_assign = isset($_attr[ 'assign' ]) ? $_attr[ 'assign' ] : null;
$output = "<?php \n";
if (isset($_assign)) {
$output .= "ob_start();\n";
}
$output .= '$_smarty_tpl->inheritance->call' . $this->blockType . '($_smarty_tpl, $this' .
($this->blockType === 'Child' ? '' : ", {$tag}") . ");\n";
if (isset($_assign)) {
$output .= "\$_smarty_tpl->assign({$_assign}, ob_get_clean());\n";
}
$output .= "?>\n";
return $output;
}
}

View file

@ -1,85 +1,96 @@
<?php <?php
/** /**
* Smarty Internal Plugin Compile Config Load * Smarty Internal Plugin Compile Config Load
* * Compiles the {config load} tag
* Compiles the {config load} tag *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler * @author Uwe Tews
* @author Uwe Tews */
*/
/**
/** * Smarty Internal Plugin Compile Config Load Class
* Smarty Internal Plugin Compile Config Load Class *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler */
*/ class Smarty_Internal_Compile_Config_Load extends Smarty_Internal_CompileBase
class Smarty_Internal_Compile_Config_Load extends Smarty_Internal_CompileBase { {
/**
/** * Attribute definition: Overwrites base class.
* Attribute definition: Overwrites base class. *
* * @var array
* @var array * @see Smarty_Internal_CompileBase
* @see Smarty_Internal_CompileBase */
*/ public $required_attributes = array('file');
public $required_attributes = array('file');
/** /**
* Attribute definition: Overwrites base class. * Attribute definition: Overwrites base class.
* *
* @var array * @var array
* @see Smarty_Internal_CompileBase * @see Smarty_Internal_CompileBase
*/ */
public $shorttag_order = array('file','section'); public $shorttag_order = array('file', 'section');
/**
* Attribute definition: Overwrites base class. /**
* * Attribute definition: Overwrites base class.
* @var array *
* @see Smarty_Internal_CompileBase * @var array
*/ * @see Smarty_Internal_CompileBase
public $optional_attributes = array('section', 'scope'); */
public $optional_attributes = array('section', 'scope');
/**
* Compiles code for the {config_load} tag /**
* * Attribute definition: Overwrites base class.
* @param array $args array with attributes from parser *
* @param object $compiler compiler object * @var array
* @return string compiled code * @see Smarty_Internal_CompileBase
*/ */
public function compile($args, $compiler) public $option_flags = array('nocache', 'noscope');
{
static $_is_legal_scope = array('local' => true,'parent' => true,'root' => true,'global' => true); /**
// check and get attributes * Valid scope names
$_attr = $this->getAttributes($compiler, $args); *
* @var array
if ($_attr['nocache'] === true) { */
$compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno); public $valid_scopes = array(
} 'local' => Smarty::SCOPE_LOCAL, 'parent' => Smarty::SCOPE_PARENT,
'root' => Smarty::SCOPE_ROOT, 'tpl_root' => Smarty::SCOPE_TPL_ROOT,
'smarty' => Smarty::SCOPE_SMARTY, 'global' => Smarty::SCOPE_SMARTY
// save posible attributes );
$conf_file = $_attr['file'];
if (isset($_attr['section'])) { /**
$section = $_attr['section']; * Compiles code for the {config_load} tag
} else { *
$section = 'null'; * @param array $args array with attributes from parser
} * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
$scope = 'local'; *
// scope setup * @return string compiled code
if (isset($_attr['scope'])) { * @throws \SmartyCompilerException
$_attr['scope'] = trim($_attr['scope'], "'\""); */
if (isset($_is_legal_scope[$_attr['scope']])) { public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
$scope = $_attr['scope']; {
} else { // check and get attributes
$compiler->trigger_template_error('illegal value for "scope" attribute', $compiler->lex->taglineno); $_attr = $this->getAttributes($compiler, $args);
} if ($_attr[ 'nocache' ] === true) {
} $compiler->trigger_template_error('nocache option not allowed', null, true);
// create config object }
$_output = "<?php \$_config = new Smarty_Internal_Config($conf_file, \$_smarty_tpl->smarty, \$_smarty_tpl);"; // save possible attributes
$_output .= "\$_config->loadConfigVars($section, '$scope'); ?>"; $conf_file = $_attr[ 'file' ];
return $_output; if (isset($_attr[ 'section' ])) {
} $section = $_attr[ 'section' ];
} else {
} $section = 'null';
}
?> // scope setup
if ($_attr[ 'noscope' ]) {
$_scope = -1;
} else {
$_scope = $compiler->convertScope($_attr, $this->valid_scopes);
}
// create config object
$_output =
"<?php\n\$_smarty_tpl->smarty->ext->configLoad->_loadConfigFile(\$_smarty_tpl, {$conf_file}, {$section}, {$_scope});\n?>\n";
return $_output;
}
}

View file

@ -1,78 +1,25 @@
<?php <?php
/** /**
* Smarty Internal Plugin Compile Continue * Smarty Internal Plugin Compile Continue
* * Compiles the {continue} tag
* Compiles the {continue} tag *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler * @author Uwe Tews
* @author Uwe Tews */
*/
/**
/** * Smarty Internal Plugin Compile Continue Class
* Smarty Internal Plugin Compile Continue Class *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler */
*/ class Smarty_Internal_Compile_Continue extends Smarty_Internal_Compile_Break
class Smarty_Internal_Compile_Continue extends Smarty_Internal_CompileBase { {
/**
/** * Tag name
* Attribute definition: Overwrites base class. *
* * @var string
* @var array */
* @see Smarty_Internal_CompileBase public $tag = 'continue';
*/ }
public $optional_attributes = array('levels');
/**
* Attribute definition: Overwrites base class.
*
* @var array
* @see Smarty_Internal_CompileBase
*/
public $shorttag_order = array('levels');
/**
* Compiles code for the {continue} tag
*
* @param array $args array with attributes from parser
* @param object $compiler compiler object
* @param array $parameter array with compilation parameter
* @return string compiled code
*/
public function compile($args, $compiler, $parameter)
{
static $_is_loopy = array('for' => true, 'foreach' => true, 'while' => true, 'section' => true);
// check and get attributes
$_attr = $this->getAttributes($compiler, $args);
if ($_attr['nocache'] === true) {
$compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno);
}
if (isset($_attr['levels'])) {
if (!is_numeric($_attr['levels'])) {
$compiler->trigger_template_error('level attribute must be a numeric constant', $compiler->lex->taglineno);
}
$_levels = $_attr['levels'];
} else {
$_levels = 1;
}
$level_count = $_levels;
$stack_count = count($compiler->_tag_stack) - 1;
while ($level_count > 0 && $stack_count >= 0) {
if (isset($_is_loopy[$compiler->_tag_stack[$stack_count][0]])) {
$level_count--;
}
$stack_count--;
}
if ($level_count != 0) {
$compiler->trigger_template_error("cannot continue {$_levels} level(s)", $compiler->lex->taglineno);
}
$compiler->has_code = true;
return "<?php continue {$_levels}?>";
}
}
?>

View file

@ -1,43 +1,40 @@
<?php <?php
/** /**
* Smarty Internal Plugin Compile Debug * Smarty Internal Plugin Compile Debug
* * Compiles the {debug} tag.
* Compiles the {debug} tag. * It opens a window the the Smarty Debugging Console.
* It opens a window the the Smarty Debugging Console. *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler * @author Uwe Tews
* @author Uwe Tews */
*/
/**
/** * Smarty Internal Plugin Compile Debug Class
* Smarty Internal Plugin Compile Debug Class *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler */
*/ class Smarty_Internal_Compile_Debug extends Smarty_Internal_CompileBase
class Smarty_Internal_Compile_Debug extends Smarty_Internal_CompileBase { {
/**
/** * Compiles code for the {debug} tag
* Compiles code for the {debug} tag *
* * @param array $args array with attributes from parser
* @param array $args array with attributes from parser * @param object $compiler compiler object
* @param object $compiler compiler object *
* @return string compiled code * @return string compiled code
*/ */
public function compile($args, $compiler) public function compile($args, $compiler)
{ {
// check and get attributes // check and get attributes
$_attr = $this->getAttributes($compiler, $args); $_attr = $this->getAttributes($compiler, $args);
// compile always as nocache
// compile always as nocache $compiler->tag_nocache = true;
$compiler->tag_nocache = true; // display debug template
$_output =
// display debug template "<?php \$_smarty_debug = new Smarty_Internal_Debug;\n \$_smarty_debug->display_debug(\$_smarty_tpl);\n";
$_output = "<?php \$_smarty_tpl->smarty->loadPlugin('Smarty_Internal_Debug'); Smarty_Internal_Debug::display_debug(\$_smarty_tpl); ?>"; $_output .= "unset(\$_smarty_debug);\n?>";
return $_output; return $_output;
} }
}
}
?>

View file

@ -1,73 +1,70 @@
<?php <?php
/** /**
* Smarty Internal Plugin Compile Eval * Smarty Internal Plugin Compile Eval
* * Compiles the {eval} tag.
* Compiles the {eval} tag. *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler * @author Uwe Tews
* @author Uwe Tews */
*/
/**
/** * Smarty Internal Plugin Compile Eval Class
* Smarty Internal Plugin Compile Eval Class *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler */
*/ class Smarty_Internal_Compile_Eval extends Smarty_Internal_CompileBase
class Smarty_Internal_Compile_Eval extends Smarty_Internal_CompileBase { {
/**
/** * Attribute definition: Overwrites base class.
* Attribute definition: Overwrites base class. *
* * @var array
* @var array * @see Smarty_Internal_CompileBase
* @see Smarty_Internal_CompileBase */
*/ public $required_attributes = array('var');
public $required_attributes = array('var');
/** /**
* Attribute definition: Overwrites base class. * Attribute definition: Overwrites base class.
* *
* @var array * @var array
* @see Smarty_Internal_CompileBase * @see Smarty_Internal_CompileBase
*/ */
public $optional_attributes = array('assign'); public $optional_attributes = array('assign');
/**
* Attribute definition: Overwrites base class. /**
* * Attribute definition: Overwrites base class.
* @var array *
* @see Smarty_Internal_CompileBase * @var array
*/ * @see Smarty_Internal_CompileBase
public $shorttag_order = array('var','assign'); */
public $shorttag_order = array('var', 'assign');
/**
* Compiles code for the {eval} tag /**
* * Compiles code for the {eval} tag
* @param array $args array with attributes from parser *
* @param object $compiler compiler object * @param array $args array with attributes from parser
* @return string compiled code * @param object $compiler compiler object
*/ *
public function compile($args, $compiler) * @return string compiled code
{ */
$this->required_attributes = array('var'); public function compile($args, $compiler)
$this->optional_attributes = array('assign'); {
// check and get attributes // check and get attributes
$_attr = $this->getAttributes($compiler, $args); $_attr = $this->getAttributes($compiler, $args);
if (isset($_attr['assign'])) { if (isset($_attr[ 'assign' ])) {
// output will be stored in a smarty variable instead of beind displayed // output will be stored in a smarty variable instead of being displayed
$_assign = $_attr['assign']; $_assign = $_attr[ 'assign' ];
} }
// create template object
// create template object $_output =
$_output = "\$_template = new {$compiler->smarty->template_class}('eval:'.".$_attr['var'].", \$_smarty_tpl->smarty, \$_smarty_tpl);"; "\$_template = new {$compiler->smarty->template_class}('eval:'.{$_attr[ 'var' ]}, \$_smarty_tpl->smarty, \$_smarty_tpl);";
//was there an assign attribute? //was there an assign attribute?
if (isset($_assign)) { if (isset($_assign)) {
$_output .= "\$_smarty_tpl->assign($_assign,\$_template->fetch());"; $_output .= "\$_smarty_tpl->assign($_assign,\$_template->fetch());";
} else { } else {
$_output .= "echo \$_template->fetch();"; $_output .= 'echo $_template->fetch();';
} }
return "<?php $_output ?>"; return "<?php $_output ?>";
} }
}
}
?>

View file

@ -1,133 +1,158 @@
<?php <?php
/**
/** * Smarty Internal Plugin Compile extend
* Smarty Internal Plugin Compile extend * Compiles the {extends} tag
* *
* Compiles the {extends} tag * @package Smarty
* * @subpackage Compiler
* @package Smarty * @author Uwe Tews
* @subpackage Compiler */
* @author Uwe Tews
*/ /**
* Smarty Internal Plugin Compile extend Class
/** *
* Smarty Internal Plugin Compile extend Class * @package Smarty
* * @subpackage Compiler
* @package Smarty */
* @subpackage Compiler class Smarty_Internal_Compile_Extends extends Smarty_Internal_Compile_Shared_Inheritance
*/ {
class Smarty_Internal_Compile_Extends extends Smarty_Internal_CompileBase { /**
* Attribute definition: Overwrites base class.
/** *
* Attribute definition: Overwrites base class. * @var array
* * @see Smarty_Internal_CompileBase
* @var array */
* @see Smarty_Internal_CompileBase public $required_attributes = array('file');
*/
public $required_attributes = array('file'); /**
/** * Array of names of optional attribute required by tag
* Attribute definition: Overwrites base class. * use array('_any') if there is no restriction of attributes names
* *
* @var array * @var array
* @see Smarty_Internal_CompileBase */
*/ public $optional_attributes = array('extends_resource');
public $shorttag_order = array('file');
/** /**
* mbstring.overload flag * Attribute definition: Overwrites base class.
* *
* @var int * @var array
*/ * @see Smarty_Internal_CompileBase
public $mbstring_overload = 0; */
public $shorttag_order = array('file');
/**
* Compiles code for the {extends} tag /**
* * Compiles code for the {extends} tag extends: resource
* @param array $args array with attributes from parser *
* @param object $compiler compiler object * @param array $args array with attributes from parser
* @return string compiled code * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
*/ *
public function compile($args, $compiler) * @return string compiled code
{ * @throws \SmartyCompilerException
static $_is_stringy = array('string' => true, 'eval' => true); * @throws \SmartyException
$this->_rdl = preg_quote($compiler->smarty->right_delimiter); */
$this->_ldl = preg_quote($compiler->smarty->left_delimiter); public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
if (!$compiler->smarty->auto_literal) { {
$al = '\s*'; // check and get attributes
} else { $_attr = $this->getAttributes($compiler, $args);
$al = ''; if ($_attr[ 'nocache' ] === true) {
} $compiler->trigger_template_error('nocache option not allowed', $compiler->parser->lex->line - 1);
$filepath = $compiler->template->source->filepath; }
$this->mbstring_overload = ini_get('mbstring.func_overload') & 2; if (strpos($_attr[ 'file' ], '$_tmp') !== false) {
// check and get attributes $compiler->trigger_template_error('illegal value for file attribute', $compiler->parser->lex->line - 1);
$_attr = $this->getAttributes($compiler, $args); }
if ($_attr['nocache'] === true) { // add code to initialize inheritance
$compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno); $this->registerInit($compiler, true);
} $file = trim($_attr[ 'file' ], '\'"');
if (strlen($file) > 8 && substr($file, 0, 8) === 'extends:') {
$_smarty_tpl = $compiler->template; // generate code for each template
$include_file = null; $files = array_reverse(explode('|', substr($file, 8)));
if (strpos($_attr['file'], '$_tmp') !== false) { $i = 0;
$compiler->trigger_template_error('illegal value for file attribute', $compiler->lex->taglineno); foreach ($files as $file) {
} if ($file[ 0 ] === '"') {
eval('$include_file = ' . $_attr['file'] . ';'); $file = trim($file, '".');
// create template object } else {
$_template = new $compiler->smarty->template_class($include_file, $compiler->smarty, $compiler->template); $file = "'{$file}'";
// save file dependency }
if (isset($_is_stringy[$_template->source->type])) { $i++;
$template_sha1 = sha1($include_file); if ($i === count($files) && isset($_attr[ 'extends_resource' ])) {
} else { $this->compileEndChild($compiler);
$template_sha1 = sha1($_template->source->filepath); }
} $this->compileInclude($compiler, $file);
if (isset($compiler->template->properties['file_dependency'][$template_sha1])) { }
$compiler->trigger_template_error("illegal recursive call of \"{$include_file}\"", $compiler->lex->line - 1); if (!isset($_attr[ 'extends_resource' ])) {
} $this->compileEndChild($compiler);
$compiler->template->properties['file_dependency'][$template_sha1] = array($_template->source->filepath, $_template->source->timestamp, $_template->source->type); }
$_content = ($this->mbstring_overload ? mb_substr($compiler->lex->data, $compiler->lex->counter - 1, 20000000, 'latin1') : substr($compiler->lex->data, $compiler->lex->counter - 1)); } else {
if (preg_match_all("!({$this->_ldl}{$al}block\s(.+?)\s*{$this->_rdl})!", $_content, $s) != $this->compileEndChild($compiler, $_attr[ 'file' ]);
preg_match_all("!({$this->_ldl}{$al}/block\s*{$this->_rdl})!", $_content, $c)) { }
$compiler->trigger_template_error('unmatched {block} {/block} pairs'); $compiler->has_code = false;
} return '';
preg_match_all("!{$this->_ldl}{$al}block\s(.+?)\s*{$this->_rdl}|{$this->_ldl}{$al}/block\s*{$this->_rdl}|{$this->_ldl}\*([\S\s]*?)\*{$this->_rdl}!", $_content, $_result, PREG_OFFSET_CAPTURE); }
$_result_count = count($_result[0]);
$_start = 0; /**
while ($_start+1 < $_result_count) { * Add code for inheritance endChild() method to end of template
$_end = 0; *
$_level = 1; * @param \Smarty_Internal_TemplateCompilerBase $compiler
if (($this->mbstring_overload ? mb_substr($_result[0][$_start][0],0,mb_strlen($compiler->smarty->left_delimiter,'latin1')+1, 'latin1') : substr($_result[0][$_start][0],0,strlen($compiler->smarty->left_delimiter)+1)) == $compiler->smarty->left_delimiter.'*') { * @param null|string $template optional inheritance parent template
$_start++; *
continue; * @throws \SmartyCompilerException
} * @throws \SmartyException
while ($_level != 0) { */
$_end++; private function compileEndChild(Smarty_Internal_TemplateCompilerBase $compiler, $template = null)
if (($this->mbstring_overload ? mb_substr($_result[0][$_start + $_end][0],0,mb_strlen($compiler->smarty->left_delimiter,'latin1')+1, 'latin1') : substr($_result[0][$_start + $_end][0],0,strlen($compiler->smarty->left_delimiter)+1)) == $compiler->smarty->left_delimiter.'*') { {
continue; $inlineUids = '';
} if (isset($template) && $compiler->smarty->merge_compiled_includes) {
if (!strpos($_result[0][$_start + $_end][0], '/')) { $code = $compiler->compileTag('include', array($template, array('scope' => 'parent')));
$_level++; if (preg_match('/([,][\s]*[\'][a-z0-9]+[\'][,][\s]*[\']content.*[\'])[)]/', $code, $match)) {
} else { $inlineUids = $match[ 1 ];
$_level--; }
} }
} $compiler->parser->template_postfix[] = new Smarty_Internal_ParseTree_Tag(
$_block_content = str_replace($compiler->smarty->left_delimiter . '$smarty.block.parent' . $compiler->smarty->right_delimiter, '%%%%SMARTY_PARENT%%%%', $compiler->parser,
($this->mbstring_overload ? mb_substr($_content, $_result[0][$_start][1] + mb_strlen($_result[0][$_start][0], 'latin1'), $_result[0][$_start + $_end][1] - $_result[0][$_start][1] - + mb_strlen($_result[0][$_start][0], 'latin1'), 'latin1') : substr($_content, $_result[0][$_start][1] + strlen($_result[0][$_start][0]), $_result[0][$_start + $_end][1] - $_result[0][$_start][1] - + strlen($_result[0][$_start][0])))); '<?php $_smarty_tpl->inheritance->endChild($_smarty_tpl' .
Smarty_Internal_Compile_Block::saveBlockData($_block_content, $_result[0][$_start][0], $compiler->template, $filepath); (isset($template) ?
$_start = $_start + $_end + 1; ", {$template}{$inlineUids}" :
} '') . ");\n?>"
if ($_template->source->type == 'extends') { );
$_template->block_data = $compiler->template->block_data; }
}
$compiler->template->source->content = $_template->source->content; /**
if ($_template->source->type == 'extends') { * Add code for including subtemplate to end of template
$compiler->template->block_data = $_template->block_data; *
foreach ($_template->source->components as $key => $component) { * @param \Smarty_Internal_TemplateCompilerBase $compiler
$compiler->template->properties['file_dependency'][$key] = array($component->filepath, $component->timestamp, $component->type); * @param string $template subtemplate name
} *
} * @throws \SmartyCompilerException
$compiler->template->source->filepath = $_template->source->filepath; * @throws \SmartyException
$compiler->abort_and_recompile = true; */
return ''; private function compileInclude(Smarty_Internal_TemplateCompilerBase $compiler, $template)
} {
$compiler->parser->template_postfix[] = new Smarty_Internal_ParseTree_Tag(
} $compiler->parser,
$compiler->compileTag(
?> 'include',
array(
$template,
array('scope' => 'parent')
)
)
);
}
/**
* Create source code for {extends} from source components array
*
* @param \Smarty_Internal_Template $template
*
* @return string
*/
public static function extendsSourceArrayCode(Smarty_Internal_Template $template)
{
$resources = array();
foreach ($template->source->components as $source) {
$resources[] = $source->resource;
}
return $template->smarty->left_delimiter . 'extends file=\'extends:' . join('|', $resources) .
'\' extends_resource=true' . $template->smarty->right_delimiter;
}
}

View file

@ -1,151 +1,164 @@
<?php <?php
/** /**
* Smarty Internal Plugin Compile For * Smarty Internal Plugin Compile For
* * Compiles the {for} {forelse} {/for} tags
* Compiles the {for} {forelse} {/for} tags *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler * @author Uwe Tews
* @author Uwe Tews */
*/
/**
/** * Smarty Internal Plugin Compile For Class
* Smarty Internal Plugin Compile For Class *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler */
*/ class Smarty_Internal_Compile_For extends Smarty_Internal_CompileBase
class Smarty_Internal_Compile_For extends Smarty_Internal_CompileBase { {
/**
/** * Compiles code for the {for} tag
* Compiles code for the {for} tag * Smarty 3 does implement two different syntax's:
* * - {for $var in $array}
* Smarty 3 does implement two different sytaxes: * For looping over arrays or iterators
* * - {for $x=0; $x<$y; $x++}
* - {for $var in $array} * For general loops
* For looping over arrays or iterators * The parser is generating different sets of attribute by which this compiler can
* * determine which syntax is used.
* - {for $x=0; $x<$y; $x++} *
* For general loops * @param array $args array with attributes from parser
* * @param object $compiler compiler object
* The parser is gereration different sets of attribute by which this compiler can * @param array $parameter array with compilation parameter
* determin which syntax is used. *
* * @return string compiled code
* @param array $args array with attributes from parser */
* @param object $compiler compiler object public function compile($args, $compiler, $parameter)
* @param array $parameter array with compilation parameter {
* @return string compiled code $compiler->loopNesting++;
*/ if ($parameter === 0) {
public function compile($args, $compiler, $parameter) $this->required_attributes = array('start', 'to');
{ $this->optional_attributes = array('max', 'step');
if ($parameter == 0) { } else {
$this->required_attributes = array('start', 'to'); $this->required_attributes = array('start', 'ifexp', 'var', 'step');
$this->optional_attributes = array('max', 'step'); $this->optional_attributes = array();
} else { }
$this->required_attributes = array('start', 'ifexp', 'var', 'step'); $this->mapCache = array();
$this->optional_attributes = array(); // check and get attributes
} $_attr = $this->getAttributes($compiler, $args);
// check and get attributes $output = "<?php\n";
$_attr = $this->getAttributes($compiler, $args); if ($parameter === 1) {
foreach ($_attr[ 'start' ] as $_statement) {
$output = "<?php "; if (is_array($_statement[ 'var' ])) {
if ($parameter == 1) { $var = $_statement[ 'var' ][ 'var' ];
foreach ($_attr['start'] as $_statement) { $index = $_statement[ 'var' ][ 'smarty_internal_index' ];
$output .= " \$_smarty_tpl->tpl_vars[$_statement[var]] = new Smarty_Variable;"; } else {
$output .= " \$_smarty_tpl->tpl_vars[$_statement[var]]->value = $_statement[value];\n"; $var = $_statement[ 'var' ];
} $index = '';
$output .= " if ($_attr[ifexp]){ for (\$_foo=true;$_attr[ifexp]; \$_smarty_tpl->tpl_vars[$_attr[var]]->value$_attr[step]){\n"; }
} else { $output .= "\$_smarty_tpl->tpl_vars[$var] = new Smarty_Variable(null, \$_smarty_tpl->isRenderingCache);\n";
$_statement = $_attr['start']; $output .= "\$_smarty_tpl->tpl_vars[$var]->value{$index} = {$_statement['value']};\n";
$output .= "\$_smarty_tpl->tpl_vars[$_statement[var]] = new Smarty_Variable;"; }
if (isset($_attr['step'])) { if (is_array($_attr[ 'var' ])) {
$output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->step = $_attr[step];"; $var = $_attr[ 'var' ][ 'var' ];
} else { $index = $_attr[ 'var' ][ 'smarty_internal_index' ];
$output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->step = 1;"; } else {
} $var = $_attr[ 'var' ];
if (isset($_attr['max'])) { $index = '';
$output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->total = (int)min(ceil((\$_smarty_tpl->tpl_vars[$_statement[var]]->step > 0 ? $_attr[to]+1 - ($_statement[value]) : $_statement[value]-($_attr[to])+1)/abs(\$_smarty_tpl->tpl_vars[$_statement[var]]->step)),$_attr[max]);\n"; }
} else { $output .= "if ($_attr[ifexp]) {\nfor (\$_foo=true;$_attr[ifexp]; \$_smarty_tpl->tpl_vars[$var]->value{$index}$_attr[step]) {\n";
$output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->total = (int)ceil((\$_smarty_tpl->tpl_vars[$_statement[var]]->step > 0 ? $_attr[to]+1 - ($_statement[value]) : $_statement[value]-($_attr[to])+1)/abs(\$_smarty_tpl->tpl_vars[$_statement[var]]->step));\n"; } else {
} $_statement = $_attr[ 'start' ];
$output .= "if (\$_smarty_tpl->tpl_vars[$_statement[var]]->total > 0){\n"; if (is_array($_statement[ 'var' ])) {
$output .= "for (\$_smarty_tpl->tpl_vars[$_statement[var]]->value = $_statement[value], \$_smarty_tpl->tpl_vars[$_statement[var]]->iteration = 1;\$_smarty_tpl->tpl_vars[$_statement[var]]->iteration <= \$_smarty_tpl->tpl_vars[$_statement[var]]->total;\$_smarty_tpl->tpl_vars[$_statement[var]]->value += \$_smarty_tpl->tpl_vars[$_statement[var]]->step, \$_smarty_tpl->tpl_vars[$_statement[var]]->iteration++){\n"; $var = $_statement[ 'var' ][ 'var' ];
$output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->first = \$_smarty_tpl->tpl_vars[$_statement[var]]->iteration == 1;"; $index = $_statement[ 'var' ][ 'smarty_internal_index' ];
$output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->last = \$_smarty_tpl->tpl_vars[$_statement[var]]->iteration == \$_smarty_tpl->tpl_vars[$_statement[var]]->total;"; } else {
} $var = $_statement[ 'var' ];
$output .= "?>"; $index = '';
}
$this->openTag($compiler, 'for', array('for', $compiler->nocache)); $output .= "\$_smarty_tpl->tpl_vars[$var] = new Smarty_Variable(null, \$_smarty_tpl->isRenderingCache);";
// maybe nocache because of nocache variables if (isset($_attr[ 'step' ])) {
$compiler->nocache = $compiler->nocache | $compiler->tag_nocache; $output .= "\$_smarty_tpl->tpl_vars[$var]->step = $_attr[step];";
// return compiled code } else {
return $output; $output .= "\$_smarty_tpl->tpl_vars[$var]->step = 1;";
} }
if (isset($_attr[ 'max' ])) {
} $output .= "\$_smarty_tpl->tpl_vars[$var]->total = (int) min(ceil((\$_smarty_tpl->tpl_vars[$var]->step > 0 ? $_attr[to]+1 - ($_statement[value]) : $_statement[value]-($_attr[to])+1)/abs(\$_smarty_tpl->tpl_vars[$var]->step)),$_attr[max]);\n";
} else {
/** $output .= "\$_smarty_tpl->tpl_vars[$var]->total = (int) ceil((\$_smarty_tpl->tpl_vars[$var]->step > 0 ? $_attr[to]+1 - ($_statement[value]) : $_statement[value]-($_attr[to])+1)/abs(\$_smarty_tpl->tpl_vars[$var]->step));\n";
* Smarty Internal Plugin Compile Forelse Class }
* $output .= "if (\$_smarty_tpl->tpl_vars[$var]->total > 0) {\n";
* @package Smarty $output .= "for (\$_smarty_tpl->tpl_vars[$var]->value{$index} = $_statement[value], \$_smarty_tpl->tpl_vars[$var]->iteration = 1;\$_smarty_tpl->tpl_vars[$var]->iteration <= \$_smarty_tpl->tpl_vars[$var]->total;\$_smarty_tpl->tpl_vars[$var]->value{$index} += \$_smarty_tpl->tpl_vars[$var]->step, \$_smarty_tpl->tpl_vars[$var]->iteration++) {\n";
* @subpackage Compiler $output .= "\$_smarty_tpl->tpl_vars[$var]->first = \$_smarty_tpl->tpl_vars[$var]->iteration === 1;";
*/ $output .= "\$_smarty_tpl->tpl_vars[$var]->last = \$_smarty_tpl->tpl_vars[$var]->iteration === \$_smarty_tpl->tpl_vars[$var]->total;";
class Smarty_Internal_Compile_Forelse extends Smarty_Internal_CompileBase { }
$output .= '?>';
/** $this->openTag($compiler, 'for', array('for', $compiler->nocache));
* Compiles code for the {forelse} tag // maybe nocache because of nocache variables
* $compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
* @param array $args array with attributes from parser // return compiled code
* @param object $compiler compiler object return $output;
* @param array $parameter array with compilation parameter }
* @return string compiled code }
*/
public function compile($args, $compiler, $parameter) /**
{ * Smarty Internal Plugin Compile Forelse Class
// check and get attributes *
$_attr = $this->getAttributes($compiler, $args); * @package Smarty
* @subpackage Compiler
list($openTag, $nocache) = $this->closeTag($compiler, array('for')); */
$this->openTag($compiler, 'forelse', array('forelse', $nocache)); class Smarty_Internal_Compile_Forelse extends Smarty_Internal_CompileBase
return "<?php }} else { ?>"; {
} /**
* Compiles code for the {forelse} tag
} *
* @param array $args array with attributes from parser
/** * @param object $compiler compiler object
* Smarty Internal Plugin Compile Forclose Class * @param array $parameter array with compilation parameter
* *
* @package Smarty * @return string compiled code
* @subpackage Compiler */
*/ public function compile($args, $compiler, $parameter)
class Smarty_Internal_Compile_Forclose extends Smarty_Internal_CompileBase { {
// check and get attributes
/** $_attr = $this->getAttributes($compiler, $args);
* Compiles code for the {/for} tag list($openTag, $nocache) = $this->closeTag($compiler, array('for'));
* $this->openTag($compiler, 'forelse', array('forelse', $nocache));
* @param array $args array with attributes from parser return "<?php }} else { ?>";
* @param object $compiler compiler object }
* @param array $parameter array with compilation parameter }
* @return string compiled code
*/ /**
public function compile($args, $compiler, $parameter) * Smarty Internal Plugin Compile Forclose Class
{ *
// check and get attributes * @package Smarty
$_attr = $this->getAttributes($compiler, $args); * @subpackage Compiler
// must endblock be nocache? */
if ($compiler->nocache) { class Smarty_Internal_Compile_Forclose extends Smarty_Internal_CompileBase
$compiler->tag_nocache = true; {
} /**
* Compiles code for the {/for} tag
list($openTag, $compiler->nocache) = $this->closeTag($compiler, array('for', 'forelse')); *
* @param array $args array with attributes from parser
if ($openTag == 'forelse') { * @param object $compiler compiler object
return "<?php } ?>"; * @param array $parameter array with compilation parameter
} else { *
return "<?php }} ?>"; * @return string compiled code
} */
} public function compile($args, $compiler, $parameter)
{
} $compiler->loopNesting--;
// check and get attributes
?> $_attr = $this->getAttributes($compiler, $args);
// must endblock be nocache?
if ($compiler->nocache) {
$compiler->tag_nocache = true;
}
list($openTag, $compiler->nocache) = $this->closeTag($compiler, array('for', 'forelse'));
$output = "<?php }\n";
if ($openTag !== 'forelse') {
$output .= "}\n";
}
$output .= "?>";
return $output;
}
}

View file

@ -1,231 +1,343 @@
<?php <?php
/** /**
* Smarty Internal Plugin Compile Foreach * Smarty Internal Plugin Compile Foreach
* * Compiles the {foreach} {foreachelse} {/foreach} tags
* Compiles the {foreach} {foreachelse} {/foreach} tags *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler * @author Uwe Tews
* @author Uwe Tews */
*/
/**
/** * Smarty Internal Plugin Compile Foreach Class
* Smarty Internal Plugin Compile Foreach Class *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler */
*/ class Smarty_Internal_Compile_Foreach extends Smarty_Internal_Compile_Private_ForeachSection
class Smarty_Internal_Compile_Foreach extends Smarty_Internal_CompileBase { {
/** /**
* Attribute definition: Overwrites base class. * Attribute definition: Overwrites base class.
* *
* @var array * @var array
* @see Smarty_Internal_CompileBase * @see Smarty_Internal_CompileBase
*/ */
public $required_attributes = array('from', 'item'); public $required_attributes = array('from', 'item');
/**
* Attribute definition: Overwrites base class. /**
* * Attribute definition: Overwrites base class.
* @var array *
* @see Smarty_Internal_CompileBase * @var array
*/ * @see Smarty_Internal_CompileBase
public $optional_attributes = array('name', 'key'); */
/** public $optional_attributes = array('name', 'key', 'properties');
* Attribute definition: Overwrites base class.
* /**
* @var array * Attribute definition: Overwrites base class.
* @see Smarty_Internal_CompileBase *
*/ * @var array
public $shorttag_order = array('from','item','key','name'); * @see Smarty_Internal_CompileBase
*/
/** public $shorttag_order = array('from', 'item', 'key', 'name');
* Compiles code for the {foreach} tag
* /**
* @param array $args array with attributes from parser * counter
* @param object $compiler compiler object *
* @param array $parameter array with compilation parameter * @var int
* @return string compiled code */
*/ public $counter = 0;
public function compile($args, $compiler, $parameter)
{ /**
$tpl = $compiler->template; * Name of this tag
// check and get attributes *
$_attr = $this->getAttributes($compiler, $args); * @var string
*/
$from = $_attr['from']; public $tagName = 'foreach';
$item = $_attr['item'];
if (!strncmp("\$_smarty_tpl->tpl_vars[$item]", $from, strlen($item) + 24)) { /**
$compiler->trigger_template_error("item variable {$item} may not be the same variable as at 'from'", $compiler->lex->taglineno); * Valid properties of $smarty.foreach.name.xxx variable
} *
* @var array
if (isset($_attr['key'])) { */
$key = $_attr['key']; public $nameProperties = array('first', 'last', 'index', 'iteration', 'show', 'total');
} else {
$key = null; /**
} * Valid properties of $item@xxx variable
*
$this->openTag($compiler, 'foreach', array('foreach', $compiler->nocache, $item, $key)); * @var array
// maybe nocache because of nocache variables */
$compiler->nocache = $compiler->nocache | $compiler->tag_nocache; public $itemProperties = array('first', 'last', 'index', 'iteration', 'show', 'total', 'key');
if (isset($_attr['name'])) { /**
$name = $_attr['name']; * Flag if tag had name attribute
$has_name = true; *
$SmartyVarName = '$smarty.foreach.' . trim($name, '\'"') . '.'; * @var bool
} else { */
$name = null; public $isNamed = false;
$has_name = false;
} /**
$ItemVarName = '$' . trim($item, '\'"') . '@'; * Compiles code for the {foreach} tag
// evaluates which Smarty variables and properties have to be computed *
if ($has_name) { * @param array $args array with attributes from parser
$usesSmartyFirst = strpos($tpl->source->content, $SmartyVarName . 'first') !== false; * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
$usesSmartyLast = strpos($tpl->source->content, $SmartyVarName . 'last') !== false; *
$usesSmartyIndex = strpos($tpl->source->content, $SmartyVarName . 'index') !== false; * @return string compiled code
$usesSmartyIteration = strpos($tpl->source->content, $SmartyVarName . 'iteration') !== false; * @throws \SmartyCompilerException
$usesSmartyShow = strpos($tpl->source->content, $SmartyVarName . 'show') !== false; * @throws \SmartyException
$usesSmartyTotal = strpos($tpl->source->content, $SmartyVarName . 'total') !== false; */
} else { public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
$usesSmartyFirst = false; {
$usesSmartyLast = false; $compiler->loopNesting++;
$usesSmartyTotal = false; // init
$usesSmartyShow = false; $this->isNamed = false;
} // check and get attributes
$_attr = $this->getAttributes($compiler, $args);
$usesPropFirst = $usesSmartyFirst || strpos($tpl->source->content, $ItemVarName . 'first') !== false; $from = $_attr[ 'from' ];
$usesPropLast = $usesSmartyLast || strpos($tpl->source->content, $ItemVarName . 'last') !== false; $item = $compiler->getId($_attr[ 'item' ]);
$usesPropIndex = $usesPropFirst || strpos($tpl->source->content, $ItemVarName . 'index') !== false; if ($item === false) {
$usesPropIteration = $usesPropLast || strpos($tpl->source->content, $ItemVarName . 'iteration') !== false; $item = $compiler->getVariableName($_attr[ 'item' ]);
$usesPropShow = strpos($tpl->source->content, $ItemVarName . 'show') !== false; }
$usesPropTotal = $usesSmartyTotal || $usesSmartyShow || $usesPropShow || $usesPropLast || strpos($tpl->source->content, $ItemVarName . 'total') !== false; $key = $name = null;
// generate output code $attributes = array('item' => $item);
$output = "<?php "; if (isset($_attr[ 'key' ])) {
$output .= " \$_smarty_tpl->tpl_vars[$item] = new Smarty_Variable; \$_smarty_tpl->tpl_vars[$item]->_loop = false;\n"; $key = $compiler->getId($_attr[ 'key' ]);
if ($key != null) { if ($key === false) {
$output .= " \$_smarty_tpl->tpl_vars[$key] = new Smarty_Variable;\n"; $key = $compiler->getVariableName($_attr[ 'key' ]);
} }
$output .= " \$_from = $from; if (!is_array(\$_from) && !is_object(\$_from)) { settype(\$_from, 'array');}\n"; $attributes[ 'key' ] = $key;
if ($usesPropTotal) { }
$output .= " \$_smarty_tpl->tpl_vars[$item]->total= \$_smarty_tpl->_count(\$_from);\n"; if (isset($_attr[ 'name' ])) {
} $this->isNamed = true;
if ($usesPropIteration) { $name = $attributes[ 'name' ] = $compiler->getId($_attr[ 'name' ]);
$output .= " \$_smarty_tpl->tpl_vars[$item]->iteration=0;\n"; }
} foreach ($attributes as $a => $v) {
if ($usesPropIndex) { if ($v === false) {
$output .= " \$_smarty_tpl->tpl_vars[$item]->index=-1;\n"; $compiler->trigger_template_error("'{$a}' attribute/variable has illegal value", null, true);
} }
if ($usesPropShow) { }
$output .= " \$_smarty_tpl->tpl_vars[$item]->show = (\$_smarty_tpl->tpl_vars[$item]->total > 0);\n"; $fromName = $compiler->getVariableName($_attr[ 'from' ]);
} if ($fromName) {
if ($has_name) { foreach (array('item', 'key') as $a) {
if ($usesSmartyTotal) { if (isset($attributes[ $a ]) && $attributes[ $a ] === $fromName) {
$output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['total'] = \$_smarty_tpl->tpl_vars[$item]->total;\n"; $compiler->trigger_template_error(
} "'{$a}' and 'from' may not have same variable name '{$fromName}'",
if ($usesSmartyIteration) { null,
$output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['iteration']=0;\n"; true
} );
if ($usesSmartyIndex) { }
$output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['index']=-1;\n"; }
} }
if ($usesSmartyShow) { $itemVar = "\$_smarty_tpl->tpl_vars['{$item}']";
$output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['show']=(\$_smarty_tpl->tpl_vars[$item]->total > 0);\n"; $local = '$__foreach_' . $attributes[ 'item' ] . '_' . $this->counter++ . '_';
} // search for used tag attributes
} $itemAttr = array();
$output .= "foreach (\$_from as \$_smarty_tpl->tpl_vars[$item]->key => \$_smarty_tpl->tpl_vars[$item]->value){\n\$_smarty_tpl->tpl_vars[$item]->_loop = true;\n"; $namedAttr = array();
if ($key != null) { $this->scanForProperties($attributes, $compiler);
$output .= " \$_smarty_tpl->tpl_vars[$key]->value = \$_smarty_tpl->tpl_vars[$item]->key;\n"; if (!empty($this->matchResults[ 'item' ])) {
} $itemAttr = $this->matchResults[ 'item' ];
if ($usesPropIteration) { }
$output .= " \$_smarty_tpl->tpl_vars[$item]->iteration++;\n"; if (!empty($this->matchResults[ 'named' ])) {
} $namedAttr = $this->matchResults[ 'named' ];
if ($usesPropIndex) { }
$output .= " \$_smarty_tpl->tpl_vars[$item]->index++;\n"; if (isset($_attr[ 'properties' ]) && preg_match_all('/[\'](.*?)[\']/', $_attr[ 'properties' ], $match)) {
} foreach ($match[ 1 ] as $prop) {
if ($usesPropFirst) { if (in_array($prop, $this->itemProperties)) {
$output .= " \$_smarty_tpl->tpl_vars[$item]->first = \$_smarty_tpl->tpl_vars[$item]->index === 0;\n"; $itemAttr[ $prop ] = true;
} } else {
if ($usesPropLast) { $compiler->trigger_template_error("Invalid property '{$prop}'", null, true);
$output .= " \$_smarty_tpl->tpl_vars[$item]->last = \$_smarty_tpl->tpl_vars[$item]->iteration === \$_smarty_tpl->tpl_vars[$item]->total;\n"; }
} }
if ($has_name) { if ($this->isNamed) {
if ($usesSmartyFirst) { foreach ($match[ 1 ] as $prop) {
$output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['first'] = \$_smarty_tpl->tpl_vars[$item]->first;\n"; if (in_array($prop, $this->nameProperties)) {
} $nameAttr[ $prop ] = true;
if ($usesSmartyIteration) { } else {
$output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['iteration']++;\n"; $compiler->trigger_template_error("Invalid property '{$prop}'", null, true);
} }
if ($usesSmartyIndex) { }
$output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['index']++;\n"; }
} }
if ($usesSmartyLast) { if (isset($itemAttr[ 'first' ])) {
$output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['last'] = \$_smarty_tpl->tpl_vars[$item]->last;\n"; $itemAttr[ 'index' ] = true;
} }
} if (isset($namedAttr[ 'first' ])) {
$output .= "?>"; $namedAttr[ 'index' ] = true;
}
return $output; if (isset($namedAttr[ 'last' ])) {
} $namedAttr[ 'iteration' ] = true;
} $namedAttr[ 'total' ] = true;
}
/** if (isset($itemAttr[ 'last' ])) {
* Smarty Internal Plugin Compile Foreachelse Class $itemAttr[ 'iteration' ] = true;
* $itemAttr[ 'total' ] = true;
* @package Smarty }
* @subpackage Compiler if (isset($namedAttr[ 'show' ])) {
*/ $namedAttr[ 'total' ] = true;
class Smarty_Internal_Compile_Foreachelse extends Smarty_Internal_CompileBase { }
if (isset($itemAttr[ 'show' ])) {
/** $itemAttr[ 'total' ] = true;
* Compiles code for the {foreachelse} tag }
* $keyTerm = '';
* @param array $args array with attributes from parser if (isset($attributes[ 'key' ])) {
* @param object $compiler compiler object $keyTerm = "\$_smarty_tpl->tpl_vars['{$key}']->value => ";
* @param array $parameter array with compilation parameter }
* @return string compiled code if (isset($itemAttr[ 'key' ])) {
*/ $keyTerm = "{$itemVar}->key => ";
public function compile($args, $compiler, $parameter) }
{ if ($this->isNamed) {
// check and get attributes $foreachVar = "\$_smarty_tpl->tpl_vars['__smarty_foreach_{$attributes['name']}']";
$_attr = $this->getAttributes($compiler, $args); }
$needTotal = isset($itemAttr[ 'total' ]);
list($openTag, $nocache, $item, $key) = $this->closeTag($compiler, array('foreach')); // Register tag
$this->openTag($compiler, 'foreachelse', array('foreachelse', $nocache, $item, $key)); $this->openTag(
$compiler,
return "<?php }\nif (!\$_smarty_tpl->tpl_vars[$item]->_loop) {\n?>"; 'foreach',
} array('foreach', $compiler->nocache, $local, $itemVar, empty($itemAttr) ? 1 : 2)
);
} // maybe nocache because of nocache variables
$compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
/** // generate output code
* Smarty Internal Plugin Compile Foreachclose Class $output = "<?php\n";
* $output .= "\$_from = \$_smarty_tpl->smarty->ext->_foreach->init(\$_smarty_tpl, $from, " .
* @package Smarty var_export($item, true);
* @subpackage Compiler if ($name || $needTotal || $key) {
*/ $output .= ', ' . var_export($needTotal, true);
class Smarty_Internal_Compile_Foreachclose extends Smarty_Internal_CompileBase { }
if ($name || $key) {
/** $output .= ', ' . var_export($key, true);
* Compiles code for the {/foreach} tag }
* if ($name) {
* @param array $args array with attributes from parser $output .= ', ' . var_export($name, true) . ', ' . var_export($namedAttr, true);
* @param object $compiler compiler object }
* @param array $parameter array with compilation parameter $output .= ");\n";
* @return string compiled code if (isset($itemAttr[ 'show' ])) {
*/ $output .= "{$itemVar}->show = ({$itemVar}->total > 0);\n";
public function compile($args, $compiler, $parameter) }
{ if (isset($itemAttr[ 'iteration' ])) {
// check and get attributes $output .= "{$itemVar}->iteration = 0;\n";
$_attr = $this->getAttributes($compiler, $args); }
// must endblock be nocache? if (isset($itemAttr[ 'index' ])) {
if ($compiler->nocache) { $output .= "{$itemVar}->index = -1;\n";
$compiler->tag_nocache = true; }
} $output .= "{$itemVar}->do_else = true;\n";
$output .= "if (\$_from !== null) foreach (\$_from as {$keyTerm}{$itemVar}->value) {\n";
list($openTag, $compiler->nocache, $item, $key) = $this->closeTag($compiler, array('foreach', 'foreachelse')); $output .= "{$itemVar}->do_else = false;\n";
if (isset($attributes[ 'key' ]) && isset($itemAttr[ 'key' ])) {
return "<?php } ?>"; $output .= "\$_smarty_tpl->tpl_vars['{$key}']->value = {$itemVar}->key;\n";
} }
if (isset($itemAttr[ 'iteration' ])) {
} $output .= "{$itemVar}->iteration++;\n";
}
?> if (isset($itemAttr[ 'index' ])) {
$output .= "{$itemVar}->index++;\n";
}
if (isset($itemAttr[ 'first' ])) {
$output .= "{$itemVar}->first = !{$itemVar}->index;\n";
}
if (isset($itemAttr[ 'last' ])) {
$output .= "{$itemVar}->last = {$itemVar}->iteration === {$itemVar}->total;\n";
}
if (isset($foreachVar)) {
if (isset($namedAttr[ 'iteration' ])) {
$output .= "{$foreachVar}->value['iteration']++;\n";
}
if (isset($namedAttr[ 'index' ])) {
$output .= "{$foreachVar}->value['index']++;\n";
}
if (isset($namedAttr[ 'first' ])) {
$output .= "{$foreachVar}->value['first'] = !{$foreachVar}->value['index'];\n";
}
if (isset($namedAttr[ 'last' ])) {
$output .= "{$foreachVar}->value['last'] = {$foreachVar}->value['iteration'] === {$foreachVar}->value['total'];\n";
}
}
if (!empty($itemAttr)) {
$output .= "{$local}saved = {$itemVar};\n";
}
$output .= '?>';
return $output;
}
/**
* Compiles code for to restore saved template variables
*
* @param int $levels number of levels to restore
*
* @return string compiled code
*/
public function compileRestore($levels)
{
return "\$_smarty_tpl->smarty->ext->_foreach->restore(\$_smarty_tpl, {$levels});";
}
}
/**
* Smarty Internal Plugin Compile Foreachelse Class
*
* @package Smarty
* @subpackage Compiler
*/
class Smarty_Internal_Compile_Foreachelse extends Smarty_Internal_CompileBase
{
/**
* Compiles code for the {foreachelse} tag
*
* @param array $args array with attributes from parser
* @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
*
* @return string compiled code
*/
public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
{
// check and get attributes
$_attr = $this->getAttributes($compiler, $args);
list($openTag, $nocache, $local, $itemVar, $restore) = $this->closeTag($compiler, array('foreach'));
$this->openTag($compiler, 'foreachelse', array('foreachelse', $nocache, $local, $itemVar, 0));
$output = "<?php\n";
if ($restore === 2) {
$output .= "{$itemVar} = {$local}saved;\n";
}
$output .= "}\nif ({$itemVar}->do_else) {\n?>";
return $output;
}
}
/**
* Smarty Internal Plugin Compile Foreachclose Class
*
* @package Smarty
* @subpackage Compiler
*/
class Smarty_Internal_Compile_Foreachclose extends Smarty_Internal_CompileBase
{
/**
* Compiles code for the {/foreach} tag
*
* @param array $args array with attributes from parser
* @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
*
* @return string compiled code
* @throws \SmartyCompilerException
*/
public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
{
$compiler->loopNesting--;
// must endblock be nocache?
if ($compiler->nocache) {
$compiler->tag_nocache = true;
}
list(
$openTag, $compiler->nocache, $local, $itemVar, $restore
) = $this->closeTag($compiler, array('foreach', 'foreachelse'));
$output = "<?php\n";
if ($restore === 2) {
$output .= "{$itemVar} = {$local}saved;\n";
}
$output .= "}\n";
/* @var Smarty_Internal_Compile_Foreach $foreachCompiler */
$foreachCompiler = $compiler->getTagCompiler('foreach');
$output .= $foreachCompiler->compileRestore(1);
$output .= "?>";
return $output;
}
}

View file

@ -1,166 +1,236 @@
<?php <?php
/** /**
* Smarty Internal Plugin Compile Function * Smarty Internal Plugin Compile Function
* * Compiles the {function} {/function} tags
* Compiles the {function} {/function} tags *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler * @author Uwe Tews
* @author Uwe Tews */
*/
/**
/** * Smarty Internal Plugin Compile Function Class
* Smarty Internal Plugin Compile Function Class *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler */
*/ class Smarty_Internal_Compile_Function extends Smarty_Internal_CompileBase
class Smarty_Internal_Compile_Function extends Smarty_Internal_CompileBase { {
/**
/** * Attribute definition: Overwrites base class.
* Attribute definition: Overwrites base class. *
* * @var array
* @var array * @see Smarty_Internal_CompileBase
* @see Smarty_Internal_CompileBase */
*/ public $required_attributes = array('name');
public $required_attributes = array('name');
/** /**
* Attribute definition: Overwrites base class. * Attribute definition: Overwrites base class.
* *
* @var array * @var array
* @see Smarty_Internal_CompileBase * @see Smarty_Internal_CompileBase
*/ */
public $shorttag_order = array('name'); public $shorttag_order = array('name');
/**
* Attribute definition: Overwrites base class. /**
* * Attribute definition: Overwrites base class.
* @var array *
* @see Smarty_Internal_CompileBase * @var array
*/ * @see Smarty_Internal_CompileBase
public $optional_attributes = array('_any'); */
public $optional_attributes = array('_any');
/**
* Compiles code for the {function} tag /**
* * Compiles code for the {function} tag
* @param array $args array with attributes from parser *
* @param object $compiler compiler object * @param array $args array with attributes from parser
* @param array $parameter array with compilation parameter * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
* @return boolean true *
*/ * @return bool true
public function compile($args, $compiler, $parameter) * @throws \SmartyCompilerException
{ */
// check and get attributes public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
$_attr = $this->getAttributes($compiler, $args); {
// check and get attributes
if ($_attr['nocache'] === true) { $_attr = $this->getAttributes($compiler, $args);
$compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno); if ($_attr[ 'nocache' ] === true) {
} $compiler->trigger_template_error('nocache option not allowed', null, true);
unset($_attr['nocache']); }
$save = array($_attr, $compiler->parser->current_buffer, unset($_attr[ 'nocache' ]);
$compiler->template->has_nocache_code, $compiler->template->required_plugins); $_name = trim($_attr[ 'name' ], '\'"');
$this->openTag($compiler, 'function', $save);
$_name = trim($_attr['name'], "'\""); if (!preg_match('/^[a-zA-Z0-9_\x80-\xff]+$/', $_name)) {
unset($_attr['name']); $compiler->trigger_template_error("Function name contains invalid characters: {$_name}", null, true);
// set flag that we are compiling a template function }
$compiler->compiles_template_function = true;
$compiler->template->properties['function'][$_name]['parameter'] = array(); $compiler->parent_compiler->tpl_function[ $_name ] = array();
$_smarty_tpl = $compiler->template; $save = array(
foreach ($_attr as $_key => $_data) { $_attr, $compiler->parser->current_buffer, $compiler->template->compiled->has_nocache_code,
eval ('$tmp='.$_data.';'); $compiler->template->caching
$compiler->template->properties['function'][$_name]['parameter'][$_key] = $tmp; );
} $this->openTag($compiler, 'function', $save);
$compiler->smarty->template_functions[$_name]['parameter'] = $compiler->template->properties['function'][$_name]['parameter']; // Init temporary context
if ($compiler->template->caching) { $compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template();
$output = ''; $compiler->template->compiled->has_nocache_code = false;
} else { $compiler->saveRequiredPlugins(true);
$output = "<?php if (!function_exists('smarty_template_function_{$_name}')) { return true;
function smarty_template_function_{$_name}(\$_smarty_tpl,\$params) { }
\$saved_tpl_vars = \$_smarty_tpl->tpl_vars; }
foreach (\$_smarty_tpl->smarty->template_functions['{$_name}']['parameter'] as \$key => \$value) {\$_smarty_tpl->tpl_vars[\$key] = new Smarty_variable(\$value);};
foreach (\$params as \$key => \$value) {\$_smarty_tpl->tpl_vars[\$key] = new Smarty_variable(\$value);}?>"; /**
} * Smarty Internal Plugin Compile Functionclose Class
// Init temporay context *
$compiler->template->required_plugins = array('compiled' => array(), 'nocache' => array()); * @package Smarty
$compiler->parser->current_buffer = new _smarty_template_buffer($compiler->parser); * @subpackage Compiler
$compiler->parser->current_buffer->append_subtree(new _smarty_tag($compiler->parser, $output)); */
$compiler->template->has_nocache_code = false; class Smarty_Internal_Compile_Functionclose extends Smarty_Internal_CompileBase
$compiler->has_code = false; {
$compiler->template->properties['function'][$_name]['compiled'] = ''; /**
return true; * Compiler object
} *
* @var object
} */
private $compiler = null;
/**
* Smarty Internal Plugin Compile Functionclose Class /**
* * Compiles code for the {/function} tag
* @package Smarty *
* @subpackage Compiler * @param array $args array with attributes from parser
*/ * @param object|\Smarty_Internal_TemplateCompilerBase $compiler compiler object
class Smarty_Internal_Compile_Functionclose extends Smarty_Internal_CompileBase { *
* @return bool true
/** */
* Compiles code for the {/function} tag public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
* {
* @param array $args array with attributes from parser $this->compiler = $compiler;
* @param object $compiler compiler object $saved_data = $this->closeTag($compiler, array('function'));
* @param array $parameter array with compilation parameter $_attr = $saved_data[ 0 ];
* @return boolean true $_name = trim($_attr[ 'name' ], '\'"');
*/ $compiler->parent_compiler->tpl_function[ $_name ][ 'compiled_filepath' ] =
public function compile($args, $compiler, $parameter) $compiler->parent_compiler->template->compiled->filepath;
{ $compiler->parent_compiler->tpl_function[ $_name ][ 'uid' ] = $compiler->template->source->uid;
$_attr = $this->getAttributes($compiler, $args); $_parameter = $_attr;
$saved_data = $this->closeTag($compiler, array('function')); unset($_parameter[ 'name' ]);
$_name = trim($saved_data[0]['name'], "'\""); // default parameter
// build plugin include code $_paramsArray = array();
$plugins_string = ''; foreach ($_parameter as $_key => $_value) {
if (!empty($compiler->template->required_plugins['compiled'])) { if (is_int($_key)) {
$plugins_string = '<?php '; $_paramsArray[] = "$_key=>$_value";
foreach($compiler->template->required_plugins['compiled'] as $tmp) { } else {
foreach($tmp as $data) { $_paramsArray[] = "'$_key'=>$_value";
$plugins_string .= "if (!is_callable('{$data['function']}')) include '{$data['file']}';\n"; }
} }
} if (!empty($_paramsArray)) {
$plugins_string .= '?>'; $_params = 'array(' . implode(',', $_paramsArray) . ')';
} $_paramsCode = "\$params = array_merge($_params, \$params);\n";
if (!empty($compiler->template->required_plugins['nocache'])) { } else {
$plugins_string .= "<?php echo '/*%%SmartyNocache:{$compiler->template->properties['nocache_hash']}%%*/<?php "; $_paramsCode = '';
foreach($compiler->template->required_plugins['nocache'] as $tmp) { }
foreach($tmp as $data) { $_functionCode = $compiler->parser->current_buffer;
$plugins_string .= "if (!is_callable(\'{$data['function']}\')) include \'{$data['file']}\';\n"; // setup buffer for template function code
} $compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template();
} $_funcName = "smarty_template_function_{$_name}_{$compiler->template->compiled->nocache_hash}";
$plugins_string .= "?>/*/%%SmartyNocache:{$compiler->template->properties['nocache_hash']}%%*/';?>\n"; $_funcNameCaching = $_funcName . '_nocache';
} if ($compiler->template->compiled->has_nocache_code) {
// remove last line break from function definition $compiler->parent_compiler->tpl_function[ $_name ][ 'call_name_caching' ] = $_funcNameCaching;
$last = count($compiler->parser->current_buffer->subtrees) - 1; $output = "<?php\n";
if ($compiler->parser->current_buffer->subtrees[$last] instanceof _smarty_linebreak) { $output .= "/* {$_funcNameCaching} */\n";
unset($compiler->parser->current_buffer->subtrees[$last]); $output .= "if (!function_exists('{$_funcNameCaching}')) {\n";
} $output .= "function {$_funcNameCaching} (Smarty_Internal_Template \$_smarty_tpl,\$params) {\n";
// if caching save template function for possible nocache call $output .= "ob_start();\n";
if ($compiler->template->caching) { $output .= $compiler->compileRequiredPlugins();
$compiler->template->properties['function'][$_name]['compiled'] .= $plugins_string $output .= "\$_smarty_tpl->compiled->has_nocache_code = true;\n";
. $compiler->parser->current_buffer->to_smarty_php(); $output .= $_paramsCode;
$compiler->template->properties['function'][$_name]['nocache_hash'] = $compiler->template->properties['nocache_hash']; $output .= "foreach (\$params as \$key => \$value) {\n\$_smarty_tpl->tpl_vars[\$key] = new Smarty_Variable(\$value, \$_smarty_tpl->isRenderingCache);\n}\n";
$compiler->template->properties['function'][$_name]['has_nocache_code'] = $compiler->template->has_nocache_code; $output .= "\$params = var_export(\$params, true);\n";
$compiler->template->properties['function'][$_name]['called_functions'] = $compiler->called_functions; $output .= "echo \"/*%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/<?php ";
$compiler->called_functions = array(); $output .= "\\\$_smarty_tpl->smarty->ext->_tplFunction->saveTemplateVariables(\\\$_smarty_tpl, '{$_name}');\nforeach (\$params as \\\$key => \\\$value) {\n\\\$_smarty_tpl->tpl_vars[\\\$key] = new Smarty_Variable(\\\$value, \\\$_smarty_tpl->isRenderingCache);\n}\n?>";
$compiler->smarty->template_functions[$_name] = $compiler->template->properties['function'][$_name]; $output .= "/*/%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/\";?>";
$compiler->has_code = false; $compiler->parser->current_buffer->append_subtree(
$output = true; $compiler->parser,
} else { new Smarty_Internal_ParseTree_Tag(
$output = $plugins_string . $compiler->parser->current_buffer->to_smarty_php() . "<?php \$_smarty_tpl->tpl_vars = \$saved_tpl_vars; $compiler->parser,
foreach (Smarty::\$global_tpl_vars as \$key => \$value) if(!isset(\$_smarty_tpl->tpl_vars[\$key])) \$_smarty_tpl->tpl_vars[\$key] = \$value;}}?>\n"; $output
} )
// reset flag that we are compiling a template function );
$compiler->compiles_template_function = false; $compiler->parser->current_buffer->append_subtree($compiler->parser, $_functionCode);
// restore old compiler status $output = "<?php echo \"/*%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/<?php ";
$compiler->parser->current_buffer = $saved_data[1]; $output .= "\\\$_smarty_tpl->smarty->ext->_tplFunction->restoreTemplateVariables(\\\$_smarty_tpl, '{$_name}');?>\n";
$compiler->template->has_nocache_code = $compiler->template->has_nocache_code | $saved_data[2]; $output .= "/*/%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/\";\n?>";
$compiler->template->required_plugins = $saved_data[3]; $output .= "<?php echo str_replace('{$compiler->template->compiled->nocache_hash}', \$_smarty_tpl->compiled->nocache_hash, ob_get_clean());\n";
return $output; $output .= "}\n}\n";
} $output .= "/*/ {$_funcName}_nocache */\n\n";
$output .= "?>\n";
} $compiler->parser->current_buffer->append_subtree(
$compiler->parser,
?> new Smarty_Internal_ParseTree_Tag(
$compiler->parser,
$output
)
);
$_functionCode = new Smarty_Internal_ParseTree_Tag(
$compiler->parser,
preg_replace_callback(
"/((<\?php )?echo '\/\*%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%\*\/([\S\s]*?)\/\*\/%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%\*\/';(\?>\n)?)/",
array($this, 'removeNocache'),
$_functionCode->to_smarty_php($compiler->parser)
)
);
}
$compiler->parent_compiler->tpl_function[ $_name ][ 'call_name' ] = $_funcName;
$output = "<?php\n";
$output .= "/* {$_funcName} */\n";
$output .= "if (!function_exists('{$_funcName}')) {\n";
$output .= "function {$_funcName}(Smarty_Internal_Template \$_smarty_tpl,\$params) {\n";
$output .= $_paramsCode;
$output .= "foreach (\$params as \$key => \$value) {\n\$_smarty_tpl->tpl_vars[\$key] = new Smarty_Variable(\$value, \$_smarty_tpl->isRenderingCache);\n}\n";
$output .= $compiler->compileCheckPlugins(array_merge($compiler->required_plugins[ 'compiled' ],
$compiler->required_plugins[ 'nocache' ]));
$output .= "?>\n";
$compiler->parser->current_buffer->append_subtree(
$compiler->parser,
new Smarty_Internal_ParseTree_Tag(
$compiler->parser,
$output
)
);
$compiler->parser->current_buffer->append_subtree($compiler->parser, $_functionCode);
$output = "<?php\n}}\n";
$output .= "/*/ {$_funcName} */\n\n";
$output .= "?>\n";
$compiler->parser->current_buffer->append_subtree(
$compiler->parser,
new Smarty_Internal_ParseTree_Tag(
$compiler->parser,
$output
)
);
$compiler->parent_compiler->blockOrFunctionCode .= $compiler->parser->current_buffer->to_smarty_php($compiler->parser);
// restore old buffer
$compiler->parser->current_buffer = $saved_data[ 1 ];
// restore old status
$compiler->restoreRequiredPlugins();
$compiler->template->compiled->has_nocache_code = $saved_data[ 2 ];
$compiler->template->caching = $saved_data[ 3 ];
return true;
}
/**
* Remove nocache code
*
* @param $match
*
* @return string
*/
public function removeNocache($match)
{
$code =
preg_replace(
"/((<\?php )?echo '\/\*%%SmartyNocache:{$this->compiler->template->compiled->nocache_hash}%%\*\/)|(\/\*\/%%SmartyNocache:{$this->compiler->template->compiled->nocache_hash}%%\*\/';(\?>\n)?)/",
'',
$match[ 0 ]
);
$code = str_replace(array('\\\'', '\\\\\''), array('\'', '\\\''), $code);
return $code;
}
}

View file

@ -1,207 +1,207 @@
<?php <?php
/** /**
* Smarty Internal Plugin Compile If * Smarty Internal Plugin Compile If
* * Compiles the {if} {else} {elseif} {/if} tags
* Compiles the {if} {else} {elseif} {/if} tags *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler * @author Uwe Tews
* @author Uwe Tews */
*/
/**
/** * Smarty Internal Plugin Compile If Class
* Smarty Internal Plugin Compile If Class *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler */
*/ class Smarty_Internal_Compile_If extends Smarty_Internal_CompileBase
class Smarty_Internal_Compile_If extends Smarty_Internal_CompileBase { {
/**
/** * Compiles code for the {if} tag
* Compiles code for the {if} tag *
* * @param array $args array with attributes from parser
* @param array $args array with attributes from parser * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
* @param object $compiler compiler object * @param array $parameter array with compilation parameter
* @param array $parameter array with compilation parameter *
* @return string compiled code * @return string compiled code
*/ * @throws \SmartyCompilerException
public function compile($args, $compiler, $parameter) */
{ public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
// check and get attributes {
$_attr = $this->getAttributes($compiler, $args); // check and get attributes
$this->openTag($compiler, 'if', array(1, $compiler->nocache)); $_attr = $this->getAttributes($compiler, $args);
// must whole block be nocache ? $this->openTag($compiler, 'if', array(1, $compiler->nocache));
$compiler->nocache = $compiler->nocache | $compiler->tag_nocache; // must whole block be nocache ?
$compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
if (!array_key_exists("if condition",$parameter)) { if (!isset($parameter[ 'if condition' ])) {
$compiler->trigger_template_error("missing if condition", $compiler->lex->taglineno); $compiler->trigger_template_error('missing if condition', null, true);
} }
if (is_array($parameter[ 'if condition' ])) {
if (is_array($parameter['if condition'])) { if (is_array($parameter[ 'if condition' ][ 'var' ])) {
if ($compiler->nocache) { $var = $parameter[ 'if condition' ][ 'var' ][ 'var' ];
$_nocache = ',true'; } else {
// create nocache var to make it know for further compiling $var = $parameter[ 'if condition' ][ 'var' ];
if (is_array($parameter['if condition']['var'])) { }
$compiler->template->tpl_vars[trim($parameter['if condition']['var']['var'], "'")] = new Smarty_variable(null, true); if ($compiler->nocache) {
} else { // create nocache var to make it know for further compiling
$compiler->template->tpl_vars[trim($parameter['if condition']['var'], "'")] = new Smarty_variable(null, true); $compiler->setNocacheInVariable($var);
} }
} else { $prefixVar = $compiler->getNewPrefixVariable();
$_nocache = ''; $_output = "<?php {$prefixVar} = {$parameter[ 'if condition' ][ 'value' ]};?>\n";
} $assignAttr = array();
if (is_array($parameter['if condition']['var'])) { $assignAttr[][ 'value' ] = $prefixVar;
$_output = "<?php if (!isset(\$_smarty_tpl->tpl_vars[".$parameter['if condition']['var']['var']."]) || !is_array(\$_smarty_tpl->tpl_vars[".$parameter['if condition']['var']['var']."]->value)) \$_smarty_tpl->createLocalArrayVariable(".$parameter['if condition']['var']['var']."$_nocache);\n"; $assignCompiler = new Smarty_Internal_Compile_Assign();
$_output .= "if (\$_smarty_tpl->tpl_vars[".$parameter['if condition']['var']['var']."]->value".$parameter['if condition']['var']['smarty_internal_index']." = ".$parameter['if condition']['value']."){?>"; if (is_array($parameter[ 'if condition' ][ 'var' ])) {
} else { $assignAttr[][ 'var' ] = $parameter[ 'if condition' ][ 'var' ][ 'var' ];
$_output = "<?php if (!isset(\$_smarty_tpl->tpl_vars[".$parameter['if condition']['var']."])) \$_smarty_tpl->tpl_vars[".$parameter['if condition']['var']."] = new Smarty_Variable(null{$_nocache});"; $_output .= $assignCompiler->compile(
$_output .= "if (\$_smarty_tpl->tpl_vars[".$parameter['if condition']['var']."]->value = ".$parameter['if condition']['value']."){?>"; $assignAttr,
} $compiler,
return $_output; array('smarty_internal_index' => $parameter[ 'if condition' ][ 'var' ][ 'smarty_internal_index' ])
} else { );
return "<?php if ({$parameter['if condition']}){?>"; } else {
} $assignAttr[][ 'var' ] = $parameter[ 'if condition' ][ 'var' ];
} $_output .= $assignCompiler->compile($assignAttr, $compiler, array());
}
} $_output .= "<?php if ({$prefixVar}) {?>";
return $_output;
/** } else {
* Smarty Internal Plugin Compile Else Class return "<?php if ({$parameter['if condition']}) {?>";
* }
* @package Smarty }
* @subpackage Compiler }
*/
class Smarty_Internal_Compile_Else extends Smarty_Internal_CompileBase { /**
* Smarty Internal Plugin Compile Else Class
/** *
* Compiles code for the {else} tag * @package Smarty
* * @subpackage Compiler
* @param array $args array with attributes from parser */
* @param object $compiler compiler object class Smarty_Internal_Compile_Else extends Smarty_Internal_CompileBase
* @param array $parameter array with compilation parameter {
* @return string compiled code /**
*/ * Compiles code for the {else} tag
public function compile($args, $compiler, $parameter) *
{ * @param array $args array with attributes from parser
list($nesting, $compiler->tag_nocache) = $this->closeTag($compiler, array('if', 'elseif')); * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
$this->openTag($compiler, 'else', array($nesting, $compiler->tag_nocache)); *
* @return string compiled code
return "<?php }else{ ?>"; */
} public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
{
} list($nesting, $compiler->tag_nocache) = $this->closeTag($compiler, array('if', 'elseif'));
$this->openTag($compiler, 'else', array($nesting, $compiler->tag_nocache));
/** return '<?php } else { ?>';
* Smarty Internal Plugin Compile ElseIf Class }
* }
* @package Smarty
* @subpackage Compiler /**
*/ * Smarty Internal Plugin Compile ElseIf Class
class Smarty_Internal_Compile_Elseif extends Smarty_Internal_CompileBase { *
* @package Smarty
/** * @subpackage Compiler
* Compiles code for the {elseif} tag */
* class Smarty_Internal_Compile_Elseif extends Smarty_Internal_CompileBase
* @param array $args array with attributes from parser {
* @param object $compiler compiler object /**
* @param array $parameter array with compilation parameter * Compiles code for the {elseif} tag
* @return string compiled code *
*/ * @param array $args array with attributes from parser
public function compile($args, $compiler, $parameter) * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
{ * @param array $parameter array with compilation parameter
// check and get attributes *
$_attr = $this->getAttributes($compiler, $args); * @return string compiled code
* @throws \SmartyCompilerException
list($nesting, $compiler->tag_nocache) = $this->closeTag($compiler, array('if', 'elseif')); */
public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
if (!array_key_exists("if condition",$parameter)) { {
$compiler->trigger_template_error("missing elseif condition", $compiler->lex->taglineno); // check and get attributes
} $_attr = $this->getAttributes($compiler, $args);
list($nesting, $compiler->tag_nocache) = $this->closeTag($compiler, array('if', 'elseif'));
if (is_array($parameter['if condition'])) { if (!isset($parameter[ 'if condition' ])) {
$condition_by_assign = true; $compiler->trigger_template_error('missing elseif condition', null, true);
if ($compiler->nocache) { }
$_nocache = ',true'; $assignCode = '';
// create nocache var to make it know for further compiling $var = '';
if (is_array($parameter['if condition']['var'])) { if (is_array($parameter[ 'if condition' ])) {
$compiler->template->tpl_vars[trim($parameter['if condition']['var']['var'], "'")] = new Smarty_variable(null, true); $condition_by_assign = true;
} else { if (is_array($parameter[ 'if condition' ][ 'var' ])) {
$compiler->template->tpl_vars[trim($parameter['if condition']['var'], "'")] = new Smarty_variable(null, true); $var = $parameter[ 'if condition' ][ 'var' ][ 'var' ];
} } else {
} else { $var = $parameter[ 'if condition' ][ 'var' ];
$_nocache = ''; }
} if ($compiler->nocache) {
} else { // create nocache var to make it know for further compiling
$condition_by_assign = false; $compiler->setNocacheInVariable($var);
} }
$prefixVar = $compiler->getNewPrefixVariable();
if (empty($compiler->prefix_code)) { $assignCode = "<?php {$prefixVar} = {$parameter[ 'if condition' ][ 'value' ]};?>\n";
if ($condition_by_assign) { $assignCompiler = new Smarty_Internal_Compile_Assign();
$this->openTag($compiler, 'elseif', array($nesting + 1, $compiler->tag_nocache)); $assignAttr = array();
if (is_array($parameter['if condition']['var'])) { $assignAttr[][ 'value' ] = $prefixVar;
$_output = "<?php }else{ if (!isset(\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var']['var'] . "]) || !is_array(\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var']['var'] . "]->value)) \$_smarty_tpl->createLocalArrayVariable(" . $parameter['if condition']['var']['var'] . "$_nocache);\n"; if (is_array($parameter[ 'if condition' ][ 'var' ])) {
$_output .= "if (\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var']['var'] . "]->value" . $parameter['if condition']['var']['smarty_internal_index'] . " = " . $parameter['if condition']['value'] . "){?>"; $assignAttr[][ 'var' ] = $parameter[ 'if condition' ][ 'var' ][ 'var' ];
} else { $assignCode .= $assignCompiler->compile(
$_output = "<?php }else{ if (!isset(\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var'] . "])) \$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var'] . "] = new Smarty_Variable(null{$_nocache});"; $assignAttr,
$_output .= "if (\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var'] . "]->value = " . $parameter['if condition']['value'] . "){?>"; $compiler,
} array('smarty_internal_index' => $parameter[ 'if condition' ][ 'var' ][ 'smarty_internal_index' ])
return $_output; );
} else { } else {
$this->openTag($compiler, 'elseif', array($nesting, $compiler->tag_nocache)); $assignAttr[][ 'var' ] = $parameter[ 'if condition' ][ 'var' ];
return "<?php }elseif({$parameter['if condition']}){?>"; $assignCode .= $assignCompiler->compile($assignAttr, $compiler, array());
} }
} else { } else {
$tmp = ''; $condition_by_assign = false;
foreach ($compiler->prefix_code as $code) }
$tmp .= $code; $prefixCode = $compiler->getPrefixCode();
$compiler->prefix_code = array(); if (empty($prefixCode)) {
$this->openTag($compiler, 'elseif', array($nesting + 1, $compiler->tag_nocache)); if ($condition_by_assign) {
if ($condition_by_assign) { $this->openTag($compiler, 'elseif', array($nesting + 1, $compiler->tag_nocache));
if (is_array($parameter['if condition']['var'])) { $_output = $compiler->appendCode("<?php } else {\n?>", $assignCode);
$_output = "<?php }else{?>{$tmp}<?php if (!isset(\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var']['var'] . "]) || !is_array(\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var']['var'] . "]->value)) \$_smarty_tpl->createLocalArrayVariable(" . $parameter['if condition']['var']['var'] . "$_nocache);\n"; return $compiler->appendCode($_output, "<?php if ({$prefixVar}) {?>");
$_output .= "if (\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var']['var'] . "]->value" . $parameter['if condition']['var']['smarty_internal_index'] . " = " . $parameter['if condition']['value'] . "){?>"; } else {
} else { $this->openTag($compiler, 'elseif', array($nesting, $compiler->tag_nocache));
$_output = "<?php }else{?>{$tmp}<?php if (!isset(\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var'] . "])) \$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var'] . "] = new Smarty_Variable(null{$_nocache});"; return "<?php } elseif ({$parameter['if condition']}) {?>";
$_output .= "if (\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var'] . "]->value = " . $parameter['if condition']['value'] . "){?>"; }
} } else {
return $_output; $_output = $compiler->appendCode("<?php } else {\n?>", $prefixCode);
} else { $this->openTag($compiler, 'elseif', array($nesting + 1, $compiler->tag_nocache));
return "<?php }else{?>{$tmp}<?php if ({$parameter['if condition']}){?>"; if ($condition_by_assign) {
} $_output = $compiler->appendCode($_output, $assignCode);
} return $compiler->appendCode($_output, "<?php if ({$prefixVar}) {?>");
} } else {
return $compiler->appendCode($_output, "<?php if ({$parameter['if condition']}) {?>");
} }
}
/** }
* Smarty Internal Plugin Compile Ifclose Class }
*
* @package Smarty /**
* @subpackage Compiler * Smarty Internal Plugin Compile Ifclose Class
*/ *
class Smarty_Internal_Compile_Ifclose extends Smarty_Internal_CompileBase { * @package Smarty
* @subpackage Compiler
/** */
* Compiles code for the {/if} tag class Smarty_Internal_Compile_Ifclose extends Smarty_Internal_CompileBase
* {
* @param array $args array with attributes from parser /**
* @param object $compiler compiler object * Compiles code for the {/if} tag
* @param array $parameter array with compilation parameter *
* @return string compiled code * @param array $args array with attributes from parser
*/ * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
public function compile($args, $compiler, $parameter) *
{ * @return string compiled code
// must endblock be nocache? */
if ($compiler->nocache) { public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
$compiler->tag_nocache = true; {
} // must endblock be nocache?
list($nesting, $compiler->nocache) = $this->closeTag($compiler, array('if', 'else', 'elseif')); if ($compiler->nocache) {
$tmp = ''; $compiler->tag_nocache = true;
for ($i = 0; $i < $nesting; $i++) { }
$tmp .= '}'; list($nesting, $compiler->nocache) = $this->closeTag($compiler, array('if', 'else', 'elseif'));
} $tmp = '';
return "<?php {$tmp}?>"; for ($i = 0; $i < $nesting; $i++) {
} $tmp .= '}';
}
} return "<?php {$tmp}?>";
}
?> }

View file

@ -1,215 +1,347 @@
<?php <?php
/** /**
* Smarty Internal Plugin Compile Include * Smarty Internal Plugin Compile Include
* * Compiles the {include} tag
* Compiles the {include} tag *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler * @author Uwe Tews
* @author Uwe Tews */
*/
/**
/** * Smarty Internal Plugin Compile Include Class
* Smarty Internal Plugin Compile Include Class *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler */
*/ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase { {
/**
/** * caching mode to create nocache code but no cache file
* caching mode to create nocache code but no cache file */
*/ const CACHING_NOCACHE_CODE = 9999;
const CACHING_NOCACHE_CODE = 9999;
/** /**
* Attribute definition: Overwrites base class. * Attribute definition: Overwrites base class.
* *
* @var array * @var array
* @see Smarty_Internal_CompileBase * @see Smarty_Internal_CompileBase
*/ */
public $required_attributes = array('file'); public $required_attributes = array('file');
/**
* Attribute definition: Overwrites base class. /**
* * Attribute definition: Overwrites base class.
* @var array *
* @see Smarty_Internal_CompileBase * @var array
*/ * @see Smarty_Internal_CompileBase
public $shorttag_order = array('file'); */
/** public $shorttag_order = array('file');
* Attribute definition: Overwrites base class.
* /**
* @var array * Attribute definition: Overwrites base class.
* @see Smarty_Internal_CompileBase *
*/ * @var array
public $option_flags = array('nocache', 'inline', 'caching'); * @see Smarty_Internal_CompileBase
/** */
* Attribute definition: Overwrites base class. public $option_flags = array('nocache', 'inline', 'caching');
*
* @var array /**
* @see Smarty_Internal_CompileBase * Attribute definition: Overwrites base class.
*/ *
public $optional_attributes = array('_any'); * @var array
* @see Smarty_Internal_CompileBase
/** */
* Compiles code for the {include} tag public $optional_attributes = array('_any');
*
* @param array $args array with attributes from parser /**
* @param object $compiler compiler object * Valid scope names
* @param array $parameter array with compilation parameter *
* @return string compiled code * @var array
*/ */
public function compile($args, $compiler, $parameter) public $valid_scopes = array(
{ 'parent' => Smarty::SCOPE_PARENT, 'root' => Smarty::SCOPE_ROOT,
// check and get attributes 'global' => Smarty::SCOPE_GLOBAL, 'tpl_root' => Smarty::SCOPE_TPL_ROOT,
$_attr = $this->getAttributes($compiler, $args); 'smarty' => Smarty::SCOPE_SMARTY
// save posible attributes );
$include_file = $_attr['file'];
/**
if (isset($_attr['assign'])) { * Compiles code for the {include} tag
// output will be stored in a smarty variable instead of beind displayed *
$_assign = $_attr['assign']; * @param array $args array with attributes from parser
} * @param Smarty_Internal_SmartyTemplateCompiler $compiler compiler object
*
$_parent_scope = Smarty::SCOPE_LOCAL; * @return string
if (isset($_attr['scope'])) { * @throws \Exception
$_attr['scope'] = trim($_attr['scope'], "'\""); * @throws \SmartyCompilerException
if ($_attr['scope'] == 'parent') { * @throws \SmartyException
$_parent_scope = Smarty::SCOPE_PARENT; */
} elseif ($_attr['scope'] == 'root') { public function compile($args, Smarty_Internal_SmartyTemplateCompiler $compiler)
$_parent_scope = Smarty::SCOPE_ROOT; {
} elseif ($_attr['scope'] == 'global') { $uid = $t_hash = null;
$_parent_scope = Smarty::SCOPE_GLOBAL; // check and get attributes
} $_attr = $this->getAttributes($compiler, $args);
} $fullResourceName = $source_resource = $_attr[ 'file' ];
$_caching = 'null'; $variable_template = false;
if ($compiler->nocache || $compiler->tag_nocache) { $cache_tpl = false;
$_caching = Smarty::CACHING_OFF; // parse resource_name
} if (preg_match('/^([\'"])(([A-Za-z0-9_\-]{2,})[:])?(([^$()]+)|(.+))\1$/', $source_resource, $match)) {
// default for included templates $type = !empty($match[ 3 ]) ? $match[ 3 ] : $compiler->template->smarty->default_resource_type;
if ($compiler->template->caching && !$compiler->nocache && !$compiler->tag_nocache) { $name = !empty($match[ 5 ]) ? $match[ 5 ] : $match[ 6 ];
$_caching = self::CACHING_NOCACHE_CODE; $handler = Smarty_Resource::load($compiler->smarty, $type);
} if ($handler->recompiled || $handler->uncompiled) {
/* $variable_template = true;
* if the {include} tag provides individual parameter for caching }
* it will not be included into the common cache file and treated like if (!$variable_template) {
* a nocache section if ($type !== 'string') {
*/ $fullResourceName = "{$type}:{$name}";
if (isset($_attr['cache_lifetime'])) { $compiled = $compiler->parent_compiler->template->compiled;
$_cache_lifetime = $_attr['cache_lifetime']; if (isset($compiled->includes[ $fullResourceName ])) {
$compiler->tag_nocache = true; $compiled->includes[ $fullResourceName ]++;
$_caching = Smarty::CACHING_LIFETIME_CURRENT; $cache_tpl = true;
} else { } else {
$_cache_lifetime = 'null'; if ("{$compiler->template->source->type}:{$compiler->template->source->name}" ==
} $fullResourceName
if (isset($_attr['cache_id'])) { ) {
$_cache_id = $_attr['cache_id']; // recursive call of current template
$compiler->tag_nocache = true; $compiled->includes[ $fullResourceName ] = 2;
$_caching = Smarty::CACHING_LIFETIME_CURRENT; $cache_tpl = true;
} else { } else {
$_cache_id = '$_smarty_tpl->cache_id'; $compiled->includes[ $fullResourceName ] = 1;
} }
if (isset($_attr['compile_id'])) { }
$_compile_id = $_attr['compile_id']; $fullResourceName = $match[ 1 ] . $fullResourceName . $match[ 1 ];
} else { }
$_compile_id = '$_smarty_tpl->compile_id'; }
} if (empty($match[ 5 ])) {
if ($_attr['caching'] === true) { $variable_template = true;
$_caching = Smarty::CACHING_LIFETIME_CURRENT; }
} } else {
if ($_attr['nocache'] === true) { $variable_template = true;
$compiler->tag_nocache = true; }
$_caching = Smarty::CACHING_OFF; // scope setup
} $_scope = $compiler->convertScope($_attr, $this->valid_scopes);
// set flag to cache subtemplate object when called within loop or template name is variable.
$has_compiled_template = false; if ($cache_tpl || $variable_template || $compiler->loopNesting > 0) {
if (($compiler->smarty->merge_compiled_includes || $_attr['inline'] === true) && !$compiler->template->source->recompiled $_cache_tpl = 'true';
&& !($compiler->template->caching && ($compiler->tag_nocache || $compiler->nocache)) && $_caching != Smarty::CACHING_LIFETIME_CURRENT) { } else {
// check if compiled code can be merged (contains no variable part) $_cache_tpl = 'false';
if (!$compiler->has_variable_string && (substr_count($include_file, '"') == 2 or substr_count($include_file, "'") == 2) }
and substr_count($include_file, '(') == 0 and substr_count($include_file, '$_smarty_tpl->') == 0) { // assume caching is off
$tpl_name = null; $_caching = Smarty::CACHING_OFF;
eval("\$tpl_name = $include_file;"); $call_nocache = $compiler->tag_nocache || $compiler->nocache;
if (!isset($compiler->smarty->merged_templates_func[$tpl_name]) || $compiler->inheritance) { // caching was on and {include} is not in nocache mode
$tpl = new $compiler->smarty->template_class ($tpl_name, $compiler->smarty, $compiler->template, $compiler->template->cache_id, $compiler->template->compile_id); if ($compiler->template->caching && !$compiler->nocache && !$compiler->tag_nocache) {
// save unique function name $_caching = self::CACHING_NOCACHE_CODE;
$compiler->smarty->merged_templates_func[$tpl_name]['func'] = $tpl->properties['unifunc'] = 'content_'. str_replace('.', '_', uniqid('', true)); }
// use current nocache hash for inlined code // flag if included template code should be merged into caller
$compiler->smarty->merged_templates_func[$tpl_name]['nocache_hash'] = $tpl->properties['nocache_hash'] = $compiler->template->properties['nocache_hash']; $merge_compiled_includes = ($compiler->smarty->merge_compiled_includes || $_attr[ 'inline' ] === true) &&
if ($compiler->template->caching) { !$compiler->template->source->handler->recompiled;
// needs code for cached page but no cache file if ($merge_compiled_includes) {
$tpl->caching = self::CACHING_NOCACHE_CODE; // variable template name ?
} if ($variable_template) {
// make sure whole chain gest compiled $merge_compiled_includes = false;
$tpl->mustCompile = true; }
if (!($tpl->source->uncompiled) && $tpl->source->exists) { // variable compile_id?
// get compiled code if (isset($_attr[ 'compile_id' ]) && $compiler->isVariable($_attr[ 'compile_id' ])) {
$compiled_code = $tpl->compiler->compileTemplate($tpl); $merge_compiled_includes = false;
// release compiler object to free memory }
unset($tpl->compiler); }
// merge compiled code for {function} tags /*
$compiler->template->properties['function'] = array_merge($compiler->template->properties['function'], $tpl->properties['function']); * if the {include} tag provides individual parameter for caching or compile_id
// merge filedependency * the subtemplate must not be included into the common cache file and is treated like
$tpl->properties['file_dependency'][$tpl->source->uid] = array($tpl->source->filepath, $tpl->source->timestamp,$tpl->source->type); * a call in nocache mode.
$compiler->template->properties['file_dependency'] = array_merge($compiler->template->properties['file_dependency'], $tpl->properties['file_dependency']); *
// remove header code */
$compiled_code = preg_replace("/(<\?php \/\*%%SmartyHeaderCode:{$tpl->properties['nocache_hash']}%%\*\/(.+?)\/\*\/%%SmartyHeaderCode%%\*\/\?>\n)/s", '', $compiled_code); if ($_attr[ 'nocache' ] !== true && $_attr[ 'caching' ]) {
if ($tpl->has_nocache_code) { $_caching = $_new_caching = (int)$_attr[ 'caching' ];
// replace nocache_hash $call_nocache = true;
$compiled_code = str_replace("{$tpl->properties['nocache_hash']}", $compiler->template->properties['nocache_hash'], $compiled_code); } else {
$compiler->template->has_nocache_code = true; $_new_caching = Smarty::CACHING_LIFETIME_CURRENT;
} }
$compiler->merged_templates[$tpl->properties['unifunc']] = $compiled_code; if (isset($_attr[ 'cache_lifetime' ])) {
$has_compiled_template = true; $_cache_lifetime = $_attr[ 'cache_lifetime' ];
} $call_nocache = true;
} else { $_caching = $_new_caching;
$has_compiled_template = true; } else {
} $_cache_lifetime = '$_smarty_tpl->cache_lifetime';
} }
} if (isset($_attr[ 'cache_id' ])) {
// delete {include} standard attributes $_cache_id = $_attr[ 'cache_id' ];
unset($_attr['file'], $_attr['assign'], $_attr['cache_id'], $_attr['compile_id'], $_attr['cache_lifetime'], $_attr['nocache'], $_attr['caching'], $_attr['scope'], $_attr['inline']); $call_nocache = true;
// remaining attributes must be assigned as smarty variable $_caching = $_new_caching;
if (!empty($_attr)) { } else {
if ($_parent_scope == Smarty::SCOPE_LOCAL) { $_cache_id = '$_smarty_tpl->cache_id';
// create variables }
foreach ($_attr as $key => $value) { if (isset($_attr[ 'compile_id' ])) {
$_pairs[] = "'$key'=>$value"; $_compile_id = $_attr[ 'compile_id' ];
} } else {
$_vars = 'array('.join(',',$_pairs).')'; $_compile_id = '$_smarty_tpl->compile_id';
$_has_vars = true; }
} else { // if subtemplate will be called in nocache mode do not merge
$compiler->trigger_template_error('variable passing not allowed in parent/global scope', $compiler->lex->taglineno); if ($compiler->template->caching && $call_nocache) {
} $merge_compiled_includes = false;
} else { }
$_vars = 'array()'; // assign attribute
$_has_vars = false; if (isset($_attr[ 'assign' ])) {
} // output will be stored in a smarty variable instead of being displayed
if ($has_compiled_template) { if ($_assign = $compiler->getId($_attr[ 'assign' ])) {
$_hash = $compiler->smarty->merged_templates_func[$tpl_name]['nocache_hash']; $_assign = "'{$_assign}'";
$_output = "<?php /* Call merged included template \"" . $tpl_name . "\" */\n"; if ($compiler->tag_nocache || $compiler->nocache || $call_nocache) {
$_output .= "\$_tpl_stack[] = \$_smarty_tpl;\n"; // create nocache var to make it know for further compiling
$_output .= " \$_smarty_tpl = \$_smarty_tpl->setupInlineSubTemplate($include_file, $_cache_id, $_compile_id, $_caching, $_cache_lifetime, $_vars, $_parent_scope, '$_hash');\n"; $compiler->setNocacheInVariable($_attr[ 'assign' ]);
if (isset($_assign)) { }
$_output .= 'ob_start(); '; } else {
} $_assign = $_attr[ 'assign' ];
$_output .= $compiler->smarty->merged_templates_func[$tpl_name]['func']. "(\$_smarty_tpl);\n"; }
$_output .= "\$_smarty_tpl = array_pop(\$_tpl_stack); "; }
if (isset($_assign)) { $has_compiled_template = false;
$_output .= " \$_smarty_tpl->tpl_vars[$_assign] = new Smarty_variable(ob_get_clean());"; if ($merge_compiled_includes) {
} $c_id = isset($_attr[ 'compile_id' ]) ? $_attr[ 'compile_id' ] : $compiler->template->compile_id;
$_output .= "/* End of included template \"" . $tpl_name . "\" */?>"; // we must observe different compile_id and caching
return $_output; $t_hash = sha1($c_id . ($_caching ? '--caching' : '--nocaching'));
} $compiler->smarty->allow_ambiguous_resources = true;
/* @var Smarty_Internal_Template $tpl */
// was there an assign attribute $tpl = new $compiler->smarty->template_class(
if (isset($_assign)) { trim($fullResourceName, '"\''),
$_output = "<?php \$_smarty_tpl->tpl_vars[$_assign] = new Smarty_variable(\$_smarty_tpl->getSubTemplate ($include_file, $_cache_id, $_compile_id, $_caching, $_cache_lifetime, $_vars, $_parent_scope));?>\n";; $compiler->smarty,
} else { $compiler->template,
$_output = "<?php echo \$_smarty_tpl->getSubTemplate ($include_file, $_cache_id, $_compile_id, $_caching, $_cache_lifetime, $_vars, $_parent_scope);?>\n"; $compiler->template->cache_id,
} $c_id,
return $_output; $_caching
} );
$uid = $tpl->source->type . $tpl->source->uid;
} if (!isset($compiler->parent_compiler->mergedSubTemplatesData[ $uid ][ $t_hash ])) {
$has_compiled_template = $this->compileInlineTemplate($compiler, $tpl, $t_hash);
?> } else {
$has_compiled_template = true;
}
unset($tpl);
}
// delete {include} standard attributes
unset($_attr[ 'file' ], $_attr[ 'assign' ], $_attr[ 'cache_id' ], $_attr[ 'compile_id' ], $_attr[ 'cache_lifetime' ], $_attr[ 'nocache' ], $_attr[ 'caching' ], $_attr[ 'scope' ], $_attr[ 'inline' ]);
// remaining attributes must be assigned as smarty variable
$_vars = 'array()';
if (!empty($_attr)) {
$_pairs = array();
// create variables
foreach ($_attr as $key => $value) {
$_pairs[] = "'$key'=>$value";
}
$_vars = 'array(' . join(',', $_pairs) . ')';
}
$update_compile_id = $compiler->template->caching && !$compiler->tag_nocache && !$compiler->nocache &&
$_compile_id !== '$_smarty_tpl->compile_id';
if ($has_compiled_template && !$call_nocache) {
$_output = "<?php\n";
if ($update_compile_id) {
$_output .= $compiler->makeNocacheCode("\$_compile_id_save[] = \$_smarty_tpl->compile_id;\n\$_smarty_tpl->compile_id = {$_compile_id};\n");
}
if (!empty($_attr) && $_caching === 9999 && $compiler->template->caching) {
$_vars_nc = "foreach ($_vars as \$ik => \$iv) {\n";
$_vars_nc .= "\$_smarty_tpl->tpl_vars[\$ik] = new Smarty_Variable(\$iv);\n";
$_vars_nc .= "}\n";
$_output .= substr($compiler->processNocacheCode('<?php ' . $_vars_nc . "?>\n", true), 6, -3);
}
if (isset($_assign)) {
$_output .= "ob_start();\n";
}
$_output .= "\$_smarty_tpl->_subTemplateRender({$fullResourceName}, {$_cache_id}, {$_compile_id}, {$_caching}, {$_cache_lifetime}, {$_vars}, {$_scope}, {$_cache_tpl}, '{$compiler->parent_compiler->mergedSubTemplatesData[$uid][$t_hash]['uid']}', '{$compiler->parent_compiler->mergedSubTemplatesData[$uid][$t_hash]['func']}');\n";
if (isset($_assign)) {
$_output .= "\$_smarty_tpl->assign({$_assign}, ob_get_clean());\n";
}
if ($update_compile_id) {
$_output .= $compiler->makeNocacheCode("\$_smarty_tpl->compile_id = array_pop(\$_compile_id_save);\n");
}
$_output .= "?>";
return $_output;
}
if ($call_nocache) {
$compiler->tag_nocache = true;
}
$_output = "<?php ";
if ($update_compile_id) {
$_output .= "\$_compile_id_save[] = \$_smarty_tpl->compile_id;\n\$_smarty_tpl->compile_id = {$_compile_id};\n";
}
// was there an assign attribute
if (isset($_assign)) {
$_output .= "ob_start();\n";
}
$_output .= "\$_smarty_tpl->_subTemplateRender({$fullResourceName}, $_cache_id, $_compile_id, $_caching, $_cache_lifetime, $_vars, $_scope, {$_cache_tpl});\n";
if (isset($_assign)) {
$_output .= "\$_smarty_tpl->assign({$_assign}, ob_get_clean());\n";
}
if ($update_compile_id) {
$_output .= "\$_smarty_tpl->compile_id = array_pop(\$_compile_id_save);\n";
}
$_output .= "?>";
return $_output;
}
/**
* Compile inline sub template
*
* @param \Smarty_Internal_SmartyTemplateCompiler $compiler
* @param \Smarty_Internal_Template $tpl
* @param string $t_hash
*
* @return bool
* @throws \Exception
* @throws \SmartyException
*/
public function compileInlineTemplate(
Smarty_Internal_SmartyTemplateCompiler $compiler,
Smarty_Internal_Template $tpl,
$t_hash
) {
$uid = $tpl->source->type . $tpl->source->uid;
if (!($tpl->source->handler->uncompiled) && $tpl->source->exists) {
$compiler->parent_compiler->mergedSubTemplatesData[ $uid ][ $t_hash ][ 'uid' ] = $tpl->source->uid;
if (isset($compiler->template->inheritance)) {
$tpl->inheritance = clone $compiler->template->inheritance;
}
$tpl->compiled = new Smarty_Template_Compiled();
$tpl->compiled->nocache_hash = $compiler->parent_compiler->template->compiled->nocache_hash;
$tpl->loadCompiler();
// save unique function name
$compiler->parent_compiler->mergedSubTemplatesData[ $uid ][ $t_hash ][ 'func' ] =
$tpl->compiled->unifunc = 'content_' . str_replace(array('.', ','), '_', uniqid('', true));
// make sure whole chain gets compiled
$tpl->mustCompile = true;
$compiler->parent_compiler->mergedSubTemplatesData[ $uid ][ $t_hash ][ 'nocache_hash' ] =
$tpl->compiled->nocache_hash;
if ($tpl->source->type === 'file') {
$sourceInfo = $tpl->source->filepath;
} else {
$basename = $tpl->source->handler->getBasename($tpl->source);
$sourceInfo = $tpl->source->type . ':' .
($basename ? $basename : $tpl->source->name);
}
// get compiled code
$compiled_code = "<?php\n\n";
$compiled_code .= "/* Start inline template \"{$sourceInfo}\" =============================*/\n";
$compiled_code .= "function {$tpl->compiled->unifunc} (Smarty_Internal_Template \$_smarty_tpl) {\n";
$compiled_code .= "?>\n" . $tpl->compiler->compileTemplateSource($tpl, null, $compiler->parent_compiler);
$compiled_code .= "<?php\n";
$compiled_code .= "}\n?>\n";
$compiled_code .= $tpl->compiler->postFilter($tpl->compiler->blockOrFunctionCode);
$compiled_code .= "<?php\n\n";
$compiled_code .= "/* End inline template \"{$sourceInfo}\" =============================*/\n";
$compiled_code .= '?>';
unset($tpl->compiler);
if ($tpl->compiled->has_nocache_code) {
// replace nocache_hash
$compiled_code =
str_replace(
"{$tpl->compiled->nocache_hash}",
$compiler->template->compiled->nocache_hash,
$compiled_code
);
$compiler->template->compiled->has_nocache_code = true;
}
$compiler->parent_compiler->mergedSubTemplatesCode[ $tpl->compiled->unifunc ] = $compiled_code;
return true;
} else {
return false;
}
}
}

View file

@ -1,108 +1,110 @@
<?php <?php
/** /**
* Smarty Internal Plugin Compile Include PHP * Smarty Internal Plugin Compile Include PHP
* * Compiles the {include_php} tag
* Compiles the {include_php} tag *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler * @author Uwe Tews
* @author Uwe Tews */
*/
/**
/** * Smarty Internal Plugin Compile Insert Class
* Smarty Internal Plugin Compile Insert Class *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler */
*/ class Smarty_Internal_Compile_Include_Php extends Smarty_Internal_CompileBase
class Smarty_Internal_Compile_Include_Php extends Smarty_Internal_CompileBase { {
/**
/** * Attribute definition: Overwrites base class.
* Attribute definition: Overwrites base class. *
* * @var array
* @var array * @see Smarty_Internal_CompileBase
* @see Smarty_Internal_CompileBase */
*/ public $required_attributes = array('file');
public $required_attributes = array('file');
/** /**
* Attribute definition: Overwrites base class. * Attribute definition: Overwrites base class.
* *
* @var array * @var array
* @see Smarty_Internal_CompileBase * @see Smarty_Internal_CompileBase
*/ */
public $shorttag_order = array('file'); public $shorttag_order = array('file');
/**
* Attribute definition: Overwrites base class. /**
* * Attribute definition: Overwrites base class.
* @var array *
* @see Smarty_Internal_CompileBase * @var array
*/ * @see Smarty_Internal_CompileBase
public $optional_attributes = array('once', 'assign'); */
public $optional_attributes = array('once', 'assign');
/**
* Compiles code for the {include_php} tag /**
* * Compiles code for the {include_php} tag
* @param array $args array with attributes from parser *
* @param object $compiler compiler object * @param array $args array with attributes from parser
* @return string compiled code * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
*/ *
public function compile($args, $compiler) * @return string
{ * @throws \SmartyCompilerException
if (!($compiler->smarty instanceof SmartyBC)) { * @throws \SmartyException
throw new SmartyException("{include_php} is deprecated, use SmartyBC class to enable"); */
} public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
// check and get attributes {
$_attr = $this->getAttributes($compiler, $args); if (!($compiler->smarty instanceof SmartyBC)) {
throw new SmartyException("{include_php} is deprecated, use SmartyBC class to enable");
$_output = '<?php '; }
// check and get attributes
$_smarty_tpl = $compiler->template; $_attr = $this->getAttributes($compiler, $args);
$_filepath = false; /**
eval('$_file = ' . $_attr['file'] . ';'); *
if (!isset($compiler->smarty->security_policy) && file_exists($_file)) { *
$_filepath = $_file; * @var Smarty_Internal_Template $_smarty_tpl
} else { * used in evaluated code
if (isset($compiler->smarty->security_policy)) { */
$_dir = $compiler->smarty->security_policy->trusted_dir; $_smarty_tpl = $compiler->template;
} else { $_filepath = false;
$_dir = $compiler->smarty->trusted_dir; $_file = null;
} eval('$_file = @' . $_attr[ 'file' ] . ';');
if (!empty($_dir)) { if (!isset($compiler->smarty->security_policy) && file_exists($_file)) {
foreach((array)$_dir as $_script_dir) { $_filepath = $compiler->smarty->_realpath($_file, true);
$_script_dir = rtrim($_script_dir, '/\\') . DS; } else {
if (file_exists($_script_dir . $_file)) { if (isset($compiler->smarty->security_policy)) {
$_filepath = $_script_dir . $_file; $_dir = $compiler->smarty->security_policy->trusted_dir;
break; } else {
} $_dir = $compiler->smarty->trusted_dir;
} }
} if (!empty($_dir)) {
} foreach ((array)$_dir as $_script_dir) {
if ($_filepath == false) { $_path = $compiler->smarty->_realpath($_script_dir . DIRECTORY_SEPARATOR . $_file, true);
$compiler->trigger_template_error("{include_php} file '{$_file}' is not readable", $compiler->lex->taglineno); if (file_exists($_path)) {
} $_filepath = $_path;
break;
if (isset($compiler->smarty->security_policy)) { }
$compiler->smarty->security_policy->isTrustedPHPDir($_filepath); }
} }
}
if (isset($_attr['assign'])) { if ($_filepath === false) {
// output will be stored in a smarty variable instead of being displayed $compiler->trigger_template_error("{include_php} file '{$_file}' is not readable", null, true);
$_assign = $_attr['assign']; }
} if (isset($compiler->smarty->security_policy)) {
$_once = '_once'; $compiler->smarty->security_policy->isTrustedPHPDir($_filepath);
if (isset($_attr['once'])) { }
if ($_attr['once'] == 'false') { if (isset($_attr[ 'assign' ])) {
$_once = ''; // output will be stored in a smarty variable instead of being displayed
} $_assign = $_attr[ 'assign' ];
} }
$_once = '_once';
if (isset($_assign)) { if (isset($_attr[ 'once' ])) {
return "<?php ob_start(); include{$_once} ('{$_filepath}'); \$_smarty_tpl->assign({$_assign},ob_get_contents()); ob_end_clean();?>"; if ($_attr[ 'once' ] === 'false') {
} else { $_once = '';
return "<?php include{$_once} ('{$_filepath}');?>\n"; }
} }
} if (isset($_assign)) {
return "<?php ob_start();\ninclude{$_once} ('{$_filepath}');\n\$_smarty_tpl->assign({$_assign},ob_get_clean());\n?>";
} } else {
return "<?php include{$_once} ('{$_filepath}');?>\n";
?> }
}
}

View file

@ -1,142 +1,157 @@
<?php <?php
/**
/** * Smarty Internal Plugin Compile Insert
* Smarty Internal Plugin Compile Insert * Compiles the {insert} tag
* *
* Compiles the {insert} tag * @package Smarty
* * @subpackage Compiler
* @package Smarty * @author Uwe Tews
* @subpackage Compiler */
* @author Uwe Tews
*/ /**
* Smarty Internal Plugin Compile Insert Class
/** *
* Smarty Internal Plugin Compile Insert Class * @package Smarty
* * @subpackage Compiler
* @package Smarty */
* @subpackage Compiler class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase
*/ {
class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase { /**
* Attribute definition: Overwrites base class.
/** *
* Attribute definition: Overwrites base class. * @var array
* * @see Smarty_Internal_CompileBase
* @var array */
* @see Smarty_Internal_CompileBase public $required_attributes = array('name');
*/
public $required_attributes = array('name'); /**
/** * Attribute definition: Overwrites base class.
* Attribute definition: Overwrites base class. *
* * @var array
* @var array * @see Smarty_Internal_CompileBase
* @see Smarty_Internal_CompileBase */
*/ public $shorttag_order = array('name');
public $shorttag_order = array('name');
/** /**
* Attribute definition: Overwrites base class. * Attribute definition: Overwrites base class.
* *
* @var array * @var array
* @see Smarty_Internal_CompileBase * @see Smarty_Internal_CompileBase
*/ */
public $optional_attributes = array('_any'); public $optional_attributes = array('_any');
/** /**
* Compiles code for the {insert} tag * Compiles code for the {insert} tag
* *
* @param array $args array with attributes from parser * @param array $args array with attributes from parser
* @param object $compiler compiler object * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
* @return string compiled code *
*/ * @return string compiled code
public function compile($args, $compiler) * @throws \SmartyCompilerException
{ * @throws \SmartyException
// check and get attributes */
$_attr = $this->getAttributes($compiler, $args); public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
// never compile as nocache code {
$compiler->suppressNocacheProcessing = true; // check and get attributes
$compiler->tag_nocache = true; $_attr = $this->getAttributes($compiler, $args);
$_smarty_tpl = $compiler->template; $nocacheParam = $compiler->template->caching && ($compiler->tag_nocache || $compiler->nocache);
$_name = null; if (!$nocacheParam) {
$_script = null; // do not compile as nocache code
$compiler->suppressNocacheProcessing = true;
$_output = '<?php '; }
// save posible attributes $compiler->tag_nocache = true;
eval('$_name = ' . $_attr['name'] . ';'); $_smarty_tpl = $compiler->template;
if (isset($_attr['assign'])) { $_name = null;
// output will be stored in a smarty variable instead of being displayed $_script = null;
$_assign = $_attr['assign']; $_output = '<?php ';
// create variable to make shure that the compiler knows about its nocache status // save possible attributes
$compiler->template->tpl_vars[trim($_attr['assign'], "'")] = new Smarty_Variable(null, true); eval('$_name = @' . $_attr[ 'name' ] . ';');
} if (isset($_attr[ 'assign' ])) {
if (isset($_attr['script'])) { // output will be stored in a smarty variable instead of being displayed
// script which must be included $_assign = $_attr[ 'assign' ];
$_function = "smarty_insert_{$_name}"; // create variable to make sure that the compiler knows about its nocache status
$_smarty_tpl = $compiler->template; $var = trim($_attr[ 'assign' ], '\'');
$_filepath = false; if (isset($compiler->template->tpl_vars[ $var ])) {
eval('$_script = ' . $_attr['script'] . ';'); $compiler->template->tpl_vars[ $var ]->nocache = true;
if (!isset($compiler->smarty->security_policy) && file_exists($_script)) { } else {
$_filepath = $_script; $compiler->template->tpl_vars[ $var ] = new Smarty_Variable(null, true);
} else { }
if (isset($compiler->smarty->security_policy)) { }
$_dir = $compiler->smarty->security_policy->trusted_dir; if (isset($_attr[ 'script' ])) {
} else { // script which must be included
$_dir = $compiler->smarty->trusted_dir; $_function = "smarty_insert_{$_name}";
} $_smarty_tpl = $compiler->template;
if (!empty($_dir)) { $_filepath = false;
foreach((array)$_dir as $_script_dir) { eval('$_script = @' . $_attr[ 'script' ] . ';');
$_script_dir = rtrim($_script_dir, '/\\') . DS; if (!isset($compiler->smarty->security_policy) && file_exists($_script)) {
if (file_exists($_script_dir . $_script)) { $_filepath = $_script;
$_filepath = $_script_dir . $_script; } else {
break; if (isset($compiler->smarty->security_policy)) {
} $_dir = $compiler->smarty->security_policy->trusted_dir;
} } else {
} $_dir = $compiler->smarty instanceof SmartyBC ? $compiler->smarty->trusted_dir : null;
} }
if ($_filepath == false) { if (!empty($_dir)) {
$compiler->trigger_template_error("{insert} missing script file '{$_script}'", $compiler->lex->taglineno); foreach ((array)$_dir as $_script_dir) {
} $_script_dir = rtrim($_script_dir, '/\\') . DIRECTORY_SEPARATOR;
// code for script file loading if (file_exists($_script_dir . $_script)) {
$_output .= "require_once '{$_filepath}' ;"; $_filepath = $_script_dir . $_script;
require_once $_filepath; break;
if (!is_callable($_function)) { }
$compiler->trigger_template_error(" {insert} function '{$_function}' is not callable in script file '{$_script}'", $compiler->lex->taglineno); }
} }
} else { }
$_filepath = 'null'; if ($_filepath === false) {
$_function = "insert_{$_name}"; $compiler->trigger_template_error("{insert} missing script file '{$_script}'", null, true);
// function in PHP script ? }
if (!is_callable($_function)) { // code for script file loading
// try plugin $_output .= "require_once '{$_filepath}' ;";
if (!$_function = $compiler->getPlugin($_name, 'insert')) { include_once $_filepath;
$compiler->trigger_template_error("{insert} no function or plugin found for '{$_name}'", $compiler->lex->taglineno); if (!is_callable($_function)) {
} $compiler->trigger_template_error(
} " {insert} function '{$_function}' is not callable in script file '{$_script}'",
} null,
// delete {insert} standard attributes true
unset($_attr['name'], $_attr['assign'], $_attr['script'], $_attr['nocache']); );
// convert attributes into parameter array string }
$_paramsArray = array(); } else {
foreach ($_attr as $_key => $_value) { $_filepath = 'null';
$_paramsArray[] = "'$_key' => $_value"; $_function = "insert_{$_name}";
} // function in PHP script ?
$_params = 'array(' . implode(", ", $_paramsArray) . ')'; if (!is_callable($_function)) {
// call insert // try plugin
if (isset($_assign)) { if (!$_function = $compiler->getPlugin($_name, 'insert')) {
if ($_smarty_tpl->caching) { $compiler->trigger_template_error(
$_output .= "echo Smarty_Internal_Nocache_Insert::compile ('{$_function}',{$_params}, \$_smarty_tpl, '{$_filepath}',{$_assign});?>"; "{insert} no function or plugin found for '{$_name}'",
} else { null,
$_output .= "\$_smarty_tpl->assign({$_assign} , {$_function} ({$_params},\$_smarty_tpl), true);?>"; true
} );
} else { }
$compiler->has_output = true; }
if ($_smarty_tpl->caching) { }
$_output .= "echo Smarty_Internal_Nocache_Insert::compile ('{$_function}',{$_params}, \$_smarty_tpl, '{$_filepath}');?>"; // delete {insert} standard attributes
} else { unset($_attr[ 'name' ], $_attr[ 'assign' ], $_attr[ 'script' ], $_attr[ 'nocache' ]);
$_output .= "echo {$_function}({$_params},\$_smarty_tpl);?>"; // convert attributes into parameter array string
} $_paramsArray = array();
} foreach ($_attr as $_key => $_value) {
return $_output; $_paramsArray[] = "'$_key' => $_value";
} }
$_params = 'array(' . implode(", ", $_paramsArray) . ')';
} // call insert
if (isset($_assign)) {
?> if ($_smarty_tpl->caching && !$nocacheParam) {
$_output .= "echo Smarty_Internal_Nocache_Insert::compile ('{$_function}',{$_params}, \$_smarty_tpl, '{$_filepath}',{$_assign});?>";
} else {
$_output .= "\$_smarty_tpl->assign({$_assign} , {$_function} ({$_params},\$_smarty_tpl), true);?>";
}
} else {
if ($_smarty_tpl->caching && !$nocacheParam) {
$_output .= "echo Smarty_Internal_Nocache_Insert::compile ('{$_function}',{$_params}, \$_smarty_tpl, '{$_filepath}');?>";
} else {
$_output .= "echo {$_function}({$_params},\$_smarty_tpl);?>";
}
}
$compiler->template->compiled->has_nocache_code = true;
return $_output;
}
}

View file

@ -1,41 +1,37 @@
<?php <?php
/** /**
* Smarty Internal Plugin Compile Ldelim * Smarty Internal Plugin Compile Ldelim
* * Compiles the {ldelim} tag
* Compiles the {ldelim} tag *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler * @author Uwe Tews
* @author Uwe Tews */
*/
/**
/** * Smarty Internal Plugin Compile Ldelim Class
* Smarty Internal Plugin Compile Ldelim Class *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler */
*/ class Smarty_Internal_Compile_Ldelim extends Smarty_Internal_CompileBase
class Smarty_Internal_Compile_Ldelim extends Smarty_Internal_CompileBase { {
/**
/** * Compiles code for the {ldelim} tag
* Compiles code for the {ldelim} tag * This tag does output the left delimiter
* *
* This tag does output the left delimiter * @param array $args array with attributes from parser
* @param array $args array with attributes from parser * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
* @param object $compiler compiler object *
* @return string compiled code * @return string compiled code
*/ * @throws \SmartyCompilerException
public function compile($args, $compiler) */
{ public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
$_attr = $this->getAttributes($compiler, $args); {
if ($_attr['nocache'] === true) { $_attr = $this->getAttributes($compiler, $args);
$compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno); if ($_attr[ 'nocache' ] === true) {
} $compiler->trigger_template_error('nocache option not allowed', null, true);
// this tag does not return compiled code }
$compiler->has_code = true; return $compiler->smarty->left_delimiter;
return $compiler->smarty->left_delimiter; }
} }
}
?>

View file

@ -0,0 +1,62 @@
<?php
/**
* Smarty Internal Plugin Compile Make_Nocache
* Compiles the {make_nocache} tag
*
* @package Smarty
* @subpackage Compiler
* @author Uwe Tews
*/
/**
* Smarty Internal Plugin Compile Make_Nocache Class
*
* @package Smarty
* @subpackage Compiler
*/
class Smarty_Internal_Compile_Make_Nocache extends Smarty_Internal_CompileBase
{
/**
* Attribute definition: Overwrites base class.
*
* @var array
* @see Smarty_Internal_CompileBase
*/
public $option_flags = array();
/**
* Array of names of required attribute required by tag
*
* @var array
*/
public $required_attributes = array('var');
/**
* Shorttag attribute order defined by its names
*
* @var array
*/
public $shorttag_order = array('var');
/**
* Compiles code for the {make_nocache} tag
*
* @param array $args array with attributes from parser
* @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
*
* @return string compiled code
*/
public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
{
// check and get attributes
$_attr = $this->getAttributes($compiler, $args);
if ($compiler->template->caching) {
$output = "<?php \$_smarty_tpl->smarty->ext->_make_nocache->save(\$_smarty_tpl, {$_attr[ 'var' ]});\n?>\n";
$compiler->template->compiled->has_nocache_code = true;
$compiler->suppressNocacheProcessing = true;
return $output;
} else {
return true;
}
}
}

View file

@ -1,73 +1,73 @@
<?php <?php
/** /**
* Smarty Internal Plugin Compile Nocache * Smarty Internal Plugin Compile Nocache
* * Compiles the {nocache} {/nocache} tags.
* Compiles the {nocache} {/nocache} tags. *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler * @author Uwe Tews
* @author Uwe Tews */
*/
/**
/** * Smarty Internal Plugin Compile Nocache Class
* Smarty Internal Plugin Compile Nocache Classv *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler */
*/ class Smarty_Internal_Compile_Nocache extends Smarty_Internal_CompileBase
class Smarty_Internal_Compile_Nocache extends Smarty_Internal_CompileBase { {
/**
/** * Array of names of valid option flags
* Compiles code for the {nocache} tag *
* * @var array
* This tag does not generate compiled output. It only sets a compiler flag. */
* public $option_flags = array();
* @param array $args array with attributes from parser
* @param object $compiler compiler object /**
* @return bool * Compiles code for the {nocache} tag
*/ * This tag does not generate compiled output. It only sets a compiler flag.
public function compile($args, $compiler) *
{ * @param array $args array with attributes from parser
$_attr = $this->getAttributes($compiler, $args); * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
if ($_attr['nocache'] === true) { *
$compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno); * @return bool
} */
// enter nocache mode public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
$compiler->nocache = true; {
// this tag does not return compiled code $_attr = $this->getAttributes($compiler, $args);
$compiler->has_code = false; $this->openTag($compiler, 'nocache', array($compiler->nocache));
return true; // enter nocache mode
} $compiler->nocache = true;
// this tag does not return compiled code
} $compiler->has_code = false;
return true;
/** }
* Smarty Internal Plugin Compile Nocacheclose Class }
*
* @package Smarty /**
* @subpackage Compiler * Smarty Internal Plugin Compile Nocacheclose Class
*/ *
class Smarty_Internal_Compile_Nocacheclose extends Smarty_Internal_CompileBase { * @package Smarty
* @subpackage Compiler
/** */
* Compiles code for the {/nocache} tag class Smarty_Internal_Compile_Nocacheclose extends Smarty_Internal_CompileBase
* {
* This tag does not generate compiled output. It only sets a compiler flag. /**
* * Compiles code for the {/nocache} tag
* @param array $args array with attributes from parser * This tag does not generate compiled output. It only sets a compiler flag.
* @param object $compiler compiler object *
* @return bool * @param array $args array with attributes from parser
*/ * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
public function compile($args, $compiler) *
{ * @return bool
$_attr = $this->getAttributes($compiler, $args); */
// leave nocache mode public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
$compiler->nocache = false; {
// this tag does not return compiled code $_attr = $this->getAttributes($compiler, $args);
$compiler->has_code = false; // leave nocache mode
return true; list($compiler->nocache) = $this->closeTag($compiler, array('nocache'));
} // this tag does not return compiled code
$compiler->has_code = false;
} return true;
}
?> }

View file

@ -0,0 +1,31 @@
<?php
/**
* This file is part of Smarty.
*
* (c) 2015 Uwe Tews
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
/**
* Smarty Internal Plugin Compile Parent Class
*
* @author Uwe Tews <uwe.tews@googlemail.com>
*/
class Smarty_Internal_Compile_Parent extends Smarty_Internal_Compile_Child
{
/**
* Tag name
*
* @var string
*/
public $tag = 'parent';
/**
* Block type
*
* @var string
*/
public $blockType = 'Parent';
}

View file

@ -1,87 +1,124 @@
<?php <?php
/** /**
* Smarty Internal Plugin Compile Block Plugin * Smarty Internal Plugin Compile Block Plugin
* * Compiles code for the execution of block plugin
* Compiles code for the execution of block plugin *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler * @author Uwe Tews
* @author Uwe Tews */
*/
/**
/** * Smarty Internal Plugin Compile Block Plugin Class
* Smarty Internal Plugin Compile Block Plugin Class *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler */
*/ class Smarty_Internal_Compile_Private_Block_Plugin extends Smarty_Internal_CompileBase
class Smarty_Internal_Compile_Private_Block_Plugin extends Smarty_Internal_CompileBase { {
/**
/** * Attribute definition: Overwrites base class.
* Attribute definition: Overwrites base class. *
* * @var array
* @var array * @see Smarty_Internal_CompileBase
* @see Smarty_Internal_CompileBase */
*/ public $optional_attributes = array('_any');
public $optional_attributes = array('_any');
/**
/** * nesting level
* Compiles code for the execution of block plugin *
* * @var int
* @param array $args array with attributes from parser */
* @param object $compiler compiler object public $nesting = 0;
* @param array $parameter array with compilation parameter
* @param string $tag name of block plugin /**
* @param string $function PHP function name * Compiles code for the execution of block plugin
* @return string compiled code *
*/ * @param array $args array with attributes from parser
public function compile($args, $compiler, $parameter, $tag, $function) * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
{ * @param array $parameter array with compilation parameter
if (!isset($tag[5]) || substr($tag, -5) != 'close') { * @param string $tag name of block plugin
// opening tag of block plugin * @param string $function PHP function name
// check and get attributes *
$_attr = $this->getAttributes($compiler, $args); * @return string compiled code
if ($_attr['nocache'] === true) { * @throws \SmartyCompilerException
$compiler->tag_nocache = true; * @throws \SmartyException
} */
unset($_attr['nocache']); public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter, $tag, $function = null)
// convert attributes into parameter array string {
$_paramsArray = array(); if (!isset($tag[ 5 ]) || substr($tag, -5) !== 'close') {
foreach ($_attr as $_key => $_value) { // opening tag of block plugin
if (is_int($_key)) { // check and get attributes
$_paramsArray[] = "$_key=>$_value"; $_attr = $this->getAttributes($compiler, $args);
} else { $this->nesting++;
$_paramsArray[] = "'$_key'=>$_value"; unset($_attr[ 'nocache' ]);
} list($callback, $_paramsArray, $callable) = $this->setup($compiler, $_attr, $tag, $function);
} $_params = 'array(' . implode(',', $_paramsArray) . ')';
$_params = 'array(' . implode(",", $_paramsArray) . ')'; // compile code
$output = "<?php ";
$this->openTag($compiler, $tag, array($_params, $compiler->nocache)); if (is_array($callback)) {
// maybe nocache because of nocache variables or nocache plugin $output .= "\$_block_plugin{$this->nesting} = isset({$callback[0]}) ? {$callback[0]} : null;\n";
$compiler->nocache = $compiler->nocache | $compiler->tag_nocache; $callback = "\$_block_plugin{$this->nesting}{$callback[1]}";
// compile code }
$output = "<?php \$_smarty_tpl->smarty->_tag_stack[] = array('{$tag}', {$_params}); \$_block_repeat=true; echo {$function}({$_params}, null, \$_smarty_tpl, \$_block_repeat);while (\$_block_repeat) { ob_start();?>"; if (isset($callable)) {
} else { $output .= "if (!is_callable({$callable})) {\nthrow new SmartyException('block tag \'{$tag}\' not callable or registered');\n}\n";
// must endblock be nocache? }
if ($compiler->nocache) { $output .= "\$_smarty_tpl->smarty->_cache['_tag_stack'][] = array('{$tag}', {$_params});\n";
$compiler->tag_nocache = true; $output .= "\$_block_repeat=true;\necho {$callback}({$_params}, null, \$_smarty_tpl, \$_block_repeat);\nwhile (\$_block_repeat) {\nob_start();?>";
} $this->openTag($compiler, $tag, array($_params, $compiler->nocache, $callback));
// closing tag of block plugin, restore nocache // maybe nocache because of nocache variables or nocache plugin
list($_params, $compiler->nocache) = $this->closeTag($compiler, substr($tag, 0, -5)); $compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
// This tag does create output } else {
$compiler->has_output = true; // must endblock be nocache?
// compile code if ($compiler->nocache) {
if (!isset($parameter['modifier_list'])) { $compiler->tag_nocache = true;
$mod_pre = $mod_post =''; }
} else { // closing tag of block plugin, restore nocache
$mod_pre = ' ob_start(); '; list($_params, $compiler->nocache, $callback) = $this->closeTag($compiler, substr($tag, 0, -5));
$mod_post = 'echo '.$compiler->compileTag('private_modifier',array(),array('modifierlist'=>$parameter['modifier_list'],'value'=>'ob_get_clean()')).';'; // compile code
} if (!isset($parameter[ 'modifier_list' ])) {
$output = "<?php \$_block_content = ob_get_clean(); \$_block_repeat=false;".$mod_pre." echo {$function}({$_params}, \$_block_content, \$_smarty_tpl, \$_block_repeat); ".$mod_post." } array_pop(\$_smarty_tpl->smarty->_tag_stack);?>"; $mod_pre = $mod_post = $mod_content = '';
} $mod_content2 = 'ob_get_clean()';
return $output . "\n"; } else {
} $mod_content2 = "\$_block_content{$this->nesting}";
$mod_content = "\$_block_content{$this->nesting} = ob_get_clean();\n";
} $mod_pre = "ob_start();\n";
$mod_post = 'echo ' . $compiler->compileTag(
?> 'private_modifier',
array(),
array(
'modifierlist' => $parameter[ 'modifier_list' ],
'value' => 'ob_get_clean()'
)
) . ";\n";
}
$output =
"<?php {$mod_content}\$_block_repeat=false;\n{$mod_pre}echo {$callback}({$_params}, {$mod_content2}, \$_smarty_tpl, \$_block_repeat);\n{$mod_post}}\n";
$output .= 'array_pop($_smarty_tpl->smarty->_cache[\'_tag_stack\']);?>';
}
return $output;
}
/**
* Setup callback and parameter array
*
* @param \Smarty_Internal_TemplateCompilerBase $compiler
* @param array $_attr attributes
* @param string $tag
* @param string $function
*
* @return array
*/
public function setup(Smarty_Internal_TemplateCompilerBase $compiler, $_attr, $tag, $function)
{
$_paramsArray = array();
foreach ($_attr as $_key => $_value) {
if (is_int($_key)) {
$_paramsArray[] = "$_key=>$_value";
} else {
$_paramsArray[] = "'$_key'=>$_value";
}
}
return array($function, $_paramsArray, null);
}
}

View file

@ -0,0 +1,228 @@
<?php
/**
* Smarty Internal Plugin Compile ForeachSection
* Shared methods for {foreach} {section} tags
*
* @package Smarty
* @subpackage Compiler
* @author Uwe Tews
*/
/**
* Smarty Internal Plugin Compile ForeachSection Class
*
* @package Smarty
* @subpackage Compiler
*/
class Smarty_Internal_Compile_Private_ForeachSection extends Smarty_Internal_CompileBase
{
/**
* Name of this tag
*
* @var string
*/
public $tagName = '';
/**
* Valid properties of $smarty.xxx variable
*
* @var array
*/
public $nameProperties = array();
/**
* {section} tag has no item properties
*
* @var array
*/
public $itemProperties = null;
/**
* {section} tag has always name attribute
*
* @var bool
*/
public $isNamed = true;
/**
* @var array
*/
public $matchResults = array();
/**
* Preg search pattern
*
* @var string
*/
private $propertyPreg = '';
/**
* Offsets in preg match result
*
* @var array
*/
private $resultOffsets = array();
/**
* Start offset
*
* @var int
*/
private $startOffset = 0;
/**
* Scan sources for used tag attributes
*
* @param array $attributes
* @param \Smarty_Internal_TemplateCompilerBase $compiler
*
* @throws \SmartyException
*/
public function scanForProperties($attributes, Smarty_Internal_TemplateCompilerBase $compiler)
{
$this->propertyPreg = '~(';
$this->startOffset = 1;
$this->resultOffsets = array();
$this->matchResults = array('named' => array(), 'item' => array());
if (isset($attributes[ 'name' ])) {
$this->buildPropertyPreg(true, $attributes);
}
if (isset($this->itemProperties)) {
if ($this->isNamed) {
$this->propertyPreg .= '|';
}
$this->buildPropertyPreg(false, $attributes);
}
$this->propertyPreg .= ')\W~i';
// Template source
$this->matchTemplateSource($compiler);
// Parent template source
$this->matchParentTemplateSource($compiler);
// {block} source
$this->matchBlockSource($compiler);
}
/**
* Build property preg string
*
* @param bool $named
* @param array $attributes
*/
public function buildPropertyPreg($named, $attributes)
{
if ($named) {
$this->resultOffsets[ 'named' ] = $this->startOffset = $this->startOffset + 3;
$this->propertyPreg .= "(([\$]smarty[.]{$this->tagName}[.]" .
($this->tagName === 'section' ? "|[\[]\s*" : '') .
"){$attributes['name']}[.](";
$properties = $this->nameProperties;
} else {
$this->resultOffsets[ 'item' ] = $this->startOffset = $this->startOffset + 2;
$this->propertyPreg .= "([\$]{$attributes['item']}[@](";
$properties = $this->itemProperties;
}
$propName = reset($properties);
while ($propName) {
$this->propertyPreg .= "{$propName}";
$propName = next($properties);
if ($propName) {
$this->propertyPreg .= '|';
}
}
$this->propertyPreg .= '))';
}
/**
* Find matches in source string
*
* @param string $source
*/
public function matchProperty($source)
{
preg_match_all($this->propertyPreg, $source, $match);
foreach ($this->resultOffsets as $key => $offset) {
foreach ($match[ $offset ] as $m) {
if (!empty($m)) {
$this->matchResults[ $key ][ strtolower($m) ] = true;
}
}
}
}
/**
* Find matches in template source
*
* @param \Smarty_Internal_TemplateCompilerBase $compiler
*/
public function matchTemplateSource(Smarty_Internal_TemplateCompilerBase $compiler)
{
$this->matchProperty($compiler->parser->lex->data);
}
/**
* Find matches in all parent template source
*
* @param \Smarty_Internal_TemplateCompilerBase $compiler
*
* @throws \SmartyException
*/
public function matchParentTemplateSource(Smarty_Internal_TemplateCompilerBase $compiler)
{
// search parent compiler template source
$nextCompiler = $compiler;
while ($nextCompiler !== $nextCompiler->parent_compiler) {
$nextCompiler = $nextCompiler->parent_compiler;
if ($compiler !== $nextCompiler) {
// get template source
$_content = $nextCompiler->template->source->getContent();
if ($_content !== '') {
// run pre filter if required
if ((isset($nextCompiler->smarty->autoload_filters[ 'pre' ]) ||
isset($nextCompiler->smarty->registered_filters[ 'pre' ]))
) {
$_content = $nextCompiler->smarty->ext->_filterHandler->runFilter(
'pre',
$_content,
$nextCompiler->template
);
}
$this->matchProperty($_content);
}
}
}
}
/**
* Find matches in {block} tag source
*
* @param \Smarty_Internal_TemplateCompilerBase $compiler
*/
public function matchBlockSource(Smarty_Internal_TemplateCompilerBase $compiler)
{
}
/**
* Compiles code for the {$smarty.foreach.xxx} or {$smarty.section.xxx}tag
*
* @param array $args array with attributes from parser
* @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
* @param array $parameter array with compilation parameter
*
* @return string compiled code
* @throws \SmartyCompilerException
*/
public function compileSpecialVariable($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
{
$tag = strtolower(trim($parameter[ 0 ], '"\''));
$name = isset($parameter[ 1 ]) ? $compiler->getId($parameter[ 1 ]) : false;
if (!$name) {
$compiler->trigger_template_error("missing or illegal \$smarty.{$tag} name attribute", null, true);
}
$property = isset($parameter[ 2 ]) ? strtolower($compiler->getId($parameter[ 2 ])) : false;
if (!$property || !in_array($property, $this->nameProperties)) {
$compiler->trigger_template_error("missing or illegal \$smarty.{$tag} property attribute", null, true);
}
$tagVar = "'__smarty_{$tag}_{$name}'";
return "(isset(\$_smarty_tpl->tpl_vars[{$tagVar}]->value['{$property}']) ? \$_smarty_tpl->tpl_vars[{$tagVar}]->value['{$property}'] : null)";
}
}

View file

@ -1,73 +1,78 @@
<?php <?php
/** /**
* Smarty Internal Plugin Compile Function Plugin * Smarty Internal Plugin Compile Function Plugin
* * Compiles code for the execution of function plugin
* Compiles code for the execution of function plugin *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler * @author Uwe Tews
* @author Uwe Tews */
*/
/**
/** * Smarty Internal Plugin Compile Function Plugin Class
* Smarty Internal Plugin Compile Function Plugin Class *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler */
*/ class Smarty_Internal_Compile_Private_Function_Plugin extends Smarty_Internal_CompileBase
class Smarty_Internal_Compile_Private_Function_Plugin extends Smarty_Internal_CompileBase { {
/**
/** * Attribute definition: Overwrites base class.
* Attribute definition: Overwrites base class. *
* * @var array
* @var array * @see Smarty_Internal_CompileBase
* @see Smarty_Internal_CompileBase */
*/ public $required_attributes = array();
public $required_attributes = array();
/** /**
* Attribute definition: Overwrites base class. * Attribute definition: Overwrites base class.
* *
* @var array * @var array
* @see Smarty_Internal_CompileBase * @see Smarty_Internal_CompileBase
*/ */
public $optional_attributes = array('_any'); public $optional_attributes = array('_any');
/** /**
* Compiles code for the execution of function plugin * Compiles code for the execution of function plugin
* *
* @param array $args array with attributes from parser * @param array $args array with attributes from parser
* @param object $compiler compiler object * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
* @param array $parameter array with compilation parameter * @param array $parameter array with compilation parameter
* @param string $tag name of function plugin * @param string $tag name of function plugin
* @param string $function PHP function name * @param string $function PHP function name
* @return string compiled code *
*/ * @return string compiled code
public function compile($args, $compiler, $parameter, $tag, $function) * @throws \SmartyCompilerException
{ * @throws \SmartyException
// This tag does create output */
$compiler->has_output = true; public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter, $tag, $function)
{
// check and get attributes // check and get attributes
$_attr = $this->getAttributes($compiler, $args); $_attr = $this->getAttributes($compiler, $args);
if ($_attr['nocache'] === true) { unset($_attr[ 'nocache' ]);
$compiler->tag_nocache = true; // convert attributes into parameter array string
} $_paramsArray = array();
unset($_attr['nocache']); foreach ($_attr as $_key => $_value) {
// convert attributes into parameter array string if (is_int($_key)) {
$_paramsArray = array(); $_paramsArray[] = "$_key=>$_value";
foreach ($_attr as $_key => $_value) { } else {
if (is_int($_key)) { $_paramsArray[] = "'$_key'=>$_value";
$_paramsArray[] = "$_key=>$_value"; }
} else { }
$_paramsArray[] = "'$_key'=>$_value"; $_params = 'array(' . implode(',', $_paramsArray) . ')';
} // compile code
} $output = "{$function}({$_params},\$_smarty_tpl)";
$_params = 'array(' . implode(",", $_paramsArray) . ')'; if (!empty($parameter[ 'modifierlist' ])) {
// compile code $output = $compiler->compileTag(
$output = "<?php echo {$function}({$_params},\$_smarty_tpl);?>\n"; 'private_modifier',
return $output; array(),
} array(
'modifierlist' => $parameter[ 'modifierlist' ],
} 'value' => $output
)
?> );
}
$output = "<?php echo {$output};?>\n";
return $output;
}
}

View file

@ -1,140 +1,158 @@
<?php <?php
/**
/** * Smarty Internal Plugin Compile Modifier
* Smarty Internal Plugin Compile Modifier * Compiles code for modifier execution
* *
* Compiles code for modifier execution * @package Smarty
* * @subpackage Compiler
* @package Smarty * @author Uwe Tews
* @subpackage Compiler */
* @author Uwe Tews
*/ /**
* Smarty Internal Plugin Compile Modifier Class
/** *
* Smarty Internal Plugin Compile Modifier Class * @package Smarty
* * @subpackage Compiler
* @package Smarty */
* @subpackage Compiler class Smarty_Internal_Compile_Private_Modifier extends Smarty_Internal_CompileBase
*/ {
class Smarty_Internal_Compile_Private_Modifier extends Smarty_Internal_CompileBase { /**
* Compiles code for modifier execution
/** *
* Compiles code for modifier execution * @param array $args array with attributes from parser
* * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
* @param array $args array with attributes from parser * @param array $parameter array with compilation parameter
* @param object $compiler compiler object *
* @param array $parameter array with compilation parameter * @return string compiled code
* @return string compiled code * @throws \SmartyCompilerException
*/ * @throws \SmartyException
public function compile($args, $compiler, $parameter) { */
// check and get attributes public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
$_attr = $this->getAttributes($compiler, $args); {
$output = $parameter['value']; // check and get attributes
// loop over list of modifiers $_attr = $this->getAttributes($compiler, $args);
foreach ($parameter['modifierlist'] as $single_modifier) { $output = $parameter[ 'value' ];
$modifier = $single_modifier[0]; // loop over list of modifiers
$single_modifier[0] = $output; foreach ($parameter[ 'modifierlist' ] as $single_modifier) {
$params = implode(',', $single_modifier); /* @var string $modifier */
// check if we know already the type of modifier $modifier = $single_modifier[ 0 ];
if (isset($compiler->known_modifier_type[$modifier])) { $single_modifier[ 0 ] = $output;
$modifier_types = array($compiler->known_modifier_type[$modifier]); $params = implode(',', $single_modifier);
} else { // check if we know already the type of modifier
$modifier_types = array(1, 2, 3, 4, 5, 6); if (isset($compiler->known_modifier_type[ $modifier ])) {
} $modifier_types = array($compiler->known_modifier_type[ $modifier ]);
foreach ($modifier_types as $type) { } else {
switch ($type) { $modifier_types = array(1, 2, 3, 4, 5, 6);
case 1: }
// registered modifier foreach ($modifier_types as $type) {
if (isset($compiler->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][$modifier])) { switch ($type) {
$function = $compiler->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][$modifier][0]; case 1:
if (!is_array($function)) { // registered modifier
$output = "{$function}({$params})"; if (isset($compiler->smarty->registered_plugins[ Smarty::PLUGIN_MODIFIER ][ $modifier ])) {
} else { if (is_callable($compiler->smarty->registered_plugins[ Smarty::PLUGIN_MODIFIER ][ $modifier ][ 0 ])) {
if (is_object($function[0])) { $output =
$output = '$_smarty_tpl->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][\'' . $modifier . '\'][0][0]->' . $function[1] . '(' . $params . ')'; sprintf(
} else { 'call_user_func_array($_smarty_tpl->registered_plugins[ \'%s\' ][ %s ][ 0 ], array( %s ))',
$output = $function[0] . '::' . $function[1] . '(' . $params . ')'; Smarty::PLUGIN_MODIFIER,
} var_export($modifier, true),
} $params
$compiler->known_modifier_type[$modifier] = $type; );
break 2; $compiler->known_modifier_type[ $modifier ] = $type;
} break 2;
break; }
case 2: }
// registered modifier compiler break;
if (isset($compiler->smarty->registered_plugins[Smarty::PLUGIN_MODIFIERCOMPILER][$modifier][0])) { case 2:
$output = call_user_func($compiler->smarty->registered_plugins[Smarty::PLUGIN_MODIFIERCOMPILER][$modifier][0], $single_modifier, $compiler->smarty); // registered modifier compiler
$compiler->known_modifier_type[$modifier] = $type; if (isset($compiler->smarty->registered_plugins[ Smarty::PLUGIN_MODIFIERCOMPILER ][ $modifier ][ 0 ])) {
break 2; $output =
} call_user_func(
break; $compiler->smarty->registered_plugins[ Smarty::PLUGIN_MODIFIERCOMPILER ][ $modifier ][ 0 ],
case 3: $single_modifier,
// modifiercompiler plugin $compiler->smarty
if ($compiler->smarty->loadPlugin('smarty_modifiercompiler_' . $modifier)) { );
// check if modifier allowed $compiler->known_modifier_type[ $modifier ] = $type;
if (!is_object($compiler->smarty->security_policy) || $compiler->smarty->security_policy->isTrustedModifier($modifier, $compiler)) { break 2;
$plugin = 'smarty_modifiercompiler_' . $modifier; }
$output = $plugin($single_modifier, $compiler); break;
} case 3:
$compiler->known_modifier_type[$modifier] = $type; // modifiercompiler plugin
break 2; if ($compiler->smarty->loadPlugin('smarty_modifiercompiler_' . $modifier)) {
} // check if modifier allowed
break; if (!is_object($compiler->smarty->security_policy)
case 4: || $compiler->smarty->security_policy->isTrustedModifier($modifier, $compiler)
// modifier plugin ) {
if ($function = $compiler->getPlugin($modifier, Smarty::PLUGIN_MODIFIER)) { $plugin = 'smarty_modifiercompiler_' . $modifier;
// check if modifier allowed $output = $plugin($single_modifier, $compiler);
if (!is_object($compiler->smarty->security_policy) || $compiler->smarty->security_policy->isTrustedModifier($modifier, $compiler)) { }
$output = "{$function}({$params})"; $compiler->known_modifier_type[ $modifier ] = $type;
} break 2;
$compiler->known_modifier_type[$modifier] = $type; }
break 2; break;
} case 4:
break; // modifier plugin
case 5: if ($function = $compiler->getPlugin($modifier, Smarty::PLUGIN_MODIFIER)) {
// PHP function // check if modifier allowed
if (is_callable($modifier)) { if (!is_object($compiler->smarty->security_policy)
// check if modifier allowed || $compiler->smarty->security_policy->isTrustedModifier($modifier, $compiler)
if (!is_object($compiler->smarty->security_policy) || $compiler->smarty->security_policy->isTrustedPhpModifier($modifier, $compiler)) { ) {
$output = "{$modifier}({$params})"; $output = "{$function}({$params})";
} }
$compiler->known_modifier_type[$modifier] = $type; $compiler->known_modifier_type[ $modifier ] = $type;
break 2; break 2;
} }
break; break;
case 6: case 5:
// default plugin handler // PHP function
if (isset($compiler->default_handler_plugins[Smarty::PLUGIN_MODIFIER][$modifier]) || (is_callable($compiler->smarty->default_plugin_handler_func) && $compiler->getPluginFromDefaultHandler($modifier, Smarty::PLUGIN_MODIFIER))) { if (is_callable($modifier)) {
$function = $compiler->default_handler_plugins[Smarty::PLUGIN_MODIFIER][$modifier][0]; // check if modifier allowed
// check if modifier allowed if (!is_object($compiler->smarty->security_policy)
if (!is_object($compiler->smarty->security_policy) || $compiler->smarty->security_policy->isTrustedModifier($modifier, $compiler)) { || $compiler->smarty->security_policy->isTrustedPhpModifier($modifier, $compiler)
if (!is_array($function)) { ) {
$output = "{$function}({$params})"; $output = "{$modifier}({$params})";
} else { }
if (is_object($function[0])) { $compiler->known_modifier_type[ $modifier ] = $type;
$output = '$_smarty_tpl->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][\'' . $modifier . '\'][0][0]->' . $function[1] . '(' . $params . ')'; break 2;
} else { }
$output = $function[0] . '::' . $function[1] . '(' . $params . ')'; break;
} case 6:
} // default plugin handler
} if (isset($compiler->default_handler_plugins[ Smarty::PLUGIN_MODIFIER ][ $modifier ])
if (isset($compiler->template->required_plugins['nocache'][$modifier][Smarty::PLUGIN_MODIFIER]['file']) || isset($compiler->template->required_plugins['compiled'][$modifier][Smarty::PLUGIN_MODIFIER]['file'])) { || (is_callable($compiler->smarty->default_plugin_handler_func)
// was a plugin && $compiler->getPluginFromDefaultHandler($modifier, Smarty::PLUGIN_MODIFIER))
$compiler->known_modifier_type[$modifier] = 4; ) {
} else { $function = $compiler->default_handler_plugins[ Smarty::PLUGIN_MODIFIER ][ $modifier ][ 0 ];
$compiler->known_modifier_type[$modifier] = $type; // check if modifier allowed
} if (!is_object($compiler->smarty->security_policy)
break 2; || $compiler->smarty->security_policy->isTrustedModifier($modifier, $compiler)
} ) {
} if (!is_array($function)) {
} $output = "{$function}({$params})";
if (!isset($compiler->known_modifier_type[$modifier])) { } else {
$compiler->trigger_template_error("unknown modifier \"" . $modifier . "\"", $compiler->lex->taglineno); if (is_object($function[ 0 ])) {
} $output = $function[ 0 ] . '->' . $function[ 1 ] . '(' . $params . ')';
} } else {
return $output; $output = $function[ 0 ] . '::' . $function[ 1 ] . '(' . $params . ')';
} }
}
} }
if (isset($compiler->required_plugins[ 'nocache' ][ $modifier ][ Smarty::PLUGIN_MODIFIER ][ 'file' ])
?> ||
isset($compiler->required_plugins[ 'compiled' ][ $modifier ][ Smarty::PLUGIN_MODIFIER ][ 'file' ])
) {
// was a plugin
$compiler->known_modifier_type[ $modifier ] = 4;
} else {
$compiler->known_modifier_type[ $modifier ] = $type;
}
break 2;
}
}
}
if (!isset($compiler->known_modifier_type[ $modifier ])) {
$compiler->trigger_template_error("unknown modifier '{$modifier}'", null, true);
}
}
return $output;
}
}

View file

@ -1,88 +1,42 @@
<?php <?php
/** /**
* Smarty Internal Plugin Compile Object Block Function * Smarty Internal Plugin Compile Object Block Function
* * Compiles code for registered objects as block function
* Compiles code for registered objects as block function *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler * @author Uwe Tews
* @author Uwe Tews */
*/
/**
/** * Smarty Internal Plugin Compile Object Block Function Class
* Smarty Internal Plugin Compile Object Block Function Class *
* * @package Smarty
* @package Smarty * @subpackage Compiler
* @subpackage Compiler */
*/ class Smarty_Internal_Compile_Private_Object_Block_Function extends Smarty_Internal_Compile_Private_Block_Plugin
class Smarty_Internal_Compile_Private_Object_Block_Function extends Smarty_Internal_CompileBase { {
/**
/** * Setup callback and parameter array
* Attribute definition: Overwrites base class. *
* * @param \Smarty_Internal_TemplateCompilerBase $compiler
* @var array * @param array $_attr attributes
* @see Smarty_Internal_CompileBase * @param string $tag
*/ * @param string $method
public $optional_attributes = array('_any'); *
* @return array
/** */
* Compiles code for the execution of block plugin public function setup(Smarty_Internal_TemplateCompilerBase $compiler, $_attr, $tag, $method)
* {
* @param array $args array with attributes from parser $_paramsArray = array();
* @param object $compiler compiler object foreach ($_attr as $_key => $_value) {
* @param array $parameter array with compilation parameter if (is_int($_key)) {
* @param string $tag name of block object $_paramsArray[] = "$_key=>$_value";
* @param string $method name of method to call } else {
* @return string compiled code $_paramsArray[] = "'$_key'=>$_value";
*/ }
public function compile($args, $compiler, $parameter, $tag, $method) }
{ $callback = array("\$_smarty_tpl->smarty->registered_objects['{$tag}'][0]", "->{$method}");
if (!isset($tag[5]) || substr($tag, -5) != 'close') { return array($callback, $_paramsArray, "array(\$_block_plugin{$this->nesting}, '{$method}')");
// opening tag of block plugin }
// check and get attributes }
$_attr = $this->getAttributes($compiler, $args);
if ($_attr['nocache'] === true) {
$compiler->tag_nocache = true;
}
unset($_attr['nocache']);
// convert attributes into parameter array string
$_paramsArray = array();
foreach ($_attr as $_key => $_value) {
if (is_int($_key)) {
$_paramsArray[] = "$_key=>$_value";
} else {
$_paramsArray[] = "'$_key'=>$_value";
}
}
$_params = 'array(' . implode(",", $_paramsArray) . ')';
$this->openTag($compiler, $tag . '->' . $method, array($_params, $compiler->nocache));
// maybe nocache because of nocache variables or nocache plugin
$compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
// compile code
$output = "<?php \$_smarty_tpl->smarty->_tag_stack[] = array('{$tag}->{$method}', {$_params}); \$_block_repeat=true; echo \$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$method}({$_params}, null, \$_smarty_tpl, \$_block_repeat);while (\$_block_repeat) { ob_start();?>";
} else {
$base_tag = substr($tag, 0, -5);
// must endblock be nocache?
if ($compiler->nocache) {
$compiler->tag_nocache = true;
}
// closing tag of block plugin, restore nocache
list($_params, $compiler->nocache) = $this->closeTag($compiler, $base_tag . '->' . $method);
// This tag does create output
$compiler->has_output = true;
// compile code
if (!isset($parameter['modifier_list'])) {
$mod_pre = $mod_post = '';
} else {
$mod_pre = ' ob_start(); ';
$mod_post = 'echo ' . $compiler->compileTag('private_modifier', array(), array('modifierlist' => $parameter['modifier_list'], 'value' => 'ob_get_clean()')) . ';';
}
$output = "<?php \$_block_content = ob_get_contents(); ob_end_clean(); \$_block_repeat=false;" . $mod_pre . " echo \$_smarty_tpl->smarty->registered_objects['{$base_tag}'][0]->{$method}({$_params}, \$_block_content, \$_smarty_tpl, \$_block_repeat); " . $mod_post . " } array_pop(\$_smarty_tpl->smarty->_tag_stack);?>";
}
return $output . "\n";
}
}
?>

Some files were not shown because too many files have changed in this diff Show more