forked from services/mlmmj-light-web-ecg
Working project
This commit is contained in:
42
add_list.php
Normal file
42
add_list.php
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
<?php
|
||||||
|
require("init.php");
|
||||||
|
$list_name = isset($_POST["list_name"]) ? $_POST["list_name"] : "";
|
||||||
|
|
||||||
|
if (!isset($_SESSION["auth"]) || $_SESSION["auth"] != 1)
|
||||||
|
{
|
||||||
|
// If not authenticated, then redirect to login page
|
||||||
|
header("Location: login.php");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !empty($list_name) )
|
||||||
|
{
|
||||||
|
$list_name = strtolower($list_name);
|
||||||
|
|
||||||
|
if ( preg_match("/[^a-z0-9_]/", $list_name) )
|
||||||
|
{
|
||||||
|
// List name must contain only english letters, digits and undercores
|
||||||
|
$_SESSION["error_code"] = 5;
|
||||||
|
header("Location: error.php");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( strlen($list_name) > 30 )
|
||||||
|
{
|
||||||
|
// List name must not be longer than 30 characters
|
||||||
|
$_SESSION["error_code"] = 6;
|
||||||
|
header("Location: error.php");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
$domain = $_SESSION["domain"];
|
||||||
|
shell_exec("cp -r misc/template_$language $lists_path/$domain/$list_name");
|
||||||
|
file_put_contents("$lists_path/$domain/$list_name/control/listaddress", "$list_name@$domain");
|
||||||
|
file_put_contents("$lists_path/$domain/$list_name/control/customheaders", "From: $list_name@$domain\nReply-To: $list_name@$domain\n");
|
||||||
|
file_put_contents("$lists_path/$domain/$list_name/control/prefix", "[$list_name]");
|
||||||
|
shell_exec("sed -i -e 's/_unsub_addr_/$list_name\+unsubscribe@$domain/g' $lists_path/$domain/$list_name/control/footer-*");
|
||||||
|
}
|
||||||
|
|
||||||
|
header("Location: index.php");
|
||||||
|
exit();
|
||||||
|
?>
|
||||||
40
del_list.php
Normal file
40
del_list.php
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
<?php
|
||||||
|
require("init.php");
|
||||||
|
$list_name = isset($_GET["list_name"]) ? $_GET["list_name"] : "";
|
||||||
|
$domain = $_SESSION["domain"];
|
||||||
|
|
||||||
|
// We do not print any error in the next three cases, because a legitimate
|
||||||
|
// user will never produce such results, even with disables javascript
|
||||||
|
if ( preg_match("/[^a-z0-9_]/", $list_name) )
|
||||||
|
{
|
||||||
|
header("Location: error.php");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( strlen($list_name) > 30 )
|
||||||
|
{
|
||||||
|
header("Location: error.php");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test list existence
|
||||||
|
if( !is_dir("$lists_path/$domain/$list_name") )
|
||||||
|
{
|
||||||
|
header("Location: error.php");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($_SESSION["auth"]) || $_SESSION["auth"] != 1)
|
||||||
|
{
|
||||||
|
// If not authenticated, then redirect to login page
|
||||||
|
header("Location: login.php");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!empty($list_name))
|
||||||
|
{
|
||||||
|
shell_exec("rm -rf $lists_path/$domain/$list_name");
|
||||||
|
header("Location: index.php");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
?>
|
||||||
65
delete.svg
Normal file
65
delete.svg
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
viewBox="0 -256 1408 1536"
|
||||||
|
id="svg3741"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.92.0 r"
|
||||||
|
width="1408"
|
||||||
|
height="1536"
|
||||||
|
sodipodi:docname="Trash_font_awesome.svg">
|
||||||
|
<metadata
|
||||||
|
id="metadata3751">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<defs
|
||||||
|
id="defs3749" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1003"
|
||||||
|
id="namedview3747"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="0.01625"
|
||||||
|
inkscape:cx="13337.422"
|
||||||
|
inkscape:cy="11498.459"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg3741"
|
||||||
|
fit-margin-top="0"
|
||||||
|
fit-margin-left="0"
|
||||||
|
fit-margin-right="0"
|
||||||
|
fit-margin-bottom="0" />
|
||||||
|
<g
|
||||||
|
transform="matrix(1,0,0,-1,0,1152)"
|
||||||
|
id="g3743"
|
||||||
|
style="fill:#0053ff;fill-opacity:1">
|
||||||
|
<path
|
||||||
|
d="M 512,800 V 224 q 0,-14 -9,-23 -9,-9 -23,-9 h -64 q -14,0 -23,9 -9,9 -9,23 v 576 q 0,14 9,23 9,9 23,9 h 64 q 14,0 23,-9 9,-9 9,-23 z m 256,0 V 224 q 0,-14 -9,-23 -9,-9 -23,-9 h -64 q -14,0 -23,9 -9,9 -9,23 v 576 q 0,14 9,23 9,9 23,9 h 64 q 14,0 23,-9 9,-9 9,-23 z m 256,0 V 224 q 0,-14 -9,-23 -9,-9 -23,-9 h -64 q -14,0 -23,9 -9,9 -9,23 v 576 q 0,14 9,23 9,9 23,9 h 64 q 14,0 23,-9 9,-9 9,-23 z M 1152,76 v 948 H 256 V 76 Q 256,54 263,35.5 270,17 277.5,8.5 285,0 288,0 h 832 q 3,0 10.5,8.5 7.5,8.5 14.5,27 7,18.5 7,40.5 z M 480,1152 h 448 l -48,117 q -7,9 -17,11 H 546 q -10,-2 -17,-11 z m 928,-32 v -64 q 0,-14 -9,-23 -9,-9 -23,-9 h -96 V 76 q 0,-83 -47,-143.5 -47,-60.5 -113,-60.5 H 288 q -66,0 -113,58.5 Q 128,-11 128,72 v 952 H 32 q -14,0 -23,9 -9,9 -9,23 v 64 q 0,14 9,23 9,9 23,9 h 309 l 70,167 q 15,37 54,63 39,26 79,26 h 320 q 40,0 79,-26 39,-26 54,-63 l 70,-167 h 309 q 14,0 23,-9 9,-9 9,-23 z"
|
||||||
|
id="path3745"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#0053ff;fill-opacity:1" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.7 KiB |
82
edit_list.php
Normal file
82
edit_list.php
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
<?php
|
||||||
|
require("init.php");
|
||||||
|
$list_name = isset($_GET["list_name"]) ? $_GET["list_name"] : "";
|
||||||
|
$domain = $_SESSION["domain"];
|
||||||
|
|
||||||
|
if (!isset($_SESSION["auth"]) || $_SESSION["auth"] != 1)
|
||||||
|
{
|
||||||
|
// If not authenticated, then redirect to login page
|
||||||
|
header("Location: login.php");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
// We do not print any error in the next three cases, because a legitimate
|
||||||
|
// user will never produce such results, even with disables javascript
|
||||||
|
if ( preg_match("/[^a-z0-9_]/", $list_name) )
|
||||||
|
{
|
||||||
|
header("Location: error.php");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( strlen($list_name) > 30 )
|
||||||
|
{
|
||||||
|
header("Location: error.php");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test list existence
|
||||||
|
if( !is_dir("$lists_path/$domain/$list_name") )
|
||||||
|
{
|
||||||
|
header("Location: error.php");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get a subscribers list
|
||||||
|
$subscribers = shell_exec("/usr/bin/mlmmj-list -L $lists_path/$domain/$list_name");
|
||||||
|
// Remove trailing empty symbols
|
||||||
|
$subscribers = trim($subscribers);
|
||||||
|
|
||||||
|
// Get a list type. There are three types of lists:
|
||||||
|
// a closed moderated list (0), a newslist (1) and a conference (2)
|
||||||
|
$list_type = file_get_contents("$lists_path/$domain/$list_name/list_type.txt");
|
||||||
|
$list_type = trim($list_type);
|
||||||
|
|
||||||
|
// Select current list in select html elemant
|
||||||
|
$list_type_selected = ["", "", ""];
|
||||||
|
$list_type_selected[$list_type] = "selected";
|
||||||
|
|
||||||
|
// Get a footer
|
||||||
|
$footer = file_get_contents("$lists_path/$domain/$list_name/control/footer-text");
|
||||||
|
$footer = trim($footer);
|
||||||
|
|
||||||
|
// News list do not has moderators file
|
||||||
|
if ($list_type !== "2")
|
||||||
|
{
|
||||||
|
// Get a moderators list
|
||||||
|
$moderators = file_get_contents("$lists_path/$domain/$list_name/control/moderators");
|
||||||
|
// Remove trailing empty symbols
|
||||||
|
$moderators = trim($moderators);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$moderators = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get a prefix
|
||||||
|
$prefix = file_get_contents("$lists_path/$domain/$list_name/control/prefix");
|
||||||
|
// Remove trailing empty symbols
|
||||||
|
$prefix = trim($prefix);
|
||||||
|
|
||||||
|
$notmetoo_checked = file_exists("$lists_path/$domain/$list_name/control/notmetoo") ? "checked" : "";
|
||||||
|
|
||||||
|
// Load page
|
||||||
|
$smarty->assign("subscribers", $subscribers);
|
||||||
|
$smarty->assign("list_name", $list_name);
|
||||||
|
$smarty->assign("domain", $domain);
|
||||||
|
$smarty->assign("list_type_selected", $list_type_selected);
|
||||||
|
$smarty->assign("footer", $footer);
|
||||||
|
$smarty->assign("moderators", $moderators);
|
||||||
|
$smarty->assign("prefix", $prefix);
|
||||||
|
$smarty->assign("notmetoo_checked", $notmetoo_checked);
|
||||||
|
$smarty->display("edit_list.tpl");
|
||||||
|
?>
|
||||||
7
error.php
Normal file
7
error.php
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?php
|
||||||
|
require("init.php");
|
||||||
|
$error_code = isset($_SESSION["error_code"]) ? $_SESSION["error_code"] : "";
|
||||||
|
unset($_SESSION["error_code"]);
|
||||||
|
$smarty->assign("error_code", $error_code);
|
||||||
|
$smarty->display("error.tpl");
|
||||||
|
?>
|
||||||
168
help.svg
Normal file
168
help.svg
Normal file
@@ -0,0 +1,168 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
height="443.88"
|
||||||
|
id="svg1825"
|
||||||
|
inkscape:version="0.92.0 r"
|
||||||
|
sodipodi:docname="help.svg"
|
||||||
|
sodipodi:version="0.32"
|
||||||
|
width="439.488"
|
||||||
|
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
||||||
|
inkscape:export-filename="/home/user/Desktop/ff.png"
|
||||||
|
inkscape:export-xdpi="40.54718"
|
||||||
|
inkscape:export-ydpi="40.54718"
|
||||||
|
version="1.1">
|
||||||
|
<metadata
|
||||||
|
id="metadata3">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:title></dc:title>
|
||||||
|
<dc:description>EPS converted from http://aiga.org</dc:description>
|
||||||
|
<dc:subject>
|
||||||
|
<rdf:Bag>
|
||||||
|
<rdf:li>symbol</rdf:li>
|
||||||
|
<rdf:li>mapsym</rdf:li>
|
||||||
|
</rdf:Bag>
|
||||||
|
</dc:subject>
|
||||||
|
<dc:publisher>
|
||||||
|
<cc:Agent
|
||||||
|
rdf:about="http://www.openclipart.org/">
|
||||||
|
<dc:title>Open Clip Art Library</dc:title>
|
||||||
|
</cc:Agent>
|
||||||
|
</dc:publisher>
|
||||||
|
<dc:creator>
|
||||||
|
<cc:Agent>
|
||||||
|
<dc:title>Jean-Victor Balin</dc:title>
|
||||||
|
</cc:Agent>
|
||||||
|
</dc:creator>
|
||||||
|
<dc:rights>
|
||||||
|
<cc:Agent>
|
||||||
|
<dc:title>Jean-Victor Balin</dc:title>
|
||||||
|
</cc:Agent>
|
||||||
|
</dc:rights>
|
||||||
|
<dc:date />
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<cc:license
|
||||||
|
rdf:resource="http://web.resource.org/cc/PublicDomain" />
|
||||||
|
<dc:language>en</dc:language>
|
||||||
|
</cc:Work>
|
||||||
|
<cc:License
|
||||||
|
rdf:about="http://web.resource.org/cc/PublicDomain">
|
||||||
|
<cc:permits
|
||||||
|
rdf:resource="http://web.resource.org/cc/Reproduction" />
|
||||||
|
<cc:permits
|
||||||
|
rdf:resource="http://web.resource.org/cc/Distribution" />
|
||||||
|
<cc:permits
|
||||||
|
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
|
||||||
|
</cc:License>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<sodipodi:namedview
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
id="base"
|
||||||
|
inkscape:current-layer="g1835"
|
||||||
|
inkscape:cx="10.020502"
|
||||||
|
inkscape:cy="189.28413"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-height="1003"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:zoom="0.43415836"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:window-maximized="1" />
|
||||||
|
<defs
|
||||||
|
id="defs1827">
|
||||||
|
<inkscape:perspective
|
||||||
|
sodipodi:type="inkscape:persp3d"
|
||||||
|
inkscape:vp_x="0 : 221.94 : 1"
|
||||||
|
inkscape:vp_y="0 : 1000 : 0"
|
||||||
|
inkscape:vp_z="439.48801 : 221.94 : 1"
|
||||||
|
inkscape:persp3d-origin="219.744 : 147.96 : 1"
|
||||||
|
id="perspective23" />
|
||||||
|
<marker
|
||||||
|
id="ArrowEnd"
|
||||||
|
markerHeight="3"
|
||||||
|
markerUnits="strokeWidth"
|
||||||
|
markerWidth="4"
|
||||||
|
orient="auto"
|
||||||
|
refX="0"
|
||||||
|
refY="5"
|
||||||
|
viewBox="0 0 10 10">
|
||||||
|
<path
|
||||||
|
d="M 0 0 L 10 5 L 0 10 z"
|
||||||
|
id="path1830" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
id="ArrowStart"
|
||||||
|
markerHeight="3"
|
||||||
|
markerUnits="strokeWidth"
|
||||||
|
markerWidth="4"
|
||||||
|
orient="auto"
|
||||||
|
refX="10"
|
||||||
|
refY="5"
|
||||||
|
viewBox="0 0 10 10">
|
||||||
|
<path
|
||||||
|
d="M 10 0 L 0 5 L 10 10 z"
|
||||||
|
id="path1833" />
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
id="g1835">
|
||||||
|
<g
|
||||||
|
id="g1837"
|
||||||
|
style="fill:#0053ff;fill-opacity:1">
|
||||||
|
<path
|
||||||
|
d="M 219.744 443.88C 341.103 443.88 439.488 344.51 439.488 221.94C 439.488 99.368 341.103 0 219.744 0C 98.387 0 0 99.368 0 221.94C 0 344.51 98.387 443.88 219.744 443.88z"
|
||||||
|
id="path1839"
|
||||||
|
style="stroke:none;fill:#0053ff;fill-opacity:1" />
|
||||||
|
<path
|
||||||
|
d="M 219.744 221.94"
|
||||||
|
id="path1841"
|
||||||
|
style="stroke:none;fill:#0053ff;fill-opacity:1" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g1843">
|
||||||
|
<path
|
||||||
|
d="M 219.744 392.714C 313.128 392.714 388.83 316.255 388.83 221.94C 388.83 127.623 313.128 51.166 219.744 51.166C 126.362 51.166 50.659 127.623 50.659 221.94C 50.659 316.255 126.362 392.714 219.744 392.714z"
|
||||||
|
id="path1845"
|
||||||
|
style="stroke:none; fill:#ffffff" />
|
||||||
|
<path
|
||||||
|
d="M 219.744 221.94"
|
||||||
|
id="path1847"
|
||||||
|
style="stroke:none; fill:#ffffff" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g1849"
|
||||||
|
style="fill:#0053ff;fill-opacity:1">
|
||||||
|
<path
|
||||||
|
d="M 196.963 300.274L 246.494 300.172L 246.494 261.69C 246.494 251.252 251.36 241.39 264.38 232.849C 277.399 224.312 313.744 206.988 313.744 161.44C 313.744 115.89 275.577 84.582 243.494 77.94C 211.416 71.298 176.659 75.668 151.994 102.69C 129.907 126.887 125.253 146.027 125.253 188.255L 174.744 188.255L 174.744 178.44C 174.744 155.939 177.347 132.186 209.494 125.69C 227.04 122.144 243.488 127.648 253.244 137.19C 264.404 148.102 264.494 172.69 246.711 184.933L 218.815 203.912C 202.543 214.35 196.963 225.971 196.963 243.051L 196.963 300.274z"
|
||||||
|
id="path1851"
|
||||||
|
style="stroke:none;fill:#0053ff;fill-opacity:1" />
|
||||||
|
<g
|
||||||
|
id="g1853"
|
||||||
|
style="fill:#0053ff;fill-opacity:1">
|
||||||
|
<path
|
||||||
|
d="M 196.638 370.692L 196.638 319.687L 246.85 319.687L 246.85 370.692L 196.638 370.692z"
|
||||||
|
id="path1855"
|
||||||
|
style="stroke:none;fill:#0053ff;fill-opacity:1" />
|
||||||
|
<path
|
||||||
|
d="M 221.744 345.19"
|
||||||
|
id="path1857"
|
||||||
|
style="stroke:none;fill:#0053ff;fill-opacity:1" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 5.6 KiB |
36
index.php
Normal file
36
index.php
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<?php
|
||||||
|
require("init.php");
|
||||||
|
|
||||||
|
if (!isset($_SESSION["auth"]) || $_SESSION["auth"] != 1)
|
||||||
|
{
|
||||||
|
// If not authenticated, then redirect to login page
|
||||||
|
header("Location: login.php");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
$domain = $_SESSION["domain"];
|
||||||
|
|
||||||
|
// Are there any lists?
|
||||||
|
if ( count( glob("$lists_path/$domain/*") ) !== 0 )
|
||||||
|
{
|
||||||
|
// Get all folders and tranform into array
|
||||||
|
$lists = explode("\n", shell_exec("cd $lists_path/$domain; ls -1d */ | cut -f1 -d'/'"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( isset($lists) )
|
||||||
|
{
|
||||||
|
// If the last string is empty then delete it
|
||||||
|
if ( end($lists) === "" )
|
||||||
|
{
|
||||||
|
array_pop($lists);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$lists = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
$smarty->assign("lists", $lists);
|
||||||
|
$smarty->assign("domain", $domain);
|
||||||
|
$smarty->display("index.tpl");
|
||||||
|
?>
|
||||||
23
init.php
Normal file
23
init.php
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
<?php
|
||||||
|
// Loading config
|
||||||
|
$config = file_get_contents("misc/config.txt");
|
||||||
|
preg_match("/lists_path[\s]*=[\s]*(.*)/", $config, $lists_path);
|
||||||
|
$lists_path = $lists_path[1];
|
||||||
|
preg_match("/web_path[\s]*=[\s]*(.*)/", $config, $web_path);
|
||||||
|
$web_path = $web_path[1];
|
||||||
|
preg_match("/web_url[\s]*=[\s]*(.*)/", $config, $web_url);
|
||||||
|
$web_url = $web_url[1];
|
||||||
|
preg_match("/language[\s]*=[\s]*(.*)/", $config, $language);
|
||||||
|
$language = $language[1];
|
||||||
|
|
||||||
|
// Initializing Smarty
|
||||||
|
require("misc/smarty_libs/Smarty.class.php");
|
||||||
|
$smarty = new Smarty();
|
||||||
|
|
||||||
|
$smarty->setTemplateDir("misc/smarty/templates_$language");
|
||||||
|
$smarty->setCompileDir("misc/smarty/templates_c");
|
||||||
|
$smarty->setCacheDir("misc/smarty/cache");
|
||||||
|
$smarty->setConfigDir("misc/smarty/configs");
|
||||||
|
|
||||||
|
session_start();
|
||||||
|
?>
|
||||||
74
login.php
Normal file
74
login.php
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
<?php
|
||||||
|
require("init.php");
|
||||||
|
$login_domain = isset($_POST["login_domain"]) ? $_POST["login_domain"] : "";
|
||||||
|
$login_pass = isset($_POST["login_pass"]) ? $_POST["login_pass"] : "";
|
||||||
|
|
||||||
|
// Convert to lower case
|
||||||
|
$login_domain = strtolower($login_domain);
|
||||||
|
|
||||||
|
if( !empty($login_domain) && !empty($login_pass) )
|
||||||
|
{
|
||||||
|
if ( preg_match("/[^a-z0-9\-\.]/", $login_domain) )
|
||||||
|
{
|
||||||
|
// Domain must contain only english letters, digits, hyphens and dots
|
||||||
|
$_SESSION["error_code"] = 1;
|
||||||
|
header("Location: error.php");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( preg_match("/[^A-Za-z0-9]/", $login_pass) )
|
||||||
|
{
|
||||||
|
// Password must contain only english letters and digits
|
||||||
|
$_SESSION["error_code"] = 2;
|
||||||
|
header("Location: error.php");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sha256 sum of entered password
|
||||||
|
$login_hash = hash("sha256", $login_pass);
|
||||||
|
|
||||||
|
$hashes = file_get_contents("$lists_path/passwords.txt");
|
||||||
|
preg_match("/^$login_domain:(.*).*/m", $hashes, $hash);
|
||||||
|
|
||||||
|
// Is there such domain?
|
||||||
|
if ( count($hash) == 0 )
|
||||||
|
{
|
||||||
|
preg_match("/^list\.$login_domain:(.*).*/m", $hashes, $hash);
|
||||||
|
// Maybe user omitted "list." prefix?
|
||||||
|
if ( count($hash) == 0 )
|
||||||
|
{
|
||||||
|
// No luck. Incorrect domain
|
||||||
|
$_SESSION["error_code"] = 4;
|
||||||
|
header("Location: error.php");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Yes, he omitted "list."
|
||||||
|
$login_domain = "list.$login_domain";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compare hashes
|
||||||
|
if($login_hash == $hash[1])
|
||||||
|
{
|
||||||
|
// Authentication successful - Set session
|
||||||
|
$_SESSION["auth"] = 1;
|
||||||
|
$_SESSION["domain"] = $login_domain;
|
||||||
|
header("Location: index.php");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Incorrect password
|
||||||
|
$_SESSION["error_code"] = 3;
|
||||||
|
header("Location: error.php");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// If no submission, display login form
|
||||||
|
$smarty->display("login.tpl");
|
||||||
|
}
|
||||||
|
?>
|
||||||
8
logout.php
Normal file
8
logout.php
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?php
|
||||||
|
require("init.php");
|
||||||
|
unset($_SESSION["domain"]);
|
||||||
|
unset($_SESSION["auth"]);
|
||||||
|
unset($_SESSION["error_code"]);
|
||||||
|
header("Location: index.php");
|
||||||
|
exit();
|
||||||
|
?>
|
||||||
1
misc/.htaccess
Normal file
1
misc/.htaccess
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Require all denied
|
||||||
40
misc/TODO.txt
Normal file
40
misc/TODO.txt
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
1. dkim, spf
|
||||||
|
|
||||||
|
init.sh:
|
||||||
|
1. mlmmj-footer-receive and footer compile
|
||||||
|
2. disable /etc/cron.d/mlmmj
|
||||||
|
4. Cron:
|
||||||
|
34 */2 * * * /root/bin/mlmmj.maintaince.sh 1>/dev/null 2>/dev/null
|
||||||
|
*/15 * * * * /root/bin/remove_frozen_bounces.sh > /dev/null 2>&1
|
||||||
|
5. Проверить, что в файлах /etc/mailname и /etc/hostname FQDN
|
||||||
|
6. Права доступа на templates устанавливать в init.sh, прочие права тоже допилить
|
||||||
|
8. AllowOverride All in /etc/apache2.conf <Directory /var/www/>
|
||||||
|
9. user mlmmj for apache and exim
|
||||||
|
|
||||||
|
Left this to better times:
|
||||||
|
1. Automatic installation of Let's Encrypt SSL;
|
||||||
|
2. Send letter to moderators when a letter has sent to all subscribers;
|
||||||
|
|
||||||
|
---------------------
|
||||||
|
testing:
|
||||||
|
0. moderated list:
|
||||||
|
- test@list.mlmmj.tk (mod) DISCARDED
|
||||||
|
- test@list.mlmmj.tk (sub) PASSED TO MODS
|
||||||
|
- test@list.mlmmj.tk (mod+sub) PASSED TO MODS
|
||||||
|
- test@list.mlmmj.tk (not sub) DISCARDED
|
||||||
|
- test+subscribe@list.mlmmj.tk (not sub) DISCARDED
|
||||||
|
- test+unsubscribe@list.mlmmj.tk (sub) CONFIRM + FAREWELL
|
||||||
|
|
||||||
|
1. news list:
|
||||||
|
- test@list.mlmmj.tk (mod) DISCARDED
|
||||||
|
- test@list.mlmmj.tk (sub) DISCARDED
|
||||||
|
- test@list.mlmmj.tk (mod+sub) PASSED TO MODS
|
||||||
|
- test@list.mlmmj.tk (not sub) DISCARDED
|
||||||
|
- test+subscribe@list.mlmmj.tk (not sub) CONFIRM + GREETING
|
||||||
|
- test+unsubscribe@list.mlmmj.tk (sub) CONFIRM + FAREWELL
|
||||||
|
|
||||||
|
2. conference list:
|
||||||
|
- test@list.mlmmj.tk (sub) PASSED
|
||||||
|
- test@list.mlmmj.tk (not sub) DISCARDED
|
||||||
|
- test+subscribe@list.mlmmj.tk (not sub) DISCARDED
|
||||||
|
- test+unsubscribe@list.mlmmj.tk (sub) CONFIRM + FAREWELL
|
||||||
4
misc/config.txt
Normal file
4
misc/config.txt
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
lists_path = /var/spool/mlmmj
|
||||||
|
web_path = /var/www/html
|
||||||
|
web_url = http://mlmmj.tk/
|
||||||
|
language = ru
|
||||||
16
misc/init.sh
Executable file
16
misc/init.sh
Executable file
@@ -0,0 +1,16 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$#" -ne 0 ]; then
|
||||||
|
echo "This script prepaire system for mlmmj-light-web installation."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
install mlmmj, apg, apache2, exim, php_mod, altermime
|
||||||
|
|
||||||
|
useradd -r -s /bin/false mlmmj
|
||||||
|
chown mlmmj:mlmmj -R /var/spool/mlmmj
|
||||||
|
chmod -R g+s /var/spool/mlmmj
|
||||||
|
chmod -R g+w /var/spool/mlmmj
|
||||||
|
#change apache user in /etc/apache2/envvars
|
||||||
|
#exim config and filter
|
||||||
|
#/usr/bin/mlmmj-amime-receive
|
||||||
42
misc/manage_domains.sh
Executable file
42
misc/manage_domains.sh
Executable file
@@ -0,0 +1,42 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
function load_config()
|
||||||
|
{
|
||||||
|
lists_path=$(cat config.txt | grep lists_path | sed 's/.*=//g' | sed 's/[[:blank:]]//g')
|
||||||
|
web_url=$(cat config.txt | grep web_url | sed 's/.*=//g' | sed 's/[[:blank:]]//g')
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ "$#" -ne 2 ]; then
|
||||||
|
echo "With this script you can create and delete domains for mailing lists."
|
||||||
|
echo
|
||||||
|
echo "Usage:"
|
||||||
|
echo "$0 add list.example.com"
|
||||||
|
echo "$0 del list.example.com"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
load_config
|
||||||
|
operation=$1
|
||||||
|
domain=$2
|
||||||
|
|
||||||
|
if [ "${operation}" = "add" ]; then
|
||||||
|
# password=$(apg -MCLN -m 12 -a 1 -n 1)
|
||||||
|
password="123"
|
||||||
|
hash=$(echo -n $password | sha256sum | head -c 64)
|
||||||
|
mkdir -p $lists_path/$domain
|
||||||
|
echo $domain:$hash >> $lists_path/passwords.txt
|
||||||
|
chown mlmmj:mlmmj -R $lists_path
|
||||||
|
echo -e "Domain: ${domain} \nPass: ${password}\nURL: ${web_url}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${operation}" = "del" ]; then
|
||||||
|
find_domain=$(sed -n "/^${domain}:.*/p" $lists_path/passwords.txt)
|
||||||
|
if [ -z "${find_domain}" ]; then
|
||||||
|
echo "ERROR: No such domain. Aborting."
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
sed -i -e "/^${domain}:.*/d" $lists_path/passwords.txt
|
||||||
|
rm -r $lists_path/$domain
|
||||||
|
echo -e "Domain $domain has deleted."
|
||||||
|
fi
|
||||||
|
fi
|
||||||
2100
misc/move/exim4.conf
Normal file
2100
misc/move/exim4.conf
Normal file
File diff suppressed because it is too large
Load Diff
2
misc/move/exim4.filter
Normal file
2
misc/move/exim4.filter
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
if $message_body contains "DISCARD_THIS_MAIL" and not error_message
|
||||||
|
then seen finish endif
|
||||||
14
misc/move/foot_filter/Makefile
Normal file
14
misc/move/foot_filter/Makefile
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
all: foot_filter
|
||||||
|
dev: tags splint foot_filter
|
||||||
|
.PHONY: splint clean clobber
|
||||||
|
tags: foot_filter.c
|
||||||
|
ctags --excmd=number '--regex-c=-/\*[[:blank:]]*tag:[[:blank:]]*([[:alnum:]_]+)-\1-' foot_filter.c
|
||||||
|
splint:
|
||||||
|
splint +unixlib -exitarg -initallelements foot_filter.c
|
||||||
|
foot_filter: foot_filter.c
|
||||||
|
gcc -Wall -g -o foot_filter foot_filter.c -O3
|
||||||
|
clean:
|
||||||
|
-rm tags
|
||||||
|
clobber: clean
|
||||||
|
-rm foot_filter
|
||||||
|
-rm test
|
||||||
BIN
misc/move/foot_filter/foot_filter
Executable file
BIN
misc/move/foot_filter/foot_filter
Executable file
Binary file not shown.
2685
misc/move/foot_filter/foot_filter.c
Normal file
2685
misc/move/foot_filter/foot_filter.c
Normal file
File diff suppressed because it is too large
Load Diff
8
misc/move/mlmmj-footer-receive
Executable file
8
misc/move/mlmmj-footer-receive
Executable file
@@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# mlmmj-footer-receive
|
||||||
|
#
|
||||||
|
# Adds the footer to incoming message
|
||||||
|
#
|
||||||
|
|
||||||
|
/usr/bin/foot_filter -P /$1/$2/control/footer-text -H /$1/$2/control/footer-html | /usr/bin/mlmmj-receive -F -L /$1/$2/
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
<?php
|
||||||
|
/* Smarty version 3.1.31, created on 2017-01-27 14:29:09
|
||||||
|
from "/var/www/html/smarty/templates_ru/error.tpl" */
|
||||||
|
|
||||||
|
/* @var Smarty_Internal_Template $_smarty_tpl */
|
||||||
|
if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
|
||||||
|
'version' => '3.1.31',
|
||||||
|
'unifunc' => 'content_588b2f056f0767_75452529',
|
||||||
|
'has_nocache_code' => false,
|
||||||
|
'file_dependency' =>
|
||||||
|
array (
|
||||||
|
'085c43aa609e2e11c05d0026471aaaa2a26be865' =>
|
||||||
|
array (
|
||||||
|
0 => '/var/www/html/smarty/templates_ru/error.tpl',
|
||||||
|
1 => 1485516367,
|
||||||
|
2 => 'file',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'includes' =>
|
||||||
|
array (
|
||||||
|
),
|
||||||
|
),false)) {
|
||||||
|
function content_588b2f056f0767_75452529 (Smarty_Internal_Template $_smarty_tpl) {
|
||||||
|
?>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" type="text/css" href="style.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="header">Сервис рассылок</div>
|
||||||
|
<div id="error">
|
||||||
|
<?php if ($_smarty_tpl->tpl_vars['error_code']->value == 1) {?>
|
||||||
|
Домен может содержать только латинские буквы, точки, дефисы и цифры.
|
||||||
|
<?php } elseif ($_smarty_tpl->tpl_vars['error_code']->value == 2) {?>
|
||||||
|
Пароль может содержать только латинские буквы и цифры.
|
||||||
|
<?php } elseif ($_smarty_tpl->tpl_vars['error_code']->value == 3) {?>
|
||||||
|
Неверный пароль.
|
||||||
|
<?php } elseif ($_smarty_tpl->tpl_vars['error_code']->value == 4) {?>
|
||||||
|
Такой домен не зарегистрирован.
|
||||||
|
<?php } elseif ($_smarty_tpl->tpl_vars['error_code']->value == 5) {?>
|
||||||
|
Название рассылки может содержать только латинские буквы, цифры и символы нижнего подчёркивания.
|
||||||
|
<?php } elseif ($_smarty_tpl->tpl_vars['error_code']->value == 6) {?>
|
||||||
|
Длина названия рассылки не может превышать 30-ти символов.
|
||||||
|
<?php } elseif ($_smarty_tpl->tpl_vars['error_code']->value == 7) {?>
|
||||||
|
Длина префикса не может превышать 128-ти символов.
|
||||||
|
<?php } elseif ($_smarty_tpl->tpl_vars['error_code']->value == 8) {?>
|
||||||
|
Длина подписи не может превышать 1024-ти символов.
|
||||||
|
<?php } elseif ($_smarty_tpl->tpl_vars['error_code']->value == 9) {?>
|
||||||
|
Среди подписчиков есть некорректный e-mail.
|
||||||
|
<?php } else { ?>
|
||||||
|
Неизвестная ошибка.
|
||||||
|
<?php }?>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
<?php }
|
||||||
|
}
|
||||||
@@ -0,0 +1,122 @@
|
|||||||
|
<?php
|
||||||
|
/* Smarty version 3.1.31, created on 2017-01-31 22:38:52
|
||||||
|
from "/var/www/html/misc/smarty/templates_en/index.tpl" */
|
||||||
|
|
||||||
|
/* @var Smarty_Internal_Template $_smarty_tpl */
|
||||||
|
if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
|
||||||
|
'version' => '3.1.31',
|
||||||
|
'unifunc' => 'content_5890e7cc706e70_54046020',
|
||||||
|
'has_nocache_code' => false,
|
||||||
|
'file_dependency' =>
|
||||||
|
array (
|
||||||
|
'0b36f150fb6660b8982bed805054bb093a12538d' =>
|
||||||
|
array (
|
||||||
|
0 => '/var/www/html/misc/smarty/templates_en/index.tpl',
|
||||||
|
1 => 1485850802,
|
||||||
|
2 => 'file',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'includes' =>
|
||||||
|
array (
|
||||||
|
),
|
||||||
|
),false)) {
|
||||||
|
function content_5890e7cc706e70_54046020 (Smarty_Internal_Template $_smarty_tpl) {
|
||||||
|
?>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" type="text/css" href="style.css">
|
||||||
|
<?php echo '<script'; ?>
|
||||||
|
>
|
||||||
|
function validate_form()
|
||||||
|
{
|
||||||
|
var name = document.getElementById('add_list_input').value;
|
||||||
|
var name = name.toLowerCase();
|
||||||
|
|
||||||
|
if (name == "")
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name.length > 30)
|
||||||
|
{
|
||||||
|
alert("Название списка рассылки должно содержать не более 30-ти символов.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( name.match(/[^a-z0-9_]/) )
|
||||||
|
{
|
||||||
|
alert("Название списка рассылки может содержать только латинские буквы, цифры и символы нижнего подчёркивания.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function confirm_delete()
|
||||||
|
{
|
||||||
|
return confirm("Вы действительно хотите удалить список рассылки?");
|
||||||
|
}
|
||||||
|
<?php echo '</script'; ?>
|
||||||
|
>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="header">
|
||||||
|
<div id="header_left">
|
||||||
|
Сервис рассылок
|
||||||
|
</div>
|
||||||
|
<div id="header_right">
|
||||||
|
<a href="logout.php">Выйти</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="breadcrumbs"><?php echo $_smarty_tpl->tpl_vars['domain']->value;?>
|
||||||
|
</div>
|
||||||
|
<div id="index">
|
||||||
|
<div id="lists_header">
|
||||||
|
<b>Все листы рассылок:</b>
|
||||||
|
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_add_list">
|
||||||
|
Добавляйте и удаляйте списки рассыки с помощью данной формы. Вы можете редактировать список, кликнув по его названию.
|
||||||
|
Письмо в рассылку отправляется на адрес example@<?php echo $_smarty_tpl->tpl_vars['domain']->value;?>
|
||||||
|
, где example – имя рассылки.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<table id="lists">
|
||||||
|
<?php
|
||||||
|
$_from = $_smarty_tpl->smarty->ext->_foreach->init($_smarty_tpl, $_smarty_tpl->tpl_vars['lists']->value, 'list');
|
||||||
|
if ($_from !== null) {
|
||||||
|
foreach ($_from as $_smarty_tpl->tpl_vars['list']->value) {
|
||||||
|
?>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
•
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a href="edit_list.php?list_name=<?php echo $_smarty_tpl->tpl_vars['list']->value;?>
|
||||||
|
"><?php echo $_smarty_tpl->tpl_vars['list']->value;?>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a href="del_list.php?list_name=<?php echo $_smarty_tpl->tpl_vars['list']->value;?>
|
||||||
|
" onclick="return confirm_delete()"><img src="delete.svg" width=15></a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$_smarty_tpl->smarty->ext->_foreach->restore($_smarty_tpl, 1);
|
||||||
|
?>
|
||||||
|
|
||||||
|
</table>
|
||||||
|
<form method="post" action="add_list.php" onsubmit="return validate_form()">
|
||||||
|
<div id="add_list">
|
||||||
|
<input type="text" name="list_name" id="add_list_input">
|
||||||
|
|
||||||
|
<input type="submit" name="submit" value="Добавить" id="add_list_button">
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
<?php }
|
||||||
|
}
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
<?php
|
||||||
|
/* Smarty version 3.1.31, created on 2017-01-09 20:24:19
|
||||||
|
from "/var/www/html/smarty/templates/edit_list.tpl" */
|
||||||
|
|
||||||
|
/* @var Smarty_Internal_Template $_smarty_tpl */
|
||||||
|
if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
|
||||||
|
'version' => '3.1.31',
|
||||||
|
'unifunc' => 'content_5873c743903c86_86143891',
|
||||||
|
'has_nocache_code' => false,
|
||||||
|
'file_dependency' =>
|
||||||
|
array (
|
||||||
|
'33a0e2a90d50b199feaa83030d7da2c9680cee0a' =>
|
||||||
|
array (
|
||||||
|
0 => '/var/www/html/smarty/templates/edit_list.tpl',
|
||||||
|
1 => 1483982647,
|
||||||
|
2 => 'file',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'includes' =>
|
||||||
|
array (
|
||||||
|
),
|
||||||
|
),false)) {
|
||||||
|
function content_5873c743903c86_86143891 (Smarty_Internal_Template $_smarty_tpl) {
|
||||||
|
?>
|
||||||
|
<html>
|
||||||
|
<head></head>
|
||||||
|
<body>
|
||||||
|
<center>
|
||||||
|
<form method="post" action="save_list.php">
|
||||||
|
<input type="hidden" name="list_name" value="<?php echo $_smarty_tpl->tpl_vars['list_name']->value;?>
|
||||||
|
">
|
||||||
|
Список подписчиков:
|
||||||
|
<p />
|
||||||
|
<textarea rows="20" cols="30" name="new_subscribers"><?php echo $_smarty_tpl->tpl_vars['subscribers']->value;?>
|
||||||
|
</textarea>
|
||||||
|
<p />
|
||||||
|
<!-- Владелец рассылки: <input type="text" name="list_owner" value="<?php echo $_smarty_tpl->tpl_vars['list_owner']->value;?>
|
||||||
|
">
|
||||||
|
<p /> -->
|
||||||
|
Тип рассылки:
|
||||||
|
<select name="list_type">
|
||||||
|
<option value="0" <?php echo $_smarty_tpl->tpl_vars['list_type_selected']->value[0];?>
|
||||||
|
>Закрытая модерируемая рассылка</option>
|
||||||
|
<option value="1" <?php echo $_smarty_tpl->tpl_vars['list_type_selected']->value[1];?>
|
||||||
|
>Новостная рассылка</option>
|
||||||
|
<option value="2" <?php echo $_smarty_tpl->tpl_vars['list_type_selected']->value[2];?>
|
||||||
|
>Конференция</option>
|
||||||
|
</select>
|
||||||
|
<p />
|
||||||
|
Подпись:
|
||||||
|
<p />
|
||||||
|
<textarea rows="5" cols="30" name="footer"><?php echo $_smarty_tpl->tpl_vars['footer']->value;?>
|
||||||
|
</textarea>
|
||||||
|
<p />
|
||||||
|
Список модераторов:
|
||||||
|
<p />
|
||||||
|
<textarea rows="20" cols="30" name="moderators"><?php echo $_smarty_tpl->tpl_vars['moderators']->value;?>
|
||||||
|
</textarea>
|
||||||
|
<p />
|
||||||
|
Префикс:
|
||||||
|
<input type="text" name="prefix" value="<?php echo $_smarty_tpl->tpl_vars['prefix']->value;?>
|
||||||
|
">
|
||||||
|
<p />
|
||||||
|
<input type="submit" name="submit" value="Сохранить">
|
||||||
|
</form>
|
||||||
|
</center>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
<?php }
|
||||||
|
}
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
<?php
|
||||||
|
/* Smarty version 3.1.31, created on 2017-01-29 21:59:47
|
||||||
|
from "/var/www/html/misc/smarty/templates_ru/login.tpl" */
|
||||||
|
|
||||||
|
/* @var Smarty_Internal_Template $_smarty_tpl */
|
||||||
|
if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
|
||||||
|
'version' => '3.1.31',
|
||||||
|
'unifunc' => 'content_588e3ba3c46a98_78970628',
|
||||||
|
'has_nocache_code' => false,
|
||||||
|
'file_dependency' =>
|
||||||
|
array (
|
||||||
|
'53d7e28d1426936f3a3d534fc6fbcdf5d2e8c239' =>
|
||||||
|
array (
|
||||||
|
0 => '/var/www/html/misc/smarty/templates_ru/login.tpl',
|
||||||
|
1 => 1485716381,
|
||||||
|
2 => 'file',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'includes' =>
|
||||||
|
array (
|
||||||
|
),
|
||||||
|
),false)) {
|
||||||
|
function content_588e3ba3c46a98_78970628 (Smarty_Internal_Template $_smarty_tpl) {
|
||||||
|
?>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" type="text/css" href="style.css">
|
||||||
|
<?php echo '<script'; ?>
|
||||||
|
>
|
||||||
|
function validate_form()
|
||||||
|
{
|
||||||
|
var domain = document.getElementById('domain_input').value;
|
||||||
|
var password = document.getElementById('password_input').value;
|
||||||
|
|
||||||
|
if (domain == "")
|
||||||
|
{
|
||||||
|
alert("Введите домен.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (password == "")
|
||||||
|
{
|
||||||
|
alert("Введите пароль.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( domain.match(/[^A-Za-z0-9\-\.]/) )
|
||||||
|
{
|
||||||
|
alert("Домен может содержать только латинские буквы, цифры, точки и дефисы.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( password.match(/[^A-Za-z0-9]/) )
|
||||||
|
{
|
||||||
|
alert("Пароль может содержать только латинские буквы и цифры.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
<?php echo '</script'; ?>
|
||||||
|
>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="header">Сервис рассылок</div>
|
||||||
|
<div id="login">
|
||||||
|
<div id="login_form">
|
||||||
|
<form method="post" action="login.php" onsubmit="return validate_form()">
|
||||||
|
<div id="domain">
|
||||||
|
<div id="domain_left">
|
||||||
|
Домен:
|
||||||
|
</div>
|
||||||
|
<div id="domain_right">
|
||||||
|
<input type="text" name="login_domain" id="domain_input">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="password">
|
||||||
|
<div id="password_left">
|
||||||
|
Пароль:
|
||||||
|
</div>
|
||||||
|
<div id="password_right">
|
||||||
|
<input type="password" name="login_pass" id="password_input">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="enter">
|
||||||
|
<input type="submit" name="submit" value="Войти">
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
<?php }
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
<?php
|
||||||
|
/* Smarty version 3.1.31, created on 2017-01-02 06:50:44
|
||||||
|
from "/var/www/html/smarty/templates/index.tpl" */
|
||||||
|
|
||||||
|
/* @var Smarty_Internal_Template $_smarty_tpl */
|
||||||
|
if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
|
||||||
|
'version' => '3.1.31',
|
||||||
|
'unifunc' => 'content_5869ce142bdbc4_61874071',
|
||||||
|
'has_nocache_code' => false,
|
||||||
|
'file_dependency' =>
|
||||||
|
array (
|
||||||
|
'569f7c9bad1e95dec6a51c7c51b98d4db367f54c' =>
|
||||||
|
array (
|
||||||
|
0 => '/var/www/html/smarty/templates/index.tpl',
|
||||||
|
1 => 1483329013,
|
||||||
|
2 => 'file',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'includes' =>
|
||||||
|
array (
|
||||||
|
),
|
||||||
|
),false)) {
|
||||||
|
function content_5869ce142bdbc4_61874071 (Smarty_Internal_Template $_smarty_tpl) {
|
||||||
|
?>
|
||||||
|
<html>
|
||||||
|
<head></head>
|
||||||
|
<body>
|
||||||
|
<center>
|
||||||
|
<h1>Список рассылок:</h1>
|
||||||
|
<?php
|
||||||
|
$_from = $_smarty_tpl->smarty->ext->_foreach->init($_smarty_tpl, $_smarty_tpl->tpl_vars['lists']->value, 'list');
|
||||||
|
if ($_from !== null) {
|
||||||
|
foreach ($_from as $_smarty_tpl->tpl_vars['list']->value) {
|
||||||
|
?>
|
||||||
|
<a href="edit_list.php?list_name=<?php echo $_smarty_tpl->tpl_vars['list']->value;?>
|
||||||
|
"><?php echo $_smarty_tpl->tpl_vars['list']->value;?>
|
||||||
|
</a> [<a href="del_list.php?list_name=<?php echo $_smarty_tpl->tpl_vars['list']->value;?>
|
||||||
|
">Удалить</a>]<br>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$_smarty_tpl->smarty->ext->_foreach->restore($_smarty_tpl, 1);
|
||||||
|
?>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
<form method="post" action="add_list.php">
|
||||||
|
Имя рассылки: <input type="text" name="list_name"> <input type="submit" name="submit" value="Добавить">
|
||||||
|
</form>
|
||||||
|
</center>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
<?php }
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
<?php
|
||||||
|
/* Smarty version 3.1.31, created on 2017-01-02 07:32:17
|
||||||
|
from "/var/www/html/smarty/templates/login.tpl" */
|
||||||
|
|
||||||
|
/* @var Smarty_Internal_Template $_smarty_tpl */
|
||||||
|
if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
|
||||||
|
'version' => '3.1.31',
|
||||||
|
'unifunc' => 'content_5869d7d16e2888_57689057',
|
||||||
|
'has_nocache_code' => false,
|
||||||
|
'file_dependency' =>
|
||||||
|
array (
|
||||||
|
'617b12a6bfb47e737ab55bf29207ecb92147b506' =>
|
||||||
|
array (
|
||||||
|
0 => '/var/www/html/smarty/templates/login.tpl',
|
||||||
|
1 => 1483329039,
|
||||||
|
2 => 'file',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'includes' =>
|
||||||
|
array (
|
||||||
|
),
|
||||||
|
),false)) {
|
||||||
|
function content_5869d7d16e2888_57689057 (Smarty_Internal_Template $_smarty_tpl) {
|
||||||
|
?>
|
||||||
|
<html>
|
||||||
|
<head></head>
|
||||||
|
<body>
|
||||||
|
<center>
|
||||||
|
<form method="post" action="login.php">
|
||||||
|
Домен: <input type="text" name="login_domain">
|
||||||
|
<p />
|
||||||
|
Пароль: <input type="password" name="login_pass">
|
||||||
|
<p />
|
||||||
|
<input type="submit" name="submit" value="Войти">
|
||||||
|
</form>
|
||||||
|
</center>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
<?php }
|
||||||
|
}
|
||||||
@@ -0,0 +1,118 @@
|
|||||||
|
<?php
|
||||||
|
/* Smarty version 3.1.31, created on 2017-01-25 20:58:10
|
||||||
|
from "/var/www/html/smarty/templates_ru/index.tpl" */
|
||||||
|
|
||||||
|
/* @var Smarty_Internal_Template $_smarty_tpl */
|
||||||
|
if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
|
||||||
|
'version' => '3.1.31',
|
||||||
|
'unifunc' => 'content_5888e7322dafc3_21846058',
|
||||||
|
'has_nocache_code' => false,
|
||||||
|
'file_dependency' =>
|
||||||
|
array (
|
||||||
|
'6820e2ed7eda3869d8307c28df0b8fa212af00dd' =>
|
||||||
|
array (
|
||||||
|
0 => '/var/www/html/smarty/templates_ru/index.tpl',
|
||||||
|
1 => 1485367020,
|
||||||
|
2 => 'file',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'includes' =>
|
||||||
|
array (
|
||||||
|
),
|
||||||
|
),false)) {
|
||||||
|
function content_5888e7322dafc3_21846058 (Smarty_Internal_Template $_smarty_tpl) {
|
||||||
|
?>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" type="text/css" href="style.css">
|
||||||
|
<?php echo '<script'; ?>
|
||||||
|
>
|
||||||
|
function validate_form()
|
||||||
|
{
|
||||||
|
var name = document.getElementById('add_list_input').value;
|
||||||
|
var name = name.toLowerCase();
|
||||||
|
|
||||||
|
if (name == "")
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name.length > 30)
|
||||||
|
{
|
||||||
|
alert("Название списка рассылки должно содержать не более 30-ти символов.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( name.match(/[^a-z0-9_]/) )
|
||||||
|
{
|
||||||
|
alert("Название списка рассылки может содержать только латинские буквы, цифры и символы нижнего подчёркивания.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
<?php echo '</script'; ?>
|
||||||
|
>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="header">
|
||||||
|
<div id="header_left">
|
||||||
|
Сервис рассылок
|
||||||
|
</div>
|
||||||
|
<div id="header_right">
|
||||||
|
<a href="logout.php">Выйти</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="breadcrumbs"><?php echo $_smarty_tpl->tpl_vars['domain']->value;?>
|
||||||
|
</div>
|
||||||
|
<div id="index">
|
||||||
|
<div id="lists_header">
|
||||||
|
<b>Все листы рассылок:</b>
|
||||||
|
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_add_list">
|
||||||
|
Добавить новый лист рассылки можно введя его имя в поле ввода и нажав кнопку "Добавить".
|
||||||
|
Название может содержать до 30-ти латинских букв, цифр и символов нижнего подчёркивания.
|
||||||
|
Удаление листа рассылки производится с помощью пиктограммы в виде мусорной корзины.
|
||||||
|
Вы можете редактировать лист, кликнув по его названию.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<table id="lists">
|
||||||
|
<?php
|
||||||
|
$_from = $_smarty_tpl->smarty->ext->_foreach->init($_smarty_tpl, $_smarty_tpl->tpl_vars['lists']->value, 'list');
|
||||||
|
if ($_from !== null) {
|
||||||
|
foreach ($_from as $_smarty_tpl->tpl_vars['list']->value) {
|
||||||
|
?>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
•
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a href="edit_list.php?list_name=<?php echo $_smarty_tpl->tpl_vars['list']->value;?>
|
||||||
|
"><?php echo $_smarty_tpl->tpl_vars['list']->value;?>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a href="del_list.php?list_name=<?php echo $_smarty_tpl->tpl_vars['list']->value;?>
|
||||||
|
"><img src="delete.svg" width=15></a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$_smarty_tpl->smarty->ext->_foreach->restore($_smarty_tpl, 1);
|
||||||
|
?>
|
||||||
|
|
||||||
|
</table>
|
||||||
|
<form method="post" action="add_list.php" onsubmit="return validate_form()">
|
||||||
|
<div id="add_list">
|
||||||
|
<input type="text" name="list_name" id="add_list_input">
|
||||||
|
|
||||||
|
<input type="submit" name="submit" value="Добавить" id="add_list_button">
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
<?php }
|
||||||
|
}
|
||||||
@@ -0,0 +1,254 @@
|
|||||||
|
<?php
|
||||||
|
/* Smarty version 3.1.31, created on 2017-01-31 22:38:45
|
||||||
|
from "/var/www/html/misc/smarty/templates_en/edit_list.tpl" */
|
||||||
|
|
||||||
|
/* @var Smarty_Internal_Template $_smarty_tpl */
|
||||||
|
if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
|
||||||
|
'version' => '3.1.31',
|
||||||
|
'unifunc' => 'content_5890e7c59eb3e0_65385644',
|
||||||
|
'has_nocache_code' => false,
|
||||||
|
'file_dependency' =>
|
||||||
|
array (
|
||||||
|
'6a01fa4a4840b59937570aeacc80d159739f4ab1' =>
|
||||||
|
array (
|
||||||
|
0 => '/var/www/html/misc/smarty/templates_en/edit_list.tpl',
|
||||||
|
1 => 1485891494,
|
||||||
|
2 => 'file',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'includes' =>
|
||||||
|
array (
|
||||||
|
),
|
||||||
|
),false)) {
|
||||||
|
function content_5890e7c59eb3e0_65385644 (Smarty_Internal_Template $_smarty_tpl) {
|
||||||
|
?>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" type="text/css" href="style.css">
|
||||||
|
<?php echo '<script'; ?>
|
||||||
|
>
|
||||||
|
// Do not use Smarty here
|
||||||
|
function switch_moderators_form()
|
||||||
|
{
|
||||||
|
// Get a selected value
|
||||||
|
var select = document.getElementById("list_type");
|
||||||
|
var selected_value = select.options[select.selectedIndex].value;
|
||||||
|
|
||||||
|
// If selected conference list type, then disable moderators form
|
||||||
|
if (selected_value == "2")
|
||||||
|
{
|
||||||
|
document.getElementById("moderators").disabled = true;
|
||||||
|
document.getElementById("moderators_header").style.color = "#777777";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
document.getElementById("moderators").disabled = false;
|
||||||
|
document.getElementById("moderators_header").style.color = "#222222";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function validate_form()
|
||||||
|
{
|
||||||
|
var prefix = document.getElementById('prefix').value;
|
||||||
|
var footer = document.getElementById('footer').value;
|
||||||
|
var subscribers = document.getElementById('subscribers').value;
|
||||||
|
var moderators = document.getElementById('moderators').value;
|
||||||
|
|
||||||
|
// Regex for a valid e-mail
|
||||||
|
var re_email = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
|
||||||
|
|
||||||
|
// Transform subscribers and moderators into array
|
||||||
|
subscribers = subscribers.split("\n");
|
||||||
|
moderators = moderators.split("\n");
|
||||||
|
|
||||||
|
if (prefix.length > 128)
|
||||||
|
{
|
||||||
|
alert("A prefix length can not be longer than 128 characters.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (footer.length > 1024)
|
||||||
|
{
|
||||||
|
alert("A footer length can not be longer than 1024 characters.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(var i in subscribers)
|
||||||
|
{
|
||||||
|
if ( subscribers[i] != "" && !re_email.test(subscribers[i]) )
|
||||||
|
{
|
||||||
|
alert('Subscriber "' + subscribers[i] + '" (line #' + (parseFloat(i)+1) + ') have incorrect email.');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(var i in moderators)
|
||||||
|
{
|
||||||
|
if ( moderators[i] != "" && !re_email.test(moderators[i]) )
|
||||||
|
{
|
||||||
|
alert('Moderator "' + moderators[i] + '" (line #' + (parseFloat(i)+1) + ') have incorrect email.');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//
|
||||||
|
<?php echo '</script'; ?>
|
||||||
|
>
|
||||||
|
</head>
|
||||||
|
<body onload="switch_moderators_form()">
|
||||||
|
<div id="header">
|
||||||
|
<div id="header_left">
|
||||||
|
Mailing lists service
|
||||||
|
</div>
|
||||||
|
<div id="header_right">
|
||||||
|
<a href="logout.php">Log out</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="breadcrumbs">
|
||||||
|
<a href="index.php"><?php echo $_smarty_tpl->tpl_vars['domain']->value;?>
|
||||||
|
</a> / <?php echo $_smarty_tpl->tpl_vars['list_name']->value;?>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<form method="post" action="save_list.php" id="save_list" onsubmit="return validate_form()">
|
||||||
|
<div id="edit_page">
|
||||||
|
<input type="hidden" name="list_name" value="<?php echo $_smarty_tpl->tpl_vars['list_name']->value;?>
|
||||||
|
">
|
||||||
|
<div id="column_left">
|
||||||
|
<div id="subscribers_header">
|
||||||
|
Subscribers:
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_sub">
|
||||||
|
Please, provide one email per line. Do not forget add moderators if you
|
||||||
|
want them able to post into mailing list.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="subscribers_body">
|
||||||
|
<textarea name="subscribers" id="subscribers"><?php echo $_smarty_tpl->tpl_vars['subscribers']->value;?>
|
||||||
|
</textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="column_middle">
|
||||||
|
<div id="column_middle_inner">
|
||||||
|
<div id="table_div">
|
||||||
|
<table id="table_middle">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<div id="list_type_header">
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_list_type">
|
||||||
|
<b>Moderated list:</b> you assign subscribers and moderators. Messages will be
|
||||||
|
moderated before publishing.<br><br>
|
||||||
|
<b>News list:</b> everybody can subscribe without moderator confirmation by sending
|
||||||
|
an empty email to <?php echo $_smarty_tpl->tpl_vars['list_name']->value;?>
|
||||||
|
+subscribe@<?php echo $_smarty_tpl->tpl_vars['domain']->value;?>
|
||||||
|
. Messages into mailing list can
|
||||||
|
post only moderators.<br><br>
|
||||||
|
<b>Conference:</b> IRC channel analogue. You assign subscribers, every subscriber
|
||||||
|
can send messages without moderation.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
List type:
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<select name="list_type" id="list_type" onChange="switch_moderators_form()">
|
||||||
|
<option value="0" <?php echo $_smarty_tpl->tpl_vars['list_type_selected']->value[0];?>
|
||||||
|
>
|
||||||
|
Moderated list
|
||||||
|
</option>
|
||||||
|
<option value="1" <?php echo $_smarty_tpl->tpl_vars['list_type_selected']->value[1];?>
|
||||||
|
>
|
||||||
|
News list
|
||||||
|
</option>
|
||||||
|
<option value="2" <?php echo $_smarty_tpl->tpl_vars['list_type_selected']->value[2];?>
|
||||||
|
>
|
||||||
|
Conference
|
||||||
|
</option>
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<div id="prefix_header">
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_prefix">
|
||||||
|
Prefix added to the subject field of each message.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
Prefix:
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input type="text" name="prefix" value="<?php echo mb_convert_encoding(htmlspecialchars($_smarty_tpl->tpl_vars['prefix']->value, ENT_QUOTES, 'UTF-8', true), "HTML-ENTITIES", 'UTF-8');?>
|
||||||
|
" id="prefix">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<div id="footer_header">
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_footer">
|
||||||
|
Footer added to the body of each message.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
Footer:
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<textarea name="footer" id="footer"><?php echo $_smarty_tpl->tpl_vars['footer']->value;?>
|
||||||
|
</textarea>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td colspan="2">
|
||||||
|
<div id="notmetoo">
|
||||||
|
<div id="notmetoo_header">
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_notmetoo">
|
||||||
|
Sender of a post will be excluded from the distribution list for
|
||||||
|
that post so people don't receive copies of their own posts.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<input type="checkbox" id="notmetoo_checkbox" name="notmetoo" value="checked" <?php echo $_smarty_tpl->tpl_vars['notmetoo_checked']->value;?>
|
||||||
|
>
|
||||||
|
Do not send mails to yourself.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div id="save_btn">
|
||||||
|
<input type="submit" name="submit" value="Сохранить">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="column_right">
|
||||||
|
<div id="moderators_header">
|
||||||
|
Moderators:
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_mod">
|
||||||
|
In case of moderated list messages before publishing will be send to these
|
||||||
|
emails. In case of news list only these emails can post to mailing list.
|
||||||
|
In case of conference there are no moderators.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="moderators_body">
|
||||||
|
<textarea name="moderators" id="moderators"><?php echo $_smarty_tpl->tpl_vars['moderators']->value;?>
|
||||||
|
</textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
<?php }
|
||||||
|
}
|
||||||
@@ -0,0 +1,122 @@
|
|||||||
|
<?php
|
||||||
|
/* Smarty version 3.1.31, created on 2017-01-31 23:03:47
|
||||||
|
from "/var/www/html/misc/smarty/templates_ru/index.tpl" */
|
||||||
|
|
||||||
|
/* @var Smarty_Internal_Template $_smarty_tpl */
|
||||||
|
if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
|
||||||
|
'version' => '3.1.31',
|
||||||
|
'unifunc' => 'content_5890eda331cf62_87676770',
|
||||||
|
'has_nocache_code' => false,
|
||||||
|
'file_dependency' =>
|
||||||
|
array (
|
||||||
|
'74de2eb1870f65e47bdebde8c12ed050e90ded57' =>
|
||||||
|
array (
|
||||||
|
0 => '/var/www/html/misc/smarty/templates_ru/index.tpl',
|
||||||
|
1 => 1485892241,
|
||||||
|
2 => 'file',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'includes' =>
|
||||||
|
array (
|
||||||
|
),
|
||||||
|
),false)) {
|
||||||
|
function content_5890eda331cf62_87676770 (Smarty_Internal_Template $_smarty_tpl) {
|
||||||
|
?>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" type="text/css" href="style.css">
|
||||||
|
<?php echo '<script'; ?>
|
||||||
|
>
|
||||||
|
function validate_form()
|
||||||
|
{
|
||||||
|
var name = document.getElementById('add_list_input').value;
|
||||||
|
var name = name.toLowerCase();
|
||||||
|
|
||||||
|
if (name == "")
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name.length > 30)
|
||||||
|
{
|
||||||
|
alert("Название списка рассылки должно содержать не более 30-ти символов.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( name.match(/[^a-z0-9_]/) )
|
||||||
|
{
|
||||||
|
alert("Название списка рассылки может содержать только латинские буквы, цифры и символы нижнего подчёркивания.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function confirm_delete()
|
||||||
|
{
|
||||||
|
return confirm("Вы действительно хотите удалить список рассылки?");
|
||||||
|
}
|
||||||
|
<?php echo '</script'; ?>
|
||||||
|
>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="header">
|
||||||
|
<div id="header_left">
|
||||||
|
Сервис рассылок
|
||||||
|
</div>
|
||||||
|
<div id="header_right">
|
||||||
|
<a href="logout.php">Выйти</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="breadcrumbs"><?php echo $_smarty_tpl->tpl_vars['domain']->value;?>
|
||||||
|
</div>
|
||||||
|
<div id="index">
|
||||||
|
<div id="lists_header">
|
||||||
|
<b>Все листы рассылок:</b>
|
||||||
|
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_add_list">
|
||||||
|
Добавляйте и удаляйте списки рассылки с помощью данной формы. Вы можете редактировать список, кликнув по его названию.
|
||||||
|
Письмо в рассылку отправляется на адрес example@<?php echo $_smarty_tpl->tpl_vars['domain']->value;?>
|
||||||
|
, где example – имя рассылки.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<table id="lists">
|
||||||
|
<?php
|
||||||
|
$_from = $_smarty_tpl->smarty->ext->_foreach->init($_smarty_tpl, $_smarty_tpl->tpl_vars['lists']->value, 'list');
|
||||||
|
if ($_from !== null) {
|
||||||
|
foreach ($_from as $_smarty_tpl->tpl_vars['list']->value) {
|
||||||
|
?>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
•
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a href="edit_list.php?list_name=<?php echo $_smarty_tpl->tpl_vars['list']->value;?>
|
||||||
|
"><?php echo $_smarty_tpl->tpl_vars['list']->value;?>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a href="del_list.php?list_name=<?php echo $_smarty_tpl->tpl_vars['list']->value;?>
|
||||||
|
" onclick="return confirm_delete()"><img src="delete.svg" width=15></a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$_smarty_tpl->smarty->ext->_foreach->restore($_smarty_tpl, 1);
|
||||||
|
?>
|
||||||
|
|
||||||
|
</table>
|
||||||
|
<form method="post" action="add_list.php" onsubmit="return validate_form()">
|
||||||
|
<div id="add_list">
|
||||||
|
<input type="text" name="list_name" id="add_list_input">
|
||||||
|
|
||||||
|
<input type="submit" name="submit" value="Добавить" id="add_list_button">
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
<?php }
|
||||||
|
}
|
||||||
@@ -0,0 +1,254 @@
|
|||||||
|
<?php
|
||||||
|
/* Smarty version 3.1.31, created on 2017-01-31 10:50:53
|
||||||
|
from "/var/www/html/misc/smarty/templates_ru/edit_list.tpl" */
|
||||||
|
|
||||||
|
/* @var Smarty_Internal_Template $_smarty_tpl */
|
||||||
|
if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
|
||||||
|
'version' => '3.1.31',
|
||||||
|
'unifunc' => 'content_589041dd3259d1_17665347',
|
||||||
|
'has_nocache_code' => false,
|
||||||
|
'file_dependency' =>
|
||||||
|
array (
|
||||||
|
'9f1de615a6b90a928a6f77b08d01bdc17781ec0b' =>
|
||||||
|
array (
|
||||||
|
0 => '/var/www/html/misc/smarty/templates_ru/edit_list.tpl',
|
||||||
|
1 => 1485849048,
|
||||||
|
2 => 'file',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'includes' =>
|
||||||
|
array (
|
||||||
|
),
|
||||||
|
),false)) {
|
||||||
|
function content_589041dd3259d1_17665347 (Smarty_Internal_Template $_smarty_tpl) {
|
||||||
|
?>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" type="text/css" href="style.css">
|
||||||
|
<?php echo '<script'; ?>
|
||||||
|
>
|
||||||
|
// Do not use Smarty here
|
||||||
|
function switch_moderators_form()
|
||||||
|
{
|
||||||
|
// Get a selected value
|
||||||
|
var select = document.getElementById("list_type");
|
||||||
|
var selected_value = select.options[select.selectedIndex].value;
|
||||||
|
|
||||||
|
// If selected conference list type, then disable moderators form
|
||||||
|
if (selected_value == "2")
|
||||||
|
{
|
||||||
|
document.getElementById("moderators").disabled = true;
|
||||||
|
document.getElementById("moderators_header").style.color = "#777777";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
document.getElementById("moderators").disabled = false;
|
||||||
|
document.getElementById("moderators_header").style.color = "#222222";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function validate_form()
|
||||||
|
{
|
||||||
|
var prefix = document.getElementById('prefix').value;
|
||||||
|
var footer = document.getElementById('footer').value;
|
||||||
|
var subscribers = document.getElementById('subscribers').value;
|
||||||
|
var moderators = document.getElementById('moderators').value;
|
||||||
|
|
||||||
|
// Regex for a valid e-mail
|
||||||
|
var re_email = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
|
||||||
|
|
||||||
|
// Transform subscribers and moderators into array
|
||||||
|
subscribers = subscribers.split("\n");
|
||||||
|
moderators = moderators.split("\n");
|
||||||
|
|
||||||
|
if (prefix.length > 128)
|
||||||
|
{
|
||||||
|
alert("Длина префикса не должна превышать 128-ми символов.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (footer.length > 1024)
|
||||||
|
{
|
||||||
|
alert("Длина подписи не должна превышать 1024-ёх символов.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(var i in subscribers)
|
||||||
|
{
|
||||||
|
if ( subscribers[i] != "" && !re_email.test(subscribers[i]) )
|
||||||
|
{
|
||||||
|
alert('Подписчик "' + subscribers[i] + '" (строка №' + (parseFloat(i)+1) + ') является невалидным адресом электронной почты.');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(var i in moderators)
|
||||||
|
{
|
||||||
|
if ( moderators[i] != "" && !re_email.test(moderators[i]) )
|
||||||
|
{
|
||||||
|
alert('Модератор "' + moderators[i] + '" (строка №' + (parseFloat(i)+1) + ') является невалидным адресом электронной почты.');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//
|
||||||
|
<?php echo '</script'; ?>
|
||||||
|
>
|
||||||
|
</head>
|
||||||
|
<body onload="switch_moderators_form()">
|
||||||
|
<div id="header">
|
||||||
|
<div id="header_left">
|
||||||
|
Сервис рассылок
|
||||||
|
</div>
|
||||||
|
<div id="header_right">
|
||||||
|
<a href="logout.php">Выйти</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="breadcrumbs">
|
||||||
|
<a href="index.php"><?php echo $_smarty_tpl->tpl_vars['domain']->value;?>
|
||||||
|
</a> / <?php echo $_smarty_tpl->tpl_vars['list_name']->value;?>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<form method="post" action="save_list.php" id="save_list" onsubmit="return validate_form()">
|
||||||
|
<div id="edit_page">
|
||||||
|
<input type="hidden" name="list_name" value="<?php echo $_smarty_tpl->tpl_vars['list_name']->value;?>
|
||||||
|
">
|
||||||
|
<div id="column_left">
|
||||||
|
<div id="subscribers_header">
|
||||||
|
Список подписчиков:
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_sub">
|
||||||
|
Добавляйте по одному почтовому адресу в каждой строке. Не забудьте добавить
|
||||||
|
модераторов, если хотите, чтобы они также могли писать в рассылку.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="subscribers_body">
|
||||||
|
<textarea name="subscribers" id="subscribers"><?php echo $_smarty_tpl->tpl_vars['subscribers']->value;?>
|
||||||
|
</textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="column_middle">
|
||||||
|
<div id="column_middle_inner">
|
||||||
|
<div id="table_div">
|
||||||
|
<table id="table_middle">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<div id="list_type_header">
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_list_type">
|
||||||
|
<b>Модерируемая рассылка:</b> подписчиков устанавливаете Вы, сообщения
|
||||||
|
от обычных участников проходят модерацию.<br><br>
|
||||||
|
<b>Новостная рассылка:</b> подписаться может кто угодно, отправив пустое письмо
|
||||||
|
на <?php echo $_smarty_tpl->tpl_vars['list_name']->value;?>
|
||||||
|
+subscribe@<?php echo $_smarty_tpl->tpl_vars['domain']->value;?>
|
||||||
|
, при этом подтверждение модератора не требуется.
|
||||||
|
Письма в рассылку могут отправлять только модераторы.<br><br>
|
||||||
|
<b>Конференция:</b> аналог канала в IRC. Подписчиков устанавливаете Вы,
|
||||||
|
сообщения может отправлять любой подписчик без модерации.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
Тип рассылки:
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<select name="list_type" id="list_type" onChange="switch_moderators_form()">
|
||||||
|
<option value="0" <?php echo $_smarty_tpl->tpl_vars['list_type_selected']->value[0];?>
|
||||||
|
>
|
||||||
|
Модерируемая рассылка
|
||||||
|
</option>
|
||||||
|
<option value="1" <?php echo $_smarty_tpl->tpl_vars['list_type_selected']->value[1];?>
|
||||||
|
>
|
||||||
|
Новостная рассылка
|
||||||
|
</option>
|
||||||
|
<option value="2" <?php echo $_smarty_tpl->tpl_vars['list_type_selected']->value[2];?>
|
||||||
|
>
|
||||||
|
Конференция
|
||||||
|
</option>
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<div id="prefix_header">
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_prefix">
|
||||||
|
Текст, добавляемый в начало заголовка каждого сообщения рассылки.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
Префикс:
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input type="text" name="prefix" value="<?php echo mb_convert_encoding(htmlspecialchars($_smarty_tpl->tpl_vars['prefix']->value, ENT_QUOTES, 'UTF-8', true), "HTML-ENTITIES", 'UTF-8');?>
|
||||||
|
" id="prefix">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<div id="footer_header">
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_footer">
|
||||||
|
Текст, добавляемый в конец тела каждого сообщения рассылки.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
Подпись:
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<textarea name="footer" id="footer"><?php echo $_smarty_tpl->tpl_vars['footer']->value;?>
|
||||||
|
</textarea>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td colspan="2">
|
||||||
|
<div id="notmetoo">
|
||||||
|
<div id="notmetoo_header">
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_notmetoo">
|
||||||
|
Отправитель будет исключён из списка рассылки для своего сообщения.
|
||||||
|
Это означает, что ему не будут приходить копии своих сообщений.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<input type="checkbox" id="notmetoo_checkbox" name="notmetoo" value="checked" <?php echo $_smarty_tpl->tpl_vars['notmetoo_checked']->value;?>
|
||||||
|
>
|
||||||
|
Не отправлять копию своих сообщений.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div id="save_btn">
|
||||||
|
<input type="submit" name="submit" value="Сохранить">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="column_right">
|
||||||
|
<div id="moderators_header">
|
||||||
|
Список модераторов:
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_mod">
|
||||||
|
Для модерируемой рассылки на эти email будут отправляться письма перед их
|
||||||
|
опубликованием в рассылку. Для новостной рассылки только эти адреса могут
|
||||||
|
могут писать в рассылку. Для конференции модераторы не предумотрены.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="moderators_body">
|
||||||
|
<textarea name="moderators" id="moderators"><?php echo $_smarty_tpl->tpl_vars['moderators']->value;?>
|
||||||
|
</textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
<?php }
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
<?php
|
||||||
|
/* Smarty version 3.1.31, created on 2017-01-29 14:10:40
|
||||||
|
from "/var/www/html/misc/smarty/templates_ru/error.tpl" */
|
||||||
|
|
||||||
|
/* @var Smarty_Internal_Template $_smarty_tpl */
|
||||||
|
if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
|
||||||
|
'version' => '3.1.31',
|
||||||
|
'unifunc' => 'content_588dcdb0c8d950_81798250',
|
||||||
|
'has_nocache_code' => false,
|
||||||
|
'file_dependency' =>
|
||||||
|
array (
|
||||||
|
'aa00a58a15f019bd5c0612378cd3ff5f5b6adcae' =>
|
||||||
|
array (
|
||||||
|
0 => '/var/www/html/misc/smarty/templates_ru/error.tpl',
|
||||||
|
1 => 1485688232,
|
||||||
|
2 => 'file',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'includes' =>
|
||||||
|
array (
|
||||||
|
),
|
||||||
|
),false)) {
|
||||||
|
function content_588dcdb0c8d950_81798250 (Smarty_Internal_Template $_smarty_tpl) {
|
||||||
|
?>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" type="text/css" href="style.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="header">Сервис рассылок</div>
|
||||||
|
<div id="error">
|
||||||
|
<?php if ($_smarty_tpl->tpl_vars['error_code']->value == 1) {?>
|
||||||
|
Домен может содержать только латинские буквы, точки, дефисы и цифры.
|
||||||
|
<?php } elseif ($_smarty_tpl->tpl_vars['error_code']->value == 2) {?>
|
||||||
|
Пароль может содержать только латинские буквы и цифры.
|
||||||
|
<?php } elseif ($_smarty_tpl->tpl_vars['error_code']->value == 3) {?>
|
||||||
|
Неверный пароль.
|
||||||
|
<?php } elseif ($_smarty_tpl->tpl_vars['error_code']->value == 4) {?>
|
||||||
|
Такой домен не зарегистрирован.
|
||||||
|
<?php } elseif ($_smarty_tpl->tpl_vars['error_code']->value == 5) {?>
|
||||||
|
Название рассылки может содержать только латинские буквы, цифры и символы нижнего подчёркивания.
|
||||||
|
<?php } elseif ($_smarty_tpl->tpl_vars['error_code']->value == 6) {?>
|
||||||
|
Длина названия рассылки не может превышать 30-ти символов.
|
||||||
|
<?php } elseif ($_smarty_tpl->tpl_vars['error_code']->value == 7) {?>
|
||||||
|
Длина префикса не может превышать 128-ти символов.
|
||||||
|
<?php } elseif ($_smarty_tpl->tpl_vars['error_code']->value == 8) {?>
|
||||||
|
Длина подписи не может превышать 1024-ти символов.
|
||||||
|
<?php } elseif ($_smarty_tpl->tpl_vars['error_code']->value == 9) {?>
|
||||||
|
Среди подписчиков есть некорректный e-mail.
|
||||||
|
<?php } elseif ($_smarty_tpl->tpl_vars['error_code']->value == 10) {?>
|
||||||
|
Среди модераторов есть некорректный e-mail.
|
||||||
|
<?php } else { ?>
|
||||||
|
Неизвестная ошибка.
|
||||||
|
<?php }?>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
<?php }
|
||||||
|
}
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
<?php
|
||||||
|
/* Smarty version 3.1.31, created on 2017-01-24 20:04:52
|
||||||
|
from "/var/www/html/smarty/templates_ru/login.tpl" */
|
||||||
|
|
||||||
|
/* @var Smarty_Internal_Template $_smarty_tpl */
|
||||||
|
if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
|
||||||
|
'version' => '3.1.31',
|
||||||
|
'unifunc' => 'content_58878934506f48_92126530',
|
||||||
|
'has_nocache_code' => false,
|
||||||
|
'file_dependency' =>
|
||||||
|
array (
|
||||||
|
'ccdf76791105fd7c77f366b69d3a18e59c5c2b67' =>
|
||||||
|
array (
|
||||||
|
0 => '/var/www/html/smarty/templates_ru/login.tpl',
|
||||||
|
1 => 1485277488,
|
||||||
|
2 => 'file',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'includes' =>
|
||||||
|
array (
|
||||||
|
),
|
||||||
|
),false)) {
|
||||||
|
function content_58878934506f48_92126530 (Smarty_Internal_Template $_smarty_tpl) {
|
||||||
|
?>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" type="text/css" href="style.css">
|
||||||
|
<?php echo '<script'; ?>
|
||||||
|
>
|
||||||
|
function validate_form()
|
||||||
|
{
|
||||||
|
var domain = document.getElementById('domain_input').value;
|
||||||
|
var password = document.getElementById('password_input').value;
|
||||||
|
|
||||||
|
if (domain == "")
|
||||||
|
{
|
||||||
|
alert("Введите домен.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (password == "")
|
||||||
|
{
|
||||||
|
alert("Введите пароль.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
<?php echo '</script'; ?>
|
||||||
|
>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="header">Сервис рассылок</div>
|
||||||
|
<div id="login">
|
||||||
|
<div id="login_form">
|
||||||
|
<form method="post" action="login.php" onsubmit="return validate_form()">
|
||||||
|
<div id="domain">
|
||||||
|
<div id="domain_left">
|
||||||
|
Домен:
|
||||||
|
</div>
|
||||||
|
<div id="domain_right">
|
||||||
|
<input type="text" name="login_domain" id="domain_input">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="password">
|
||||||
|
<div id="password_left">
|
||||||
|
Пароль:
|
||||||
|
</div>
|
||||||
|
<div id="password_right">
|
||||||
|
<input type="password" name="login_pass" id="password_input">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="enter">
|
||||||
|
<input type="submit" name="submit" value="Войти">
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
<?php }
|
||||||
|
}
|
||||||
@@ -0,0 +1,236 @@
|
|||||||
|
<?php
|
||||||
|
/* Smarty version 3.1.31, created on 2017-01-27 21:00:03
|
||||||
|
from "/var/www/html/smarty/templates_ru/edit_list.tpl" */
|
||||||
|
|
||||||
|
/* @var Smarty_Internal_Template $_smarty_tpl */
|
||||||
|
if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
|
||||||
|
'version' => '3.1.31',
|
||||||
|
'unifunc' => 'content_588b8aa37593d1_30807545',
|
||||||
|
'has_nocache_code' => false,
|
||||||
|
'file_dependency' =>
|
||||||
|
array (
|
||||||
|
'fb61d69ef038dcd720aa2782f00f9ee0f411ff19' =>
|
||||||
|
array (
|
||||||
|
0 => '/var/www/html/smarty/templates_ru/edit_list.tpl',
|
||||||
|
1 => 1485537120,
|
||||||
|
2 => 'file',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'includes' =>
|
||||||
|
array (
|
||||||
|
),
|
||||||
|
),false)) {
|
||||||
|
function content_588b8aa37593d1_30807545 (Smarty_Internal_Template $_smarty_tpl) {
|
||||||
|
?>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" type="text/css" href="style.css">
|
||||||
|
<?php echo '<script'; ?>
|
||||||
|
>
|
||||||
|
// Do not use Smarty here
|
||||||
|
function switch_moderators_form()
|
||||||
|
{
|
||||||
|
// Get a selected value
|
||||||
|
var select = document.getElementById("list_type");
|
||||||
|
var selected_value = select.options[select.selectedIndex].value;
|
||||||
|
|
||||||
|
// If selected conference list type, then disable moderators form
|
||||||
|
if (selected_value == "2")
|
||||||
|
{
|
||||||
|
document.getElementById("moderators").disabled = true;
|
||||||
|
document.getElementById("moderators_header").style.color = "#777777";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
document.getElementById("moderators").disabled = false;
|
||||||
|
document.getElementById("moderators_header").style.color = "#222222";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function validate_form()
|
||||||
|
{
|
||||||
|
var prefix = document.getElementById('prefix').value;
|
||||||
|
var footer = document.getElementById('footer').value;
|
||||||
|
var subscribers = document.getElementById('subscribers').value;
|
||||||
|
var moderators = document.getElementById('moderators').value;
|
||||||
|
|
||||||
|
// Regex for a valid e-mail
|
||||||
|
var re_email = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
|
||||||
|
|
||||||
|
// Transform subscribers and moderators into array
|
||||||
|
subscribers = subscribers.split("\n");
|
||||||
|
moderators = moderators.split("\n");
|
||||||
|
|
||||||
|
if (prefix.length > 128)
|
||||||
|
{
|
||||||
|
alert("Длина префикса не должна превышать 128-ми символов.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (footer.length > 1024)
|
||||||
|
{
|
||||||
|
alert("Длина подписи не должна превышать 1024-ёх символов.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(var i in subscribers)
|
||||||
|
{
|
||||||
|
if ( subscribers[i] != "" && !re_email.test(subscribers[i]) )
|
||||||
|
{
|
||||||
|
alert('Подписчик "' + subscribers[i] + '" (строка №' + (parseFloat(i)+1) + ') является невалидным адресом электронной почты.');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(var i in moderators)
|
||||||
|
{
|
||||||
|
if ( moderators[i] != "" && !re_email.test(moderators[i]) )
|
||||||
|
{
|
||||||
|
alert('Модератор "' + moderators[i] + '" (строка №' + (parseFloat(i)+1) + ') является невалидным адресом электронной почты.');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//
|
||||||
|
<?php echo '</script'; ?>
|
||||||
|
>
|
||||||
|
</head>
|
||||||
|
<body onload="switch_moderators_form()">
|
||||||
|
<div id="header">
|
||||||
|
<div id="header_left">
|
||||||
|
Сервис рассылок
|
||||||
|
</div>
|
||||||
|
<div id="header_right">
|
||||||
|
<a href="logout.php">Выйти</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="breadcrumbs">
|
||||||
|
<a href="index.php"><?php echo $_smarty_tpl->tpl_vars['domain']->value;?>
|
||||||
|
</a> / <?php echo $_smarty_tpl->tpl_vars['list_name']->value;?>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<form method="post" action="save_list.php" id="save_list" onsubmit="return validate_form()">
|
||||||
|
<div id="edit_page">
|
||||||
|
<input type="hidden" name="list_name" value="<?php echo $_smarty_tpl->tpl_vars['list_name']->value;?>
|
||||||
|
">
|
||||||
|
<div id="column_left">
|
||||||
|
<div id="subscribers_header">
|
||||||
|
Список подписчиков:
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_sub">
|
||||||
|
Добавляйте по одному почтовому адресу в каждой строке. Не забудьте добавить
|
||||||
|
модераторов, если хотите, чтобы они также могли писать в рассылку.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="subscribers_body">
|
||||||
|
<textarea name="subscribers" id="subscribers"><?php echo $_smarty_tpl->tpl_vars['subscribers']->value;?>
|
||||||
|
</textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="column_middle">
|
||||||
|
<div id="column_middle_inner">
|
||||||
|
<div id="table_div">
|
||||||
|
<table id="table_middle">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<div id="list_type_header">
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_list_type">
|
||||||
|
<b>Модерируемая рассылка:</b> подписчиков устанавливаете Вы, сообщения
|
||||||
|
от обычных участников проходят модерацию.<br><br>
|
||||||
|
<b>Новостная рассылка:</b> подписаться может кто угодно, отправив пустое письмо
|
||||||
|
на <?php echo $_smarty_tpl->tpl_vars['list_name']->value;?>
|
||||||
|
+subscribe@<?php echo $_smarty_tpl->tpl_vars['domain']->value;?>
|
||||||
|
, при этом подтверждение модератора не требуется.
|
||||||
|
Письма в рассылку могут отправлять только модераторы.<br><br>
|
||||||
|
<b>Конференция:</b> аналог канала в IRC. Подписчиков устанавливаете Вы,
|
||||||
|
сообщения может отправлять любой подписчик без модерации.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
Тип рассылки:
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<select name="list_type" id="list_type" onChange="switch_moderators_form()">
|
||||||
|
<option value="0" <?php echo $_smarty_tpl->tpl_vars['list_type_selected']->value[0];?>
|
||||||
|
>
|
||||||
|
Модерируемая рассылка
|
||||||
|
</option>
|
||||||
|
<option value="1" <?php echo $_smarty_tpl->tpl_vars['list_type_selected']->value[1];?>
|
||||||
|
>
|
||||||
|
Новостная рассылка
|
||||||
|
</option>
|
||||||
|
<option value="2" <?php echo $_smarty_tpl->tpl_vars['list_type_selected']->value[2];?>
|
||||||
|
>
|
||||||
|
Конференция
|
||||||
|
</option>
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<div id="prefix_header">
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_prefix">
|
||||||
|
Текст, добавляемый в начало заголовка каждого сообщения рассылки.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
Префикс:
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input type="text" name="prefix" value="<?php echo mb_convert_encoding(htmlspecialchars($_smarty_tpl->tpl_vars['prefix']->value, ENT_QUOTES, 'UTF-8', true), "HTML-ENTITIES", 'UTF-8');?>
|
||||||
|
" id="prefix">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<div id="footer_header">
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_footer">
|
||||||
|
Текст, добавляемый в конец тела каждого сообщения рассылки.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
Подпись:
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<textarea name="footer" id="footer"><?php echo $_smarty_tpl->tpl_vars['footer']->value;?>
|
||||||
|
</textarea>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div id="save_btn">
|
||||||
|
<input type="submit" name="submit" value="Сохранить">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="column_right">
|
||||||
|
<div id="moderators_header">
|
||||||
|
Список модераторов:
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_mod">
|
||||||
|
Для модерируемой рассылки на эти email будут отправляться письма перед их
|
||||||
|
опубликованием в рассылку. Для новостной рассылки только эти адреса могут
|
||||||
|
могут писать в рассылку. Для конференции модераторы не предумотрены.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="moderators_body">
|
||||||
|
<textarea name="moderators" id="moderators"><?php echo $_smarty_tpl->tpl_vars['moderators']->value;?>
|
||||||
|
</textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
<?php }
|
||||||
|
}
|
||||||
213
misc/smarty/templates_en/edit_list.tpl
Normal file
213
misc/smarty/templates_en/edit_list.tpl
Normal file
@@ -0,0 +1,213 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" type="text/css" href="style.css">
|
||||||
|
<script>
|
||||||
|
//{literal} Do not use Smarty here
|
||||||
|
function switch_moderators_form()
|
||||||
|
{
|
||||||
|
// Get a selected value
|
||||||
|
var select = document.getElementById("list_type");
|
||||||
|
var selected_value = select.options[select.selectedIndex].value;
|
||||||
|
|
||||||
|
// If selected conference list type, then disable moderators form
|
||||||
|
if (selected_value == "2")
|
||||||
|
{
|
||||||
|
document.getElementById("moderators").disabled = true;
|
||||||
|
document.getElementById("moderators_header").style.color = "#777777";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
document.getElementById("moderators").disabled = false;
|
||||||
|
document.getElementById("moderators_header").style.color = "#222222";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function validate_form()
|
||||||
|
{
|
||||||
|
var prefix = document.getElementById('prefix').value;
|
||||||
|
var footer = document.getElementById('footer').value;
|
||||||
|
var subscribers = document.getElementById('subscribers').value;
|
||||||
|
var moderators = document.getElementById('moderators').value;
|
||||||
|
|
||||||
|
// Regex for a valid e-mail
|
||||||
|
var re_email = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
|
||||||
|
|
||||||
|
// Transform subscribers and moderators into array
|
||||||
|
subscribers = subscribers.split("\n");
|
||||||
|
moderators = moderators.split("\n");
|
||||||
|
|
||||||
|
if (prefix.length > 128)
|
||||||
|
{
|
||||||
|
alert("A prefix length can not be longer than 128 characters.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (footer.length > 1024)
|
||||||
|
{
|
||||||
|
alert("A footer length can not be longer than 1024 characters.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(var i in subscribers)
|
||||||
|
{
|
||||||
|
if ( subscribers[i] != "" && !re_email.test(subscribers[i]) )
|
||||||
|
{
|
||||||
|
alert('Subscriber "' + subscribers[i] + '" (line #' + (parseFloat(i)+1) + ') have incorrect email.');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(var i in moderators)
|
||||||
|
{
|
||||||
|
if ( moderators[i] != "" && !re_email.test(moderators[i]) )
|
||||||
|
{
|
||||||
|
alert('Moderator "' + moderators[i] + '" (line #' + (parseFloat(i)+1) + ') have incorrect email.');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//{/literal}
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body onload="switch_moderators_form()">
|
||||||
|
<div id="header">
|
||||||
|
<div id="header_left">
|
||||||
|
Mailing lists service
|
||||||
|
</div>
|
||||||
|
<div id="header_right">
|
||||||
|
<a href="logout.php">Log out</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="breadcrumbs">
|
||||||
|
<a href="index.php">{$domain}</a> / {$list_name}
|
||||||
|
</div>
|
||||||
|
<form method="post" action="save_list.php" id="save_list" onsubmit="return validate_form()">
|
||||||
|
<div id="edit_page">
|
||||||
|
<input type="hidden" name="list_name" value="{$list_name}">
|
||||||
|
<div id="column_left">
|
||||||
|
<div id="subscribers_header">
|
||||||
|
Subscribers:
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_sub">
|
||||||
|
Please, provide one email per line. Do not forget add moderators if you
|
||||||
|
want them able to post into mailing list.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="subscribers_body">
|
||||||
|
<textarea name="subscribers" id="subscribers">{$subscribers}</textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="column_middle">
|
||||||
|
<div id="column_middle_inner">
|
||||||
|
<div id="table_div">
|
||||||
|
<table id="table_middle">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<div id="list_type_header">
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_list_type">
|
||||||
|
<b>Moderated list:</b> you assign subscribers and moderators. Messages will be
|
||||||
|
moderated before publishing.<br><br>
|
||||||
|
<b>News list:</b> everybody can subscribe without moderator confirmation by sending
|
||||||
|
an empty email to {$list_name}+subscribe@{$domain}. Messages into mailing list can
|
||||||
|
post only moderators.<br><br>
|
||||||
|
<b>Conference:</b> IRC channel analogue. You assign subscribers, every subscriber
|
||||||
|
can send messages without moderation.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
List type:
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<select name="list_type" id="list_type" onChange="switch_moderators_form()">
|
||||||
|
<option value="0" {$list_type_selected[0]}>
|
||||||
|
Moderated list
|
||||||
|
</option>
|
||||||
|
<option value="1" {$list_type_selected[1]}>
|
||||||
|
News list
|
||||||
|
</option>
|
||||||
|
<option value="2" {$list_type_selected[2]}>
|
||||||
|
Conference
|
||||||
|
</option>
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<div id="prefix_header">
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_prefix">
|
||||||
|
Prefix added to the subject field of each message.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
Prefix:
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input type="text" name="prefix" value="{$prefix|escape:'htmlall'}" id="prefix">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<div id="footer_header">
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_footer">
|
||||||
|
Footer added to the body of each message.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
Footer:
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<textarea name="footer" id="footer">{$footer}</textarea>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td colspan="2">
|
||||||
|
<div id="notmetoo">
|
||||||
|
<div id="notmetoo_header">
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_notmetoo">
|
||||||
|
Sender of a post will be excluded from the distribution list for
|
||||||
|
that post so people don't receive copies of their own posts.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<input type="checkbox" id="notmetoo_checkbox" name="notmetoo" value="checked" {$notmetoo_checked}>
|
||||||
|
Do not send mails to yourself.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div id="save_btn">
|
||||||
|
<input type="submit" name="submit" value="Сохранить">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="column_right">
|
||||||
|
<div id="moderators_header">
|
||||||
|
Moderators:
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_mod">
|
||||||
|
In case of moderated list messages before publishing will be send to these
|
||||||
|
emails. In case of news list only these emails can post to mailing list.
|
||||||
|
In case of conference there are no moderators.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="moderators_body">
|
||||||
|
<textarea name="moderators" id="moderators">{$moderators}</textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
33
misc/smarty/templates_en/error.tpl
Normal file
33
misc/smarty/templates_en/error.tpl
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" type="text/css" href="style.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="header">Mailing lists service</div>
|
||||||
|
<div id="error">
|
||||||
|
{if $error_code == 1}
|
||||||
|
Domain can contain only english letters, dots, hyphens and digits.
|
||||||
|
{elseif $error_code == 2}
|
||||||
|
Password can contain only english letters and digits.
|
||||||
|
{elseif $error_code == 3}
|
||||||
|
Incorrect password.
|
||||||
|
{elseif $error_code == 4}
|
||||||
|
There is no such domain.
|
||||||
|
{elseif $error_code == 5}
|
||||||
|
Mailing list name can contain only english letters, digits and undercores.
|
||||||
|
{elseif $error_code == 6}
|
||||||
|
The length of a list name can not exceed 30 characters.
|
||||||
|
{elseif $error_code == 7}
|
||||||
|
The length of a prefix can not exceed 128 characters.
|
||||||
|
{elseif $error_code == 8}
|
||||||
|
The length of a footer can not exceed 1024 characters.
|
||||||
|
{elseif $error_code == 9}
|
||||||
|
There is an incorrect email in the subscribers list.
|
||||||
|
{elseif $error_code == 10}
|
||||||
|
There is an incorrect email in the moderators list.
|
||||||
|
{else}
|
||||||
|
Unknown error.
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
80
misc/smarty/templates_en/index.tpl
Normal file
80
misc/smarty/templates_en/index.tpl
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" type="text/css" href="style.css">
|
||||||
|
<script>
|
||||||
|
function validate_form()
|
||||||
|
{
|
||||||
|
var name = document.getElementById('add_list_input').value;
|
||||||
|
var name = name.toLowerCase();
|
||||||
|
|
||||||
|
if (name == "")
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name.length > 30)
|
||||||
|
{
|
||||||
|
alert("Mailing list name must not be longer than 30 characters.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( name.match(/[^a-z0-9_]/) )
|
||||||
|
{
|
||||||
|
alert("Mailing list name must contain only english letters, digits and undercores.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function confirm_delete()
|
||||||
|
{
|
||||||
|
return confirm("Are you really want to delete the mailing list?");
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="header">
|
||||||
|
<div id="header_left">
|
||||||
|
Mailing lists service
|
||||||
|
</div>
|
||||||
|
<div id="header_right">
|
||||||
|
<a href="logout.php">Log out</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="breadcrumbs">{$domain}</div>
|
||||||
|
<div id="index">
|
||||||
|
<div id="lists_header">
|
||||||
|
<b>Mailing lists:</b>
|
||||||
|
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_add_list">
|
||||||
|
You can add and delete mailing lists on this page. To edit list click on its name.
|
||||||
|
To post message into mailing list send mail to example@{$domain}, where "example" is the list name.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<table id="lists">
|
||||||
|
{foreach $lists as $list}
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
•
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a href="edit_list.php?list_name={$list}">{$list}</a>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a href="del_list.php?list_name={$list}" onclick="return confirm_delete()"><img src="delete.svg" width=15></a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{/foreach}
|
||||||
|
</table>
|
||||||
|
<form method="post" action="add_list.php" onsubmit="return validate_form()">
|
||||||
|
<div id="add_list">
|
||||||
|
<input type="text" name="list_name" id="add_list_input">
|
||||||
|
|
||||||
|
<input type="submit" name="submit" value="Add" id="add_list_button">
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
62
misc/smarty/templates_en/login.tpl
Normal file
62
misc/smarty/templates_en/login.tpl
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" type="text/css" href="style.css">
|
||||||
|
<script>
|
||||||
|
function validate_form()
|
||||||
|
{
|
||||||
|
var domain = document.getElementById('domain_input').value;
|
||||||
|
var password = document.getElementById('password_input').value;
|
||||||
|
|
||||||
|
if (domain == "")
|
||||||
|
{
|
||||||
|
alert("Enter domain.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (password == "")
|
||||||
|
{
|
||||||
|
alert("Enter password.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( domain.match(/[^A-Za-z0-9\-\.]/) )
|
||||||
|
{
|
||||||
|
alert("Domain can contain only english letters, dots, hyphens and digits.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( password.match(/[^A-Za-z0-9]/) )
|
||||||
|
{
|
||||||
|
alert("Password can contain only english letters and digits.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="header">Mailing lists service</div>
|
||||||
|
<div id="login">
|
||||||
|
<div id="login_form">
|
||||||
|
<form method="post" action="login.php" onsubmit="return validate_form()">
|
||||||
|
<div id="domain">
|
||||||
|
<div id="domain_left">
|
||||||
|
Domain:
|
||||||
|
</div>
|
||||||
|
<div id="domain_right">
|
||||||
|
<input type="text" name="login_domain" id="domain_input">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="password">
|
||||||
|
<div id="password_left">
|
||||||
|
Password:
|
||||||
|
</div>
|
||||||
|
<div id="password_right">
|
||||||
|
<input type="password" name="login_pass" id="password_input">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="enter">
|
||||||
|
<input type="submit" name="submit" value="Enter">
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
213
misc/smarty/templates_ru/edit_list.tpl
Normal file
213
misc/smarty/templates_ru/edit_list.tpl
Normal file
@@ -0,0 +1,213 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" type="text/css" href="style.css">
|
||||||
|
<script>
|
||||||
|
//{literal} Do not use Smarty here
|
||||||
|
function switch_moderators_form()
|
||||||
|
{
|
||||||
|
// Get a selected value
|
||||||
|
var select = document.getElementById("list_type");
|
||||||
|
var selected_value = select.options[select.selectedIndex].value;
|
||||||
|
|
||||||
|
// If selected conference list type, then disable moderators form
|
||||||
|
if (selected_value == "2")
|
||||||
|
{
|
||||||
|
document.getElementById("moderators").disabled = true;
|
||||||
|
document.getElementById("moderators_header").style.color = "#777777";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
document.getElementById("moderators").disabled = false;
|
||||||
|
document.getElementById("moderators_header").style.color = "#222222";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function validate_form()
|
||||||
|
{
|
||||||
|
var prefix = document.getElementById('prefix').value;
|
||||||
|
var footer = document.getElementById('footer').value;
|
||||||
|
var subscribers = document.getElementById('subscribers').value;
|
||||||
|
var moderators = document.getElementById('moderators').value;
|
||||||
|
|
||||||
|
// Regex for a valid e-mail
|
||||||
|
var re_email = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
|
||||||
|
|
||||||
|
// Transform subscribers and moderators into array
|
||||||
|
subscribers = subscribers.split("\n");
|
||||||
|
moderators = moderators.split("\n");
|
||||||
|
|
||||||
|
if (prefix.length > 128)
|
||||||
|
{
|
||||||
|
alert("Длина префикса не должна превышать 128-ми символов.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (footer.length > 1024)
|
||||||
|
{
|
||||||
|
alert("Длина подписи не должна превышать 1024-ёх символов.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(var i in subscribers)
|
||||||
|
{
|
||||||
|
if ( subscribers[i] != "" && !re_email.test(subscribers[i]) )
|
||||||
|
{
|
||||||
|
alert('Подписчик "' + subscribers[i] + '" (строка №' + (parseFloat(i)+1) + ') является невалидным адресом электронной почты.');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(var i in moderators)
|
||||||
|
{
|
||||||
|
if ( moderators[i] != "" && !re_email.test(moderators[i]) )
|
||||||
|
{
|
||||||
|
alert('Модератор "' + moderators[i] + '" (строка №' + (parseFloat(i)+1) + ') является невалидным адресом электронной почты.');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//{/literal}
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body onload="switch_moderators_form()">
|
||||||
|
<div id="header">
|
||||||
|
<div id="header_left">
|
||||||
|
Сервис рассылок
|
||||||
|
</div>
|
||||||
|
<div id="header_right">
|
||||||
|
<a href="logout.php">Выйти</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="breadcrumbs">
|
||||||
|
<a href="index.php">{$domain}</a> / {$list_name}
|
||||||
|
</div>
|
||||||
|
<form method="post" action="save_list.php" id="save_list" onsubmit="return validate_form()">
|
||||||
|
<div id="edit_page">
|
||||||
|
<input type="hidden" name="list_name" value="{$list_name}">
|
||||||
|
<div id="column_left">
|
||||||
|
<div id="subscribers_header">
|
||||||
|
Список подписчиков:
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_sub">
|
||||||
|
Добавляйте по одному почтовому адресу в каждой строке. Не забудьте добавить
|
||||||
|
модераторов, если хотите, чтобы они также могли писать в рассылку.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="subscribers_body">
|
||||||
|
<textarea name="subscribers" id="subscribers">{$subscribers}</textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="column_middle">
|
||||||
|
<div id="column_middle_inner">
|
||||||
|
<div id="table_div">
|
||||||
|
<table id="table_middle">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<div id="list_type_header">
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_list_type">
|
||||||
|
<b>Модерируемая рассылка:</b> подписчиков устанавливаете Вы, сообщения
|
||||||
|
от обычных участников проходят модерацию.<br><br>
|
||||||
|
<b>Новостная рассылка:</b> подписаться может кто угодно, отправив пустое письмо
|
||||||
|
на {$list_name}+subscribe@{$domain}, при этом подтверждение модератора не требуется.
|
||||||
|
Письма в рассылку могут отправлять только модераторы.<br><br>
|
||||||
|
<b>Конференция:</b> аналог канала в IRC. Подписчиков устанавливаете Вы,
|
||||||
|
сообщения может отправлять любой подписчик без модерации.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
Тип рассылки:
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<select name="list_type" id="list_type" onChange="switch_moderators_form()">
|
||||||
|
<option value="0" {$list_type_selected[0]}>
|
||||||
|
Модерируемая рассылка
|
||||||
|
</option>
|
||||||
|
<option value="1" {$list_type_selected[1]}>
|
||||||
|
Новостная рассылка
|
||||||
|
</option>
|
||||||
|
<option value="2" {$list_type_selected[2]}>
|
||||||
|
Конференция
|
||||||
|
</option>
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<div id="prefix_header">
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_prefix">
|
||||||
|
Текст, добавляемый в начало заголовка каждого сообщения рассылки.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
Префикс:
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input type="text" name="prefix" value="{$prefix|escape:'htmlall'}" id="prefix">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<div id="footer_header">
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_footer">
|
||||||
|
Текст, добавляемый в конец тела каждого сообщения рассылки.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
Подпись:
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<textarea name="footer" id="footer">{$footer}</textarea>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td colspan="2">
|
||||||
|
<div id="notmetoo">
|
||||||
|
<div id="notmetoo_header">
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_notmetoo">
|
||||||
|
Отправитель будет исключён из списка рассылки для своего сообщения.
|
||||||
|
Это означает, что ему не будут приходить копии своих сообщений.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<input type="checkbox" id="notmetoo_checkbox" name="notmetoo" value="checked" {$notmetoo_checked}>
|
||||||
|
Не отправлять копию своих сообщений.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div id="save_btn">
|
||||||
|
<input type="submit" name="submit" value="Сохранить">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="column_right">
|
||||||
|
<div id="moderators_header">
|
||||||
|
Список модераторов:
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_mod">
|
||||||
|
Для модерируемой рассылки на эти email будут отправляться письма перед их
|
||||||
|
опубликованием в рассылку. Для новостной рассылки только эти адреса могут
|
||||||
|
могут писать в рассылку. Для конференции модераторы не предумотрены.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="moderators_body">
|
||||||
|
<textarea name="moderators" id="moderators">{$moderators}</textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
33
misc/smarty/templates_ru/error.tpl
Normal file
33
misc/smarty/templates_ru/error.tpl
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" type="text/css" href="style.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="header">Сервис рассылок</div>
|
||||||
|
<div id="error">
|
||||||
|
{if $error_code == 1}
|
||||||
|
Домен может содержать только латинские буквы, точки, дефисы и цифры.
|
||||||
|
{elseif $error_code == 2}
|
||||||
|
Пароль может содержать только латинские буквы и цифры.
|
||||||
|
{elseif $error_code == 3}
|
||||||
|
Неверный пароль.
|
||||||
|
{elseif $error_code == 4}
|
||||||
|
Такой домен не зарегистрирован.
|
||||||
|
{elseif $error_code == 5}
|
||||||
|
Название рассылки может содержать только латинские буквы, цифры и символы нижнего подчёркивания.
|
||||||
|
{elseif $error_code == 6}
|
||||||
|
Длина названия рассылки не может превышать 30-ти символов.
|
||||||
|
{elseif $error_code == 7}
|
||||||
|
Длина префикса не может превышать 128-ти символов.
|
||||||
|
{elseif $error_code == 8}
|
||||||
|
Длина подписи не может превышать 1024-ти символов.
|
||||||
|
{elseif $error_code == 9}
|
||||||
|
Среди подписчиков есть некорректный e-mail.
|
||||||
|
{elseif $error_code == 10}
|
||||||
|
Среди модераторов есть некорректный e-mail.
|
||||||
|
{else}
|
||||||
|
Неизвестная ошибка.
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
80
misc/smarty/templates_ru/index.tpl
Normal file
80
misc/smarty/templates_ru/index.tpl
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" type="text/css" href="style.css">
|
||||||
|
<script>
|
||||||
|
function validate_form()
|
||||||
|
{
|
||||||
|
var name = document.getElementById('add_list_input').value;
|
||||||
|
var name = name.toLowerCase();
|
||||||
|
|
||||||
|
if (name == "")
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name.length > 30)
|
||||||
|
{
|
||||||
|
alert("Название списка рассылки должно содержать не более 30-ти символов.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( name.match(/[^a-z0-9_]/) )
|
||||||
|
{
|
||||||
|
alert("Название списка рассылки может содержать только латинские буквы, цифры и символы нижнего подчёркивания.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function confirm_delete()
|
||||||
|
{
|
||||||
|
return confirm("Вы действительно хотите удалить список рассылки?");
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="header">
|
||||||
|
<div id="header_left">
|
||||||
|
Сервис рассылок
|
||||||
|
</div>
|
||||||
|
<div id="header_right">
|
||||||
|
<a href="logout.php">Выйти</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="breadcrumbs">{$domain}</div>
|
||||||
|
<div id="index">
|
||||||
|
<div id="lists_header">
|
||||||
|
<b>Все листы рассылок:</b>
|
||||||
|
|
||||||
|
<div class="tooltip">
|
||||||
|
<img src="help.svg" width=15 height=15>
|
||||||
|
<span class="help_add_list">
|
||||||
|
Добавляйте и удаляйте списки рассылки с помощью данной формы. Вы можете редактировать список, кликнув по его названию.
|
||||||
|
Письмо в рассылку отправляется на адрес example@{$domain}, где example – имя рассылки.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<table id="lists">
|
||||||
|
{foreach $lists as $list}
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
•
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a href="edit_list.php?list_name={$list}">{$list}</a>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a href="del_list.php?list_name={$list}" onclick="return confirm_delete()"><img src="delete.svg" width=15></a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{/foreach}
|
||||||
|
</table>
|
||||||
|
<form method="post" action="add_list.php" onsubmit="return validate_form()">
|
||||||
|
<div id="add_list">
|
||||||
|
<input type="text" name="list_name" id="add_list_input">
|
||||||
|
|
||||||
|
<input type="submit" name="submit" value="Добавить" id="add_list_button">
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
62
misc/smarty/templates_ru/login.tpl
Normal file
62
misc/smarty/templates_ru/login.tpl
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" type="text/css" href="style.css">
|
||||||
|
<script>
|
||||||
|
function validate_form()
|
||||||
|
{
|
||||||
|
var domain = document.getElementById('domain_input').value;
|
||||||
|
var password = document.getElementById('password_input').value;
|
||||||
|
|
||||||
|
if (domain == "")
|
||||||
|
{
|
||||||
|
alert("Введите домен.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (password == "")
|
||||||
|
{
|
||||||
|
alert("Введите пароль.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( domain.match(/[^A-Za-z0-9\-\.]/) )
|
||||||
|
{
|
||||||
|
alert("Домен может содержать только латинские буквы, цифры, точки и дефисы.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( password.match(/[^A-Za-z0-9]/) )
|
||||||
|
{
|
||||||
|
alert("Пароль может содержать только латинские буквы и цифры.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="header">Сервис рассылок</div>
|
||||||
|
<div id="login">
|
||||||
|
<div id="login_form">
|
||||||
|
<form method="post" action="login.php" onsubmit="return validate_form()">
|
||||||
|
<div id="domain">
|
||||||
|
<div id="domain_left">
|
||||||
|
Домен:
|
||||||
|
</div>
|
||||||
|
<div id="domain_right">
|
||||||
|
<input type="text" name="login_domain" id="domain_input">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="password">
|
||||||
|
<div id="password_left">
|
||||||
|
Пароль:
|
||||||
|
</div>
|
||||||
|
<div id="password_right">
|
||||||
|
<input type="password" name="login_pass" id="password_input">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="enter">
|
||||||
|
<input type="submit" name="submit" value="Войти">
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
110
misc/smarty_libs/Autoloader.php
Normal file
110
misc/smarty_libs/Autoloader.php
Normal 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/bootstarp.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(phpversion(), '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;
|
||||||
|
}
|
||||||
|
}
|
||||||
1549
misc/smarty_libs/Smarty.class.php
Normal file
1549
misc/smarty_libs/Smarty.class.php
Normal file
File diff suppressed because it is too large
Load Diff
455
misc/smarty_libs/SmartyBC.class.php
Normal file
455
misc/smarty_libs/SmartyBC.class.php
Normal file
@@ -0,0 +1,455 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Project: Smarty: the PHP compiling template engine
|
||||||
|
* File: SmartyBC.class.php
|
||||||
|
* SVN: $Id: $
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
* For questions, help, comments, discussion, etc., please join the
|
||||||
|
* Smarty mailing list. Send a blank e-mail to
|
||||||
|
* smarty-discussion-subscribe@googlegroups.com
|
||||||
|
*
|
||||||
|
* @link http://www.smarty.net/
|
||||||
|
* @copyright 2008 New Digital Group, Inc.
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
* @author Uwe Tews
|
||||||
|
* @author Rodney Rehm
|
||||||
|
* @package Smarty
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @ignore
|
||||||
|
*/
|
||||||
|
require_once(dirname(__FILE__) . '/Smarty.class.php');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty Backward Compatibility Wrapper Class
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
*/
|
||||||
|
class SmartyBC extends Smarty
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Smarty 2 BC
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
public $_version = self::SMARTY_VERSION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is an array of directories where trusted php scripts reside.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
public $trusted_dir = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize new SmartyBC object
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wrapper for assign_by_ref
|
||||||
|
*
|
||||||
|
* @param string $tpl_var the template variable name
|
||||||
|
* @param mixed &$value the referenced value to assign
|
||||||
|
*/
|
||||||
|
public function assign_by_ref($tpl_var, &$value)
|
||||||
|
{
|
||||||
|
$this->assignByRef($tpl_var, $value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wrapper for append_by_ref
|
||||||
|
*
|
||||||
|
* @param string $tpl_var the template variable name
|
||||||
|
* @param mixed &$value the referenced value to append
|
||||||
|
* @param boolean $merge flag if array elements shall be merged
|
||||||
|
*/
|
||||||
|
public function append_by_ref($tpl_var, &$value, $merge = false)
|
||||||
|
{
|
||||||
|
$this->appendByRef($tpl_var, $value, $merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* clear the given assigned template variable.
|
||||||
|
*
|
||||||
|
* @param string $tpl_var the template variable to clear
|
||||||
|
*/
|
||||||
|
public function clear_assign($tpl_var)
|
||||||
|
{
|
||||||
|
$this->clearAssign($tpl_var);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers custom function to be used in templates
|
||||||
|
*
|
||||||
|
* @param string $function the name of the template function
|
||||||
|
* @param string $function_impl the name of the PHP function to register
|
||||||
|
* @param bool $cacheable
|
||||||
|
* @param mixed $cache_attrs
|
||||||
|
*/
|
||||||
|
public function register_function($function, $function_impl, $cacheable = true, $cache_attrs = null)
|
||||||
|
{
|
||||||
|
$this->registerPlugin('function', $function, $function_impl, $cacheable, $cache_attrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unregister custom function
|
||||||
|
*
|
||||||
|
* @param string $function name of template function
|
||||||
|
*/
|
||||||
|
public function unregister_function($function)
|
||||||
|
{
|
||||||
|
$this->unregisterPlugin('function', $function);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers object to be used in templates
|
||||||
|
*
|
||||||
|
* @param string $object name of template object
|
||||||
|
* @param object $object_impl the referenced PHP object to register
|
||||||
|
* @param array $allowed list of allowed methods (empty = all)
|
||||||
|
* @param boolean $smarty_args smarty argument format, else traditional
|
||||||
|
* @param array $block_methods list of methods that are block format
|
||||||
|
*
|
||||||
|
* @throws SmartyException
|
||||||
|
* @internal param array $block_functs list of methods that are block format
|
||||||
|
*/
|
||||||
|
public function register_object($object, $object_impl, $allowed = array(), $smarty_args = true,
|
||||||
|
$block_methods = array())
|
||||||
|
{
|
||||||
|
settype($allowed, 'array');
|
||||||
|
settype($smarty_args, 'boolean');
|
||||||
|
$this->registerObject($object, $object_impl, $allowed, $smarty_args, $block_methods);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unregister object
|
||||||
|
*
|
||||||
|
* @param string $object name of template object
|
||||||
|
*/
|
||||||
|
public function unregister_object($object)
|
||||||
|
{
|
||||||
|
$this->unregisterObject($object);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers block function to be used in templates
|
||||||
|
*
|
||||||
|
* @param string $block name of template block
|
||||||
|
* @param string $block_impl PHP function to register
|
||||||
|
* @param bool $cacheable
|
||||||
|
* @param mixed $cache_attrs
|
||||||
|
*/
|
||||||
|
public function register_block($block, $block_impl, $cacheable = true, $cache_attrs = null)
|
||||||
|
{
|
||||||
|
$this->registerPlugin('block', $block, $block_impl, $cacheable, $cache_attrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unregister block function
|
||||||
|
*
|
||||||
|
* @param string $block name of template function
|
||||||
|
*/
|
||||||
|
public function unregister_block($block)
|
||||||
|
{
|
||||||
|
$this->unregisterPlugin('block', $block);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers compiler function
|
||||||
|
*
|
||||||
|
* @param string $function name of template function
|
||||||
|
* @param string $function_impl name of PHP function to register
|
||||||
|
* @param bool $cacheable
|
||||||
|
*/
|
||||||
|
public function register_compiler_function($function, $function_impl, $cacheable = true)
|
||||||
|
{
|
||||||
|
$this->registerPlugin('compiler', $function, $function_impl, $cacheable);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unregister compiler function
|
||||||
|
*
|
||||||
|
* @param string $function name of template function
|
||||||
|
*/
|
||||||
|
public function unregister_compiler_function($function)
|
||||||
|
{
|
||||||
|
$this->unregisterPlugin('compiler', $function);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers modifier to be used in templates
|
||||||
|
*
|
||||||
|
* @param string $modifier name of template modifier
|
||||||
|
* @param string $modifier_impl name of PHP function to register
|
||||||
|
*/
|
||||||
|
public function register_modifier($modifier, $modifier_impl)
|
||||||
|
{
|
||||||
|
$this->registerPlugin('modifier', $modifier, $modifier_impl);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unregister modifier
|
||||||
|
*
|
||||||
|
* @param string $modifier name of template modifier
|
||||||
|
*/
|
||||||
|
public function unregister_modifier($modifier)
|
||||||
|
{
|
||||||
|
$this->unregisterPlugin('modifier', $modifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a resource to fetch a template
|
||||||
|
*
|
||||||
|
* @param string $type name of resource
|
||||||
|
* @param array $functions array of functions to handle resource
|
||||||
|
*/
|
||||||
|
public function register_resource($type, $functions)
|
||||||
|
{
|
||||||
|
$this->registerResource($type, $functions);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unregister a resource
|
||||||
|
*
|
||||||
|
* @param string $type name of resource
|
||||||
|
*/
|
||||||
|
public function unregister_resource($type)
|
||||||
|
{
|
||||||
|
$this->unregisterResource($type);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a prefilter function to apply
|
||||||
|
* to a template before compiling
|
||||||
|
*
|
||||||
|
* @param callable $function
|
||||||
|
*/
|
||||||
|
public function register_prefilter($function)
|
||||||
|
{
|
||||||
|
$this->registerFilter('pre', $function);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unregister a prefilter function
|
||||||
|
*
|
||||||
|
* @param callable $function
|
||||||
|
*/
|
||||||
|
public function unregister_prefilter($function)
|
||||||
|
{
|
||||||
|
$this->unregisterFilter('pre', $function);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a postfilter function to apply
|
||||||
|
* to a compiled template after compilation
|
||||||
|
*
|
||||||
|
* @param callable $function
|
||||||
|
*/
|
||||||
|
public function register_postfilter($function)
|
||||||
|
{
|
||||||
|
$this->registerFilter('post', $function);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unregister a postfilter function
|
||||||
|
*
|
||||||
|
* @param callable $function
|
||||||
|
*/
|
||||||
|
public function unregister_postfilter($function)
|
||||||
|
{
|
||||||
|
$this->unregisterFilter('post', $function);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers an output filter function to apply
|
||||||
|
* to a template output
|
||||||
|
*
|
||||||
|
* @param callable $function
|
||||||
|
*/
|
||||||
|
public function register_outputfilter($function)
|
||||||
|
{
|
||||||
|
$this->registerFilter('output', $function);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unregister an outputfilter function
|
||||||
|
*
|
||||||
|
* @param callable $function
|
||||||
|
*/
|
||||||
|
public function unregister_outputfilter($function)
|
||||||
|
{
|
||||||
|
$this->unregisterFilter('output', $function);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* load a filter of specified type and name
|
||||||
|
*
|
||||||
|
* @param string $type filter type
|
||||||
|
* @param string $name filter name
|
||||||
|
*/
|
||||||
|
public function load_filter($type, $name)
|
||||||
|
{
|
||||||
|
$this->loadFilter($type, $name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* clear cached content for the given template and cache id
|
||||||
|
*
|
||||||
|
* @param string $tpl_file name of template file
|
||||||
|
* @param string $cache_id name of cache_id
|
||||||
|
* @param string $compile_id name of compile_id
|
||||||
|
* @param string $exp_time expiration time
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function clear_cache($tpl_file = null, $cache_id = null, $compile_id = null, $exp_time = null)
|
||||||
|
{
|
||||||
|
return $this->clearCache($tpl_file, $cache_id, $compile_id, $exp_time);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* clear the entire contents of cache (all templates)
|
||||||
|
*
|
||||||
|
* @param string $exp_time expire time
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function clear_all_cache($exp_time = null)
|
||||||
|
{
|
||||||
|
return $this->clearCache(null, null, null, $exp_time);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test to see if valid cache exists for this template
|
||||||
|
*
|
||||||
|
* @param string $tpl_file name of template file
|
||||||
|
* @param string $cache_id
|
||||||
|
* @param string $compile_id
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function is_cached($tpl_file, $cache_id = null, $compile_id = null)
|
||||||
|
{
|
||||||
|
return $this->isCached($tpl_file, $cache_id, $compile_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* clear all the assigned template variables.
|
||||||
|
*/
|
||||||
|
public function clear_all_assign()
|
||||||
|
{
|
||||||
|
$this->clearAllAssign();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* clears compiled version of specified template resource,
|
||||||
|
* or all compiled template files if one is not specified.
|
||||||
|
* This function is for advanced use only, not normally needed.
|
||||||
|
*
|
||||||
|
* @param string $tpl_file
|
||||||
|
* @param string $compile_id
|
||||||
|
* @param string $exp_time
|
||||||
|
*
|
||||||
|
* @return boolean results of {@link smarty_core_rm_auto()}
|
||||||
|
*/
|
||||||
|
public function clear_compiled_tpl($tpl_file = null, $compile_id = null, $exp_time = null)
|
||||||
|
{
|
||||||
|
return $this->clearCompiledTemplate($tpl_file, $compile_id, $exp_time);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether requested template exists.
|
||||||
|
*
|
||||||
|
* @param string $tpl_file
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function template_exists($tpl_file)
|
||||||
|
{
|
||||||
|
return $this->templateExists($tpl_file);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an array containing template variables
|
||||||
|
*
|
||||||
|
* @param string $name
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function get_template_vars($name = null)
|
||||||
|
{
|
||||||
|
return $this->getTemplateVars($name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an array containing config variables
|
||||||
|
*
|
||||||
|
* @param string $name
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function get_config_vars($name = null)
|
||||||
|
{
|
||||||
|
return $this->getConfigVars($name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* load configuration values
|
||||||
|
*
|
||||||
|
* @param string $file
|
||||||
|
* @param string $section
|
||||||
|
* @param string $scope
|
||||||
|
*/
|
||||||
|
public function config_load($file, $section = null, $scope = 'global')
|
||||||
|
{
|
||||||
|
$this->ConfigLoad($file, $section, $scope);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return a reference to a registered object
|
||||||
|
*
|
||||||
|
* @param string $name
|
||||||
|
*
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
public function get_registered_object($name)
|
||||||
|
{
|
||||||
|
return $this->getRegisteredObject($name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* clear configuration values
|
||||||
|
*
|
||||||
|
* @param string $var
|
||||||
|
*/
|
||||||
|
public function clear_config($var = null)
|
||||||
|
{
|
||||||
|
$this->clearConfig($var);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* trigger Smarty error
|
||||||
|
*
|
||||||
|
* @param string $error_msg
|
||||||
|
* @param integer $error_type
|
||||||
|
*/
|
||||||
|
public function trigger_error($error_msg, $error_type = E_USER_WARNING)
|
||||||
|
{
|
||||||
|
trigger_error("Smarty error: $error_msg", $error_type);
|
||||||
|
}
|
||||||
|
}
|
||||||
17
misc/smarty_libs/bootstrap.php
Normal file
17
misc/smarty_libs/bootstrap.php
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<?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')) {
|
||||||
|
require __DIR__ . '/Autoloader.php';
|
||||||
|
}
|
||||||
|
Smarty_Autoloader::register();
|
||||||
160
misc/smarty_libs/debug.tpl
Normal file
160
misc/smarty_libs/debug.tpl
Normal file
@@ -0,0 +1,160 @@
|
|||||||
|
{capture name='_smarty_debug' assign=debug_output}
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||||
|
<head>
|
||||||
|
<title>Smarty Debug Console</title>
|
||||||
|
<style type="text/css">
|
||||||
|
{literal}
|
||||||
|
body, h1, h2, h3, td, th, p {
|
||||||
|
font-family: sans-serif;
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 0.9em;
|
||||||
|
margin: 1px;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
margin: 0;
|
||||||
|
text-align: left;
|
||||||
|
padding: 2px;
|
||||||
|
background-color: #f0c040;
|
||||||
|
color: black;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 1.2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
background-color: #9B410E;
|
||||||
|
color: white;
|
||||||
|
text-align: left;
|
||||||
|
font-weight: bold;
|
||||||
|
padding: 2px;
|
||||||
|
border-top: 1px solid black;
|
||||||
|
}
|
||||||
|
h3 {
|
||||||
|
text-align: left;
|
||||||
|
font-weight: bold;
|
||||||
|
color: black;
|
||||||
|
font-size: 0.7em;
|
||||||
|
padding: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
background: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
p, table, div {
|
||||||
|
background: #f0ead8;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin: 0;
|
||||||
|
font-style: italic;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
th, td {
|
||||||
|
font-family: monospace;
|
||||||
|
vertical-align: top;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
td {
|
||||||
|
color: green;
|
||||||
|
}
|
||||||
|
|
||||||
|
.odd {
|
||||||
|
background-color: #eeeeee;
|
||||||
|
}
|
||||||
|
|
||||||
|
.even {
|
||||||
|
background-color: #fafafa;
|
||||||
|
}
|
||||||
|
|
||||||
|
.exectime {
|
||||||
|
font-size: 0.8em;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
#bold div {
|
||||||
|
color: black;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
#blue h3 {
|
||||||
|
color: blue;
|
||||||
|
}
|
||||||
|
#normal div {
|
||||||
|
color: black;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
#table_assigned_vars th {
|
||||||
|
color: blue;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
#table_config_vars th {
|
||||||
|
color: maroon;
|
||||||
|
}
|
||||||
|
|
||||||
|
{/literal}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h1>Smarty {Smarty::SMARTY_VERSION} Debug Console
|
||||||
|
- {if isset($template_name)}{$template_name|debug_print_var nofilter} {/if}{if !empty($template_data)}Total Time {$execution_time|string_format:"%.5f"}{/if}</h1>
|
||||||
|
|
||||||
|
{if !empty($template_data)}
|
||||||
|
<h2>included templates & config files (load time in seconds)</h2>
|
||||||
|
<div>
|
||||||
|
{foreach $template_data as $template}
|
||||||
|
<font color=brown>{$template.name}</font>
|
||||||
|
<br> <span class="exectime">
|
||||||
|
(compile {$template['compile_time']|string_format:"%.5f"}) (render {$template['render_time']|string_format:"%.5f"}) (cache {$template['cache_time']|string_format:"%.5f"})
|
||||||
|
</span>
|
||||||
|
<br>
|
||||||
|
{/foreach}
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
<h2>assigned template variables</h2>
|
||||||
|
|
||||||
|
<table id="table_assigned_vars">
|
||||||
|
{foreach $assigned_vars as $vars}
|
||||||
|
<tr class="{if $vars@iteration % 2 eq 0}odd{else}even{/if}">
|
||||||
|
<td><h3><font color=blue>${$vars@key}</font></h3>
|
||||||
|
{if isset($vars['nocache'])}<b>Nocache</b></br>{/if}
|
||||||
|
{if isset($vars['scope'])}<b>Origin:</b> {$vars['scope']|debug_print_var nofilter}{/if}
|
||||||
|
</td>
|
||||||
|
<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>
|
||||||
114
misc/smarty_libs/plugins/block.textformat.php
Normal file
114
misc/smarty_libs/plugins/block.textformat.php
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin to format text blocks
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsBlock
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty {textformat}{/textformat} block plugin
|
||||||
|
* Type: block function<br>
|
||||||
|
* Name: textformat<br>
|
||||||
|
* Purpose: format text a certain way with preset styles
|
||||||
|
* or custom wrap/indent settings<br>
|
||||||
|
* Params:
|
||||||
|
* <pre>
|
||||||
|
* - style - string (email)
|
||||||
|
* - indent - integer (0)
|
||||||
|
* - wrap - integer (80)
|
||||||
|
* - wrap_char - string ("\n")
|
||||||
|
* - indent_char - string (" ")
|
||||||
|
* - wrap_boundary - boolean (true)
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* @link http://www.smarty.net/manual/en/language.function.textformat.php {textformat}
|
||||||
|
* (Smarty online manual)
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
* @param string $content contents of the block
|
||||||
|
* @param Smarty_Internal_Template $template template object
|
||||||
|
* @param boolean &$repeat repeat flag
|
||||||
|
*
|
||||||
|
* @return string content re-formatted
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
*/
|
||||||
|
function smarty_block_textformat($params, $content, $template, &$repeat)
|
||||||
|
{
|
||||||
|
if (is_null($content)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (Smarty::$_MBSTRING && !is_callable('smarty_mb_wordwrap')) {
|
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.mb_wordwrap.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
$style = null;
|
||||||
|
$indent = 0;
|
||||||
|
$indent_first = 0;
|
||||||
|
$indent_char = ' ';
|
||||||
|
$wrap = 80;
|
||||||
|
$wrap_char = "\n";
|
||||||
|
$wrap_cut = false;
|
||||||
|
$assign = null;
|
||||||
|
|
||||||
|
foreach ($params as $_key => $_val) {
|
||||||
|
switch ($_key) {
|
||||||
|
case 'style':
|
||||||
|
case 'indent_char':
|
||||||
|
case 'wrap_char':
|
||||||
|
case 'assign':
|
||||||
|
$$_key = (string) $_val;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'indent':
|
||||||
|
case 'indent_first':
|
||||||
|
case 'wrap':
|
||||||
|
$$_key = (int) $_val;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'wrap_cut':
|
||||||
|
$$_key = (bool) $_val;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
trigger_error("textformat: unknown attribute '$_key'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($style == 'email') {
|
||||||
|
$wrap = 72;
|
||||||
|
}
|
||||||
|
// split into paragraphs
|
||||||
|
$_paragraphs = preg_split('![\r\n]{2}!', $content);
|
||||||
|
|
||||||
|
foreach ($_paragraphs as &$_paragraph) {
|
||||||
|
if (!$_paragraph) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// convert mult. spaces & special chars to single space
|
||||||
|
$_paragraph =
|
||||||
|
preg_replace(array('!\s+!' . Smarty::$_UTF8_MODIFIER, '!(^\s+)|(\s+$)!' . Smarty::$_UTF8_MODIFIER),
|
||||||
|
array(' ', ''), $_paragraph);
|
||||||
|
// indent first line
|
||||||
|
if ($indent_first > 0) {
|
||||||
|
$_paragraph = str_repeat($indent_char, $indent_first) . $_paragraph;
|
||||||
|
}
|
||||||
|
// wordwrap sentences
|
||||||
|
if (Smarty::$_MBSTRING) {
|
||||||
|
$_paragraph = smarty_mb_wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut);
|
||||||
|
} else {
|
||||||
|
$_paragraph = wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut);
|
||||||
|
}
|
||||||
|
// indent lines
|
||||||
|
if ($indent > 0) {
|
||||||
|
$_paragraph = preg_replace('!^!m', str_repeat($indent_char, $indent), $_paragraph);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$_output = implode($wrap_char . $wrap_char, $_paragraphs);
|
||||||
|
|
||||||
|
if ($assign) {
|
||||||
|
$template->assign($assign, $_output);
|
||||||
|
} else {
|
||||||
|
return $_output;
|
||||||
|
}
|
||||||
|
}
|
||||||
73
misc/smarty_libs/plugins/function.counter.php
Normal file
73
misc/smarty_libs/plugins/function.counter.php
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsFunction
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty {counter} function plugin
|
||||||
|
* Type: function<br>
|
||||||
|
* Name: counter<br>
|
||||||
|
* Purpose: print out a counter value
|
||||||
|
*
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
* @link http://www.smarty.net/manual/en/language.function.counter.php {counter}
|
||||||
|
* (Smarty online manual)
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
* @param Smarty_Internal_Template $template template object
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
function smarty_function_counter($params, $template)
|
||||||
|
{
|
||||||
|
static $counters = array();
|
||||||
|
|
||||||
|
$name = (isset($params[ 'name' ])) ? $params[ 'name' ] : 'default';
|
||||||
|
if (!isset($counters[ $name ])) {
|
||||||
|
$counters[ $name ] = array('start' => 1, 'skip' => 1, 'direction' => 'up', 'count' => 1);
|
||||||
|
}
|
||||||
|
$counter =& $counters[ $name ];
|
||||||
|
|
||||||
|
if (isset($params[ 'start' ])) {
|
||||||
|
$counter[ 'start' ] = $counter[ 'count' ] = (int) $params[ 'start' ];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($params[ 'assign' ])) {
|
||||||
|
$counter[ 'assign' ] = $params[ 'assign' ];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($counter[ 'assign' ])) {
|
||||||
|
$template->assign($counter[ 'assign' ], $counter[ 'count' ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($params[ 'print' ])) {
|
||||||
|
$print = (bool) $params[ 'print' ];
|
||||||
|
} else {
|
||||||
|
$print = empty($counter[ 'assign' ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($print) {
|
||||||
|
$retval = $counter[ 'count' ];
|
||||||
|
} else {
|
||||||
|
$retval = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($params[ 'skip' ])) {
|
||||||
|
$counter[ 'skip' ] = $params[ 'skip' ];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($params[ 'direction' ])) {
|
||||||
|
$counter[ 'direction' ] = $params[ 'direction' ];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($counter[ 'direction' ] == "down") {
|
||||||
|
$counter[ 'count' ] -= $counter[ 'skip' ];
|
||||||
|
} else {
|
||||||
|
$counter[ 'count' ] += $counter[ 'skip' ];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $retval;
|
||||||
|
}
|
||||||
105
misc/smarty_libs/plugins/function.cycle.php
Normal file
105
misc/smarty_libs/plugins/function.cycle.php
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsFunction
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty {cycle} function plugin
|
||||||
|
* Type: function<br>
|
||||||
|
* Name: cycle<br>
|
||||||
|
* Date: May 3, 2002<br>
|
||||||
|
* Purpose: cycle through given values<br>
|
||||||
|
* Params:
|
||||||
|
* <pre>
|
||||||
|
* - name - name of cycle (optional)
|
||||||
|
* - values - comma separated list of values to cycle, or an array of values to cycle
|
||||||
|
* (this can be left out for subsequent calls)
|
||||||
|
* - reset - boolean - resets given var to true
|
||||||
|
* - print - boolean - print var or not. default is true
|
||||||
|
* - advance - boolean - whether or not to advance the cycle
|
||||||
|
* - delimiter - the value delimiter, default is ","
|
||||||
|
* - assign - boolean, assigns to template var instead of printed.
|
||||||
|
* </pre>
|
||||||
|
* Examples:<br>
|
||||||
|
* <pre>
|
||||||
|
* {cycle values="#eeeeee,#d0d0d0d"}
|
||||||
|
* {cycle name=row values="one,two,three" reset=true}
|
||||||
|
* {cycle name=row}
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* @link http://www.smarty.net/manual/en/language.function.cycle.php {cycle}
|
||||||
|
* (Smarty online manual)
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
* @author credit to Mark Priatel <mpriatel@rogers.com>
|
||||||
|
* @author credit to Gerard <gerard@interfold.com>
|
||||||
|
* @author credit to Jason Sweat <jsweat_php@yahoo.com>
|
||||||
|
* @version 1.3
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
* @param Smarty_Internal_Template $template template object
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
|
||||||
|
function smarty_function_cycle($params, $template)
|
||||||
|
{
|
||||||
|
static $cycle_vars;
|
||||||
|
|
||||||
|
$name = (empty($params[ 'name' ])) ? 'default' : $params[ 'name' ];
|
||||||
|
$print = (isset($params[ 'print' ])) ? (bool) $params[ 'print' ] : true;
|
||||||
|
$advance = (isset($params[ 'advance' ])) ? (bool) $params[ 'advance' ] : true;
|
||||||
|
$reset = (isset($params[ 'reset' ])) ? (bool) $params[ 'reset' ] : false;
|
||||||
|
|
||||||
|
if (!isset($params[ 'values' ])) {
|
||||||
|
if (!isset($cycle_vars[ $name ][ 'values' ])) {
|
||||||
|
trigger_error("cycle: missing 'values' parameter");
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (isset($cycle_vars[ $name ][ 'values' ]) && $cycle_vars[ $name ][ 'values' ] != $params[ 'values' ]) {
|
||||||
|
$cycle_vars[ $name ][ 'index' ] = 0;
|
||||||
|
}
|
||||||
|
$cycle_vars[ $name ][ 'values' ] = $params[ 'values' ];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($params[ 'delimiter' ])) {
|
||||||
|
$cycle_vars[ $name ][ 'delimiter' ] = $params[ 'delimiter' ];
|
||||||
|
} elseif (!isset($cycle_vars[ $name ][ 'delimiter' ])) {
|
||||||
|
$cycle_vars[ $name ][ 'delimiter' ] = ',';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_array($cycle_vars[ $name ][ 'values' ])) {
|
||||||
|
$cycle_array = $cycle_vars[ $name ][ 'values' ];
|
||||||
|
} else {
|
||||||
|
$cycle_array = explode($cycle_vars[ $name ][ 'delimiter' ], $cycle_vars[ $name ][ 'values' ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($cycle_vars[ $name ][ 'index' ]) || $reset) {
|
||||||
|
$cycle_vars[ $name ][ 'index' ] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($params[ 'assign' ])) {
|
||||||
|
$print = false;
|
||||||
|
$template->assign($params[ 'assign' ], $cycle_array[ $cycle_vars[ $name ][ 'index' ] ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($print) {
|
||||||
|
$retval = $cycle_array[ $cycle_vars[ $name ][ 'index' ] ];
|
||||||
|
} else {
|
||||||
|
$retval = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($advance) {
|
||||||
|
if ($cycle_vars[ $name ][ 'index' ] >= count($cycle_array) - 1) {
|
||||||
|
$cycle_vars[ $name ][ 'index' ] = 0;
|
||||||
|
} else {
|
||||||
|
$cycle_vars[ $name ][ 'index' ] ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $retval;
|
||||||
|
}
|
||||||
221
misc/smarty_libs/plugins/function.fetch.php
Normal file
221
misc/smarty_libs/plugins/function.fetch.php
Normal file
@@ -0,0 +1,221 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsFunction
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty {fetch} plugin
|
||||||
|
* Type: function<br>
|
||||||
|
* Name: fetch<br>
|
||||||
|
* Purpose: fetch file, web or ftp data and display results
|
||||||
|
*
|
||||||
|
* @link http://www.smarty.net/manual/en/language.function.fetch.php {fetch}
|
||||||
|
* (Smarty online manual)
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
* @param Smarty_Internal_Template $template template object
|
||||||
|
*
|
||||||
|
* @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)
|
||||||
|
{
|
||||||
|
if (empty($params[ 'file' ])) {
|
||||||
|
trigger_error("[plugin] fetch parameter 'file' cannot be empty", E_USER_NOTICE);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// strip file protocol
|
||||||
|
if (stripos($params[ 'file' ], 'file://') === 0) {
|
||||||
|
$params[ 'file' ] = substr($params[ 'file' ], 7);
|
||||||
|
}
|
||||||
|
|
||||||
|
$protocol = strpos($params[ 'file' ], '://');
|
||||||
|
if ($protocol !== false) {
|
||||||
|
$protocol = strtolower(substr($params[ 'file' ], 0, $protocol));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($template->smarty->security_policy)) {
|
||||||
|
if ($protocol) {
|
||||||
|
// remote resource (or php stream, …)
|
||||||
|
if (!$template->smarty->security_policy->isTrustedUri($params[ 'file' ])) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// local file
|
||||||
|
if (!$template->smarty->security_policy->isTrustedResourceDir($params[ 'file' ])) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$content = '';
|
||||||
|
if ($protocol == 'http') {
|
||||||
|
// http fetch
|
||||||
|
if ($uri_parts = parse_url($params[ 'file' ])) {
|
||||||
|
// set defaults
|
||||||
|
$host = $server_name = $uri_parts[ 'host' ];
|
||||||
|
$timeout = 30;
|
||||||
|
$accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*";
|
||||||
|
$agent = "Smarty Template Engine " . Smarty::SMARTY_VERSION;
|
||||||
|
$referer = "";
|
||||||
|
$uri = !empty($uri_parts[ 'path' ]) ? $uri_parts[ 'path' ] : '/';
|
||||||
|
$uri .= !empty($uri_parts[ 'query' ]) ? '?' . $uri_parts[ 'query' ] : '';
|
||||||
|
$_is_proxy = false;
|
||||||
|
if (empty($uri_parts[ 'port' ])) {
|
||||||
|
$port = 80;
|
||||||
|
} else {
|
||||||
|
$port = $uri_parts[ 'port' ];
|
||||||
|
}
|
||||||
|
if (!empty($uri_parts[ 'user' ])) {
|
||||||
|
$user = $uri_parts[ 'user' ];
|
||||||
|
}
|
||||||
|
if (!empty($uri_parts[ 'pass' ])) {
|
||||||
|
$pass = $uri_parts[ 'pass' ];
|
||||||
|
}
|
||||||
|
// loop through parameters, setup headers
|
||||||
|
foreach ($params as $param_key => $param_value) {
|
||||||
|
switch ($param_key) {
|
||||||
|
case "file":
|
||||||
|
case "assign":
|
||||||
|
case "assign_headers":
|
||||||
|
break;
|
||||||
|
case "user":
|
||||||
|
if (!empty($param_value)) {
|
||||||
|
$user = $param_value;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "pass":
|
||||||
|
if (!empty($param_value)) {
|
||||||
|
$pass = $param_value;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "accept":
|
||||||
|
if (!empty($param_value)) {
|
||||||
|
$accept = $param_value;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "header":
|
||||||
|
if (!empty($param_value)) {
|
||||||
|
if (!preg_match('![\w\d-]+: .+!', $param_value)) {
|
||||||
|
trigger_error("[plugin] invalid header format '" . $param_value . "'", E_USER_NOTICE);
|
||||||
|
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
$extra_headers[] = $param_value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "proxy_host":
|
||||||
|
if (!empty($param_value)) {
|
||||||
|
$proxy_host = $param_value;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "proxy_port":
|
||||||
|
if (!preg_match('!\D!', $param_value)) {
|
||||||
|
$proxy_port = (int) $param_value;
|
||||||
|
} else {
|
||||||
|
trigger_error("[plugin] invalid value for attribute '" . $param_key . "'", E_USER_NOTICE);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "agent":
|
||||||
|
if (!empty($param_value)) {
|
||||||
|
$agent = $param_value;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "referer":
|
||||||
|
if (!empty($param_value)) {
|
||||||
|
$referer = $param_value;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "timeout":
|
||||||
|
if (!preg_match('!\D!', $param_value)) {
|
||||||
|
$timeout = (int) $param_value;
|
||||||
|
} else {
|
||||||
|
trigger_error("[plugin] invalid value for attribute '" . $param_key . "'", E_USER_NOTICE);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
trigger_error("[plugin] unrecognized attribute '" . $param_key . "'", E_USER_NOTICE);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!empty($proxy_host) && !empty($proxy_port)) {
|
||||||
|
$_is_proxy = true;
|
||||||
|
$fp = fsockopen($proxy_host, $proxy_port, $errno, $errstr, $timeout);
|
||||||
|
} else {
|
||||||
|
$fp = fsockopen($server_name, $port, $errno, $errstr, $timeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$fp) {
|
||||||
|
trigger_error("[plugin] unable to fetch: $errstr ($errno)", E_USER_NOTICE);
|
||||||
|
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
if ($_is_proxy) {
|
||||||
|
fputs($fp, 'GET ' . $params[ 'file' ] . " HTTP/1.0\r\n");
|
||||||
|
} else {
|
||||||
|
fputs($fp, "GET $uri HTTP/1.0\r\n");
|
||||||
|
}
|
||||||
|
if (!empty($host)) {
|
||||||
|
fputs($fp, "Host: $host\r\n");
|
||||||
|
}
|
||||||
|
if (!empty($accept)) {
|
||||||
|
fputs($fp, "Accept: $accept\r\n");
|
||||||
|
}
|
||||||
|
if (!empty($agent)) {
|
||||||
|
fputs($fp, "User-Agent: $agent\r\n");
|
||||||
|
}
|
||||||
|
if (!empty($referer)) {
|
||||||
|
fputs($fp, "Referer: $referer\r\n");
|
||||||
|
}
|
||||||
|
if (isset($extra_headers) && is_array($extra_headers)) {
|
||||||
|
foreach ($extra_headers as $curr_header) {
|
||||||
|
fputs($fp, $curr_header . "\r\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!empty($user) && !empty($pass)) {
|
||||||
|
fputs($fp, "Authorization: BASIC " . base64_encode("$user:$pass") . "\r\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
fputs($fp, "\r\n");
|
||||||
|
while (!feof($fp)) {
|
||||||
|
$content .= fgets($fp, 4096);
|
||||||
|
}
|
||||||
|
fclose($fp);
|
||||||
|
$csplit = preg_split("!\r\n\r\n!", $content, 2);
|
||||||
|
|
||||||
|
$content = $csplit[ 1 ];
|
||||||
|
|
||||||
|
if (!empty($params[ 'assign_headers' ])) {
|
||||||
|
$template->assign($params[ 'assign_headers' ], preg_split("!\r\n!", $csplit[ 0 ]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
trigger_error("[plugin fetch] unable to parse URL, check syntax", E_USER_NOTICE);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$content = @file_get_contents($params[ 'file' ]);
|
||||||
|
if ($content === false) {
|
||||||
|
throw new SmartyException("{fetch} cannot read resource '" . $params[ 'file' ] . "'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($params[ 'assign' ])) {
|
||||||
|
$template->assign($params[ 'assign' ], $content);
|
||||||
|
} else {
|
||||||
|
return $content;
|
||||||
|
}
|
||||||
|
}
|
||||||
251
misc/smarty_libs/plugins/function.html_checkboxes.php
Normal file
251
misc/smarty_libs/plugins/function.html_checkboxes.php
Normal file
@@ -0,0 +1,251 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsFunction
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty {html_checkboxes} function plugin
|
||||||
|
* File: function.html_checkboxes.php<br>
|
||||||
|
* Type: function<br>
|
||||||
|
* Name: html_checkboxes<br>
|
||||||
|
* Date: 24.Feb.2003<br>
|
||||||
|
* Purpose: Prints out a list of checkbox input types<br>
|
||||||
|
* Examples:
|
||||||
|
* <pre>
|
||||||
|
* {html_checkboxes values=$ids output=$names}
|
||||||
|
* {html_checkboxes values=$ids name='box' separator='<br>' output=$names}
|
||||||
|
* {html_checkboxes values=$ids checked=$checked separator='<br>' output=$names}
|
||||||
|
* </pre>
|
||||||
|
* Params:
|
||||||
|
* <pre>
|
||||||
|
* - name (optional) - string default "checkbox"
|
||||||
|
* - values (required) - array
|
||||||
|
* - options (optional) - associative array
|
||||||
|
* - checked (optional) - array default not set
|
||||||
|
* - separator (optional) - ie <br> or
|
||||||
|
* - output (optional) - the output next to each checkbox
|
||||||
|
* - assign (optional) - assign the output as an array to this variable
|
||||||
|
* - escape (optional) - escape the content (not value), defaults to true
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* @link http://www.smarty.net/manual/en/language.function.html.checkboxes.php {html_checkboxes}
|
||||||
|
* (Smarty online manual)
|
||||||
|
* @author Christopher Kvarme <christopher.kvarme@flashjab.com>
|
||||||
|
* @author credits to Monte Ohrt <monte at ohrt dot com>
|
||||||
|
* @version 1.0
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
* @param object $template template object
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @uses smarty_function_escape_special_chars()
|
||||||
|
*/
|
||||||
|
function smarty_function_html_checkboxes($params, $template)
|
||||||
|
{
|
||||||
|
if (!is_callable('smarty_function_escape_special_chars')) {
|
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
$name = 'checkbox';
|
||||||
|
$values = null;
|
||||||
|
$options = null;
|
||||||
|
$selected = array();
|
||||||
|
$separator = '';
|
||||||
|
$escape = true;
|
||||||
|
$labels = true;
|
||||||
|
$label_ids = false;
|
||||||
|
$output = null;
|
||||||
|
|
||||||
|
$extra = '';
|
||||||
|
|
||||||
|
foreach ($params as $_key => $_val) {
|
||||||
|
switch ($_key) {
|
||||||
|
case 'name':
|
||||||
|
case 'separator':
|
||||||
|
$$_key = (string) $_val;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'escape':
|
||||||
|
case 'labels':
|
||||||
|
case 'label_ids':
|
||||||
|
$$_key = (bool) $_val;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'options':
|
||||||
|
$$_key = (array) $_val;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'values':
|
||||||
|
case 'output':
|
||||||
|
$$_key = array_values((array) $_val);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'checked':
|
||||||
|
case 'selected':
|
||||||
|
if (is_array($_val)) {
|
||||||
|
$selected = array();
|
||||||
|
foreach ($_val as $_sel) {
|
||||||
|
if (is_object($_sel)) {
|
||||||
|
if (method_exists($_sel, "__toString")) {
|
||||||
|
$_sel = smarty_function_escape_special_chars((string) $_sel->__toString());
|
||||||
|
} else {
|
||||||
|
trigger_error("html_checkboxes: selected attribute contains an object of class '" .
|
||||||
|
get_class($_sel) . "' without __toString() method", E_USER_NOTICE);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$_sel = smarty_function_escape_special_chars((string) $_sel);
|
||||||
|
}
|
||||||
|
$selected[ $_sel ] = true;
|
||||||
|
}
|
||||||
|
} elseif (is_object($_val)) {
|
||||||
|
if (method_exists($_val, "__toString")) {
|
||||||
|
$selected = smarty_function_escape_special_chars((string) $_val->__toString());
|
||||||
|
} else {
|
||||||
|
trigger_error("html_checkboxes: selected attribute is an object of class '" . get_class($_val) .
|
||||||
|
"' without __toString() method", E_USER_NOTICE);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$selected = smarty_function_escape_special_chars((string) $_val);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'checkboxes':
|
||||||
|
trigger_error('html_checkboxes: the use of the "checkboxes" attribute is deprecated, use "options" instead',
|
||||||
|
E_USER_WARNING);
|
||||||
|
$options = (array) $_val;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'assign':
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'strict':
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'disabled':
|
||||||
|
case 'readonly':
|
||||||
|
if (!empty($params[ 'strict' ])) {
|
||||||
|
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",
|
||||||
|
E_USER_NOTICE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($_val === true || $_val === $_key) {
|
||||||
|
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"';
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// omit break; to fall through!
|
||||||
|
|
||||||
|
default:
|
||||||
|
if (!is_array($_val)) {
|
||||||
|
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"';
|
||||||
|
} else {
|
||||||
|
trigger_error("html_checkboxes: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($options) && !isset($values)) {
|
||||||
|
return '';
|
||||||
|
} /* raise error here? */
|
||||||
|
|
||||||
|
$_html_result = array();
|
||||||
|
|
||||||
|
if (isset($options)) {
|
||||||
|
foreach ($options as $_key => $_val) {
|
||||||
|
$_html_result[] =
|
||||||
|
smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels,
|
||||||
|
$label_ids, $escape);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
foreach ($values as $_i => $_key) {
|
||||||
|
$_val = isset($output[ $_i ]) ? $output[ $_i ] : '';
|
||||||
|
$_html_result[] =
|
||||||
|
smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels,
|
||||||
|
$label_ids, $escape);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($params[ 'assign' ])) {
|
||||||
|
$template->assign($params[ 'assign' ], $_html_result);
|
||||||
|
} else {
|
||||||
|
return implode("\n", $_html_result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function smarty_function_html_checkboxes_output($name, $value, $output, $selected, $extra, $separator, $labels,
|
||||||
|
$label_ids, $escape = true)
|
||||||
|
{
|
||||||
|
$_output = '';
|
||||||
|
|
||||||
|
if (is_object($value)) {
|
||||||
|
if (method_exists($value, "__toString")) {
|
||||||
|
$value = (string) $value->__toString();
|
||||||
|
} else {
|
||||||
|
trigger_error("html_options: value is an object of class '" . get_class($value) .
|
||||||
|
"' without __toString() method", E_USER_NOTICE);
|
||||||
|
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$value = (string) $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_object($output)) {
|
||||||
|
if (method_exists($output, "__toString")) {
|
||||||
|
$output = (string) $output->__toString();
|
||||||
|
} else {
|
||||||
|
trigger_error("html_options: output is an object of class '" . get_class($output) .
|
||||||
|
"' without __toString() method", E_USER_NOTICE);
|
||||||
|
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$output = (string) $output;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($labels) {
|
||||||
|
if ($label_ids) {
|
||||||
|
$_id = smarty_function_escape_special_chars(preg_replace('![^\w\-\.]!' . Smarty::$_UTF8_MODIFIER, '_',
|
||||||
|
$name . '_' . $value));
|
||||||
|
$_output .= '<label for="' . $_id . '">';
|
||||||
|
} else {
|
||||||
|
$_output .= '<label>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$name = smarty_function_escape_special_chars($name);
|
||||||
|
$value = smarty_function_escape_special_chars($value);
|
||||||
|
if ($escape) {
|
||||||
|
$output = smarty_function_escape_special_chars($output);
|
||||||
|
}
|
||||||
|
|
||||||
|
$_output .= '<input type="checkbox" name="' . $name . '[]" value="' . $value . '"';
|
||||||
|
|
||||||
|
if ($labels && $label_ids) {
|
||||||
|
$_output .= ' id="' . $_id . '"';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_array($selected)) {
|
||||||
|
if (isset($selected[ $value ])) {
|
||||||
|
$_output .= ' checked="checked"';
|
||||||
|
}
|
||||||
|
} elseif ($value === $selected) {
|
||||||
|
$_output .= ' checked="checked"';
|
||||||
|
}
|
||||||
|
|
||||||
|
$_output .= $extra . ' />' . $output;
|
||||||
|
if ($labels) {
|
||||||
|
$_output .= '</label>';
|
||||||
|
}
|
||||||
|
|
||||||
|
$_output .= $separator;
|
||||||
|
|
||||||
|
return $_output;
|
||||||
|
}
|
||||||
166
misc/smarty_libs/plugins/function.html_image.php
Normal file
166
misc/smarty_libs/plugins/function.html_image.php
Normal file
@@ -0,0 +1,166 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsFunction
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty {html_image} function plugin
|
||||||
|
* Type: function<br>
|
||||||
|
* Name: html_image<br>
|
||||||
|
* Date: Feb 24, 2003<br>
|
||||||
|
* Purpose: format HTML tags for the image<br>
|
||||||
|
* Examples: {html_image file="/images/masthead.gif"}<br>
|
||||||
|
* Output: <img src="/images/masthead.gif" width=400 height=23><br>
|
||||||
|
* Params:
|
||||||
|
* <pre>
|
||||||
|
* - file - (required) - file (and path) of image
|
||||||
|
* - height - (optional) - image height (default actual height)
|
||||||
|
* - width - (optional) - image width (default actual width)
|
||||||
|
* - basedir - (optional) - base directory for absolute paths, default is environment variable DOCUMENT_ROOT
|
||||||
|
* - path_prefix - prefix for path output (optional, default empty)
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* @link http://www.smarty.net/manual/en/language.function.html.image.php {html_image}
|
||||||
|
* (Smarty online manual)
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
* @author credits to Duda <duda@big.hu>
|
||||||
|
* @version 1.0
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
* @param Smarty_Internal_Template $template template object
|
||||||
|
*
|
||||||
|
* @throws SmartyException
|
||||||
|
* @return string
|
||||||
|
* @uses smarty_function_escape_special_chars()
|
||||||
|
*/
|
||||||
|
function smarty_function_html_image($params, $template)
|
||||||
|
{
|
||||||
|
if (!is_callable('smarty_function_escape_special_chars')) {
|
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
$alt = '';
|
||||||
|
$file = '';
|
||||||
|
$height = '';
|
||||||
|
$width = '';
|
||||||
|
$extra = '';
|
||||||
|
$prefix = '';
|
||||||
|
$suffix = '';
|
||||||
|
$path_prefix = '';
|
||||||
|
$basedir = isset($_SERVER[ 'DOCUMENT_ROOT' ]) ? $_SERVER[ 'DOCUMENT_ROOT' ] : '';
|
||||||
|
foreach ($params as $_key => $_val) {
|
||||||
|
switch ($_key) {
|
||||||
|
case 'file':
|
||||||
|
case 'height':
|
||||||
|
case 'width':
|
||||||
|
case 'dpi':
|
||||||
|
case 'path_prefix':
|
||||||
|
case 'basedir':
|
||||||
|
$$_key = $_val;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'alt':
|
||||||
|
if (!is_array($_val)) {
|
||||||
|
$$_key = smarty_function_escape_special_chars($_val);
|
||||||
|
} else {
|
||||||
|
throw new SmartyException ("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'link':
|
||||||
|
case 'href':
|
||||||
|
$prefix = '<a href="' . $_val . '">';
|
||||||
|
$suffix = '</a>';
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
if (!is_array($_val)) {
|
||||||
|
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"';
|
||||||
|
} else {
|
||||||
|
throw new SmartyException ("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($file)) {
|
||||||
|
trigger_error("html_image: missing 'file' parameter", E_USER_NOTICE);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($file[ 0 ] == '/') {
|
||||||
|
$_image_path = $basedir . $file;
|
||||||
|
} else {
|
||||||
|
$_image_path = $file;
|
||||||
|
}
|
||||||
|
|
||||||
|
// strip file protocol
|
||||||
|
if (stripos($params[ 'file' ], 'file://') === 0) {
|
||||||
|
$params[ 'file' ] = substr($params[ 'file' ], 7);
|
||||||
|
}
|
||||||
|
|
||||||
|
$protocol = strpos($params[ 'file' ], '://');
|
||||||
|
if ($protocol !== false) {
|
||||||
|
$protocol = strtolower(substr($params[ 'file' ], 0, $protocol));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($template->smarty->security_policy)) {
|
||||||
|
if ($protocol) {
|
||||||
|
// remote resource (or php stream, …)
|
||||||
|
if (!$template->smarty->security_policy->isTrustedUri($params[ 'file' ])) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// local file
|
||||||
|
if (!$template->smarty->security_policy->isTrustedResourceDir($_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)) {
|
||||||
|
trigger_error("html_image: unable to find '$_image_path'", E_USER_NOTICE);
|
||||||
|
|
||||||
|
return;
|
||||||
|
} elseif (!is_readable($_image_path)) {
|
||||||
|
trigger_error("html_image: unable to read '$_image_path'", E_USER_NOTICE);
|
||||||
|
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
trigger_error("html_image: '$_image_path' is not a valid image file", E_USER_NOTICE);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($params[ 'width' ])) {
|
||||||
|
$width = $_image_data[ 0 ];
|
||||||
|
}
|
||||||
|
if (!isset($params[ 'height' ])) {
|
||||||
|
$height = $_image_data[ 1 ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($params[ 'dpi' ])) {
|
||||||
|
if (strstr($_SERVER[ 'HTTP_USER_AGENT' ], 'Mac')) {
|
||||||
|
// FIXME: (rodneyrehm) wrong dpi assumption
|
||||||
|
// don't know who thought this up… even if it was true in 1998, it's definitely wrong in 2011.
|
||||||
|
$dpi_default = 72;
|
||||||
|
} else {
|
||||||
|
$dpi_default = 96;
|
||||||
|
}
|
||||||
|
$_resize = $dpi_default / $params[ 'dpi' ];
|
||||||
|
$width = round($width * $_resize);
|
||||||
|
$height = round($height * $_resize);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $prefix . '<img src="' . $path_prefix . $file . '" alt="' . $alt . '" width="' . $width . '" height="' .
|
||||||
|
$height . '"' . $extra . ' />' . $suffix;
|
||||||
|
}
|
||||||
206
misc/smarty_libs/plugins/function.html_options.php
Normal file
206
misc/smarty_libs/plugins/function.html_options.php
Normal file
@@ -0,0 +1,206 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsFunction
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty {html_options} function plugin
|
||||||
|
* Type: function<br>
|
||||||
|
* Name: html_options<br>
|
||||||
|
* Purpose: Prints the list of <option> tags generated from
|
||||||
|
* the passed parameters<br>
|
||||||
|
* Params:
|
||||||
|
* <pre>
|
||||||
|
* - name (optional) - string default "select"
|
||||||
|
* - values (required) - if no options supplied) - array
|
||||||
|
* - options (required) - if no values supplied) - associative array
|
||||||
|
* - selected (optional) - string default not set
|
||||||
|
* - output (required) - if not options supplied) - array
|
||||||
|
* - id (optional) - string default not set
|
||||||
|
* - class (optional) - string default not set
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* @link http://www.smarty.net/manual/en/language.function.html.options.php {html_image}
|
||||||
|
* (Smarty online manual)
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
* @author Ralf Strehle (minor optimization) <ralf dot strehle at yahoo dot de>
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @uses smarty_function_escape_special_chars()
|
||||||
|
*/
|
||||||
|
function smarty_function_html_options($params)
|
||||||
|
{
|
||||||
|
if (!is_callable('smarty_function_escape_special_chars')) {
|
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
$name = null;
|
||||||
|
$values = null;
|
||||||
|
$options = null;
|
||||||
|
$selected = null;
|
||||||
|
$output = null;
|
||||||
|
$id = null;
|
||||||
|
$class = null;
|
||||||
|
|
||||||
|
$extra = '';
|
||||||
|
|
||||||
|
foreach ($params as $_key => $_val) {
|
||||||
|
switch ($_key) {
|
||||||
|
case 'name':
|
||||||
|
case 'class':
|
||||||
|
case 'id':
|
||||||
|
$$_key = (string) $_val;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'options':
|
||||||
|
$options = (array) $_val;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'values':
|
||||||
|
case 'output':
|
||||||
|
$$_key = array_values((array) $_val);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'selected':
|
||||||
|
if (is_array($_val)) {
|
||||||
|
$selected = array();
|
||||||
|
foreach ($_val as $_sel) {
|
||||||
|
if (is_object($_sel)) {
|
||||||
|
if (method_exists($_sel, "__toString")) {
|
||||||
|
$_sel = smarty_function_escape_special_chars((string) $_sel->__toString());
|
||||||
|
} else {
|
||||||
|
trigger_error("html_options: selected attribute contains an object of class '" .
|
||||||
|
get_class($_sel) . "' without __toString() method", E_USER_NOTICE);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$_sel = smarty_function_escape_special_chars((string) $_sel);
|
||||||
|
}
|
||||||
|
$selected[ $_sel ] = true;
|
||||||
|
}
|
||||||
|
} elseif (is_object($_val)) {
|
||||||
|
if (method_exists($_val, "__toString")) {
|
||||||
|
$selected = smarty_function_escape_special_chars((string) $_val->__toString());
|
||||||
|
} else {
|
||||||
|
trigger_error("html_options: selected attribute is an object of class '" . get_class($_val) .
|
||||||
|
"' without __toString() method", E_USER_NOTICE);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$selected = smarty_function_escape_special_chars((string) $_val);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'strict':
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'disabled':
|
||||||
|
case 'readonly':
|
||||||
|
if (!empty($params[ 'strict' ])) {
|
||||||
|
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",
|
||||||
|
E_USER_NOTICE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($_val === true || $_val === $_key) {
|
||||||
|
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"';
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// omit break; to fall through!
|
||||||
|
|
||||||
|
default:
|
||||||
|
if (!is_array($_val)) {
|
||||||
|
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"';
|
||||||
|
} else {
|
||||||
|
trigger_error("html_options: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($options) && !isset($values)) {
|
||||||
|
/* raise error here? */
|
||||||
|
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
$_html_result = '';
|
||||||
|
$_idx = 0;
|
||||||
|
|
||||||
|
if (isset($options)) {
|
||||||
|
foreach ($options as $_key => $_val) {
|
||||||
|
$_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected, $id, $class, $_idx);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
foreach ($values as $_i => $_key) {
|
||||||
|
$_val = isset($output[ $_i ]) ? $output[ $_i ] : '';
|
||||||
|
$_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected, $id, $class, $_idx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($name)) {
|
||||||
|
$_html_class = !empty($class) ? ' class="' . $class . '"' : '';
|
||||||
|
$_html_id = !empty($id) ? ' id="' . $id . '"' : '';
|
||||||
|
$_html_result =
|
||||||
|
'<select name="' . $name . '"' . $_html_class . $_html_id . $extra . '>' . "\n" . $_html_result .
|
||||||
|
'</select>' . "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
return $_html_result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function smarty_function_html_options_optoutput($key, $value, $selected, $id, $class, &$idx)
|
||||||
|
{
|
||||||
|
if (!is_array($value)) {
|
||||||
|
$_key = smarty_function_escape_special_chars($key);
|
||||||
|
$_html_result = '<option value="' . $_key . '"';
|
||||||
|
if (is_array($selected)) {
|
||||||
|
if (isset($selected[ $_key ])) {
|
||||||
|
$_html_result .= ' selected="selected"';
|
||||||
|
}
|
||||||
|
} elseif ($_key === $selected) {
|
||||||
|
$_html_result .= ' selected="selected"';
|
||||||
|
}
|
||||||
|
$_html_class = !empty($class) ? ' class="' . $class . ' option"' : '';
|
||||||
|
$_html_id = !empty($id) ? ' id="' . $id . '-' . $idx . '"' : '';
|
||||||
|
if (is_object($value)) {
|
||||||
|
if (method_exists($value, "__toString")) {
|
||||||
|
$value = smarty_function_escape_special_chars((string) $value->__toString());
|
||||||
|
} else {
|
||||||
|
trigger_error("html_options: value is an object of class '" . get_class($value) .
|
||||||
|
"' without __toString() method", E_USER_NOTICE);
|
||||||
|
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$value = smarty_function_escape_special_chars((string) $value);
|
||||||
|
}
|
||||||
|
$_html_result .= $_html_class . $_html_id . '>' . $value . '</option>' . "\n";
|
||||||
|
$idx ++;
|
||||||
|
} else {
|
||||||
|
$_idx = 0;
|
||||||
|
$_html_result =
|
||||||
|
smarty_function_html_options_optgroup($key, $value, $selected, !empty($id) ? ($id . '-' . $idx) : null,
|
||||||
|
$class, $_idx);
|
||||||
|
$idx ++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $_html_result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function smarty_function_html_options_optgroup($key, $values, $selected, $id, $class, &$idx)
|
||||||
|
{
|
||||||
|
$optgroup_html = '<optgroup label="' . smarty_function_escape_special_chars($key) . '">' . "\n";
|
||||||
|
foreach ($values as $key => $value) {
|
||||||
|
$optgroup_html .= smarty_function_html_options_optoutput($key, $value, $selected, $id, $class, $idx);
|
||||||
|
}
|
||||||
|
$optgroup_html .= "</optgroup>\n";
|
||||||
|
|
||||||
|
return $optgroup_html;
|
||||||
|
}
|
||||||
234
misc/smarty_libs/plugins/function.html_radios.php
Normal file
234
misc/smarty_libs/plugins/function.html_radios.php
Normal file
@@ -0,0 +1,234 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsFunction
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty {html_radios} function plugin
|
||||||
|
* File: function.html_radios.php<br>
|
||||||
|
* Type: function<br>
|
||||||
|
* Name: html_radios<br>
|
||||||
|
* Date: 24.Feb.2003<br>
|
||||||
|
* Purpose: Prints out a list of radio input types<br>
|
||||||
|
* Params:
|
||||||
|
* <pre>
|
||||||
|
* - name (optional) - string default "radio"
|
||||||
|
* - values (required) - array
|
||||||
|
* - options (required) - associative array
|
||||||
|
* - checked (optional) - array default not set
|
||||||
|
* - separator (optional) - ie <br> or
|
||||||
|
* - output (optional) - the output next to each radio button
|
||||||
|
* - assign (optional) - assign the output as an array to this variable
|
||||||
|
* - escape (optional) - escape the content (not value), defaults to true
|
||||||
|
* </pre>
|
||||||
|
* Examples:
|
||||||
|
* <pre>
|
||||||
|
* {html_radios values=$ids output=$names}
|
||||||
|
* {html_radios values=$ids name='box' separator='<br>' output=$names}
|
||||||
|
* {html_radios values=$ids checked=$checked separator='<br>' output=$names}
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* @link http://smarty.php.net/manual/en/language.function.html.radios.php {html_radios}
|
||||||
|
* (Smarty online manual)
|
||||||
|
* @author Christopher Kvarme <christopher.kvarme@flashjab.com>
|
||||||
|
* @author credits to Monte Ohrt <monte at ohrt dot com>
|
||||||
|
* @version 1.0
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
* @param Smarty_Internal_Template $template template object
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @uses smarty_function_escape_special_chars()
|
||||||
|
*/
|
||||||
|
function smarty_function_html_radios($params, $template)
|
||||||
|
{
|
||||||
|
if (!is_callable('smarty_function_escape_special_chars')) {
|
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
$name = 'radio';
|
||||||
|
$values = null;
|
||||||
|
$options = null;
|
||||||
|
$selected = null;
|
||||||
|
$separator = '';
|
||||||
|
$escape = true;
|
||||||
|
$labels = true;
|
||||||
|
$label_ids = false;
|
||||||
|
$output = null;
|
||||||
|
$extra = '';
|
||||||
|
|
||||||
|
foreach ($params as $_key => $_val) {
|
||||||
|
switch ($_key) {
|
||||||
|
case 'name':
|
||||||
|
case 'separator':
|
||||||
|
$$_key = (string) $_val;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'checked':
|
||||||
|
case 'selected':
|
||||||
|
if (is_array($_val)) {
|
||||||
|
trigger_error('html_radios: the "' . $_key . '" attribute cannot be an array', E_USER_WARNING);
|
||||||
|
} elseif (is_object($_val)) {
|
||||||
|
if (method_exists($_val, "__toString")) {
|
||||||
|
$selected = smarty_function_escape_special_chars((string) $_val->__toString());
|
||||||
|
} else {
|
||||||
|
trigger_error("html_radios: selected attribute is an object of class '" . get_class($_val) .
|
||||||
|
"' without __toString() method", E_USER_NOTICE);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$selected = (string) $_val;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'escape':
|
||||||
|
case 'labels':
|
||||||
|
case 'label_ids':
|
||||||
|
$$_key = (bool) $_val;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'options':
|
||||||
|
$$_key = (array) $_val;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'values':
|
||||||
|
case 'output':
|
||||||
|
$$_key = array_values((array) $_val);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'radios':
|
||||||
|
trigger_error('html_radios: the use of the "radios" attribute is deprecated, use "options" instead',
|
||||||
|
E_USER_WARNING);
|
||||||
|
$options = (array) $_val;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'assign':
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'strict':
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'disabled':
|
||||||
|
case 'readonly':
|
||||||
|
if (!empty($params[ 'strict' ])) {
|
||||||
|
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",
|
||||||
|
E_USER_NOTICE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($_val === true || $_val === $_key) {
|
||||||
|
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"';
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// omit break; to fall through!
|
||||||
|
|
||||||
|
default:
|
||||||
|
if (!is_array($_val)) {
|
||||||
|
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"';
|
||||||
|
} else {
|
||||||
|
trigger_error("html_radios: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($options) && !isset($values)) {
|
||||||
|
/* raise error here? */
|
||||||
|
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
$_html_result = array();
|
||||||
|
|
||||||
|
if (isset($options)) {
|
||||||
|
foreach ($options as $_key => $_val) {
|
||||||
|
$_html_result[] =
|
||||||
|
smarty_function_html_radios_output($name, $_key, $_val, $selected, $extra, $separator, $labels,
|
||||||
|
$label_ids, $escape);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
foreach ($values as $_i => $_key) {
|
||||||
|
$_val = isset($output[ $_i ]) ? $output[ $_i ] : '';
|
||||||
|
$_html_result[] =
|
||||||
|
smarty_function_html_radios_output($name, $_key, $_val, $selected, $extra, $separator, $labels,
|
||||||
|
$label_ids, $escape);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($params[ 'assign' ])) {
|
||||||
|
$template->assign($params[ 'assign' ], $_html_result);
|
||||||
|
} else {
|
||||||
|
return implode("\n", $_html_result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function smarty_function_html_radios_output($name, $value, $output, $selected, $extra, $separator, $labels, $label_ids,
|
||||||
|
$escape)
|
||||||
|
{
|
||||||
|
$_output = '';
|
||||||
|
|
||||||
|
if (is_object($value)) {
|
||||||
|
if (method_exists($value, "__toString")) {
|
||||||
|
$value = (string) $value->__toString();
|
||||||
|
} else {
|
||||||
|
trigger_error("html_options: value is an object of class '" . get_class($value) .
|
||||||
|
"' without __toString() method", E_USER_NOTICE);
|
||||||
|
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$value = (string) $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_object($output)) {
|
||||||
|
if (method_exists($output, "__toString")) {
|
||||||
|
$output = (string) $output->__toString();
|
||||||
|
} else {
|
||||||
|
trigger_error("html_options: output is an object of class '" . get_class($output) .
|
||||||
|
"' without __toString() method", E_USER_NOTICE);
|
||||||
|
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$output = (string) $output;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($labels) {
|
||||||
|
if ($label_ids) {
|
||||||
|
$_id = smarty_function_escape_special_chars(preg_replace('![^\w\-\.]!' . Smarty::$_UTF8_MODIFIER, '_',
|
||||||
|
$name . '_' . $value));
|
||||||
|
$_output .= '<label for="' . $_id . '">';
|
||||||
|
} else {
|
||||||
|
$_output .= '<label>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$name = smarty_function_escape_special_chars($name);
|
||||||
|
$value = smarty_function_escape_special_chars($value);
|
||||||
|
if ($escape) {
|
||||||
|
$output = smarty_function_escape_special_chars($output);
|
||||||
|
}
|
||||||
|
|
||||||
|
$_output .= '<input type="radio" name="' . $name . '" value="' . $value . '"';
|
||||||
|
|
||||||
|
if ($labels && $label_ids) {
|
||||||
|
$_output .= ' id="' . $_id . '"';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($value === $selected) {
|
||||||
|
$_output .= ' checked="checked"';
|
||||||
|
}
|
||||||
|
|
||||||
|
$_output .= $extra . ' />' . $output;
|
||||||
|
if ($labels) {
|
||||||
|
$_output .= '</label>';
|
||||||
|
}
|
||||||
|
|
||||||
|
$_output .= $separator;
|
||||||
|
|
||||||
|
return $_output;
|
||||||
|
}
|
||||||
388
misc/smarty_libs/plugins/function.html_select_date.php
Normal file
388
misc/smarty_libs/plugins/function.html_select_date.php
Normal file
@@ -0,0 +1,388 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsFunction
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty {html_select_date} plugin
|
||||||
|
* Type: function<br>
|
||||||
|
* Name: html_select_date<br>
|
||||||
|
* Purpose: Prints the dropdowns for date selection.
|
||||||
|
* ChangeLog:
|
||||||
|
* <pre>
|
||||||
|
* - 1.0 initial release
|
||||||
|
* - 1.1 added support for +/- N syntax for begin
|
||||||
|
* and end year values. (Monte)
|
||||||
|
* - 1.2 added support for yyyy-mm-dd syntax for
|
||||||
|
* time value. (Jan Rosier)
|
||||||
|
* - 1.3 added support for choosing format for
|
||||||
|
* month values (Gary Loescher)
|
||||||
|
* - 1.3.1 added support for choosing format for
|
||||||
|
* day values (Marcus Bointon)
|
||||||
|
* - 1.3.2 support negative timestamps, force year
|
||||||
|
* dropdown to include given date unless explicitly set (Monte)
|
||||||
|
* - 1.3.4 fix behaviour of 0000-00-00 00:00:00 dates to match that
|
||||||
|
* of 0000-00-00 dates (cybot, boots)
|
||||||
|
* - 2.0 complete rewrite for performance,
|
||||||
|
* added attributes month_names, *_id
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* @link http://www.smarty.net/manual/en/language.function.html.select.date.php {html_select_date}
|
||||||
|
* (Smarty online manual)
|
||||||
|
* @version 2.0
|
||||||
|
* @author Andrei Zmievski
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
* @author Rodney Rehm
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function smarty_function_html_select_date($params)
|
||||||
|
{
|
||||||
|
if (!is_callable('smarty_function_escape_special_chars')) {
|
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php');
|
||||||
|
}
|
||||||
|
if (!is_callable('smarty_make_timestamp')) {
|
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php');
|
||||||
|
}
|
||||||
|
// generate timestamps used for month names only
|
||||||
|
static $_month_timestamps = null;
|
||||||
|
static $_current_year = null;
|
||||||
|
if ($_month_timestamps === null) {
|
||||||
|
$_current_year = date('Y');
|
||||||
|
$_month_timestamps = array();
|
||||||
|
for ($i = 1; $i <= 12; $i ++) {
|
||||||
|
$_month_timestamps[ $i ] = mktime(0, 0, 0, $i, 1, 2000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Default values. */
|
||||||
|
$prefix = "Date_";
|
||||||
|
$start_year = null;
|
||||||
|
$end_year = null;
|
||||||
|
$display_days = true;
|
||||||
|
$display_months = true;
|
||||||
|
$display_years = true;
|
||||||
|
$month_format = "%B";
|
||||||
|
/* Write months as numbers by default GL */
|
||||||
|
$month_value_format = "%m";
|
||||||
|
$day_format = "%02d";
|
||||||
|
/* Write day values using this format MB */
|
||||||
|
$day_value_format = "%d";
|
||||||
|
$year_as_text = false;
|
||||||
|
/* Display years in reverse order? Ie. 2000,1999,.... */
|
||||||
|
$reverse_years = false;
|
||||||
|
/* Should the select boxes be part of an array when returned from PHP?
|
||||||
|
e.g. setting it to "birthday", would create "birthday[Day]",
|
||||||
|
"birthday[Month]" & "birthday[Year]". Can be combined with prefix */
|
||||||
|
$field_array = null;
|
||||||
|
/* <select size>'s of the different <select> tags.
|
||||||
|
If not set, uses default dropdown. */
|
||||||
|
$day_size = null;
|
||||||
|
$month_size = null;
|
||||||
|
$year_size = null;
|
||||||
|
/* Unparsed attributes common to *ALL* the <select>/<input> tags.
|
||||||
|
An example might be in the template: all_extra ='class ="foo"'. */
|
||||||
|
$all_extra = null;
|
||||||
|
/* Separate attributes for the tags. */
|
||||||
|
$day_extra = null;
|
||||||
|
$month_extra = null;
|
||||||
|
$year_extra = null;
|
||||||
|
/* Order in which to display the fields.
|
||||||
|
"D" -> day, "M" -> month, "Y" -> year. */
|
||||||
|
$field_order = 'MDY';
|
||||||
|
/* String printed between the different fields. */
|
||||||
|
$field_separator = "\n";
|
||||||
|
$option_separator = "\n";
|
||||||
|
$time = null;
|
||||||
|
// $all_empty = null;
|
||||||
|
// $day_empty = null;
|
||||||
|
// $month_empty = null;
|
||||||
|
// $year_empty = null;
|
||||||
|
$extra_attrs = '';
|
||||||
|
$all_id = null;
|
||||||
|
$day_id = null;
|
||||||
|
$month_id = null;
|
||||||
|
$year_id = null;
|
||||||
|
|
||||||
|
foreach ($params as $_key => $_value) {
|
||||||
|
switch ($_key) {
|
||||||
|
case 'time':
|
||||||
|
if (!is_array($_value) && $_value !== null) {
|
||||||
|
$time = smarty_make_timestamp($_value);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'month_names':
|
||||||
|
if (is_array($_value) && count($_value) == 12) {
|
||||||
|
$$_key = $_value;
|
||||||
|
} else {
|
||||||
|
trigger_error("html_select_date: month_names must be an array of 12 strings", E_USER_NOTICE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'prefix':
|
||||||
|
case 'field_array':
|
||||||
|
case 'start_year':
|
||||||
|
case 'end_year':
|
||||||
|
case 'day_format':
|
||||||
|
case 'day_value_format':
|
||||||
|
case 'month_format':
|
||||||
|
case 'month_value_format':
|
||||||
|
case 'day_size':
|
||||||
|
case 'month_size':
|
||||||
|
case 'year_size':
|
||||||
|
case 'all_extra':
|
||||||
|
case 'day_extra':
|
||||||
|
case 'month_extra':
|
||||||
|
case 'year_extra':
|
||||||
|
case 'field_order':
|
||||||
|
case 'field_separator':
|
||||||
|
case 'option_separator':
|
||||||
|
case 'all_empty':
|
||||||
|
case 'month_empty':
|
||||||
|
case 'day_empty':
|
||||||
|
case 'year_empty':
|
||||||
|
case 'all_id':
|
||||||
|
case 'month_id':
|
||||||
|
case 'day_id':
|
||||||
|
case 'year_id':
|
||||||
|
$$_key = (string) $_value;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'display_days':
|
||||||
|
case 'display_months':
|
||||||
|
case 'display_years':
|
||||||
|
case 'year_as_text':
|
||||||
|
case 'reverse_years':
|
||||||
|
$$_key = (bool) $_value;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
if (!is_array($_value)) {
|
||||||
|
$extra_attrs .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_value) . '"';
|
||||||
|
} else {
|
||||||
|
trigger_error("html_select_date: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note: date() is faster than strftime()
|
||||||
|
// Note: explode(date()) is faster than date() date() date()
|
||||||
|
if (isset($params[ 'time' ]) && is_array($params[ 'time' ])) {
|
||||||
|
if (isset($params[ 'time' ][ $prefix . 'Year' ])) {
|
||||||
|
// $_REQUEST[$field_array] given
|
||||||
|
foreach (array('Y' => 'Year', 'm' => 'Month', 'd' => 'Day') as $_elementKey => $_elementName) {
|
||||||
|
$_variableName = '_' . strtolower($_elementName);
|
||||||
|
$$_variableName =
|
||||||
|
isset($params[ 'time' ][ $prefix . $_elementName ]) ? $params[ 'time' ][ $prefix . $_elementName ] :
|
||||||
|
date($_elementKey);
|
||||||
|
}
|
||||||
|
} elseif (isset($params[ 'time' ][ $field_array ][ $prefix . 'Year' ])) {
|
||||||
|
// $_REQUEST given
|
||||||
|
foreach (array('Y' => 'Year', 'm' => 'Month', 'd' => 'Day') as $_elementKey => $_elementName) {
|
||||||
|
$_variableName = '_' . strtolower($_elementName);
|
||||||
|
$$_variableName = isset($params[ 'time' ][ $field_array ][ $prefix . $_elementName ]) ?
|
||||||
|
$params[ 'time' ][ $field_array ][ $prefix . $_elementName ] : date($_elementKey);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// no date found, use NOW
|
||||||
|
list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d'));
|
||||||
|
}
|
||||||
|
} elseif ($time === null) {
|
||||||
|
if (array_key_exists('time', $params)) {
|
||||||
|
$_year = $_month = $_day = $time = null;
|
||||||
|
} else {
|
||||||
|
list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d'));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d', $time));
|
||||||
|
}
|
||||||
|
|
||||||
|
// make syntax "+N" or "-N" work with $start_year and $end_year
|
||||||
|
// Note preg_match('!^(\+|\-)\s*(\d+)$!', $end_year, $match) is slower than trim+substr
|
||||||
|
foreach (array('start', 'end') as $key) {
|
||||||
|
$key .= '_year';
|
||||||
|
$t = $$key;
|
||||||
|
if ($t === null) {
|
||||||
|
$$key = (int) $_current_year;
|
||||||
|
} elseif ($t[ 0 ] == '+') {
|
||||||
|
$$key = (int) ($_current_year + (int) trim(substr($t, 1)));
|
||||||
|
} elseif ($t[ 0 ] == '-') {
|
||||||
|
$$key = (int) ($_current_year - (int) trim(substr($t, 1)));
|
||||||
|
} else {
|
||||||
|
$$key = (int) $$key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// flip for ascending or descending
|
||||||
|
if (($start_year > $end_year && !$reverse_years) || ($start_year < $end_year && $reverse_years)) {
|
||||||
|
$t = $end_year;
|
||||||
|
$end_year = $start_year;
|
||||||
|
$start_year = $t;
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate year <select> or <input>
|
||||||
|
if ($display_years) {
|
||||||
|
$_extra = '';
|
||||||
|
$_name = $field_array ? ($field_array . '[' . $prefix . 'Year]') : ($prefix . 'Year');
|
||||||
|
if ($all_extra) {
|
||||||
|
$_extra .= ' ' . $all_extra;
|
||||||
|
}
|
||||||
|
if ($year_extra) {
|
||||||
|
$_extra .= ' ' . $year_extra;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($year_as_text) {
|
||||||
|
$_html_years =
|
||||||
|
'<input type="text" name="' . $_name . '" value="' . $_year . '" size="4" maxlength="4"' . $_extra .
|
||||||
|
$extra_attrs . ' />';
|
||||||
|
} else {
|
||||||
|
$_html_years = '<select name="' . $_name . '"';
|
||||||
|
if ($year_id !== null || $all_id !== null) {
|
||||||
|
$_html_years .= ' id="' . smarty_function_escape_special_chars($year_id !== null ?
|
||||||
|
($year_id ? $year_id : $_name) :
|
||||||
|
($all_id ? ($all_id . $_name) :
|
||||||
|
$_name)) . '"';
|
||||||
|
}
|
||||||
|
if ($year_size) {
|
||||||
|
$_html_years .= ' size="' . $year_size . '"';
|
||||||
|
}
|
||||||
|
$_html_years .= $_extra . $extra_attrs . '>' . $option_separator;
|
||||||
|
|
||||||
|
if (isset($year_empty) || isset($all_empty)) {
|
||||||
|
$_html_years .= '<option value="">' . (isset($year_empty) ? $year_empty : $all_empty) . '</option>' .
|
||||||
|
$option_separator;
|
||||||
|
}
|
||||||
|
|
||||||
|
$op = $start_year > $end_year ? - 1 : 1;
|
||||||
|
for ($i = $start_year; $op > 0 ? $i <= $end_year : $i >= $end_year; $i += $op) {
|
||||||
|
$_html_years .= '<option value="' . $i . '"' . ($_year == $i ? ' selected="selected"' : '') . '>' . $i .
|
||||||
|
'</option>' . $option_separator;
|
||||||
|
}
|
||||||
|
|
||||||
|
$_html_years .= '</select>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate month <select> or <input>
|
||||||
|
if ($display_months) {
|
||||||
|
$_extra = '';
|
||||||
|
$_name = $field_array ? ($field_array . '[' . $prefix . 'Month]') : ($prefix . 'Month');
|
||||||
|
if ($all_extra) {
|
||||||
|
$_extra .= ' ' . $all_extra;
|
||||||
|
}
|
||||||
|
if ($month_extra) {
|
||||||
|
$_extra .= ' ' . $month_extra;
|
||||||
|
}
|
||||||
|
|
||||||
|
$_html_months = '<select name="' . $_name . '"';
|
||||||
|
if ($month_id !== null || $all_id !== null) {
|
||||||
|
$_html_months .= ' id="' . smarty_function_escape_special_chars($month_id !== null ?
|
||||||
|
($month_id ? $month_id : $_name) :
|
||||||
|
($all_id ? ($all_id . $_name) :
|
||||||
|
$_name)) . '"';
|
||||||
|
}
|
||||||
|
if ($month_size) {
|
||||||
|
$_html_months .= ' size="' . $month_size . '"';
|
||||||
|
}
|
||||||
|
$_html_months .= $_extra . $extra_attrs . '>' . $option_separator;
|
||||||
|
|
||||||
|
if (isset($month_empty) || isset($all_empty)) {
|
||||||
|
$_html_months .= '<option value="">' . (isset($month_empty) ? $month_empty : $all_empty) . '</option>' .
|
||||||
|
$option_separator;
|
||||||
|
}
|
||||||
|
|
||||||
|
for ($i = 1; $i <= 12; $i ++) {
|
||||||
|
$_val = sprintf('%02d', $i);
|
||||||
|
$_text = isset($month_names) ? smarty_function_escape_special_chars($month_names[ $i ]) :
|
||||||
|
($month_format == "%m" ? $_val : strftime($month_format, $_month_timestamps[ $i ]));
|
||||||
|
$_value = $month_value_format == "%m" ? $_val : strftime($month_value_format, $_month_timestamps[ $i ]);
|
||||||
|
$_html_months .= '<option value="' . $_value . '"' . ($_val == $_month ? ' selected="selected"' : '') .
|
||||||
|
'>' . $_text . '</option>' . $option_separator;
|
||||||
|
}
|
||||||
|
|
||||||
|
$_html_months .= '</select>';
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate day <select> or <input>
|
||||||
|
if ($display_days) {
|
||||||
|
$_extra = '';
|
||||||
|
$_name = $field_array ? ($field_array . '[' . $prefix . 'Day]') : ($prefix . 'Day');
|
||||||
|
if ($all_extra) {
|
||||||
|
$_extra .= ' ' . $all_extra;
|
||||||
|
}
|
||||||
|
if ($day_extra) {
|
||||||
|
$_extra .= ' ' . $day_extra;
|
||||||
|
}
|
||||||
|
|
||||||
|
$_html_days = '<select name="' . $_name . '"';
|
||||||
|
if ($day_id !== null || $all_id !== null) {
|
||||||
|
$_html_days .= ' id="' .
|
||||||
|
smarty_function_escape_special_chars($day_id !== null ? ($day_id ? $day_id : $_name) :
|
||||||
|
($all_id ? ($all_id . $_name) : $_name)) . '"';
|
||||||
|
}
|
||||||
|
if ($day_size) {
|
||||||
|
$_html_days .= ' size="' . $day_size . '"';
|
||||||
|
}
|
||||||
|
$_html_days .= $_extra . $extra_attrs . '>' . $option_separator;
|
||||||
|
|
||||||
|
if (isset($day_empty) || isset($all_empty)) {
|
||||||
|
$_html_days .= '<option value="">' . (isset($day_empty) ? $day_empty : $all_empty) . '</option>' .
|
||||||
|
$option_separator;
|
||||||
|
}
|
||||||
|
|
||||||
|
for ($i = 1; $i <= 31; $i ++) {
|
||||||
|
$_val = sprintf('%02d', $i);
|
||||||
|
$_text = $day_format == '%02d' ? $_val : sprintf($day_format, $i);
|
||||||
|
$_value = $day_value_format == '%02d' ? $_val : sprintf($day_value_format, $i);
|
||||||
|
$_html_days .= '<option value="' . $_value . '"' . ($_val == $_day ? ' selected="selected"' : '') . '>' .
|
||||||
|
$_text . '</option>' . $option_separator;
|
||||||
|
}
|
||||||
|
|
||||||
|
$_html_days .= '</select>';
|
||||||
|
}
|
||||||
|
|
||||||
|
// order the fields for output
|
||||||
|
$_html = '';
|
||||||
|
for ($i = 0; $i <= 2; $i ++) {
|
||||||
|
switch ($field_order[ $i ]) {
|
||||||
|
case 'Y':
|
||||||
|
case 'y':
|
||||||
|
if (isset($_html_years)) {
|
||||||
|
if ($_html) {
|
||||||
|
$_html .= $field_separator;
|
||||||
|
}
|
||||||
|
$_html .= $_html_years;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'm':
|
||||||
|
case 'M':
|
||||||
|
if (isset($_html_months)) {
|
||||||
|
if ($_html) {
|
||||||
|
$_html .= $field_separator;
|
||||||
|
}
|
||||||
|
$_html .= $_html_months;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'd':
|
||||||
|
case 'D':
|
||||||
|
if (isset($_html_days)) {
|
||||||
|
if ($_html) {
|
||||||
|
$_html .= $field_separator;
|
||||||
|
}
|
||||||
|
$_html .= $_html_days;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $_html;
|
||||||
|
}
|
||||||
363
misc/smarty_libs/plugins/function.html_select_time.php
Normal file
363
misc/smarty_libs/plugins/function.html_select_time.php
Normal file
@@ -0,0 +1,363 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsFunction
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty {html_select_time} function plugin
|
||||||
|
* Type: function<br>
|
||||||
|
* Name: html_select_time<br>
|
||||||
|
* Purpose: Prints the dropdowns for time selection
|
||||||
|
*
|
||||||
|
* @link http://www.smarty.net/manual/en/language.function.html.select.time.php {html_select_time}
|
||||||
|
* (Smarty online manual)
|
||||||
|
* @author Roberto Berto <roberto@berto.net>
|
||||||
|
* @author Monte Ohrt <monte AT ohrt DOT com>
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @uses smarty_make_timestamp()
|
||||||
|
*/
|
||||||
|
function smarty_function_html_select_time($params)
|
||||||
|
{
|
||||||
|
if (!is_callable('smarty_function_escape_special_chars')) {
|
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php');
|
||||||
|
}
|
||||||
|
if (!is_callable('smarty_make_timestamp')) {
|
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php');
|
||||||
|
}
|
||||||
|
$prefix = "Time_";
|
||||||
|
$field_array = null;
|
||||||
|
$field_separator = "\n";
|
||||||
|
$option_separator = "\n";
|
||||||
|
$time = null;
|
||||||
|
|
||||||
|
$display_hours = true;
|
||||||
|
$display_minutes = true;
|
||||||
|
$display_seconds = true;
|
||||||
|
$display_meridian = true;
|
||||||
|
|
||||||
|
$hour_format = '%02d';
|
||||||
|
$hour_value_format = '%02d';
|
||||||
|
$minute_format = '%02d';
|
||||||
|
$minute_value_format = '%02d';
|
||||||
|
$second_format = '%02d';
|
||||||
|
$second_value_format = '%02d';
|
||||||
|
|
||||||
|
$hour_size = null;
|
||||||
|
$minute_size = null;
|
||||||
|
$second_size = null;
|
||||||
|
$meridian_size = null;
|
||||||
|
|
||||||
|
$all_empty = null;
|
||||||
|
$hour_empty = null;
|
||||||
|
$minute_empty = null;
|
||||||
|
$second_empty = null;
|
||||||
|
$meridian_empty = null;
|
||||||
|
|
||||||
|
$all_id = null;
|
||||||
|
$hour_id = null;
|
||||||
|
$minute_id = null;
|
||||||
|
$second_id = null;
|
||||||
|
$meridian_id = null;
|
||||||
|
|
||||||
|
$use_24_hours = true;
|
||||||
|
$minute_interval = 1;
|
||||||
|
$second_interval = 1;
|
||||||
|
|
||||||
|
$extra_attrs = '';
|
||||||
|
$all_extra = null;
|
||||||
|
$hour_extra = null;
|
||||||
|
$minute_extra = null;
|
||||||
|
$second_extra = null;
|
||||||
|
$meridian_extra = null;
|
||||||
|
|
||||||
|
foreach ($params as $_key => $_value) {
|
||||||
|
switch ($_key) {
|
||||||
|
case 'time':
|
||||||
|
if (!is_array($_value) && $_value !== null) {
|
||||||
|
$time = smarty_make_timestamp($_value);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'prefix':
|
||||||
|
case 'field_array':
|
||||||
|
|
||||||
|
case 'field_separator':
|
||||||
|
case 'option_separator':
|
||||||
|
|
||||||
|
case 'all_extra':
|
||||||
|
case 'hour_extra':
|
||||||
|
case 'minute_extra':
|
||||||
|
case 'second_extra':
|
||||||
|
case 'meridian_extra':
|
||||||
|
|
||||||
|
case 'all_empty':
|
||||||
|
case 'hour_empty':
|
||||||
|
case 'minute_empty':
|
||||||
|
case 'second_empty':
|
||||||
|
case 'meridian_empty':
|
||||||
|
|
||||||
|
case 'all_id':
|
||||||
|
case 'hour_id':
|
||||||
|
case 'minute_id':
|
||||||
|
case 'second_id':
|
||||||
|
case 'meridian_id':
|
||||||
|
|
||||||
|
case 'hour_format':
|
||||||
|
case 'hour_value_format':
|
||||||
|
case 'minute_format':
|
||||||
|
case 'minute_value_format':
|
||||||
|
case 'second_format':
|
||||||
|
case 'second_value_format':
|
||||||
|
$$_key = (string) $_value;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'display_hours':
|
||||||
|
case 'display_minutes':
|
||||||
|
case 'display_seconds':
|
||||||
|
case 'display_meridian':
|
||||||
|
case 'use_24_hours':
|
||||||
|
$$_key = (bool) $_value;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'minute_interval':
|
||||||
|
case 'second_interval':
|
||||||
|
|
||||||
|
case 'hour_size':
|
||||||
|
case 'minute_size':
|
||||||
|
case 'second_size':
|
||||||
|
case 'meridian_size':
|
||||||
|
$$_key = (int) $_value;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
if (!is_array($_value)) {
|
||||||
|
$extra_attrs .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_value) . '"';
|
||||||
|
} else {
|
||||||
|
trigger_error("html_select_date: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($params[ 'time' ]) && is_array($params[ 'time' ])) {
|
||||||
|
if (isset($params[ 'time' ][ $prefix . 'Hour' ])) {
|
||||||
|
// $_REQUEST[$field_array] given
|
||||||
|
foreach (array('H' => 'Hour', 'i' => 'Minute', 's' => 'Second') as $_elementKey => $_elementName) {
|
||||||
|
$_variableName = '_' . strtolower($_elementName);
|
||||||
|
$$_variableName =
|
||||||
|
isset($params[ 'time' ][ $prefix . $_elementName ]) ? $params[ 'time' ][ $prefix . $_elementName ] :
|
||||||
|
date($_elementKey);
|
||||||
|
}
|
||||||
|
$_meridian =
|
||||||
|
isset($params[ 'time' ][ $prefix . 'Meridian' ]) ? (' ' . $params[ 'time' ][ $prefix . 'Meridian' ]) :
|
||||||
|
'';
|
||||||
|
$time = strtotime($_hour . ':' . $_minute . ':' . $_second . $_meridian);
|
||||||
|
list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time));
|
||||||
|
} elseif (isset($params[ 'time' ][ $field_array ][ $prefix . 'Hour' ])) {
|
||||||
|
// $_REQUEST given
|
||||||
|
foreach (array('H' => 'Hour', 'i' => 'Minute', 's' => 'Second') as $_elementKey => $_elementName) {
|
||||||
|
$_variableName = '_' . strtolower($_elementName);
|
||||||
|
$$_variableName = isset($params[ 'time' ][ $field_array ][ $prefix . $_elementName ]) ?
|
||||||
|
$params[ 'time' ][ $field_array ][ $prefix . $_elementName ] : date($_elementKey);
|
||||||
|
}
|
||||||
|
$_meridian = isset($params[ 'time' ][ $field_array ][ $prefix . 'Meridian' ]) ?
|
||||||
|
(' ' . $params[ 'time' ][ $field_array ][ $prefix . 'Meridian' ]) : '';
|
||||||
|
$time = strtotime($_hour . ':' . $_minute . ':' . $_second . $_meridian);
|
||||||
|
list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time));
|
||||||
|
} else {
|
||||||
|
// no date found, use NOW
|
||||||
|
list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d'));
|
||||||
|
}
|
||||||
|
} elseif ($time === null) {
|
||||||
|
if (array_key_exists('time', $params)) {
|
||||||
|
$_hour = $_minute = $_second = $time = null;
|
||||||
|
} else {
|
||||||
|
list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s'));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time));
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate hour <select>
|
||||||
|
if ($display_hours) {
|
||||||
|
$_html_hours = '';
|
||||||
|
$_extra = '';
|
||||||
|
$_name = $field_array ? ($field_array . '[' . $prefix . 'Hour]') : ($prefix . 'Hour');
|
||||||
|
if ($all_extra) {
|
||||||
|
$_extra .= ' ' . $all_extra;
|
||||||
|
}
|
||||||
|
if ($hour_extra) {
|
||||||
|
$_extra .= ' ' . $hour_extra;
|
||||||
|
}
|
||||||
|
|
||||||
|
$_html_hours = '<select name="' . $_name . '"';
|
||||||
|
if ($hour_id !== null || $all_id !== null) {
|
||||||
|
$_html_hours .= ' id="' .
|
||||||
|
smarty_function_escape_special_chars($hour_id !== null ? ($hour_id ? $hour_id : $_name) :
|
||||||
|
($all_id ? ($all_id . $_name) : $_name)) . '"';
|
||||||
|
}
|
||||||
|
if ($hour_size) {
|
||||||
|
$_html_hours .= ' size="' . $hour_size . '"';
|
||||||
|
}
|
||||||
|
$_html_hours .= $_extra . $extra_attrs . '>' . $option_separator;
|
||||||
|
|
||||||
|
if (isset($hour_empty) || isset($all_empty)) {
|
||||||
|
$_html_hours .= '<option value="">' . (isset($hour_empty) ? $hour_empty : $all_empty) . '</option>' .
|
||||||
|
$option_separator;
|
||||||
|
}
|
||||||
|
|
||||||
|
$start = $use_24_hours ? 0 : 1;
|
||||||
|
$end = $use_24_hours ? 23 : 12;
|
||||||
|
for ($i = $start; $i <= $end; $i ++) {
|
||||||
|
$_val = sprintf('%02d', $i);
|
||||||
|
$_text = $hour_format == '%02d' ? $_val : sprintf($hour_format, $i);
|
||||||
|
$_value = $hour_value_format == '%02d' ? $_val : sprintf($hour_value_format, $i);
|
||||||
|
|
||||||
|
if (!$use_24_hours) {
|
||||||
|
$_hour12 = $_hour == 0 ? 12 : ($_hour <= 12 ? $_hour : $_hour - 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
$selected = $_hour !== null ? ($use_24_hours ? $_hour == $_val : $_hour12 == $_val) : null;
|
||||||
|
$_html_hours .= '<option value="' . $_value . '"' . ($selected ? ' selected="selected"' : '') . '>' .
|
||||||
|
$_text . '</option>' . $option_separator;
|
||||||
|
}
|
||||||
|
|
||||||
|
$_html_hours .= '</select>';
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate minute <select>
|
||||||
|
if ($display_minutes) {
|
||||||
|
$_html_minutes = '';
|
||||||
|
$_extra = '';
|
||||||
|
$_name = $field_array ? ($field_array . '[' . $prefix . 'Minute]') : ($prefix . 'Minute');
|
||||||
|
if ($all_extra) {
|
||||||
|
$_extra .= ' ' . $all_extra;
|
||||||
|
}
|
||||||
|
if ($minute_extra) {
|
||||||
|
$_extra .= ' ' . $minute_extra;
|
||||||
|
}
|
||||||
|
|
||||||
|
$_html_minutes = '<select name="' . $_name . '"';
|
||||||
|
if ($minute_id !== null || $all_id !== null) {
|
||||||
|
$_html_minutes .= ' id="' . smarty_function_escape_special_chars($minute_id !== null ?
|
||||||
|
($minute_id ? $minute_id : $_name) :
|
||||||
|
($all_id ? ($all_id . $_name) :
|
||||||
|
$_name)) . '"';
|
||||||
|
}
|
||||||
|
if ($minute_size) {
|
||||||
|
$_html_minutes .= ' size="' . $minute_size . '"';
|
||||||
|
}
|
||||||
|
$_html_minutes .= $_extra . $extra_attrs . '>' . $option_separator;
|
||||||
|
|
||||||
|
if (isset($minute_empty) || isset($all_empty)) {
|
||||||
|
$_html_minutes .= '<option value="">' . (isset($minute_empty) ? $minute_empty : $all_empty) . '</option>' .
|
||||||
|
$option_separator;
|
||||||
|
}
|
||||||
|
|
||||||
|
$selected = $_minute !== null ? ($_minute - $_minute % $minute_interval) : null;
|
||||||
|
for ($i = 0; $i <= 59; $i += $minute_interval) {
|
||||||
|
$_val = sprintf('%02d', $i);
|
||||||
|
$_text = $minute_format == '%02d' ? $_val : sprintf($minute_format, $i);
|
||||||
|
$_value = $minute_value_format == '%02d' ? $_val : sprintf($minute_value_format, $i);
|
||||||
|
$_html_minutes .= '<option value="' . $_value . '"' . ($selected === $i ? ' selected="selected"' : '') .
|
||||||
|
'>' . $_text . '</option>' . $option_separator;
|
||||||
|
}
|
||||||
|
|
||||||
|
$_html_minutes .= '</select>';
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate second <select>
|
||||||
|
if ($display_seconds) {
|
||||||
|
$_html_seconds = '';
|
||||||
|
$_extra = '';
|
||||||
|
$_name = $field_array ? ($field_array . '[' . $prefix . 'Second]') : ($prefix . 'Second');
|
||||||
|
if ($all_extra) {
|
||||||
|
$_extra .= ' ' . $all_extra;
|
||||||
|
}
|
||||||
|
if ($second_extra) {
|
||||||
|
$_extra .= ' ' . $second_extra;
|
||||||
|
}
|
||||||
|
|
||||||
|
$_html_seconds = '<select name="' . $_name . '"';
|
||||||
|
if ($second_id !== null || $all_id !== null) {
|
||||||
|
$_html_seconds .= ' id="' . smarty_function_escape_special_chars($second_id !== null ?
|
||||||
|
($second_id ? $second_id : $_name) :
|
||||||
|
($all_id ? ($all_id . $_name) :
|
||||||
|
$_name)) . '"';
|
||||||
|
}
|
||||||
|
if ($second_size) {
|
||||||
|
$_html_seconds .= ' size="' . $second_size . '"';
|
||||||
|
}
|
||||||
|
$_html_seconds .= $_extra . $extra_attrs . '>' . $option_separator;
|
||||||
|
|
||||||
|
if (isset($second_empty) || isset($all_empty)) {
|
||||||
|
$_html_seconds .= '<option value="">' . (isset($second_empty) ? $second_empty : $all_empty) . '</option>' .
|
||||||
|
$option_separator;
|
||||||
|
}
|
||||||
|
|
||||||
|
$selected = $_second !== null ? ($_second - $_second % $second_interval) : null;
|
||||||
|
for ($i = 0; $i <= 59; $i += $second_interval) {
|
||||||
|
$_val = sprintf('%02d', $i);
|
||||||
|
$_text = $second_format == '%02d' ? $_val : sprintf($second_format, $i);
|
||||||
|
$_value = $second_value_format == '%02d' ? $_val : sprintf($second_value_format, $i);
|
||||||
|
$_html_seconds .= '<option value="' . $_value . '"' . ($selected === $i ? ' selected="selected"' : '') .
|
||||||
|
'>' . $_text . '</option>' . $option_separator;
|
||||||
|
}
|
||||||
|
|
||||||
|
$_html_seconds .= '</select>';
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate meridian <select>
|
||||||
|
if ($display_meridian && !$use_24_hours) {
|
||||||
|
$_html_meridian = '';
|
||||||
|
$_extra = '';
|
||||||
|
$_name = $field_array ? ($field_array . '[' . $prefix . 'Meridian]') : ($prefix . 'Meridian');
|
||||||
|
if ($all_extra) {
|
||||||
|
$_extra .= ' ' . $all_extra;
|
||||||
|
}
|
||||||
|
if ($meridian_extra) {
|
||||||
|
$_extra .= ' ' . $meridian_extra;
|
||||||
|
}
|
||||||
|
|
||||||
|
$_html_meridian = '<select name="' . $_name . '"';
|
||||||
|
if ($meridian_id !== null || $all_id !== null) {
|
||||||
|
$_html_meridian .= ' id="' . smarty_function_escape_special_chars($meridian_id !== null ?
|
||||||
|
($meridian_id ? $meridian_id :
|
||||||
|
$_name) :
|
||||||
|
($all_id ? ($all_id . $_name) :
|
||||||
|
$_name)) . '"';
|
||||||
|
}
|
||||||
|
if ($meridian_size) {
|
||||||
|
$_html_meridian .= ' size="' . $meridian_size . '"';
|
||||||
|
}
|
||||||
|
$_html_meridian .= $_extra . $extra_attrs . '>' . $option_separator;
|
||||||
|
|
||||||
|
if (isset($meridian_empty) || isset($all_empty)) {
|
||||||
|
$_html_meridian .= '<option value="">' . (isset($meridian_empty) ? $meridian_empty : $all_empty) .
|
||||||
|
'</option>' . $option_separator;
|
||||||
|
}
|
||||||
|
|
||||||
|
$_html_meridian .= '<option value="am"' . ($_hour > 0 && $_hour < 12 ? ' selected="selected"' : '') .
|
||||||
|
'>AM</option>' . $option_separator . '<option value="pm"' .
|
||||||
|
($_hour < 12 ? '' : ' selected="selected"') . '>PM</option>' . $option_separator .
|
||||||
|
'</select>';
|
||||||
|
}
|
||||||
|
|
||||||
|
$_html = '';
|
||||||
|
foreach (array('_html_hours', '_html_minutes', '_html_seconds', '_html_meridian') as $k) {
|
||||||
|
if (isset($$k)) {
|
||||||
|
if ($_html) {
|
||||||
|
$_html .= $field_separator;
|
||||||
|
}
|
||||||
|
$_html .= $$k;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $_html;
|
||||||
|
}
|
||||||
176
misc/smarty_libs/plugins/function.html_table.php
Normal file
176
misc/smarty_libs/plugins/function.html_table.php
Normal file
@@ -0,0 +1,176 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsFunction
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty {html_table} function plugin
|
||||||
|
* Type: function<br>
|
||||||
|
* Name: html_table<br>
|
||||||
|
* Date: Feb 17, 2003<br>
|
||||||
|
* Purpose: make an html table from an array of data<br>
|
||||||
|
* Params:
|
||||||
|
* <pre>
|
||||||
|
* - loop - array to loop through
|
||||||
|
* - cols - number of columns, comma separated list of column names
|
||||||
|
* or array of column names
|
||||||
|
* - rows - number of rows
|
||||||
|
* - table_attr - table attributes
|
||||||
|
* - th_attr - table heading attributes (arrays are cycled)
|
||||||
|
* - tr_attr - table row attributes (arrays are cycled)
|
||||||
|
* - td_attr - table cell attributes (arrays are cycled)
|
||||||
|
* - trailpad - value to pad trailing cells with
|
||||||
|
* - caption - text for caption element
|
||||||
|
* - vdir - vertical direction (default: "down", means top-to-bottom)
|
||||||
|
* - hdir - horizontal direction (default: "right", means left-to-right)
|
||||||
|
* - inner - inner loop (default "cols": print $loop line by line,
|
||||||
|
* $loop will be printed column by column otherwise)
|
||||||
|
* </pre>
|
||||||
|
* Examples:
|
||||||
|
* <pre>
|
||||||
|
* {table loop=$data}
|
||||||
|
* {table loop=$data cols=4 tr_attr='"bgcolor=red"'}
|
||||||
|
* {table loop=$data cols="first,second,third" tr_attr=$colors}
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
* @author credit to Messju Mohr <messju at lammfellpuschen dot de>
|
||||||
|
* @author credit to boots <boots dot smarty at yahoo dot com>
|
||||||
|
* @version 1.1
|
||||||
|
* @link http://www.smarty.net/manual/en/language.function.html.table.php {html_table}
|
||||||
|
* (Smarty online manual)
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function smarty_function_html_table($params)
|
||||||
|
{
|
||||||
|
$table_attr = 'border="1"';
|
||||||
|
$tr_attr = '';
|
||||||
|
$th_attr = '';
|
||||||
|
$td_attr = '';
|
||||||
|
$cols = $cols_count = 3;
|
||||||
|
$rows = 3;
|
||||||
|
$trailpad = ' ';
|
||||||
|
$vdir = 'down';
|
||||||
|
$hdir = 'right';
|
||||||
|
$inner = 'cols';
|
||||||
|
$caption = '';
|
||||||
|
$loop = null;
|
||||||
|
|
||||||
|
if (!isset($params[ 'loop' ])) {
|
||||||
|
trigger_error("html_table: missing 'loop' parameter", E_USER_WARNING);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($params as $_key => $_value) {
|
||||||
|
switch ($_key) {
|
||||||
|
case 'loop':
|
||||||
|
$$_key = (array) $_value;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'cols':
|
||||||
|
if (is_array($_value) && !empty($_value)) {
|
||||||
|
$cols = $_value;
|
||||||
|
$cols_count = count($_value);
|
||||||
|
} elseif (!is_numeric($_value) && is_string($_value) && !empty($_value)) {
|
||||||
|
$cols = explode(',', $_value);
|
||||||
|
$cols_count = count($cols);
|
||||||
|
} elseif (!empty($_value)) {
|
||||||
|
$cols_count = (int) $_value;
|
||||||
|
} else {
|
||||||
|
$cols_count = $cols;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'rows':
|
||||||
|
$$_key = (int) $_value;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'table_attr':
|
||||||
|
case 'trailpad':
|
||||||
|
case 'hdir':
|
||||||
|
case 'vdir':
|
||||||
|
case 'inner':
|
||||||
|
case 'caption':
|
||||||
|
$$_key = (string) $_value;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'tr_attr':
|
||||||
|
case 'td_attr':
|
||||||
|
case 'th_attr':
|
||||||
|
$$_key = $_value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$loop_count = count($loop);
|
||||||
|
if (empty($params[ 'rows' ])) {
|
||||||
|
/* no rows specified */
|
||||||
|
$rows = ceil($loop_count / $cols_count);
|
||||||
|
} elseif (empty($params[ 'cols' ])) {
|
||||||
|
if (!empty($params[ 'rows' ])) {
|
||||||
|
/* no cols specified, but rows */
|
||||||
|
$cols_count = ceil($loop_count / $rows);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$output = "<table $table_attr>\n";
|
||||||
|
|
||||||
|
if (!empty($caption)) {
|
||||||
|
$output .= '<caption>' . $caption . "</caption>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_array($cols)) {
|
||||||
|
$cols = ($hdir == 'right') ? $cols : array_reverse($cols);
|
||||||
|
$output .= "<thead><tr>\n";
|
||||||
|
|
||||||
|
for ($r = 0; $r < $cols_count; $r ++) {
|
||||||
|
$output .= '<th' . smarty_function_html_table_cycle('th', $th_attr, $r) . '>';
|
||||||
|
$output .= $cols[ $r ];
|
||||||
|
$output .= "</th>\n";
|
||||||
|
}
|
||||||
|
$output .= "</tr></thead>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
$output .= "<tbody>\n";
|
||||||
|
for ($r = 0; $r < $rows; $r ++) {
|
||||||
|
$output .= "<tr" . smarty_function_html_table_cycle('tr', $tr_attr, $r) . ">\n";
|
||||||
|
$rx = ($vdir == 'down') ? $r * $cols_count : ($rows - 1 - $r) * $cols_count;
|
||||||
|
|
||||||
|
for ($c = 0; $c < $cols_count; $c ++) {
|
||||||
|
$x = ($hdir == 'right') ? $rx + $c : $rx + $cols_count - 1 - $c;
|
||||||
|
if ($inner != 'cols') {
|
||||||
|
/* shuffle x to loop over rows*/
|
||||||
|
$x = floor($x / $cols_count) + ($x % $cols_count) * $rows;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($x < $loop_count) {
|
||||||
|
$output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">" . $loop[ $x ] . "</td>\n";
|
||||||
|
} else {
|
||||||
|
$output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">$trailpad</td>\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$output .= "</tr>\n";
|
||||||
|
}
|
||||||
|
$output .= "</tbody>\n";
|
||||||
|
$output .= "</table>\n";
|
||||||
|
|
||||||
|
return $output;
|
||||||
|
}
|
||||||
|
|
||||||
|
function smarty_function_html_table_cycle($name, $var, $no)
|
||||||
|
{
|
||||||
|
if (!is_array($var)) {
|
||||||
|
$ret = $var;
|
||||||
|
} else {
|
||||||
|
$ret = $var[ $no % count($var) ];
|
||||||
|
}
|
||||||
|
|
||||||
|
return ($ret) ? ' ' . $ret : '';
|
||||||
|
}
|
||||||
153
misc/smarty_libs/plugins/function.mailto.php
Normal file
153
misc/smarty_libs/plugins/function.mailto.php
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsFunction
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty {mailto} function plugin
|
||||||
|
* Type: function<br>
|
||||||
|
* Name: mailto<br>
|
||||||
|
* Date: May 21, 2002
|
||||||
|
* Purpose: automate mailto address link creation, and optionally encode them.<br>
|
||||||
|
* Params:
|
||||||
|
* <pre>
|
||||||
|
* - address - (required) - e-mail address
|
||||||
|
* - text - (optional) - text to display, default is address
|
||||||
|
* - encode - (optional) - can be one of:
|
||||||
|
* * none : no encoding (default)
|
||||||
|
* * javascript : encode with javascript
|
||||||
|
* * javascript_charcode : encode with javascript charcode
|
||||||
|
* * hex : encode with hexidecimal (no javascript)
|
||||||
|
* - cc - (optional) - address(es) to carbon copy
|
||||||
|
* - bcc - (optional) - address(es) to blind carbon copy
|
||||||
|
* - subject - (optional) - e-mail subject
|
||||||
|
* - newsgroups - (optional) - newsgroup(s) to post to
|
||||||
|
* - followupto - (optional) - address(es) to follow up to
|
||||||
|
* - extra - (optional) - extra tags for the href link
|
||||||
|
* </pre>
|
||||||
|
* Examples:
|
||||||
|
* <pre>
|
||||||
|
* {mailto address="me@domain.com"}
|
||||||
|
* {mailto address="me@domain.com" encode="javascript"}
|
||||||
|
* {mailto address="me@domain.com" encode="hex"}
|
||||||
|
* {mailto address="me@domain.com" subject="Hello to you!"}
|
||||||
|
* {mailto address="me@domain.com" cc="you@domain.com,they@domain.com"}
|
||||||
|
* {mailto address="me@domain.com" extra='class="mailto"'}
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* @link http://www.smarty.net/manual/en/language.function.mailto.php {mailto}
|
||||||
|
* (Smarty online manual)
|
||||||
|
* @version 1.2
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
* @author credits to Jason Sweat (added cc, bcc and subject functionality)
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function smarty_function_mailto($params)
|
||||||
|
{
|
||||||
|
static $_allowed_encoding =
|
||||||
|
array('javascript' => true, 'javascript_charcode' => true, 'hex' => true, 'none' => true);
|
||||||
|
$extra = '';
|
||||||
|
|
||||||
|
if (empty($params[ 'address' ])) {
|
||||||
|
trigger_error("mailto: missing 'address' parameter", E_USER_WARNING);
|
||||||
|
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
$address = $params[ 'address' ];
|
||||||
|
}
|
||||||
|
|
||||||
|
$text = $address;
|
||||||
|
// netscape and mozilla do not decode %40 (@) in BCC field (bug?)
|
||||||
|
// so, don't encode it.
|
||||||
|
$search = array('%40', '%2C');
|
||||||
|
$replace = array('@', ',');
|
||||||
|
$mail_parms = array();
|
||||||
|
foreach ($params as $var => $value) {
|
||||||
|
switch ($var) {
|
||||||
|
case 'cc':
|
||||||
|
case 'bcc':
|
||||||
|
case 'followupto':
|
||||||
|
if (!empty($value)) {
|
||||||
|
$mail_parms[] = $var . '=' . str_replace($search, $replace, rawurlencode($value));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'subject':
|
||||||
|
case 'newsgroups':
|
||||||
|
$mail_parms[] = $var . '=' . rawurlencode($value);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'extra':
|
||||||
|
case 'text':
|
||||||
|
$$var = $value;
|
||||||
|
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($mail_parms) {
|
||||||
|
$address .= '?' . join('&', $mail_parms);
|
||||||
|
}
|
||||||
|
|
||||||
|
$encode = (empty($params[ 'encode' ])) ? 'none' : $params[ 'encode' ];
|
||||||
|
if (!isset($_allowed_encoding[ $encode ])) {
|
||||||
|
trigger_error("mailto: 'encode' parameter must be none, javascript, javascript_charcode or hex",
|
||||||
|
E_USER_WARNING);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// FIXME: (rodneyrehm) document.write() excues me what? 1998 has passed!
|
||||||
|
if ($encode == 'javascript') {
|
||||||
|
$string = 'document.write(\'<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>\');';
|
||||||
|
|
||||||
|
$js_encode = '';
|
||||||
|
for ($x = 0, $_length = strlen($string); $x < $_length; $x ++) {
|
||||||
|
$js_encode .= '%' . bin2hex($string[ $x ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return '<script type="text/javascript">eval(unescape(\'' . $js_encode . '\'))</script>';
|
||||||
|
} elseif ($encode == 'javascript_charcode') {
|
||||||
|
$string = '<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>';
|
||||||
|
|
||||||
|
for ($x = 0, $y = strlen($string); $x < $y; $x ++) {
|
||||||
|
$ord[] = ord($string[ $x ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$_ret = "<script type=\"text/javascript\" language=\"javascript\">\n" . "{document.write(String.fromCharCode(" .
|
||||||
|
implode(',', $ord) . "))" . "}\n" . "</script>\n";
|
||||||
|
|
||||||
|
return $_ret;
|
||||||
|
} elseif ($encode == 'hex') {
|
||||||
|
preg_match('!^(.*)(\?.*)$!', $address, $match);
|
||||||
|
if (!empty($match[ 2 ])) {
|
||||||
|
trigger_error("mailto: hex encoding does not work with extra attributes. Try javascript.", E_USER_WARNING);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$address_encode = '';
|
||||||
|
for ($x = 0, $_length = strlen($address); $x < $_length; $x ++) {
|
||||||
|
if (preg_match('!\w!' . Smarty::$_UTF8_MODIFIER, $address[ $x ])) {
|
||||||
|
$address_encode .= '%' . bin2hex($address[ $x ]);
|
||||||
|
} else {
|
||||||
|
$address_encode .= $address[ $x ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$text_encode = '';
|
||||||
|
for ($x = 0, $_length = strlen($text); $x < $_length; $x ++) {
|
||||||
|
$text_encode .= '&#x' . bin2hex($text[ $x ]) . ';';
|
||||||
|
}
|
||||||
|
|
||||||
|
$mailto = "mailto:";
|
||||||
|
|
||||||
|
return '<a href="' . $mailto . $address_encode . '" ' . $extra . '>' . $text_encode . '</a>';
|
||||||
|
} else {
|
||||||
|
// no encoding
|
||||||
|
return '<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>';
|
||||||
|
}
|
||||||
|
}
|
||||||
109
misc/smarty_libs/plugins/function.math.php
Normal file
109
misc/smarty_libs/plugins/function.math.php
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
* This plugin is only for Smarty2 BC
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsFunction
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty {math} function plugin
|
||||||
|
* Type: function<br>
|
||||||
|
* Name: math<br>
|
||||||
|
* Purpose: handle math computations in template
|
||||||
|
*
|
||||||
|
* @link http://www.smarty.net/manual/en/language.function.math.php {math}
|
||||||
|
* (Smarty online manual)
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
* @param Smarty_Internal_Template $template template object
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
function smarty_function_math($params, $template)
|
||||||
|
{
|
||||||
|
static $_allowed_funcs =
|
||||||
|
array('int' => true, 'abs' => true, 'ceil' => true, 'cos' => true, 'exp' => true, 'floor' => true,
|
||||||
|
'log' => true, 'log10' => true, 'max' => true, 'min' => true, 'pi' => true, 'pow' => true, 'rand' => true,
|
||||||
|
'round' => true, 'sin' => true, 'sqrt' => true, 'srand' => true, 'tan' => true);
|
||||||
|
// be sure equation parameter is present
|
||||||
|
if (empty($params[ 'equation' ])) {
|
||||||
|
trigger_error("math: missing equation parameter", E_USER_WARNING);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$equation = $params[ 'equation' ];
|
||||||
|
|
||||||
|
// make sure parenthesis are balanced
|
||||||
|
if (substr_count($equation, "(") != substr_count($equation, ")")) {
|
||||||
|
trigger_error("math: unbalanced parenthesis", E_USER_WARNING);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// disallow backticks
|
||||||
|
if (strpos($equation, '`') !== false) {
|
||||||
|
trigger_error("math: backtick character not allowed in equation", E_USER_WARNING);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// also disallow dollar signs
|
||||||
|
if (strpos($equation, '$') !== false) {
|
||||||
|
trigger_error("math: dollar signs not allowed in equation", E_USER_WARNING);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($params as $key => $val) {
|
||||||
|
if ($key != "equation" && $key != "format" && $key != "assign") {
|
||||||
|
// make sure value is not empty
|
||||||
|
if (strlen($val) == 0) {
|
||||||
|
trigger_error("math: parameter '{$key}' is empty", E_USER_WARNING);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!is_numeric($val)) {
|
||||||
|
trigger_error("math: parameter '{$key}' is not numeric", E_USER_WARNING);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// match all vars in equation, make sure all are passed
|
||||||
|
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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
101
misc/smarty_libs/plugins/modifier.capitalize.php
Normal file
101
misc/smarty_libs/plugins/modifier.capitalize.php
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifier
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty capitalize modifier plugin
|
||||||
|
* Type: modifier<br>
|
||||||
|
* Name: capitalize<br>
|
||||||
|
* Purpose: capitalize words in the string
|
||||||
|
* {@internal {$string|capitalize:true:true} is the fastest option for MBString enabled systems }}
|
||||||
|
*
|
||||||
|
* @param string $string string to capitalize
|
||||||
|
* @param boolean $uc_digits also capitalize "x123" to "X123"
|
||||||
|
* @param boolean $lc_rest capitalize first letters, lowercase all following letters "aAa" to "Aaa"
|
||||||
|
*
|
||||||
|
* @return string capitalized string
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
* @author Rodney Rehm
|
||||||
|
*/
|
||||||
|
function smarty_modifier_capitalize($string, $uc_digits = false, $lc_rest = false)
|
||||||
|
{
|
||||||
|
if (Smarty::$_MBSTRING) {
|
||||||
|
if ($lc_rest) {
|
||||||
|
// uppercase (including hyphenated words)
|
||||||
|
$upper_string = mb_convert_case($string, MB_CASE_TITLE, Smarty::$_CHARSET);
|
||||||
|
} else {
|
||||||
|
// uppercase word breaks
|
||||||
|
$upper_string = preg_replace_callback("!(^|[^\p{L}'])([\p{Ll}])!S" . Smarty::$_UTF8_MODIFIER,
|
||||||
|
'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)) {
|
||||||
|
foreach ($matches[ 1 ] as $match) {
|
||||||
|
$upper_string =
|
||||||
|
substr_replace($upper_string, mb_strtolower($match[ 0 ], Smarty::$_CHARSET), $match[ 1 ],
|
||||||
|
strlen($match[ 0 ]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$upper_string =
|
||||||
|
preg_replace_callback("!((^|\s)['\"])(\w)!" . Smarty::$_UTF8_MODIFIER, 'smarty_mod_cap_mbconvert2_cb',
|
||||||
|
$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
|
||||||
|
*/
|
||||||
|
function smarty_mod_cap_mbconvert_cb($matches)
|
||||||
|
{
|
||||||
|
return stripslashes($matches[ 1 ]) . mb_convert_case(stripslashes($matches[ 2 ]), MB_CASE_UPPER, Smarty::$_CHARSET);
|
||||||
|
}
|
||||||
|
|
||||||
|
function smarty_mod_cap_mbconvert2_cb($matches)
|
||||||
|
{
|
||||||
|
return stripslashes($matches[ 1 ]) . mb_convert_case(stripslashes($matches[ 3 ]), MB_CASE_UPPER, Smarty::$_CHARSET);
|
||||||
|
}
|
||||||
|
|
||||||
|
function smarty_mod_cap_ucfirst_cb($matches)
|
||||||
|
{
|
||||||
|
return stripslashes($matches[ 1 ]) . ucfirst(stripslashes($matches[ 2 ]));
|
||||||
|
}
|
||||||
|
|
||||||
|
function smarty_mod_cap_ucfirst2_cb($matches)
|
||||||
|
{
|
||||||
|
return stripslashes($matches[ 1 ]) . ucfirst(stripslashes($matches[ 3 ]));
|
||||||
|
}
|
||||||
67
misc/smarty_libs/plugins/modifier.date_format.php
Normal file
67
misc/smarty_libs/plugins/modifier.date_format.php
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifier
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty date_format modifier plugin
|
||||||
|
* Type: modifier<br>
|
||||||
|
* Name: date_format<br>
|
||||||
|
* Purpose: format datestamps via strftime<br>
|
||||||
|
* Input:<br>
|
||||||
|
* - string: input date string
|
||||||
|
* - format: strftime format for output
|
||||||
|
* - default_date: default date if $string is empty
|
||||||
|
*
|
||||||
|
* @link http://www.smarty.net/manual/en/language.modifier.date.format.php date_format (Smarty online manual)
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
*
|
||||||
|
* @param string $string input date string
|
||||||
|
* @param string $format strftime format for output
|
||||||
|
* @param string $default_date default date if $string is empty
|
||||||
|
* @param string $formatter either 'strftime' or 'auto'
|
||||||
|
*
|
||||||
|
* @return string |void
|
||||||
|
* @uses smarty_make_timestamp()
|
||||||
|
*/
|
||||||
|
function smarty_modifier_date_format($string, $format = null, $default_date = '', $formatter = 'auto')
|
||||||
|
{
|
||||||
|
if ($format === null) {
|
||||||
|
$format = Smarty::$_DATE_FORMAT;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* require_once the {@link shared.make_timestamp.php} plugin
|
||||||
|
*/
|
||||||
|
if (!is_callable('smarty_make_timestamp')) {
|
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php');
|
||||||
|
}
|
||||||
|
if ($string != '' && $string != '0000-00-00' && $string != '0000-00-00 00:00:00') {
|
||||||
|
$timestamp = smarty_make_timestamp($string);
|
||||||
|
} elseif ($default_date != '') {
|
||||||
|
$timestamp = smarty_make_timestamp($default_date);
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ($formatter == 'strftime' || ($formatter == 'auto' && strpos($format, '%') !== false)) {
|
||||||
|
if (Smarty::$_IS_WINDOWS) {
|
||||||
|
$_win_from = array('%D', '%h', '%n', '%r', '%R', '%t', '%T');
|
||||||
|
$_win_to = array('%m/%d/%y', '%b', "\n", '%I:%M:%S %p', '%H:%M', "\t", '%H:%M:%S');
|
||||||
|
if (strpos($format, '%e') !== false) {
|
||||||
|
$_win_from[] = '%e';
|
||||||
|
$_win_to[] = sprintf('%\' 2d', date('j', $timestamp));
|
||||||
|
}
|
||||||
|
if (strpos($format, '%l') !== false) {
|
||||||
|
$_win_from[] = '%l';
|
||||||
|
$_win_to[] = sprintf('%\' 2d', date('h', $timestamp));
|
||||||
|
}
|
||||||
|
$format = str_replace($_win_from, $_win_to, $format);
|
||||||
|
}
|
||||||
|
|
||||||
|
return strftime($format, $timestamp);
|
||||||
|
} else {
|
||||||
|
return date($format, $timestamp);
|
||||||
|
}
|
||||||
|
}
|
||||||
112
misc/smarty_libs/plugins/modifier.debug_print_var.php
Normal file
112
misc/smarty_libs/plugins/modifier.debug_print_var.php
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage Debug
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty debug_print_var modifier plugin
|
||||||
|
* Type: modifier<br>
|
||||||
|
* Name: debug_print_var<br>
|
||||||
|
* Purpose: formats variable contents for display in the console
|
||||||
|
*
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
*
|
||||||
|
* @param array|object $var variable to be formatted
|
||||||
|
* @param int $max maximum recursion depth if $var is an array or object
|
||||||
|
* @param int $length maximum string length if $var is a string
|
||||||
|
* @param int $depth actual recursion depth
|
||||||
|
* @param array $objects processed objects in actual depth to prevent recursive object processing
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function smarty_modifier_debug_print_var($var, $max = 10, $length = 40, $depth = 0, $objects = array())
|
||||||
|
{
|
||||||
|
$_replace = array("\n" => '\n', "\r" => '\r', "\t" => '\t');
|
||||||
|
switch (gettype($var)) {
|
||||||
|
case 'array' :
|
||||||
|
$results = '<b>Array (' . count($var) . ')</b>';
|
||||||
|
if ($depth == $max) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
foreach ($var as $curr_key => $curr_val) {
|
||||||
|
$results .= '<br>' . str_repeat(' ', $depth * 2) . '<b>' . strtr($curr_key, $_replace) .
|
||||||
|
'</b> => ' .
|
||||||
|
smarty_modifier_debug_print_var($curr_val, $max, $length, ++ $depth, $objects);
|
||||||
|
$depth --;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'object' :
|
||||||
|
$object_vars = get_object_vars($var);
|
||||||
|
$results = '<b>' . get_class($var) . ' Object (' . count($object_vars) . ')</b>';
|
||||||
|
if (in_array($var, $objects)) {
|
||||||
|
$results .= ' called recursive';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if ($depth == $max) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
$objects[] = $var;
|
||||||
|
foreach ($object_vars as $curr_key => $curr_val) {
|
||||||
|
$results .= '<br>' . str_repeat(' ', $depth * 2) . '<b> ->' . strtr($curr_key, $_replace) .
|
||||||
|
'</b> = ' . smarty_modifier_debug_print_var($curr_val, $max, $length, ++ $depth, $objects);
|
||||||
|
$depth --;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'boolean' :
|
||||||
|
case 'NULL' :
|
||||||
|
case 'resource' :
|
||||||
|
if (true === $var) {
|
||||||
|
$results = 'true';
|
||||||
|
} elseif (false === $var) {
|
||||||
|
$results = 'false';
|
||||||
|
} elseif (null === $var) {
|
||||||
|
$results = 'null';
|
||||||
|
} else {
|
||||||
|
$results = htmlspecialchars((string) $var);
|
||||||
|
}
|
||||||
|
$results = '<i>' . $results . '</i>';
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'integer' :
|
||||||
|
case 'float' :
|
||||||
|
$results = htmlspecialchars((string) $var);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'string' :
|
||||||
|
$results = strtr($var, $_replace);
|
||||||
|
if (Smarty::$_MBSTRING) {
|
||||||
|
if (mb_strlen($var, Smarty::$_CHARSET) > $length) {
|
||||||
|
$results = mb_substr($var, 0, $length - 3, Smarty::$_CHARSET) . '...';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (isset($var[ $length ])) {
|
||||||
|
$results = substr($var, 0, $length - 3) . '...';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$results = htmlspecialchars('"' . $results . '"', ENT_QUOTES, Smarty::$_CHARSET);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'unknown type' :
|
||||||
|
default :
|
||||||
|
$results = strtr((string) $var, $_replace);
|
||||||
|
if (Smarty::$_MBSTRING) {
|
||||||
|
if (mb_strlen($results, Smarty::$_CHARSET) > $length) {
|
||||||
|
$results = mb_substr($results, 0, $length - 3, Smarty::$_CHARSET) . '...';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (strlen($results) > $length) {
|
||||||
|
$results = substr($results, 0, $length - 3) . '...';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$results = htmlspecialchars($results, ENT_QUOTES, Smarty::$_CHARSET);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $results;
|
||||||
|
}
|
||||||
207
misc/smarty_libs/plugins/modifier.escape.php
Normal file
207
misc/smarty_libs/plugins/modifier.escape.php
Normal file
@@ -0,0 +1,207 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifier
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty escape modifier plugin
|
||||||
|
* Type: modifier<br>
|
||||||
|
* Name: escape<br>
|
||||||
|
* Purpose: escape string for output
|
||||||
|
*
|
||||||
|
* @link http://www.smarty.net/docs/en/language.modifier.escape
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
*
|
||||||
|
* @param string $string input string
|
||||||
|
* @param string $esc_type escape type
|
||||||
|
* @param string $char_set character set, used for htmlspecialchars() or htmlentities()
|
||||||
|
* @param boolean $double_encode encode already encoded entitites again, used for htmlspecialchars() or htmlentities()
|
||||||
|
*
|
||||||
|
* @return string escaped input string
|
||||||
|
*/
|
||||||
|
function smarty_modifier_escape($string, $esc_type = 'html', $char_set = null, $double_encode = true)
|
||||||
|
{
|
||||||
|
static $_double_encode = null;
|
||||||
|
if ($_double_encode === null) {
|
||||||
|
$_double_encode = version_compare(PHP_VERSION, '5.2.3', '>=');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$char_set) {
|
||||||
|
$char_set = Smarty::$_CHARSET;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ($esc_type) {
|
||||||
|
case 'html':
|
||||||
|
if ($_double_encode) {
|
||||||
|
// php >=5.3.2 - go native
|
||||||
|
return htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode);
|
||||||
|
} else {
|
||||||
|
if ($double_encode) {
|
||||||
|
// php <5.2.3 - only handle double encoding
|
||||||
|
return htmlspecialchars($string, ENT_QUOTES, $char_set);
|
||||||
|
} else {
|
||||||
|
// php <5.2.3 - prevent double encoding
|
||||||
|
$string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string);
|
||||||
|
$string = htmlspecialchars($string, ENT_QUOTES, $char_set);
|
||||||
|
$string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string);
|
||||||
|
|
||||||
|
return $string;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'htmlall':
|
||||||
|
if (Smarty::$_MBSTRING) {
|
||||||
|
// mb_convert_encoding ignores htmlspecialchars()
|
||||||
|
if ($_double_encode) {
|
||||||
|
// php >=5.3.2 - go native
|
||||||
|
$string = htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode);
|
||||||
|
} else {
|
||||||
|
if ($double_encode) {
|
||||||
|
// php <5.2.3 - only handle double encoding
|
||||||
|
$string = htmlspecialchars($string, ENT_QUOTES, $char_set);
|
||||||
|
} else {
|
||||||
|
// php <5.2.3 - prevent double encoding
|
||||||
|
$string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string);
|
||||||
|
$string = htmlspecialchars($string, ENT_QUOTES, $char_set);
|
||||||
|
$string =
|
||||||
|
str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string);
|
||||||
|
|
||||||
|
return $string;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// htmlentities() won't convert everything, so use mb_convert_encoding
|
||||||
|
return mb_convert_encoding($string, 'HTML-ENTITIES', $char_set);
|
||||||
|
}
|
||||||
|
|
||||||
|
// no MBString fallback
|
||||||
|
if ($_double_encode) {
|
||||||
|
return htmlentities($string, ENT_QUOTES, $char_set, $double_encode);
|
||||||
|
} else {
|
||||||
|
if ($double_encode) {
|
||||||
|
return htmlentities($string, ENT_QUOTES, $char_set);
|
||||||
|
} else {
|
||||||
|
$string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string);
|
||||||
|
$string = htmlentities($string, ENT_QUOTES, $char_set);
|
||||||
|
$string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string);
|
||||||
|
|
||||||
|
return $string;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'url':
|
||||||
|
return rawurlencode($string);
|
||||||
|
|
||||||
|
case 'urlpathinfo':
|
||||||
|
return str_replace('%2F', '/', rawurlencode($string));
|
||||||
|
|
||||||
|
case 'quotes':
|
||||||
|
// escape unescaped single quotes
|
||||||
|
return preg_replace("%(?<!\\\\)'%", "\\'", $string);
|
||||||
|
|
||||||
|
case 'hex':
|
||||||
|
// escape every byte into hex
|
||||||
|
// Note that the UTF-8 encoded character ä will be represented as %c3%a4
|
||||||
|
$return = '';
|
||||||
|
$_length = strlen($string);
|
||||||
|
for ($x = 0; $x < $_length; $x ++) {
|
||||||
|
$return .= '%' . bin2hex($string[ $x ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $return;
|
||||||
|
|
||||||
|
case 'hexentity':
|
||||||
|
$return = '';
|
||||||
|
if (Smarty::$_MBSTRING) {
|
||||||
|
if (!is_callable('smarty_mb_to_unicode')) {
|
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php');
|
||||||
|
}
|
||||||
|
$return = '';
|
||||||
|
foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) {
|
||||||
|
$return .= '&#x' . strtoupper(dechex($unicode)) . ';';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
// no MBString fallback
|
||||||
|
$_length = strlen($string);
|
||||||
|
for ($x = 0; $x < $_length; $x ++) {
|
||||||
|
$return .= '&#x' . bin2hex($string[ $x ]) . ';';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $return;
|
||||||
|
|
||||||
|
case 'decentity':
|
||||||
|
$return = '';
|
||||||
|
if (Smarty::$_MBSTRING) {
|
||||||
|
if (!is_callable('smarty_mb_to_unicode')) {
|
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php');
|
||||||
|
}
|
||||||
|
$return = '';
|
||||||
|
foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) {
|
||||||
|
$return .= '&#' . $unicode . ';';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
// no MBString fallback
|
||||||
|
$_length = strlen($string);
|
||||||
|
for ($x = 0; $x < $_length; $x ++) {
|
||||||
|
$return .= '&#' . ord($string[ $x ]) . ';';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $return;
|
||||||
|
|
||||||
|
case 'javascript':
|
||||||
|
// escape quotes and backslashes, newlines, etc.
|
||||||
|
return strtr($string, array('\\' => '\\\\', "'" => "\\'", '"' => '\\"', "\r" => '\\r', "\n" => '\\n',
|
||||||
|
'</' => '<\/'));
|
||||||
|
|
||||||
|
case 'mail':
|
||||||
|
if (Smarty::$_MBSTRING) {
|
||||||
|
if (!is_callable('smarty_mb_str_replace')) {
|
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php');
|
||||||
|
}
|
||||||
|
return smarty_mb_str_replace(array('@', '.'), array(' [AT] ', ' [DOT] '), $string);
|
||||||
|
}
|
||||||
|
// no MBString fallback
|
||||||
|
return str_replace(array('@', '.'), array(' [AT] ', ' [DOT] '), $string);
|
||||||
|
|
||||||
|
case 'nonstd':
|
||||||
|
// escape non-standard chars, such as ms document quotes
|
||||||
|
$return = '';
|
||||||
|
if (Smarty::$_MBSTRING) {
|
||||||
|
if (!is_callable('smarty_mb_to_unicode')) {
|
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php');
|
||||||
|
}
|
||||||
|
foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) {
|
||||||
|
if ($unicode >= 126) {
|
||||||
|
$return .= '&#' . $unicode . ';';
|
||||||
|
} else {
|
||||||
|
$return .= chr($unicode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$_length = strlen($string);
|
||||||
|
for ($_i = 0; $_i < $_length; $_i ++) {
|
||||||
|
$_ord = ord(substr($string, $_i, 1));
|
||||||
|
// non-standard char, escape it
|
||||||
|
if ($_ord >= 126) {
|
||||||
|
$return .= '&#' . $_ord . ';';
|
||||||
|
} else {
|
||||||
|
$return .= substr($string, $_i, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $return;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return $string;
|
||||||
|
}
|
||||||
|
}
|
||||||
58
misc/smarty_libs/plugins/modifier.regex_replace.php
Normal file
58
misc/smarty_libs/plugins/modifier.regex_replace.php
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifier
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty regex_replace modifier plugin
|
||||||
|
* Type: modifier<br>
|
||||||
|
* Name: regex_replace<br>
|
||||||
|
* Purpose: regular expression search/replace
|
||||||
|
*
|
||||||
|
* @link http://smarty.php.net/manual/en/language.modifier.regex.replace.php
|
||||||
|
* regex_replace (Smarty online manual)
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
*
|
||||||
|
* @param string $string input string
|
||||||
|
* @param string|array $search regular expression(s) to search for
|
||||||
|
* @param string|array $replace string(s) that should be replaced
|
||||||
|
* @param int $limit the maximum number of replacements
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function smarty_modifier_regex_replace($string, $search, $replace, $limit = - 1)
|
||||||
|
{
|
||||||
|
if (is_array($search)) {
|
||||||
|
foreach ($search as $idx => $s) {
|
||||||
|
$search[ $idx ] = _smarty_regex_replace_check($s);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$search = _smarty_regex_replace_check($search);
|
||||||
|
}
|
||||||
|
|
||||||
|
return preg_replace($search, $replace, $string, $limit);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $search string(s) that should be replaced
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @ignore
|
||||||
|
*/
|
||||||
|
function _smarty_regex_replace_check($search)
|
||||||
|
{
|
||||||
|
// null-byte injection detection
|
||||||
|
// anything behind the first null-byte is ignored
|
||||||
|
if (($pos = strpos($search, "\0")) !== false) {
|
||||||
|
$search = substr($search, 0, $pos);
|
||||||
|
}
|
||||||
|
// remove eval-modifier from $search
|
||||||
|
if (preg_match('!([a-zA-Z\s]+)$!s', $search, $match) && (strpos($match[ 1 ], 'e') !== false)) {
|
||||||
|
$search = substr($search, 0, - strlen($match[ 1 ])) . preg_replace('![e\s]+!', '', $match[ 1 ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $search;
|
||||||
|
}
|
||||||
35
misc/smarty_libs/plugins/modifier.replace.php
Normal file
35
misc/smarty_libs/plugins/modifier.replace.php
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifier
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty replace modifier plugin
|
||||||
|
* Type: modifier<br>
|
||||||
|
* Name: replace<br>
|
||||||
|
* Purpose: simple search/replace
|
||||||
|
*
|
||||||
|
* @link http://smarty.php.net/manual/en/language.modifier.replace.php replace (Smarty online manual)
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
* @author Uwe Tews
|
||||||
|
*
|
||||||
|
* @param string $string input string
|
||||||
|
* @param string $search text to search for
|
||||||
|
* @param string $replace replacement text
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function smarty_modifier_replace($string, $search, $replace)
|
||||||
|
{
|
||||||
|
if (Smarty::$_MBSTRING) {
|
||||||
|
if (!is_callable('smarty_mb_str_replace')) {
|
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php');
|
||||||
|
}
|
||||||
|
return smarty_mb_str_replace($search, $replace, $string);
|
||||||
|
}
|
||||||
|
|
||||||
|
return str_replace($search, $replace, $string);
|
||||||
|
}
|
||||||
27
misc/smarty_libs/plugins/modifier.spacify.php
Normal file
27
misc/smarty_libs/plugins/modifier.spacify.php
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifier
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty spacify modifier plugin
|
||||||
|
* Type: modifier<br>
|
||||||
|
* Name: spacify<br>
|
||||||
|
* Purpose: add spaces between characters in a string
|
||||||
|
*
|
||||||
|
* @link http://smarty.php.net/manual/en/language.modifier.spacify.php spacify (Smarty online manual)
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
*
|
||||||
|
* @param string $string input string
|
||||||
|
* @param string $spacify_char string to insert between characters.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function smarty_modifier_spacify($string, $spacify_char = ' ')
|
||||||
|
{
|
||||||
|
// well… what about charsets besides latin and UTF-8?
|
||||||
|
return implode($spacify_char, preg_split('//' . Smarty::$_UTF8_MODIFIER, $string, - 1, PREG_SPLIT_NO_EMPTY));
|
||||||
|
}
|
||||||
66
misc/smarty_libs/plugins/modifier.truncate.php
Normal file
66
misc/smarty_libs/plugins/modifier.truncate.php
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifier
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty truncate modifier plugin
|
||||||
|
* Type: modifier<br>
|
||||||
|
* Name: truncate<br>
|
||||||
|
* Purpose: Truncate a string to a certain length if necessary,
|
||||||
|
* optionally splitting in the middle of a word, and
|
||||||
|
* appending the $etc string or inserting $etc into the middle.
|
||||||
|
*
|
||||||
|
* @link http://smarty.php.net/manual/en/language.modifier.truncate.php truncate (Smarty online manual)
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
*
|
||||||
|
* @param string $string input string
|
||||||
|
* @param integer $length length of truncated text
|
||||||
|
* @param string $etc end string
|
||||||
|
* @param boolean $break_words truncate at word boundary
|
||||||
|
* @param boolean $middle truncate in the middle of text
|
||||||
|
*
|
||||||
|
* @return string truncated string
|
||||||
|
*/
|
||||||
|
function smarty_modifier_truncate($string, $length = 80, $etc = '...', $break_words = false, $middle = false)
|
||||||
|
{
|
||||||
|
if ($length == 0) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Smarty::$_MBSTRING) {
|
||||||
|
if (mb_strlen($string, Smarty::$_CHARSET) > $length) {
|
||||||
|
$length -= min($length, mb_strlen($etc, Smarty::$_CHARSET));
|
||||||
|
if (!$break_words && !$middle) {
|
||||||
|
$string = preg_replace('/\s+?(\S+)?$/' . Smarty::$_UTF8_MODIFIER, '',
|
||||||
|
mb_substr($string, 0, $length + 1, Smarty::$_CHARSET));
|
||||||
|
}
|
||||||
|
if (!$middle) {
|
||||||
|
return mb_substr($string, 0, $length, Smarty::$_CHARSET) . $etc;
|
||||||
|
}
|
||||||
|
|
||||||
|
return mb_substr($string, 0, $length / 2, Smarty::$_CHARSET) . $etc .
|
||||||
|
mb_substr($string, - $length / 2, $length, Smarty::$_CHARSET);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $string;
|
||||||
|
}
|
||||||
|
|
||||||
|
// no MBString fallback
|
||||||
|
if (isset($string[ $length ])) {
|
||||||
|
$length -= min($length, strlen($etc));
|
||||||
|
if (!$break_words && !$middle) {
|
||||||
|
$string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length + 1));
|
||||||
|
}
|
||||||
|
if (!$middle) {
|
||||||
|
return substr($string, 0, $length) . $etc;
|
||||||
|
}
|
||||||
|
|
||||||
|
return substr($string, 0, $length / 2) . $etc . substr($string, - $length / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $string;
|
||||||
|
}
|
||||||
29
misc/smarty_libs/plugins/modifiercompiler.cat.php
Normal file
29
misc/smarty_libs/plugins/modifiercompiler.cat.php
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifierCompiler
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty cat modifier plugin
|
||||||
|
* Type: modifier<br>
|
||||||
|
* Name: cat<br>
|
||||||
|
* Date: Feb 24, 2003<br>
|
||||||
|
* Purpose: catenate a value to a variable<br>
|
||||||
|
* Input: string to catenate<br>
|
||||||
|
* Example: {$var|cat:"foo"}
|
||||||
|
*
|
||||||
|
* @link http://smarty.php.net/manual/en/language.modifier.cat.php cat
|
||||||
|
* (Smarty online manual)
|
||||||
|
* @author Uwe Tews
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
*
|
||||||
|
* @return string with compiled code
|
||||||
|
*/
|
||||||
|
function smarty_modifiercompiler_cat($params)
|
||||||
|
{
|
||||||
|
return '(' . implode(').(', $params) . ')';
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifierCompiler
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty count_characters modifier plugin
|
||||||
|
* Type: modifier<br>
|
||||||
|
* Name: count_characteres<br>
|
||||||
|
* Purpose: count the number of characters in a text
|
||||||
|
*
|
||||||
|
* @link http://www.smarty.net/manual/en/language.modifier.count.characters.php count_characters (Smarty online manual)
|
||||||
|
* @author Uwe Tews
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
*
|
||||||
|
* @return string with compiled code
|
||||||
|
*/
|
||||||
|
function smarty_modifiercompiler_count_characters($params)
|
||||||
|
{
|
||||||
|
if (!isset($params[ 1 ]) || $params[ 1 ] != 'true') {
|
||||||
|
return 'preg_match_all(\'/[^\s]/' . Smarty::$_UTF8_MODIFIER . '\',' . $params[ 0 ] . ', $tmp)';
|
||||||
|
}
|
||||||
|
if (Smarty::$_MBSTRING) {
|
||||||
|
return 'mb_strlen(' . $params[ 0 ] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')';
|
||||||
|
}
|
||||||
|
// no MBString fallback
|
||||||
|
return 'strlen(' . $params[ 0 ] . ')';
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifierCompiler
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty count_paragraphs modifier plugin
|
||||||
|
* Type: modifier<br>
|
||||||
|
* Name: count_paragraphs<br>
|
||||||
|
* Purpose: count the number of paragraphs in a text
|
||||||
|
*
|
||||||
|
* @link http://www.smarty.net/manual/en/language.modifier.count.paragraphs.php
|
||||||
|
* count_paragraphs (Smarty online manual)
|
||||||
|
* @author Uwe Tews
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
*
|
||||||
|
* @return string with compiled code
|
||||||
|
*/
|
||||||
|
function smarty_modifiercompiler_count_paragraphs($params)
|
||||||
|
{
|
||||||
|
// count \r or \n characters
|
||||||
|
return '(preg_match_all(\'#[\r\n]+#\', ' . $params[ 0 ] . ', $tmp)+1)';
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifierCompiler
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty count_sentences modifier plugin
|
||||||
|
* Type: modifier<br>
|
||||||
|
* Name: count_sentences
|
||||||
|
* Purpose: count the number of sentences in a text
|
||||||
|
*
|
||||||
|
* @link http://www.smarty.net/manual/en/language.modifier.count.paragraphs.php
|
||||||
|
* count_sentences (Smarty online manual)
|
||||||
|
* @author Uwe Tews
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
*
|
||||||
|
* @return string with compiled code
|
||||||
|
*/
|
||||||
|
function smarty_modifiercompiler_count_sentences($params)
|
||||||
|
{
|
||||||
|
// 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)';
|
||||||
|
}
|
||||||
32
misc/smarty_libs/plugins/modifiercompiler.count_words.php
Normal file
32
misc/smarty_libs/plugins/modifiercompiler.count_words.php
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifierCompiler
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty count_words modifier plugin
|
||||||
|
* Type: modifier<br>
|
||||||
|
* Name: count_words<br>
|
||||||
|
* Purpose: count the number of words in a text
|
||||||
|
*
|
||||||
|
* @link http://www.smarty.net/manual/en/language.modifier.count.words.php count_words (Smarty online manual)
|
||||||
|
* @author Uwe Tews
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
*
|
||||||
|
* @return string with compiled code
|
||||||
|
*/
|
||||||
|
function smarty_modifiercompiler_count_words($params)
|
||||||
|
{
|
||||||
|
if (Smarty::$_MBSTRING) {
|
||||||
|
// return 'preg_match_all(\'#[\w\pL]+#' . Smarty::$_UTF8_MODIFIER . '\', ' . $params[0] . ', $tmp)';
|
||||||
|
// expression taken from http://de.php.net/manual/en/function.str-word-count.php#85592
|
||||||
|
return 'preg_match_all(\'/\p{L}[\p{L}\p{Mn}\p{Pd}\\\'\x{2019}]*/' . Smarty::$_UTF8_MODIFIER . '\', ' .
|
||||||
|
$params[ 0 ] . ', $tmp)';
|
||||||
|
}
|
||||||
|
// no MBString fallback
|
||||||
|
return 'str_word_count(' . $params[ 0 ] . ')';
|
||||||
|
}
|
||||||
35
misc/smarty_libs/plugins/modifiercompiler.default.php
Normal file
35
misc/smarty_libs/plugins/modifiercompiler.default.php
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifierCompiler
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty default modifier plugin
|
||||||
|
* Type: modifier<br>
|
||||||
|
* Name: default<br>
|
||||||
|
* Purpose: designate default value for empty variables
|
||||||
|
*
|
||||||
|
* @link http://www.smarty.net/manual/en/language.modifier.default.php default (Smarty online manual)
|
||||||
|
* @author Uwe Tews
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
*
|
||||||
|
* @return string with compiled code
|
||||||
|
*/
|
||||||
|
function smarty_modifiercompiler_default($params)
|
||||||
|
{
|
||||||
|
$output = $params[ 0 ];
|
||||||
|
if (!isset($params[ 1 ])) {
|
||||||
|
$params[ 1 ] = "''";
|
||||||
|
}
|
||||||
|
|
||||||
|
array_shift($params);
|
||||||
|
foreach ($params as $param) {
|
||||||
|
$output = '(($tmp = @' . $output . ')===null||$tmp===\'\' ? ' . $param . ' : $tmp)';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $output;
|
||||||
|
}
|
||||||
115
misc/smarty_libs/plugins/modifiercompiler.escape.php
Normal file
115
misc/smarty_libs/plugins/modifiercompiler.escape.php
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifierCompiler
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty escape modifier plugin
|
||||||
|
* Type: modifier<br>
|
||||||
|
* Name: escape<br>
|
||||||
|
* Purpose: escape string for output
|
||||||
|
*
|
||||||
|
* @link http://www.smarty.net/docsv2/en/language.modifier.escape count_characters (Smarty online manual)
|
||||||
|
* @author Rodney Rehm
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
* @param $compiler
|
||||||
|
*
|
||||||
|
* @return string with compiled code
|
||||||
|
*/
|
||||||
|
function smarty_modifiercompiler_escape($params, $compiler)
|
||||||
|
{
|
||||||
|
static $_double_encode = null;
|
||||||
|
if (!is_callable('smarty_literal_compiler_param')) {
|
||||||
|
require_once(SMARTY_PLUGINS_DIR . 'shared.literal_compiler_param.php');
|
||||||
|
}
|
||||||
|
if ($_double_encode === null) {
|
||||||
|
$_double_encode = version_compare(PHP_VERSION, '5.2.3', '>=');
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$esc_type = smarty_literal_compiler_param($params, 1, 'html');
|
||||||
|
$char_set = smarty_literal_compiler_param($params, 2, Smarty::$_CHARSET);
|
||||||
|
$double_encode = smarty_literal_compiler_param($params, 3, true);
|
||||||
|
|
||||||
|
if (!$char_set) {
|
||||||
|
$char_set = Smarty::$_CHARSET;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ($esc_type) {
|
||||||
|
case 'html':
|
||||||
|
if ($_double_encode) {
|
||||||
|
return 'htmlspecialchars(' . $params[ 0 ] . ', ENT_QUOTES, ' . var_export($char_set, true) . ', ' .
|
||||||
|
var_export($double_encode, true) . ')';
|
||||||
|
} elseif ($double_encode) {
|
||||||
|
return 'htmlspecialchars(' . $params[ 0 ] . ', ENT_QUOTES, ' . var_export($char_set, true) . ')';
|
||||||
|
} else {
|
||||||
|
// fall back to modifier.escape.php
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'htmlall':
|
||||||
|
if (Smarty::$_MBSTRING) {
|
||||||
|
if ($_double_encode) {
|
||||||
|
// php >=5.2.3 - go native
|
||||||
|
return 'mb_convert_encoding(htmlspecialchars(' . $params[ 0 ] . ', ENT_QUOTES, ' .
|
||||||
|
var_export($char_set, true) . ', ' . var_export($double_encode, true) .
|
||||||
|
'), "HTML-ENTITIES", ' . var_export($char_set, true) . ')';
|
||||||
|
} elseif ($double_encode) {
|
||||||
|
// php <5.2.3 - only handle double encoding
|
||||||
|
return 'mb_convert_encoding(htmlspecialchars(' . $params[ 0 ] . ', ENT_QUOTES, ' .
|
||||||
|
var_export($char_set, true) . '), "HTML-ENTITIES", ' . var_export($char_set, true) . ')';
|
||||||
|
} else {
|
||||||
|
// fall back to modifier.escape.php
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// no MBString fallback
|
||||||
|
if ($_double_encode) {
|
||||||
|
// php >=5.2.3 - go native
|
||||||
|
return 'htmlentities(' . $params[ 0 ] . ', ENT_QUOTES, ' . var_export($char_set, true) . ', ' .
|
||||||
|
var_export($double_encode, true) . ')';
|
||||||
|
} elseif ($double_encode) {
|
||||||
|
// php <5.2.3 - only handle double encoding
|
||||||
|
return 'htmlentities(' . $params[ 0 ] . ', ENT_QUOTES, ' . var_export($char_set, true) . ')';
|
||||||
|
} else {
|
||||||
|
// fall back to modifier.escape.php
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'url':
|
||||||
|
return 'rawurlencode(' . $params[ 0 ] . ')';
|
||||||
|
|
||||||
|
case 'urlpathinfo':
|
||||||
|
return 'str_replace("%2F", "/", rawurlencode(' . $params[ 0 ] . '))';
|
||||||
|
|
||||||
|
case 'quotes':
|
||||||
|
// escape unescaped single quotes
|
||||||
|
return 'preg_replace("%(?<!\\\\\\\\)\'%", "\\\'",' . $params[ 0 ] . ')';
|
||||||
|
|
||||||
|
case 'javascript':
|
||||||
|
// escape quotes and backslashes, newlines, etc.
|
||||||
|
return 'strtr(' . $params[ 0 ] .
|
||||||
|
', array("\\\\" => "\\\\\\\\", "\'" => "\\\\\'", "\"" => "\\\\\"", "\\r" => "\\\\r", "\\n" => "\\\n", "</" => "<\/" ))';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (SmartyException $e) {
|
||||||
|
// pass through to regular plugin fallback
|
||||||
|
}
|
||||||
|
|
||||||
|
// could not optimize |escape call, so fallback to regular plugin
|
||||||
|
if ($compiler->template->caching && ($compiler->tag_nocache | $compiler->nocache)) {
|
||||||
|
$compiler->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ 'escape' ][ 'modifier' ][ 'file' ] =
|
||||||
|
SMARTY_PLUGINS_DIR . 'modifier.escape.php';
|
||||||
|
$compiler->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ 'escape' ][ 'modifier' ][ 'function' ] =
|
||||||
|
'smarty_modifier_escape';
|
||||||
|
} else {
|
||||||
|
$compiler->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ 'escape' ][ 'modifier' ][ 'file' ] =
|
||||||
|
SMARTY_PLUGINS_DIR . 'modifier.escape.php';
|
||||||
|
$compiler->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ 'escape' ][ 'modifier' ][ 'function' ] =
|
||||||
|
'smarty_modifier_escape';
|
||||||
|
}
|
||||||
|
|
||||||
|
return 'smarty_modifier_escape(' . join(', ', $params) . ')';
|
||||||
|
}
|
||||||
33
misc/smarty_libs/plugins/modifiercompiler.from_charset.php
Normal file
33
misc/smarty_libs/plugins/modifiercompiler.from_charset.php
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifierCompiler
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty from_charset modifier plugin
|
||||||
|
* Type: modifier<br>
|
||||||
|
* Name: from_charset<br>
|
||||||
|
* Purpose: convert character encoding from $charset to internal encoding
|
||||||
|
*
|
||||||
|
* @author Rodney Rehm
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
*
|
||||||
|
* @return string with compiled code
|
||||||
|
*/
|
||||||
|
function smarty_modifiercompiler_from_charset($params)
|
||||||
|
{
|
||||||
|
if (!Smarty::$_MBSTRING) {
|
||||||
|
// FIXME: (rodneyrehm) shouldn't this throw an error?
|
||||||
|
return $params[ 0 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($params[ 1 ])) {
|
||||||
|
$params[ 1 ] = '"ISO-8859-1"';
|
||||||
|
}
|
||||||
|
|
||||||
|
return 'mb_convert_encoding(' . $params[ 0 ] . ', "' . addslashes(Smarty::$_CHARSET) . '", ' . $params[ 1 ] . ')';
|
||||||
|
}
|
||||||
33
misc/smarty_libs/plugins/modifiercompiler.indent.php
Normal file
33
misc/smarty_libs/plugins/modifiercompiler.indent.php
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifierCompiler
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty indent modifier plugin
|
||||||
|
* Type: modifier<br>
|
||||||
|
* Name: indent<br>
|
||||||
|
* Purpose: indent lines of text
|
||||||
|
*
|
||||||
|
* @link http://www.smarty.net/manual/en/language.modifier.indent.php indent (Smarty online manual)
|
||||||
|
* @author Uwe Tews
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
*
|
||||||
|
* @return string with compiled code
|
||||||
|
*/
|
||||||
|
|
||||||
|
function smarty_modifiercompiler_indent($params)
|
||||||
|
{
|
||||||
|
if (!isset($params[ 1 ])) {
|
||||||
|
$params[ 1 ] = 4;
|
||||||
|
}
|
||||||
|
if (!isset($params[ 2 ])) {
|
||||||
|
$params[ 2 ] = "' '";
|
||||||
|
}
|
||||||
|
|
||||||
|
return 'preg_replace(\'!^!m\',str_repeat(' . $params[ 2 ] . ',' . $params[ 1 ] . '),' . $params[ 0 ] . ')';
|
||||||
|
}
|
||||||
31
misc/smarty_libs/plugins/modifiercompiler.lower.php
Normal file
31
misc/smarty_libs/plugins/modifiercompiler.lower.php
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifierCompiler
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty lower modifier plugin
|
||||||
|
* Type: modifier<br>
|
||||||
|
* Name: lower<br>
|
||||||
|
* Purpose: convert string to lowercase
|
||||||
|
*
|
||||||
|
* @link http://www.smarty.net/manual/en/language.modifier.lower.php lower (Smarty online manual)
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
* @author Uwe Tews
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
*
|
||||||
|
* @return string with compiled code
|
||||||
|
*/
|
||||||
|
|
||||||
|
function smarty_modifiercompiler_lower($params)
|
||||||
|
{
|
||||||
|
if (Smarty::$_MBSTRING) {
|
||||||
|
return 'mb_strtolower(' . $params[ 0 ] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')';
|
||||||
|
}
|
||||||
|
// no MBString fallback
|
||||||
|
return 'strtolower(' . $params[ 0 ] . ')';
|
||||||
|
}
|
||||||
21
misc/smarty_libs/plugins/modifiercompiler.noprint.php
Normal file
21
misc/smarty_libs/plugins/modifiercompiler.noprint.php
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifierCompiler
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty noprint modifier plugin
|
||||||
|
* Type: modifier<br>
|
||||||
|
* Name: noprint<br>
|
||||||
|
* Purpose: return an empty string
|
||||||
|
*
|
||||||
|
* @author Uwe Tews
|
||||||
|
* @return string with compiled code
|
||||||
|
*/
|
||||||
|
function smarty_modifiercompiler_noprint()
|
||||||
|
{
|
||||||
|
return "''";
|
||||||
|
}
|
||||||
25
misc/smarty_libs/plugins/modifiercompiler.string_format.php
Normal file
25
misc/smarty_libs/plugins/modifiercompiler.string_format.php
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifierCompiler
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty string_format modifier plugin
|
||||||
|
* Type: modifier<br>
|
||||||
|
* Name: string_format<br>
|
||||||
|
* Purpose: format strings via sprintf
|
||||||
|
*
|
||||||
|
* @link http://www.smarty.net/manual/en/language.modifier.string.format.php string_format (Smarty online manual)
|
||||||
|
* @author Uwe Tews
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
*
|
||||||
|
* @return string with compiled code
|
||||||
|
*/
|
||||||
|
function smarty_modifiercompiler_string_format($params)
|
||||||
|
{
|
||||||
|
return 'sprintf(' . $params[ 1 ] . ',' . $params[ 0 ] . ')';
|
||||||
|
}
|
||||||
33
misc/smarty_libs/plugins/modifiercompiler.strip.php
Normal file
33
misc/smarty_libs/plugins/modifiercompiler.strip.php
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifierCompiler
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty strip modifier plugin
|
||||||
|
* Type: modifier<br>
|
||||||
|
* Name: strip<br>
|
||||||
|
* Purpose: Replace all repeated spaces, newlines, tabs
|
||||||
|
* with a single space or supplied replacement string.<br>
|
||||||
|
* Example: {$var|strip} {$var|strip:" "}<br>
|
||||||
|
* Date: September 25th, 2002
|
||||||
|
*
|
||||||
|
* @link http://www.smarty.net/manual/en/language.modifier.strip.php strip (Smarty online manual)
|
||||||
|
* @author Uwe Tews
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
*
|
||||||
|
* @return string with compiled code
|
||||||
|
*/
|
||||||
|
|
||||||
|
function smarty_modifiercompiler_strip($params)
|
||||||
|
{
|
||||||
|
if (!isset($params[ 1 ])) {
|
||||||
|
$params[ 1 ] = "' '";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "preg_replace('!\s+!" . Smarty::$_UTF8_MODIFIER . "', {$params[1]},{$params[0]})";
|
||||||
|
}
|
||||||
29
misc/smarty_libs/plugins/modifiercompiler.strip_tags.php
Normal file
29
misc/smarty_libs/plugins/modifiercompiler.strip_tags.php
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifierCompiler
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty strip_tags modifier plugin
|
||||||
|
* Type: modifier<br>
|
||||||
|
* Name: strip_tags<br>
|
||||||
|
* Purpose: strip html tags from text
|
||||||
|
*
|
||||||
|
* @link http://www.smarty.net/docs/en/language.modifier.strip.tags.tpl strip_tags (Smarty online manual)
|
||||||
|
* @author Uwe Tews
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
*
|
||||||
|
* @return string with compiled code
|
||||||
|
*/
|
||||||
|
function smarty_modifiercompiler_strip_tags($params)
|
||||||
|
{
|
||||||
|
if (!isset($params[ 1 ]) || $params[ 1 ] === true || trim($params[ 1 ], '"') == 'true') {
|
||||||
|
return "preg_replace('!<[^>]*?>!', ' ', {$params[0]})";
|
||||||
|
} else {
|
||||||
|
return 'strip_tags(' . $params[ 0 ] . ')';
|
||||||
|
}
|
||||||
|
}
|
||||||
33
misc/smarty_libs/plugins/modifiercompiler.to_charset.php
Normal file
33
misc/smarty_libs/plugins/modifiercompiler.to_charset.php
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifierCompiler
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty to_charset modifier plugin
|
||||||
|
* Type: modifier<br>
|
||||||
|
* Name: to_charset<br>
|
||||||
|
* Purpose: convert character encoding from internal encoding to $charset
|
||||||
|
*
|
||||||
|
* @author Rodney Rehm
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
*
|
||||||
|
* @return string with compiled code
|
||||||
|
*/
|
||||||
|
function smarty_modifiercompiler_to_charset($params)
|
||||||
|
{
|
||||||
|
if (!Smarty::$_MBSTRING) {
|
||||||
|
// FIXME: (rodneyrehm) shouldn't this throw an error?
|
||||||
|
return $params[ 0 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($params[ 1 ])) {
|
||||||
|
$params[ 1 ] = '"ISO-8859-1"';
|
||||||
|
}
|
||||||
|
|
||||||
|
return 'mb_convert_encoding(' . $params[ 0 ] . ', ' . $params[ 1 ] . ', "' . addslashes(Smarty::$_CHARSET) . '")';
|
||||||
|
}
|
||||||
50
misc/smarty_libs/plugins/modifiercompiler.unescape.php
Normal file
50
misc/smarty_libs/plugins/modifiercompiler.unescape.php
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifierCompiler
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty unescape modifier plugin
|
||||||
|
* Type: modifier<br>
|
||||||
|
* Name: unescape<br>
|
||||||
|
* Purpose: unescape html entities
|
||||||
|
*
|
||||||
|
* @author Rodney Rehm
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
*
|
||||||
|
* @return string with compiled code
|
||||||
|
*/
|
||||||
|
function smarty_modifiercompiler_unescape($params)
|
||||||
|
{
|
||||||
|
if (!isset($params[ 1 ])) {
|
||||||
|
$params[ 1 ] = 'html';
|
||||||
|
}
|
||||||
|
if (!isset($params[ 2 ])) {
|
||||||
|
$params[ 2 ] = '\'' . addslashes(Smarty::$_CHARSET) . '\'';
|
||||||
|
} else {
|
||||||
|
$params[ 2 ] = "'" . $params[ 2 ] . "'";
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (trim($params[ 1 ], '"\'')) {
|
||||||
|
case 'entity':
|
||||||
|
case 'htmlall':
|
||||||
|
if (Smarty::$_MBSTRING) {
|
||||||
|
return 'mb_convert_encoding(' . $params[ 0 ] . ', ' . $params[ 2 ] . ', \'HTML-ENTITIES\')';
|
||||||
|
}
|
||||||
|
|
||||||
|
return 'html_entity_decode(' . $params[ 0 ] . ', ENT_NOQUOTES, ' . $params[ 2 ] . ')';
|
||||||
|
|
||||||
|
case 'html':
|
||||||
|
return 'htmlspecialchars_decode(' . $params[ 0 ] . ', ENT_QUOTES)';
|
||||||
|
|
||||||
|
case 'url':
|
||||||
|
return 'rawurldecode(' . $params[ 0 ] . ')';
|
||||||
|
|
||||||
|
default:
|
||||||
|
return $params[ 0 ];
|
||||||
|
}
|
||||||
|
}
|
||||||
29
misc/smarty_libs/plugins/modifiercompiler.upper.php
Normal file
29
misc/smarty_libs/plugins/modifiercompiler.upper.php
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifierCompiler
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty upper modifier plugin
|
||||||
|
* Type: modifier<br>
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
*
|
||||||
|
* @return string with compiled code
|
||||||
|
*/
|
||||||
|
function smarty_modifiercompiler_upper($params)
|
||||||
|
{
|
||||||
|
if (Smarty::$_MBSTRING) {
|
||||||
|
return 'mb_strtoupper(' . $params[ 0 ] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')';
|
||||||
|
}
|
||||||
|
// no MBString fallback
|
||||||
|
return 'strtoupper(' . $params[ 0 ] . ')';
|
||||||
|
}
|
||||||
51
misc/smarty_libs/plugins/modifiercompiler.wordwrap.php
Normal file
51
misc/smarty_libs/plugins/modifiercompiler.wordwrap.php
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifierCompiler
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty wordwrap modifier plugin
|
||||||
|
* Type: modifier<br>
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
* @param $compiler
|
||||||
|
*
|
||||||
|
* @return string with compiled code
|
||||||
|
*/
|
||||||
|
function smarty_modifiercompiler_wordwrap($params, $compiler)
|
||||||
|
{
|
||||||
|
if (!isset($params[ 1 ])) {
|
||||||
|
$params[ 1 ] = 80;
|
||||||
|
}
|
||||||
|
if (!isset($params[ 2 ])) {
|
||||||
|
$params[ 2 ] = '"\n"';
|
||||||
|
}
|
||||||
|
if (!isset($params[ 3 ])) {
|
||||||
|
$params[ 3 ] = 'false';
|
||||||
|
}
|
||||||
|
$function = 'wordwrap';
|
||||||
|
if (Smarty::$_MBSTRING) {
|
||||||
|
if ($compiler->template->caching && ($compiler->tag_nocache | $compiler->nocache)) {
|
||||||
|
$compiler->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ 'wordwrap' ][ 'modifier' ][ 'file' ] =
|
||||||
|
SMARTY_PLUGINS_DIR . 'shared.mb_wordwrap.php';
|
||||||
|
$compiler->template->required_plugins[ 'nocache' ][ 'wordwrap' ][ 'modifier' ][ 'function' ] =
|
||||||
|
'smarty_mb_wordwrap';
|
||||||
|
} else {
|
||||||
|
$compiler->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ 'wordwrap' ][ 'modifier' ][ 'file' ] =
|
||||||
|
SMARTY_PLUGINS_DIR . 'shared.mb_wordwrap.php';
|
||||||
|
$compiler->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ 'wordwrap' ][ 'modifier' ][ 'function' ] =
|
||||||
|
'smarty_mb_wordwrap';
|
||||||
|
}
|
||||||
|
$function = 'smarty_mb_wordwrap';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $function . '(' . $params[ 0 ] . ',' . $params[ 1 ] . ',' . $params[ 2 ] . ',' . $params[ 3 ] . ')';
|
||||||
|
}
|
||||||
89
misc/smarty_libs/plugins/outputfilter.trimwhitespace.php
Normal file
89
misc/smarty_libs/plugins/outputfilter.trimwhitespace.php
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsFilter
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty trimwhitespace outputfilter plugin
|
||||||
|
* Trim unnecessary whitespace from HTML markup.
|
||||||
|
*
|
||||||
|
* @author Rodney Rehm
|
||||||
|
*
|
||||||
|
* @param string $source input string
|
||||||
|
*
|
||||||
|
* @return string filtered output
|
||||||
|
* @todo substr_replace() is not overloaded by mbstring.func_overload - so this function might fail!
|
||||||
|
*/
|
||||||
|
function smarty_outputfilter_trimwhitespace($source)
|
||||||
|
{
|
||||||
|
$store = array();
|
||||||
|
$_store = 0;
|
||||||
|
$_offset = 0;
|
||||||
|
|
||||||
|
// Unify Line-Breaks to \n
|
||||||
|
$source = preg_replace("/\015\012|\015|\012/", "\n", $source);
|
||||||
|
|
||||||
|
// capture Internet Explorer and KnockoutJS Conditional Comments
|
||||||
|
if (preg_match_all('#<!--((\[[^\]]+\]>.*?<!\[[^\]]+\])|(\s*/?ko\s+.+))-->#is', $source, $matches,
|
||||||
|
PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) {
|
||||||
|
foreach ($matches as $match) {
|
||||||
|
$store[] = $match[ 0 ][ 0 ];
|
||||||
|
$_length = strlen($match[ 0 ][ 0 ]);
|
||||||
|
$replace = '@!@SMARTY:' . $_store . ':SMARTY@!@';
|
||||||
|
$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
|
||||||
|
$source = preg_replace('#<!--.*?-->#ms', '', $source);
|
||||||
|
|
||||||
|
// capture html elements not to be messed with
|
||||||
|
$_offset = 0;
|
||||||
|
if (preg_match_all('#(<script[^>]*>.*?</script[^>]*>)|(<textarea[^>]*>.*?</textarea[^>]*>)|(<pre[^>]*>.*?</pre[^>]*>)#is',
|
||||||
|
$source, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) {
|
||||||
|
foreach ($matches as $match) {
|
||||||
|
$store[] = $match[ 0 ][ 0 ];
|
||||||
|
$_length = strlen($match[ 0 ][ 0 ]);
|
||||||
|
$replace = '@!@SMARTY:' . $_store . ':SMARTY@!@';
|
||||||
|
$source = substr_replace($source, $replace, $match[ 0 ][ 1 ] - $_offset, $_length);
|
||||||
|
|
||||||
|
$_offset += $_length - strlen($replace);
|
||||||
|
$_store ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$expressions = array(// replace multiple spaces between tags by a single space
|
||||||
|
// 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!)
|
||||||
|
'#(([a-z0-9]\s*=\s*("[^"]*?")|(\'[^\']*?\'))|<[a-z0-9_]+)\s+([a-z/>])#is' => '\1 \5',
|
||||||
|
// note: for some very weird reason trim() seems to remove spaces inside attributes.
|
||||||
|
// maybe a \0 byte or something is interfering?
|
||||||
|
'#^\s+<#Ss' => '<', '#>\s+$#Ss' => '>',);
|
||||||
|
|
||||||
|
$source = preg_replace(array_keys($expressions), array_values($expressions), $source);
|
||||||
|
// note: for some very weird reason trim() seems to remove spaces inside attributes.
|
||||||
|
// maybe a \0 byte or something is interfering?
|
||||||
|
// $source = trim( $source );
|
||||||
|
|
||||||
|
$_offset = 0;
|
||||||
|
if (preg_match_all('#@!@SMARTY:([0-9]+):SMARTY@!@#is', $source, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) {
|
||||||
|
foreach ($matches as $match) {
|
||||||
|
$_length = strlen($match[ 0 ][ 0 ]);
|
||||||
|
$replace = $store[ $match[ 1 ][ 0 ] ];
|
||||||
|
$source = substr_replace($source, $replace, $match[ 0 ][ 1 ] + $_offset, $_length);
|
||||||
|
|
||||||
|
$_offset += strlen($replace) - $_length;
|
||||||
|
$_store ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $source;
|
||||||
|
}
|
||||||
34
misc/smarty_libs/plugins/shared.escape_special_chars.php
Normal file
34
misc/smarty_libs/plugins/shared.escape_special_chars.php
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty shared plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsShared
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* escape_special_chars common function
|
||||||
|
* 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)) {
|
||||||
|
if (version_compare(PHP_VERSION, '5.2.3', '>=')) {
|
||||||
|
$string = htmlspecialchars($string, ENT_COMPAT, Smarty::$_CHARSET, false);
|
||||||
|
} else {
|
||||||
|
$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;
|
||||||
|
}
|
||||||
36
misc/smarty_libs/plugins/shared.literal_compiler_param.php
Normal file
36
misc/smarty_libs/plugins/shared.literal_compiler_param.php
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsShared
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* evaluate compiler parameter
|
||||||
|
*
|
||||||
|
* @param array $params parameter array as given to the compiler function
|
||||||
|
* @param integer $index array index of the parameter to convert
|
||||||
|
* @param mixed $default value to be returned if the parameter is not present
|
||||||
|
*
|
||||||
|
* @return mixed evaluated value of parameter or $default
|
||||||
|
* @throws SmartyException if parameter is not a literal (but an expression, variable, …)
|
||||||
|
* @author Rodney Rehm
|
||||||
|
*/
|
||||||
|
function smarty_literal_compiler_param($params, $index, $default = null)
|
||||||
|
{
|
||||||
|
// not set, go default
|
||||||
|
if (!isset($params[ $index ])) {
|
||||||
|
return $default;
|
||||||
|
}
|
||||||
|
// test if param is a literal
|
||||||
|
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');
|
||||||
|
}
|
||||||
|
|
||||||
|
$t = null;
|
||||||
|
eval("\$t = " . $params[ $index ] . ";");
|
||||||
|
|
||||||
|
return $t;
|
||||||
|
}
|
||||||
45
misc/smarty_libs/plugins/shared.make_timestamp.php
Normal file
45
misc/smarty_libs/plugins/shared.make_timestamp.php
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty shared plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsShared
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function: smarty_make_timestamp<br>
|
||||||
|
* Purpose: used by other smarty functions to make a timestamp from a string.
|
||||||
|
*
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
*
|
||||||
|
* @param DateTime|int|string $string date object, timestamp or string that can be converted using strtotime()
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
function smarty_make_timestamp($string)
|
||||||
|
{
|
||||||
|
if (empty($string)) {
|
||||||
|
// use "now":
|
||||||
|
return time();
|
||||||
|
} elseif ($string instanceof DateTime ||
|
||||||
|
(interface_exists('DateTimeInterface', false) && $string instanceof DateTimeInterface)
|
||||||
|
) {
|
||||||
|
return (int) $string->format('U'); // PHP 5.2 BC
|
||||||
|
} elseif (strlen($string) == 14 && ctype_digit($string)) {
|
||||||
|
// it is mysql timestamp format of YYYYMMDDHHMMSS?
|
||||||
|
return mktime(substr($string, 8, 2), substr($string, 10, 2), substr($string, 12, 2), substr($string, 4, 2),
|
||||||
|
substr($string, 6, 2), substr($string, 0, 4));
|
||||||
|
} elseif (is_numeric($string)) {
|
||||||
|
// 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
55
misc/smarty_libs/plugins/shared.mb_str_replace.php
Normal file
55
misc/smarty_libs/plugins/shared.mb_str_replace.php
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty shared plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsShared
|
||||||
|
*/
|
||||||
|
if (!function_exists('smarty_mb_str_replace')) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Multibyte string replace
|
||||||
|
*
|
||||||
|
* @param string $search the string to be searched
|
||||||
|
* @param string $replace the replacement string
|
||||||
|
* @param string $subject the source string
|
||||||
|
* @param int &$count number of matches found
|
||||||
|
*
|
||||||
|
* @return string replaced string
|
||||||
|
* @author Rodney Rehm
|
||||||
|
*/
|
||||||
|
function smarty_mb_str_replace($search, $replace, $subject, &$count = 0)
|
||||||
|
{
|
||||||
|
if (!is_array($search) && is_array($replace)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (is_array($subject)) {
|
||||||
|
// call mb_replace for each single string in $subject
|
||||||
|
foreach ($subject as &$string) {
|
||||||
|
$string = smarty_mb_str_replace($search, $replace, $string, $c);
|
||||||
|
$count += $c;
|
||||||
|
}
|
||||||
|
} elseif (is_array($search)) {
|
||||||
|
if (!is_array($replace)) {
|
||||||
|
foreach ($search as &$string) {
|
||||||
|
$subject = smarty_mb_str_replace($string, $replace, $subject, $c);
|
||||||
|
$count += $c;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$n = max(count($search), count($replace));
|
||||||
|
while ($n --) {
|
||||||
|
$subject = smarty_mb_str_replace(current($search), current($replace), $subject, $c);
|
||||||
|
$count += $c;
|
||||||
|
next($search);
|
||||||
|
next($replace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$parts = mb_split(preg_quote($search), $subject);
|
||||||
|
$count = count($parts) - 1;
|
||||||
|
$subject = implode($replace, $parts);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $subject;
|
||||||
|
}
|
||||||
|
}
|
||||||
54
misc/smarty_libs/plugins/shared.mb_unicode.php
Normal file
54
misc/smarty_libs/plugins/shared.mb_unicode.php
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty shared plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsShared
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* convert characters to their decimal unicode equivalents
|
||||||
|
*
|
||||||
|
* @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 $encoding encoding of $string, if null mb_internal_encoding() is used
|
||||||
|
*
|
||||||
|
* @return array sequence of unicodes
|
||||||
|
* @author Rodney Rehm
|
||||||
|
*/
|
||||||
|
function smarty_mb_to_unicode($string, $encoding = null)
|
||||||
|
{
|
||||||
|
if ($encoding) {
|
||||||
|
$expanded = mb_convert_encoding($string, "UTF-32BE", $encoding);
|
||||||
|
} else {
|
||||||
|
$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
|
||||||
|
*
|
||||||
|
* @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
|
||||||
|
*
|
||||||
|
* @return string unicode as character sequence in given $encoding
|
||||||
|
* @author Rodney Rehm
|
||||||
|
*/
|
||||||
|
function smarty_mb_from_unicode($unicode, $encoding = null)
|
||||||
|
{
|
||||||
|
$t = '';
|
||||||
|
if (!$encoding) {
|
||||||
|
$encoding = mb_internal_encoding();
|
||||||
|
}
|
||||||
|
foreach ((array) $unicode as $utf32be) {
|
||||||
|
$character = pack("N*", $utf32be);
|
||||||
|
$t .= mb_convert_encoding($character, $encoding, "UTF-32BE");
|
||||||
|
}
|
||||||
|
|
||||||
|
return $t;
|
||||||
|
}
|
||||||
75
misc/smarty_libs/plugins/shared.mb_wordwrap.php
Normal file
75
misc/smarty_libs/plugins/shared.mb_wordwrap.php
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
<?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;
|
||||||
|
$_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
|
||||||
|
$_previous = 0;
|
||||||
|
$length = 0;
|
||||||
|
}
|
||||||
|
$_previous = $_space;
|
||||||
|
// add the token
|
||||||
|
$t .= $token;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $t;
|
||||||
|
}
|
||||||
|
}
|
||||||
19
misc/smarty_libs/plugins/variablefilter.htmlspecialchars.php
Normal file
19
misc/smarty_libs/plugins/variablefilter.htmlspecialchars.php
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsFilter
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty htmlspecialchars variablefilter plugin
|
||||||
|
*
|
||||||
|
* @param string $source input string
|
||||||
|
*
|
||||||
|
* @return string filtered output
|
||||||
|
*/
|
||||||
|
function smarty_variablefilter_htmlspecialchars($source)
|
||||||
|
{
|
||||||
|
return htmlspecialchars($source, ENT_QUOTES, Smarty::$_CHARSET);
|
||||||
|
}
|
||||||
220
misc/smarty_libs/sysplugins/smarty_cacheresource.php
Normal file
220
misc/smarty_libs/sysplugins/smarty_cacheresource.php
Normal file
@@ -0,0 +1,220 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty Internal Plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage Cacher
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cache Handler API
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage Cacher
|
||||||
|
* @author Rodney Rehm
|
||||||
|
*/
|
||||||
|
abstract class Smarty_CacheResource
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* resource types provided by the core
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected static $sysplugins = array('file' => 'smarty_internal_cacheresource_file.php',);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* populate Cached Object with meta data from Resource
|
||||||
|
*
|
||||||
|
* @param Smarty_Template_Cached $cached cached object
|
||||||
|
* @param Smarty_Internal_Template $_template template object
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
abstract public function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* populate Cached Object with timestamp and exists from Resource
|
||||||
|
*
|
||||||
|
* @param Smarty_Template_Cached $cached
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
abstract public function populateTimestamp(Smarty_Template_Cached $cached);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read the cached template and process header
|
||||||
|
*
|
||||||
|
* @param Smarty_Internal_Template $_template template object
|
||||||
|
* @param Smarty_Template_Cached $cached cached object
|
||||||
|
* @param boolean $update flag if called because cache update
|
||||||
|
*
|
||||||
|
* @return boolean true or false if the cached content does not exist
|
||||||
|
*/
|
||||||
|
abstract public function process(Smarty_Internal_Template $_template, Smarty_Template_Cached $cached = null,
|
||||||
|
$update = false);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write the rendered template output to cache
|
||||||
|
*
|
||||||
|
* @param Smarty_Internal_Template $_template template object
|
||||||
|
* @param string $content content to cache
|
||||||
|
*
|
||||||
|
* @return boolean success
|
||||||
|
*/
|
||||||
|
abstract public function writeCachedContent(Smarty_Internal_Template $_template, $content);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read cached template from cache
|
||||||
|
*
|
||||||
|
* @param Smarty_Internal_Template $_template template object
|
||||||
|
*
|
||||||
|
* @return string content
|
||||||
|
*/
|
||||||
|
abstract function readCachedContent(Smarty_Internal_Template $_template);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return cached content
|
||||||
|
*
|
||||||
|
* @param Smarty_Internal_Template $_template template object
|
||||||
|
*
|
||||||
|
* @return null|string
|
||||||
|
*/
|
||||||
|
public function getCachedContent(Smarty_Internal_Template $_template)
|
||||||
|
{
|
||||||
|
if ($_template->cached->handler->process($_template)) {
|
||||||
|
ob_start();
|
||||||
|
$unifunc = $_template->cached->unifunc;
|
||||||
|
$unifunc($_template);
|
||||||
|
return ob_get_clean();
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Empty cache
|
||||||
|
*
|
||||||
|
* @param Smarty $smarty Smarty object
|
||||||
|
* @param integer $exp_time expiration time (number of seconds, not timestamp)
|
||||||
|
*
|
||||||
|
* @return integer number of cache files deleted
|
||||||
|
*/
|
||||||
|
abstract public function clearAll(Smarty $smarty, $exp_time = null);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Empty cache for a specific template
|
||||||
|
*
|
||||||
|
* @param Smarty $smarty Smarty object
|
||||||
|
* @param string $resource_name template name
|
||||||
|
* @param string $cache_id cache id
|
||||||
|
* @param string $compile_id compile id
|
||||||
|
* @param integer $exp_time expiration time (number of seconds, not timestamp)
|
||||||
|
*
|
||||||
|
* @return integer number of cache files deleted
|
||||||
|
*/
|
||||||
|
abstract public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Smarty $smarty
|
||||||
|
* @param Smarty_Template_Cached $cached
|
||||||
|
*
|
||||||
|
* @return bool|null
|
||||||
|
*/
|
||||||
|
public function locked(Smarty $smarty, Smarty_Template_Cached $cached)
|
||||||
|
{
|
||||||
|
// theoretically locking_timeout should be checked against time_limit (max_execution_time)
|
||||||
|
$start = microtime(true);
|
||||||
|
$hadLock = null;
|
||||||
|
while ($this->hasLock($smarty, $cached)) {
|
||||||
|
$hadLock = true;
|
||||||
|
if (microtime(true) - $start > $smarty->locking_timeout) {
|
||||||
|
// abort waiting for lock release
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $hadLock;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check is cache is locked for this template
|
||||||
|
*
|
||||||
|
* @param Smarty $smarty
|
||||||
|
* @param Smarty_Template_Cached $cached
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function hasLock(Smarty $smarty, Smarty_Template_Cached $cached)
|
||||||
|
{
|
||||||
|
// check if lock exists
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lock cache for this template
|
||||||
|
*
|
||||||
|
* @param Smarty $smarty
|
||||||
|
* @param Smarty_Template_Cached $cached
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached)
|
||||||
|
{
|
||||||
|
// create lock
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unlock cache for this template
|
||||||
|
*
|
||||||
|
* @param Smarty $smarty
|
||||||
|
* @param Smarty_Template_Cached $cached
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function releaseLock(Smarty $smarty, Smarty_Template_Cached $cached)
|
||||||
|
{
|
||||||
|
// release lock
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load Cache Resource Handler
|
||||||
|
*
|
||||||
|
* @param Smarty $smarty Smarty object
|
||||||
|
* @param string $type name of the cache resource
|
||||||
|
*
|
||||||
|
* @throws SmartyException
|
||||||
|
* @return Smarty_CacheResource Cache Resource Handler
|
||||||
|
*/
|
||||||
|
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 ])) {
|
||||||
|
return $smarty->_cache[ 'cacheresource_handlers' ][ $type ];
|
||||||
|
}
|
||||||
|
|
||||||
|
// try registered resource
|
||||||
|
if (isset($smarty->registered_cache_resources[ $type ])) {
|
||||||
|
// do not cache these instances as they may vary from instance to instance
|
||||||
|
return $smarty->_cache[ 'cacheresource_handlers' ][ $type ] = $smarty->registered_cache_resources[ $type ];
|
||||||
|
}
|
||||||
|
// try sysplugins dir
|
||||||
|
if (isset(self::$sysplugins[ $type ])) {
|
||||||
|
$cache_resource_class = 'Smarty_Internal_CacheResource_' . ucfirst($type);
|
||||||
|
return $smarty->_cache[ 'cacheresource_handlers' ][ $type ] = new $cache_resource_class();
|
||||||
|
}
|
||||||
|
// try plugins dir
|
||||||
|
$cache_resource_class = 'Smarty_CacheResource_' . ucfirst($type);
|
||||||
|
if ($smarty->loadPlugin($cache_resource_class)) {
|
||||||
|
return $smarty->_cache[ 'cacheresource_handlers' ][ $type ] = new $cache_resource_class();
|
||||||
|
}
|
||||||
|
// give up
|
||||||
|
throw new SmartyException("Unable to load cache resource '{$type}'");
|
||||||
|
}
|
||||||
|
}
|
||||||
275
misc/smarty_libs/sysplugins/smarty_cacheresource_custom.php
Normal file
275
misc/smarty_libs/sysplugins/smarty_cacheresource_custom.php
Normal file
@@ -0,0 +1,275 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty Internal Plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage Cacher
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cache Handler API
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage Cacher
|
||||||
|
* @author Rodney Rehm
|
||||||
|
*/
|
||||||
|
abstract class Smarty_CacheResource_Custom extends Smarty_CacheResource
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* fetch cached content and its modification time from data source
|
||||||
|
*
|
||||||
|
* @param string $id unique cache content identifier
|
||||||
|
* @param string $name template name
|
||||||
|
* @param string $cache_id cache id
|
||||||
|
* @param string $compile_id compile id
|
||||||
|
* @param string $content cached content
|
||||||
|
* @param integer $mtime cache modification timestamp (epoch)
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
abstract protected function fetch($id, $name, $cache_id, $compile_id, &$content, &$mtime);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch cached content's modification timestamp from data source
|
||||||
|
* {@internal implementing this method is optional.
|
||||||
|
* Only implement it if modification times can be accessed faster than loading the complete cached content.}}
|
||||||
|
*
|
||||||
|
* @param string $id unique cache content identifier
|
||||||
|
* @param string $name template name
|
||||||
|
* @param string $cache_id cache id
|
||||||
|
* @param string $compile_id compile id
|
||||||
|
*
|
||||||
|
* @return integer|boolean timestamp (epoch) the template was modified, or false if not found
|
||||||
|
*/
|
||||||
|
protected function fetchTimestamp($id, $name, $cache_id, $compile_id)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save content to cache
|
||||||
|
*
|
||||||
|
* @param string $id unique cache content identifier
|
||||||
|
* @param string $name template name
|
||||||
|
* @param string $cache_id cache id
|
||||||
|
* @param string $compile_id compile id
|
||||||
|
* @param integer|null $exp_time seconds till expiration or null
|
||||||
|
* @param string $content content to cache
|
||||||
|
*
|
||||||
|
* @return boolean success
|
||||||
|
*/
|
||||||
|
abstract protected function save($id, $name, $cache_id, $compile_id, $exp_time, $content);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete content from cache
|
||||||
|
*
|
||||||
|
* @param string|null $name template name
|
||||||
|
* @param string|null $cache_id cache id
|
||||||
|
* @param string|null $compile_id compile id
|
||||||
|
* @param integer|null $exp_time seconds till expiration time in seconds or null
|
||||||
|
*
|
||||||
|
* @return integer number of deleted caches
|
||||||
|
*/
|
||||||
|
abstract protected function delete($name, $cache_id, $compile_id, $exp_time);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* populate Cached Object with meta data from Resource
|
||||||
|
*
|
||||||
|
* @param Smarty_Template_Cached $cached cached object
|
||||||
|
* @param Smarty_Internal_Template $_template template object
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template)
|
||||||
|
{
|
||||||
|
$_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);
|
||||||
|
if ($_template->smarty->cache_locking) {
|
||||||
|
$cached->lock_id = sha1('lock.' . $path);
|
||||||
|
}
|
||||||
|
$this->populateTimestamp($cached);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* populate Cached Object with timestamp and exists from Resource
|
||||||
|
*
|
||||||
|
* @param Smarty_Template_Cached $cached
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function populateTimestamp(Smarty_Template_Cached $cached)
|
||||||
|
{
|
||||||
|
$mtime =
|
||||||
|
$this->fetchTimestamp($cached->filepath, $cached->source->name, $cached->cache_id, $cached->compile_id);
|
||||||
|
if ($mtime !== null) {
|
||||||
|
$cached->timestamp = $mtime;
|
||||||
|
$cached->exists = !!$cached->timestamp;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$timestamp = null;
|
||||||
|
$this->fetch($cached->filepath, $cached->source->name, $cached->cache_id, $cached->compile_id, $cached->content,
|
||||||
|
$timestamp);
|
||||||
|
$cached->timestamp = isset($timestamp) ? $timestamp : false;
|
||||||
|
$cached->exists = !!$cached->timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read the cached template and process the header
|
||||||
|
*
|
||||||
|
* @param \Smarty_Internal_Template $_smarty_tpl do not change variable name, is used by compiled template
|
||||||
|
* @param Smarty_Template_Cached $cached cached object
|
||||||
|
* @param boolean $update flag if called because cache update
|
||||||
|
*
|
||||||
|
* @return boolean true or false if the cached content does not exist
|
||||||
|
*/
|
||||||
|
public function process(Smarty_Internal_Template $_smarty_tpl, Smarty_Template_Cached $cached = null,
|
||||||
|
$update = false)
|
||||||
|
{
|
||||||
|
if (!$cached) {
|
||||||
|
$cached = $_smarty_tpl->cached;
|
||||||
|
}
|
||||||
|
$content = $cached->content ? $cached->content : null;
|
||||||
|
$timestamp = $cached->timestamp ? $cached->timestamp : null;
|
||||||
|
if ($content === null || !$timestamp) {
|
||||||
|
$this->fetch($_smarty_tpl->cached->filepath, $_smarty_tpl->source->name, $_smarty_tpl->cache_id,
|
||||||
|
$_smarty_tpl->compile_id, $content, $timestamp);
|
||||||
|
}
|
||||||
|
if (isset($content)) {
|
||||||
|
eval("?>" . $content);
|
||||||
|
$cached->content = null;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write the rendered template output to cache
|
||||||
|
*
|
||||||
|
* @param Smarty_Internal_Template $_template template object
|
||||||
|
* @param string $content content to cache
|
||||||
|
*
|
||||||
|
* @return boolean success
|
||||||
|
*/
|
||||||
|
public function writeCachedContent(Smarty_Internal_Template $_template, $content)
|
||||||
|
{
|
||||||
|
return $this->save($_template->cached->filepath, $_template->source->name, $_template->cache_id,
|
||||||
|
$_template->compile_id, $_template->cache_lifetime, $content);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read cached template from cache
|
||||||
|
*
|
||||||
|
* @param Smarty_Internal_Template $_template template object
|
||||||
|
*
|
||||||
|
* @return string|boolean content
|
||||||
|
*/
|
||||||
|
public function readCachedContent(Smarty_Internal_Template $_template)
|
||||||
|
{
|
||||||
|
$content = $_template->cached->content ? $_template->cached->content : null;
|
||||||
|
$timestamp = null;
|
||||||
|
if ($content === null) {
|
||||||
|
$timestamp = null;
|
||||||
|
$this->fetch($_template->cached->filepath, $_template->source->name, $_template->cache_id,
|
||||||
|
$_template->compile_id, $content, $timestamp);
|
||||||
|
}
|
||||||
|
if (isset($content)) {
|
||||||
|
return $content;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Empty cache
|
||||||
|
*
|
||||||
|
* @param Smarty $smarty Smarty object
|
||||||
|
* @param integer $exp_time expiration time (number of seconds, not timestamp)
|
||||||
|
*
|
||||||
|
* @return integer number of cache files deleted
|
||||||
|
*/
|
||||||
|
public function clearAll(Smarty $smarty, $exp_time = null)
|
||||||
|
{
|
||||||
|
return $this->delete(null, null, null, $exp_time);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Empty cache for a specific template
|
||||||
|
*
|
||||||
|
* @param Smarty $smarty Smarty object
|
||||||
|
* @param string $resource_name template name
|
||||||
|
* @param string $cache_id cache id
|
||||||
|
* @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)
|
||||||
|
{
|
||||||
|
$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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,507 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty Internal Plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage Cacher
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty Cache Handler Base for Key/Value Storage Implementations
|
||||||
|
* This class implements the functionality required to use simple key/value stores
|
||||||
|
* for hierarchical cache groups. key/value stores like memcache or APC do not support
|
||||||
|
* wildcards in keys, therefore a cache group cannot be cleared like "a|*" - which
|
||||||
|
* is no problem to filesystem and RDBMS implementations.
|
||||||
|
* This implementation is based on the concept of invalidation. While one specific cache
|
||||||
|
* can be identified and cleared, any range of caches cannot be identified. For this reason
|
||||||
|
* each level of the cache group hierarchy can have its own value in the store. These values
|
||||||
|
* are nothing but microtimes, telling us when a particular cache group was cleared for the
|
||||||
|
* last time. These keys are evaluated for every cache read to determine if the cache has
|
||||||
|
* been invalidated since it was created and should hence be treated as inexistent.
|
||||||
|
* Although deep hierarchies are possible, they are not recommended. Try to keep your
|
||||||
|
* cache groups as shallow as possible. Anything up 3-5 parents should be ok. So
|
||||||
|
* »a|b|c« is a good depth where »a|b|c|d|e|f|g|h|i|j|k« isn't. Try to join correlating
|
||||||
|
* cache groups: if your cache groups look somewhat like »a|b|$page|$items|$whatever«
|
||||||
|
* consider using »a|b|c|$page-$items-$whatever« instead.
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage Cacher
|
||||||
|
* @author Rodney Rehm
|
||||||
|
*/
|
||||||
|
abstract class Smarty_CacheResource_KeyValueStore extends Smarty_CacheResource
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* cache for contents
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $contents = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cache for timestamps
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $timestamps = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* populate Cached Object with meta data from Resource
|
||||||
|
*
|
||||||
|
* @param Smarty_Template_Cached $cached cached object
|
||||||
|
* @param Smarty_Internal_Template $_template template object
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template)
|
||||||
|
{
|
||||||
|
$cached->filepath = $_template->source->uid . '#' . $this->sanitize($cached->source->resource) . '#' .
|
||||||
|
$this->sanitize($cached->cache_id) . '#' . $this->sanitize($cached->compile_id);
|
||||||
|
|
||||||
|
$this->populateTimestamp($cached);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* populate Cached Object with timestamp and exists from Resource
|
||||||
|
*
|
||||||
|
* @param Smarty_Template_Cached $cached cached object
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function populateTimestamp(Smarty_Template_Cached $cached)
|
||||||
|
{
|
||||||
|
if (!$this->fetch($cached->filepath, $cached->source->name, $cached->cache_id, $cached->compile_id, $content,
|
||||||
|
$timestamp, $cached->source->uid)
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$cached->content = $content;
|
||||||
|
$cached->timestamp = (int) $timestamp;
|
||||||
|
$cached->exists = !!$cached->timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read the cached template and process the header
|
||||||
|
*
|
||||||
|
* @param \Smarty_Internal_Template $_smarty_tpl do not change variable name, is used by compiled template
|
||||||
|
* @param Smarty_Template_Cached $cached cached object
|
||||||
|
* @param boolean $update flag if called because cache update
|
||||||
|
*
|
||||||
|
* @return boolean true or false if the cached content does not exist
|
||||||
|
*/
|
||||||
|
public function process(Smarty_Internal_Template $_smarty_tpl, Smarty_Template_Cached $cached = null,
|
||||||
|
$update = false)
|
||||||
|
{
|
||||||
|
if (!$cached) {
|
||||||
|
$cached = $_smarty_tpl->cached;
|
||||||
|
}
|
||||||
|
$content = $cached->content ? $cached->content : null;
|
||||||
|
$timestamp = $cached->timestamp ? $cached->timestamp : null;
|
||||||
|
if ($content === null || !$timestamp) {
|
||||||
|
if (!$this->fetch($_smarty_tpl->cached->filepath, $_smarty_tpl->source->name, $_smarty_tpl->cache_id,
|
||||||
|
$_smarty_tpl->compile_id, $content, $timestamp, $_smarty_tpl->source->uid)
|
||||||
|
) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isset($content)) {
|
||||||
|
eval("?>" . $content);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write the rendered template output to cache
|
||||||
|
*
|
||||||
|
* @param Smarty_Internal_Template $_template template object
|
||||||
|
* @param string $content content to cache
|
||||||
|
*
|
||||||
|
* @return boolean success
|
||||||
|
*/
|
||||||
|
public function writeCachedContent(Smarty_Internal_Template $_template, $content)
|
||||||
|
{
|
||||||
|
$this->addMetaTimestamp($content);
|
||||||
|
|
||||||
|
return $this->write(array($_template->cached->filepath => $content), $_template->cache_lifetime);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read cached template from cache
|
||||||
|
*
|
||||||
|
* @param Smarty_Internal_Template $_template template object
|
||||||
|
*
|
||||||
|
* @return string|false content
|
||||||
|
*/
|
||||||
|
public function readCachedContent(Smarty_Internal_Template $_template)
|
||||||
|
{
|
||||||
|
$content = $_template->cached->content ? $_template->cached->content : null;
|
||||||
|
$timestamp = null;
|
||||||
|
if ($content === null) {
|
||||||
|
if (!$this->fetch($_template->cached->filepath, $_template->source->name, $_template->cache_id,
|
||||||
|
$_template->compile_id, $content, $timestamp, $_template->source->uid)
|
||||||
|
) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isset($content)) {
|
||||||
|
return $content;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Empty cache
|
||||||
|
* {@internal the $exp_time argument is ignored altogether }}
|
||||||
|
*
|
||||||
|
* @param Smarty $smarty Smarty object
|
||||||
|
* @param integer $exp_time expiration time [being ignored]
|
||||||
|
*
|
||||||
|
* @return integer number of cache files deleted [always -1]
|
||||||
|
* @uses purge() to clear the whole store
|
||||||
|
* @uses invalidate() to mark everything outdated if purge() is inapplicable
|
||||||
|
*/
|
||||||
|
public function clearAll(Smarty $smarty, $exp_time = null)
|
||||||
|
{
|
||||||
|
if (!$this->purge()) {
|
||||||
|
$this->invalidate(null);
|
||||||
|
}
|
||||||
|
return - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Empty cache for a specific template
|
||||||
|
* {@internal the $exp_time argument is ignored altogether}}
|
||||||
|
*
|
||||||
|
* @param Smarty $smarty Smarty object
|
||||||
|
* @param string $resource_name template name
|
||||||
|
* @param string $cache_id cache id
|
||||||
|
* @param string $compile_id compile id
|
||||||
|
* @param integer $exp_time expiration time [being ignored]
|
||||||
|
*
|
||||||
|
* @return integer number of cache files deleted [always -1]
|
||||||
|
* @uses buildCachedFilepath() to generate the CacheID
|
||||||
|
* @uses invalidate() to mark CacheIDs parent chain as outdated
|
||||||
|
* @uses delete() to remove CacheID from cache
|
||||||
|
*/
|
||||||
|
public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time)
|
||||||
|
{
|
||||||
|
$uid = $this->getTemplateUid($smarty, $resource_name);
|
||||||
|
$cid = $uid . '#' . $this->sanitize($resource_name) . '#' . $this->sanitize($cache_id) . '#' .
|
||||||
|
$this->sanitize($compile_id);
|
||||||
|
$this->delete(array($cid));
|
||||||
|
$this->invalidate($cid, $resource_name, $cache_id, $compile_id, $uid);
|
||||||
|
return - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get template's unique ID
|
||||||
|
*
|
||||||
|
* @param Smarty $smarty Smarty object
|
||||||
|
* @param string $resource_name template name
|
||||||
|
*
|
||||||
|
* @return string filepath of cache file
|
||||||
|
* @throws \SmartyException
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
protected function getTemplateUid(Smarty $smarty, $resource_name)
|
||||||
|
{
|
||||||
|
if (isset($resource_name)) {
|
||||||
|
$source = Smarty_Template_Source::load(null, $smarty, $resource_name);
|
||||||
|
if ($source->exists) {
|
||||||
|
return $source->uid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sanitize CacheID components
|
||||||
|
*
|
||||||
|
* @param string $string CacheID component to sanitize
|
||||||
|
*
|
||||||
|
* @return string sanitized CacheID component
|
||||||
|
*/
|
||||||
|
protected function sanitize($string)
|
||||||
|
{
|
||||||
|
$string = trim($string, '|');
|
||||||
|
if (!$string) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
return preg_replace('#[^\w\|]+#S', '_', $string);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch and prepare a cache object.
|
||||||
|
*
|
||||||
|
* @param string $cid CacheID to fetch
|
||||||
|
* @param string $resource_name template name
|
||||||
|
* @param string $cache_id cache id
|
||||||
|
* @param string $compile_id compile id
|
||||||
|
* @param string $content cached content
|
||||||
|
* @param integer &$timestamp cached timestamp (epoch)
|
||||||
|
* @param string $resource_uid resource's uid
|
||||||
|
*
|
||||||
|
* @return boolean success
|
||||||
|
*/
|
||||||
|
protected function fetch($cid, $resource_name = null, $cache_id = null, $compile_id = null, &$content = null,
|
||||||
|
&$timestamp = null, $resource_uid = null)
|
||||||
|
{
|
||||||
|
$t = $this->read(array($cid));
|
||||||
|
$content = !empty($t[ $cid ]) ? $t[ $cid ] : null;
|
||||||
|
$timestamp = null;
|
||||||
|
|
||||||
|
if ($content && ($timestamp = $this->getMetaTimestamp($content))) {
|
||||||
|
$invalidated =
|
||||||
|
$this->getLatestInvalidationTimestamp($cid, $resource_name, $cache_id, $compile_id, $resource_uid);
|
||||||
|
if ($invalidated > $timestamp) {
|
||||||
|
$timestamp = null;
|
||||||
|
$content = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return !!$content;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add current microtime to the beginning of $cache_content
|
||||||
|
* {@internal the header uses 8 Bytes, the first 4 Bytes are the seconds, the second 4 Bytes are the microseconds}}
|
||||||
|
*
|
||||||
|
* @param string &$content the content to be cached
|
||||||
|
*/
|
||||||
|
protected function addMetaTimestamp(&$content)
|
||||||
|
{
|
||||||
|
$mt = explode(" ", microtime());
|
||||||
|
$ts = pack("NN", $mt[ 1 ], (int) ($mt[ 0 ] * 100000000));
|
||||||
|
$content = $ts . $content;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract the timestamp the $content was cached
|
||||||
|
*
|
||||||
|
* @param string &$content the cached content
|
||||||
|
*
|
||||||
|
* @return float the microtime the content was cached
|
||||||
|
*/
|
||||||
|
protected function getMetaTimestamp(&$content)
|
||||||
|
{
|
||||||
|
extract(unpack('N1s/N1m/a*content', $content));
|
||||||
|
/**
|
||||||
|
* @var int $s
|
||||||
|
* @var int $m
|
||||||
|
*/
|
||||||
|
return $s + ($m / 100000000);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invalidate CacheID
|
||||||
|
*
|
||||||
|
* @param string $cid CacheID
|
||||||
|
* @param string $resource_name template name
|
||||||
|
* @param string $cache_id cache id
|
||||||
|
* @param string $compile_id compile id
|
||||||
|
* @param string $resource_uid source's uid
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function invalidate($cid = null, $resource_name = null, $cache_id = null, $compile_id = null,
|
||||||
|
$resource_uid = null)
|
||||||
|
{
|
||||||
|
$now = microtime(true);
|
||||||
|
$key = null;
|
||||||
|
// invalidate everything
|
||||||
|
if (!$resource_name && !$cache_id && !$compile_id) {
|
||||||
|
$key = 'IVK#ALL';
|
||||||
|
} // invalidate all caches by template
|
||||||
|
else {
|
||||||
|
if ($resource_name && !$cache_id && !$compile_id) {
|
||||||
|
$key = 'IVK#TEMPLATE#' . $resource_uid . '#' . $this->sanitize($resource_name);
|
||||||
|
} // invalidate all caches by cache group
|
||||||
|
else {
|
||||||
|
if (!$resource_name && $cache_id && !$compile_id) {
|
||||||
|
$key = 'IVK#CACHE#' . $this->sanitize($cache_id);
|
||||||
|
} // invalidate all caches by compile id
|
||||||
|
else {
|
||||||
|
if (!$resource_name && !$cache_id && $compile_id) {
|
||||||
|
$key = 'IVK#COMPILE#' . $this->sanitize($compile_id);
|
||||||
|
} // invalidate by combination
|
||||||
|
else {
|
||||||
|
$key = 'IVK#CID#' . $cid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->write(array($key => $now));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine the latest timestamp known to the invalidation chain
|
||||||
|
*
|
||||||
|
* @param string $cid CacheID to determine latest invalidation timestamp of
|
||||||
|
* @param string $resource_name template name
|
||||||
|
* @param string $cache_id cache id
|
||||||
|
* @param string $compile_id compile id
|
||||||
|
* @param string $resource_uid source's filepath
|
||||||
|
*
|
||||||
|
* @return float the microtime the CacheID was invalidated
|
||||||
|
*/
|
||||||
|
protected function getLatestInvalidationTimestamp($cid, $resource_name = null, $cache_id = null, $compile_id = null,
|
||||||
|
$resource_uid = null)
|
||||||
|
{
|
||||||
|
// abort if there is no CacheID
|
||||||
|
if (false && !$cid) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
// abort if there are no InvalidationKeys to check
|
||||||
|
if (!($_cid = $this->listInvalidationKeys($cid, $resource_name, $cache_id, $compile_id, $resource_uid))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// there are no InValidationKeys
|
||||||
|
if (!($values = $this->read($_cid))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
// make sure we're dealing with floats
|
||||||
|
$values = array_map('floatval', $values);
|
||||||
|
|
||||||
|
return max($values);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Translate a CacheID into the list of applicable InvalidationKeys.
|
||||||
|
* Splits "some|chain|into|an|array" into array( '#clearAll#', 'some', 'some|chain', 'some|chain|into', ... )
|
||||||
|
*
|
||||||
|
* @param string $cid CacheID to translate
|
||||||
|
* @param string $resource_name template name
|
||||||
|
* @param string $cache_id cache id
|
||||||
|
* @param string $compile_id compile id
|
||||||
|
* @param string $resource_uid source's filepath
|
||||||
|
*
|
||||||
|
* @return array list of InvalidationKeys
|
||||||
|
* @uses $invalidationKeyPrefix to prepend to each InvalidationKey
|
||||||
|
*/
|
||||||
|
protected function listInvalidationKeys($cid, $resource_name = null, $cache_id = null, $compile_id = null,
|
||||||
|
$resource_uid = null)
|
||||||
|
{
|
||||||
|
$t = array('IVK#ALL');
|
||||||
|
$_name = $_compile = '#';
|
||||||
|
if ($resource_name) {
|
||||||
|
$_name .= $resource_uid . '#' . $this->sanitize($resource_name);
|
||||||
|
$t[] = 'IVK#TEMPLATE' . $_name;
|
||||||
|
}
|
||||||
|
if ($compile_id) {
|
||||||
|
$_compile .= $this->sanitize($compile_id);
|
||||||
|
$t[] = 'IVK#COMPILE' . $_compile;
|
||||||
|
}
|
||||||
|
$_name .= '#';
|
||||||
|
$cid = trim($cache_id, '|');
|
||||||
|
if (!$cid) {
|
||||||
|
return $t;
|
||||||
|
}
|
||||||
|
$i = 0;
|
||||||
|
while (true) {
|
||||||
|
// determine next delimiter position
|
||||||
|
$i = strpos($cid, '|', $i);
|
||||||
|
// add complete CacheID if there are no more delimiters
|
||||||
|
if ($i === false) {
|
||||||
|
$t[] = 'IVK#CACHE#' . $cid;
|
||||||
|
$t[] = 'IVK#CID' . $_name . $cid . $_compile;
|
||||||
|
$t[] = 'IVK#CID' . $_name . $_compile;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
$part = substr($cid, 0, $i);
|
||||||
|
// add slice to list
|
||||||
|
$t[] = 'IVK#CACHE#' . $part;
|
||||||
|
$t[] = 'IVK#CID' . $_name . $part . $_compile;
|
||||||
|
// skip past delimiter position
|
||||||
|
$i ++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $t;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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)
|
||||||
|
{
|
||||||
|
$key = 'LOCK#' . $cached->filepath;
|
||||||
|
$data = $this->read(array($key));
|
||||||
|
|
||||||
|
return $data && time() - $data[ $key ] < $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;
|
||||||
|
$key = 'LOCK#' . $cached->filepath;
|
||||||
|
$this->write(array($key => time()), $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;
|
||||||
|
$key = 'LOCK#' . $cached->filepath;
|
||||||
|
$this->delete(array($key));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read values for a set of keys from cache
|
||||||
|
*
|
||||||
|
* @param array $keys list of keys to fetch
|
||||||
|
*
|
||||||
|
* @return array list of values with the given keys used as indexes
|
||||||
|
*/
|
||||||
|
abstract protected function read(array $keys);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save values for a set of keys to cache
|
||||||
|
*
|
||||||
|
* @param array $keys list of values to save
|
||||||
|
* @param int $expire expiration time
|
||||||
|
*
|
||||||
|
* @return boolean true on success, false on failure
|
||||||
|
*/
|
||||||
|
abstract protected function write(array $keys, $expire = null);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove values from cache
|
||||||
|
*
|
||||||
|
* @param array $keys list of keys to delete
|
||||||
|
*
|
||||||
|
* @return boolean true on success, false on failure
|
||||||
|
*/
|
||||||
|
abstract protected function delete(array $keys);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove *all* values from cache
|
||||||
|
*
|
||||||
|
* @return boolean true on success, false on failure
|
||||||
|
*/
|
||||||
|
protected function purge()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
68
misc/smarty_libs/sysplugins/smarty_data.php
Normal file
68
misc/smarty_libs/sysplugins/smarty_data.php
Normal 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
|
||||||
|
*/
|
||||||
|
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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
90
misc/smarty_libs/sysplugins/smarty_internal_block.php
Normal file
90
misc/smarty_libs/sysplugins/smarty_internal_block.php
Normal 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)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,220 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty Internal Plugin CacheResource File
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage Cacher
|
||||||
|
* @author Uwe Tews
|
||||||
|
* @author Rodney Rehm
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage Cacher
|
||||||
|
*/
|
||||||
|
class Smarty_Internal_CacheResource_File extends Smarty_CacheResource
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* populate Cached Object with meta data from Resource
|
||||||
|
*
|
||||||
|
* @param Smarty_Template_Cached $cached cached object
|
||||||
|
* @param Smarty_Internal_Template $_template template object
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template)
|
||||||
|
{
|
||||||
|
$source = &$_template->source;
|
||||||
|
$smarty = &$_template->smarty;
|
||||||
|
$_compile_dir_sep = $smarty->use_sub_dirs ? $smarty->ds : '^';
|
||||||
|
$_filepath = sha1($source->uid . $smarty->_joined_template_dir);
|
||||||
|
$cached->filepath = $smarty->getCacheDir();
|
||||||
|
if (isset($_template->cache_id)) {
|
||||||
|
$cached->filepath .= preg_replace(array('![^\w|]+!', '![|]+!'), array('_', $_compile_dir_sep),
|
||||||
|
$_template->cache_id) . $_compile_dir_sep;
|
||||||
|
}
|
||||||
|
if (isset($_template->compile_id)) {
|
||||||
|
$cached->filepath .= preg_replace('![^\w]+!', '_', $_template->compile_id) . $_compile_dir_sep;
|
||||||
|
}
|
||||||
|
// if use_sub_dirs, break file into directories
|
||||||
|
if ($smarty->use_sub_dirs) {
|
||||||
|
$cached->filepath .= $_filepath[ 0 ] . $_filepath[ 1 ] . $smarty->ds . $_filepath[ 2 ] . $_filepath[ 3 ] . $smarty->ds .
|
||||||
|
$_filepath[ 4 ] . $_filepath[ 5 ] . $smarty->ds;
|
||||||
|
}
|
||||||
|
$cached->filepath .= $_filepath;
|
||||||
|
$basename = $source->handler->getBasename($source);
|
||||||
|
if (!empty($basename)) {
|
||||||
|
$cached->filepath .= '.' . $basename;
|
||||||
|
}
|
||||||
|
if ($smarty->cache_locking) {
|
||||||
|
$cached->lock_id = $cached->filepath . '.lock';
|
||||||
|
}
|
||||||
|
$cached->filepath .= '.php';
|
||||||
|
$cached->timestamp = $cached->exists = is_file($cached->filepath);
|
||||||
|
if ($cached->exists) {
|
||||||
|
$cached->timestamp = filemtime($cached->filepath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* populate Cached Object with timestamp and exists from Resource
|
||||||
|
*
|
||||||
|
* @param Smarty_Template_Cached $cached cached object
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function populateTimestamp(Smarty_Template_Cached $cached)
|
||||||
|
{
|
||||||
|
$cached->timestamp = $cached->exists = is_file($cached->filepath);
|
||||||
|
if ($cached->exists) {
|
||||||
|
$cached->timestamp = filemtime($cached->filepath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read the cached template and process its header
|
||||||
|
*
|
||||||
|
* @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
|
||||||
|
*
|
||||||
|
* @return boolean true or false if the cached content does not exist
|
||||||
|
*/
|
||||||
|
public function process(Smarty_Internal_Template $_smarty_tpl, Smarty_Template_Cached $cached = null,
|
||||||
|
$update = false)
|
||||||
|
{
|
||||||
|
$_smarty_tpl->cached->valid = false;
|
||||||
|
if ($update && defined('HHVM_VERSION')) {
|
||||||
|
eval("?>" . file_get_contents($_smarty_tpl->cached->filepath));
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return @include $_smarty_tpl->cached->filepath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write the rendered template output to cache
|
||||||
|
*
|
||||||
|
* @param Smarty_Internal_Template $_template template object
|
||||||
|
* @param string $content content to cache
|
||||||
|
*
|
||||||
|
* @return boolean success
|
||||||
|
*/
|
||||||
|
public function writeCachedContent(Smarty_Internal_Template $_template, $content)
|
||||||
|
{
|
||||||
|
if ($_template->smarty->ext->_writeFile->writeFile($_template->cached->filepath, $content,
|
||||||
|
$_template->smarty) === true
|
||||||
|
) {
|
||||||
|
if (function_exists('opcache_invalidate') && strlen(ini_get("opcache.restrict_api")) < 1) {
|
||||||
|
opcache_invalidate($_template->cached->filepath, true);
|
||||||
|
} elseif (function_exists('apc_compile_file')) {
|
||||||
|
apc_compile_file($_template->cached->filepath);
|
||||||
|
}
|
||||||
|
$cached = $_template->cached;
|
||||||
|
$cached->timestamp = $cached->exists = is_file($cached->filepath);
|
||||||
|
if ($cached->exists) {
|
||||||
|
$cached->timestamp = filemtime($cached->filepath);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read cached template from cache
|
||||||
|
*
|
||||||
|
* @param Smarty_Internal_Template $_template template object
|
||||||
|
*
|
||||||
|
* @return string content
|
||||||
|
*/
|
||||||
|
public function readCachedContent(Smarty_Internal_Template $_template)
|
||||||
|
{
|
||||||
|
if (is_file($_template->cached->filepath)) {
|
||||||
|
return file_get_contents($_template->cached->filepath);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Empty cache
|
||||||
|
*
|
||||||
|
* @param Smarty $smarty
|
||||||
|
* @param integer $exp_time expiration time (number of seconds, not timestamp)
|
||||||
|
*
|
||||||
|
* @return integer number of cache files deleted
|
||||||
|
*/
|
||||||
|
public function clearAll(Smarty $smarty, $exp_time = null)
|
||||||
|
{
|
||||||
|
return $smarty->ext->_cacheResourceFile->clear($smarty, null, null, null, $exp_time);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Empty cache for a specific template
|
||||||
|
*
|
||||||
|
* @param Smarty $smarty
|
||||||
|
* @param string $resource_name template name
|
||||||
|
* @param string $cache_id cache id
|
||||||
|
* @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)
|
||||||
|
{
|
||||||
|
return $smarty->ext->_cacheResourceFile->clear($smarty, $resource_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)
|
||||||
|
{
|
||||||
|
if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
|
||||||
|
clearstatcache(true, $cached->lock_id);
|
||||||
|
} else {
|
||||||
|
clearstatcache();
|
||||||
|
}
|
||||||
|
if (is_file($cached->lock_id)) {
|
||||||
|
$t = filemtime($cached->lock_id);
|
||||||
|
return $t && (time() - $t < $smarty->locking_timeout);
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
touch($cached->lock_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
@unlink($cached->lock_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user