Compare commits
58 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dd92fa6031 | ||
|
|
6606f30ceb | ||
|
|
e1255e0872 | ||
|
|
5c53621f96 | ||
|
|
581518963b | ||
|
|
23735eba92 | ||
|
|
9eb78f40fd | ||
|
|
f599033a38 | ||
|
|
61f1b92bad | ||
|
|
1dfe246e0f | ||
|
|
d64e40ca2c | ||
|
|
6810c030e8 | ||
|
|
d7a6abd5b9 | ||
|
|
2a2221af31 | ||
|
|
03be3a317f | ||
|
|
bdcd83c579 | ||
|
|
f4f84bdd67 | ||
|
|
86535c23f1 | ||
|
|
5d146c1dfd | ||
|
|
82ca78d8b3 | ||
|
|
55f35868bd | ||
|
|
e0805c9dc6 | ||
|
|
a2129f91c5 | ||
|
|
adf46f620b | ||
|
|
31bef7a531 | ||
|
|
20b134231e | ||
|
|
236a415fb4 | ||
|
|
1551df058d | ||
|
|
f980b1e76a | ||
|
|
8de868fe4a | ||
|
|
a20df16c2c | ||
|
|
939ff2e4a5 | ||
|
|
1c3cc95fdb | ||
|
|
115e9ad700 | ||
|
|
3aaa9b3f0d | ||
|
|
799cff4e00 | ||
|
|
72ef4a24c5 | ||
|
|
0f44aaf3e4 | ||
|
|
795f69050a | ||
|
|
1c5bb8aebe | ||
|
|
36f19e64d0 | ||
|
|
19a1081197 | ||
|
|
45974a9e30 | ||
|
|
f1247efd34 | ||
|
|
c38346b97c | ||
|
|
3c26adb493 | ||
|
|
4458f366f9 | ||
|
|
805330638a | ||
|
|
86cd04f862 | ||
|
|
a182834985 | ||
|
|
0ce1432513 | ||
|
|
a447fc2ef6 | ||
|
|
8160d05d25 | ||
|
|
647dd52c92 | ||
|
|
b2fdbc0571 | ||
|
|
5a1c9f87c2 | ||
|
|
aa73634d95 | ||
|
|
b831924f58 |
@@ -1,6 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
# $Id: create_default_trigger.sh 3158 2010-09-02 02:49:00Z gullevek $
|
||||
# creates the default on update trigger for the inherited generic tables (date/name)
|
||||
|
||||
orig_file="../tmpl/trigger.tmpl"
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
# $Id: drop_data.sh 3158 2010-09-02 02:49:00Z gullevek $
|
||||
# quick hack for import
|
||||
|
||||
#echo "EXIT";
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
# $Id: drop_reload.sh 3158 2010-09-02 02:49:00Z gullevek $
|
||||
|
||||
rm error;
|
||||
rm output;
|
||||
bin/drop_data.sh;
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
# $Id: import_data.sh 4382 2013-02-18 07:27:24Z gullevek $
|
||||
# quick hack for import
|
||||
|
||||
#echo "EXIT";
|
||||
|
||||
28
4dev/database/function/edit_set_access_uid.sql
Normal file
28
4dev/database/function/edit_set_access_uid.sql
Normal file
@@ -0,0 +1,28 @@
|
||||
-- add uid add for edit_access table
|
||||
|
||||
CREATE OR REPLACE FUNCTION set_edit_access_uid() RETURNS TRIGGER AS
|
||||
$$
|
||||
DECLARE
|
||||
myrec RECORD;
|
||||
v_uid VARCHAR;
|
||||
BEGIN
|
||||
-- skip if NEW.name is not set
|
||||
IF NEW.name IS NOT NULL AND NEW.name <> '' THEN
|
||||
-- use NEW.name as base, remove all spaces
|
||||
-- name data is already unique, so we do not need to worry about this here
|
||||
v_uid := REPLACE(NEW.name, ' ', '');
|
||||
IF TG_OP = 'INSERT' THEN
|
||||
-- always set
|
||||
NEW.uid := v_uid;
|
||||
ELSIF TG_OP = 'UPDATE' THEN
|
||||
-- check if not set, then set
|
||||
SELECT INTO myrec t.* FROM edit_access t WHERE edit_access_id = NEW.edit_access_id;
|
||||
IF FOUND THEN
|
||||
NEW.uid := v_uid;
|
||||
END IF;
|
||||
END IF;
|
||||
END IF;
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$
|
||||
LANGUAGE 'plpgsql';
|
||||
12
4dev/database/function/set_generic.sql
Normal file
12
4dev/database/function/set_generic.sql
Normal file
@@ -0,0 +1,12 @@
|
||||
-- adds the created or updated date tags
|
||||
|
||||
CREATE OR REPLACE FUNCTION set_generic() RETURNS TRIGGER AS '
|
||||
BEGIN
|
||||
IF TG_OP = ''INSERT'' THEN
|
||||
NEW.date_created := ''now'';
|
||||
ELSIF TG_OP = ''UPDATE'' THEN
|
||||
NEW.date_updated := ''now'';
|
||||
END IF;
|
||||
RETURN NEW;
|
||||
END;
|
||||
' LANGUAGE 'plpgsql';
|
||||
@@ -1,4 +1,3 @@
|
||||
-- $Id: update_function.sql 3158 2010-09-02 02:49:00Z gullevek $
|
||||
-- adds the created or updated date tags
|
||||
|
||||
CREATE OR REPLACE FUNCTION set_generic() RETURNS TRIGGER AS '
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
-- $Id: edit_access.sql 4382 2013-02-18 07:27:24Z gullevek $
|
||||
-- AUTHOR: Clemens Schwaighofer
|
||||
-- DATE: 2005/07/05
|
||||
-- DESCRIPTION:
|
||||
|
||||
16
4dev/database/table/edit_access_data.sql
Normal file
16
4dev/database/table/edit_access_data.sql
Normal file
@@ -0,0 +1,16 @@
|
||||
-- AUTHOR: Clemens Schwaighofer
|
||||
-- DATE: 2016/7/15
|
||||
-- DESCRIPTION:
|
||||
-- sub table to edit access, holds additional data for access group
|
||||
-- TABLE: edit_access_data
|
||||
-- HISTORY:
|
||||
|
||||
-- DROP TABLE edit_access_data;
|
||||
CREATE TABLE edit_access_data (
|
||||
edit_access_data_id SERIAL PRIMARY KEY,
|
||||
edit_access_id INT NOT NULL,
|
||||
name VARCHAR,
|
||||
value VARCHAR,
|
||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||
FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
|
||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||
@@ -1,4 +1,3 @@
|
||||
-- $Id: edit_access_right.sql 4382 2013-02-18 07:27:24Z gullevek $
|
||||
-- AUTHOR: Clemens Schwaighofer
|
||||
-- DATE: 2005/07/05
|
||||
-- DESCRIPTION:
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
-- $Id: edit_access_user.sql 3158 2010-09-02 02:49:00Z gullevek $
|
||||
-- AUTHOR: Clemens Schwaighofer
|
||||
-- DATE: 2005/07/05
|
||||
-- DESCRIPTION:
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
-- $Id: edit_generic.sql 3158 2010-09-02 02:49:00Z gullevek $
|
||||
-- AUTHOR: Clemens Schwaighofer
|
||||
-- DATE: 2005/07/05
|
||||
-- DESCRIPTION:
|
||||
@@ -10,7 +9,5 @@
|
||||
CREATE TABLE edit_generic (
|
||||
eg_status INT,
|
||||
date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT clock_timestamp(),
|
||||
date_updated TIMESTAMP WITHOUT TIME ZONE,
|
||||
user_created VARCHAR(25) DEFAULT CURRENT_USER,
|
||||
user_updated VARCHAR(25)
|
||||
date_updated TIMESTAMP WITHOUT TIME ZONE
|
||||
);
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
-- $Id: edit_group.sql 3158 2010-09-02 02:49:00Z gullevek $
|
||||
-- AUTHOR: Clemens Schwaighofer
|
||||
-- DATE: 2005/07/05
|
||||
-- DESCRIPTION:
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
-- $Id: edit_language.sql 3158 2010-09-02 02:49:00Z gullevek $
|
||||
-- AUTHOR: Clemens Schwaighofer
|
||||
-- DATE: 2005/07/05
|
||||
-- DESCRIPTION:
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
-- $Id: edit_log.sql 4382 2013-02-18 07:27:24Z gullevek $
|
||||
-- AUTHOR: Clemens Schwaighofer
|
||||
-- DATE: 2005/07/05
|
||||
-- DESCRIPTION:
|
||||
@@ -11,7 +10,7 @@ CREATE TABLE edit_log (
|
||||
edit_log_id SERIAL PRIMARY KEY,
|
||||
username VARCHAR,
|
||||
password VARCHAR,
|
||||
event_date TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||
event_date TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||
ip VARCHAR,
|
||||
error TEXT,
|
||||
event TEXT,
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
-- $Id: edit_menu_group.sql 4382 2013-02-18 07:27:24Z gullevek $
|
||||
-- AUTHOR: Clemens Schwaighofer
|
||||
-- DATE: 2005/07/05
|
||||
-- DESCRIPTION:
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
-- $Id: edit_page.sql 4382 2013-02-18 07:27:24Z gullevek $
|
||||
-- AUTHOR: Clemens Schwaighofer
|
||||
-- DATE: 2005/07/05
|
||||
-- DESCRIPTION:
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
-- $Id: edit_page_access.sql 4382 2013-02-18 07:27:24Z gullevek $
|
||||
-- AUTHOR: Clemens Schwaighofer
|
||||
-- DATE: 2005/07/05
|
||||
-- DESCRIPTION:
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
-- $Id: edit_page_menu_group.sql 3158 2010-09-02 02:49:00Z gullevek $
|
||||
-- AUTHOR: Clemens Schwaighofer
|
||||
-- DATE: 2005/07/05
|
||||
-- DESCRIPTION:
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
-- $Id: edit_page_visible_group.sql 3158 2010-09-02 02:49:00Z gullevek $
|
||||
-- AUTHOR: Clemens Schwaighofer
|
||||
-- DATE: 2005/07/05
|
||||
-- DESCRIPTION:
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
-- $Id: edit_query_string.sql 3158 2010-09-02 02:49:00Z gullevek $
|
||||
-- AUTHOR: Clemens Schwaighofer
|
||||
-- DATE: 2005/07/05
|
||||
-- DESCRIPTION:
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
-- $Id: edit_scheme.sql 3158 2010-09-02 02:49:00Z gullevek $
|
||||
-- AUTHOR: Clemens Schwaighofer
|
||||
-- DATE: 2005/07/05
|
||||
-- DESCRIPTION:
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
-- $Id: edit_temp_files.sql 4382 2013-02-18 07:27:24Z gullevek $
|
||||
-- AUTHOR: Clemens Schwaighofer
|
||||
-- DATE: 2005/07/08
|
||||
-- DESCRIPTION:
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
-- $Id: edit_user.sql 4226 2012-11-02 07:19:57Z gullevek $
|
||||
-- AUTHOR: Clemens Schwaighofer
|
||||
-- DATE: 2005/07/06
|
||||
-- DESCRIPTION:
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
-- $Id: edit_visible_group.sql 4382 2013-02-18 07:27:24Z gullevek $
|
||||
-- AUTHOR: Clemens Schwaighofer
|
||||
-- DATE: 2005/07/05
|
||||
-- DESCRIPTION:
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
-- $Id: generic.sql 3158 2010-09-02 02:49:00Z gullevek $
|
||||
-- AUTHOR: Clemens Schwaighofer
|
||||
-- DATE: 2005/07/05
|
||||
-- DESCRIPTION:
|
||||
@@ -8,9 +7,6 @@
|
||||
|
||||
-- DROP TABLE edit_generic;
|
||||
CREATE TABLE generic (
|
||||
row_status INT,
|
||||
date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT clock_timestamp(),
|
||||
date_updated TIMESTAMP WITHOUT TIME ZONE,
|
||||
user_created VARCHAR(25) DEFAULT CURRENT_USER,
|
||||
user_updated VARCHAR(25)
|
||||
date_updated TIMESTAMP WITHOUT TIME ZONE
|
||||
);
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
-- $Id: trg_edit_access.sql 3158 2010-09-02 02:49:00Z gullevek $
|
||||
|
||||
-- DROP TRIGGER trg_edit_access ON edit_access;
|
||||
CREATE TRIGGER trg_edit_access
|
||||
BEFORE INSERT OR UPDATE ON edit_access
|
||||
|
||||
4
4dev/database/trigger/trg_edit_access_data.sql
Normal file
4
4dev/database/trigger/trg_edit_access_data.sql
Normal file
@@ -0,0 +1,4 @@
|
||||
-- DROP TRIGGER trg_edit_access_data ON edit_access_data;
|
||||
CREATE TRIGGER trg_edit_access_data
|
||||
BEFORE INSERT OR UPDATE ON edit_access_data
|
||||
FOR EACH ROW EXECUTE PROCEDURE set_generic();
|
||||
@@ -1,5 +1,3 @@
|
||||
-- $Id: trg_edit_access_right.sql 3158 2010-09-02 02:49:00Z gullevek $
|
||||
|
||||
-- DROP TRIGGER trg_edit_access_right ON edit_access_right;
|
||||
CREATE TRIGGER trg_edit_access_right
|
||||
BEFORE INSERT OR UPDATE ON edit_access_right
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
-- $Id: trg_edit_access_user.sql 3158 2010-09-02 02:49:00Z gullevek $
|
||||
|
||||
-- DROP TRIGGER trg_edit_access_user ON edit_access_user;
|
||||
CREATE TRIGGER trg_edit_access_user
|
||||
BEFORE INSERT OR UPDATE ON edit_access_user
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
-- $Id: trg_edit_group.sql 3158 2010-09-02 02:49:00Z gullevek $
|
||||
|
||||
-- DROP TRIGGER trg_edit_group ON edit_group;
|
||||
CREATE TRIGGER trg_edit_group
|
||||
BEFORE INSERT OR UPDATE ON edit_group
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
-- $Id: trg_edit_language.sql 3158 2010-09-02 02:49:00Z gullevek $
|
||||
|
||||
-- DROP TRIGGER trg_edit_language ON edit_language;
|
||||
CREATE TRIGGER trg_edit_language
|
||||
BEFORE INSERT OR UPDATE ON edit_language
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
-- $Id: trg_edit_log.sql 3158 2010-09-02 02:49:00Z gullevek $
|
||||
|
||||
-- DROP TRIGGER trg_edit_log ON edit_log;
|
||||
CREATE TRIGGER trg_edit_log
|
||||
BEFORE INSERT OR UPDATE ON edit_log
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
-- $Id: trg_edit_menu_group.sql 3158 2010-09-02 02:49:00Z gullevek $
|
||||
|
||||
-- DROP TRIGGER trg_edit_visible_group ON edit_visible_group;
|
||||
CREATE TRIGGER trg_edit_menu_group
|
||||
BEFORE INSERT OR UPDATE ON edit_menu_group
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
-- $Id: trg_edit_page.sql 3158 2010-09-02 02:49:00Z gullevek $
|
||||
|
||||
-- DROP TRIGGER trg_edit_page ON edit_page;
|
||||
CREATE TRIGGER trg_edit_page
|
||||
BEFORE INSERT OR UPDATE ON edit_page
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
-- $Id: trg_edit_page_access.sql 3158 2010-09-02 02:49:00Z gullevek $
|
||||
|
||||
-- DROP TRIGGER trg_edit_page_access ON edit_page_access;
|
||||
CREATE TRIGGER trg_edit_page_access
|
||||
BEFORE INSERT OR UPDATE ON edit_page_access
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
-- $Id: trg_edit_query_string.sql 3158 2010-09-02 02:49:00Z gullevek $
|
||||
|
||||
-- DROP TRIGGER trg_edit_query_string ON edit_query_string;
|
||||
CREATE TRIGGER trg_edit_query_string
|
||||
BEFORE INSERT OR UPDATE ON edit_query_string
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
-- $Id: trg_edit_scheme.sql 3158 2010-09-02 02:49:00Z gullevek $
|
||||
|
||||
-- DROP TRIGGER trg_edit_scheme ON edit_scheme;
|
||||
CREATE TRIGGER trg_edit_scheme
|
||||
BEFORE INSERT OR UPDATE ON edit_scheme
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
-- $Id: trg_edit_user.sql 3158 2010-09-02 02:49:00Z gullevek $
|
||||
|
||||
-- DROP TRIGGER trg_edit_user ON edit_user;
|
||||
CREATE TRIGGER trg_edit_user
|
||||
BEFORE INSERT OR UPDATE ON edit_user
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
-- $Id: trg_edit_visible_group.sql 3158 2010-09-02 02:49:00Z gullevek $
|
||||
|
||||
-- DROP TRIGGER trg_edit_visible_group ON edit_visible_group;
|
||||
CREATE TRIGGER trg_edit_visible_group
|
||||
BEFORE INSERT OR UPDATE ON edit_visible_group
|
||||
|
||||
4
4dev/database/trigger/trg_set_edit_access_uid.sql
Normal file
4
4dev/database/trigger/trg_set_edit_access_uid.sql
Normal file
@@ -0,0 +1,4 @@
|
||||
-- DROP TRIGGER trg_set_edit_access_uid ON edit_access;
|
||||
CREATE TRIGGER trg_set_edit_access_uid
|
||||
BEFORE INSERT OR UPDATE ON edit_access
|
||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_access_uid();
|
||||
1
4dev/debug/jquery-3.1.0.min.map
Normal file
1
4dev/debug/jquery-3.1.0.min.map
Normal file
File diff suppressed because one or more lines are too long
6
www/SMARTY_UPDATE
Normal file
6
www/SMARTY_UPDATE
Normal file
@@ -0,0 +1,6 @@
|
||||
* copy
|
||||
plugins/block.t.php
|
||||
plugins/function.popup*.php
|
||||
* check & copy
|
||||
plugins/function.html_checkboxes.php
|
||||
plugins/function.html_options.php
|
||||
@@ -1 +1 @@
|
||||
Smarty-3.1.21/
|
||||
smarty-3.1.27/
|
||||
@@ -1,133 +0,0 @@
|
||||
{capture name='_smarty_debug' assign=debug_output}
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||
<head>
|
||||
<title>Smarty Debug Console</title>
|
||||
<style type="text/css">
|
||||
{literal}
|
||||
body, h1, h2, td, th, p {
|
||||
font-family: sans-serif;
|
||||
font-weight: normal;
|
||||
font-size: 0.9em;
|
||||
margin: 1px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
h1 {
|
||||
margin: 0;
|
||||
text-align: left;
|
||||
padding: 2px;
|
||||
background-color: #f0c040;
|
||||
color: black;
|
||||
font-weight: bold;
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
h2 {
|
||||
background-color: #9B410E;
|
||||
color: white;
|
||||
text-align: left;
|
||||
font-weight: bold;
|
||||
padding: 2px;
|
||||
border-top: 1px solid black;
|
||||
}
|
||||
|
||||
body {
|
||||
background: black;
|
||||
}
|
||||
|
||||
p, table, div {
|
||||
background: #f0ead8;
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 0;
|
||||
font-style: italic;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
th, td {
|
||||
font-family: monospace;
|
||||
vertical-align: top;
|
||||
text-align: left;
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
td {
|
||||
color: green;
|
||||
}
|
||||
|
||||
.odd {
|
||||
background-color: #eeeeee;
|
||||
}
|
||||
|
||||
.even {
|
||||
background-color: #fafafa;
|
||||
}
|
||||
|
||||
.exectime {
|
||||
font-size: 0.8em;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
#table_assigned_vars th {
|
||||
color: blue;
|
||||
}
|
||||
|
||||
#table_config_vars th {
|
||||
color: maroon;
|
||||
}
|
||||
{/literal}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>Smarty Debug Console - {if isset($template_name)}{$template_name|debug_print_var nofilter}{else}Total Time {$execution_time|string_format:"%.5f"}{/if}</h1>
|
||||
|
||||
{if !empty($template_data)}
|
||||
<h2>included templates & config files (load time in seconds)</h2>
|
||||
|
||||
<div>
|
||||
{foreach $template_data as $template}
|
||||
<font color=brown>{$template.name}</font>
|
||||
<span class="exectime">
|
||||
(compile {$template['compile_time']|string_format:"%.5f"}) (render {$template['render_time']|string_format:"%.5f"}) (cache {$template['cache_time']|string_format:"%.5f"})
|
||||
</span>
|
||||
<br>
|
||||
{/foreach}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<h2>assigned template variables</h2>
|
||||
|
||||
<table id="table_assigned_vars">
|
||||
{foreach $assigned_vars as $vars}
|
||||
<tr class="{if $vars@iteration % 2 eq 0}odd{else}even{/if}">
|
||||
<th>${$vars@key|escape:'html'}</th>
|
||||
<td>{$vars|debug_print_var nofilter}</td></tr>
|
||||
{/foreach}
|
||||
</table>
|
||||
|
||||
<h2>assigned config file variables (outer template scope)</h2>
|
||||
|
||||
<table id="table_config_vars">
|
||||
{foreach $config_vars as $vars}
|
||||
<tr class="{if $vars@iteration % 2 eq 0}odd{else}even{/if}">
|
||||
<th>{$vars@key|escape:'html'}</th>
|
||||
<td>{$vars|debug_print_var nofilter}</td></tr>
|
||||
{/foreach}
|
||||
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
{/capture}
|
||||
<script type="text/javascript">
|
||||
{$id = $template_name|default:''|md5}
|
||||
_smarty_console = window.open("","console{$id}","width=680,height=600,resizable,scrollbars=yes");
|
||||
_smarty_console.document.write("{$debug_output|escape:'javascript' nofilter}");
|
||||
_smarty_console.document.close();
|
||||
</script>
|
||||
@@ -1,389 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Smarty Internal Plugin
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Cacher
|
||||
*/
|
||||
|
||||
/**
|
||||
* Cache Handler API
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Cacher
|
||||
* @author Rodney Rehm
|
||||
*/
|
||||
abstract class Smarty_CacheResource
|
||||
{
|
||||
/**
|
||||
* cache for Smarty_CacheResource instances
|
||||
* @var array
|
||||
*/
|
||||
public static $resources = array();
|
||||
|
||||
/**
|
||||
* resource types provided by the core
|
||||
* @var array
|
||||
*/
|
||||
protected static $sysplugins = array(
|
||||
'file' => true,
|
||||
);
|
||||
|
||||
/**
|
||||
* 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 $source cached object
|
||||
* @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
|
||||
* @return booelan true or false if the cached content does not exist
|
||||
*/
|
||||
abstract public function process(Smarty_Internal_Template $_template, Smarty_Template_Cached $cached=null);
|
||||
|
||||
/**
|
||||
* 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);
|
||||
|
||||
/**
|
||||
* Return cached content
|
||||
*
|
||||
* @param Smarty_Internal_Template $_template template object
|
||||
* @param string $content content of cache
|
||||
*/
|
||||
public function getCachedContent(Smarty_Internal_Template $_template)
|
||||
{
|
||||
if ($_template->cached->handler->process($_template)) {
|
||||
ob_start();
|
||||
$_template->properties['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);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
public function hasLock(Smarty $smarty, Smarty_Template_Cached $cached)
|
||||
{
|
||||
// check if lock exists
|
||||
return false;
|
||||
}
|
||||
|
||||
public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached)
|
||||
{
|
||||
// create lock
|
||||
return true;
|
||||
}
|
||||
|
||||
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
|
||||
* @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->_cacheresource_handlers[$type])) {
|
||||
return $smarty->_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->_cacheresource_handlers[$type] = $smarty->registered_cache_resources[$type];
|
||||
}
|
||||
// try sysplugins dir
|
||||
if (isset(self::$sysplugins[$type])) {
|
||||
if (!isset(self::$resources[$type])) {
|
||||
$cache_resource_class = 'Smarty_Internal_CacheResource_' . ucfirst($type);
|
||||
self::$resources[$type] = new $cache_resource_class();
|
||||
}
|
||||
|
||||
return $smarty->_cacheresource_handlers[$type] = self::$resources[$type];
|
||||
}
|
||||
// try plugins dir
|
||||
$cache_resource_class = 'Smarty_CacheResource_' . ucfirst($type);
|
||||
if ($smarty->loadPlugin($cache_resource_class)) {
|
||||
if (!isset(self::$resources[$type])) {
|
||||
self::$resources[$type] = new $cache_resource_class();
|
||||
}
|
||||
|
||||
return $smarty->_cacheresource_handlers[$type] = self::$resources[$type];
|
||||
}
|
||||
// give up
|
||||
throw new SmartyException("Unable to load cache resource '{$type}'");
|
||||
}
|
||||
|
||||
/**
|
||||
* Invalid Loaded Cache Files
|
||||
*
|
||||
* @param Smarty $smarty Smarty object
|
||||
*/
|
||||
public static function invalidLoadedCache(Smarty $smarty)
|
||||
{
|
||||
foreach ($smarty->template_objects as $tpl) {
|
||||
if (isset($tpl->cached)) {
|
||||
$tpl->cached->valid = false;
|
||||
$tpl->cached->processed = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Smarty Resource Data Object
|
||||
*
|
||||
* Cache Data Container for Template Files
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage TemplateResources
|
||||
* @author Rodney Rehm
|
||||
*/
|
||||
class Smarty_Template_Cached
|
||||
{
|
||||
/**
|
||||
* Source Filepath
|
||||
* @var string
|
||||
*/
|
||||
public $filepath = false;
|
||||
|
||||
/**
|
||||
* Source Content
|
||||
* @var string
|
||||
*/
|
||||
public $content = null;
|
||||
|
||||
/**
|
||||
* Source Timestamp
|
||||
* @var integer
|
||||
*/
|
||||
public $timestamp = false;
|
||||
|
||||
/**
|
||||
* Source Existence
|
||||
* @var boolean
|
||||
*/
|
||||
public $exists = false;
|
||||
|
||||
/**
|
||||
* Cache Is Valid
|
||||
* @var boolean
|
||||
*/
|
||||
public $valid = false;
|
||||
|
||||
/**
|
||||
* Cache was processed
|
||||
* @var boolean
|
||||
*/
|
||||
public $processed = false;
|
||||
|
||||
/**
|
||||
* CacheResource Handler
|
||||
* @var Smarty_CacheResource
|
||||
*/
|
||||
public $handler = null;
|
||||
|
||||
/**
|
||||
* Template Compile Id (Smarty_Internal_Template::$compile_id)
|
||||
* @var string
|
||||
*/
|
||||
public $compile_id = null;
|
||||
|
||||
/**
|
||||
* Template Cache Id (Smarty_Internal_Template::$cache_id)
|
||||
* @var string
|
||||
*/
|
||||
public $cache_id = null;
|
||||
|
||||
/**
|
||||
* Id for cache locking
|
||||
* @var string
|
||||
*/
|
||||
public $lock_id = null;
|
||||
|
||||
/**
|
||||
* flag that cache is locked by this instance
|
||||
* @var bool
|
||||
*/
|
||||
public $is_locked = false;
|
||||
|
||||
/**
|
||||
* Source Object
|
||||
* @var Smarty_Template_Source
|
||||
*/
|
||||
public $source = null;
|
||||
|
||||
/**
|
||||
* create Cached Object container
|
||||
*
|
||||
* @param Smarty_Internal_Template $_template template object
|
||||
*/
|
||||
public function __construct(Smarty_Internal_Template $_template)
|
||||
{
|
||||
$this->compile_id = $_template->compile_id;
|
||||
$this->cache_id = $_template->cache_id;
|
||||
$this->source = $_template->source;
|
||||
$_template->cached = $this;
|
||||
$smarty = $_template->smarty;
|
||||
|
||||
//
|
||||
// load resource handler
|
||||
//
|
||||
$this->handler = $handler = Smarty_CacheResource::load($smarty); // Note: prone to circular references
|
||||
|
||||
//
|
||||
// check if cache is valid
|
||||
//
|
||||
if (!($_template->caching == Smarty::CACHING_LIFETIME_CURRENT || $_template->caching == Smarty::CACHING_LIFETIME_SAVED) || $_template->source->recompiled) {
|
||||
$handler->populate($this, $_template);
|
||||
|
||||
return;
|
||||
}
|
||||
while (true) {
|
||||
while (true) {
|
||||
$handler->populate($this, $_template);
|
||||
if ($this->timestamp === false || $smarty->force_compile || $smarty->force_cache) {
|
||||
$this->valid = false;
|
||||
} else {
|
||||
$this->valid = true;
|
||||
}
|
||||
if ($this->valid && $_template->caching == Smarty::CACHING_LIFETIME_CURRENT && $_template->cache_lifetime >= 0 && time() > ($this->timestamp + $_template->cache_lifetime)) {
|
||||
// lifetime expired
|
||||
$this->valid = false;
|
||||
}
|
||||
if ($this->valid || !$_template->smarty->cache_locking) {
|
||||
break;
|
||||
}
|
||||
if (!$this->handler->locked($_template->smarty, $this)) {
|
||||
$this->handler->acquireLock($_template->smarty, $this);
|
||||
break 2;
|
||||
}
|
||||
}
|
||||
if ($this->valid) {
|
||||
if (!$_template->smarty->cache_locking || $this->handler->locked($_template->smarty, $this) === null) {
|
||||
// load cache file for the following checks
|
||||
if ($smarty->debugging) {
|
||||
Smarty_Internal_Debug::start_cache($_template);
|
||||
}
|
||||
if ($handler->process($_template, $this) === false) {
|
||||
$this->valid = false;
|
||||
} else {
|
||||
$this->processed = true;
|
||||
}
|
||||
if ($smarty->debugging) {
|
||||
Smarty_Internal_Debug::end_cache($_template);
|
||||
}
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
if ($this->valid && $_template->caching === Smarty::CACHING_LIFETIME_SAVED && $_template->properties['cache_lifetime'] >= 0 && (time() > ($_template->cached->timestamp + $_template->properties['cache_lifetime']))) {
|
||||
$this->valid = false;
|
||||
}
|
||||
if (!$this->valid && $_template->smarty->cache_locking) {
|
||||
$this->handler->acquireLock($_template->smarty, $this);
|
||||
|
||||
return;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Write this cache object to handler
|
||||
*
|
||||
* @param Smarty_Internal_Template $_template template object
|
||||
* @param string $content content to cache
|
||||
* @return boolean success
|
||||
*/
|
||||
public function write(Smarty_Internal_Template $_template, $content)
|
||||
{
|
||||
if (!$_template->source->recompiled) {
|
||||
if ($this->handler->writeCachedContent($_template, $content)) {
|
||||
$this->timestamp = time();
|
||||
$this->exists = true;
|
||||
$this->valid = true;
|
||||
if ($_template->smarty->cache_locking) {
|
||||
$this->handler->releaseLock($_template->smarty, $this);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,94 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Smarty Internal Plugin
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage TemplateResources
|
||||
*/
|
||||
|
||||
/**
|
||||
* Smarty Resource Data Object
|
||||
*
|
||||
* Meta Data Container for Config Files
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage TemplateResources
|
||||
* @author Rodney Rehm
|
||||
*
|
||||
* @property string $content
|
||||
* @property int $timestamp
|
||||
* @property bool $exists
|
||||
*/
|
||||
class Smarty_Config_Source extends Smarty_Template_Source
|
||||
{
|
||||
/**
|
||||
* create Config Object container
|
||||
*
|
||||
* @param Smarty_Resource $handler Resource Handler this source object communicates with
|
||||
* @param Smarty $smarty Smarty instance this source object belongs to
|
||||
* @param string $resource full config_resource
|
||||
* @param string $type type of resource
|
||||
* @param string $name resource name
|
||||
* @param string $unique_resource unqiue resource name
|
||||
*/
|
||||
public function __construct(Smarty_Resource $handler, Smarty $smarty, $resource, $type, $name, $unique_resource)
|
||||
{
|
||||
$this->handler = $handler; // Note: prone to circular references
|
||||
|
||||
// Note: these may be ->config_compiler_class etc in the future
|
||||
//$this->config_compiler_class = $handler->config_compiler_class;
|
||||
//$this->config_lexer_class = $handler->config_lexer_class;
|
||||
//$this->config_parser_class = $handler->config_parser_class;
|
||||
|
||||
$this->smarty = $smarty;
|
||||
$this->resource = $resource;
|
||||
$this->type = $type;
|
||||
$this->name = $name;
|
||||
$this->unique_resource = $unique_resource;
|
||||
}
|
||||
|
||||
/**
|
||||
* <<magic>> Generic setter.
|
||||
*
|
||||
* @param string $property_name valid: content, timestamp, exists
|
||||
* @param mixed $value newly assigned value (not check for correct type)
|
||||
* @throws SmartyException when the given property name is not valid
|
||||
*/
|
||||
public function __set($property_name, $value)
|
||||
{
|
||||
switch ($property_name) {
|
||||
case 'content':
|
||||
case 'timestamp':
|
||||
case 'exists':
|
||||
$this->$property_name = $value;
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new SmartyException("invalid config property '$property_name'.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* <<magic>> Generic getter.
|
||||
*
|
||||
* @param string $property_name valid: content, timestamp, exists
|
||||
* @throws SmartyException when the given property name is not valid
|
||||
*/
|
||||
public function __get($property_name)
|
||||
{
|
||||
switch ($property_name) {
|
||||
case 'timestamp':
|
||||
case 'exists':
|
||||
$this->handler->populateTimestamp($this);
|
||||
|
||||
return $this->$property_name;
|
||||
|
||||
case 'content':
|
||||
return $this->content = $this->handler->getContent($this);
|
||||
|
||||
default:
|
||||
throw new SmartyException("config property '$property_name' does not exist.");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,277 +0,0 @@
|
||||
<?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_file_path = str_replace(':', '.', $_template->source->filepath);
|
||||
$_cache_id = isset($_template->cache_id) ? preg_replace('![^\w\|]+!', '_', $_template->cache_id) : null;
|
||||
$_compile_id = isset($_template->compile_id) ? preg_replace('![^\w\|]+!', '_', $_template->compile_id) : null;
|
||||
$_filepath = $_template->source->uid;
|
||||
// if use_sub_dirs, break file into directories
|
||||
if ($_template->smarty->use_sub_dirs) {
|
||||
$_filepath = substr($_filepath, 0, 2) . DS
|
||||
. substr($_filepath, 2, 2) . DS
|
||||
. substr($_filepath, 4, 2) . DS
|
||||
. $_filepath;
|
||||
}
|
||||
$_compile_dir_sep = $_template->smarty->use_sub_dirs ? DS : '^';
|
||||
if (isset($_cache_id)) {
|
||||
$_cache_id = str_replace('|', $_compile_dir_sep, $_cache_id) . $_compile_dir_sep;
|
||||
} else {
|
||||
$_cache_id = '';
|
||||
}
|
||||
if (isset($_compile_id)) {
|
||||
$_compile_id = $_compile_id . $_compile_dir_sep;
|
||||
} else {
|
||||
$_compile_id = '';
|
||||
}
|
||||
$_cache_dir = $_template->smarty->getCacheDir();
|
||||
if ($_template->smarty->cache_locking) {
|
||||
// create locking file name
|
||||
// relative file name?
|
||||
if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_cache_dir)) {
|
||||
$_lock_dir = rtrim(getcwd(), '/\\') . DS . $_cache_dir;
|
||||
} else {
|
||||
$_lock_dir = $_cache_dir;
|
||||
}
|
||||
$cached->lock_id = $_lock_dir.sha1($_cache_id.$_compile_id.$_template->source->uid).'.lock';
|
||||
}
|
||||
$cached->filepath = $_cache_dir . $_cache_id . $_compile_id . $_filepath . '.' . basename($_source_file_path) . '.php';
|
||||
$cached->timestamp = @filemtime($cached->filepath);
|
||||
$cached->exists = !!$cached->timestamp;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 = @filemtime($cached->filepath);
|
||||
$cached->exists = !!$cached->timestamp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read the cached template and process its header
|
||||
*
|
||||
* @param Smarty_Internal_Template $_template template object
|
||||
* @param Smarty_Template_Cached $cached cached object
|
||||
* @return booelan true or false if the cached content does not exist
|
||||
*/
|
||||
public function process(Smarty_Internal_Template $_template, Smarty_Template_Cached $cached=null)
|
||||
{
|
||||
$_smarty_tpl = $_template;
|
||||
|
||||
return @include $_template->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 (Smarty_Internal_Write_File::writeFile($_template->cached->filepath, $content, $_template->smarty) === true) {
|
||||
$_template->cached->timestamp = @filemtime($_template->cached->filepath);
|
||||
$_template->cached->exists = !!$_template->cached->timestamp;
|
||||
if ($_template->cached->exists) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Empty cache
|
||||
*
|
||||
* @param Smarty_Internal_Template $_template template 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->clear($smarty, null, null, null, $exp_time);
|
||||
}
|
||||
|
||||
/**
|
||||
* Empty cache for a specific template
|
||||
*
|
||||
* @param Smarty $_template template 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_id = isset($cache_id) ? preg_replace('![^\w\|]+!', '_', $cache_id) : null;
|
||||
$_compile_id = isset($compile_id) ? preg_replace('![^\w\|]+!', '_', $compile_id) : null;
|
||||
$_dir_sep = $smarty->use_sub_dirs ? '/' : '^';
|
||||
$_compile_id_offset = $smarty->use_sub_dirs ? 3 : 0;
|
||||
$_dir = $smarty->getCacheDir();
|
||||
$_dir_length = strlen($_dir);
|
||||
if (isset($_cache_id)) {
|
||||
$_cache_id_parts = explode('|', $_cache_id);
|
||||
$_cache_id_parts_count = count($_cache_id_parts);
|
||||
if ($smarty->use_sub_dirs) {
|
||||
foreach ($_cache_id_parts as $id_part) {
|
||||
$_dir .= $id_part . DS;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (isset($resource_name)) {
|
||||
$_save_stat = $smarty->caching;
|
||||
$smarty->caching = true;
|
||||
$tpl = new $smarty->template_class($resource_name, $smarty);
|
||||
$smarty->caching = $_save_stat;
|
||||
|
||||
// remove from template cache
|
||||
$tpl->source; // have the template registered before unset()
|
||||
if ($smarty->allow_ambiguous_resources) {
|
||||
$_templateId = $tpl->source->unique_resource . $tpl->cache_id . $tpl->compile_id;
|
||||
} else {
|
||||
$_templateId = $smarty->joined_template_dir . '#' . $resource_name . $tpl->cache_id . $tpl->compile_id;
|
||||
}
|
||||
if (isset($_templateId[150])) {
|
||||
$_templateId = sha1($_templateId);
|
||||
}
|
||||
unset($smarty->template_objects[$_templateId]);
|
||||
|
||||
if ($tpl->source->exists) {
|
||||
$_resourcename_parts = basename(str_replace('^', '/', $tpl->cached->filepath));
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
$_count = 0;
|
||||
$_time = time();
|
||||
if (file_exists($_dir)) {
|
||||
$_cacheDirs = new RecursiveDirectoryIterator($_dir);
|
||||
$_cache = new RecursiveIteratorIterator($_cacheDirs, RecursiveIteratorIterator::CHILD_FIRST);
|
||||
foreach ($_cache as $_file) {
|
||||
if (substr(basename($_file->getPathname()),0,1) == '.' || strpos($_file, '.svn') !== false) continue;
|
||||
// directory ?
|
||||
if ($_file->isDir()) {
|
||||
if (!$_cache->isDot()) {
|
||||
// delete folder if empty
|
||||
@rmdir($_file->getPathname());
|
||||
}
|
||||
} else {
|
||||
$_parts = explode($_dir_sep, str_replace('\\', '/', substr((string) $_file, $_dir_length)));
|
||||
$_parts_count = count($_parts);
|
||||
// check name
|
||||
if (isset($resource_name)) {
|
||||
if ($_parts[$_parts_count-1] != $_resourcename_parts) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
// check compile id
|
||||
if (isset($_compile_id) && (!isset($_parts[$_parts_count-2 - $_compile_id_offset]) || $_parts[$_parts_count-2 - $_compile_id_offset] != $_compile_id)) {
|
||||
continue;
|
||||
}
|
||||
// check cache id
|
||||
if (isset($_cache_id)) {
|
||||
// count of cache id parts
|
||||
$_parts_count = (isset($_compile_id)) ? $_parts_count - 2 - $_compile_id_offset : $_parts_count - 1 - $_compile_id_offset;
|
||||
if ($_parts_count < $_cache_id_parts_count) {
|
||||
continue;
|
||||
}
|
||||
for ($i = 0; $i < $_cache_id_parts_count; $i++) {
|
||||
if ($_parts[$i] != $_cache_id_parts[$i]) continue 2;
|
||||
}
|
||||
}
|
||||
// expired ?
|
||||
if (isset($exp_time)) {
|
||||
if ($exp_time < 0) {
|
||||
preg_match('#\'cache_lifetime\' =>\s*(\d*)#', file_get_contents($_file), $match);
|
||||
if ($_time < (@filemtime($_file) + $match[1])) {
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
if ($_time - @filemtime($_file) < $exp_time) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
$_count += @unlink((string) $_file) ? 1 : 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $_count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check is cache is locked for this template
|
||||
*
|
||||
* @param Smarty $smarty Smarty object
|
||||
* @param Smarty_Template_Cached $cached cached object
|
||||
* @return booelan 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();
|
||||
}
|
||||
$t = @filemtime($cached->lock_id);
|
||||
|
||||
return $t && (time() - $t < $smarty->locking_timeout);
|
||||
}
|
||||
|
||||
/**
|
||||
* Lock cache for this template
|
||||
*
|
||||
* @param Smarty $smarty Smarty object
|
||||
* @param Smarty_Template_Cached $cached cached object
|
||||
*/
|
||||
public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached)
|
||||
{
|
||||
$cached->is_locked = true;
|
||||
touch($cached->lock_id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unlock cache for this template
|
||||
*
|
||||
* @param Smarty $smarty Smarty object
|
||||
* @param Smarty_Template_Cached $cached cached object
|
||||
*/
|
||||
public function releaseLock(Smarty $smarty, Smarty_Template_Cached $cached)
|
||||
{
|
||||
$cached->is_locked = false;
|
||||
@unlink($cached->lock_id);
|
||||
}
|
||||
}
|
||||
@@ -1,129 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Smarty Internal Plugin Compile Function_Call
|
||||
*
|
||||
* Compiles the calls of user defined tags defined by {function}
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Compiler
|
||||
* @author Uwe Tews
|
||||
*/
|
||||
|
||||
/**
|
||||
* Smarty Internal Plugin Compile Function_Call Class
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Compiler
|
||||
*/
|
||||
class Smarty_Internal_Compile_Call extends Smarty_Internal_CompileBase
|
||||
{
|
||||
/**
|
||||
* Attribute definition: Overwrites base class.
|
||||
*
|
||||
* @var array
|
||||
* @see Smarty_Internal_CompileBase
|
||||
*/
|
||||
public $required_attributes = array('name');
|
||||
/**
|
||||
* Attribute definition: Overwrites base class.
|
||||
*
|
||||
* @var array
|
||||
* @see Smarty_Internal_CompileBase
|
||||
*/
|
||||
public $shorttag_order = array('name');
|
||||
/**
|
||||
* Attribute definition: Overwrites base class.
|
||||
*
|
||||
* @var array
|
||||
* @see Smarty_Internal_CompileBase
|
||||
*/
|
||||
public $optional_attributes = array('_any');
|
||||
|
||||
/**
|
||||
* Compiles the calls of user defined tags defined by {function}
|
||||
*
|
||||
* @param array $args array with attributes from parser
|
||||
* @param object $compiler compiler object
|
||||
* @param array $parameter array with compilation parameter
|
||||
* @return string compiled code
|
||||
*/
|
||||
public function compile($args, $compiler)
|
||||
{
|
||||
// check and get attributes
|
||||
$_attr = $this->getAttributes($compiler, $args);
|
||||
// save possible attributes
|
||||
if (isset($_attr['assign'])) {
|
||||
// output will be stored in a smarty variable instead of beind displayed
|
||||
$_assign = $_attr['assign'];
|
||||
}
|
||||
$_name = $_attr['name'];
|
||||
if ($compiler->compiles_template_function) {
|
||||
$compiler->called_functions[] = trim($_name, "'\"");
|
||||
}
|
||||
unset($_attr['name'], $_attr['assign'], $_attr['nocache']);
|
||||
// set flag (compiled code of {function} must be included in cache file
|
||||
if ($compiler->nocache || $compiler->tag_nocache) {
|
||||
$_nocache = 'true';
|
||||
} else {
|
||||
$_nocache = 'false';
|
||||
}
|
||||
$_paramsArray = array();
|
||||
foreach ($_attr as $_key => $_value) {
|
||||
if (is_int($_key)) {
|
||||
$_paramsArray[] = "$_key=>$_value";
|
||||
} else {
|
||||
$_paramsArray[] = "'$_key'=>$_value";
|
||||
}
|
||||
}
|
||||
if (isset($compiler->template->properties['function'][$_name]['parameter'])) {
|
||||
foreach ($compiler->template->properties['function'][$_name]['parameter'] as $_key => $_value) {
|
||||
if (!isset($_attr[$_key])) {
|
||||
if (is_int($_key)) {
|
||||
$_paramsArray[] = "$_key=>$_value";
|
||||
} else {
|
||||
$_paramsArray[] = "'$_key'=>$_value";
|
||||
}
|
||||
}
|
||||
}
|
||||
} elseif (isset($compiler->smarty->template_functions[$_name]['parameter'])) {
|
||||
foreach ($compiler->smarty->template_functions[$_name]['parameter'] as $_key => $_value) {
|
||||
if (!isset($_attr[$_key])) {
|
||||
if (is_int($_key)) {
|
||||
$_paramsArray[] = "$_key=>$_value";
|
||||
} else {
|
||||
$_paramsArray[] = "'$_key'=>$_value";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//varibale name?
|
||||
if (!(strpos($_name, '$') === false)) {
|
||||
$call_cache = $_name;
|
||||
$call_function = '$tmp = "smarty_template_function_".' . $_name . '; $tmp';
|
||||
} else {
|
||||
$_name = trim($_name, "'\"");
|
||||
$call_cache = "'{$_name}'";
|
||||
$call_function = 'smarty_template_function_' . $_name;
|
||||
}
|
||||
|
||||
$_params = 'array(' . implode(",", $_paramsArray) . ')';
|
||||
$_hash = str_replace('-', '_', $compiler->template->properties['nocache_hash']);
|
||||
// was there an assign attribute
|
||||
if (isset($_assign)) {
|
||||
if ($compiler->template->caching) {
|
||||
$_output = "<?php ob_start(); Smarty_Internal_Function_Call_Handler::call ({$call_cache},\$_smarty_tpl,{$_params},'{$_hash}',{$_nocache}); \$_smarty_tpl->assign({$_assign}, ob_get_clean());?>\n";
|
||||
} else {
|
||||
$_output = "<?php ob_start(); {$call_function}(\$_smarty_tpl,{$_params}); \$_smarty_tpl->assign({$_assign}, ob_get_clean());?>\n";
|
||||
}
|
||||
} else {
|
||||
if ($compiler->template->caching) {
|
||||
$_output = "<?php Smarty_Internal_Function_Call_Handler::call ({$call_cache},\$_smarty_tpl,{$_params},'{$_hash}',{$_nocache});?>\n";
|
||||
} else {
|
||||
$_output = "<?php {$call_function}(\$_smarty_tpl,{$_params});?>\n";
|
||||
}
|
||||
}
|
||||
|
||||
return $_output;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,230 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Smarty Internal Plugin Compile Foreach
|
||||
*
|
||||
* Compiles the {foreach} {foreachelse} {/foreach} tags
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Compiler
|
||||
* @author Uwe Tews
|
||||
*/
|
||||
|
||||
/**
|
||||
* Smarty Internal Plugin Compile Foreach Class
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Compiler
|
||||
*/
|
||||
class Smarty_Internal_Compile_Foreach extends Smarty_Internal_CompileBase
|
||||
{
|
||||
/**
|
||||
* Attribute definition: Overwrites base class.
|
||||
*
|
||||
* @var array
|
||||
* @see Smarty_Internal_CompileBase
|
||||
*/
|
||||
public $required_attributes = array('from', 'item');
|
||||
/**
|
||||
* Attribute definition: Overwrites base class.
|
||||
*
|
||||
* @var array
|
||||
* @see Smarty_Internal_CompileBase
|
||||
*/
|
||||
public $optional_attributes = array('name', 'key');
|
||||
/**
|
||||
* Attribute definition: Overwrites base class.
|
||||
*
|
||||
* @var array
|
||||
* @see Smarty_Internal_CompileBase
|
||||
*/
|
||||
public $shorttag_order = array('from','item','key','name');
|
||||
|
||||
/**
|
||||
* Compiles code for the {foreach} tag
|
||||
*
|
||||
* @param array $args array with attributes from parser
|
||||
* @param object $compiler compiler object
|
||||
* @param array $parameter array with compilation parameter
|
||||
* @return string compiled code
|
||||
*/
|
||||
public function compile($args, $compiler, $parameter)
|
||||
{
|
||||
$tpl = $compiler->template;
|
||||
// check and get attributes
|
||||
$_attr = $this->getAttributes($compiler, $args);
|
||||
|
||||
$from = $_attr['from'];
|
||||
$item = $_attr['item'];
|
||||
if (!strncmp("\$_smarty_tpl->tpl_vars[$item]", $from, strlen($item) + 24)) {
|
||||
$compiler->trigger_template_error("item variable {$item} may not be the same variable as at 'from'", $compiler->lex->taglineno);
|
||||
}
|
||||
|
||||
if (isset($_attr['key'])) {
|
||||
$key = $_attr['key'];
|
||||
} else {
|
||||
$key = null;
|
||||
}
|
||||
|
||||
$this->openTag($compiler, 'foreach', array('foreach', $compiler->nocache, $item, $key));
|
||||
// maybe nocache because of nocache variables
|
||||
$compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
|
||||
|
||||
if (isset($_attr['name'])) {
|
||||
$name = $_attr['name'];
|
||||
$has_name = true;
|
||||
$SmartyVarName = '$smarty.foreach.' . trim($name, '\'"') . '.';
|
||||
} else {
|
||||
$name = null;
|
||||
$has_name = false;
|
||||
}
|
||||
$ItemVarName = '$' . trim($item, '\'"') . '@';
|
||||
// evaluates which Smarty variables and properties have to be computed
|
||||
if ($has_name) {
|
||||
$usesSmartyFirst = strpos($tpl->source->content, $SmartyVarName . 'first') !== false;
|
||||
$usesSmartyLast = strpos($tpl->source->content, $SmartyVarName . 'last') !== false;
|
||||
$usesSmartyIndex = strpos($tpl->source->content, $SmartyVarName . 'index') !== false;
|
||||
$usesSmartyIteration = strpos($tpl->source->content, $SmartyVarName . 'iteration') !== false;
|
||||
$usesSmartyShow = strpos($tpl->source->content, $SmartyVarName . 'show') !== false;
|
||||
$usesSmartyTotal = strpos($tpl->source->content, $SmartyVarName . 'total') !== false;
|
||||
} else {
|
||||
$usesSmartyFirst = false;
|
||||
$usesSmartyLast = false;
|
||||
$usesSmartyTotal = false;
|
||||
$usesSmartyShow = false;
|
||||
}
|
||||
|
||||
$usesPropFirst = $usesSmartyFirst || strpos($tpl->source->content, $ItemVarName . 'first') !== false;
|
||||
$usesPropLast = $usesSmartyLast || strpos($tpl->source->content, $ItemVarName . 'last') !== false;
|
||||
$usesPropIndex = $usesPropFirst || strpos($tpl->source->content, $ItemVarName . 'index') !== false;
|
||||
$usesPropIteration = $usesPropLast || strpos($tpl->source->content, $ItemVarName . 'iteration') !== false;
|
||||
$usesPropShow = strpos($tpl->source->content, $ItemVarName . 'show') !== false;
|
||||
$usesPropTotal = $usesSmartyTotal || $usesSmartyShow || $usesPropShow || $usesPropLast || strpos($tpl->source->content, $ItemVarName . 'total') !== false;
|
||||
// generate output code
|
||||
$output = "<?php ";
|
||||
$output .= " \$_smarty_tpl->tpl_vars[$item] = new Smarty_Variable; \$_smarty_tpl->tpl_vars[$item]->_loop = false;\n";
|
||||
if ($key != null) {
|
||||
$output .= " \$_smarty_tpl->tpl_vars[$key] = new Smarty_Variable;\n";
|
||||
}
|
||||
$output .= " \$_from = $from; if (!is_array(\$_from) && !is_object(\$_from)) { settype(\$_from, 'array');}\n";
|
||||
if ($usesPropTotal) {
|
||||
$output .= " \$_smarty_tpl->tpl_vars[$item]->total= \$_smarty_tpl->_count(\$_from);\n";
|
||||
}
|
||||
if ($usesPropIteration) {
|
||||
$output .= " \$_smarty_tpl->tpl_vars[$item]->iteration=0;\n";
|
||||
}
|
||||
if ($usesPropIndex) {
|
||||
$output .= " \$_smarty_tpl->tpl_vars[$item]->index=-1;\n";
|
||||
}
|
||||
if ($usesPropShow) {
|
||||
$output .= " \$_smarty_tpl->tpl_vars[$item]->show = (\$_smarty_tpl->tpl_vars[$item]->total > 0);\n";
|
||||
}
|
||||
if ($has_name) {
|
||||
if ($usesSmartyTotal) {
|
||||
$output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['total'] = \$_smarty_tpl->tpl_vars[$item]->total;\n";
|
||||
}
|
||||
if ($usesSmartyIteration) {
|
||||
$output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['iteration']=0;\n";
|
||||
}
|
||||
if ($usesSmartyIndex) {
|
||||
$output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['index']=-1;\n";
|
||||
}
|
||||
if ($usesSmartyShow) {
|
||||
$output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['show']=(\$_smarty_tpl->tpl_vars[$item]->total > 0);\n";
|
||||
}
|
||||
}
|
||||
$output .= "foreach (\$_from as \$_smarty_tpl->tpl_vars[$item]->key => \$_smarty_tpl->tpl_vars[$item]->value) {\n\$_smarty_tpl->tpl_vars[$item]->_loop = true;\n";
|
||||
if ($key != null) {
|
||||
$output .= " \$_smarty_tpl->tpl_vars[$key]->value = \$_smarty_tpl->tpl_vars[$item]->key;\n";
|
||||
}
|
||||
if ($usesPropIteration) {
|
||||
$output .= " \$_smarty_tpl->tpl_vars[$item]->iteration++;\n";
|
||||
}
|
||||
if ($usesPropIndex) {
|
||||
$output .= " \$_smarty_tpl->tpl_vars[$item]->index++;\n";
|
||||
}
|
||||
if ($usesPropFirst) {
|
||||
$output .= " \$_smarty_tpl->tpl_vars[$item]->first = \$_smarty_tpl->tpl_vars[$item]->index === 0;\n";
|
||||
}
|
||||
if ($usesPropLast) {
|
||||
$output .= " \$_smarty_tpl->tpl_vars[$item]->last = \$_smarty_tpl->tpl_vars[$item]->iteration === \$_smarty_tpl->tpl_vars[$item]->total;\n";
|
||||
}
|
||||
if ($has_name) {
|
||||
if ($usesSmartyFirst) {
|
||||
$output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['first'] = \$_smarty_tpl->tpl_vars[$item]->first;\n";
|
||||
}
|
||||
if ($usesSmartyIteration) {
|
||||
$output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['iteration']++;\n";
|
||||
}
|
||||
if ($usesSmartyIndex) {
|
||||
$output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['index']++;\n";
|
||||
}
|
||||
if ($usesSmartyLast) {
|
||||
$output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['last'] = \$_smarty_tpl->tpl_vars[$item]->last;\n";
|
||||
}
|
||||
}
|
||||
$output .= "?>";
|
||||
|
||||
return $output;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Smarty Internal Plugin Compile Foreachelse Class
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Compiler
|
||||
*/
|
||||
class Smarty_Internal_Compile_Foreachelse extends Smarty_Internal_CompileBase
|
||||
{
|
||||
/**
|
||||
* Compiles code for the {foreachelse} tag
|
||||
*
|
||||
* @param array $args array with attributes from parser
|
||||
* @param object $compiler compiler object
|
||||
* @param array $parameter array with compilation parameter
|
||||
* @return string compiled code
|
||||
*/
|
||||
public function compile($args, $compiler, $parameter)
|
||||
{
|
||||
// check and get attributes
|
||||
$_attr = $this->getAttributes($compiler, $args);
|
||||
|
||||
list($openTag, $nocache, $item, $key) = $this->closeTag($compiler, array('foreach'));
|
||||
$this->openTag($compiler, 'foreachelse', array('foreachelse', $nocache, $item, $key));
|
||||
|
||||
return "<?php }\nif (!\$_smarty_tpl->tpl_vars[$item]->_loop) {\n?>";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Smarty Internal Plugin Compile Foreachclose Class
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Compiler
|
||||
*/
|
||||
class Smarty_Internal_Compile_Foreachclose extends Smarty_Internal_CompileBase
|
||||
{
|
||||
/**
|
||||
* Compiles code for the {/foreach} tag
|
||||
*
|
||||
* @param array $args array with attributes from parser
|
||||
* @param object $compiler compiler object
|
||||
* @param array $parameter array with compilation parameter
|
||||
* @return string compiled code
|
||||
*/
|
||||
public function compile($args, $compiler, $parameter)
|
||||
{
|
||||
// check and get attributes
|
||||
$_attr = $this->getAttributes($compiler, $args);
|
||||
// must endblock be nocache?
|
||||
if ($compiler->nocache) {
|
||||
$compiler->tag_nocache = true;
|
||||
}
|
||||
|
||||
list($openTag, $compiler->nocache, $item, $key) = $this->closeTag($compiler, array('foreach', 'foreachelse'));
|
||||
|
||||
return "<?php } ?>";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,165 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Smarty Internal Plugin Compile Function
|
||||
*
|
||||
* Compiles the {function} {/function} tags
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Compiler
|
||||
* @author Uwe Tews
|
||||
*/
|
||||
|
||||
/**
|
||||
* Smarty Internal Plugin Compile Function Class
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Compiler
|
||||
*/
|
||||
class Smarty_Internal_Compile_Function extends Smarty_Internal_CompileBase
|
||||
{
|
||||
/**
|
||||
* Attribute definition: Overwrites base class.
|
||||
*
|
||||
* @var array
|
||||
* @see Smarty_Internal_CompileBase
|
||||
*/
|
||||
public $required_attributes = array('name');
|
||||
/**
|
||||
* Attribute definition: Overwrites base class.
|
||||
*
|
||||
* @var array
|
||||
* @see Smarty_Internal_CompileBase
|
||||
*/
|
||||
public $shorttag_order = array('name');
|
||||
/**
|
||||
* Attribute definition: Overwrites base class.
|
||||
*
|
||||
* @var array
|
||||
* @see Smarty_Internal_CompileBase
|
||||
*/
|
||||
public $optional_attributes = array('_any');
|
||||
|
||||
/**
|
||||
* Compiles code for the {function} tag
|
||||
*
|
||||
* @param array $args array with attributes from parser
|
||||
* @param object $compiler compiler object
|
||||
* @param array $parameter array with compilation parameter
|
||||
* @return boolean true
|
||||
*/
|
||||
public function compile($args, $compiler, $parameter)
|
||||
{
|
||||
// check and get attributes
|
||||
$_attr = $this->getAttributes($compiler, $args);
|
||||
|
||||
if ($_attr['nocache'] === true) {
|
||||
$compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno);
|
||||
}
|
||||
unset($_attr['nocache']);
|
||||
$save = array($_attr, $compiler->parser->current_buffer,
|
||||
$compiler->template->has_nocache_code, $compiler->template->required_plugins);
|
||||
$this->openTag($compiler, 'function', $save);
|
||||
$_name = trim($_attr['name'], "'\"");
|
||||
unset($_attr['name']);
|
||||
// set flag that we are compiling a template function
|
||||
$compiler->compiles_template_function = true;
|
||||
$compiler->template->properties['function'][$_name]['parameter'] = array();
|
||||
$_smarty_tpl = $compiler->template;
|
||||
foreach ($_attr as $_key => $_data) {
|
||||
eval ('$tmp='.$_data.';');
|
||||
$compiler->template->properties['function'][$_name]['parameter'][$_key] = $tmp;
|
||||
}
|
||||
$compiler->smarty->template_functions[$_name]['parameter'] = $compiler->template->properties['function'][$_name]['parameter'];
|
||||
if ($compiler->template->caching) {
|
||||
$output = '';
|
||||
} else {
|
||||
$output = "<?php if (!function_exists('smarty_template_function_{$_name}')) {
|
||||
function smarty_template_function_{$_name}(\$_smarty_tpl,\$params) {
|
||||
\$saved_tpl_vars = \$_smarty_tpl->tpl_vars;
|
||||
foreach (\$_smarty_tpl->smarty->template_functions['{$_name}']['parameter'] as \$key => \$value) {\$_smarty_tpl->tpl_vars[\$key] = new Smarty_variable(\$value);};
|
||||
foreach (\$params as \$key => \$value) {\$_smarty_tpl->tpl_vars[\$key] = new Smarty_variable(\$value);}?>";
|
||||
}
|
||||
// Init temporay context
|
||||
$compiler->template->required_plugins = array('compiled' => array(), 'nocache' => array());
|
||||
$compiler->parser->current_buffer = new _smarty_template_buffer($compiler->parser);
|
||||
$compiler->parser->current_buffer->append_subtree(new _smarty_tag($compiler->parser, $output));
|
||||
$compiler->template->has_nocache_code = false;
|
||||
$compiler->has_code = false;
|
||||
$compiler->template->properties['function'][$_name]['compiled'] = '';
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Smarty Internal Plugin Compile Functionclose Class
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Compiler
|
||||
*/
|
||||
class Smarty_Internal_Compile_Functionclose extends Smarty_Internal_CompileBase
|
||||
{
|
||||
/**
|
||||
* Compiles code for the {/function} tag
|
||||
*
|
||||
* @param array $args array with attributes from parser
|
||||
* @param object $compiler compiler object
|
||||
* @param array $parameter array with compilation parameter
|
||||
* @return boolean true
|
||||
*/
|
||||
public function compile($args, $compiler, $parameter)
|
||||
{
|
||||
$_attr = $this->getAttributes($compiler, $args);
|
||||
$saved_data = $this->closeTag($compiler, array('function'));
|
||||
$_name = trim($saved_data[0]['name'], "'\"");
|
||||
// build plugin include code
|
||||
$plugins_string = '';
|
||||
if (!empty($compiler->template->required_plugins['compiled'])) {
|
||||
$plugins_string = '<?php ';
|
||||
foreach ($compiler->template->required_plugins['compiled'] as $tmp) {
|
||||
foreach ($tmp as $data) {
|
||||
$plugins_string .= "if (!is_callable('{$data['function']}')) include '{$data['file']}';\n";
|
||||
}
|
||||
}
|
||||
$plugins_string .= '?>';
|
||||
}
|
||||
if (!empty($compiler->template->required_plugins['nocache'])) {
|
||||
$plugins_string .= "<?php echo '/*%%SmartyNocache:{$compiler->template->properties['nocache_hash']}%%*/<?php ";
|
||||
foreach ($compiler->template->required_plugins['nocache'] as $tmp) {
|
||||
foreach ($tmp as $data) {
|
||||
$plugins_string .= "if (!is_callable(\'{$data['function']}\')) include \'{$data['file']}\';\n";
|
||||
}
|
||||
}
|
||||
$plugins_string .= "?>/*/%%SmartyNocache:{$compiler->template->properties['nocache_hash']}%%*/';?>\n";
|
||||
}
|
||||
// remove last line break from function definition
|
||||
$last = count($compiler->parser->current_buffer->subtrees) - 1;
|
||||
if ($compiler->parser->current_buffer->subtrees[$last] instanceof _smarty_linebreak) {
|
||||
unset($compiler->parser->current_buffer->subtrees[$last]);
|
||||
}
|
||||
// if caching save template function for possible nocache call
|
||||
if ($compiler->template->caching) {
|
||||
$compiler->template->properties['function'][$_name]['compiled'] .= $plugins_string
|
||||
. $compiler->parser->current_buffer->to_smarty_php();
|
||||
$compiler->template->properties['function'][$_name]['nocache_hash'] = $compiler->template->properties['nocache_hash'];
|
||||
$compiler->template->properties['function'][$_name]['has_nocache_code'] = $compiler->template->has_nocache_code;
|
||||
$compiler->template->properties['function'][$_name]['called_functions'] = $compiler->called_functions;
|
||||
$compiler->called_functions = array();
|
||||
$compiler->smarty->template_functions[$_name] = $compiler->template->properties['function'][$_name];
|
||||
$compiler->has_code = false;
|
||||
$output = true;
|
||||
} else {
|
||||
$output = $plugins_string . $compiler->parser->current_buffer->to_smarty_php() . "<?php \$_smarty_tpl->tpl_vars = \$saved_tpl_vars;
|
||||
foreach (Smarty::\$global_tpl_vars as \$key => \$value) if(!isset(\$_smarty_tpl->tpl_vars[\$key])) \$_smarty_tpl->tpl_vars[\$key] = \$value;}}?>\n";
|
||||
}
|
||||
// reset flag that we are compiling a template function
|
||||
$compiler->compiles_template_function = false;
|
||||
// restore old compiler status
|
||||
$compiler->parser->current_buffer = $saved_data[1];
|
||||
$compiler->template->has_nocache_code = $compiler->template->has_nocache_code | $saved_data[2];
|
||||
$compiler->template->required_plugins = $saved_data[3];
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,255 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Smarty Internal Plugin Compile Include
|
||||
*
|
||||
* Compiles the {include} tag
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Compiler
|
||||
* @author Uwe Tews
|
||||
*/
|
||||
|
||||
/**
|
||||
* Smarty Internal Plugin Compile Include Class
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Compiler
|
||||
*/
|
||||
class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
|
||||
{
|
||||
/**
|
||||
* caching mode to create nocache code but no cache file
|
||||
*/
|
||||
const CACHING_NOCACHE_CODE = 9999;
|
||||
/**
|
||||
* Attribute definition: Overwrites base class.
|
||||
*
|
||||
* @var array
|
||||
* @see Smarty_Internal_CompileBase
|
||||
*/
|
||||
public $required_attributes = array('file');
|
||||
/**
|
||||
* Attribute definition: Overwrites base class.
|
||||
*
|
||||
* @var array
|
||||
* @see Smarty_Internal_CompileBase
|
||||
*/
|
||||
public $shorttag_order = array('file');
|
||||
/**
|
||||
* Attribute definition: Overwrites base class.
|
||||
*
|
||||
* @var array
|
||||
* @see Smarty_Internal_CompileBase
|
||||
*/
|
||||
public $option_flags = array('nocache', 'inline', 'caching');
|
||||
/**
|
||||
* Attribute definition: Overwrites base class.
|
||||
*
|
||||
* @var array
|
||||
* @see Smarty_Internal_CompileBase
|
||||
*/
|
||||
public $optional_attributes = array('_any');
|
||||
|
||||
/**
|
||||
* Compiles code for the {include} tag
|
||||
*
|
||||
* @param array $args array with attributes from parser
|
||||
* @param object $compiler compiler object
|
||||
* @param array $parameter array with compilation parameter
|
||||
* @return string compiled code
|
||||
*/
|
||||
public function compile($args, $compiler, $parameter)
|
||||
{
|
||||
// check and get attributes
|
||||
$_attr = $this->getAttributes($compiler, $args);
|
||||
// save posible attributes
|
||||
$include_file = $_attr['file'];
|
||||
|
||||
if (isset($_attr['assign'])) {
|
||||
// output will be stored in a smarty variable instead of beind displayed
|
||||
$_assign = $_attr['assign'];
|
||||
}
|
||||
|
||||
$_parent_scope = Smarty::SCOPE_LOCAL;
|
||||
if (isset($_attr['scope'])) {
|
||||
$_attr['scope'] = trim($_attr['scope'], "'\"");
|
||||
if ($_attr['scope'] == 'parent') {
|
||||
$_parent_scope = Smarty::SCOPE_PARENT;
|
||||
} elseif ($_attr['scope'] == 'root') {
|
||||
$_parent_scope = Smarty::SCOPE_ROOT;
|
||||
} elseif ($_attr['scope'] == 'global') {
|
||||
$_parent_scope = Smarty::SCOPE_GLOBAL;
|
||||
}
|
||||
}
|
||||
|
||||
$_caching = Smarty::CACHING_OFF;
|
||||
|
||||
// flag if included template code should be merged into caller
|
||||
$merge_compiled_includes = ($compiler->smarty->merge_compiled_includes || $_attr['inline'] === true) && !$compiler->template->source->recompiled;
|
||||
|
||||
// set default when in nocache mode
|
||||
// if ($compiler->template->caching && ($compiler->nocache || $compiler->tag_nocache || $compiler->forceNocache == 2)) {
|
||||
if ($compiler->template->caching && ((!$compiler->inheritance && !$compiler->nocache && !$compiler->tag_nocache) || ($compiler->inheritance && ($compiler->nocache ||$compiler->tag_nocache)))) {
|
||||
$_caching = self::CACHING_NOCACHE_CODE;
|
||||
}
|
||||
/*
|
||||
* if the {include} tag provides individual parameter for caching
|
||||
* it will not be included into the common cache file and treated like
|
||||
* a nocache section
|
||||
*/
|
||||
if (isset($_attr['cache_lifetime'])) {
|
||||
$_cache_lifetime = $_attr['cache_lifetime'];
|
||||
$compiler->tag_nocache = true;
|
||||
$_caching = Smarty::CACHING_LIFETIME_CURRENT;
|
||||
} else {
|
||||
$_cache_lifetime = 'null';
|
||||
}
|
||||
if (isset($_attr['cache_id'])) {
|
||||
$_cache_id = $_attr['cache_id'];
|
||||
$compiler->tag_nocache = true;
|
||||
$_caching = Smarty::CACHING_LIFETIME_CURRENT;
|
||||
} else {
|
||||
$_cache_id = '$_smarty_tpl->cache_id';
|
||||
}
|
||||
if (isset($_attr['compile_id'])) {
|
||||
$_compile_id = $_attr['compile_id'];
|
||||
} else {
|
||||
$_compile_id = '$_smarty_tpl->compile_id';
|
||||
}
|
||||
if ($_attr['caching'] === true) {
|
||||
$_caching = Smarty::CACHING_LIFETIME_CURRENT;
|
||||
}
|
||||
if ($_attr['nocache'] === true) {
|
||||
$compiler->tag_nocache = true;
|
||||
if ($merge_compiled_includes || $compiler->inheritance) {
|
||||
$_caching = self::CACHING_NOCACHE_CODE;
|
||||
} else {
|
||||
$_caching = Smarty::CACHING_OFF;
|
||||
}
|
||||
}
|
||||
|
||||
$has_compiled_template = false;
|
||||
if ($merge_compiled_includes || $compiler->inheritance) {
|
||||
// variable template name ?
|
||||
if ($compiler->has_variable_string || !((substr_count($include_file, '"') == 2 || substr_count($include_file, "'") == 2))
|
||||
|| substr_count($include_file, '(') != 0 || substr_count($include_file, '$_smarty_tpl->') != 0
|
||||
) {
|
||||
$merge_compiled_includes = false;
|
||||
if ($compiler->inheritance) {
|
||||
$compiler->trigger_template_error(' variable template file names not allow within {block} tags');
|
||||
}
|
||||
}
|
||||
// variable compile_id?
|
||||
if (isset($_attr['compile_id'])) {
|
||||
if (!((substr_count($_attr['compile_id'], '"') == 2 || substr_count($_attr['compile_id'], "'") == 2))
|
||||
|| substr_count($_attr['compile_id'], '(') != 0 || substr_count($_attr['compile_id'], '$_smarty_tpl->') != 0
|
||||
) {
|
||||
$merge_compiled_includes = false;
|
||||
if ($compiler->inheritance) {
|
||||
$compiler->trigger_template_error(' variable compile_id not allow within {block} tags');
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($compiler->template->caching && ($compiler->tag_nocache || $compiler->nocache) && $_caching != self::CACHING_NOCACHE_CODE) {
|
||||
$merge_compiled_includes = false;
|
||||
if ($compiler->inheritance) {
|
||||
$compiler->trigger_template_error(' invalid caching mode of subtemplate within {block} tags');
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($merge_compiled_includes || $compiler->inheritance) {
|
||||
// we must observe different compile_id
|
||||
$uid = sha1($_compile_id);
|
||||
$tpl_name = null;
|
||||
$nocache = false;
|
||||
eval("\$tpl_name = $include_file;");
|
||||
if (!isset($compiler->smarty->merged_templates_func[$tpl_name][$uid]) || $compiler->inheritance) {
|
||||
$tpl = new $compiler->smarty->template_class ($tpl_name, $compiler->smarty, $compiler->template, $compiler->template->cache_id, $compiler->template->compile_id);
|
||||
// save unique function name
|
||||
$compiler->smarty->merged_templates_func[$tpl_name][$uid]['func'] = $tpl->properties['unifunc'] = 'content_' . str_replace('.', '_', uniqid('', true));
|
||||
// use current nocache hash for inlined code
|
||||
$compiler->smarty->merged_templates_func[$tpl_name][$uid]['nocache_hash'] = $tpl->properties['nocache_hash'] = $compiler->template->properties['nocache_hash'];
|
||||
if ($compiler->template->caching && $_caching == self::CACHING_NOCACHE_CODE) {
|
||||
// all code must be nocache
|
||||
$nocache = true;
|
||||
}
|
||||
if ($compiler->inheritance) {
|
||||
$tpl->compiler->inheritance = true;
|
||||
}
|
||||
// make sure whole chain gets compiled
|
||||
$tpl->mustCompile = true;
|
||||
if (!($tpl->source->uncompiled) && $tpl->source->exists) {
|
||||
|
||||
|
||||
// get compiled code
|
||||
$compiled_code = $tpl->compiler->compileTemplate($tpl, $nocache);
|
||||
// release compiler object to free memory
|
||||
unset($tpl->compiler);
|
||||
// merge compiled code for {function} tags
|
||||
$compiler->template->properties['function'] = array_merge($compiler->template->properties['function'], $tpl->properties['function']);
|
||||
// merge filedependency
|
||||
$tpl->properties['file_dependency'][$tpl->source->uid] = array($tpl->source->filepath, $tpl->source->timestamp, $tpl->source->type);
|
||||
$compiler->template->properties['file_dependency'] = array_merge($compiler->template->properties['file_dependency'], $tpl->properties['file_dependency']);
|
||||
// remove header code
|
||||
$compiled_code = preg_replace("/(<\?php \/\*%%SmartyHeaderCode:{$tpl->properties['nocache_hash']}%%\*\/(.+?)\/\*\/%%SmartyHeaderCode%%\*\/\?>\n)/s", '', $compiled_code);
|
||||
if ($tpl->has_nocache_code) {
|
||||
// replace nocache_hash
|
||||
$compiled_code = str_replace("{$tpl->properties['nocache_hash']}", $compiler->template->properties['nocache_hash'], $compiled_code);
|
||||
$compiler->template->has_nocache_code = true;
|
||||
}
|
||||
$compiler->merged_templates[$tpl->properties['unifunc']] = $compiled_code;
|
||||
$has_compiled_template = true;
|
||||
unset ($tpl);
|
||||
}
|
||||
} else {
|
||||
$has_compiled_template = true;
|
||||
}
|
||||
}
|
||||
// delete {include} standard attributes
|
||||
unset($_attr['file'], $_attr['assign'], $_attr['cache_id'], $_attr['compile_id'], $_attr['cache_lifetime'], $_attr['nocache'], $_attr['caching'], $_attr['scope'], $_attr['inline']);
|
||||
// remaining attributes must be assigned as smarty variable
|
||||
if (!empty($_attr)) {
|
||||
if ($_parent_scope == Smarty::SCOPE_LOCAL) {
|
||||
// create variables
|
||||
foreach ($_attr as $key => $value) {
|
||||
$_pairs[] = "'$key'=>$value";
|
||||
}
|
||||
$_vars = 'array(' . join(',', $_pairs) . ')';
|
||||
$_has_vars = true;
|
||||
} else {
|
||||
$compiler->trigger_template_error('variable passing not allowed in parent/global scope', $compiler->lex->taglineno);
|
||||
}
|
||||
} else {
|
||||
$_vars = 'array()';
|
||||
$_has_vars = false;
|
||||
}
|
||||
if ($has_compiled_template) {
|
||||
// never call inline templates in nocache mode
|
||||
$compiler->suppressNocacheProcessing = true;
|
||||
$_hash = $compiler->smarty->merged_templates_func[$tpl_name][$uid]['nocache_hash'];
|
||||
$_output = "<?php /* Call merged included template \"" . $tpl_name . "\" */\n";
|
||||
$_output .= "\$_tpl_stack[] = \$_smarty_tpl;\n";
|
||||
$_output .= " \$_smarty_tpl = \$_smarty_tpl->setupInlineSubTemplate($include_file, $_cache_id, $_compile_id, $_caching, $_cache_lifetime, $_vars, $_parent_scope, '$_hash');\n";
|
||||
if (isset($_assign)) {
|
||||
$_output .= 'ob_start(); ';
|
||||
}
|
||||
$_output .= $compiler->smarty->merged_templates_func[$tpl_name][$uid]['func'] . "(\$_smarty_tpl);\n";
|
||||
$_output .= "\$_smarty_tpl = array_pop(\$_tpl_stack); ";
|
||||
if (isset($_assign)) {
|
||||
$_output .= " \$_smarty_tpl->tpl_vars[$_assign] = new Smarty_variable(ob_get_clean());";
|
||||
}
|
||||
$_output .= "\n/* End of included template \"" . $tpl_name . "\" */?>";
|
||||
|
||||
return $_output;
|
||||
}
|
||||
|
||||
// was there an assign attribute
|
||||
if (isset($_assign)) {
|
||||
$_output = "<?php \$_smarty_tpl->tpl_vars[$_assign] = new Smarty_variable(\$_smarty_tpl->getSubTemplate ($include_file, $_cache_id, $_compile_id, $_caching, $_cache_lifetime, $_vars, $_parent_scope));?>\n";;
|
||||
} else {
|
||||
$_output = "<?php echo \$_smarty_tpl->getSubTemplate ($include_file, $_cache_id, $_compile_id, $_caching, $_cache_lifetime, $_vars, $_parent_scope);?>\n";
|
||||
}
|
||||
|
||||
return $_output;
|
||||
}
|
||||
}
|
||||
@@ -1,114 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Smarty Internal Plugin Compile Special Smarty Variable
|
||||
*
|
||||
* Compiles the special $smarty variables
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Compiler
|
||||
* @author Uwe Tews
|
||||
*/
|
||||
|
||||
/**
|
||||
* Smarty Internal Plugin Compile special Smarty Variable Class
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Compiler
|
||||
*/
|
||||
class Smarty_Internal_Compile_Private_Special_Variable extends Smarty_Internal_CompileBase
|
||||
{
|
||||
/**
|
||||
* Compiles code for the speical $smarty variables
|
||||
*
|
||||
* @param array $args array with attributes from parser
|
||||
* @param object $compiler compiler object
|
||||
* @return string compiled code
|
||||
*/
|
||||
public function compile($args, $compiler, $parameter)
|
||||
{
|
||||
$_index = preg_split("/\]\[/",substr($parameter, 1, strlen($parameter)-2));
|
||||
$compiled_ref = ' ';
|
||||
$variable = trim($_index[0], "'");
|
||||
switch ($variable) {
|
||||
case 'foreach':
|
||||
return "\$_smarty_tpl->getVariable('smarty')->value$parameter";
|
||||
case 'section':
|
||||
return "\$_smarty_tpl->getVariable('smarty')->value$parameter";
|
||||
case 'capture':
|
||||
return "Smarty::\$_smarty_vars$parameter";
|
||||
case 'now':
|
||||
return 'time()';
|
||||
case 'cookies':
|
||||
if (isset($compiler->smarty->security_policy) && !$compiler->smarty->security_policy->allow_super_globals) {
|
||||
$compiler->trigger_template_error("(secure mode) super globals not permitted");
|
||||
break;
|
||||
}
|
||||
$compiled_ref = '$_COOKIE';
|
||||
break;
|
||||
|
||||
case 'get':
|
||||
case 'post':
|
||||
case 'env':
|
||||
case 'server':
|
||||
case 'session':
|
||||
case 'request':
|
||||
if (isset($compiler->smarty->security_policy) && !$compiler->smarty->security_policy->allow_super_globals) {
|
||||
$compiler->trigger_template_error("(secure mode) super globals not permitted");
|
||||
break;
|
||||
}
|
||||
$compiled_ref = '$_'.strtoupper($variable);
|
||||
break;
|
||||
|
||||
case 'template':
|
||||
return 'basename($_smarty_tpl->source->filepath)';
|
||||
|
||||
case 'template_object':
|
||||
return '$_smarty_tpl';
|
||||
|
||||
case 'current_dir':
|
||||
return 'dirname($_smarty_tpl->source->filepath)';
|
||||
|
||||
case 'version':
|
||||
$_version = Smarty::SMARTY_VERSION;
|
||||
|
||||
return "'$_version'";
|
||||
|
||||
case 'const':
|
||||
if (isset($compiler->smarty->security_policy) && !$compiler->smarty->security_policy->allow_constants) {
|
||||
$compiler->trigger_template_error("(secure mode) constants not permitted");
|
||||
break;
|
||||
}
|
||||
|
||||
return "@constant({$_index[1]})";
|
||||
|
||||
case 'config':
|
||||
if (isset($_index[2])) {
|
||||
return "(is_array(\$tmp = \$_smarty_tpl->getConfigVariable($_index[1])) ? \$tmp[$_index[2]] : null)";
|
||||
} else {
|
||||
return "\$_smarty_tpl->getConfigVariable($_index[1])";
|
||||
}
|
||||
case 'ldelim':
|
||||
$_ldelim = $compiler->smarty->left_delimiter;
|
||||
|
||||
return "'$_ldelim'";
|
||||
|
||||
case 'rdelim':
|
||||
$_rdelim = $compiler->smarty->right_delimiter;
|
||||
|
||||
return "'$_rdelim'";
|
||||
|
||||
default:
|
||||
$compiler->trigger_template_error('$smarty.' . trim($_index[0], "'") . ' is invalid');
|
||||
break;
|
||||
}
|
||||
if (isset($_index[1])) {
|
||||
array_shift($_index);
|
||||
foreach ($_index as $_ind) {
|
||||
$compiled_ref = $compiled_ref . "[$_ind]";
|
||||
}
|
||||
}
|
||||
|
||||
return $compiled_ref;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,305 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Smarty Internal Plugin Config
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Config
|
||||
* @author Uwe Tews
|
||||
*/
|
||||
|
||||
/**
|
||||
* Smarty Internal Plugin Config
|
||||
*
|
||||
* Main class for config variables
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Config
|
||||
*
|
||||
* @property Smarty_Config_Source $source
|
||||
* @property Smarty_Config_Compiled $compiled
|
||||
* @ignore
|
||||
*/
|
||||
class Smarty_Internal_Config
|
||||
{
|
||||
/**
|
||||
* Samrty instance
|
||||
*
|
||||
* @var Smarty object
|
||||
*/
|
||||
public $smarty = null;
|
||||
/**
|
||||
* Object of config var storage
|
||||
*
|
||||
* @var object
|
||||
*/
|
||||
public $data = null;
|
||||
/**
|
||||
* Config resource
|
||||
* @var string
|
||||
*/
|
||||
public $config_resource = null;
|
||||
/**
|
||||
* Compiled config file
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $compiled_config = null;
|
||||
/**
|
||||
* filepath of compiled config file
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $compiled_filepath = null;
|
||||
/**
|
||||
* Filemtime of compiled config Filemtime
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $compiled_timestamp = null;
|
||||
/**
|
||||
* flag if compiled config file is invalid and must be (re)compiled
|
||||
* @var bool
|
||||
*/
|
||||
public $mustCompile = null;
|
||||
/**
|
||||
* Config file compiler object
|
||||
*
|
||||
* @var Smarty_Internal_Config_File_Compiler object
|
||||
*/
|
||||
public $compiler_object = null;
|
||||
|
||||
/**
|
||||
* Constructor of config file object
|
||||
*
|
||||
* @param string $config_resource config file resource name
|
||||
* @param Smarty $smarty Smarty instance
|
||||
* @param object $data object for config vars storage
|
||||
*/
|
||||
public function __construct($config_resource, $smarty, $data = null)
|
||||
{
|
||||
$this->data = $data;
|
||||
$this->smarty = $smarty;
|
||||
$this->config_resource = $config_resource;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the compiled filepath
|
||||
*
|
||||
* @return string the compiled filepath
|
||||
*/
|
||||
public function getCompiledFilepath()
|
||||
{
|
||||
return $this->compiled_filepath === null ?
|
||||
($this->compiled_filepath = $this->buildCompiledFilepath()) :
|
||||
$this->compiled_filepath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get file path.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function buildCompiledFilepath()
|
||||
{
|
||||
$_compile_id = isset($this->smarty->compile_id) ? preg_replace('![^\w\|]+!', '_', $this->smarty->compile_id) : null;
|
||||
$_flag = (int) $this->smarty->config_read_hidden + (int) $this->smarty->config_booleanize * 2
|
||||
+ (int) $this->smarty->config_overwrite * 4;
|
||||
$_filepath = sha1($this->source->filepath . $_flag);
|
||||
// if use_sub_dirs, break file into directories
|
||||
if ($this->smarty->use_sub_dirs) {
|
||||
$_filepath = substr($_filepath, 0, 2) . DS
|
||||
. substr($_filepath, 2, 2) . DS
|
||||
. substr($_filepath, 4, 2) . DS
|
||||
. $_filepath;
|
||||
}
|
||||
$_compile_dir_sep = $this->smarty->use_sub_dirs ? DS : '^';
|
||||
if (isset($_compile_id)) {
|
||||
$_filepath = $_compile_id . $_compile_dir_sep . $_filepath;
|
||||
}
|
||||
$_compile_dir = $this->smarty->getCompileDir();
|
||||
|
||||
return $_compile_dir . $_filepath . '.' . basename($this->source->name) . '.config' . '.php';
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the timpestamp of the compiled file
|
||||
*
|
||||
* @return integer the file timestamp
|
||||
*/
|
||||
public function getCompiledTimestamp()
|
||||
{
|
||||
return $this->compiled_timestamp === null
|
||||
? ($this->compiled_timestamp = (file_exists($this->getCompiledFilepath())) ? filemtime($this->getCompiledFilepath()) : false)
|
||||
: $this->compiled_timestamp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns if the current config file must be compiled
|
||||
*
|
||||
* It does compare the timestamps of config source and the compiled config and checks the force compile configuration
|
||||
*
|
||||
* @return boolean true if the file must be compiled
|
||||
*/
|
||||
public function mustCompile()
|
||||
{
|
||||
return $this->mustCompile === null ?
|
||||
$this->mustCompile = ($this->smarty->force_compile || $this->getCompiledTimestamp () === false || $this->smarty->compile_check && $this->getCompiledTimestamp () < $this->source->timestamp):
|
||||
$this->mustCompile;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the compiled config file
|
||||
*
|
||||
* It checks if the config file must be compiled or just read the compiled version
|
||||
*
|
||||
* @return string the compiled config file
|
||||
*/
|
||||
public function getCompiledConfig()
|
||||
{
|
||||
if ($this->compiled_config === null) {
|
||||
// see if template needs compiling.
|
||||
if ($this->mustCompile()) {
|
||||
$this->compileConfigSource();
|
||||
} else {
|
||||
$this->compiled_config = file_get_contents($this->getCompiledFilepath());
|
||||
}
|
||||
}
|
||||
|
||||
return $this->compiled_config;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compiles the config files
|
||||
*
|
||||
* @throws Exception
|
||||
*/
|
||||
public function compileConfigSource()
|
||||
{
|
||||
// compile template
|
||||
if (!is_object($this->compiler_object)) {
|
||||
// load compiler
|
||||
$this->compiler_object = new Smarty_Internal_Config_File_Compiler($this->smarty);
|
||||
}
|
||||
// compile locking
|
||||
if ($this->smarty->compile_locking) {
|
||||
if ($saved_timestamp = $this->getCompiledTimestamp()) {
|
||||
touch($this->getCompiledFilepath());
|
||||
}
|
||||
}
|
||||
// call compiler
|
||||
try {
|
||||
$this->compiler_object->compileSource($this);
|
||||
} catch (Exception $e) {
|
||||
// restore old timestamp in case of error
|
||||
if ($this->smarty->compile_locking && $saved_timestamp) {
|
||||
touch($this->getCompiledFilepath(), $saved_timestamp);
|
||||
}
|
||||
throw $e;
|
||||
}
|
||||
// compiling succeded
|
||||
// write compiled template
|
||||
Smarty_Internal_Write_File::writeFile($this->getCompiledFilepath(), $this->getCompiledConfig(), $this->smarty);
|
||||
}
|
||||
|
||||
/**
|
||||
* load config variables
|
||||
*
|
||||
* @param mixed $sections array of section names, single section or null
|
||||
* @param object $scope global,parent or local
|
||||
*/
|
||||
public function loadConfigVars($sections = null, $scope = 'local')
|
||||
{
|
||||
if ($this->data instanceof Smarty_Internal_Template) {
|
||||
$this->data->properties['file_dependency'][sha1($this->source->filepath)] = array($this->source->filepath, $this->source->timestamp, 'file');
|
||||
}
|
||||
if ($this->mustCompile()) {
|
||||
$this->compileConfigSource();
|
||||
}
|
||||
// pointer to scope
|
||||
if ($scope == 'local') {
|
||||
$scope_ptr = $this->data;
|
||||
} elseif ($scope == 'parent') {
|
||||
if (isset($this->data->parent)) {
|
||||
$scope_ptr = $this->data->parent;
|
||||
} else {
|
||||
$scope_ptr = $this->data;
|
||||
}
|
||||
} elseif ($scope == 'root' || $scope == 'global') {
|
||||
$scope_ptr = $this->data;
|
||||
while (isset($scope_ptr->parent)) {
|
||||
$scope_ptr = $scope_ptr->parent;
|
||||
}
|
||||
}
|
||||
$_config_vars = array();
|
||||
include($this->getCompiledFilepath());
|
||||
// copy global config vars
|
||||
foreach ($_config_vars['vars'] as $variable => $value) {
|
||||
if ($this->smarty->config_overwrite || !isset($scope_ptr->config_vars[$variable])) {
|
||||
$scope_ptr->config_vars[$variable] = $value;
|
||||
} else {
|
||||
$scope_ptr->config_vars[$variable] = array_merge((array) $scope_ptr->config_vars[$variable], (array) $value);
|
||||
}
|
||||
}
|
||||
// scan sections
|
||||
if (!empty($sections)) {
|
||||
foreach ((array) $sections as $this_section) {
|
||||
if (isset($_config_vars['sections'][$this_section])) {
|
||||
foreach ($_config_vars['sections'][$this_section]['vars'] as $variable => $value) {
|
||||
if ($this->smarty->config_overwrite || !isset($scope_ptr->config_vars[$variable])) {
|
||||
$scope_ptr->config_vars[$variable] = $value;
|
||||
} else {
|
||||
$scope_ptr->config_vars[$variable] = array_merge((array) $scope_ptr->config_vars[$variable], (array) $value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* set Smarty property in template context
|
||||
*
|
||||
* @param string $property_name property name
|
||||
* @param mixed $value value
|
||||
* @throws SmartyException if $property_name is not valid
|
||||
*/
|
||||
public function __set($property_name, $value)
|
||||
{
|
||||
switch ($property_name) {
|
||||
case 'source':
|
||||
case 'compiled':
|
||||
$this->$property_name = $value;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
throw new SmartyException("invalid config property '$property_name'.");
|
||||
}
|
||||
|
||||
/**
|
||||
* get Smarty property in template context
|
||||
*
|
||||
* @param string $property_name property name
|
||||
* @throws SmartyException if $property_name is not valid
|
||||
*/
|
||||
public function __get($property_name)
|
||||
{
|
||||
switch ($property_name) {
|
||||
case 'source':
|
||||
if (empty($this->config_resource)) {
|
||||
throw new SmartyException("Unable to parse resource name \"{$this->config_resource}\"");
|
||||
}
|
||||
$this->source = Smarty_Resource::config($this);
|
||||
|
||||
return $this->source;
|
||||
|
||||
case 'compiled':
|
||||
$this->compiled = $this->source->getCompiled($this);
|
||||
|
||||
return $this->compiled;
|
||||
}
|
||||
|
||||
throw new SmartyException("config attribute '$property_name' does not exist.");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,142 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Smarty Internal Plugin Config File Compiler
|
||||
*
|
||||
* This is the config file compiler class. It calls the lexer and parser to
|
||||
* perform the compiling.
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Config
|
||||
* @author Uwe Tews
|
||||
*/
|
||||
|
||||
/**
|
||||
* Main config file compiler class
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Config
|
||||
*/
|
||||
class Smarty_Internal_Config_File_Compiler
|
||||
{
|
||||
/**
|
||||
* Lexer object
|
||||
*
|
||||
* @var object
|
||||
*/
|
||||
public $lex;
|
||||
|
||||
/**
|
||||
* Parser object
|
||||
*
|
||||
* @var object
|
||||
*/
|
||||
public $parser;
|
||||
|
||||
/**
|
||||
* Smarty object
|
||||
*
|
||||
* @var Smarty object
|
||||
*/
|
||||
public $smarty;
|
||||
|
||||
/**
|
||||
* Smarty object
|
||||
*
|
||||
* @var Smarty_Internal_Config object
|
||||
*/
|
||||
public $config;
|
||||
|
||||
/**
|
||||
* Compiled config data sections and variables
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $config_data = array();
|
||||
|
||||
/**
|
||||
* Initialize compiler
|
||||
*
|
||||
* @param Smarty $smarty base instance
|
||||
*/
|
||||
public function __construct($smarty)
|
||||
{
|
||||
$this->smarty = $smarty;
|
||||
$this->config_data['sections'] = array();
|
||||
$this->config_data['vars'] = array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to compile a Smarty template.
|
||||
*
|
||||
* @param Smarty_Internal_Config $config config object
|
||||
* @return bool true if compiling succeeded, false if it failed
|
||||
*/
|
||||
public function compileSource(Smarty_Internal_Config $config)
|
||||
{
|
||||
/* here is where the compiling takes place. Smarty
|
||||
tags in the templates are replaces with PHP code,
|
||||
then written to compiled files. */
|
||||
$this->config = $config;
|
||||
// get config file source
|
||||
$_content = $config->source->content . "\n";
|
||||
// on empty template just return
|
||||
if ($_content == '') {
|
||||
return true;
|
||||
}
|
||||
// init the lexer/parser to compile the config file
|
||||
$lex = new Smarty_Internal_Configfilelexer($_content, $this->smarty);
|
||||
$parser = new Smarty_Internal_Configfileparser($lex, $this);
|
||||
if ($this->smarty->_parserdebug) $parser->PrintTrace();
|
||||
// get tokens from lexer and parse them
|
||||
while ($lex->yylex()) {
|
||||
if ($this->smarty->_parserdebug) echo "<br>Parsing {$parser->yyTokenName[$lex->token]} Token {$lex->value} Line {$lex->line} \n";
|
||||
$parser->doParse($lex->token, $lex->value);
|
||||
}
|
||||
// finish parsing process
|
||||
$parser->doParse(0, 0);
|
||||
$config->compiled_config = '<?php $_config_vars = ' . var_export($this->config_data, true) . '; ?>';
|
||||
}
|
||||
|
||||
/**
|
||||
* display compiler error messages without dying
|
||||
*
|
||||
* If parameter $args is empty it is a parser detected syntax error.
|
||||
* In this case the parser is called to obtain information about exspected tokens.
|
||||
*
|
||||
* If parameter $args contains a string this is used as error message
|
||||
*
|
||||
* @param string $args individual error message or null
|
||||
*/
|
||||
public function trigger_config_file_error($args = null)
|
||||
{
|
||||
$this->lex = Smarty_Internal_Configfilelexer::instance();
|
||||
$this->parser = Smarty_Internal_Configfileparser::instance();
|
||||
// get template source line which has error
|
||||
$line = $this->lex->line;
|
||||
if (isset($args)) {
|
||||
// $line--;
|
||||
}
|
||||
$match = preg_split("/\n/", $this->lex->data);
|
||||
$error_text = "Syntax error in config file '{$this->config->source->filepath}' on line {$line} '{$match[$line-1]}' ";
|
||||
if (isset($args)) {
|
||||
// individual error message
|
||||
$error_text .= $args;
|
||||
} else {
|
||||
// exspected token from parser
|
||||
foreach ($this->parser->yy_get_expected_tokens($this->parser->yymajor) as $token) {
|
||||
$exp_token = $this->parser->yyTokenName[$token];
|
||||
if (isset($this->lex->smarty_token_names[$exp_token])) {
|
||||
// token type from lexer
|
||||
$expect[] = '"' . $this->lex->smarty_token_names[$exp_token] . '"';
|
||||
} else {
|
||||
// otherwise internal token name
|
||||
$expect[] = $this->parser->yyTokenName[$token];
|
||||
}
|
||||
}
|
||||
// output parser error message
|
||||
$error_text .= ' - Unexpected "' . $this->lex->value . '", expected one of: ' . implode(' , ', $expect);
|
||||
}
|
||||
throw new SmartyCompilerException($error_text);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,598 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Smarty Internal Plugin Configfilelexer
|
||||
*
|
||||
* This is the lexer to break the config file source into tokens
|
||||
* @package Smarty
|
||||
* @subpackage Config
|
||||
* @author Uwe Tews
|
||||
*/
|
||||
/**
|
||||
* Smarty Internal Plugin Configfilelexer
|
||||
*/
|
||||
class Smarty_Internal_Configfilelexer
|
||||
{
|
||||
|
||||
public $data;
|
||||
public $counter;
|
||||
public $token;
|
||||
public $value;
|
||||
public $node;
|
||||
public $line;
|
||||
private $state = 1;
|
||||
public $smarty_token_names = array ( // Text for parser error messages
|
||||
);
|
||||
|
||||
public function __construct($data, $smarty)
|
||||
{
|
||||
// set instance object
|
||||
self::instance($this);
|
||||
$this->data = $data . "\n"; //now all lines are \n-terminated
|
||||
$this->counter = 0;
|
||||
$this->line = 1;
|
||||
$this->smarty = $smarty;
|
||||
$this->mbstring_overload = ini_get('mbstring.func_overload') & 2;
|
||||
}
|
||||
public static function &instance($new_instance = null)
|
||||
{
|
||||
static $instance = null;
|
||||
if (isset($new_instance) && is_object($new_instance))
|
||||
$instance = $new_instance;
|
||||
|
||||
return $instance;
|
||||
}
|
||||
|
||||
private $_yy_state = 1;
|
||||
private $_yy_stack = array();
|
||||
|
||||
public function yylex()
|
||||
{
|
||||
return $this->{'yylex' . $this->_yy_state}();
|
||||
}
|
||||
|
||||
public function yypushstate($state)
|
||||
{
|
||||
array_push($this->_yy_stack, $this->_yy_state);
|
||||
$this->_yy_state = $state;
|
||||
}
|
||||
|
||||
public function yypopstate()
|
||||
{
|
||||
$this->_yy_state = array_pop($this->_yy_stack);
|
||||
}
|
||||
|
||||
public function yybegin($state)
|
||||
{
|
||||
$this->_yy_state = $state;
|
||||
}
|
||||
|
||||
public function yylex1()
|
||||
{
|
||||
$tokenMap = array (
|
||||
1 => 0,
|
||||
2 => 0,
|
||||
3 => 0,
|
||||
4 => 0,
|
||||
5 => 0,
|
||||
6 => 0,
|
||||
7 => 0,
|
||||
8 => 0,
|
||||
);
|
||||
if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
|
||||
return false; // end of input
|
||||
}
|
||||
$yy_global_pattern = "/\G(#|;)|\G(\\[)|\G(\\])|\G(=)|\G([ \t\r]+)|\G(\n)|\G([0-9]*[a-zA-Z_]\\w*)|\G([\S\s])/iS";
|
||||
|
||||
do {
|
||||
if ($this->mbstring_overload ? preg_match($yy_global_pattern, mb_substr($this->data, $this->counter,2000000000,'latin1'), $yymatches) : preg_match($yy_global_pattern,$this->data, $yymatches, null, $this->counter)) {
|
||||
$yysubmatches = $yymatches;
|
||||
$yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
|
||||
if (!count($yymatches)) {
|
||||
throw new Exception('Error: lexing failed because a rule matched' .
|
||||
' an empty string. Input "' . substr($this->data,
|
||||
$this->counter, 5) . '... state START');
|
||||
}
|
||||
next($yymatches); // skip global match
|
||||
$this->token = key($yymatches); // token number
|
||||
if ($tokenMap[$this->token]) {
|
||||
// extract sub-patterns for passing to lex function
|
||||
$yysubmatches = array_slice($yysubmatches, $this->token + 1,
|
||||
$tokenMap[$this->token]);
|
||||
} else {
|
||||
$yysubmatches = array();
|
||||
}
|
||||
$this->value = current($yymatches); // token value
|
||||
$r = $this->{'yy_r1_' . $this->token}($yysubmatches);
|
||||
if ($r === null) {
|
||||
$this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
|
||||
$this->line += substr_count($this->value, "\n");
|
||||
// accept this token
|
||||
return true;
|
||||
} elseif ($r === true) {
|
||||
// we have changed state
|
||||
// process this token in the new state
|
||||
return $this->yylex();
|
||||
} elseif ($r === false) {
|
||||
$this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
|
||||
$this->line += substr_count($this->value, "\n");
|
||||
if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
|
||||
return false; // end of input
|
||||
}
|
||||
// skip this token
|
||||
continue;
|
||||
} } else {
|
||||
throw new Exception('Unexpected input at line' . $this->line .
|
||||
': ' . $this->data[$this->counter]);
|
||||
}
|
||||
break;
|
||||
} while (true);
|
||||
|
||||
} // end function
|
||||
|
||||
const START = 1;
|
||||
public function yy_r1_1($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = Smarty_Internal_Configfileparser::TPC_COMMENTSTART;
|
||||
$this->yypushstate(self::COMMENT);
|
||||
}
|
||||
public function yy_r1_2($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = Smarty_Internal_Configfileparser::TPC_OPENB;
|
||||
$this->yypushstate(self::SECTION);
|
||||
}
|
||||
public function yy_r1_3($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = Smarty_Internal_Configfileparser::TPC_CLOSEB;
|
||||
}
|
||||
public function yy_r1_4($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = Smarty_Internal_Configfileparser::TPC_EQUAL;
|
||||
$this->yypushstate(self::VALUE);
|
||||
}
|
||||
public function yy_r1_5($yy_subpatterns)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
public function yy_r1_6($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = Smarty_Internal_Configfileparser::TPC_NEWLINE;
|
||||
}
|
||||
public function yy_r1_7($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = Smarty_Internal_Configfileparser::TPC_ID;
|
||||
}
|
||||
public function yy_r1_8($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = Smarty_Internal_Configfileparser::TPC_OTHER;
|
||||
}
|
||||
|
||||
public function yylex2()
|
||||
{
|
||||
$tokenMap = array (
|
||||
1 => 0,
|
||||
2 => 0,
|
||||
3 => 0,
|
||||
4 => 0,
|
||||
5 => 0,
|
||||
6 => 0,
|
||||
7 => 0,
|
||||
8 => 0,
|
||||
9 => 0,
|
||||
);
|
||||
if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
|
||||
return false; // end of input
|
||||
}
|
||||
$yy_global_pattern = "/\G([ \t\r]+)|\G(\\d+\\.\\d+(?=[ \t\r]*[\n#;]))|\G(\\d+(?=[ \t\r]*[\n#;]))|\G(\"\"\")|\G('[^'\\\\]*(?:\\\\.[^'\\\\]*)*'(?=[ \t\r]*[\n#;]))|\G(\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"(?=[ \t\r]*[\n#;]))|\G([a-zA-Z]+(?=[ \t\r]*[\n#;]))|\G([^\n]+?(?=[ \t\r]*\n))|\G(\n)/iS";
|
||||
|
||||
do {
|
||||
if ($this->mbstring_overload ? preg_match($yy_global_pattern, mb_substr($this->data, $this->counter,2000000000,'latin1'), $yymatches) : preg_match($yy_global_pattern,$this->data, $yymatches, null, $this->counter)) {
|
||||
$yysubmatches = $yymatches;
|
||||
$yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
|
||||
if (!count($yymatches)) {
|
||||
throw new Exception('Error: lexing failed because a rule matched' .
|
||||
' an empty string. Input "' . substr($this->data,
|
||||
$this->counter, 5) . '... state VALUE');
|
||||
}
|
||||
next($yymatches); // skip global match
|
||||
$this->token = key($yymatches); // token number
|
||||
if ($tokenMap[$this->token]) {
|
||||
// extract sub-patterns for passing to lex function
|
||||
$yysubmatches = array_slice($yysubmatches, $this->token + 1,
|
||||
$tokenMap[$this->token]);
|
||||
} else {
|
||||
$yysubmatches = array();
|
||||
}
|
||||
$this->value = current($yymatches); // token value
|
||||
$r = $this->{'yy_r2_' . $this->token}($yysubmatches);
|
||||
if ($r === null) {
|
||||
$this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
|
||||
$this->line += substr_count($this->value, "\n");
|
||||
// accept this token
|
||||
return true;
|
||||
} elseif ($r === true) {
|
||||
// we have changed state
|
||||
// process this token in the new state
|
||||
return $this->yylex();
|
||||
} elseif ($r === false) {
|
||||
$this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
|
||||
$this->line += substr_count($this->value, "\n");
|
||||
if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
|
||||
return false; // end of input
|
||||
}
|
||||
// skip this token
|
||||
continue;
|
||||
} } else {
|
||||
throw new Exception('Unexpected input at line' . $this->line .
|
||||
': ' . $this->data[$this->counter]);
|
||||
}
|
||||
break;
|
||||
} while (true);
|
||||
|
||||
} // end function
|
||||
|
||||
const VALUE = 2;
|
||||
public function yy_r2_1($yy_subpatterns)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
public function yy_r2_2($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = Smarty_Internal_Configfileparser::TPC_FLOAT;
|
||||
$this->yypopstate();
|
||||
}
|
||||
public function yy_r2_3($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = Smarty_Internal_Configfileparser::TPC_INT;
|
||||
$this->yypopstate();
|
||||
}
|
||||
public function yy_r2_4($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_QUOTES;
|
||||
$this->yypushstate(self::TRIPPLE);
|
||||
}
|
||||
public function yy_r2_5($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = Smarty_Internal_Configfileparser::TPC_SINGLE_QUOTED_STRING;
|
||||
$this->yypopstate();
|
||||
}
|
||||
public function yy_r2_6($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = Smarty_Internal_Configfileparser::TPC_DOUBLE_QUOTED_STRING;
|
||||
$this->yypopstate();
|
||||
}
|
||||
public function yy_r2_7($yy_subpatterns)
|
||||
{
|
||||
|
||||
if (!$this->smarty->config_booleanize || !in_array(strtolower($this->value), Array("true", "false", "on", "off", "yes", "no")) ) {
|
||||
$this->yypopstate();
|
||||
$this->yypushstate(self::NAKED_STRING_VALUE);
|
||||
|
||||
return true; //reprocess in new state
|
||||
} else {
|
||||
$this->token = Smarty_Internal_Configfileparser::TPC_BOOL;
|
||||
$this->yypopstate();
|
||||
}
|
||||
}
|
||||
public function yy_r2_8($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING;
|
||||
$this->yypopstate();
|
||||
}
|
||||
public function yy_r2_9($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING;
|
||||
$this->value = "";
|
||||
$this->yypopstate();
|
||||
}
|
||||
|
||||
public function yylex3()
|
||||
{
|
||||
$tokenMap = array (
|
||||
1 => 0,
|
||||
);
|
||||
if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
|
||||
return false; // end of input
|
||||
}
|
||||
$yy_global_pattern = "/\G([^\n]+?(?=[ \t\r]*\n))/iS";
|
||||
|
||||
do {
|
||||
if ($this->mbstring_overload ? preg_match($yy_global_pattern, mb_substr($this->data, $this->counter,2000000000,'latin1'), $yymatches) : preg_match($yy_global_pattern,$this->data, $yymatches, null, $this->counter)) {
|
||||
$yysubmatches = $yymatches;
|
||||
$yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
|
||||
if (!count($yymatches)) {
|
||||
throw new Exception('Error: lexing failed because a rule matched' .
|
||||
' an empty string. Input "' . substr($this->data,
|
||||
$this->counter, 5) . '... state NAKED_STRING_VALUE');
|
||||
}
|
||||
next($yymatches); // skip global match
|
||||
$this->token = key($yymatches); // token number
|
||||
if ($tokenMap[$this->token]) {
|
||||
// extract sub-patterns for passing to lex function
|
||||
$yysubmatches = array_slice($yysubmatches, $this->token + 1,
|
||||
$tokenMap[$this->token]);
|
||||
} else {
|
||||
$yysubmatches = array();
|
||||
}
|
||||
$this->value = current($yymatches); // token value
|
||||
$r = $this->{'yy_r3_' . $this->token}($yysubmatches);
|
||||
if ($r === null) {
|
||||
$this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
|
||||
$this->line += substr_count($this->value, "\n");
|
||||
// accept this token
|
||||
return true;
|
||||
} elseif ($r === true) {
|
||||
// we have changed state
|
||||
// process this token in the new state
|
||||
return $this->yylex();
|
||||
} elseif ($r === false) {
|
||||
$this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
|
||||
$this->line += substr_count($this->value, "\n");
|
||||
if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
|
||||
return false; // end of input
|
||||
}
|
||||
// skip this token
|
||||
continue;
|
||||
} } else {
|
||||
throw new Exception('Unexpected input at line' . $this->line .
|
||||
': ' . $this->data[$this->counter]);
|
||||
}
|
||||
break;
|
||||
} while (true);
|
||||
|
||||
} // end function
|
||||
|
||||
const NAKED_STRING_VALUE = 3;
|
||||
public function yy_r3_1($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING;
|
||||
$this->yypopstate();
|
||||
}
|
||||
|
||||
public function yylex4()
|
||||
{
|
||||
$tokenMap = array (
|
||||
1 => 0,
|
||||
2 => 0,
|
||||
3 => 0,
|
||||
);
|
||||
if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
|
||||
return false; // end of input
|
||||
}
|
||||
$yy_global_pattern = "/\G([ \t\r]+)|\G([^\n]+?(?=[ \t\r]*\n))|\G(\n)/iS";
|
||||
|
||||
do {
|
||||
if ($this->mbstring_overload ? preg_match($yy_global_pattern, mb_substr($this->data, $this->counter,2000000000,'latin1'), $yymatches) : preg_match($yy_global_pattern,$this->data, $yymatches, null, $this->counter)) {
|
||||
$yysubmatches = $yymatches;
|
||||
$yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
|
||||
if (!count($yymatches)) {
|
||||
throw new Exception('Error: lexing failed because a rule matched' .
|
||||
' an empty string. Input "' . substr($this->data,
|
||||
$this->counter, 5) . '... state COMMENT');
|
||||
}
|
||||
next($yymatches); // skip global match
|
||||
$this->token = key($yymatches); // token number
|
||||
if ($tokenMap[$this->token]) {
|
||||
// extract sub-patterns for passing to lex function
|
||||
$yysubmatches = array_slice($yysubmatches, $this->token + 1,
|
||||
$tokenMap[$this->token]);
|
||||
} else {
|
||||
$yysubmatches = array();
|
||||
}
|
||||
$this->value = current($yymatches); // token value
|
||||
$r = $this->{'yy_r4_' . $this->token}($yysubmatches);
|
||||
if ($r === null) {
|
||||
$this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
|
||||
$this->line += substr_count($this->value, "\n");
|
||||
// accept this token
|
||||
return true;
|
||||
} elseif ($r === true) {
|
||||
// we have changed state
|
||||
// process this token in the new state
|
||||
return $this->yylex();
|
||||
} elseif ($r === false) {
|
||||
$this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
|
||||
$this->line += substr_count($this->value, "\n");
|
||||
if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
|
||||
return false; // end of input
|
||||
}
|
||||
// skip this token
|
||||
continue;
|
||||
} } else {
|
||||
throw new Exception('Unexpected input at line' . $this->line .
|
||||
': ' . $this->data[$this->counter]);
|
||||
}
|
||||
break;
|
||||
} while (true);
|
||||
|
||||
} // end function
|
||||
|
||||
const COMMENT = 4;
|
||||
public function yy_r4_1($yy_subpatterns)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
public function yy_r4_2($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING;
|
||||
}
|
||||
public function yy_r4_3($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = Smarty_Internal_Configfileparser::TPC_NEWLINE;
|
||||
$this->yypopstate();
|
||||
}
|
||||
|
||||
public function yylex5()
|
||||
{
|
||||
$tokenMap = array (
|
||||
1 => 0,
|
||||
2 => 0,
|
||||
);
|
||||
if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
|
||||
return false; // end of input
|
||||
}
|
||||
$yy_global_pattern = "/\G(\\.)|\G(.*?(?=[\.=[\]\r\n]))/iS";
|
||||
|
||||
do {
|
||||
if ($this->mbstring_overload ? preg_match($yy_global_pattern, mb_substr($this->data, $this->counter,2000000000,'latin1'), $yymatches) : preg_match($yy_global_pattern,$this->data, $yymatches, null, $this->counter)) {
|
||||
$yysubmatches = $yymatches;
|
||||
$yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
|
||||
if (!count($yymatches)) {
|
||||
throw new Exception('Error: lexing failed because a rule matched' .
|
||||
' an empty string. Input "' . substr($this->data,
|
||||
$this->counter, 5) . '... state SECTION');
|
||||
}
|
||||
next($yymatches); // skip global match
|
||||
$this->token = key($yymatches); // token number
|
||||
if ($tokenMap[$this->token]) {
|
||||
// extract sub-patterns for passing to lex function
|
||||
$yysubmatches = array_slice($yysubmatches, $this->token + 1,
|
||||
$tokenMap[$this->token]);
|
||||
} else {
|
||||
$yysubmatches = array();
|
||||
}
|
||||
$this->value = current($yymatches); // token value
|
||||
$r = $this->{'yy_r5_' . $this->token}($yysubmatches);
|
||||
if ($r === null) {
|
||||
$this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
|
||||
$this->line += substr_count($this->value, "\n");
|
||||
// accept this token
|
||||
return true;
|
||||
} elseif ($r === true) {
|
||||
// we have changed state
|
||||
// process this token in the new state
|
||||
return $this->yylex();
|
||||
} elseif ($r === false) {
|
||||
$this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
|
||||
$this->line += substr_count($this->value, "\n");
|
||||
if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
|
||||
return false; // end of input
|
||||
}
|
||||
// skip this token
|
||||
continue;
|
||||
} } else {
|
||||
throw new Exception('Unexpected input at line' . $this->line .
|
||||
': ' . $this->data[$this->counter]);
|
||||
}
|
||||
break;
|
||||
} while (true);
|
||||
|
||||
} // end function
|
||||
|
||||
const SECTION = 5;
|
||||
public function yy_r5_1($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = Smarty_Internal_Configfileparser::TPC_DOT;
|
||||
}
|
||||
public function yy_r5_2($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = Smarty_Internal_Configfileparser::TPC_SECTION;
|
||||
$this->yypopstate();
|
||||
}
|
||||
|
||||
public function yylex6()
|
||||
{
|
||||
$tokenMap = array (
|
||||
1 => 0,
|
||||
2 => 0,
|
||||
);
|
||||
if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
|
||||
return false; // end of input
|
||||
}
|
||||
$yy_global_pattern = "/\G(\"\"\"(?=[ \t\r]*[\n#;]))|\G([\S\s])/iS";
|
||||
|
||||
do {
|
||||
if ($this->mbstring_overload ? preg_match($yy_global_pattern, mb_substr($this->data, $this->counter,2000000000,'latin1'), $yymatches) : preg_match($yy_global_pattern,$this->data, $yymatches, null, $this->counter)) {
|
||||
$yysubmatches = $yymatches;
|
||||
$yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
|
||||
if (!count($yymatches)) {
|
||||
throw new Exception('Error: lexing failed because a rule matched' .
|
||||
' an empty string. Input "' . substr($this->data,
|
||||
$this->counter, 5) . '... state TRIPPLE');
|
||||
}
|
||||
next($yymatches); // skip global match
|
||||
$this->token = key($yymatches); // token number
|
||||
if ($tokenMap[$this->token]) {
|
||||
// extract sub-patterns for passing to lex function
|
||||
$yysubmatches = array_slice($yysubmatches, $this->token + 1,
|
||||
$tokenMap[$this->token]);
|
||||
} else {
|
||||
$yysubmatches = array();
|
||||
}
|
||||
$this->value = current($yymatches); // token value
|
||||
$r = $this->{'yy_r6_' . $this->token}($yysubmatches);
|
||||
if ($r === null) {
|
||||
$this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
|
||||
$this->line += substr_count($this->value, "\n");
|
||||
// accept this token
|
||||
return true;
|
||||
} elseif ($r === true) {
|
||||
// we have changed state
|
||||
// process this token in the new state
|
||||
return $this->yylex();
|
||||
} elseif ($r === false) {
|
||||
$this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
|
||||
$this->line += substr_count($this->value, "\n");
|
||||
if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
|
||||
return false; // end of input
|
||||
}
|
||||
// skip this token
|
||||
continue;
|
||||
} } else {
|
||||
throw new Exception('Unexpected input at line' . $this->line .
|
||||
': ' . $this->data[$this->counter]);
|
||||
}
|
||||
break;
|
||||
} while (true);
|
||||
|
||||
} // end function
|
||||
|
||||
const TRIPPLE = 6;
|
||||
public function yy_r6_1($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_QUOTES_END;
|
||||
$this->yypopstate();
|
||||
$this->yypushstate(self::START);
|
||||
}
|
||||
public function yy_r6_2($yy_subpatterns)
|
||||
{
|
||||
|
||||
if ($this->mbstring_overload) {
|
||||
$to = mb_strlen($this->data,'latin1');
|
||||
} else {
|
||||
$to = strlen($this->data);
|
||||
}
|
||||
preg_match("/\"\"\"[ \t\r]*[\n#;]/",$this->data,$match,PREG_OFFSET_CAPTURE,$this->counter);
|
||||
if (isset($match[0][1])) {
|
||||
$to = $match[0][1];
|
||||
} else {
|
||||
$this->compiler->trigger_template_error ("missing or misspelled literal closing tag");
|
||||
}
|
||||
if ($this->mbstring_overload) {
|
||||
$this->value = mb_substr($this->data,$this->counter,$to-$this->counter,'latin1');
|
||||
} else {
|
||||
$this->value = substr($this->data,$this->counter,$to-$this->counter);
|
||||
}
|
||||
$this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_TEXT;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,953 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Smarty Internal Plugin Configfileparser
|
||||
*
|
||||
* This is the config file parser.
|
||||
* It is generated from the internal.configfileparser.y file
|
||||
* @package Smarty
|
||||
* @subpackage Compiler
|
||||
* @author Uwe Tews
|
||||
*/
|
||||
|
||||
class TPC_yyToken implements ArrayAccess
|
||||
{
|
||||
public $string = '';
|
||||
public $metadata = array();
|
||||
|
||||
public function __construct($s, $m = array())
|
||||
{
|
||||
if ($s instanceof TPC_yyToken) {
|
||||
$this->string = $s->string;
|
||||
$this->metadata = $s->metadata;
|
||||
} else {
|
||||
$this->string = (string) $s;
|
||||
if ($m instanceof TPC_yyToken) {
|
||||
$this->metadata = $m->metadata;
|
||||
} elseif (is_array($m)) {
|
||||
$this->metadata = $m;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function __toString()
|
||||
{
|
||||
return $this->_string;
|
||||
}
|
||||
|
||||
public function offsetExists($offset)
|
||||
{
|
||||
return isset($this->metadata[$offset]);
|
||||
}
|
||||
|
||||
public function offsetGet($offset)
|
||||
{
|
||||
return $this->metadata[$offset];
|
||||
}
|
||||
|
||||
public function offsetSet($offset, $value)
|
||||
{
|
||||
if ($offset === null) {
|
||||
if (isset($value[0])) {
|
||||
$x = ($value instanceof TPC_yyToken) ?
|
||||
$value->metadata : $value;
|
||||
$this->metadata = array_merge($this->metadata, $x);
|
||||
|
||||
return;
|
||||
}
|
||||
$offset = count($this->metadata);
|
||||
}
|
||||
if ($value === null) {
|
||||
return;
|
||||
}
|
||||
if ($value instanceof TPC_yyToken) {
|
||||
if ($value->metadata) {
|
||||
$this->metadata[$offset] = $value->metadata;
|
||||
}
|
||||
} elseif ($value) {
|
||||
$this->metadata[$offset] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
public function offsetUnset($offset)
|
||||
{
|
||||
unset($this->metadata[$offset]);
|
||||
}
|
||||
}
|
||||
|
||||
class TPC_yyStackEntry
|
||||
{
|
||||
public $stateno; /* The state-number */
|
||||
public $major; /* The major token value. This is the code
|
||||
** number for the token at this stack level */
|
||||
public $minor; /* The user-supplied minor token value. This
|
||||
** is the value of the token */
|
||||
};
|
||||
|
||||
#line 12 "smarty_internal_configfileparser.y"
|
||||
class Smarty_Internal_Configfileparser#line 79 "smarty_internal_configfileparser.php"
|
||||
{
|
||||
#line 14 "smarty_internal_configfileparser.y"
|
||||
|
||||
// states whether the parse was successful or not
|
||||
public $successful = true;
|
||||
public $retvalue = 0;
|
||||
private $lex;
|
||||
private $internalError = false;
|
||||
|
||||
public function __construct($lex, $compiler)
|
||||
{
|
||||
// set instance object
|
||||
self::instance($this);
|
||||
$this->lex = $lex;
|
||||
$this->smarty = $compiler->smarty;
|
||||
$this->compiler = $compiler;
|
||||
}
|
||||
public static function &instance($new_instance = null)
|
||||
{
|
||||
static $instance = null;
|
||||
if (isset($new_instance) && is_object($new_instance))
|
||||
$instance = $new_instance;
|
||||
|
||||
return $instance;
|
||||
}
|
||||
|
||||
private function parse_bool($str)
|
||||
{
|
||||
if (in_array(strtolower($str) ,array('on','yes','true'))) {
|
||||
$res = true;
|
||||
} else {
|
||||
$res = false;
|
||||
}
|
||||
|
||||
return $res;
|
||||
}
|
||||
|
||||
private static $escapes_single = Array('\\' => '\\',
|
||||
'\'' => '\'');
|
||||
private static function parse_single_quoted_string($qstr)
|
||||
{
|
||||
$escaped_string = substr($qstr, 1, strlen($qstr)-2); //remove outer quotes
|
||||
|
||||
$ss = preg_split('/(\\\\.)/', $escaped_string, -1, PREG_SPLIT_DELIM_CAPTURE);
|
||||
|
||||
$str = "";
|
||||
foreach ($ss as $s) {
|
||||
if (strlen($s) === 2 && $s[0] === '\\') {
|
||||
if (isset(self::$escapes_single[$s[1]])) {
|
||||
$s = self::$escapes_single[$s[1]];
|
||||
}
|
||||
}
|
||||
|
||||
$str .= $s;
|
||||
}
|
||||
|
||||
return $str;
|
||||
}
|
||||
|
||||
private static function parse_double_quoted_string($qstr)
|
||||
{
|
||||
$inner_str = substr($qstr, 1, strlen($qstr)-2);
|
||||
|
||||
return stripcslashes($inner_str);
|
||||
}
|
||||
|
||||
private static function parse_tripple_double_quoted_string($qstr)
|
||||
{
|
||||
return stripcslashes($qstr);
|
||||
}
|
||||
|
||||
private function set_var(Array $var, Array &$target_array)
|
||||
{
|
||||
$key = $var["key"];
|
||||
$value = $var["value"];
|
||||
|
||||
if ($this->smarty->config_overwrite || !isset($target_array['vars'][$key])) {
|
||||
$target_array['vars'][$key] = $value;
|
||||
} else {
|
||||
settype($target_array['vars'][$key], 'array');
|
||||
$target_array['vars'][$key][] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
private function add_global_vars(Array $vars)
|
||||
{
|
||||
if (!isset($this->compiler->config_data['vars'])) {
|
||||
$this->compiler->config_data['vars'] = Array();
|
||||
}
|
||||
foreach ($vars as $var) {
|
||||
$this->set_var($var, $this->compiler->config_data);
|
||||
}
|
||||
}
|
||||
|
||||
private function add_section_vars($section_name, Array $vars)
|
||||
{
|
||||
if (!isset($this->compiler->config_data['sections'][$section_name]['vars'])) {
|
||||
$this->compiler->config_data['sections'][$section_name]['vars'] = Array();
|
||||
}
|
||||
foreach ($vars as $var) {
|
||||
$this->set_var($var, $this->compiler->config_data['sections'][$section_name]);
|
||||
}
|
||||
}
|
||||
#line 173 "smarty_internal_configfileparser.php"
|
||||
|
||||
const TPC_OPENB = 1;
|
||||
const TPC_SECTION = 2;
|
||||
const TPC_CLOSEB = 3;
|
||||
const TPC_DOT = 4;
|
||||
const TPC_ID = 5;
|
||||
const TPC_EQUAL = 6;
|
||||
const TPC_FLOAT = 7;
|
||||
const TPC_INT = 8;
|
||||
const TPC_BOOL = 9;
|
||||
const TPC_SINGLE_QUOTED_STRING = 10;
|
||||
const TPC_DOUBLE_QUOTED_STRING = 11;
|
||||
const TPC_TRIPPLE_QUOTES = 12;
|
||||
const TPC_TRIPPLE_TEXT = 13;
|
||||
const TPC_TRIPPLE_QUOTES_END = 14;
|
||||
const TPC_NAKED_STRING = 15;
|
||||
const TPC_OTHER = 16;
|
||||
const TPC_NEWLINE = 17;
|
||||
const TPC_COMMENTSTART = 18;
|
||||
const YY_NO_ACTION = 60;
|
||||
const YY_ACCEPT_ACTION = 59;
|
||||
const YY_ERROR_ACTION = 58;
|
||||
|
||||
const YY_SZ_ACTTAB = 38;
|
||||
static public $yy_action = array(
|
||||
/* 0 */ 29, 30, 34, 33, 24, 13, 19, 25, 35, 21,
|
||||
/* 10 */ 59, 8, 3, 1, 20, 12, 14, 31, 20, 12,
|
||||
/* 20 */ 15, 17, 23, 18, 27, 26, 4, 5, 6, 32,
|
||||
/* 30 */ 2, 11, 28, 22, 16, 9, 7, 10,
|
||||
);
|
||||
public static $yy_lookahead = array(
|
||||
/* 0 */ 7, 8, 9, 10, 11, 12, 5, 27, 15, 16,
|
||||
/* 10 */ 20, 21, 23, 23, 17, 18, 13, 14, 17, 18,
|
||||
/* 20 */ 15, 2, 17, 4, 25, 26, 6, 3, 3, 14,
|
||||
/* 30 */ 23, 1, 24, 17, 2, 25, 22, 25,
|
||||
);
|
||||
const YY_SHIFT_USE_DFLT = -8;
|
||||
const YY_SHIFT_MAX = 19;
|
||||
public static $yy_shift_ofst = array(
|
||||
/* 0 */ -8, 1, 1, 1, -7, -3, -3, 30, -8, -8,
|
||||
/* 10 */ -8, 19, 5, 3, 15, 16, 24, 25, 32, 20,
|
||||
);
|
||||
const YY_REDUCE_USE_DFLT = -21;
|
||||
const YY_REDUCE_MAX = 10;
|
||||
public static $yy_reduce_ofst = array(
|
||||
/* 0 */ -10, -1, -1, -1, -20, 10, 12, 8, 14, 7,
|
||||
/* 10 */ -11,
|
||||
);
|
||||
public static $yyExpectedTokens = array(
|
||||
/* 0 */ array(),
|
||||
/* 1 */ array(5, 17, 18, ),
|
||||
/* 2 */ array(5, 17, 18, ),
|
||||
/* 3 */ array(5, 17, 18, ),
|
||||
/* 4 */ array(7, 8, 9, 10, 11, 12, 15, 16, ),
|
||||
/* 5 */ array(17, 18, ),
|
||||
/* 6 */ array(17, 18, ),
|
||||
/* 7 */ array(1, ),
|
||||
/* 8 */ array(),
|
||||
/* 9 */ array(),
|
||||
/* 10 */ array(),
|
||||
/* 11 */ array(2, 4, ),
|
||||
/* 12 */ array(15, 17, ),
|
||||
/* 13 */ array(13, 14, ),
|
||||
/* 14 */ array(14, ),
|
||||
/* 15 */ array(17, ),
|
||||
/* 16 */ array(3, ),
|
||||
/* 17 */ array(3, ),
|
||||
/* 18 */ array(2, ),
|
||||
/* 19 */ array(6, ),
|
||||
/* 20 */ array(),
|
||||
/* 21 */ array(),
|
||||
/* 22 */ array(),
|
||||
/* 23 */ array(),
|
||||
/* 24 */ array(),
|
||||
/* 25 */ array(),
|
||||
/* 26 */ array(),
|
||||
/* 27 */ array(),
|
||||
/* 28 */ array(),
|
||||
/* 29 */ array(),
|
||||
/* 30 */ array(),
|
||||
/* 31 */ array(),
|
||||
/* 32 */ array(),
|
||||
/* 33 */ array(),
|
||||
/* 34 */ array(),
|
||||
/* 35 */ array(),
|
||||
);
|
||||
public static $yy_default = array(
|
||||
/* 0 */ 44, 37, 41, 40, 58, 58, 58, 36, 39, 44,
|
||||
/* 10 */ 44, 58, 58, 58, 58, 58, 58, 58, 58, 58,
|
||||
/* 20 */ 55, 54, 57, 56, 50, 45, 43, 42, 38, 46,
|
||||
/* 30 */ 47, 52, 51, 49, 48, 53,
|
||||
);
|
||||
const YYNOCODE = 29;
|
||||
const YYSTACKDEPTH = 100;
|
||||
const YYNSTATE = 36;
|
||||
const YYNRULE = 22;
|
||||
const YYERRORSYMBOL = 19;
|
||||
const YYERRSYMDT = 'yy0';
|
||||
const YYFALLBACK = 0;
|
||||
public static $yyFallback = array(
|
||||
);
|
||||
public static function Trace($TraceFILE, $zTracePrompt)
|
||||
{
|
||||
if (!$TraceFILE) {
|
||||
$zTracePrompt = 0;
|
||||
} elseif (!$zTracePrompt) {
|
||||
$TraceFILE = 0;
|
||||
}
|
||||
self::$yyTraceFILE = $TraceFILE;
|
||||
self::$yyTracePrompt = $zTracePrompt;
|
||||
}
|
||||
|
||||
public static function PrintTrace()
|
||||
{
|
||||
self::$yyTraceFILE = fopen('php://output', 'w');
|
||||
self::$yyTracePrompt = '<br>';
|
||||
}
|
||||
|
||||
public static $yyTraceFILE;
|
||||
public static $yyTracePrompt;
|
||||
public $yyidx; /* Index of top element in stack */
|
||||
public $yyerrcnt; /* Shifts left before out of the error */
|
||||
public $yystack = array(); /* The parser's stack */
|
||||
|
||||
public $yyTokenName = array(
|
||||
'$', 'OPENB', 'SECTION', 'CLOSEB',
|
||||
'DOT', 'ID', 'EQUAL', 'FLOAT',
|
||||
'INT', 'BOOL', 'SINGLE_QUOTED_STRING', 'DOUBLE_QUOTED_STRING',
|
||||
'TRIPPLE_QUOTES', 'TRIPPLE_TEXT', 'TRIPPLE_QUOTES_END', 'NAKED_STRING',
|
||||
'OTHER', 'NEWLINE', 'COMMENTSTART', 'error',
|
||||
'start', 'global_vars', 'sections', 'var_list',
|
||||
'section', 'newline', 'var', 'value',
|
||||
);
|
||||
|
||||
public static $yyRuleName = array(
|
||||
/* 0 */ "start ::= global_vars sections",
|
||||
/* 1 */ "global_vars ::= var_list",
|
||||
/* 2 */ "sections ::= sections section",
|
||||
/* 3 */ "sections ::=",
|
||||
/* 4 */ "section ::= OPENB SECTION CLOSEB newline var_list",
|
||||
/* 5 */ "section ::= OPENB DOT SECTION CLOSEB newline var_list",
|
||||
/* 6 */ "var_list ::= var_list newline",
|
||||
/* 7 */ "var_list ::= var_list var",
|
||||
/* 8 */ "var_list ::=",
|
||||
/* 9 */ "var ::= ID EQUAL value",
|
||||
/* 10 */ "value ::= FLOAT",
|
||||
/* 11 */ "value ::= INT",
|
||||
/* 12 */ "value ::= BOOL",
|
||||
/* 13 */ "value ::= SINGLE_QUOTED_STRING",
|
||||
/* 14 */ "value ::= DOUBLE_QUOTED_STRING",
|
||||
/* 15 */ "value ::= TRIPPLE_QUOTES TRIPPLE_TEXT TRIPPLE_QUOTES_END",
|
||||
/* 16 */ "value ::= TRIPPLE_QUOTES TRIPPLE_QUOTES_END",
|
||||
/* 17 */ "value ::= NAKED_STRING",
|
||||
/* 18 */ "value ::= OTHER",
|
||||
/* 19 */ "newline ::= NEWLINE",
|
||||
/* 20 */ "newline ::= COMMENTSTART NEWLINE",
|
||||
/* 21 */ "newline ::= COMMENTSTART NAKED_STRING NEWLINE",
|
||||
);
|
||||
|
||||
public function tokenName($tokenType)
|
||||
{
|
||||
if ($tokenType === 0) {
|
||||
return 'End of Input';
|
||||
}
|
||||
if ($tokenType > 0 && $tokenType < count($this->yyTokenName)) {
|
||||
return $this->yyTokenName[$tokenType];
|
||||
} else {
|
||||
return "Unknown";
|
||||
}
|
||||
}
|
||||
|
||||
public static function yy_destructor($yymajor, $yypminor)
|
||||
{
|
||||
switch ($yymajor) {
|
||||
default: break; /* If no destructor action specified: do nothing */
|
||||
}
|
||||
}
|
||||
|
||||
public function yy_pop_parser_stack()
|
||||
{
|
||||
if (!count($this->yystack)) {
|
||||
return;
|
||||
}
|
||||
$yytos = array_pop($this->yystack);
|
||||
if (self::$yyTraceFILE && $this->yyidx >= 0) {
|
||||
fwrite(self::$yyTraceFILE,
|
||||
self::$yyTracePrompt . 'Popping ' . $this->yyTokenName[$yytos->major] .
|
||||
"\n");
|
||||
}
|
||||
$yymajor = $yytos->major;
|
||||
self::yy_destructor($yymajor, $yytos->minor);
|
||||
$this->yyidx--;
|
||||
|
||||
return $yymajor;
|
||||
}
|
||||
|
||||
public function __destruct()
|
||||
{
|
||||
while ($this->yystack !== Array()) {
|
||||
$this->yy_pop_parser_stack();
|
||||
}
|
||||
if (is_resource(self::$yyTraceFILE)) {
|
||||
fclose(self::$yyTraceFILE);
|
||||
}
|
||||
}
|
||||
|
||||
public function yy_get_expected_tokens($token)
|
||||
{
|
||||
$state = $this->yystack[$this->yyidx]->stateno;
|
||||
$expected = self::$yyExpectedTokens[$state];
|
||||
if (in_array($token, self::$yyExpectedTokens[$state], true)) {
|
||||
return $expected;
|
||||
}
|
||||
$stack = $this->yystack;
|
||||
$yyidx = $this->yyidx;
|
||||
do {
|
||||
$yyact = $this->yy_find_shift_action($token);
|
||||
if ($yyact >= self::YYNSTATE && $yyact < self::YYNSTATE + self::YYNRULE) {
|
||||
// reduce action
|
||||
$done = 0;
|
||||
do {
|
||||
if ($done++ == 100) {
|
||||
$this->yyidx = $yyidx;
|
||||
$this->yystack = $stack;
|
||||
// too much recursion prevents proper detection
|
||||
// so give up
|
||||
return array_unique($expected);
|
||||
}
|
||||
$yyruleno = $yyact - self::YYNSTATE;
|
||||
$this->yyidx -= self::$yyRuleInfo[$yyruleno]['rhs'];
|
||||
$nextstate = $this->yy_find_reduce_action(
|
||||
$this->yystack[$this->yyidx]->stateno,
|
||||
self::$yyRuleInfo[$yyruleno]['lhs']);
|
||||
if (isset(self::$yyExpectedTokens[$nextstate])) {
|
||||
$expected = array_merge($expected, self::$yyExpectedTokens[$nextstate]);
|
||||
if (in_array($token,
|
||||
self::$yyExpectedTokens[$nextstate], true)) {
|
||||
$this->yyidx = $yyidx;
|
||||
$this->yystack = $stack;
|
||||
|
||||
return array_unique($expected);
|
||||
}
|
||||
}
|
||||
if ($nextstate < self::YYNSTATE) {
|
||||
// we need to shift a non-terminal
|
||||
$this->yyidx++;
|
||||
$x = new TPC_yyStackEntry;
|
||||
$x->stateno = $nextstate;
|
||||
$x->major = self::$yyRuleInfo[$yyruleno]['lhs'];
|
||||
$this->yystack[$this->yyidx] = $x;
|
||||
continue 2;
|
||||
} elseif ($nextstate == self::YYNSTATE + self::YYNRULE + 1) {
|
||||
$this->yyidx = $yyidx;
|
||||
$this->yystack = $stack;
|
||||
// the last token was just ignored, we can't accept
|
||||
// by ignoring input, this is in essence ignoring a
|
||||
// syntax error!
|
||||
return array_unique($expected);
|
||||
} elseif ($nextstate === self::YY_NO_ACTION) {
|
||||
$this->yyidx = $yyidx;
|
||||
$this->yystack = $stack;
|
||||
// input accepted, but not shifted (I guess)
|
||||
return $expected;
|
||||
} else {
|
||||
$yyact = $nextstate;
|
||||
}
|
||||
} while (true);
|
||||
}
|
||||
break;
|
||||
} while (true);
|
||||
$this->yyidx = $yyidx;
|
||||
$this->yystack = $stack;
|
||||
|
||||
return array_unique($expected);
|
||||
}
|
||||
|
||||
public function yy_is_expected_token($token)
|
||||
{
|
||||
if ($token === 0) {
|
||||
return true; // 0 is not part of this
|
||||
}
|
||||
$state = $this->yystack[$this->yyidx]->stateno;
|
||||
if (in_array($token, self::$yyExpectedTokens[$state], true)) {
|
||||
return true;
|
||||
}
|
||||
$stack = $this->yystack;
|
||||
$yyidx = $this->yyidx;
|
||||
do {
|
||||
$yyact = $this->yy_find_shift_action($token);
|
||||
if ($yyact >= self::YYNSTATE && $yyact < self::YYNSTATE + self::YYNRULE) {
|
||||
// reduce action
|
||||
$done = 0;
|
||||
do {
|
||||
if ($done++ == 100) {
|
||||
$this->yyidx = $yyidx;
|
||||
$this->yystack = $stack;
|
||||
// too much recursion prevents proper detection
|
||||
// so give up
|
||||
return true;
|
||||
}
|
||||
$yyruleno = $yyact - self::YYNSTATE;
|
||||
$this->yyidx -= self::$yyRuleInfo[$yyruleno]['rhs'];
|
||||
$nextstate = $this->yy_find_reduce_action(
|
||||
$this->yystack[$this->yyidx]->stateno,
|
||||
self::$yyRuleInfo[$yyruleno]['lhs']);
|
||||
if (isset(self::$yyExpectedTokens[$nextstate]) &&
|
||||
in_array($token, self::$yyExpectedTokens[$nextstate], true)) {
|
||||
$this->yyidx = $yyidx;
|
||||
$this->yystack = $stack;
|
||||
|
||||
return true;
|
||||
}
|
||||
if ($nextstate < self::YYNSTATE) {
|
||||
// we need to shift a non-terminal
|
||||
$this->yyidx++;
|
||||
$x = new TPC_yyStackEntry;
|
||||
$x->stateno = $nextstate;
|
||||
$x->major = self::$yyRuleInfo[$yyruleno]['lhs'];
|
||||
$this->yystack[$this->yyidx] = $x;
|
||||
continue 2;
|
||||
} elseif ($nextstate == self::YYNSTATE + self::YYNRULE + 1) {
|
||||
$this->yyidx = $yyidx;
|
||||
$this->yystack = $stack;
|
||||
if (!$token) {
|
||||
// end of input: this is valid
|
||||
return true;
|
||||
}
|
||||
// the last token was just ignored, we can't accept
|
||||
// by ignoring input, this is in essence ignoring a
|
||||
// syntax error!
|
||||
return false;
|
||||
} elseif ($nextstate === self::YY_NO_ACTION) {
|
||||
$this->yyidx = $yyidx;
|
||||
$this->yystack = $stack;
|
||||
// input accepted, but not shifted (I guess)
|
||||
return true;
|
||||
} else {
|
||||
$yyact = $nextstate;
|
||||
}
|
||||
} while (true);
|
||||
}
|
||||
break;
|
||||
} while (true);
|
||||
$this->yyidx = $yyidx;
|
||||
$this->yystack = $stack;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function yy_find_shift_action($iLookAhead)
|
||||
{
|
||||
$stateno = $this->yystack[$this->yyidx]->stateno;
|
||||
|
||||
/* if ($this->yyidx < 0) return self::YY_NO_ACTION; */
|
||||
if (!isset(self::$yy_shift_ofst[$stateno])) {
|
||||
// no shift actions
|
||||
return self::$yy_default[$stateno];
|
||||
}
|
||||
$i = self::$yy_shift_ofst[$stateno];
|
||||
if ($i === self::YY_SHIFT_USE_DFLT) {
|
||||
return self::$yy_default[$stateno];
|
||||
}
|
||||
if ($iLookAhead == self::YYNOCODE) {
|
||||
return self::YY_NO_ACTION;
|
||||
}
|
||||
$i += $iLookAhead;
|
||||
if ($i < 0 || $i >= self::YY_SZ_ACTTAB ||
|
||||
self::$yy_lookahead[$i] != $iLookAhead) {
|
||||
if (count(self::$yyFallback) && $iLookAhead < count(self::$yyFallback)
|
||||
&& ($iFallback = self::$yyFallback[$iLookAhead]) != 0) {
|
||||
if (self::$yyTraceFILE) {
|
||||
fwrite(self::$yyTraceFILE, self::$yyTracePrompt . "FALLBACK " .
|
||||
$this->yyTokenName[$iLookAhead] . " => " .
|
||||
$this->yyTokenName[$iFallback] . "\n");
|
||||
}
|
||||
|
||||
return $this->yy_find_shift_action($iFallback);
|
||||
}
|
||||
|
||||
return self::$yy_default[$stateno];
|
||||
} else {
|
||||
return self::$yy_action[$i];
|
||||
}
|
||||
}
|
||||
|
||||
public function yy_find_reduce_action($stateno, $iLookAhead)
|
||||
{
|
||||
/* $stateno = $this->yystack[$this->yyidx]->stateno; */
|
||||
|
||||
if (!isset(self::$yy_reduce_ofst[$stateno])) {
|
||||
return self::$yy_default[$stateno];
|
||||
}
|
||||
$i = self::$yy_reduce_ofst[$stateno];
|
||||
if ($i == self::YY_REDUCE_USE_DFLT) {
|
||||
return self::$yy_default[$stateno];
|
||||
}
|
||||
if ($iLookAhead == self::YYNOCODE) {
|
||||
return self::YY_NO_ACTION;
|
||||
}
|
||||
$i += $iLookAhead;
|
||||
if ($i < 0 || $i >= self::YY_SZ_ACTTAB ||
|
||||
self::$yy_lookahead[$i] != $iLookAhead) {
|
||||
return self::$yy_default[$stateno];
|
||||
} else {
|
||||
return self::$yy_action[$i];
|
||||
}
|
||||
}
|
||||
|
||||
public function yy_shift($yyNewState, $yyMajor, $yypMinor)
|
||||
{
|
||||
$this->yyidx++;
|
||||
if ($this->yyidx >= self::YYSTACKDEPTH) {
|
||||
$this->yyidx--;
|
||||
if (self::$yyTraceFILE) {
|
||||
fprintf(self::$yyTraceFILE, "%sStack Overflow!\n", self::$yyTracePrompt);
|
||||
}
|
||||
while ($this->yyidx >= 0) {
|
||||
$this->yy_pop_parser_stack();
|
||||
}
|
||||
#line 125 "smarty_internal_configfileparser.y"
|
||||
|
||||
$this->internalError = true;
|
||||
$this->compiler->trigger_config_file_error("Stack overflow in configfile parser");
|
||||
#line 593 "smarty_internal_configfileparser.php"
|
||||
|
||||
return;
|
||||
}
|
||||
$yytos = new TPC_yyStackEntry;
|
||||
$yytos->stateno = $yyNewState;
|
||||
$yytos->major = $yyMajor;
|
||||
$yytos->minor = $yypMinor;
|
||||
array_push($this->yystack, $yytos);
|
||||
if (self::$yyTraceFILE && $this->yyidx > 0) {
|
||||
fprintf(self::$yyTraceFILE, "%sShift %d\n", self::$yyTracePrompt,
|
||||
$yyNewState);
|
||||
fprintf(self::$yyTraceFILE, "%sStack:", self::$yyTracePrompt);
|
||||
for ($i = 1; $i <= $this->yyidx; $i++) {
|
||||
fprintf(self::$yyTraceFILE, " %s",
|
||||
$this->yyTokenName[$this->yystack[$i]->major]);
|
||||
}
|
||||
fwrite(self::$yyTraceFILE,"\n");
|
||||
}
|
||||
}
|
||||
|
||||
public static $yyRuleInfo = array(
|
||||
array( 'lhs' => 20, 'rhs' => 2 ),
|
||||
array( 'lhs' => 21, 'rhs' => 1 ),
|
||||
array( 'lhs' => 22, 'rhs' => 2 ),
|
||||
array( 'lhs' => 22, 'rhs' => 0 ),
|
||||
array( 'lhs' => 24, 'rhs' => 5 ),
|
||||
array( 'lhs' => 24, 'rhs' => 6 ),
|
||||
array( 'lhs' => 23, 'rhs' => 2 ),
|
||||
array( 'lhs' => 23, 'rhs' => 2 ),
|
||||
array( 'lhs' => 23, 'rhs' => 0 ),
|
||||
array( 'lhs' => 26, 'rhs' => 3 ),
|
||||
array( 'lhs' => 27, 'rhs' => 1 ),
|
||||
array( 'lhs' => 27, 'rhs' => 1 ),
|
||||
array( 'lhs' => 27, 'rhs' => 1 ),
|
||||
array( 'lhs' => 27, 'rhs' => 1 ),
|
||||
array( 'lhs' => 27, 'rhs' => 1 ),
|
||||
array( 'lhs' => 27, 'rhs' => 3 ),
|
||||
array( 'lhs' => 27, 'rhs' => 2 ),
|
||||
array( 'lhs' => 27, 'rhs' => 1 ),
|
||||
array( 'lhs' => 27, 'rhs' => 1 ),
|
||||
array( 'lhs' => 25, 'rhs' => 1 ),
|
||||
array( 'lhs' => 25, 'rhs' => 2 ),
|
||||
array( 'lhs' => 25, 'rhs' => 3 ),
|
||||
);
|
||||
|
||||
public static $yyReduceMap = array(
|
||||
0 => 0,
|
||||
2 => 0,
|
||||
3 => 0,
|
||||
19 => 0,
|
||||
20 => 0,
|
||||
21 => 0,
|
||||
1 => 1,
|
||||
4 => 4,
|
||||
5 => 5,
|
||||
6 => 6,
|
||||
7 => 7,
|
||||
8 => 8,
|
||||
9 => 9,
|
||||
10 => 10,
|
||||
11 => 11,
|
||||
12 => 12,
|
||||
13 => 13,
|
||||
14 => 14,
|
||||
15 => 15,
|
||||
16 => 16,
|
||||
17 => 17,
|
||||
18 => 17,
|
||||
);
|
||||
#line 131 "smarty_internal_configfileparser.y"
|
||||
public function yy_r0()
|
||||
{
|
||||
$this->_retvalue = null;
|
||||
}
|
||||
#line 666 "smarty_internal_configfileparser.php"
|
||||
#line 136 "smarty_internal_configfileparser.y"
|
||||
public function yy_r1()
|
||||
{
|
||||
$this->add_global_vars($this->yystack[$this->yyidx + 0]->minor); $this->_retvalue = null;
|
||||
}
|
||||
#line 671 "smarty_internal_configfileparser.php"
|
||||
#line 149 "smarty_internal_configfileparser.y"
|
||||
public function yy_r4()
|
||||
{
|
||||
$this->add_section_vars($this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + 0]->minor);
|
||||
$this->_retvalue = null;
|
||||
}
|
||||
#line 677 "smarty_internal_configfileparser.php"
|
||||
#line 154 "smarty_internal_configfileparser.y"
|
||||
public function yy_r5()
|
||||
{
|
||||
if ($this->smarty->config_read_hidden) {
|
||||
$this->add_section_vars($this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
$this->_retvalue = null;
|
||||
}
|
||||
#line 685 "smarty_internal_configfileparser.php"
|
||||
#line 162 "smarty_internal_configfileparser.y"
|
||||
public function yy_r6()
|
||||
{
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + -1]->minor;
|
||||
}
|
||||
#line 690 "smarty_internal_configfileparser.php"
|
||||
#line 166 "smarty_internal_configfileparser.y"
|
||||
public function yy_r7()
|
||||
{
|
||||
$this->_retvalue = array_merge($this->yystack[$this->yyidx + -1]->minor, Array($this->yystack[$this->yyidx + 0]->minor));
|
||||
}
|
||||
#line 695 "smarty_internal_configfileparser.php"
|
||||
#line 170 "smarty_internal_configfileparser.y"
|
||||
public function yy_r8()
|
||||
{
|
||||
$this->_retvalue = Array();
|
||||
}
|
||||
#line 700 "smarty_internal_configfileparser.php"
|
||||
#line 176 "smarty_internal_configfileparser.y"
|
||||
public function yy_r9()
|
||||
{
|
||||
$this->_retvalue = Array("key" => $this->yystack[$this->yyidx + -2]->minor, "value" => $this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
#line 705 "smarty_internal_configfileparser.php"
|
||||
#line 181 "smarty_internal_configfileparser.y"
|
||||
public function yy_r10()
|
||||
{
|
||||
$this->_retvalue = (float) $this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
#line 710 "smarty_internal_configfileparser.php"
|
||||
#line 185 "smarty_internal_configfileparser.y"
|
||||
public function yy_r11()
|
||||
{
|
||||
$this->_retvalue = (int) $this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
#line 715 "smarty_internal_configfileparser.php"
|
||||
#line 189 "smarty_internal_configfileparser.y"
|
||||
public function yy_r12()
|
||||
{
|
||||
$this->_retvalue = $this->parse_bool($this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
#line 720 "smarty_internal_configfileparser.php"
|
||||
#line 193 "smarty_internal_configfileparser.y"
|
||||
public function yy_r13()
|
||||
{
|
||||
$this->_retvalue = self::parse_single_quoted_string($this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
#line 725 "smarty_internal_configfileparser.php"
|
||||
#line 197 "smarty_internal_configfileparser.y"
|
||||
public function yy_r14()
|
||||
{
|
||||
$this->_retvalue = self::parse_double_quoted_string($this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
#line 730 "smarty_internal_configfileparser.php"
|
||||
#line 201 "smarty_internal_configfileparser.y"
|
||||
public function yy_r15()
|
||||
{
|
||||
$this->_retvalue = self::parse_tripple_double_quoted_string($this->yystack[$this->yyidx + -1]->minor);
|
||||
}
|
||||
#line 735 "smarty_internal_configfileparser.php"
|
||||
#line 205 "smarty_internal_configfileparser.y"
|
||||
public function yy_r16()
|
||||
{
|
||||
$this->_retvalue = '';
|
||||
}
|
||||
#line 740 "smarty_internal_configfileparser.php"
|
||||
#line 209 "smarty_internal_configfileparser.y"
|
||||
public function yy_r17()
|
||||
{
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
#line 745 "smarty_internal_configfileparser.php"
|
||||
|
||||
private $_retvalue;
|
||||
|
||||
public function yy_reduce($yyruleno)
|
||||
{
|
||||
$yymsp = $this->yystack[$this->yyidx];
|
||||
if (self::$yyTraceFILE && $yyruleno >= 0
|
||||
&& $yyruleno < count(self::$yyRuleName)) {
|
||||
fprintf(self::$yyTraceFILE, "%sReduce (%d) [%s].\n",
|
||||
self::$yyTracePrompt, $yyruleno,
|
||||
self::$yyRuleName[$yyruleno]);
|
||||
}
|
||||
|
||||
$this->_retvalue = $yy_lefthand_side = null;
|
||||
if (array_key_exists($yyruleno, self::$yyReduceMap)) {
|
||||
// call the action
|
||||
$this->_retvalue = null;
|
||||
$this->{'yy_r' . self::$yyReduceMap[$yyruleno]}();
|
||||
$yy_lefthand_side = $this->_retvalue;
|
||||
}
|
||||
$yygoto = self::$yyRuleInfo[$yyruleno]['lhs'];
|
||||
$yysize = self::$yyRuleInfo[$yyruleno]['rhs'];
|
||||
$this->yyidx -= $yysize;
|
||||
for ($i = $yysize; $i; $i--) {
|
||||
// pop all of the right-hand side parameters
|
||||
array_pop($this->yystack);
|
||||
}
|
||||
$yyact = $this->yy_find_reduce_action($this->yystack[$this->yyidx]->stateno, $yygoto);
|
||||
if ($yyact < self::YYNSTATE) {
|
||||
if (!self::$yyTraceFILE && $yysize) {
|
||||
$this->yyidx++;
|
||||
$x = new TPC_yyStackEntry;
|
||||
$x->stateno = $yyact;
|
||||
$x->major = $yygoto;
|
||||
$x->minor = $yy_lefthand_side;
|
||||
$this->yystack[$this->yyidx] = $x;
|
||||
} else {
|
||||
$this->yy_shift($yyact, $yygoto, $yy_lefthand_side);
|
||||
}
|
||||
} elseif ($yyact == self::YYNSTATE + self::YYNRULE + 1) {
|
||||
$this->yy_accept();
|
||||
}
|
||||
}
|
||||
|
||||
public function yy_parse_failed()
|
||||
{
|
||||
if (self::$yyTraceFILE) {
|
||||
fprintf(self::$yyTraceFILE, "%sFail!\n", self::$yyTracePrompt);
|
||||
} while ($this->yyidx >= 0) {
|
||||
$this->yy_pop_parser_stack();
|
||||
}
|
||||
}
|
||||
|
||||
public function yy_syntax_error($yymajor, $TOKEN)
|
||||
{
|
||||
#line 118 "smarty_internal_configfileparser.y"
|
||||
|
||||
$this->internalError = true;
|
||||
$this->yymajor = $yymajor;
|
||||
$this->compiler->trigger_config_file_error();
|
||||
#line 808 "smarty_internal_configfileparser.php"
|
||||
}
|
||||
|
||||
public function yy_accept()
|
||||
{
|
||||
if (self::$yyTraceFILE) {
|
||||
fprintf(self::$yyTraceFILE, "%sAccept!\n", self::$yyTracePrompt);
|
||||
} while ($this->yyidx >= 0) {
|
||||
$stack = $this->yy_pop_parser_stack();
|
||||
}
|
||||
#line 110 "smarty_internal_configfileparser.y"
|
||||
|
||||
$this->successful = !$this->internalError;
|
||||
$this->internalError = false;
|
||||
$this->retvalue = $this->_retvalue;
|
||||
//echo $this->retvalue."\n\n";
|
||||
#line 826 "smarty_internal_configfileparser.php"
|
||||
}
|
||||
|
||||
public function doParse($yymajor, $yytokenvalue)
|
||||
{
|
||||
$yyerrorhit = 0; /* True if yymajor has invoked an error */
|
||||
|
||||
if ($this->yyidx === null || $this->yyidx < 0) {
|
||||
$this->yyidx = 0;
|
||||
$this->yyerrcnt = -1;
|
||||
$x = new TPC_yyStackEntry;
|
||||
$x->stateno = 0;
|
||||
$x->major = 0;
|
||||
$this->yystack = array();
|
||||
array_push($this->yystack, $x);
|
||||
}
|
||||
$yyendofinput = ($yymajor==0);
|
||||
|
||||
if (self::$yyTraceFILE) {
|
||||
fprintf(self::$yyTraceFILE, "%sInput %s\n",
|
||||
self::$yyTracePrompt, $this->yyTokenName[$yymajor]);
|
||||
}
|
||||
|
||||
do {
|
||||
$yyact = $this->yy_find_shift_action($yymajor);
|
||||
if ($yymajor < self::YYERRORSYMBOL &&
|
||||
!$this->yy_is_expected_token($yymajor)) {
|
||||
// force a syntax error
|
||||
$yyact = self::YY_ERROR_ACTION;
|
||||
}
|
||||
if ($yyact < self::YYNSTATE) {
|
||||
$this->yy_shift($yyact, $yymajor, $yytokenvalue);
|
||||
$this->yyerrcnt--;
|
||||
if ($yyendofinput && $this->yyidx >= 0) {
|
||||
$yymajor = 0;
|
||||
} else {
|
||||
$yymajor = self::YYNOCODE;
|
||||
}
|
||||
} elseif ($yyact < self::YYNSTATE + self::YYNRULE) {
|
||||
$this->yy_reduce($yyact - self::YYNSTATE);
|
||||
} elseif ($yyact == self::YY_ERROR_ACTION) {
|
||||
if (self::$yyTraceFILE) {
|
||||
fprintf(self::$yyTraceFILE, "%sSyntax Error!\n",
|
||||
self::$yyTracePrompt);
|
||||
}
|
||||
if (self::YYERRORSYMBOL) {
|
||||
if ($this->yyerrcnt < 0) {
|
||||
$this->yy_syntax_error($yymajor, $yytokenvalue);
|
||||
}
|
||||
$yymx = $this->yystack[$this->yyidx]->major;
|
||||
if ($yymx == self::YYERRORSYMBOL || $yyerrorhit) {
|
||||
if (self::$yyTraceFILE) {
|
||||
fprintf(self::$yyTraceFILE, "%sDiscard input token %s\n",
|
||||
self::$yyTracePrompt, $this->yyTokenName[$yymajor]);
|
||||
}
|
||||
$this->yy_destructor($yymajor, $yytokenvalue);
|
||||
$yymajor = self::YYNOCODE;
|
||||
} else {
|
||||
while ($this->yyidx >= 0 &&
|
||||
$yymx != self::YYERRORSYMBOL &&
|
||||
($yyact = $this->yy_find_shift_action(self::YYERRORSYMBOL)) >= self::YYNSTATE
|
||||
){
|
||||
$this->yy_pop_parser_stack();
|
||||
}
|
||||
if ($this->yyidx < 0 || $yymajor==0) {
|
||||
$this->yy_destructor($yymajor, $yytokenvalue);
|
||||
$this->yy_parse_failed();
|
||||
$yymajor = self::YYNOCODE;
|
||||
} elseif ($yymx != self::YYERRORSYMBOL) {
|
||||
$u2 = 0;
|
||||
$this->yy_shift($yyact, self::YYERRORSYMBOL, $u2);
|
||||
}
|
||||
}
|
||||
$this->yyerrcnt = 3;
|
||||
$yyerrorhit = 1;
|
||||
} else {
|
||||
if ($this->yyerrcnt <= 0) {
|
||||
$this->yy_syntax_error($yymajor, $yytokenvalue);
|
||||
}
|
||||
$this->yyerrcnt = 3;
|
||||
$this->yy_destructor($yymajor, $yytokenvalue);
|
||||
if ($yyendofinput) {
|
||||
$this->yy_parse_failed();
|
||||
}
|
||||
$yymajor = self::YYNOCODE;
|
||||
}
|
||||
} else {
|
||||
$this->yy_accept();
|
||||
$yymajor = self::YYNOCODE;
|
||||
}
|
||||
} while ($yymajor != self::YYNOCODE && $this->yyidx >= 0);
|
||||
}
|
||||
}
|
||||
@@ -1,254 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Smarty Internal Plugin Debug
|
||||
*
|
||||
* Class to collect data for the Smarty Debugging Consol
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Debug
|
||||
* @author Uwe Tews
|
||||
*/
|
||||
|
||||
/**
|
||||
* Smarty Internal Plugin Debug Class
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Debug
|
||||
*/
|
||||
class Smarty_Internal_Debug extends Smarty_Internal_Data
|
||||
{
|
||||
/**
|
||||
* template data
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $template_data = array();
|
||||
|
||||
/**
|
||||
* List of uid's which shall be ignored
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $ignore_uid = array();
|
||||
|
||||
/**
|
||||
* Ignore template
|
||||
*
|
||||
* @param object $template
|
||||
*/
|
||||
public static function ignore($template)
|
||||
{
|
||||
// calculate Uid if not already done
|
||||
if ($template->source->uid == '') {
|
||||
$template->source->filepath;
|
||||
}
|
||||
self::$ignore_uid[$template->source->uid] = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Start logging of compile time
|
||||
*
|
||||
* @param object $template
|
||||
*/
|
||||
public static function start_compile($template)
|
||||
{
|
||||
static $_is_stringy = array('string' => true, 'eval' => true);
|
||||
if (!empty($template->compiler->trace_uid)) {
|
||||
$key = $template->compiler->trace_uid;
|
||||
if (!isset(self::$template_data[$key])) {
|
||||
if (isset($_is_stringy[$template->source->type])) {
|
||||
self::$template_data[$key]['name'] = '\'' . substr($template->source->name, 0, 25) . '...\'';
|
||||
} else {
|
||||
self::$template_data[$key]['name'] = $template->source->filepath;
|
||||
}
|
||||
self::$template_data[$key]['compile_time'] = 0;
|
||||
self::$template_data[$key]['render_time'] = 0;
|
||||
self::$template_data[$key]['cache_time'] = 0;
|
||||
}
|
||||
} else {
|
||||
if (isset(self::$ignore_uid[$template->source->uid])) {
|
||||
return;
|
||||
}
|
||||
$key = self::get_key($template);
|
||||
}
|
||||
self::$template_data[$key]['start_time'] = microtime(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* End logging of compile time
|
||||
*
|
||||
* @param object $template
|
||||
*/
|
||||
public static function end_compile($template)
|
||||
{
|
||||
if (!empty($template->compiler->trace_uid)) {
|
||||
$key = $template->compiler->trace_uid;
|
||||
} else {
|
||||
if (isset(self::$ignore_uid[$template->source->uid])) {
|
||||
return;
|
||||
}
|
||||
|
||||
$key = self::get_key($template);
|
||||
}
|
||||
self::$template_data[$key]['compile_time'] += microtime(true) - self::$template_data[$key]['start_time'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Start logging of render time
|
||||
*
|
||||
* @param object $template
|
||||
*/
|
||||
public static function start_render($template)
|
||||
{
|
||||
$key = self::get_key($template);
|
||||
self::$template_data[$key]['start_time'] = microtime(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* End logging of compile time
|
||||
*
|
||||
* @param object $template
|
||||
*/
|
||||
public static function end_render($template)
|
||||
{
|
||||
$key = self::get_key($template);
|
||||
self::$template_data[$key]['render_time'] += microtime(true) - self::$template_data[$key]['start_time'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Start logging of cache time
|
||||
*
|
||||
* @param object $template cached template
|
||||
*/
|
||||
public static function start_cache($template)
|
||||
{
|
||||
$key = self::get_key($template);
|
||||
self::$template_data[$key]['start_time'] = microtime(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* End logging of cache time
|
||||
*
|
||||
* @param object $template cached template
|
||||
*/
|
||||
public static function end_cache($template)
|
||||
{
|
||||
$key = self::get_key($template);
|
||||
self::$template_data[$key]['cache_time'] += microtime(true) - self::$template_data[$key]['start_time'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Opens a window for the Smarty Debugging Consol and display the data
|
||||
*
|
||||
* @param Smarty_Internal_Template|Smarty $obj object to debug
|
||||
*/
|
||||
public static function display_debug($obj)
|
||||
{
|
||||
// prepare information of assigned variables
|
||||
$ptr = self::get_debug_vars($obj);
|
||||
if ($obj instanceof Smarty) {
|
||||
$smarty = clone $obj;
|
||||
} else {
|
||||
$smarty = clone $obj->smarty;
|
||||
}
|
||||
$_assigned_vars = $ptr->tpl_vars;
|
||||
ksort($_assigned_vars);
|
||||
$_config_vars = $ptr->config_vars;
|
||||
ksort($_config_vars);
|
||||
$smarty->registered_filters = array();
|
||||
$smarty->autoload_filters = array();
|
||||
$smarty->default_modifiers = array();
|
||||
$smarty->force_compile = false;
|
||||
$smarty->left_delimiter = '{';
|
||||
$smarty->right_delimiter = '}';
|
||||
$smarty->debugging = false;
|
||||
$smarty->debugging_ctrl = 'NONE';
|
||||
$smarty->force_compile = false;
|
||||
$_template = new Smarty_Internal_Template($smarty->debug_tpl, $smarty);
|
||||
$_template->caching = false;
|
||||
$_template->disableSecurity();
|
||||
$_template->cache_id = null;
|
||||
$_template->compile_id = null;
|
||||
if ($obj instanceof Smarty_Internal_Template) {
|
||||
$_template->assign('template_name', $obj->source->type . ':' . $obj->source->name);
|
||||
}
|
||||
if ($obj instanceof Smarty) {
|
||||
$_template->assign('template_data', self::$template_data);
|
||||
} else {
|
||||
$_template->assign('template_data', null);
|
||||
}
|
||||
$_template->assign('assigned_vars', $_assigned_vars);
|
||||
$_template->assign('config_vars', $_config_vars);
|
||||
$_template->assign('execution_time', microtime(true) - $smarty->start_time);
|
||||
echo $_template->fetch();
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursively gets variables from all template/data scopes
|
||||
*
|
||||
* @param Smarty_Internal_Template|Smarty_Data $obj object to debug
|
||||
* @return StdClass
|
||||
*/
|
||||
public static function get_debug_vars($obj)
|
||||
{
|
||||
$config_vars = $obj->config_vars;
|
||||
$tpl_vars = array();
|
||||
foreach ($obj->tpl_vars as $key => $var) {
|
||||
$tpl_vars[$key] = clone $var;
|
||||
if ($obj instanceof Smarty_Internal_Template) {
|
||||
$tpl_vars[$key]->scope = $obj->source->type . ':' . $obj->source->name;
|
||||
} elseif ($obj instanceof Smarty_Data) {
|
||||
$tpl_vars[$key]->scope = 'Data object';
|
||||
} else {
|
||||
$tpl_vars[$key]->scope = 'Smarty root';
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($obj->parent)) {
|
||||
$parent = self::get_debug_vars($obj->parent);
|
||||
$tpl_vars = array_merge($parent->tpl_vars, $tpl_vars);
|
||||
$config_vars = array_merge($parent->config_vars, $config_vars);
|
||||
} else {
|
||||
foreach (Smarty::$global_tpl_vars as $name => $var) {
|
||||
if (!array_key_exists($name, $tpl_vars)) {
|
||||
$clone = clone $var;
|
||||
$clone->scope = 'Global';
|
||||
$tpl_vars[$name] = $clone;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return (object)array('tpl_vars' => $tpl_vars, 'config_vars' => $config_vars);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return key into $template_data for template
|
||||
*
|
||||
* @param object $template template object
|
||||
* @return string key into $template_data
|
||||
*/
|
||||
private static function get_key($template)
|
||||
{
|
||||
static $_is_stringy = array('string' => true, 'eval' => true);
|
||||
// calculate Uid if not already done
|
||||
if ($template->source->uid == '') {
|
||||
$template->source->filepath;
|
||||
}
|
||||
$key = $template->source->uid;
|
||||
if (isset(self::$template_data[$key])) {
|
||||
return $key;
|
||||
} else {
|
||||
if (isset($_is_stringy[$template->source->type])) {
|
||||
self::$template_data[$key]['name'] = '\'' . substr($template->source->name, 0, 25) . '...\'';
|
||||
} else {
|
||||
self::$template_data[$key]['name'] = $template->source->filepath;
|
||||
}
|
||||
self::$template_data[$key]['compile_time'] = 0;
|
||||
self::$template_data[$key]['render_time'] = 0;
|
||||
self::$template_data[$key]['cache_time'] = 0;
|
||||
|
||||
return $key;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Smarty Internal Plugin Function Call Handler
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage PluginsInternal
|
||||
* @author Uwe Tews
|
||||
*/
|
||||
|
||||
/**
|
||||
* This class does call function defined with the {function} tag
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage PluginsInternal
|
||||
*/
|
||||
class Smarty_Internal_Function_Call_Handler
|
||||
{
|
||||
/**
|
||||
* This function handles calls to template functions defined by {function}
|
||||
* It does create a PHP function at the first call
|
||||
*
|
||||
* @param string $_name template function name
|
||||
* @param Smarty_Internal_Template $_template template object
|
||||
* @param array $_params Smarty variables passed as call parameter
|
||||
* @param string $_hash nocache hash value
|
||||
* @param bool $_nocache nocache flag
|
||||
*/
|
||||
public static function call($_name, Smarty_Internal_Template $_template, $_params, $_hash, $_nocache)
|
||||
{
|
||||
if ($_nocache) {
|
||||
$_function = "smarty_template_function_{$_name}_nocache";
|
||||
} else {
|
||||
$_function = "smarty_template_function_{$_hash}_{$_name}";
|
||||
}
|
||||
if (!is_callable($_function)) {
|
||||
$_code = "function {$_function}(\$_smarty_tpl,\$params) {
|
||||
\$saved_tpl_vars = \$_smarty_tpl->tpl_vars;
|
||||
foreach (\$_smarty_tpl->smarty->template_functions['{$_name}']['parameter'] as \$key => \$value) {\$_smarty_tpl->tpl_vars[\$key] = new Smarty_variable(\$value);};
|
||||
foreach (\$params as \$key => \$value) {\$_smarty_tpl->tpl_vars[\$key] = new Smarty_variable(\$value);}?>";
|
||||
if ($_nocache) {
|
||||
$_code .= preg_replace(array("!<\?php echo \\'/\*%%SmartyNocache:{$_template->smarty->template_functions[$_name]['nocache_hash']}%%\*/|/\*/%%SmartyNocache:{$_template->smarty->template_functions[$_name]['nocache_hash']}%%\*/\\';\?>!",
|
||||
"!\\\'!"), array('', "'"), $_template->smarty->template_functions[$_name]['compiled']);
|
||||
$_template->smarty->template_functions[$_name]['called_nocache'] = true;
|
||||
} else {
|
||||
$_code .= preg_replace("/{$_template->smarty->template_functions[$_name]['nocache_hash']}/", $_template->properties['nocache_hash'], $_template->smarty->template_functions[$_name]['compiled']);
|
||||
}
|
||||
$_code .= "<?php \$_smarty_tpl->tpl_vars = \$saved_tpl_vars;}";
|
||||
eval($_code);
|
||||
}
|
||||
$_function($_template, $_params);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,393 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Smarty Internal Plugin Templateparser Parsetrees
|
||||
*
|
||||
* These are classes to build parsetrees in the template parser
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Compiler
|
||||
* @author Thue Kristensen
|
||||
* @author Uwe Tews
|
||||
*/
|
||||
|
||||
/**
|
||||
* @package Smarty
|
||||
* @subpackage Compiler
|
||||
* @ignore
|
||||
*/
|
||||
abstract class _smarty_parsetree
|
||||
{
|
||||
/**
|
||||
* Parser object
|
||||
* @var object
|
||||
*/
|
||||
public $parser;
|
||||
/**
|
||||
* Buffer content
|
||||
* @var mixed
|
||||
*/
|
||||
public $data;
|
||||
|
||||
/**
|
||||
* Return buffer
|
||||
*
|
||||
* @return string buffer content
|
||||
*/
|
||||
abstract public function to_smarty_php();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* A complete smarty tag.
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Compiler
|
||||
* @ignore
|
||||
*/
|
||||
class _smarty_tag extends _smarty_parsetree
|
||||
{
|
||||
/**
|
||||
* Saved block nesting level
|
||||
* @var int
|
||||
*/
|
||||
public $saved_block_nesting;
|
||||
|
||||
/**
|
||||
* Create parse tree buffer for Smarty tag
|
||||
*
|
||||
* @param object $parser parser object
|
||||
* @param string $data content
|
||||
*/
|
||||
public function __construct($parser, $data)
|
||||
{
|
||||
$this->parser = $parser;
|
||||
$this->data = $data;
|
||||
$this->saved_block_nesting = $parser->block_nesting_level;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return buffer content
|
||||
*
|
||||
* @return string content
|
||||
*/
|
||||
public function to_smarty_php()
|
||||
{
|
||||
return $this->data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return complied code that loads the evaluated outout of buffer content into a temporary variable
|
||||
*
|
||||
* @return string template code
|
||||
*/
|
||||
public function assign_to_var()
|
||||
{
|
||||
$var = sprintf('$_tmp%d', ++Smarty_Internal_Templateparser::$prefix_number);
|
||||
$this->parser->compiler->prefix_code[] = sprintf('<?php ob_start();?>%s<?php %s=ob_get_clean();?>', $this->data, $var);
|
||||
|
||||
return $var;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Code fragment inside a tag.
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Compiler
|
||||
* @ignore
|
||||
*/
|
||||
class _smarty_code extends _smarty_parsetree
|
||||
{
|
||||
/**
|
||||
* Create parse tree buffer for code fragment
|
||||
*
|
||||
* @param object $parser parser object
|
||||
* @param string $data content
|
||||
*/
|
||||
public function __construct($parser, $data)
|
||||
{
|
||||
$this->parser = $parser;
|
||||
$this->data = $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return buffer content in parentheses
|
||||
*
|
||||
* @return string content
|
||||
*/
|
||||
public function to_smarty_php()
|
||||
{
|
||||
return sprintf("(%s)", $this->data);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Double quoted string inside a tag.
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Compiler
|
||||
* @ignore
|
||||
*/
|
||||
class _smarty_doublequoted extends _smarty_parsetree
|
||||
{
|
||||
/**
|
||||
* Create parse tree buffer for double quoted string subtrees
|
||||
*
|
||||
* @param object $parser parser object
|
||||
* @param _smarty_parsetree $subtree parsetree buffer
|
||||
*/
|
||||
public function __construct($parser, _smarty_parsetree $subtree)
|
||||
{
|
||||
$this->parser = $parser;
|
||||
$this->subtrees[] = $subtree;
|
||||
if ($subtree instanceof _smarty_tag) {
|
||||
$this->parser->block_nesting_level = count($this->parser->compiler->_tag_stack);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Append buffer to subtree
|
||||
*
|
||||
* @param _smarty_parsetree $subtree parsetree buffer
|
||||
*/
|
||||
public function append_subtree(_smarty_parsetree $subtree)
|
||||
{
|
||||
$last_subtree = count($this->subtrees) - 1;
|
||||
if ($last_subtree >= 0 && $this->subtrees[$last_subtree] instanceof _smarty_tag && $this->subtrees[$last_subtree]->saved_block_nesting < $this->parser->block_nesting_level) {
|
||||
if ($subtree instanceof _smarty_code) {
|
||||
$this->subtrees[$last_subtree]->data .= '<?php echo ' . $subtree->data . ';?>';
|
||||
} elseif ($subtree instanceof _smarty_dq_content) {
|
||||
$this->subtrees[$last_subtree]->data .= '<?php echo "' . $subtree->data . '";?>';
|
||||
} else {
|
||||
$this->subtrees[$last_subtree]->data .= $subtree->data;
|
||||
}
|
||||
} else {
|
||||
$this->subtrees[] = $subtree;
|
||||
}
|
||||
if ($subtree instanceof _smarty_tag) {
|
||||
$this->parser->block_nesting_level = count($this->parser->compiler->_tag_stack);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Merge subtree buffer content together
|
||||
*
|
||||
* @return string compiled template code
|
||||
*/
|
||||
public function to_smarty_php()
|
||||
{
|
||||
$code = '';
|
||||
foreach ($this->subtrees as $subtree) {
|
||||
if ($code !== "") {
|
||||
$code .= ".";
|
||||
}
|
||||
if ($subtree instanceof _smarty_tag) {
|
||||
$more_php = $subtree->assign_to_var();
|
||||
} else {
|
||||
$more_php = $subtree->to_smarty_php();
|
||||
}
|
||||
|
||||
$code .= $more_php;
|
||||
|
||||
if (!$subtree instanceof _smarty_dq_content) {
|
||||
$this->parser->compiler->has_variable_string = true;
|
||||
}
|
||||
}
|
||||
|
||||
return $code;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Raw chars as part of a double quoted string.
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Compiler
|
||||
* @ignore
|
||||
*/
|
||||
class _smarty_dq_content extends _smarty_parsetree
|
||||
{
|
||||
/**
|
||||
* Create parse tree buffer with string content
|
||||
*
|
||||
* @param object $parser parser object
|
||||
* @param string $data string section
|
||||
*/
|
||||
public function __construct($parser, $data)
|
||||
{
|
||||
$this->parser = $parser;
|
||||
$this->data = $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return content as double quoted string
|
||||
*
|
||||
* @return string doubled quoted string
|
||||
*/
|
||||
public function to_smarty_php()
|
||||
{
|
||||
return '"' . $this->data . '"';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Template element
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Compiler
|
||||
* @ignore
|
||||
*/
|
||||
class _smarty_template_buffer extends _smarty_parsetree
|
||||
{
|
||||
/**
|
||||
* Array of template elements
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $subtrees = Array();
|
||||
|
||||
/**
|
||||
* Create root of parse tree for template elements
|
||||
*
|
||||
* @param object $parser parse object
|
||||
*/
|
||||
public function __construct($parser)
|
||||
{
|
||||
$this->parser = $parser;
|
||||
}
|
||||
|
||||
/**
|
||||
* Append buffer to subtree
|
||||
*
|
||||
* @param _smarty_parsetree $subtree
|
||||
*/
|
||||
public function append_subtree(_smarty_parsetree $subtree)
|
||||
{
|
||||
$this->subtrees[] = $subtree;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sanitize and merge subtree buffers together
|
||||
*
|
||||
* @return string template code content
|
||||
*/
|
||||
public function to_smarty_php()
|
||||
{
|
||||
$code = '';
|
||||
for ($key = 0, $cnt = count($this->subtrees); $key < $cnt; $key++) {
|
||||
if ($key + 2 < $cnt) {
|
||||
if ($this->subtrees[$key] instanceof _smarty_linebreak && $this->subtrees[$key + 1] instanceof _smarty_tag && $this->subtrees[$key + 1]->data == '' && $this->subtrees[$key + 2] instanceof _smarty_linebreak) {
|
||||
$key = $key + 1;
|
||||
continue;
|
||||
}
|
||||
if (substr($this->subtrees[$key]->data, -1) == '<' && $this->subtrees[$key + 1]->data == '' && substr($this->subtrees[$key + 2]->data, -1) == '?') {
|
||||
$key = $key + 2;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (substr($code, -1) == '<') {
|
||||
$subtree = $this->subtrees[$key]->to_smarty_php();
|
||||
if (substr($subtree, 0, 1) == '?') {
|
||||
$code = substr($code, 0, strlen($code) - 1) . '<<?php ?>?' . substr($subtree, 1);
|
||||
} elseif ($this->parser->asp_tags && substr($subtree, 0, 1) == '%') {
|
||||
$code = substr($code, 0, strlen($code) - 1) . '<<?php ?>%' . substr($subtree, 1);
|
||||
} else {
|
||||
$code .= $subtree;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if ($this->parser->asp_tags && substr($code, -1) == '%') {
|
||||
$subtree = $this->subtrees[$key]->to_smarty_php();
|
||||
if (substr($subtree, 0, 1) == '>') {
|
||||
$code = substr($code, 0, strlen($code) - 1) . '%<?php ?>>' . substr($subtree, 1);
|
||||
} else {
|
||||
$code .= $subtree;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (substr($code, -1) == '?') {
|
||||
$subtree = $this->subtrees[$key]->to_smarty_php();
|
||||
if (substr($subtree, 0, 1) == '>') {
|
||||
$code = substr($code, 0, strlen($code) - 1) . '?<?php ?>>' . substr($subtree, 1);
|
||||
} else {
|
||||
$code .= $subtree;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
$code .= $this->subtrees[$key]->to_smarty_php();
|
||||
}
|
||||
|
||||
return $code;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* template text
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Compiler
|
||||
* @ignore
|
||||
*/
|
||||
class _smarty_text extends _smarty_parsetree
|
||||
{
|
||||
/**
|
||||
* Create template text buffer
|
||||
*
|
||||
* @param object $parser parser object
|
||||
* @param string $data text
|
||||
*/
|
||||
public function __construct($parser, $data)
|
||||
{
|
||||
$this->parser = $parser;
|
||||
$this->data = $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return buffer content
|
||||
*
|
||||
* @return strint text
|
||||
*/
|
||||
public function to_smarty_php()
|
||||
{
|
||||
return $this->data;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* template linebreaks
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Compiler
|
||||
* @ignore
|
||||
*/
|
||||
class _smarty_linebreak extends _smarty_parsetree
|
||||
{
|
||||
/**
|
||||
* Create buffer with linebreak content
|
||||
*
|
||||
* @param object $parser parser object
|
||||
* @param string $data linebreak string
|
||||
*/
|
||||
public function __construct($parser, $data)
|
||||
{
|
||||
$this->parser = $parser;
|
||||
$this->data = $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return linebrak
|
||||
*
|
||||
* @return string linebreak
|
||||
*/
|
||||
public function to_smarty_php()
|
||||
{
|
||||
return $this->data;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,89 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Smarty Internal Plugin Resource File
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage TemplateResources
|
||||
* @author Uwe Tews
|
||||
* @author Rodney Rehm
|
||||
*/
|
||||
|
||||
/**
|
||||
* Smarty Internal Plugin Resource File
|
||||
*
|
||||
* Implements the file system as resource for Smarty templates
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage TemplateResources
|
||||
*/
|
||||
class Smarty_Internal_Resource_File extends Smarty_Resource
|
||||
{
|
||||
/**
|
||||
* populate Source Object with meta data from Resource
|
||||
*
|
||||
* @param Smarty_Template_Source $source source object
|
||||
* @param Smarty_Internal_Template $_template template object
|
||||
*/
|
||||
public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template=null)
|
||||
{
|
||||
$source->filepath = $this->buildFilepath($source, $_template);
|
||||
|
||||
if ($source->filepath !== false) {
|
||||
if (is_object($source->smarty->security_policy)) {
|
||||
$source->smarty->security_policy->isTrustedResourceDir($source->filepath);
|
||||
}
|
||||
|
||||
$source->uid = sha1($source->filepath);
|
||||
if ($source->smarty->compile_check && !isset($source->timestamp)) {
|
||||
$source->timestamp = @filemtime($source->filepath);
|
||||
$source->exists = !!$source->timestamp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* populate Source Object with timestamp and exists from Resource
|
||||
*
|
||||
* @param Smarty_Template_Source $source source object
|
||||
*/
|
||||
public function populateTimestamp(Smarty_Template_Source $source)
|
||||
{
|
||||
$source->timestamp = @filemtime($source->filepath);
|
||||
$source->exists = !!$source->timestamp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load template's source from file into current template object
|
||||
*
|
||||
* @param Smarty_Template_Source $source source object
|
||||
* @return string template source
|
||||
* @throws SmartyException if source cannot be loaded
|
||||
*/
|
||||
public function getContent(Smarty_Template_Source $source)
|
||||
{
|
||||
if ($source->timestamp) {
|
||||
return file_get_contents($source->filepath);
|
||||
}
|
||||
if ($source instanceof Smarty_Config_Source) {
|
||||
throw new SmartyException("Unable to read config {$source->type} '{$source->name}'");
|
||||
}
|
||||
throw new SmartyException("Unable to read template {$source->type} '{$source->name}'");
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine basename for compiled filename
|
||||
*
|
||||
* @param Smarty_Template_Source $source source object
|
||||
* @return string resource's basename
|
||||
*/
|
||||
public function getBasename(Smarty_Template_Source $source)
|
||||
{
|
||||
$_file = $source->name;
|
||||
if (($_pos = strpos($_file, ']')) !== false) {
|
||||
$_file = substr($_file, $_pos + 1);
|
||||
}
|
||||
|
||||
return basename($_file);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,80 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Smarty Internal Plugin Resource Stream
|
||||
*
|
||||
* Implements the streams as resource for Smarty template
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage TemplateResources
|
||||
* @author Uwe Tews
|
||||
* @author Rodney Rehm
|
||||
*/
|
||||
|
||||
/**
|
||||
* Smarty Internal Plugin Resource Stream
|
||||
*
|
||||
* Implements the streams as resource for Smarty template
|
||||
*
|
||||
* @link http://php.net/streams
|
||||
* @package Smarty
|
||||
* @subpackage TemplateResources
|
||||
*/
|
||||
class Smarty_Internal_Resource_Stream extends Smarty_Resource_Recompiled
|
||||
{
|
||||
/**
|
||||
* populate Source Object with meta data from Resource
|
||||
*
|
||||
* @param Smarty_Template_Source $source source object
|
||||
* @param Smarty_Internal_Template $_template template object
|
||||
* @return void
|
||||
*/
|
||||
public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template=null)
|
||||
{
|
||||
if (strpos($source->resource, '://') !== false) {
|
||||
$source->filepath = $source->resource;
|
||||
} else {
|
||||
$source->filepath = str_replace(':', '://', $source->resource);
|
||||
}
|
||||
$source->uid = false;
|
||||
$source->content = $this->getContent($source);
|
||||
$source->timestamp = false;
|
||||
$source->exists = !!$source->content;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load template's source from stream into current template object
|
||||
*
|
||||
* @param Smarty_Template_Source $source source object
|
||||
* @return string template source
|
||||
* @throws SmartyException if source cannot be loaded
|
||||
*/
|
||||
public function getContent(Smarty_Template_Source $source)
|
||||
{
|
||||
$t = '';
|
||||
// the availability of the stream has already been checked in Smarty_Resource::fetch()
|
||||
$fp = fopen($source->filepath, 'r+');
|
||||
if ($fp) {
|
||||
while (!feof($fp) && ($current_line = fgets($fp)) !== false) {
|
||||
$t .= $current_line;
|
||||
}
|
||||
fclose($fp);
|
||||
|
||||
return $t;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* modify resource_name according to resource handlers specifications
|
||||
*
|
||||
* @param Smarty $smarty Smarty instance
|
||||
* @param string $resource_name resource_name to make unique
|
||||
* @param boolean $is_config flag for config resource
|
||||
* @return string unique resource name
|
||||
*/
|
||||
protected function buildUniqueResourceName(Smarty $smarty, $resource_name, $is_config = false)
|
||||
{
|
||||
return get_class($this) . '#' . $resource_name;
|
||||
}
|
||||
}
|
||||
@@ -1,708 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Smarty Internal Plugin Template
|
||||
*
|
||||
* This file contains the Smarty template engine
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Template
|
||||
* @author Uwe Tews
|
||||
*/
|
||||
|
||||
/**
|
||||
* Main class with template data structures and methods
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Template
|
||||
*
|
||||
* @property Smarty_Template_Source $source
|
||||
* @property Smarty_Template_Compiled $compiled
|
||||
* @property Smarty_Template_Cached $cached
|
||||
*/
|
||||
class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
|
||||
{
|
||||
/**
|
||||
* cache_id
|
||||
* @var string
|
||||
*/
|
||||
public $cache_id = null;
|
||||
/**
|
||||
* $compile_id
|
||||
* @var string
|
||||
*/
|
||||
public $compile_id = null;
|
||||
/**
|
||||
* caching enabled
|
||||
* @var boolean
|
||||
*/
|
||||
public $caching = null;
|
||||
/**
|
||||
* cache lifetime in seconds
|
||||
* @var integer
|
||||
*/
|
||||
public $cache_lifetime = null;
|
||||
/**
|
||||
* Template resource
|
||||
* @var string
|
||||
*/
|
||||
public $template_resource = null;
|
||||
/**
|
||||
* flag if compiled template is invalid and must be (re)compiled
|
||||
* @var bool
|
||||
*/
|
||||
public $mustCompile = null;
|
||||
/**
|
||||
* flag if template does contain nocache code sections
|
||||
* @var bool
|
||||
*/
|
||||
public $has_nocache_code = false;
|
||||
/**
|
||||
* special compiled and cached template properties
|
||||
* @var array
|
||||
*/
|
||||
public $properties = array('file_dependency' => array(),
|
||||
'nocache_hash' => '',
|
||||
'function' => array());
|
||||
/**
|
||||
* required plugins
|
||||
* @var array
|
||||
*/
|
||||
public $required_plugins = array('compiled' => array(), 'nocache' => array());
|
||||
/**
|
||||
* Global smarty instance
|
||||
* @var Smarty
|
||||
*/
|
||||
public $smarty = null;
|
||||
/**
|
||||
* blocks for template inheritance
|
||||
* @var array
|
||||
*/
|
||||
public $block_data = array();
|
||||
/**
|
||||
* variable filters
|
||||
* @var array
|
||||
*/
|
||||
public $variable_filters = array();
|
||||
/**
|
||||
* optional log of tag/attributes
|
||||
* @var array
|
||||
*/
|
||||
public $used_tags = array();
|
||||
/**
|
||||
* internal flag to allow relative path in child template blocks
|
||||
* @var bool
|
||||
*/
|
||||
public $allow_relative_path = false;
|
||||
/**
|
||||
* internal capture runtime stack
|
||||
* @var array
|
||||
*/
|
||||
public $_capture_stack = array(0 => array());
|
||||
|
||||
/**
|
||||
* Create template data object
|
||||
*
|
||||
* Some of the global Smarty settings copied to template scope
|
||||
* It load the required template resources and cacher plugins
|
||||
*
|
||||
* @param string $template_resource template resource string
|
||||
* @param Smarty $smarty Smarty instance
|
||||
* @param Smarty_Internal_Template $_parent back pointer to parent object with variables or null
|
||||
* @param mixed $_cache_id cache id or null
|
||||
* @param mixed $_compile_id compile id or null
|
||||
* @param bool $_caching use caching?
|
||||
* @param int $_cache_lifetime cache life-time in seconds
|
||||
*/
|
||||
public function __construct($template_resource, $smarty, $_parent = null, $_cache_id = null, $_compile_id = null, $_caching = null, $_cache_lifetime = null)
|
||||
{
|
||||
$this->smarty = &$smarty;
|
||||
// Smarty parameter
|
||||
$this->cache_id = $_cache_id === null ? $this->smarty->cache_id : $_cache_id;
|
||||
$this->compile_id = $_compile_id === null ? $this->smarty->compile_id : $_compile_id;
|
||||
$this->caching = $_caching === null ? $this->smarty->caching : $_caching;
|
||||
if ($this->caching === true)
|
||||
$this->caching = Smarty::CACHING_LIFETIME_CURRENT;
|
||||
$this->cache_lifetime = $_cache_lifetime === null ? $this->smarty->cache_lifetime : $_cache_lifetime;
|
||||
$this->parent = $_parent;
|
||||
// Template resource
|
||||
$this->template_resource = $template_resource;
|
||||
// copy block data of template inheritance
|
||||
if ($this->parent instanceof Smarty_Internal_Template) {
|
||||
$this->block_data = $this->parent->block_data;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns if the current template must be compiled by the Smarty compiler
|
||||
*
|
||||
* It does compare the timestamps of template source and the compiled templates and checks the force compile configuration
|
||||
*
|
||||
* @return boolean true if the template must be compiled
|
||||
*/
|
||||
public function mustCompile()
|
||||
{
|
||||
if (!$this->source->exists) {
|
||||
if ($this->parent instanceof Smarty_Internal_Template) {
|
||||
$parent_resource = " in '$this->parent->template_resource}'";
|
||||
} else {
|
||||
$parent_resource = '';
|
||||
}
|
||||
throw new SmartyException("Unable to load template {$this->source->type} '{$this->source->name}'{$parent_resource}");
|
||||
}
|
||||
if ($this->mustCompile === null) {
|
||||
$this->mustCompile = (!$this->source->uncompiled && ($this->smarty->force_compile || $this->source->recompiled || $this->compiled->timestamp === false ||
|
||||
($this->smarty->compile_check && $this->compiled->timestamp < $this->source->timestamp)));
|
||||
}
|
||||
|
||||
return $this->mustCompile;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compiles the template
|
||||
*
|
||||
* If the template is not evaluated the compiled template is saved on disk
|
||||
*/
|
||||
public function compileTemplateSource()
|
||||
{
|
||||
if (!$this->source->recompiled) {
|
||||
$this->properties['file_dependency'] = array();
|
||||
if ($this->source->components) {
|
||||
// for the extends resource the compiler will fill it
|
||||
// uses real resource for file dependency
|
||||
// $source = end($this->source->components);
|
||||
// $this->properties['file_dependency'][$this->source->uid] = array($this->source->filepath, $this->source->timestamp, $source->type);
|
||||
} else {
|
||||
$this->properties['file_dependency'][$this->source->uid] = array($this->source->filepath, $this->source->timestamp, $this->source->type);
|
||||
}
|
||||
}
|
||||
// compile locking
|
||||
if ($this->smarty->compile_locking && !$this->source->recompiled) {
|
||||
if ($saved_timestamp = $this->compiled->timestamp) {
|
||||
touch($this->compiled->filepath);
|
||||
}
|
||||
}
|
||||
// call compiler
|
||||
try {
|
||||
$code = $this->compiler->compileTemplate($this);
|
||||
} catch (Exception $e) {
|
||||
// restore old timestamp in case of error
|
||||
if ($this->smarty->compile_locking && !$this->source->recompiled && $saved_timestamp) {
|
||||
touch($this->compiled->filepath, $saved_timestamp);
|
||||
}
|
||||
throw $e;
|
||||
}
|
||||
// compiling succeded
|
||||
if (!$this->source->recompiled && $this->compiler->write_compiled_code) {
|
||||
// write compiled template
|
||||
$_filepath = $this->compiled->filepath;
|
||||
if ($_filepath === false)
|
||||
throw new SmartyException('getCompiledFilepath() did not return a destination to save the compiled template to');
|
||||
Smarty_Internal_Write_File::writeFile($_filepath, $code, $this->smarty);
|
||||
$this->compiled->exists = true;
|
||||
$this->compiled->isCompiled = true;
|
||||
}
|
||||
// release compiler object to free memory
|
||||
unset($this->compiler);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes the cached template output
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function writeCachedContent($content)
|
||||
{
|
||||
if ($this->source->recompiled || !($this->caching == Smarty::CACHING_LIFETIME_CURRENT || $this->caching == Smarty::CACHING_LIFETIME_SAVED)) {
|
||||
// don't write cache file
|
||||
return false;
|
||||
}
|
||||
$this->properties['cache_lifetime'] = $this->cache_lifetime;
|
||||
$this->properties['unifunc'] = 'content_' . str_replace('.', '_', uniqid('', true));
|
||||
$content = $this->createTemplateCodeFrame($content, true);
|
||||
$_smarty_tpl = $this;
|
||||
eval("?>" . $content);
|
||||
$this->cached->valid = true;
|
||||
$this->cached->processed = true;
|
||||
|
||||
return $this->cached->write($this, $content);
|
||||
}
|
||||
|
||||
/**
|
||||
* Template code runtime function to get subtemplate content
|
||||
*
|
||||
* @param string $template the resource handle of the template file
|
||||
* @param mixed $cache_id cache id to be used with this template
|
||||
* @param mixed $compile_id compile id to be used with this template
|
||||
* @param integer $caching cache mode
|
||||
* @param integer $cache_lifetime life time of cache data
|
||||
* @param array $vars optional variables to assign
|
||||
* @param int $parent_scope scope in which {include} should execute
|
||||
* @returns string template content
|
||||
*/
|
||||
public function getSubTemplate($template, $cache_id, $compile_id, $caching, $cache_lifetime, $data, $parent_scope)
|
||||
{
|
||||
// already in template cache?
|
||||
if ($this->smarty->allow_ambiguous_resources) {
|
||||
$_templateId = Smarty_Resource::getUniqueTemplateName($this->smarty, $template) . $cache_id . $compile_id;
|
||||
} else {
|
||||
$_templateId = $this->smarty->joined_template_dir . '#' . $template . $cache_id . $compile_id;
|
||||
}
|
||||
|
||||
if (isset($_templateId[150])) {
|
||||
$_templateId = sha1($_templateId);
|
||||
}
|
||||
if (isset($this->smarty->template_objects[$_templateId])) {
|
||||
// clone cached template object because of possible recursive call
|
||||
$tpl = clone $this->smarty->template_objects[$_templateId];
|
||||
$tpl->parent = $this;
|
||||
$tpl->caching = $caching;
|
||||
$tpl->cache_lifetime = $cache_lifetime;
|
||||
} else {
|
||||
$tpl = new $this->smarty->template_class($template, $this->smarty, $this, $cache_id, $compile_id, $caching, $cache_lifetime);
|
||||
}
|
||||
// get variables from calling scope
|
||||
if ($parent_scope == Smarty::SCOPE_LOCAL) {
|
||||
$tpl->tpl_vars = $this->tpl_vars;
|
||||
$tpl->tpl_vars['smarty'] = clone $this->tpl_vars['smarty'];
|
||||
} elseif ($parent_scope == Smarty::SCOPE_PARENT) {
|
||||
$tpl->tpl_vars = &$this->tpl_vars;
|
||||
} elseif ($parent_scope == Smarty::SCOPE_GLOBAL) {
|
||||
$tpl->tpl_vars = &Smarty::$global_tpl_vars;
|
||||
} elseif (($scope_ptr = $this->getScopePointer($parent_scope)) == null) {
|
||||
$tpl->tpl_vars = &$this->tpl_vars;
|
||||
} else {
|
||||
$tpl->tpl_vars = &$scope_ptr->tpl_vars;
|
||||
}
|
||||
$tpl->config_vars = $this->config_vars;
|
||||
if (!empty($data)) {
|
||||
// set up variable values
|
||||
foreach ($data as $_key => $_val) {
|
||||
$tpl->tpl_vars[$_key] = new Smarty_variable($_val);
|
||||
}
|
||||
}
|
||||
|
||||
return $tpl->fetch(null, null, null, null, false, false, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Template code runtime function to set up an inline subtemplate
|
||||
*
|
||||
* @param string $template the resource handle of the template file
|
||||
* @param mixed $cache_id cache id to be used with this template
|
||||
* @param mixed $compile_id compile id to be used with this template
|
||||
* @param integer $caching cache mode
|
||||
* @param integer $cache_lifetime life time of cache data
|
||||
* @param array $vars optional variables to assign
|
||||
* @param int $parent_scope scope in which {include} should execute
|
||||
* @param string $hash nocache hash code
|
||||
* @returns string template content
|
||||
*/
|
||||
public function setupInlineSubTemplate($template, $cache_id, $compile_id, $caching, $cache_lifetime, $data, $parent_scope, $hash)
|
||||
{
|
||||
$tpl = new $this->smarty->template_class($template, $this->smarty, $this, $cache_id, $compile_id, $caching, $cache_lifetime);
|
||||
$tpl->properties['nocache_hash'] = $hash;
|
||||
// get variables from calling scope
|
||||
if ($parent_scope == Smarty::SCOPE_LOCAL) {
|
||||
$tpl->tpl_vars = $this->tpl_vars;
|
||||
$tpl->tpl_vars['smarty'] = clone $this->tpl_vars['smarty'];
|
||||
} elseif ($parent_scope == Smarty::SCOPE_PARENT) {
|
||||
$tpl->tpl_vars = &$this->tpl_vars;
|
||||
} elseif ($parent_scope == Smarty::SCOPE_GLOBAL) {
|
||||
$tpl->tpl_vars = &Smarty::$global_tpl_vars;
|
||||
} elseif (($scope_ptr = $this->getScopePointer($parent_scope)) == null) {
|
||||
$tpl->tpl_vars = &$this->tpl_vars;
|
||||
} else {
|
||||
$tpl->tpl_vars = &$scope_ptr->tpl_vars;
|
||||
}
|
||||
$tpl->config_vars = $this->config_vars;
|
||||
if (!empty($data)) {
|
||||
// set up variable values
|
||||
foreach ($data as $_key => $_val) {
|
||||
$tpl->tpl_vars[$_key] = new Smarty_variable($_val);
|
||||
}
|
||||
}
|
||||
|
||||
return $tpl;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create code frame for compiled and cached templates
|
||||
*
|
||||
* @param string $content optional template content
|
||||
* @param bool $cache flag for cache file
|
||||
* @return string
|
||||
*/
|
||||
public function createTemplateCodeFrame($content = '', $cache = false)
|
||||
{
|
||||
$plugins_string = '';
|
||||
// include code for plugins
|
||||
if (!$cache) {
|
||||
if (!empty($this->required_plugins['compiled'])) {
|
||||
$plugins_string = '<?php ';
|
||||
foreach ($this->required_plugins['compiled'] as $tmp) {
|
||||
foreach ($tmp as $data) {
|
||||
$file = addslashes($data['file']);
|
||||
if (is_Array($data['function'])) {
|
||||
$plugins_string .= "if (!is_callable(array('{$data['function'][0]}','{$data['function'][1]}'))) include '{$file}';\n";
|
||||
} else {
|
||||
$plugins_string .= "if (!is_callable('{$data['function']}')) include '{$file}';\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
$plugins_string .= '?>';
|
||||
}
|
||||
if (!empty($this->required_plugins['nocache'])) {
|
||||
$this->has_nocache_code = true;
|
||||
$plugins_string .= "<?php echo '/*%%SmartyNocache:{$this->properties['nocache_hash']}%%*/<?php \$_smarty = \$_smarty_tpl->smarty; ";
|
||||
foreach ($this->required_plugins['nocache'] as $tmp) {
|
||||
foreach ($tmp as $data) {
|
||||
$file = addslashes($data['file']);
|
||||
if (is_Array($data['function'])) {
|
||||
$plugins_string .= addslashes("if (!is_callable(array('{$data['function'][0]}','{$data['function'][1]}'))) include '{$file}';\n");
|
||||
} else {
|
||||
$plugins_string .= addslashes("if (!is_callable('{$data['function']}')) include '{$file}';\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
$plugins_string .= "?>/*/%%SmartyNocache:{$this->properties['nocache_hash']}%%*/';?>\n";
|
||||
}
|
||||
}
|
||||
// build property code
|
||||
$this->properties['has_nocache_code'] = $this->has_nocache_code;
|
||||
$output = '';
|
||||
if (!$this->source->recompiled) {
|
||||
$output = "<?php /*%%SmartyHeaderCode:{$this->properties['nocache_hash']}%%*/";
|
||||
if ($this->smarty->direct_access_security) {
|
||||
$output .= "if(!defined('SMARTY_DIR')) exit('no direct access allowed');\n";
|
||||
}
|
||||
}
|
||||
if ($cache) {
|
||||
// remove compiled code of{function} definition
|
||||
unset($this->properties['function']);
|
||||
if (!empty($this->smarty->template_functions)) {
|
||||
// copy code of {function} tags called in nocache mode
|
||||
foreach ($this->smarty->template_functions as $name => $function_data) {
|
||||
if (isset($function_data['called_nocache'])) {
|
||||
foreach ($function_data['called_functions'] as $func_name) {
|
||||
$this->smarty->template_functions[$func_name]['called_nocache'] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach ($this->smarty->template_functions as $name => $function_data) {
|
||||
if (isset($function_data['called_nocache'])) {
|
||||
unset($function_data['called_nocache'], $function_data['called_functions'], $this->smarty->template_functions[$name]['called_nocache']);
|
||||
$this->properties['function'][$name] = $function_data;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->properties['version'] = Smarty::SMARTY_VERSION;
|
||||
if (!isset($this->properties['unifunc'])) {
|
||||
$this->properties['unifunc'] = 'content_' . str_replace('.', '_', uniqid('', true));
|
||||
}
|
||||
if (!$this->source->recompiled) {
|
||||
$output .= "\$_valid = \$_smarty_tpl->decodeProperties(" . var_export($this->properties, true) . ',' . ($cache ? 'true' : 'false') . "); /*/%%SmartyHeaderCode%%*/?>\n";
|
||||
$output .= '<?php if ($_valid && !is_callable(\'' . $this->properties['unifunc'] . '\')) {function ' . $this->properties['unifunc'] . '($_smarty_tpl) {?>';
|
||||
}
|
||||
$output .= $plugins_string;
|
||||
$output .= $content;
|
||||
if (!$this->source->recompiled) {
|
||||
$output .= "<?php }} ?>\n";
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function is executed automatically when a compiled or cached template file is included
|
||||
*
|
||||
* - Decode saved properties from compiled template and cache files
|
||||
* - Check if compiled or cache file is valid
|
||||
*
|
||||
* @param array $properties special template properties
|
||||
* @param bool $cache flag if called from cache file
|
||||
* @return bool flag if compiled or cache file is valid
|
||||
*/
|
||||
public function decodeProperties($properties, $cache = false)
|
||||
{
|
||||
$this->has_nocache_code = $properties['has_nocache_code'];
|
||||
$this->properties['nocache_hash'] = $properties['nocache_hash'];
|
||||
if (isset($properties['cache_lifetime'])) {
|
||||
$this->properties['cache_lifetime'] = $properties['cache_lifetime'];
|
||||
}
|
||||
if (isset($properties['file_dependency'])) {
|
||||
$this->properties['file_dependency'] = array_merge($this->properties['file_dependency'], $properties['file_dependency']);
|
||||
}
|
||||
if (!empty($properties['function'])) {
|
||||
$this->properties['function'] = array_merge($this->properties['function'], $properties['function']);
|
||||
$this->smarty->template_functions = array_merge($this->smarty->template_functions, $properties['function']);
|
||||
}
|
||||
$this->properties['version'] = (isset($properties['version'])) ? $properties['version'] : '';
|
||||
$this->properties['unifunc'] = $properties['unifunc'];
|
||||
// check file dependencies at compiled code
|
||||
$is_valid = true;
|
||||
if ($this->properties['version'] != Smarty::SMARTY_VERSION) {
|
||||
$is_valid = false;
|
||||
} elseif (((!$cache && $this->smarty->compile_check && empty($this->compiled->_properties) && !$this->compiled->isCompiled) || $cache && ($this->smarty->compile_check === true || $this->smarty->compile_check === Smarty::COMPILECHECK_ON)) && !empty($this->properties['file_dependency'])) {
|
||||
foreach ($this->properties['file_dependency'] as $_file_to_check) {
|
||||
if ($_file_to_check[2] == 'file' || $_file_to_check[2] == 'php') {
|
||||
if ($this->source->filepath == $_file_to_check[0] && isset($this->source->timestamp)) {
|
||||
// do not recheck current template
|
||||
$mtime = $this->source->timestamp;
|
||||
} else {
|
||||
// file and php types can be checked without loading the respective resource handlers
|
||||
$mtime = @filemtime($_file_to_check[0]);
|
||||
}
|
||||
} elseif ($_file_to_check[2] == 'string') {
|
||||
continue;
|
||||
} else {
|
||||
$source = Smarty_Resource::source(null, $this->smarty, $_file_to_check[0]);
|
||||
$mtime = $source->timestamp;
|
||||
}
|
||||
if (!$mtime || $mtime > $_file_to_check[1]) {
|
||||
$is_valid = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($cache) {
|
||||
// CACHING_LIFETIME_SAVED cache expiry has to be validated here since otherwise we'd define the unifunc
|
||||
if ($this->caching === Smarty::CACHING_LIFETIME_SAVED &&
|
||||
$this->properties['cache_lifetime'] >= 0 &&
|
||||
(time() > ($this->cached->timestamp + $this->properties['cache_lifetime']))) {
|
||||
$is_valid = false;
|
||||
}
|
||||
$this->cached->valid = $is_valid;
|
||||
} else {
|
||||
$this->mustCompile = !$is_valid; }
|
||||
// store data in reusable Smarty_Template_Compiled
|
||||
if (!$cache) {
|
||||
$this->compiled->_properties = $properties;
|
||||
}
|
||||
|
||||
return $is_valid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Template code runtime function to create a local Smarty variable for array assignments
|
||||
*
|
||||
* @param string $tpl_var tempate variable name
|
||||
* @param bool $nocache cache mode of variable
|
||||
* @param int $scope scope of variable
|
||||
*/
|
||||
public function createLocalArrayVariable($tpl_var, $nocache = false, $scope = Smarty::SCOPE_LOCAL)
|
||||
{
|
||||
if (!isset($this->tpl_vars[$tpl_var])) {
|
||||
$this->tpl_vars[$tpl_var] = new Smarty_variable(array(), $nocache, $scope);
|
||||
} else {
|
||||
$this->tpl_vars[$tpl_var] = clone $this->tpl_vars[$tpl_var];
|
||||
if ($scope != Smarty::SCOPE_LOCAL) {
|
||||
$this->tpl_vars[$tpl_var]->scope = $scope;
|
||||
}
|
||||
if (!(is_array($this->tpl_vars[$tpl_var]->value) || $this->tpl_vars[$tpl_var]->value instanceof ArrayAccess)) {
|
||||
settype($this->tpl_vars[$tpl_var]->value, 'array');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Template code runtime function to get pointer to template variable array of requested scope
|
||||
*
|
||||
* @param int $scope requested variable scope
|
||||
* @return array array of template variables
|
||||
*/
|
||||
public function &getScope($scope)
|
||||
{
|
||||
if ($scope == Smarty::SCOPE_PARENT && !empty($this->parent)) {
|
||||
return $this->parent->tpl_vars;
|
||||
} elseif ($scope == Smarty::SCOPE_ROOT && !empty($this->parent)) {
|
||||
$ptr = $this->parent;
|
||||
while (!empty($ptr->parent)) {
|
||||
$ptr = $ptr->parent;
|
||||
}
|
||||
|
||||
return $ptr->tpl_vars;
|
||||
} elseif ($scope == Smarty::SCOPE_GLOBAL) {
|
||||
return Smarty::$global_tpl_vars;
|
||||
}
|
||||
$null = null;
|
||||
|
||||
return $null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get parent or root of template parent chain
|
||||
*
|
||||
* @param int $scope pqrent or root scope
|
||||
* @return mixed object
|
||||
*/
|
||||
public function getScopePointer($scope)
|
||||
{
|
||||
if ($scope == Smarty::SCOPE_PARENT && !empty($this->parent)) {
|
||||
return $this->parent;
|
||||
} elseif ($scope == Smarty::SCOPE_ROOT && !empty($this->parent)) {
|
||||
$ptr = $this->parent;
|
||||
while (!empty($ptr->parent)) {
|
||||
$ptr = $ptr->parent;
|
||||
}
|
||||
|
||||
return $ptr;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* [util function] counts an array, arrayaccess/traversable or PDOStatement object
|
||||
*
|
||||
* @param mixed $value
|
||||
* @return int the count for arrays and objects that implement countable, 1 for other objects that don't, and 0 for empty elements
|
||||
*/
|
||||
public function _count($value)
|
||||
{
|
||||
if (is_array($value) === true || $value instanceof Countable) {
|
||||
return count($value);
|
||||
} elseif ($value instanceof IteratorAggregate) {
|
||||
// Note: getIterator() returns a Traversable, not an Iterator
|
||||
// thus rewind() and valid() methods may not be present
|
||||
return iterator_count($value->getIterator());
|
||||
} elseif ($value instanceof Iterator) {
|
||||
return iterator_count($value);
|
||||
} elseif ($value instanceof PDOStatement) {
|
||||
return $value->rowCount();
|
||||
} elseif ($value instanceof Traversable) {
|
||||
return iterator_count($value);
|
||||
} elseif ($value instanceof ArrayAccess) {
|
||||
if ($value->offsetExists(0)) {
|
||||
return 1;
|
||||
}
|
||||
} elseif (is_object($value)) {
|
||||
return count($value);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* runtime error not matching capture tags
|
||||
*
|
||||
*/
|
||||
public function capture_error()
|
||||
{
|
||||
throw new SmartyException("Not matching {capture} open/close in \"{$this->template_resource}\"");
|
||||
}
|
||||
|
||||
/**
|
||||
* Empty cache for this template
|
||||
*
|
||||
* @param integer $exp_time expiration time
|
||||
* @return integer number of cache files deleted
|
||||
*/
|
||||
public function clearCache($exp_time=null)
|
||||
{
|
||||
Smarty_CacheResource::invalidLoadedCache($this->smarty);
|
||||
|
||||
return $this->cached->handler->clear($this->smarty, $this->template_name, $this->cache_id, $this->compile_id, $exp_time);
|
||||
}
|
||||
|
||||
/**
|
||||
* set Smarty property in template context
|
||||
*
|
||||
* @param string $property_name property name
|
||||
* @param mixed $value value
|
||||
*/
|
||||
public function __set($property_name, $value)
|
||||
{
|
||||
switch ($property_name) {
|
||||
case 'source':
|
||||
case 'compiled':
|
||||
case 'cached':
|
||||
case 'compiler':
|
||||
$this->$property_name = $value;
|
||||
|
||||
return;
|
||||
|
||||
// FIXME: routing of template -> smarty attributes
|
||||
default:
|
||||
if (property_exists($this->smarty, $property_name)) {
|
||||
$this->smarty->$property_name = $value;
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
throw new SmartyException("invalid template property '$property_name'.");
|
||||
}
|
||||
|
||||
/**
|
||||
* get Smarty property in template context
|
||||
*
|
||||
* @param string $property_name property name
|
||||
*/
|
||||
public function __get($property_name)
|
||||
{
|
||||
switch ($property_name) {
|
||||
case 'source':
|
||||
if (strlen($this->template_resource) == 0) {
|
||||
throw new SmartyException('Missing template name');
|
||||
}
|
||||
$this->source = Smarty_Resource::source($this);
|
||||
// cache template object under a unique ID
|
||||
// do not cache eval resources
|
||||
if ($this->source->type != 'eval') {
|
||||
if ($this->smarty->allow_ambiguous_resources) {
|
||||
$_templateId = $this->source->unique_resource . $this->cache_id . $this->compile_id;
|
||||
} else {
|
||||
$_templateId = $this->smarty->joined_template_dir . '#' . $this->template_resource . $this->cache_id . $this->compile_id;
|
||||
}
|
||||
|
||||
if (isset($_templateId[150])) {
|
||||
$_templateId = sha1($_templateId);
|
||||
}
|
||||
$this->smarty->template_objects[$_templateId] = $this;
|
||||
}
|
||||
|
||||
return $this->source;
|
||||
|
||||
case 'compiled':
|
||||
$this->compiled = $this->source->getCompiled($this);
|
||||
|
||||
return $this->compiled;
|
||||
|
||||
case 'cached':
|
||||
if (!class_exists('Smarty_Template_Cached')) {
|
||||
include SMARTY_SYSPLUGINS_DIR . 'smarty_cacheresource.php';
|
||||
}
|
||||
$this->cached = new Smarty_Template_Cached($this);
|
||||
|
||||
return $this->cached;
|
||||
|
||||
case 'compiler':
|
||||
$this->smarty->loadPlugin($this->source->compiler_class);
|
||||
$this->compiler = new $this->source->compiler_class($this->source->template_lexer_class, $this->source->template_parser_class, $this->smarty);
|
||||
|
||||
return $this->compiler;
|
||||
|
||||
// FIXME: routing of template -> smarty attributes
|
||||
default:
|
||||
if (property_exists($this->smarty, $property_name)) {
|
||||
return $this->smarty->$property_name;
|
||||
}
|
||||
}
|
||||
|
||||
throw new SmartyException("template property '$property_name' does not exist.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Template data object destrutor
|
||||
*
|
||||
*/
|
||||
public function __destruct()
|
||||
{
|
||||
if ($this->smarty->cache_locking && isset($this->cached) && $this->cached->is_locked) {
|
||||
$this->cached->handler->releaseLock($this->smarty, $this->cached);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,822 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Smarty Internal Plugin Smarty Template Base
|
||||
*
|
||||
* This file contains the basic shared methodes for template handling
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Template
|
||||
* @author Uwe Tews
|
||||
*/
|
||||
|
||||
/**
|
||||
* Class with shared template methodes
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Template
|
||||
*/
|
||||
abstract class Smarty_Internal_TemplateBase extends Smarty_Internal_Data
|
||||
{
|
||||
/**
|
||||
* fetches a rendered Smarty template
|
||||
*
|
||||
* @param string $template the resource handle of the template file or template object
|
||||
* @param mixed $cache_id cache id to be used with this template
|
||||
* @param mixed $compile_id compile id to be used with this template
|
||||
* @param object $parent next higher level of Smarty variables
|
||||
* @param bool $display true: display, false: fetch
|
||||
* @param bool $merge_tpl_vars if true parent template variables merged in to local scope
|
||||
* @param bool $no_output_filter if true do not run output filter
|
||||
* @return string rendered template output
|
||||
*/
|
||||
public function fetch($template = null, $cache_id = null, $compile_id = null, $parent = null, $display = false, $merge_tpl_vars = true, $no_output_filter = false)
|
||||
{
|
||||
if ($template === null && $this instanceof $this->template_class) {
|
||||
$template = $this;
|
||||
}
|
||||
if (!empty($cache_id) && is_object($cache_id)) {
|
||||
$parent = $cache_id;
|
||||
$cache_id = null;
|
||||
}
|
||||
if ($parent === null && ($this instanceof Smarty || is_string($template))) {
|
||||
$parent = $this;
|
||||
}
|
||||
// create template object if necessary
|
||||
$_template = ($template instanceof $this->template_class)
|
||||
? $template
|
||||
: $this->smarty->createTemplate($template, $cache_id, $compile_id, $parent, false);
|
||||
// if called by Smarty object make sure we use current caching status
|
||||
if ($this instanceof Smarty) {
|
||||
$_template->caching = $this->caching;
|
||||
}
|
||||
// merge all variable scopes into template
|
||||
if ($merge_tpl_vars) {
|
||||
// save local variables
|
||||
$save_tpl_vars = $_template->tpl_vars;
|
||||
$save_config_vars = $_template->config_vars;
|
||||
$ptr_array = array($_template);
|
||||
$ptr = $_template;
|
||||
while (isset($ptr->parent)) {
|
||||
$ptr_array[] = $ptr = $ptr->parent;
|
||||
}
|
||||
$ptr_array = array_reverse($ptr_array);
|
||||
$parent_ptr = reset($ptr_array);
|
||||
$tpl_vars = $parent_ptr->tpl_vars;
|
||||
$config_vars = $parent_ptr->config_vars;
|
||||
while ($parent_ptr = next($ptr_array)) {
|
||||
if (!empty($parent_ptr->tpl_vars)) {
|
||||
$tpl_vars = array_merge($tpl_vars, $parent_ptr->tpl_vars);
|
||||
}
|
||||
if (!empty($parent_ptr->config_vars)) {
|
||||
$config_vars = array_merge($config_vars, $parent_ptr->config_vars);
|
||||
}
|
||||
}
|
||||
if (!empty(Smarty::$global_tpl_vars)) {
|
||||
$tpl_vars = array_merge(Smarty::$global_tpl_vars, $tpl_vars);
|
||||
}
|
||||
$_template->tpl_vars = $tpl_vars;
|
||||
$_template->config_vars = $config_vars;
|
||||
}
|
||||
// dummy local smarty variable
|
||||
if (!isset($_template->tpl_vars['smarty'])) {
|
||||
$_template->tpl_vars['smarty'] = new Smarty_Variable;
|
||||
}
|
||||
if (isset($this->smarty->error_reporting)) {
|
||||
$_smarty_old_error_level = error_reporting($this->smarty->error_reporting);
|
||||
}
|
||||
// check URL debugging control
|
||||
if (!$this->smarty->debugging && $this->smarty->debugging_ctrl == 'URL') {
|
||||
if (isset($_SERVER['QUERY_STRING'])) {
|
||||
$_query_string = $_SERVER['QUERY_STRING'];
|
||||
} else {
|
||||
$_query_string = '';
|
||||
}
|
||||
if (false !== strpos($_query_string, $this->smarty->smarty_debug_id)) {
|
||||
if (false !== strpos($_query_string, $this->smarty->smarty_debug_id . '=on')) {
|
||||
// enable debugging for this browser session
|
||||
setcookie('SMARTY_DEBUG', true);
|
||||
$this->smarty->debugging = true;
|
||||
} elseif (false !== strpos($_query_string, $this->smarty->smarty_debug_id . '=off')) {
|
||||
// disable debugging for this browser session
|
||||
setcookie('SMARTY_DEBUG', false);
|
||||
$this->smarty->debugging = false;
|
||||
} else {
|
||||
// enable debugging for this page
|
||||
$this->smarty->debugging = true;
|
||||
}
|
||||
} else {
|
||||
if (isset($_COOKIE['SMARTY_DEBUG'])) {
|
||||
$this->smarty->debugging = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
// must reset merge template date
|
||||
$_template->smarty->merged_templates_func = array();
|
||||
// get rendered template
|
||||
// disable caching for evaluated code
|
||||
if ($_template->source->recompiled) {
|
||||
$_template->caching = false;
|
||||
}
|
||||
// checks if template exists
|
||||
if (!$_template->source->exists) {
|
||||
if ($_template->parent instanceof Smarty_Internal_Template) {
|
||||
$parent_resource = " in '{$_template->parent->template_resource}'";
|
||||
} else {
|
||||
$parent_resource = '';
|
||||
}
|
||||
throw new SmartyException("Unable to load template {$_template->source->type} '{$_template->source->name}'{$parent_resource}");
|
||||
}
|
||||
// read from cache or render
|
||||
if (!($_template->caching == Smarty::CACHING_LIFETIME_CURRENT || $_template->caching == Smarty::CACHING_LIFETIME_SAVED) || !$_template->cached->valid) {
|
||||
// render template (not loaded and not in cache)
|
||||
if (!$_template->source->uncompiled) {
|
||||
$_smarty_tpl = $_template;
|
||||
if ($_template->source->recompiled) {
|
||||
$code = $_template->compiler->compileTemplate($_template);
|
||||
if ($this->smarty->debugging) {
|
||||
Smarty_Internal_Debug::start_render($_template);
|
||||
}
|
||||
try {
|
||||
ob_start();
|
||||
eval("?>" . $code);
|
||||
unset($code);
|
||||
} catch (Exception $e) {
|
||||
ob_get_clean();
|
||||
throw $e;
|
||||
}
|
||||
} else {
|
||||
if (!$_template->compiled->exists || ($_template->smarty->force_compile && !$_template->compiled->isCompiled)) {
|
||||
$_template->compileTemplateSource();
|
||||
$code = file_get_contents($_template->compiled->filepath);
|
||||
eval("?>" . $code);
|
||||
unset($code);
|
||||
$_template->compiled->loaded = true;
|
||||
$_template->compiled->isCompiled = true;
|
||||
}
|
||||
if ($this->smarty->debugging) {
|
||||
Smarty_Internal_Debug::start_render($_template);
|
||||
}
|
||||
if (!$_template->compiled->loaded) {
|
||||
include($_template->compiled->filepath);
|
||||
if ($_template->mustCompile) {
|
||||
// recompile and load again
|
||||
$_template->compileTemplateSource();
|
||||
$code = file_get_contents($_template->compiled->filepath);
|
||||
eval("?>" . $code);
|
||||
unset($code);
|
||||
$_template->compiled->isCompiled = true;
|
||||
}
|
||||
$_template->compiled->loaded = true;
|
||||
} else {
|
||||
$_template->decodeProperties($_template->compiled->_properties, false);
|
||||
}
|
||||
try {
|
||||
ob_start();
|
||||
if (empty($_template->properties['unifunc']) || !is_callable($_template->properties['unifunc'])) {
|
||||
throw new SmartyException("Invalid compiled template for '{$_template->template_resource}'");
|
||||
}
|
||||
array_unshift($_template->_capture_stack,array());
|
||||
//
|
||||
// render compiled template
|
||||
//
|
||||
$_template->properties['unifunc']($_template);
|
||||
// any unclosed {capture} tags ?
|
||||
if (isset($_template->_capture_stack[0][0])) {
|
||||
$_template->capture_error();
|
||||
}
|
||||
array_shift($_template->_capture_stack);
|
||||
} catch (Exception $e) {
|
||||
ob_get_clean();
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if ($_template->source->uncompiled) {
|
||||
if ($this->smarty->debugging) {
|
||||
Smarty_Internal_Debug::start_render($_template);
|
||||
}
|
||||
try {
|
||||
ob_start();
|
||||
$_template->source->renderUncompiled($_template);
|
||||
} catch (Exception $e) {
|
||||
ob_get_clean();
|
||||
throw $e;
|
||||
}
|
||||
} else {
|
||||
throw new SmartyException("Resource '$_template->source->type' must have 'renderUncompiled' method");
|
||||
}
|
||||
}
|
||||
$_output = ob_get_clean();
|
||||
if (!$_template->source->recompiled && empty($_template->properties['file_dependency'][$_template->source->uid])) {
|
||||
$_template->properties['file_dependency'][$_template->source->uid] = array($_template->source->filepath, $_template->source->timestamp, $_template->source->type);
|
||||
}
|
||||
if ($_template->parent instanceof Smarty_Internal_Template) {
|
||||
$_template->parent->properties['file_dependency'] = array_merge($_template->parent->properties['file_dependency'], $_template->properties['file_dependency']);
|
||||
foreach ($_template->required_plugins as $code => $tmp1) {
|
||||
foreach ($tmp1 as $name => $tmp) {
|
||||
foreach ($tmp as $type => $data) {
|
||||
$_template->parent->required_plugins[$code][$name][$type] = $data;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($this->smarty->debugging) {
|
||||
Smarty_Internal_Debug::end_render($_template);
|
||||
}
|
||||
// write to cache when nessecary
|
||||
if (!$_template->source->recompiled && ($_template->caching == Smarty::CACHING_LIFETIME_SAVED || $_template->caching == Smarty::CACHING_LIFETIME_CURRENT)) {
|
||||
if ($this->smarty->debugging) {
|
||||
Smarty_Internal_Debug::start_cache($_template);
|
||||
}
|
||||
$_template->properties['has_nocache_code'] = false;
|
||||
// get text between non-cached items
|
||||
$cache_split = preg_split("!/\*%%SmartyNocache:{$_template->properties['nocache_hash']}%%\*\/(.+?)/\*/%%SmartyNocache:{$_template->properties['nocache_hash']}%%\*/!s", $_output);
|
||||
// get non-cached items
|
||||
preg_match_all("!/\*%%SmartyNocache:{$_template->properties['nocache_hash']}%%\*\/(.+?)/\*/%%SmartyNocache:{$_template->properties['nocache_hash']}%%\*/!s", $_output, $cache_parts);
|
||||
$output = '';
|
||||
// loop over items, stitch back together
|
||||
foreach ($cache_split as $curr_idx => $curr_split) {
|
||||
// escape PHP tags in template content
|
||||
$output .= preg_replace('/(<%|%>|<\?php|<\?|\?>)/', "<?php echo '\$1'; ?>\n", $curr_split);
|
||||
if (isset($cache_parts[0][$curr_idx])) {
|
||||
$_template->properties['has_nocache_code'] = true;
|
||||
// remove nocache tags from cache output
|
||||
$output .= preg_replace("!/\*/?%%SmartyNocache:{$_template->properties['nocache_hash']}%%\*/!", '', $cache_parts[0][$curr_idx]);
|
||||
}
|
||||
}
|
||||
if (!$no_output_filter && !$_template->has_nocache_code && (isset($this->smarty->autoload_filters['output']) || isset($this->smarty->registered_filters['output']))) {
|
||||
$output = Smarty_Internal_Filter_Handler::runFilter('output', $output, $_template);
|
||||
}
|
||||
// rendering (must be done before writing cache file because of {function} nocache handling)
|
||||
$_smarty_tpl = $_template;
|
||||
try {
|
||||
ob_start();
|
||||
eval("?>" . $output);
|
||||
$_output = ob_get_clean();
|
||||
} catch (Exception $e) {
|
||||
ob_get_clean();
|
||||
throw $e;
|
||||
}
|
||||
// write cache file content
|
||||
$_template->writeCachedContent($output);
|
||||
if ($this->smarty->debugging) {
|
||||
Smarty_Internal_Debug::end_cache($_template);
|
||||
}
|
||||
} else {
|
||||
// var_dump('renderTemplate', $_template->has_nocache_code, $_template->template_resource, $_template->properties['nocache_hash'], $_template->parent->properties['nocache_hash'], $_output);
|
||||
if (!empty($_template->properties['nocache_hash']) && !empty($_template->parent->properties['nocache_hash'])) {
|
||||
// replace nocache_hash
|
||||
$_output = str_replace("{$_template->properties['nocache_hash']}", $_template->parent->properties['nocache_hash'], $_output);
|
||||
$_template->parent->has_nocache_code = $_template->parent->has_nocache_code || $_template->has_nocache_code;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if ($this->smarty->debugging) {
|
||||
Smarty_Internal_Debug::start_cache($_template);
|
||||
}
|
||||
try {
|
||||
ob_start();
|
||||
array_unshift($_template->_capture_stack,array());
|
||||
//
|
||||
// render cached template
|
||||
//
|
||||
$_template->properties['unifunc']($_template);
|
||||
// any unclosed {capture} tags ?
|
||||
if (isset($_template->_capture_stack[0][0])) {
|
||||
$_template->capture_error();
|
||||
}
|
||||
array_shift($_template->_capture_stack);
|
||||
$_output = ob_get_clean();
|
||||
} catch (Exception $e) {
|
||||
ob_get_clean();
|
||||
throw $e;
|
||||
}
|
||||
if ($this->smarty->debugging) {
|
||||
Smarty_Internal_Debug::end_cache($_template);
|
||||
}
|
||||
}
|
||||
if ((!$this->caching || $_template->has_nocache_code || $_template->source->recompiled) && !$no_output_filter && (isset($this->smarty->autoload_filters['output']) || isset($this->smarty->registered_filters['output']))) {
|
||||
$_output = Smarty_Internal_Filter_Handler::runFilter('output', $_output, $_template);
|
||||
}
|
||||
if (isset($this->error_reporting)) {
|
||||
error_reporting($_smarty_old_error_level);
|
||||
}
|
||||
// display or fetch
|
||||
if ($display) {
|
||||
if ($this->caching && $this->cache_modified_check) {
|
||||
$_isCached = $_template->isCached() && !$_template->has_nocache_code;
|
||||
$_last_modified_date = @substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 0, strpos($_SERVER['HTTP_IF_MODIFIED_SINCE'], 'GMT') + 3);
|
||||
if ($_isCached && $_template->cached->timestamp <= strtotime($_last_modified_date)) {
|
||||
switch (PHP_SAPI) {
|
||||
case 'cgi': // php-cgi < 5.3
|
||||
case 'cgi-fcgi': // php-cgi >= 5.3
|
||||
case 'fpm-fcgi': // php-fpm >= 5.3.3
|
||||
header('Status: 304 Not Modified');
|
||||
break;
|
||||
|
||||
case 'cli':
|
||||
if (/* ^phpunit */!empty($_SERVER['SMARTY_PHPUNIT_DISABLE_HEADERS'])/* phpunit$ */) {
|
||||
$_SERVER['SMARTY_PHPUNIT_HEADERS'][] = '304 Not Modified';
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
header($_SERVER['SERVER_PROTOCOL'].' 304 Not Modified');
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
switch (PHP_SAPI) {
|
||||
case 'cli':
|
||||
if (/* ^phpunit */!empty($_SERVER['SMARTY_PHPUNIT_DISABLE_HEADERS'])/* phpunit$ */) {
|
||||
$_SERVER['SMARTY_PHPUNIT_HEADERS'][] = 'Last-Modified: ' . gmdate('D, d M Y H:i:s', $_template->cached->timestamp) . ' GMT';
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $_template->cached->timestamp) . ' GMT');
|
||||
break;
|
||||
}
|
||||
echo $_output;
|
||||
}
|
||||
} else {
|
||||
echo $_output;
|
||||
}
|
||||
// debug output
|
||||
if ($this->smarty->debugging) {
|
||||
Smarty_Internal_Debug::display_debug($this);
|
||||
}
|
||||
if ($merge_tpl_vars) {
|
||||
// restore local variables
|
||||
$_template->tpl_vars = $save_tpl_vars;
|
||||
$_template->config_vars = $save_config_vars;
|
||||
}
|
||||
|
||||
return;
|
||||
} else {
|
||||
if ($merge_tpl_vars) {
|
||||
// restore local variables
|
||||
$_template->tpl_vars = $save_tpl_vars;
|
||||
$_template->config_vars = $save_config_vars;
|
||||
}
|
||||
// return fetched content
|
||||
return $_output;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* displays a Smarty template
|
||||
*
|
||||
* @param string $template the resource handle of the template file or template object
|
||||
* @param mixed $cache_id cache id to be used with this template
|
||||
* @param mixed $compile_id compile id to be used with this template
|
||||
* @param object $parent next higher level of Smarty variables
|
||||
*/
|
||||
public function display($template = null, $cache_id = null, $compile_id = null, $parent = null)
|
||||
{
|
||||
// display template
|
||||
$this->fetch($template, $cache_id, $compile_id, $parent, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* test if cache is valid
|
||||
*
|
||||
* @param string|object $template the resource handle of the template file or template object
|
||||
* @param mixed $cache_id cache id to be used with this template
|
||||
* @param mixed $compile_id compile id to be used with this template
|
||||
* @param object $parent next higher level of Smarty variables
|
||||
* @return boolean cache status
|
||||
*/
|
||||
public function isCached($template = null, $cache_id = null, $compile_id = null, $parent = null)
|
||||
{
|
||||
if ($template === null && $this instanceof $this->template_class) {
|
||||
return $this->cached->valid;
|
||||
}
|
||||
if (!($template instanceof $this->template_class)) {
|
||||
if ($parent === null) {
|
||||
$parent = $this;
|
||||
}
|
||||
$template = $this->smarty->createTemplate($template, $cache_id, $compile_id, $parent, false);
|
||||
}
|
||||
// return cache status of template
|
||||
return $template->cached->valid;
|
||||
}
|
||||
|
||||
/**
|
||||
* creates a data object
|
||||
*
|
||||
* @param object $parent next higher level of Smarty variables
|
||||
* @returns Smarty_Data data object
|
||||
*/
|
||||
public function createData($parent = null)
|
||||
{
|
||||
return new Smarty_Data($parent, $this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers plugin to be used in templates
|
||||
*
|
||||
* @param string $type plugin type
|
||||
* @param string $tag name of template tag
|
||||
* @param callback $callback PHP callback to register
|
||||
* @param boolean $cacheable if true (default) this fuction is cachable
|
||||
* @param array $cache_attr caching attributes if any
|
||||
* @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
|
||||
* @throws SmartyException when the plugin tag is invalid
|
||||
*/
|
||||
public function registerPlugin($type, $tag, $callback, $cacheable = true, $cache_attr = null)
|
||||
{
|
||||
if (isset($this->smarty->registered_plugins[$type][$tag])) {
|
||||
throw new SmartyException("Plugin tag \"{$tag}\" already registered");
|
||||
} elseif (!is_callable($callback)) {
|
||||
throw new SmartyException("Plugin \"{$tag}\" not callable");
|
||||
} else {
|
||||
$this->smarty->registered_plugins[$type][$tag] = array($callback, (bool) $cacheable, (array) $cache_attr);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregister Plugin
|
||||
*
|
||||
* @param string $type of plugin
|
||||
* @param string $tag name of plugin
|
||||
* @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
|
||||
*/
|
||||
public function unregisterPlugin($type, $tag)
|
||||
{
|
||||
if (isset($this->smarty->registered_plugins[$type][$tag])) {
|
||||
unset($this->smarty->registered_plugins[$type][$tag]);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a resource to fetch a template
|
||||
*
|
||||
* @param string $type name of resource type
|
||||
* @param Smarty_Resource|array $callback or instance of Smarty_Resource, or array of callbacks to handle resource (deprecated)
|
||||
* @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
|
||||
*/
|
||||
public function registerResource($type, $callback)
|
||||
{
|
||||
$this->smarty->registered_resources[$type] = $callback instanceof Smarty_Resource ? $callback : array($callback, false);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregisters a resource
|
||||
*
|
||||
* @param string $type name of resource type
|
||||
* @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
|
||||
*/
|
||||
public function unregisterResource($type)
|
||||
{
|
||||
if (isset($this->smarty->registered_resources[$type])) {
|
||||
unset($this->smarty->registered_resources[$type]);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a cache resource to cache a template's output
|
||||
*
|
||||
* @param string $type name of cache resource type
|
||||
* @param Smarty_CacheResource $callback instance of Smarty_CacheResource to handle output caching
|
||||
* @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
|
||||
*/
|
||||
public function registerCacheResource($type, Smarty_CacheResource $callback)
|
||||
{
|
||||
$this->smarty->registered_cache_resources[$type] = $callback;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregisters a cache resource
|
||||
*
|
||||
* @param string $type name of cache resource type
|
||||
* @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
|
||||
*/
|
||||
public function unregisterCacheResource($type)
|
||||
{
|
||||
if (isset($this->smarty->registered_cache_resources[$type])) {
|
||||
unset($this->smarty->registered_cache_resources[$type]);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 block-methods
|
||||
* @param array $block_functs list of methods that are block format
|
||||
* @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
|
||||
* @throws SmartyException if any of the methods in $allowed or $block_methods are invalid
|
||||
*/
|
||||
public function registerObject($object_name, $object_impl, $allowed = array(), $smarty_args = true, $block_methods = array())
|
||||
{
|
||||
// test if allowed methodes callable
|
||||
if (!empty($allowed)) {
|
||||
foreach ((array) $allowed as $method) {
|
||||
if (!is_callable(array($object_impl, $method)) && !property_exists($object_impl, $method)) {
|
||||
throw new SmartyException("Undefined method or property '$method' in registered object");
|
||||
}
|
||||
}
|
||||
}
|
||||
// test if block methodes callable
|
||||
if (!empty($block_methods)) {
|
||||
foreach ((array) $block_methods as $method) {
|
||||
if (!is_callable(array($object_impl, $method))) {
|
||||
throw new SmartyException("Undefined method '$method' in registered object");
|
||||
}
|
||||
}
|
||||
}
|
||||
// register the object
|
||||
$this->smarty->registered_objects[$object_name] =
|
||||
array($object_impl, (array) $allowed, (boolean) $smarty_args, (array) $block_methods);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* return a reference to a registered object
|
||||
*
|
||||
* @param string $name object name
|
||||
* @return object
|
||||
* @throws SmartyException if no such object is found
|
||||
*/
|
||||
public function getRegisteredObject($name)
|
||||
{
|
||||
if (!isset($this->smarty->registered_objects[$name])) {
|
||||
throw new SmartyException("'$name' is not a registered object");
|
||||
}
|
||||
if (!is_object($this->smarty->registered_objects[$name][0])) {
|
||||
throw new SmartyException("registered '$name' is not an object");
|
||||
}
|
||||
|
||||
return $this->smarty->registered_objects[$name][0];
|
||||
}
|
||||
|
||||
/**
|
||||
* unregister an object
|
||||
*
|
||||
* @param string $name object name
|
||||
* @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
|
||||
*/
|
||||
public function unregisterObject($name)
|
||||
{
|
||||
if (isset($this->smarty->registered_objects[$name])) {
|
||||
unset($this->smarty->registered_objects[$name]);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers static classes to be used in templates
|
||||
*
|
||||
* @param string $class name of template class
|
||||
* @param string $class_impl the referenced PHP class to register
|
||||
* @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
|
||||
* @throws SmartyException if $class_impl does not refer to an existing class
|
||||
*/
|
||||
public function registerClass($class_name, $class_impl)
|
||||
{
|
||||
// test if exists
|
||||
if (!class_exists($class_impl)) {
|
||||
throw new SmartyException("Undefined class '$class_impl' in register template class");
|
||||
}
|
||||
// register the class
|
||||
$this->smarty->registered_classes[$class_name] = $class_impl;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a default plugin handler
|
||||
*
|
||||
* @param callable $callback class/method name
|
||||
* @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
|
||||
* @throws SmartyException if $callback is not callable
|
||||
*/
|
||||
public function registerDefaultPluginHandler($callback)
|
||||
{
|
||||
if (is_callable($callback)) {
|
||||
$this->smarty->default_plugin_handler_func = $callback;
|
||||
} else {
|
||||
throw new SmartyException("Default plugin handler '$callback' not callable");
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a default template handler
|
||||
*
|
||||
* @param callable $callback class/method name
|
||||
* @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
|
||||
* @throws SmartyException if $callback is not callable
|
||||
*/
|
||||
public function registerDefaultTemplateHandler($callback)
|
||||
{
|
||||
if (is_callable($callback)) {
|
||||
$this->smarty->default_template_handler_func = $callback;
|
||||
} else {
|
||||
throw new SmartyException("Default template handler '$callback' not callable");
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a default template handler
|
||||
*
|
||||
* @param callable $callback class/method name
|
||||
* @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
|
||||
* @throws SmartyException if $callback is not callable
|
||||
*/
|
||||
public function registerDefaultConfigHandler($callback)
|
||||
{
|
||||
if (is_callable($callback)) {
|
||||
$this->smarty->default_config_handler_func = $callback;
|
||||
} else {
|
||||
throw new SmartyException("Default config handler '$callback' not callable");
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a filter function
|
||||
*
|
||||
* @param string $type filter type
|
||||
* @param callback $callback
|
||||
* @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
|
||||
*/
|
||||
public function registerFilter($type, $callback)
|
||||
{
|
||||
$this->smarty->registered_filters[$type][$this->_get_filter_name($callback)] = $callback;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregisters a filter function
|
||||
*
|
||||
* @param string $type filter type
|
||||
* @param callback $callback
|
||||
* @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
|
||||
*/
|
||||
public function unregisterFilter($type, $callback)
|
||||
{
|
||||
$name = $this->_get_filter_name($callback);
|
||||
if (isset($this->smarty->registered_filters[$type][$name])) {
|
||||
unset($this->smarty->registered_filters[$type][$name]);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return internal filter name
|
||||
*
|
||||
* @param callback $function_name
|
||||
* @return string internal filter name
|
||||
*/
|
||||
public function _get_filter_name($function_name)
|
||||
{
|
||||
if (is_array($function_name)) {
|
||||
$_class_name = (is_object($function_name[0]) ?
|
||||
get_class($function_name[0]) : $function_name[0]);
|
||||
|
||||
return $_class_name . '_' . $function_name[1];
|
||||
} else {
|
||||
return $function_name;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* load a filter of specified type and name
|
||||
*
|
||||
* @param string $type filter type
|
||||
* @param string $name filter name
|
||||
* @throws SmartyException if filter could not be loaded
|
||||
*/
|
||||
public function loadFilter($type, $name)
|
||||
{
|
||||
$_plugin = "smarty_{$type}filter_{$name}";
|
||||
$_filter_name = $_plugin;
|
||||
if ($this->smarty->loadPlugin($_plugin)) {
|
||||
if (class_exists($_plugin, false)) {
|
||||
$_plugin = array($_plugin, 'execute');
|
||||
}
|
||||
if (is_callable($_plugin)) {
|
||||
$this->smarty->registered_filters[$type][$_filter_name] = $_plugin;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
throw new SmartyException("{$type}filter \"{$name}\" not callable");
|
||||
}
|
||||
|
||||
/**
|
||||
* unload a filter of specified type and name
|
||||
*
|
||||
* @param string $type filter type
|
||||
* @param string $name filter name
|
||||
* @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
|
||||
*/
|
||||
public function unloadFilter($type, $name)
|
||||
{
|
||||
$_filter_name = "smarty_{$type}filter_{$name}";
|
||||
if (isset($this->smarty->registered_filters[$type][$_filter_name])) {
|
||||
unset ($this->smarty->registered_filters[$type][$_filter_name]);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* preg_replace callback to convert camelcase getter/setter to underscore property names
|
||||
*
|
||||
* @param string $match match string
|
||||
* @return string replacemant
|
||||
*/
|
||||
private function replaceCamelcase($match)
|
||||
{
|
||||
return "_" . strtolower($match[1]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle unknown class methods
|
||||
*
|
||||
* @param string $name unknown method-name
|
||||
* @param array $args argument array
|
||||
*/
|
||||
public function __call($name, $args)
|
||||
{
|
||||
static $_prefixes = array('set' => true, 'get' => true);
|
||||
static $_resolved_property_name = array();
|
||||
static $_resolved_property_source = array();
|
||||
|
||||
// method of Smarty object?
|
||||
if (method_exists($this->smarty, $name)) {
|
||||
return call_user_func_array(array($this->smarty, $name), $args);
|
||||
}
|
||||
// see if this is a set/get for a property
|
||||
$first3 = strtolower(substr($name, 0, 3));
|
||||
if (isset($_prefixes[$first3]) && isset($name[3]) && $name[3] !== '_') {
|
||||
if (isset($_resolved_property_name[$name])) {
|
||||
$property_name = $_resolved_property_name[$name];
|
||||
} else {
|
||||
// try to keep case correct for future PHP 6.0 case-sensitive class methods
|
||||
// lcfirst() not available < PHP 5.3.0, so improvise
|
||||
$property_name = strtolower(substr($name, 3, 1)) . substr($name, 4);
|
||||
// convert camel case to underscored name
|
||||
$property_name = preg_replace_callback('/([A-Z])/', array($this,'replaceCamelcase'), $property_name);
|
||||
$_resolved_property_name[$name] = $property_name;
|
||||
}
|
||||
if (isset($_resolved_property_source[$property_name])) {
|
||||
$_is_this = $_resolved_property_source[$property_name];
|
||||
} else {
|
||||
$_is_this = null;
|
||||
if (property_exists($this, $property_name)) {
|
||||
$_is_this = true;
|
||||
} elseif (property_exists($this->smarty, $property_name)) {
|
||||
$_is_this = false;
|
||||
}
|
||||
$_resolved_property_source[$property_name] = $_is_this;
|
||||
}
|
||||
if ($_is_this) {
|
||||
if ($first3 == 'get')
|
||||
return $this->$property_name;
|
||||
else
|
||||
return $this->$property_name = $args[0];
|
||||
} elseif ($_is_this === false) {
|
||||
if ($first3 == 'get')
|
||||
return $this->smarty->$property_name;
|
||||
else
|
||||
return $this->smarty->$property_name = $args[0];
|
||||
} else {
|
||||
throw new SmartyException("property '$property_name' does not exist.");
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if ($name == 'Smarty') {
|
||||
throw new SmartyException("PHP5 requires you to call __construct() instead of Smarty()");
|
||||
}
|
||||
// must be unknown
|
||||
throw new SmartyException("Call of unknown method '$name'.");
|
||||
}
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,823 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Project: Smarty: the PHP compiling template engine
|
||||
* File: smarty_internal_utility.php
|
||||
* SVN: $Id: smarty_internal_utility.php 4737 2013-12-11 06:29:51Z gullevek $
|
||||
*
|
||||
* 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
|
||||
* @package Smarty
|
||||
* @subpackage PluginsInternal
|
||||
* @version 3-SVN$Rev: 4737 $
|
||||
*/
|
||||
|
||||
/**
|
||||
* Utility class
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Security
|
||||
*/
|
||||
class Smarty_Internal_Utility
|
||||
{
|
||||
/**
|
||||
* private constructor to prevent calls creation of new instances
|
||||
*/
|
||||
final private function __construct()
|
||||
{
|
||||
// intentionally left blank
|
||||
}
|
||||
|
||||
/**
|
||||
* Compile all template files
|
||||
*
|
||||
* @param string $extension template file name extension
|
||||
* @param bool $force_compile force all to recompile
|
||||
* @param int $time_limit set maximum execution time
|
||||
* @param int $max_errors set maximum allowed errors
|
||||
* @param Smarty $smarty Smarty instance
|
||||
* @return integer number of template files compiled
|
||||
*/
|
||||
public static function compileAllTemplates($extension, $force_compile, $time_limit, $max_errors, Smarty $smarty)
|
||||
{
|
||||
// switch off time limit
|
||||
if (function_exists('set_time_limit')) {
|
||||
@set_time_limit($time_limit);
|
||||
}
|
||||
$smarty->force_compile = $force_compile;
|
||||
$_count = 0;
|
||||
$_error_count = 0;
|
||||
// loop over array of template directories
|
||||
foreach ($smarty->getTemplateDir() as $_dir) {
|
||||
$_compileDirs = new RecursiveDirectoryIterator($_dir);
|
||||
$_compile = new RecursiveIteratorIterator($_compileDirs);
|
||||
foreach ($_compile as $_fileinfo) {
|
||||
$_file = $_fileinfo->getFilename();
|
||||
if (substr(basename($_fileinfo->getPathname()),0,1) == '.' || strpos($_file, '.svn') !== false) continue;
|
||||
if (!substr_compare($_file, $extension, - strlen($extension)) == 0) continue;
|
||||
if ($_fileinfo->getPath() == substr($_dir, 0, -1)) {
|
||||
$_template_file = $_file;
|
||||
} else {
|
||||
$_template_file = substr($_fileinfo->getPath(), strlen($_dir)) . DS . $_file;
|
||||
}
|
||||
echo '<br>', $_dir, '---', $_template_file;
|
||||
flush();
|
||||
$_start_time = microtime(true);
|
||||
try {
|
||||
$_tpl = $smarty->createTemplate($_template_file,null,null,null,false);
|
||||
if ($_tpl->mustCompile()) {
|
||||
$_tpl->compileTemplateSource();
|
||||
$_count++;
|
||||
echo ' compiled in ', microtime(true) - $_start_time, ' seconds';
|
||||
flush();
|
||||
} else {
|
||||
echo ' is up to date';
|
||||
flush();
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
echo 'Error: ', $e->getMessage(), "<br><br>";
|
||||
$_error_count++;
|
||||
}
|
||||
// free memory
|
||||
$smarty->template_objects = array();
|
||||
$_tpl->smarty->template_objects = array();
|
||||
$_tpl = null;
|
||||
if ($max_errors !== null && $_error_count == $max_errors) {
|
||||
echo '<br><br>too many errors';
|
||||
exit();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $_count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compile all config files
|
||||
*
|
||||
* @param string $extension config file name extension
|
||||
* @param bool $force_compile force all to recompile
|
||||
* @param int $time_limit set maximum execution time
|
||||
* @param int $max_errors set maximum allowed errors
|
||||
* @param Smarty $smarty Smarty instance
|
||||
* @return integer number of config files compiled
|
||||
*/
|
||||
public static function compileAllConfig($extension, $force_compile, $time_limit, $max_errors, Smarty $smarty)
|
||||
{
|
||||
// switch off time limit
|
||||
if (function_exists('set_time_limit')) {
|
||||
@set_time_limit($time_limit);
|
||||
}
|
||||
$smarty->force_compile = $force_compile;
|
||||
$_count = 0;
|
||||
$_error_count = 0;
|
||||
// loop over array of template directories
|
||||
foreach ($smarty->getConfigDir() as $_dir) {
|
||||
$_compileDirs = new RecursiveDirectoryIterator($_dir);
|
||||
$_compile = new RecursiveIteratorIterator($_compileDirs);
|
||||
foreach ($_compile as $_fileinfo) {
|
||||
$_file = $_fileinfo->getFilename();
|
||||
if (substr(basename($_fileinfo->getPathname()),0,1) == '.' || strpos($_file, '.svn') !== false) continue;
|
||||
if (!substr_compare($_file, $extension, - strlen($extension)) == 0) continue;
|
||||
if ($_fileinfo->getPath() == substr($_dir, 0, -1)) {
|
||||
$_config_file = $_file;
|
||||
} else {
|
||||
$_config_file = substr($_fileinfo->getPath(), strlen($_dir)) . DS . $_file;
|
||||
}
|
||||
echo '<br>', $_dir, '---', $_config_file;
|
||||
flush();
|
||||
$_start_time = microtime(true);
|
||||
try {
|
||||
$_config = new Smarty_Internal_Config($_config_file, $smarty);
|
||||
if ($_config->mustCompile()) {
|
||||
$_config->compileConfigSource();
|
||||
$_count++;
|
||||
echo ' compiled in ', microtime(true) - $_start_time, ' seconds';
|
||||
flush();
|
||||
} else {
|
||||
echo ' is up to date';
|
||||
flush();
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
echo 'Error: ', $e->getMessage(), "<br><br>";
|
||||
$_error_count++;
|
||||
}
|
||||
if ($max_errors !== null && $_error_count == $max_errors) {
|
||||
echo '<br><br>too many errors';
|
||||
exit();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $_count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete compiled template file
|
||||
*
|
||||
* @param string $resource_name template name
|
||||
* @param string $compile_id compile id
|
||||
* @param integer $exp_time expiration time
|
||||
* @param Smarty $smarty Smarty instance
|
||||
* @return integer number of template files deleted
|
||||
*/
|
||||
public static function clearCompiledTemplate($resource_name, $compile_id, $exp_time, Smarty $smarty)
|
||||
{
|
||||
$_compile_dir = $smarty->getCompileDir();
|
||||
$_compile_id = isset($compile_id) ? preg_replace('![^\w\|]+!', '_', $compile_id) : null;
|
||||
$_dir_sep = $smarty->use_sub_dirs ? DS : '^';
|
||||
if (isset($resource_name)) {
|
||||
$_save_stat = $smarty->caching;
|
||||
$smarty->caching = false;
|
||||
$tpl = new $smarty->template_class($resource_name, $smarty);
|
||||
$smarty->caching = $_save_stat;
|
||||
|
||||
// remove from template cache
|
||||
$tpl->source; // have the template registered before unset()
|
||||
if ($smarty->allow_ambiguous_resources) {
|
||||
$_templateId = $tpl->source->unique_resource . $tpl->cache_id . $tpl->compile_id;
|
||||
} else {
|
||||
$_templateId = $smarty->joined_template_dir . '#' . $resource_name . $tpl->cache_id . $tpl->compile_id;
|
||||
}
|
||||
if (isset($_templateId[150])) {
|
||||
$_templateId = sha1($_templateId);
|
||||
}
|
||||
unset($smarty->template_objects[$_templateId]);
|
||||
|
||||
if ($tpl->source->exists) {
|
||||
$_resource_part_1 = basename(str_replace('^', '/', $tpl->compiled->filepath));
|
||||
$_resource_part_1_length = strlen($_resource_part_1);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
|
||||
$_resource_part_2 = str_replace('.php','.cache.php',$_resource_part_1);
|
||||
$_resource_part_2_length = strlen($_resource_part_2);
|
||||
}
|
||||
$_dir = $_compile_dir;
|
||||
if ($smarty->use_sub_dirs && isset($_compile_id)) {
|
||||
$_dir .= $_compile_id . $_dir_sep;
|
||||
}
|
||||
if (isset($_compile_id)) {
|
||||
$_compile_id_part = $_compile_dir . $_compile_id . $_dir_sep;
|
||||
$_compile_id_part_length = strlen($_compile_id_part);
|
||||
}
|
||||
$_count = 0;
|
||||
try {
|
||||
$_compileDirs = new RecursiveDirectoryIterator($_dir);
|
||||
// NOTE: UnexpectedValueException thrown for PHP >= 5.3
|
||||
} catch (Exception $e) {
|
||||
return 0;
|
||||
}
|
||||
$_compile = new RecursiveIteratorIterator($_compileDirs, RecursiveIteratorIterator::CHILD_FIRST);
|
||||
foreach ($_compile as $_file) {
|
||||
if (substr(basename($_file->getPathname()), 0, 1) == '.' || strpos($_file, '.svn') !== false)
|
||||
continue;
|
||||
|
||||
$_filepath = (string) $_file;
|
||||
|
||||
if ($_file->isDir()) {
|
||||
if (!$_compile->isDot()) {
|
||||
// delete folder if empty
|
||||
@rmdir($_file->getPathname());
|
||||
}
|
||||
} else {
|
||||
$unlink = false;
|
||||
if ((!isset($_compile_id) || (isset($_filepath[$_compile_id_part_length]) && !strncmp($_filepath, $_compile_id_part, $_compile_id_part_length)))
|
||||
&& (!isset($resource_name)
|
||||
|| (isset($_filepath[$_resource_part_1_length])
|
||||
&& substr_compare($_filepath, $_resource_part_1, -$_resource_part_1_length, $_resource_part_1_length) == 0)
|
||||
|| (isset($_filepath[$_resource_part_2_length])
|
||||
&& substr_compare($_filepath, $_resource_part_2, -$_resource_part_2_length, $_resource_part_2_length) == 0))) {
|
||||
if (isset($exp_time)) {
|
||||
if (time() - @filemtime($_filepath) >= $exp_time) {
|
||||
$unlink = true;
|
||||
}
|
||||
} else {
|
||||
$unlink = true;
|
||||
}
|
||||
}
|
||||
|
||||
if ($unlink && @unlink($_filepath)) {
|
||||
$_count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
// clear compiled cache
|
||||
Smarty_Resource::$sources = array();
|
||||
Smarty_Resource::$compileds = array();
|
||||
|
||||
return $_count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return array of tag/attributes of all tags used by an template
|
||||
*
|
||||
* @param Smarty_Internal_Template $templae template object
|
||||
* @return array of tag/attributes
|
||||
*/
|
||||
public static function getTags(Smarty_Internal_Template $template)
|
||||
{
|
||||
$template->smarty->get_used_tags = true;
|
||||
$template->compileTemplateSource();
|
||||
|
||||
return $template->used_tags;
|
||||
}
|
||||
|
||||
/**
|
||||
* diagnose Smarty setup
|
||||
*
|
||||
* If $errors is secified, the diagnostic report will be appended to the array, rather than being output.
|
||||
*
|
||||
* @param Smarty $smarty Smarty instance to test
|
||||
* @param array $errors array to push results into rather than outputting them
|
||||
* @return bool status, true if everything is fine, false else
|
||||
*/
|
||||
public static function testInstall(Smarty $smarty, &$errors=null)
|
||||
{
|
||||
$status = true;
|
||||
|
||||
if ($errors === null) {
|
||||
echo "<PRE>\n";
|
||||
echo "Smarty Installation test...\n";
|
||||
echo "Testing template directory...\n";
|
||||
}
|
||||
|
||||
$_stream_resolve_include_path = function_exists('stream_resolve_include_path');
|
||||
|
||||
// test if all registered template_dir are accessible
|
||||
foreach ($smarty->getTemplateDir() as $template_dir) {
|
||||
$_template_dir = $template_dir;
|
||||
$template_dir = realpath($template_dir);
|
||||
// resolve include_path or fail existence
|
||||
if (!$template_dir) {
|
||||
if ($smarty->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_template_dir)) {
|
||||
// try PHP include_path
|
||||
if ($_stream_resolve_include_path) {
|
||||
$template_dir = stream_resolve_include_path($_template_dir);
|
||||
} else {
|
||||
$template_dir = Smarty_Internal_Get_Include_Path::getIncludePath($_template_dir);
|
||||
}
|
||||
|
||||
if ($template_dir !== false) {
|
||||
if ($errors === null) {
|
||||
echo "$template_dir is OK.\n";
|
||||
}
|
||||
|
||||
continue;
|
||||
} else {
|
||||
$status = false;
|
||||
$message = "FAILED: $_template_dir does not exist (and couldn't be found in include_path either)";
|
||||
if ($errors === null) {
|
||||
echo $message . ".\n";
|
||||
} else {
|
||||
$errors['template_dir'] = $message;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
$status = false;
|
||||
$message = "FAILED: $_template_dir does not exist";
|
||||
if ($errors === null) {
|
||||
echo $message . ".\n";
|
||||
} else {
|
||||
$errors['template_dir'] = $message;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (!is_dir($template_dir)) {
|
||||
$status = false;
|
||||
$message = "FAILED: $template_dir is not a directory";
|
||||
if ($errors === null) {
|
||||
echo $message . ".\n";
|
||||
} else {
|
||||
$errors['template_dir'] = $message;
|
||||
}
|
||||
} elseif (!is_readable($template_dir)) {
|
||||
$status = false;
|
||||
$message = "FAILED: $template_dir is not readable";
|
||||
if ($errors === null) {
|
||||
echo $message . ".\n";
|
||||
} else {
|
||||
$errors['template_dir'] = $message;
|
||||
}
|
||||
} else {
|
||||
if ($errors === null) {
|
||||
echo "$template_dir is OK.\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($errors === null) {
|
||||
echo "Testing compile directory...\n";
|
||||
}
|
||||
|
||||
// test if registered compile_dir is accessible
|
||||
$__compile_dir = $smarty->getCompileDir();
|
||||
$_compile_dir = realpath($__compile_dir);
|
||||
if (!$_compile_dir) {
|
||||
$status = false;
|
||||
$message = "FAILED: {$__compile_dir} does not exist";
|
||||
if ($errors === null) {
|
||||
echo $message . ".\n";
|
||||
} else {
|
||||
$errors['compile_dir'] = $message;
|
||||
}
|
||||
} elseif (!is_dir($_compile_dir)) {
|
||||
$status = false;
|
||||
$message = "FAILED: {$_compile_dir} is not a directory";
|
||||
if ($errors === null) {
|
||||
echo $message . ".\n";
|
||||
} else {
|
||||
$errors['compile_dir'] = $message;
|
||||
}
|
||||
} elseif (!is_readable($_compile_dir)) {
|
||||
$status = false;
|
||||
$message = "FAILED: {$_compile_dir} is not readable";
|
||||
if ($errors === null) {
|
||||
echo $message . ".\n";
|
||||
} else {
|
||||
$errors['compile_dir'] = $message;
|
||||
}
|
||||
} elseif (!is_writable($_compile_dir)) {
|
||||
$status = false;
|
||||
$message = "FAILED: {$_compile_dir} is not writable";
|
||||
if ($errors === null) {
|
||||
echo $message . ".\n";
|
||||
} else {
|
||||
$errors['compile_dir'] = $message;
|
||||
}
|
||||
} else {
|
||||
if ($errors === null) {
|
||||
echo "{$_compile_dir} is OK.\n";
|
||||
}
|
||||
}
|
||||
|
||||
if ($errors === null) {
|
||||
echo "Testing plugins directory...\n";
|
||||
}
|
||||
|
||||
// test if all registered plugins_dir are accessible
|
||||
// and if core plugins directory is still registered
|
||||
$_core_plugins_dir = realpath(dirname(__FILE__) .'/../plugins');
|
||||
$_core_plugins_available = false;
|
||||
foreach ($smarty->getPluginsDir() as $plugin_dir) {
|
||||
$_plugin_dir = $plugin_dir;
|
||||
$plugin_dir = realpath($plugin_dir);
|
||||
// resolve include_path or fail existence
|
||||
if (!$plugin_dir) {
|
||||
if ($smarty->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_plugin_dir)) {
|
||||
// try PHP include_path
|
||||
if ($_stream_resolve_include_path) {
|
||||
$plugin_dir = stream_resolve_include_path($_plugin_dir);
|
||||
} else {
|
||||
$plugin_dir = Smarty_Internal_Get_Include_Path::getIncludePath($_plugin_dir);
|
||||
}
|
||||
|
||||
if ($plugin_dir !== false) {
|
||||
if ($errors === null) {
|
||||
echo "$plugin_dir is OK.\n";
|
||||
}
|
||||
|
||||
continue;
|
||||
} else {
|
||||
$status = false;
|
||||
$message = "FAILED: $_plugin_dir does not exist (and couldn't be found in include_path either)";
|
||||
if ($errors === null) {
|
||||
echo $message . ".\n";
|
||||
} else {
|
||||
$errors['plugins_dir'] = $message;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
$status = false;
|
||||
$message = "FAILED: $_plugin_dir does not exist";
|
||||
if ($errors === null) {
|
||||
echo $message . ".\n";
|
||||
} else {
|
||||
$errors['plugins_dir'] = $message;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (!is_dir($plugin_dir)) {
|
||||
$status = false;
|
||||
$message = "FAILED: $plugin_dir is not a directory";
|
||||
if ($errors === null) {
|
||||
echo $message . ".\n";
|
||||
} else {
|
||||
$errors['plugins_dir'] = $message;
|
||||
}
|
||||
} elseif (!is_readable($plugin_dir)) {
|
||||
$status = false;
|
||||
$message = "FAILED: $plugin_dir is not readable";
|
||||
if ($errors === null) {
|
||||
echo $message . ".\n";
|
||||
} else {
|
||||
$errors['plugins_dir'] = $message;
|
||||
}
|
||||
} elseif ($_core_plugins_dir && $_core_plugins_dir == realpath($plugin_dir)) {
|
||||
$_core_plugins_available = true;
|
||||
if ($errors === null) {
|
||||
echo "$plugin_dir is OK.\n";
|
||||
}
|
||||
} else {
|
||||
if ($errors === null) {
|
||||
echo "$plugin_dir is OK.\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!$_core_plugins_available) {
|
||||
$status = false;
|
||||
$message = "WARNING: Smarty's own libs/plugins is not available";
|
||||
if ($errors === null) {
|
||||
echo $message . ".\n";
|
||||
} elseif (!isset($errors['plugins_dir'])) {
|
||||
$errors['plugins_dir'] = $message;
|
||||
}
|
||||
}
|
||||
|
||||
if ($errors === null) {
|
||||
echo "Testing cache directory...\n";
|
||||
}
|
||||
|
||||
// test if all registered cache_dir is accessible
|
||||
$__cache_dir = $smarty->getCacheDir();
|
||||
$_cache_dir = realpath($__cache_dir);
|
||||
if (!$_cache_dir) {
|
||||
$status = false;
|
||||
$message = "FAILED: {$__cache_dir} does not exist";
|
||||
if ($errors === null) {
|
||||
echo $message . ".\n";
|
||||
} else {
|
||||
$errors['cache_dir'] = $message;
|
||||
}
|
||||
} elseif (!is_dir($_cache_dir)) {
|
||||
$status = false;
|
||||
$message = "FAILED: {$_cache_dir} is not a directory";
|
||||
if ($errors === null) {
|
||||
echo $message . ".\n";
|
||||
} else {
|
||||
$errors['cache_dir'] = $message;
|
||||
}
|
||||
} elseif (!is_readable($_cache_dir)) {
|
||||
$status = false;
|
||||
$message = "FAILED: {$_cache_dir} is not readable";
|
||||
if ($errors === null) {
|
||||
echo $message . ".\n";
|
||||
} else {
|
||||
$errors['cache_dir'] = $message;
|
||||
}
|
||||
} elseif (!is_writable($_cache_dir)) {
|
||||
$status = false;
|
||||
$message = "FAILED: {$_cache_dir} is not writable";
|
||||
if ($errors === null) {
|
||||
echo $message . ".\n";
|
||||
} else {
|
||||
$errors['cache_dir'] = $message;
|
||||
}
|
||||
} else {
|
||||
if ($errors === null) {
|
||||
echo "{$_cache_dir} is OK.\n";
|
||||
}
|
||||
}
|
||||
|
||||
if ($errors === null) {
|
||||
echo "Testing configs directory...\n";
|
||||
}
|
||||
|
||||
// test if all registered config_dir are accessible
|
||||
foreach ($smarty->getConfigDir() as $config_dir) {
|
||||
$_config_dir = $config_dir;
|
||||
$config_dir = realpath($config_dir);
|
||||
// resolve include_path or fail existence
|
||||
if (!$config_dir) {
|
||||
if ($smarty->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_config_dir)) {
|
||||
// try PHP include_path
|
||||
if ($_stream_resolve_include_path) {
|
||||
$config_dir = stream_resolve_include_path($_config_dir);
|
||||
} else {
|
||||
$config_dir = Smarty_Internal_Get_Include_Path::getIncludePath($_config_dir);
|
||||
}
|
||||
|
||||
if ($config_dir !== false) {
|
||||
if ($errors === null) {
|
||||
echo "$config_dir is OK.\n";
|
||||
}
|
||||
|
||||
continue;
|
||||
} else {
|
||||
$status = false;
|
||||
$message = "FAILED: $_config_dir does not exist (and couldn't be found in include_path either)";
|
||||
if ($errors === null) {
|
||||
echo $message . ".\n";
|
||||
} else {
|
||||
$errors['config_dir'] = $message;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
$status = false;
|
||||
$message = "FAILED: $_config_dir does not exist";
|
||||
if ($errors === null) {
|
||||
echo $message . ".\n";
|
||||
} else {
|
||||
$errors['config_dir'] = $message;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (!is_dir($config_dir)) {
|
||||
$status = false;
|
||||
$message = "FAILED: $config_dir is not a directory";
|
||||
if ($errors === null) {
|
||||
echo $message . ".\n";
|
||||
} else {
|
||||
$errors['config_dir'] = $message;
|
||||
}
|
||||
} elseif (!is_readable($config_dir)) {
|
||||
$status = false;
|
||||
$message = "FAILED: $config_dir is not readable";
|
||||
if ($errors === null) {
|
||||
echo $message . ".\n";
|
||||
} else {
|
||||
$errors['config_dir'] = $message;
|
||||
}
|
||||
} else {
|
||||
if ($errors === null) {
|
||||
echo "$config_dir is OK.\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($errors === null) {
|
||||
echo "Testing sysplugin files...\n";
|
||||
}
|
||||
// test if sysplugins are available
|
||||
$source = SMARTY_SYSPLUGINS_DIR;
|
||||
if (is_dir($source)) {
|
||||
$expected = array(
|
||||
"smarty_cacheresource.php" => true,
|
||||
"smarty_cacheresource_custom.php" => true,
|
||||
"smarty_cacheresource_keyvaluestore.php" => true,
|
||||
"smarty_config_source.php" => true,
|
||||
"smarty_internal_cacheresource_file.php" => true,
|
||||
"smarty_internal_compile_append.php" => true,
|
||||
"smarty_internal_compile_assign.php" => true,
|
||||
"smarty_internal_compile_block.php" => true,
|
||||
"smarty_internal_compile_break.php" => true,
|
||||
"smarty_internal_compile_call.php" => true,
|
||||
"smarty_internal_compile_capture.php" => true,
|
||||
"smarty_internal_compile_config_load.php" => true,
|
||||
"smarty_internal_compile_continue.php" => true,
|
||||
"smarty_internal_compile_debug.php" => true,
|
||||
"smarty_internal_compile_eval.php" => true,
|
||||
"smarty_internal_compile_extends.php" => true,
|
||||
"smarty_internal_compile_for.php" => true,
|
||||
"smarty_internal_compile_foreach.php" => true,
|
||||
"smarty_internal_compile_function.php" => true,
|
||||
"smarty_internal_compile_if.php" => true,
|
||||
"smarty_internal_compile_include.php" => true,
|
||||
"smarty_internal_compile_include_php.php" => true,
|
||||
"smarty_internal_compile_insert.php" => true,
|
||||
"smarty_internal_compile_ldelim.php" => true,
|
||||
"smarty_internal_compile_nocache.php" => true,
|
||||
"smarty_internal_compile_private_block_plugin.php" => true,
|
||||
"smarty_internal_compile_private_function_plugin.php" => true,
|
||||
"smarty_internal_compile_private_modifier.php" => true,
|
||||
"smarty_internal_compile_private_object_block_function.php" => true,
|
||||
"smarty_internal_compile_private_object_function.php" => true,
|
||||
"smarty_internal_compile_private_print_expression.php" => true,
|
||||
"smarty_internal_compile_private_registered_block.php" => true,
|
||||
"smarty_internal_compile_private_registered_function.php" => true,
|
||||
"smarty_internal_compile_private_special_variable.php" => true,
|
||||
"smarty_internal_compile_rdelim.php" => true,
|
||||
"smarty_internal_compile_section.php" => true,
|
||||
"smarty_internal_compile_setfilter.php" => true,
|
||||
"smarty_internal_compile_while.php" => true,
|
||||
"smarty_internal_compilebase.php" => true,
|
||||
"smarty_internal_config.php" => true,
|
||||
"smarty_internal_config_file_compiler.php" => true,
|
||||
"smarty_internal_configfilelexer.php" => true,
|
||||
"smarty_internal_configfileparser.php" => true,
|
||||
"smarty_internal_data.php" => true,
|
||||
"smarty_internal_debug.php" => true,
|
||||
"smarty_internal_filter_handler.php" => true,
|
||||
"smarty_internal_function_call_handler.php" => true,
|
||||
"smarty_internal_get_include_path.php" => true,
|
||||
"smarty_internal_nocache_insert.php" => true,
|
||||
"smarty_internal_parsetree.php" => true,
|
||||
"smarty_internal_resource_eval.php" => true,
|
||||
"smarty_internal_resource_extends.php" => true,
|
||||
"smarty_internal_resource_file.php" => true,
|
||||
"smarty_internal_resource_registered.php" => true,
|
||||
"smarty_internal_resource_stream.php" => true,
|
||||
"smarty_internal_resource_string.php" => true,
|
||||
"smarty_internal_smartytemplatecompiler.php" => true,
|
||||
"smarty_internal_template.php" => true,
|
||||
"smarty_internal_templatebase.php" => true,
|
||||
"smarty_internal_templatecompilerbase.php" => true,
|
||||
"smarty_internal_templatelexer.php" => true,
|
||||
"smarty_internal_templateparser.php" => true,
|
||||
"smarty_internal_utility.php" => true,
|
||||
"smarty_internal_write_file.php" => true,
|
||||
"smarty_resource.php" => true,
|
||||
"smarty_resource_custom.php" => true,
|
||||
"smarty_resource_recompiled.php" => true,
|
||||
"smarty_resource_uncompiled.php" => true,
|
||||
"smarty_security.php" => true,
|
||||
);
|
||||
$iterator = new DirectoryIterator($source);
|
||||
foreach ($iterator as $file) {
|
||||
if (!$file->isDot()) {
|
||||
$filename = $file->getFilename();
|
||||
if (isset($expected[$filename])) {
|
||||
unset($expected[$filename]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($expected) {
|
||||
$status = false;
|
||||
$message = "FAILED: files missing from libs/sysplugins: ". join(', ', array_keys($expected));
|
||||
if ($errors === null) {
|
||||
echo $message . ".\n";
|
||||
} else {
|
||||
$errors['sysplugins'] = $message;
|
||||
}
|
||||
} elseif ($errors === null) {
|
||||
echo "... OK\n";
|
||||
}
|
||||
} else {
|
||||
$status = false;
|
||||
$message = "FAILED: ". SMARTY_SYSPLUGINS_DIR .' is not a directory';
|
||||
if ($errors === null) {
|
||||
echo $message . ".\n";
|
||||
} else {
|
||||
$errors['sysplugins_dir_constant'] = $message;
|
||||
}
|
||||
}
|
||||
|
||||
if ($errors === null) {
|
||||
echo "Testing plugin files...\n";
|
||||
}
|
||||
// test if core plugins are available
|
||||
$source = SMARTY_PLUGINS_DIR;
|
||||
if (is_dir($source)) {
|
||||
$expected = array(
|
||||
"block.textformat.php" => true,
|
||||
"function.counter.php" => true,
|
||||
"function.cycle.php" => true,
|
||||
"function.fetch.php" => true,
|
||||
"function.html_checkboxes.php" => true,
|
||||
"function.html_image.php" => true,
|
||||
"function.html_options.php" => true,
|
||||
"function.html_radios.php" => true,
|
||||
"function.html_select_date.php" => true,
|
||||
"function.html_select_time.php" => true,
|
||||
"function.html_table.php" => true,
|
||||
"function.mailto.php" => true,
|
||||
"function.math.php" => true,
|
||||
"modifier.capitalize.php" => true,
|
||||
"modifier.date_format.php" => true,
|
||||
"modifier.debug_print_var.php" => true,
|
||||
"modifier.escape.php" => true,
|
||||
"modifier.regex_replace.php" => true,
|
||||
"modifier.replace.php" => true,
|
||||
"modifier.spacify.php" => true,
|
||||
"modifier.truncate.php" => true,
|
||||
"modifiercompiler.cat.php" => true,
|
||||
"modifiercompiler.count_characters.php" => true,
|
||||
"modifiercompiler.count_paragraphs.php" => true,
|
||||
"modifiercompiler.count_sentences.php" => true,
|
||||
"modifiercompiler.count_words.php" => true,
|
||||
"modifiercompiler.default.php" => true,
|
||||
"modifiercompiler.escape.php" => true,
|
||||
"modifiercompiler.from_charset.php" => true,
|
||||
"modifiercompiler.indent.php" => true,
|
||||
"modifiercompiler.lower.php" => true,
|
||||
"modifiercompiler.noprint.php" => true,
|
||||
"modifiercompiler.string_format.php" => true,
|
||||
"modifiercompiler.strip.php" => true,
|
||||
"modifiercompiler.strip_tags.php" => true,
|
||||
"modifiercompiler.to_charset.php" => true,
|
||||
"modifiercompiler.unescape.php" => true,
|
||||
"modifiercompiler.upper.php" => true,
|
||||
"modifiercompiler.wordwrap.php" => true,
|
||||
"outputfilter.trimwhitespace.php" => true,
|
||||
"shared.escape_special_chars.php" => true,
|
||||
"shared.literal_compiler_param.php" => true,
|
||||
"shared.make_timestamp.php" => true,
|
||||
"shared.mb_str_replace.php" => true,
|
||||
"shared.mb_unicode.php" => true,
|
||||
"shared.mb_wordwrap.php" => true,
|
||||
"variablefilter.htmlspecialchars.php" => true,
|
||||
);
|
||||
$iterator = new DirectoryIterator($source);
|
||||
foreach ($iterator as $file) {
|
||||
if (!$file->isDot()) {
|
||||
$filename = $file->getFilename();
|
||||
if (isset($expected[$filename])) {
|
||||
unset($expected[$filename]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($expected) {
|
||||
$status = false;
|
||||
$message = "FAILED: files missing from libs/plugins: ". join(', ', array_keys($expected));
|
||||
if ($errors === null) {
|
||||
echo $message . ".\n";
|
||||
} else {
|
||||
$errors['plugins'] = $message;
|
||||
}
|
||||
} elseif ($errors === null) {
|
||||
echo "... OK\n";
|
||||
}
|
||||
} else {
|
||||
$status = false;
|
||||
$message = "FAILED: ". SMARTY_PLUGINS_DIR .' is not a directory';
|
||||
if ($errors === null) {
|
||||
echo $message . ".\n";
|
||||
} else {
|
||||
$errors['plugins_dir_constant'] = $message;
|
||||
}
|
||||
}
|
||||
|
||||
if ($errors === null) {
|
||||
echo "Tests complete.\n";
|
||||
echo "</PRE>\n";
|
||||
}
|
||||
|
||||
return $status;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,869 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Smarty Resource Plugin
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage TemplateResources
|
||||
* @author Rodney Rehm
|
||||
*/
|
||||
|
||||
/**
|
||||
* Smarty Resource Plugin
|
||||
*
|
||||
* Base implementation for resource plugins
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage TemplateResources
|
||||
*/
|
||||
abstract class Smarty_Resource
|
||||
{
|
||||
/**
|
||||
* cache for Smarty_Template_Source instances
|
||||
* @var array
|
||||
*/
|
||||
public static $sources = array();
|
||||
/**
|
||||
* cache for Smarty_Template_Compiled instances
|
||||
* @var array
|
||||
*/
|
||||
public static $compileds = array();
|
||||
/**
|
||||
* cache for Smarty_Resource instances
|
||||
* @var array
|
||||
*/
|
||||
public static $resources = array();
|
||||
/**
|
||||
* resource types provided by the core
|
||||
* @var array
|
||||
*/
|
||||
protected static $sysplugins = array(
|
||||
'file' => true,
|
||||
'string' => true,
|
||||
'extends' => true,
|
||||
'stream' => true,
|
||||
'eval' => true,
|
||||
'php' => true
|
||||
);
|
||||
|
||||
/**
|
||||
* Name of the Class to compile this resource's contents with
|
||||
* @var string
|
||||
*/
|
||||
public $compiler_class = 'Smarty_Internal_SmartyTemplateCompiler';
|
||||
|
||||
/**
|
||||
* Name of the Class to tokenize this resource's contents with
|
||||
* @var string
|
||||
*/
|
||||
public $template_lexer_class = 'Smarty_Internal_Templatelexer';
|
||||
|
||||
/**
|
||||
* Name of the Class to parse this resource's contents with
|
||||
* @var string
|
||||
*/
|
||||
public $template_parser_class = 'Smarty_Internal_Templateparser';
|
||||
|
||||
/**
|
||||
* Load template's source into current template object
|
||||
*
|
||||
* {@internal The loaded source is assigned to $_template->source->content directly.}}
|
||||
*
|
||||
* @param Smarty_Template_Source $source source object
|
||||
* @return string template source
|
||||
* @throws SmartyException if source cannot be loaded
|
||||
*/
|
||||
abstract public function getContent(Smarty_Template_Source $source);
|
||||
|
||||
/**
|
||||
* populate Source Object with meta data from Resource
|
||||
*
|
||||
* @param Smarty_Template_Source $source source object
|
||||
* @param Smarty_Internal_Template $_template template object
|
||||
*/
|
||||
abstract public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template=null);
|
||||
|
||||
/**
|
||||
* populate Source Object with timestamp and exists from Resource
|
||||
*
|
||||
* @param Smarty_Template_Source $source source object
|
||||
*/
|
||||
public function populateTimestamp(Smarty_Template_Source $source)
|
||||
{
|
||||
// intentionally left blank
|
||||
}
|
||||
|
||||
/**
|
||||
* modify resource_name according to resource handlers specifications
|
||||
*
|
||||
* @param Smarty $smarty Smarty instance
|
||||
* @param string $resource_name resource_name to make unique
|
||||
* @param boolean $is_config flag for config resource
|
||||
* @return string unique resource name
|
||||
*/
|
||||
protected function buildUniqueResourceName(Smarty $smarty, $resource_name, $is_config = false)
|
||||
{
|
||||
if ($is_config) {
|
||||
return get_class($this) . '#' . $smarty->joined_config_dir . '#' . $resource_name;
|
||||
} else {
|
||||
return get_class($this) . '#' . $smarty->joined_template_dir . '#' . $resource_name;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* populate Compiled Object with compiled filepath
|
||||
*
|
||||
* @param Smarty_Template_Compiled $compiled compiled object
|
||||
* @param Smarty_Internal_Template $_template template object
|
||||
*/
|
||||
public function populateCompiledFilepath(Smarty_Template_Compiled $compiled, Smarty_Internal_Template $_template)
|
||||
{
|
||||
$_compile_id = isset($_template->compile_id) ? preg_replace('![^\w\|]+!', '_', $_template->compile_id) : null;
|
||||
$_filepath = $compiled->source->uid;
|
||||
// if use_sub_dirs, break file into directories
|
||||
if ($_template->smarty->use_sub_dirs) {
|
||||
$_filepath = substr($_filepath, 0, 2) . DS
|
||||
. substr($_filepath, 2, 2) . DS
|
||||
. substr($_filepath, 4, 2) . DS
|
||||
. $_filepath;
|
||||
}
|
||||
$_compile_dir_sep = $_template->smarty->use_sub_dirs ? DS : '^';
|
||||
if (isset($_compile_id)) {
|
||||
$_filepath = $_compile_id . $_compile_dir_sep . $_filepath;
|
||||
}
|
||||
// caching token
|
||||
if ($_template->caching) {
|
||||
$_cache = '.cache';
|
||||
} else {
|
||||
$_cache = '';
|
||||
}
|
||||
$_compile_dir = $_template->smarty->getCompileDir();
|
||||
// set basename if not specified
|
||||
$_basename = $this->getBasename($compiled->source);
|
||||
if ($_basename === null) {
|
||||
$_basename = basename( preg_replace('![^\w\/]+!', '_', $compiled->source->name) );
|
||||
}
|
||||
// separate (optional) basename by dot
|
||||
if ($_basename) {
|
||||
$_basename = '.' . $_basename;
|
||||
}
|
||||
|
||||
$compiled->filepath = $_compile_dir . $_filepath . '.' . $compiled->source->type . $_basename . $_cache . '.php';
|
||||
}
|
||||
|
||||
/**
|
||||
* Normalize Paths "foo/../bar" to "bar"
|
||||
*
|
||||
* @param string $_path path to normalize
|
||||
* @param boolean $ds respect windows directory separator
|
||||
* @return string normalized path
|
||||
*/
|
||||
protected function normalizePath($_path, $ds=true)
|
||||
{
|
||||
if ($ds) {
|
||||
// don't we all just love windows?
|
||||
$_path = str_replace('\\', '/', $_path);
|
||||
}
|
||||
|
||||
$offset = 0;
|
||||
|
||||
// resolve simples
|
||||
$_path = preg_replace('#/\./(\./)*#', '/', $_path);
|
||||
// resolve parents
|
||||
while (true) {
|
||||
$_parent = strpos($_path, '/../', $offset);
|
||||
if (!$_parent) {
|
||||
break;
|
||||
} elseif ($_path[$_parent - 1] === '.') {
|
||||
$offset = $_parent + 3;
|
||||
continue;
|
||||
}
|
||||
|
||||
$_pos = strrpos($_path, '/', $_parent - strlen($_path) - 1);
|
||||
if ($_pos === false) {
|
||||
// don't we all just love windows?
|
||||
$_pos = $_parent;
|
||||
}
|
||||
|
||||
$_path = substr_replace($_path, '', $_pos, $_parent + 3 - $_pos);
|
||||
}
|
||||
|
||||
if ($ds && DS != '/') {
|
||||
// don't we all just love windows?
|
||||
$_path = str_replace('/', '\\', $_path);
|
||||
}
|
||||
|
||||
return $_path;
|
||||
}
|
||||
|
||||
/**
|
||||
* build template filepath by traversing the template_dir array
|
||||
*
|
||||
* @param Smarty_Template_Source $source source object
|
||||
* @param Smarty_Internal_Template $_template template object
|
||||
* @return string fully qualified filepath
|
||||
* @throws SmartyException if default template handler is registered but not callable
|
||||
*/
|
||||
protected function buildFilepath(Smarty_Template_Source $source, Smarty_Internal_Template $_template=null)
|
||||
{
|
||||
$file = $source->name;
|
||||
if ($source instanceof Smarty_Config_Source) {
|
||||
$_directories = $source->smarty->getConfigDir();
|
||||
$_default_handler = $source->smarty->default_config_handler_func;
|
||||
} else {
|
||||
$_directories = $source->smarty->getTemplateDir();
|
||||
$_default_handler = $source->smarty->default_template_handler_func;
|
||||
}
|
||||
|
||||
// go relative to a given template?
|
||||
$_file_is_dotted = $file[0] == '.' && ($file[1] == '.' || $file[1] == '/' || $file[1] == "\\");
|
||||
if ($_template && $_template->parent instanceof Smarty_Internal_Template && $_file_is_dotted) {
|
||||
if ($_template->parent->source->type != 'file' && $_template->parent->source->type != 'extends' && !$_template->parent->allow_relative_path) {
|
||||
throw new SmartyException("Template '{$file}' cannot be relative to template of resource type '{$_template->parent->source->type}'");
|
||||
}
|
||||
$file = dirname($_template->parent->source->filepath) . DS . $file;
|
||||
$_file_exact_match = true;
|
||||
if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $file)) {
|
||||
// the path gained from the parent template is relative to the current working directory
|
||||
// as expansions (like include_path) have already been done
|
||||
$file = getcwd() . DS . $file;
|
||||
}
|
||||
}
|
||||
|
||||
// resolve relative path
|
||||
if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $file)) {
|
||||
// don't we all just love windows?
|
||||
$_path = str_replace('\\', '/', $file);
|
||||
$_path = DS . trim($file, '/');
|
||||
$_was_relative = true;
|
||||
} else {
|
||||
// don't we all just love windows?
|
||||
$_path = str_replace('\\', '/', $file);
|
||||
}
|
||||
$_path = $this->normalizePath($_path, false);
|
||||
if (DS != '/') {
|
||||
// don't we all just love windows?
|
||||
$_path = str_replace('/', '\\', $_path);
|
||||
}
|
||||
// revert to relative
|
||||
if (isset($_was_relative)) {
|
||||
$_path = substr($_path, 1);
|
||||
}
|
||||
|
||||
// this is only required for directories
|
||||
$file = rtrim($_path, '/\\');
|
||||
|
||||
// files relative to a template only get one shot
|
||||
if (isset($_file_exact_match)) {
|
||||
return $this->fileExists($source, $file) ? $file : false;
|
||||
}
|
||||
|
||||
// template_dir index?
|
||||
if (preg_match('#^\[(?P<key>[^\]]+)\](?P<file>.+)$#', $file, $match)) {
|
||||
$_directory = null;
|
||||
// try string indexes
|
||||
if (isset($_directories[$match['key']])) {
|
||||
$_directory = $_directories[$match['key']];
|
||||
} elseif (is_numeric($match['key'])) {
|
||||
// try numeric index
|
||||
$match['key'] = (int) $match['key'];
|
||||
if (isset($_directories[$match['key']])) {
|
||||
$_directory = $_directories[$match['key']];
|
||||
} else {
|
||||
// try at location index
|
||||
$keys = array_keys($_directories);
|
||||
$_directory = $_directories[$keys[$match['key']]];
|
||||
}
|
||||
}
|
||||
|
||||
if ($_directory) {
|
||||
$_file = substr($file, strpos($file, ']') + 1);
|
||||
$_filepath = $_directory . $_file;
|
||||
if ($this->fileExists($source, $_filepath)) {
|
||||
return $_filepath;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$_stream_resolve_include_path = function_exists('stream_resolve_include_path');
|
||||
|
||||
// relative file name?
|
||||
if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $file)) {
|
||||
foreach ($_directories as $_directory) {
|
||||
$_filepath = $_directory . $file;
|
||||
if ($this->fileExists($source, $_filepath)) {
|
||||
return $this->normalizePath($_filepath);
|
||||
}
|
||||
if ($source->smarty->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_directory)) {
|
||||
// try PHP include_path
|
||||
if ($_stream_resolve_include_path) {
|
||||
$_filepath = stream_resolve_include_path($_filepath);
|
||||
} else {
|
||||
$_filepath = Smarty_Internal_Get_Include_Path::getIncludePath($_filepath);
|
||||
}
|
||||
|
||||
if ($_filepath !== false) {
|
||||
if ($this->fileExists($source, $_filepath)) {
|
||||
return $this->normalizePath($_filepath);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// try absolute filepath
|
||||
if ($this->fileExists($source, $file)) {
|
||||
return $file;
|
||||
}
|
||||
|
||||
// no tpl file found
|
||||
if ($_default_handler) {
|
||||
if (!is_callable($_default_handler)) {
|
||||
if ($source instanceof Smarty_Config_Source) {
|
||||
throw new SmartyException("Default config handler not callable");
|
||||
} else {
|
||||
throw new SmartyException("Default template handler not callable");
|
||||
}
|
||||
}
|
||||
$_return = call_user_func_array($_default_handler,
|
||||
array($source->type, $source->name, &$_content, &$_timestamp, $source->smarty));
|
||||
if (is_string($_return)) {
|
||||
$source->timestamp = @filemtime($_return);
|
||||
$source->exists = !!$source->timestamp;
|
||||
|
||||
return $_return;
|
||||
} elseif ($_return === true) {
|
||||
$source->content = $_content;
|
||||
$source->timestamp = $_timestamp;
|
||||
$source->exists = true;
|
||||
|
||||
return $_filepath;
|
||||
}
|
||||
}
|
||||
|
||||
// give up
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* test is file exists and save timestamp
|
||||
*
|
||||
* @param Smarty_Template_Source $source source object
|
||||
* @param string $file file name
|
||||
* @return bool true if file exists
|
||||
*/
|
||||
protected function fileExists(Smarty_Template_Source $source, $file)
|
||||
{
|
||||
$source->timestamp = is_file($file) ? @filemtime($file) : false;
|
||||
|
||||
return $source->exists = !!$source->timestamp;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine basename for compiled filename
|
||||
*
|
||||
* @param Smarty_Template_Source $source source object
|
||||
* @return string resource's basename
|
||||
*/
|
||||
protected function getBasename(Smarty_Template_Source $source)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load Resource Handler
|
||||
*
|
||||
* @param Smarty $smarty smarty object
|
||||
* @param string $type name of the resource
|
||||
* @return Smarty_Resource Resource Handler
|
||||
*/
|
||||
public static function load(Smarty $smarty, $type)
|
||||
{
|
||||
// try smarty's cache
|
||||
if (isset($smarty->_resource_handlers[$type])) {
|
||||
return $smarty->_resource_handlers[$type];
|
||||
}
|
||||
|
||||
// try registered resource
|
||||
if (isset($smarty->registered_resources[$type])) {
|
||||
if ($smarty->registered_resources[$type] instanceof Smarty_Resource) {
|
||||
$smarty->_resource_handlers[$type] = $smarty->registered_resources[$type];
|
||||
// note registered to smarty is not kept unique!
|
||||
return $smarty->_resource_handlers[$type];
|
||||
}
|
||||
|
||||
if (!isset(self::$resources['registered'])) {
|
||||
self::$resources['registered'] = new Smarty_Internal_Resource_Registered();
|
||||
}
|
||||
if (!isset($smarty->_resource_handlers[$type])) {
|
||||
$smarty->_resource_handlers[$type] = self::$resources['registered'];
|
||||
}
|
||||
|
||||
return $smarty->_resource_handlers[$type];
|
||||
}
|
||||
|
||||
// try sysplugins dir
|
||||
if (isset(self::$sysplugins[$type])) {
|
||||
if (!isset(self::$resources[$type])) {
|
||||
$_resource_class = 'Smarty_Internal_Resource_' . ucfirst($type);
|
||||
self::$resources[$type] = new $_resource_class();
|
||||
}
|
||||
|
||||
return $smarty->_resource_handlers[$type] = self::$resources[$type];
|
||||
}
|
||||
|
||||
// try plugins dir
|
||||
$_resource_class = 'Smarty_Resource_' . ucfirst($type);
|
||||
if ($smarty->loadPlugin($_resource_class)) {
|
||||
if (isset(self::$resources[$type])) {
|
||||
return $smarty->_resource_handlers[$type] = self::$resources[$type];
|
||||
}
|
||||
|
||||
if (class_exists($_resource_class, false)) {
|
||||
self::$resources[$type] = new $_resource_class();
|
||||
|
||||
return $smarty->_resource_handlers[$type] = self::$resources[$type];
|
||||
} else {
|
||||
$smarty->registerResource($type, array(
|
||||
"smarty_resource_{$type}_source",
|
||||
"smarty_resource_{$type}_timestamp",
|
||||
"smarty_resource_{$type}_secure",
|
||||
"smarty_resource_{$type}_trusted"
|
||||
));
|
||||
|
||||
// give it another try, now that the resource is registered properly
|
||||
return self::load($smarty, $type);
|
||||
}
|
||||
}
|
||||
|
||||
// try streams
|
||||
$_known_stream = stream_get_wrappers();
|
||||
if (in_array($type, $_known_stream)) {
|
||||
// is known stream
|
||||
if (is_object($smarty->security_policy)) {
|
||||
$smarty->security_policy->isTrustedStream($type);
|
||||
}
|
||||
if (!isset(self::$resources['stream'])) {
|
||||
self::$resources['stream'] = new Smarty_Internal_Resource_Stream();
|
||||
}
|
||||
|
||||
return $smarty->_resource_handlers[$type] = self::$resources['stream'];
|
||||
}
|
||||
|
||||
// TODO: try default_(template|config)_handler
|
||||
|
||||
// give up
|
||||
throw new SmartyException("Unkown resource type '{$type}'");
|
||||
}
|
||||
|
||||
/**
|
||||
* extract resource_type and resource_name from template_resource and config_resource
|
||||
*
|
||||
* @note "C:/foo.tpl" was forced to file resource up till Smarty 3.1.3 (including).
|
||||
* @param string $resource_name template_resource or config_resource to parse
|
||||
* @param string $default_resource the default resource_type defined in $smarty
|
||||
* @param string &$name the parsed resource name
|
||||
* @param string &$type the parsed resource type
|
||||
* @return void
|
||||
*/
|
||||
protected static function parseResourceName($resource_name, $default_resource, &$name, &$type)
|
||||
{
|
||||
$parts = explode(':', $resource_name, 2);
|
||||
if (!isset($parts[1]) || !isset($parts[0][1])) {
|
||||
// no resource given, use default
|
||||
// or single character before the colon is not a resource type, but part of the filepath
|
||||
$type = $default_resource;
|
||||
$name = $resource_name;
|
||||
} else {
|
||||
$type = $parts[0];
|
||||
$name = $parts[1];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* modify resource_name according to resource handlers specifications
|
||||
*
|
||||
* @param Smarty $smarty Smarty instance
|
||||
* @param string $resource_name resource_name to make unique
|
||||
* @return string unique resource name
|
||||
*/
|
||||
|
||||
/**
|
||||
* modify template_resource according to resource handlers specifications
|
||||
*
|
||||
* @param string $smarty Smarty instance
|
||||
* @param string $template_resource template_resource to extracate resource handler and name of
|
||||
* @return string unique resource name
|
||||
*/
|
||||
public static function getUniqueTemplateName($smarty, $template_resource)
|
||||
{
|
||||
self::parseResourceName($template_resource, $smarty->default_resource_type, $name, $type);
|
||||
// TODO: optimize for Smarty's internal resource types
|
||||
$resource = Smarty_Resource::load($smarty, $type);
|
||||
|
||||
return $resource->buildUniqueResourceName($smarty, $name);
|
||||
}
|
||||
|
||||
/**
|
||||
* initialize Source Object for given resource
|
||||
*
|
||||
* Either [$_template] or [$smarty, $template_resource] must be specified
|
||||
*
|
||||
* @param Smarty_Internal_Template $_template template object
|
||||
* @param Smarty $smarty smarty object
|
||||
* @param string $template_resource resource identifier
|
||||
* @return Smarty_Template_Source Source Object
|
||||
*/
|
||||
public static function source(Smarty_Internal_Template $_template=null, Smarty $smarty=null, $template_resource=null)
|
||||
{
|
||||
if ($_template) {
|
||||
$smarty = $_template->smarty;
|
||||
$template_resource = $_template->template_resource;
|
||||
}
|
||||
|
||||
// parse resource_name, load resource handler, identify unique resource name
|
||||
self::parseResourceName($template_resource, $smarty->default_resource_type, $name, $type);
|
||||
$resource = Smarty_Resource::load($smarty, $type);
|
||||
$unique_resource_name = $resource->buildUniqueResourceName($smarty, $name);
|
||||
|
||||
// check runtime cache
|
||||
$_cache_key = 'template|' . $unique_resource_name;
|
||||
if ($smarty->compile_id) {
|
||||
$_cache_key .= '|'.$smarty->compile_id;
|
||||
}
|
||||
if (isset(self::$sources[$_cache_key])) {
|
||||
return self::$sources[$_cache_key];
|
||||
}
|
||||
|
||||
// create source
|
||||
$source = new Smarty_Template_Source($resource, $smarty, $template_resource, $type, $name, $unique_resource_name);
|
||||
$resource->populate($source, $_template);
|
||||
|
||||
// runtime cache
|
||||
self::$sources[$_cache_key] = $source;
|
||||
|
||||
return $source;
|
||||
}
|
||||
|
||||
/**
|
||||
* initialize Config Source Object for given resource
|
||||
*
|
||||
* @param Smarty_Internal_Config $_config config object
|
||||
* @return Smarty_Config_Source Source Object
|
||||
*/
|
||||
public static function config(Smarty_Internal_Config $_config)
|
||||
{
|
||||
static $_incompatible_resources = array('eval' => true, 'string' => true, 'extends' => true, 'php' => true);
|
||||
$config_resource = $_config->config_resource;
|
||||
$smarty = $_config->smarty;
|
||||
|
||||
// parse resource_name
|
||||
self::parseResourceName($config_resource, $smarty->default_config_type, $name, $type);
|
||||
|
||||
// make sure configs are not loaded via anything smarty can't handle
|
||||
if (isset($_incompatible_resources[$type])) {
|
||||
throw new SmartyException ("Unable to use resource '{$type}' for config");
|
||||
}
|
||||
|
||||
// load resource handler, identify unique resource name
|
||||
$resource = Smarty_Resource::load($smarty, $type);
|
||||
$unique_resource_name = $resource->buildUniqueResourceName($smarty, $name, true);
|
||||
|
||||
// check runtime cache
|
||||
$_cache_key = 'config|' . $unique_resource_name;
|
||||
if (isset(self::$sources[$_cache_key])) {
|
||||
return self::$sources[$_cache_key];
|
||||
}
|
||||
|
||||
// create source
|
||||
$source = new Smarty_Config_Source($resource, $smarty, $config_resource, $type, $name, $unique_resource_name);
|
||||
$resource->populate($source, null);
|
||||
|
||||
// runtime cache
|
||||
self::$sources[$_cache_key] = $source;
|
||||
|
||||
return $source;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Smarty Resource Data Object
|
||||
*
|
||||
* Meta Data Container for Template Files
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage TemplateResources
|
||||
* @author Rodney Rehm
|
||||
*
|
||||
* @property integer $timestamp Source Timestamp
|
||||
* @property boolean $exists Source Existence
|
||||
* @property boolean $template Extended Template reference
|
||||
* @property string $content Source Content
|
||||
*/
|
||||
class Smarty_Template_Source
|
||||
{
|
||||
/**
|
||||
* Name of the Class to compile this resource's contents with
|
||||
* @var string
|
||||
*/
|
||||
public $compiler_class = null;
|
||||
|
||||
/**
|
||||
* Name of the Class to tokenize this resource's contents with
|
||||
* @var string
|
||||
*/
|
||||
public $template_lexer_class = null;
|
||||
|
||||
/**
|
||||
* Name of the Class to parse this resource's contents with
|
||||
* @var string
|
||||
*/
|
||||
public $template_parser_class = null;
|
||||
|
||||
/**
|
||||
* Unique Template ID
|
||||
* @var string
|
||||
*/
|
||||
public $uid = null;
|
||||
|
||||
/**
|
||||
* Template Resource (Smarty_Internal_Template::$template_resource)
|
||||
* @var string
|
||||
*/
|
||||
public $resource = null;
|
||||
|
||||
/**
|
||||
* Resource Type
|
||||
* @var string
|
||||
*/
|
||||
public $type = null;
|
||||
|
||||
/**
|
||||
* Resource Name
|
||||
* @var string
|
||||
*/
|
||||
public $name = null;
|
||||
|
||||
/**
|
||||
* Unique Resource Name
|
||||
* @var string
|
||||
*/
|
||||
public $unique_resource = null;
|
||||
|
||||
/**
|
||||
* Source Filepath
|
||||
* @var string
|
||||
*/
|
||||
public $filepath = null;
|
||||
|
||||
/**
|
||||
* Source is bypassing compiler
|
||||
* @var boolean
|
||||
*/
|
||||
public $uncompiled = null;
|
||||
|
||||
/**
|
||||
* Source must be recompiled on every occasion
|
||||
* @var boolean
|
||||
*/
|
||||
public $recompiled = null;
|
||||
|
||||
/**
|
||||
* The Components an extended template is made of
|
||||
* @var array
|
||||
*/
|
||||
public $components = null;
|
||||
|
||||
/**
|
||||
* Resource Handler
|
||||
* @var Smarty_Resource
|
||||
*/
|
||||
public $handler = null;
|
||||
|
||||
/**
|
||||
* Smarty instance
|
||||
* @var Smarty
|
||||
*/
|
||||
public $smarty = null;
|
||||
|
||||
/**
|
||||
* create Source Object container
|
||||
*
|
||||
* @param Smarty_Resource $handler Resource Handler this source object communicates with
|
||||
* @param Smarty $smarty Smarty instance this source object belongs to
|
||||
* @param string $resource full template_resource
|
||||
* @param string $type type of resource
|
||||
* @param string $name resource name
|
||||
* @param string $unique_resource unqiue resource name
|
||||
*/
|
||||
public function __construct(Smarty_Resource $handler, Smarty $smarty, $resource, $type, $name, $unique_resource)
|
||||
{
|
||||
$this->handler = $handler; // Note: prone to circular references
|
||||
|
||||
$this->compiler_class = $handler->compiler_class;
|
||||
$this->template_lexer_class = $handler->template_lexer_class;
|
||||
$this->template_parser_class = $handler->template_parser_class;
|
||||
$this->uncompiled = $this->handler instanceof Smarty_Resource_Uncompiled;
|
||||
$this->recompiled = $this->handler instanceof Smarty_Resource_Recompiled;
|
||||
|
||||
$this->smarty = $smarty;
|
||||
$this->resource = $resource;
|
||||
$this->type = $type;
|
||||
$this->name = $name;
|
||||
$this->unique_resource = $unique_resource;
|
||||
}
|
||||
|
||||
/**
|
||||
* get a Compiled Object of this source
|
||||
*
|
||||
* @param Smarty_Internal_Template $_template template objet
|
||||
* @return Smarty_Template_Compiled compiled object
|
||||
*/
|
||||
public function getCompiled(Smarty_Internal_Template $_template)
|
||||
{
|
||||
// check runtime cache
|
||||
$_cache_key = $this->unique_resource . '#' . $_template->compile_id;
|
||||
if (isset(Smarty_Resource::$compileds[$_cache_key])) {
|
||||
return Smarty_Resource::$compileds[$_cache_key];
|
||||
}
|
||||
|
||||
$compiled = new Smarty_Template_Compiled($this);
|
||||
$this->handler->populateCompiledFilepath($compiled, $_template);
|
||||
$compiled->timestamp = @filemtime($compiled->filepath);
|
||||
$compiled->exists = !!$compiled->timestamp;
|
||||
|
||||
// runtime cache
|
||||
Smarty_Resource::$compileds[$_cache_key] = $compiled;
|
||||
|
||||
return $compiled;
|
||||
}
|
||||
|
||||
/**
|
||||
* render the uncompiled source
|
||||
*
|
||||
* @param Smarty_Internal_Template $_template template object
|
||||
*/
|
||||
public function renderUncompiled(Smarty_Internal_Template $_template)
|
||||
{
|
||||
return $this->handler->renderUncompiled($this, $_template);
|
||||
}
|
||||
|
||||
/**
|
||||
* <<magic>> Generic Setter.
|
||||
*
|
||||
* @param string $property_name valid: timestamp, exists, content, template
|
||||
* @param mixed $value new value (is not checked)
|
||||
* @throws SmartyException if $property_name is not valid
|
||||
*/
|
||||
public function __set($property_name, $value)
|
||||
{
|
||||
switch ($property_name) {
|
||||
// regular attributes
|
||||
case 'timestamp':
|
||||
case 'exists':
|
||||
case 'content':
|
||||
// required for extends: only
|
||||
case 'template':
|
||||
$this->$property_name = $value;
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new SmartyException("invalid source property '$property_name'.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* <<magic>> Generic getter.
|
||||
*
|
||||
* @param string $property_name valid: timestamp, exists, content
|
||||
* @return mixed
|
||||
* @throws SmartyException if $property_name is not valid
|
||||
*/
|
||||
public function __get($property_name)
|
||||
{
|
||||
switch ($property_name) {
|
||||
case 'timestamp':
|
||||
case 'exists':
|
||||
$this->handler->populateTimestamp($this);
|
||||
|
||||
return $this->$property_name;
|
||||
|
||||
case 'content':
|
||||
return $this->content = $this->handler->getContent($this);
|
||||
|
||||
default:
|
||||
throw new SmartyException("source property '$property_name' does not exist.");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Smarty Resource Data Object
|
||||
*
|
||||
* Meta Data Container for Template Files
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage TemplateResources
|
||||
* @author Rodney Rehm
|
||||
*
|
||||
* @property string $content compiled content
|
||||
*/
|
||||
class Smarty_Template_Compiled
|
||||
{
|
||||
/**
|
||||
* Compiled Filepath
|
||||
* @var string
|
||||
*/
|
||||
public $filepath = null;
|
||||
|
||||
/**
|
||||
* Compiled Timestamp
|
||||
* @var integer
|
||||
*/
|
||||
public $timestamp = null;
|
||||
|
||||
/**
|
||||
* Compiled Existence
|
||||
* @var boolean
|
||||
*/
|
||||
public $exists = false;
|
||||
|
||||
/**
|
||||
* Compiled Content Loaded
|
||||
* @var boolean
|
||||
*/
|
||||
public $loaded = false;
|
||||
|
||||
/**
|
||||
* Template was compiled
|
||||
* @var boolean
|
||||
*/
|
||||
public $isCompiled = false;
|
||||
|
||||
/**
|
||||
* Source Object
|
||||
* @var Smarty_Template_Source
|
||||
*/
|
||||
public $source = null;
|
||||
|
||||
/**
|
||||
* Metadata properties
|
||||
*
|
||||
* populated by Smarty_Internal_Template::decodeProperties()
|
||||
* @var array
|
||||
*/
|
||||
public $_properties = null;
|
||||
|
||||
/**
|
||||
* create Compiled Object container
|
||||
*
|
||||
* @param Smarty_Template_Source $source source object this compiled object belongs to
|
||||
*/
|
||||
public function __construct(Smarty_Template_Source $source)
|
||||
{
|
||||
$this->source = $source;
|
||||
}
|
||||
|
||||
}
|
||||
1
www/Smarty-3.1.21/smarty-3.1.27
Symbolic link
1
www/Smarty-3.1.21/smarty-3.1.27
Symbolic link
@@ -0,0 +1 @@
|
||||
smarty-3.1.27/
|
||||
@@ -1,11 +1,11 @@
|
||||
<?
|
||||
$DEBGU_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
|
||||
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
|
||||
$DEBUG_ALL = 1;
|
||||
$PRINT_ALL = 1;
|
||||
$DB_DEBUG = 1;
|
||||
|
||||
if ($DEBUG_ALL)
|
||||
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
|
||||
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
|
||||
|
||||
define('USE_DATABASE', true);
|
||||
// sample config
|
||||
@@ -15,10 +15,8 @@
|
||||
// session_name(EDIT_SESSION_NAME);
|
||||
// session_start();
|
||||
// basic class test file
|
||||
// require(LIBS."Class.Basic.inc");
|
||||
// require(LIBS."Class.DB.IO.inc");
|
||||
require(LIBS."Class.Login.inc");
|
||||
require(LIBS."Class.Admin.Backend.inc");
|
||||
foreach (array ('Login', 'Admin.Backend') as $class)
|
||||
_spl_autoload('Class.'.$class.'.inc');
|
||||
|
||||
$lang = 'en_utf8';
|
||||
|
||||
@@ -30,10 +28,12 @@
|
||||
|
||||
// set + check edit access id
|
||||
$edit_access_id = 3;
|
||||
print "ACL UNIT: ".print_r(array_keys($login->acl['unit']), 1)."<br>";
|
||||
print "ACCESS CHECK: ".$login->login_check_edit_access($edit_access_id)."<br>";
|
||||
if ($login->login_check_edit_access($edit_access_id))
|
||||
$basic->edit_access_id = $edit_access_id;
|
||||
else
|
||||
$basic->edit_access_id = $login->acl['info']['default_edit_access'];
|
||||
$basic->edit_access_id = $login->acl['unit_id'];
|
||||
|
||||
// $basic->debug('SESSION', $basic->print_ar($_SESSION));
|
||||
|
||||
@@ -54,9 +54,6 @@
|
||||
print "DEBUG OUT ALL: ".$basic->debug_output_all."<br>";
|
||||
print "ECHO OUT ALL: ".$basic->echo_output_all."<br>";
|
||||
print "PRINT OUT ALL: ".$basic->print_output_all."<br>";
|
||||
// file name (logging)
|
||||
print "FILENAME EXT: ".$basic->file_name_ext."<br>";
|
||||
print "MAX FILESIZE: ".$basic->max_filesize."<br>";
|
||||
|
||||
print "CALLER BACKTRACE: ".$basic->get_caller_method()."<br>";
|
||||
$basic->debug('SOME MARK', 'Some error output');
|
||||
@@ -77,12 +74,17 @@
|
||||
}
|
||||
|
||||
$status = $basic->db_exec("INSERT INTO foo (test) VALUES ('FOO TEST ".time()."') RETURNING test");
|
||||
print "DIRECT INSERT STATUS: $status | PRIMARY KEY: ".$basic->insert_id."<br>";
|
||||
print "DIRECT INSERT STATUS: $status | PRIMARY KEY: ".$basic->insert_id." | PRIMARY KEY EXT: ".print_r($basic->insert_id_ext, 1)."<br>";
|
||||
print "DIRECT INSERT PREVIOUS INSERTED: ".print_r($basic->db_return_row("SELECT foo_id, test FROM foo WHERE foo_id = ".$basic->insert_id), 1)."<br>";
|
||||
$basic->db_prepare("ins_foo", "INSERT INTO foo (test) VALUES ($1)");
|
||||
$status = $basic->db_execute("ins_foo", array('BAR TEST '.time()));
|
||||
print "PREPARE INSERT STATUS: $status | PRIMARY KEY: ".$basic->insert_id."<br>";
|
||||
print "PREPARE INSERT STATUS: $status | PRIMARY KEY: ".$basic->insert_id." | PRIMARY KEY EXT: ".print_r($basic->insert_id_ext, 1)."<br>";
|
||||
print "PREPARE INSERT PREVIOUS INSERTED: ".print_r($basic->db_return_row("SELECT foo_id, test FROM foo WHERE foo_id = ".$basic->insert_id), 1)."<br>";
|
||||
// returning test with multiple entries
|
||||
// $status = $basic->db_exec("INSERT INTO foo (test) values ('BAR 1 ".time()."'), ('BAR 2 ".time()."'), ('BAR 3 ".time()."') RETURNING foo_id");
|
||||
$status = $basic->db_exec("INSERT INTO foo (test) values ('BAR 1 ".time()."'), ('BAR 2 ".time()."'), ('BAR 3 ".time()."') RETURNING foo_id, test");
|
||||
print "DIRECT MULTIPLE INSERT STATUS: $status | PRIMARY KEYS: ".print_r($basic->insert_id, 1)." | PRIMARY KEY EXT: ".print_r($basic->insert_id_ext, 1)."<br>";
|
||||
|
||||
|
||||
# async test queries
|
||||
/* $basic->db_exec_async("SELECT test FROM foo, (SELECT pg_sleep(10)) as sub WHERE foo_id IN (27, 50, 67, 44, 10)");
|
||||
@@ -125,7 +127,7 @@
|
||||
print "DB Version bigger than $to_db_version: ".$basic->db_compare_version('>='.$to_db_version)."<br>";
|
||||
print "DB Version bigger $to_db_version: ".$basic->db_compare_version('>'.$to_db_version)."<br>";
|
||||
|
||||
$q = "SELECT FOO FRO BAR";
|
||||
/* $q = "SELECT FOO FRO BAR";
|
||||
// $q = "Select * from foo";
|
||||
$foo = $basic->db_exec_async($q);
|
||||
print "[ERR] Query: ".$q."<br>";
|
||||
@@ -134,7 +136,7 @@
|
||||
{
|
||||
print "[ERR]: $ret<br>";
|
||||
// sleep(5);
|
||||
}
|
||||
} */
|
||||
|
||||
// search path check
|
||||
$q = "SHOW search_path";
|
||||
@@ -156,6 +158,11 @@
|
||||
print $basic->magic_links('user@bubu.at').'<br>';
|
||||
print $basic->magic_links('http://test.com/foo/bar.php?foo=1').'<br>';
|
||||
|
||||
// compare date
|
||||
$date_1 = '2017/1/5';
|
||||
$date_2 = '2017-01-05';
|
||||
print "COMPARE DATE: ".$basic->CompareDate($date_1, $date_2)."<br>";
|
||||
|
||||
// print error messages
|
||||
print $basic->print_error_msg();
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
* - edit_pages.php
|
||||
* - edit_schemes.php
|
||||
* - edit_users.php
|
||||
* - edit_visible_group.php
|
||||
* - edit_visible_group.php
|
||||
* HISTORY:
|
||||
* 2005/06/30 (cs) remove color settings, they are in CSS File now
|
||||
* 2005/06/22 (cs) moved load of config array into form class, set lang and lang is must set var for form class; removed the page name setting, moved it into the form class, remove all HTML from main page
|
||||
@@ -107,15 +107,15 @@
|
||||
}
|
||||
|
||||
// log backend data
|
||||
// data part creation
|
||||
$data = array (
|
||||
'_SESSION' => $_SESSION,
|
||||
'_GET' => $_GET,
|
||||
'_POST' => $_POST,
|
||||
'_FILES' => $_FILES
|
||||
);
|
||||
// log action
|
||||
EditLog('Edit Submit', serialize($data));
|
||||
// data part creation
|
||||
$data = array (
|
||||
'_SESSION' => $_SESSION,
|
||||
'_GET' => $_GET,
|
||||
'_POST' => $_POST,
|
||||
'_FILES' => $_FILES
|
||||
);
|
||||
// log action
|
||||
EditLog('Edit Submit', serialize($data));
|
||||
|
||||
$form->form_procedure_load(${$form->archive_pk_name});
|
||||
$form->form_procedure_new();
|
||||
@@ -230,6 +230,8 @@
|
||||
$elements[] = $form->form_create_element("password");
|
||||
$elements[] = $form->form_create_element("password_change_interval");
|
||||
$elements[] = $form->form_create_element("email");
|
||||
$elements[] = $form->form_create_element("last_name");
|
||||
$elements[] = $form->form_create_element("first_name");
|
||||
$elements[] = $form->form_create_element("edit_group_id");
|
||||
$elements[] = $form->form_create_element("edit_access_right_id");
|
||||
$elements[] = $form->form_create_element("strict");
|
||||
@@ -308,12 +310,15 @@
|
||||
$elements[] = $form->form_create_element("name");
|
||||
$elements[] = $form->form_create_element("color");
|
||||
$elements[] = $form->form_create_element("description");
|
||||
// add name/value list here
|
||||
$elements[] = $form->form_show_list_table("edit_access_data");
|
||||
break;
|
||||
break;
|
||||
default:
|
||||
print "NO NO NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO!";
|
||||
break;
|
||||
}
|
||||
//$form->debug('edit', "Elements: <pre>".$form->print_ar($elements));
|
||||
// $form->debug('edit', "Elements: <pre>".$form->print_ar($elements));
|
||||
$DATA['elements'] = $elements;
|
||||
$DATA['hidden'] = $form->form_create_hidden_fields();
|
||||
$DATA['save_delete'] = $form->form_create_save_delete();
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
$smarty->setTemplateDir(TEMPLATES.DEFAULT_TEMPLATE);
|
||||
$DATA['css'] = CSS.DEFAULT_TEMPLATE;
|
||||
$DATA['js'] = JS.DEFAULT_TEMPLATE;
|
||||
}
|
||||
}
|
||||
|
||||
// order name is _always_ order_number for the edit interface
|
||||
|
||||
|
||||
@@ -155,7 +155,7 @@
|
||||
if (!$error)
|
||||
{
|
||||
if ($_FILES['file_up']['name'])
|
||||
{
|
||||
{
|
||||
$mime_type = $_FILES['file_up']['type'];
|
||||
$file_size = $_FILES['file_up']['size'];
|
||||
$file_name = $_FILES['file_up']['name'];
|
||||
|
||||
@@ -24,12 +24,9 @@
|
||||
require("config.inc");
|
||||
// set the session name
|
||||
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
|
||||
// login class
|
||||
require(LIBS."Class.Login.inc");
|
||||
// DB connection & work time class
|
||||
require(LIBS.'Class.Admin.Backend.inc');
|
||||
// Smarty: and the small extend for l10n calls
|
||||
require(LIBS.'Class.Smarty.Extend.inc');
|
||||
// login class, DB connections & Admin class, Smarty extension
|
||||
foreach (array ('Login', 'Admin.Backend', 'Smarty.Extend') as $class)
|
||||
_spl_autoload('Class.'.$class.'.inc');
|
||||
//------------------------------ library include end
|
||||
|
||||
//------------------------------ basic variable settings start
|
||||
@@ -42,7 +39,7 @@
|
||||
elseif (!$lang)
|
||||
$lang = DEFAULT_LANG;
|
||||
// end the stop of the output flow, but only if we didn't request a csv file download
|
||||
if ($_POST['action'] != 'download_csv')
|
||||
if (array_key_exists('action', $_POST) && $_POST['action'] != 'download_csv')
|
||||
{
|
||||
header("Content-type: text/html; charset=".$encoding);
|
||||
ob_end_flush();
|
||||
@@ -59,14 +56,14 @@
|
||||
$smarty = new SmartyML($lang);
|
||||
// create new DB class
|
||||
$cms = new AdminBackend($DB_CONFIG[MAIN_DB], $lang);
|
||||
// set daily rotation
|
||||
$cms->file_name_ext = '_'.date('Y-m-d').'.log';
|
||||
// set search path to the default DB schema
|
||||
$cms->db_exec("SET search_path TO ".DB_SCHEMA);
|
||||
// the menu show flag (what menu to show)
|
||||
$cms->menu_show_flag = 'main';
|
||||
// db nfo
|
||||
$cms->db_info();
|
||||
// set acl
|
||||
$cms->acl = $login->acl;
|
||||
//------------------------------ class init end
|
||||
|
||||
//------------------------------ logging start
|
||||
|
||||
@@ -35,7 +35,9 @@
|
||||
|
||||
// set include & template names
|
||||
$CONTENT_INCLUDE = str_replace(".php", ".tpl", $cms->page_name);
|
||||
$FORM_NAME = !$FORM_NAME ? str_replace(".php", "", $cms->page_name) : $FORM_NAME;
|
||||
$FORM_NAME = !isset($FORM_NAME) || !$FORM_NAME ? str_replace(".php", "", $cms->page_name) : $FORM_NAME;
|
||||
// set local page title
|
||||
$L_TITLE = ucfirst(str_replace('_', ' ', $cms->get_page_name(1))).' - '.$G_TITLE;
|
||||
// strip tpl and replace it with inc
|
||||
// php include file per page
|
||||
$cms->INC_TEMPLATE_NAME = str_replace(".tpl", ".inc", $CONTENT_INCLUDE);
|
||||
@@ -44,9 +46,9 @@
|
||||
// css per page
|
||||
$cms->CSS_TEMPLATE_NAME = str_replace(".tpl", ".css", $CONTENT_INCLUDE);
|
||||
// special CSS file
|
||||
$cms->CSS_SPECIAL_TEMPLATE_NAME = $CSS_NAME;
|
||||
$cms->CSS_SPECIAL_TEMPLATE_NAME = @$CSS_NAME;
|
||||
// special JS file
|
||||
$cms->JS_SPECIAL_TEMPLATE_NAME = $JS_NAME;
|
||||
$cms->JS_SPECIAL_TEMPLATE_NAME = @$JS_NAME;
|
||||
|
||||
// set basic template path (tmp)
|
||||
$smarty->setTemplateDir(LAYOUT.$TEMPLATE_DIR.TEMPLATES.'/');
|
||||
@@ -93,7 +95,7 @@
|
||||
if (!is_dir($cms->pictures))
|
||||
$cms->pictures = LAYOUT.DEFAULT_TEMPLATE.PICTURES.'/';
|
||||
if (!is_dir($cms->cache_pictures))
|
||||
$cms->cache_pictures = LAYOUT.DEFAULT_TEMPLATE.CACHE.IMAGES.'/';
|
||||
$cms->cache_pictures = LAYOUT.DEFAULT_TEMPLATE.CACHE.IMAGES.'/';
|
||||
|
||||
// if the template_dir is != DEFAULT_TEMPLATE, then try to make a lang switch
|
||||
// if the default lang is not like the lang given, switch lang
|
||||
|
||||
@@ -24,21 +24,25 @@
|
||||
include($cms->includes.$cms->INC_TEMPLATE_NAME);
|
||||
}
|
||||
// additional per page Javascript include
|
||||
$cms->JS_INCLUDE = '';
|
||||
if (file_exists($cms->javascript.$cms->JS_TEMPLATE_NAME) && is_file($cms->javascript.$cms->JS_TEMPLATE_NAME))
|
||||
{
|
||||
$cms->JS_INCLUDE = $cms->javascript.$cms->JS_TEMPLATE_NAME;
|
||||
}
|
||||
// per page css file
|
||||
$cms->CSS_INCLUDE = '';
|
||||
if (file_exists($cms->css.$cms->CSS_TEMPLATE_NAME) && is_file($cms->css.$cms->CSS_TEMPLATE_NAME))
|
||||
{
|
||||
$cms->CSS_INCLUDE = $cms->css.$cms->CSS_TEMPLATE_NAME;
|
||||
}
|
||||
// optional CSS file
|
||||
$cms->CSS_SPECIAL_INCLUDE = '';
|
||||
if (file_exists($cms->css.$cms->CSS_SPECIAL_TEMPLATE_NAME) && is_file($cms->css.$cms->CSS_SPECIAL_TEMPLATE_NAME))
|
||||
{
|
||||
$cms->CSS_SPECIAL_INCLUDE = $cms->css.$cms->CSS_SPECIAL_TEMPLATE_NAME;
|
||||
}
|
||||
// optional JS file
|
||||
$cms->JS_SPECIAL_INCLUDE = '';
|
||||
if (file_exists($cms->javascript.$cms->JS_SPECIAL_TEMPLATE_NAME) && is_file($cms->javascript.$cms->JS_SPECIAL_TEMPLATE_NAME))
|
||||
{
|
||||
$cms->JS_SPECIAL_INCLUDE = $cms->javascript.$cms->JS_SPECIAL_TEMPLATE_NAME;
|
||||
@@ -64,7 +68,7 @@
|
||||
$cms->HEADER['STYLESHEET'] = $EDIT_STYLESHEET;
|
||||
$cms->HEADER['JAVASCRIPT'] = $EDIT_JAVASCRIPT;
|
||||
// html title
|
||||
$cms->HEADER['HTML_TITLE'] = ((!$L_TITLE) ? $cms->l->__($G_TITLE) : $cms->l->__($L_TITLE));
|
||||
$cms->HEADER['HTML_TITLE'] = (!isset($L_TITLE) || !$L_TITLE) ? $cms->l->__($G_TITLE) : $cms->l->__($L_TITLE);
|
||||
$cms->DATA['table_width'] = $PAGE_WIDTH ? $PAGE_WIDTH : PAGE_WIDTH;
|
||||
|
||||
// messages = array('msg' =>, 'class' => 'error/warning/...')
|
||||
@@ -85,7 +89,7 @@
|
||||
|
||||
// debug data, if DEBUG flag is on, this data is print out
|
||||
$cms->DEBUG_DATA['debug_error_msg'] = $cms->running_time();
|
||||
$cms->DEBUG_DATA['DEBUG'] = $DEBUG_TMPL;
|
||||
$cms->DEBUG_DATA['DEBUG'] = @$DEBUG_TMPL;
|
||||
|
||||
// create main data array
|
||||
$cms->CONTENT_DATA = array_merge($cms->HEADER, $cms->DATA, $cms->DEBUG_DATA);
|
||||
|
||||
21
www/admin/smarty_test.php
Normal file
21
www/admin/smarty_test.php
Normal file
@@ -0,0 +1,21 @@
|
||||
<?
|
||||
$ENABLE_ERROR_HANDLING = 0;
|
||||
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
|
||||
$DEBUG_ALL = 1;
|
||||
$PRINT_ALL = 1;
|
||||
$DB_DEBUG = 1;
|
||||
$LOG_PER_RUN = 1;
|
||||
|
||||
define('USE_DATABASE', true);
|
||||
require("header.inc");
|
||||
$MASTER_TEMPLATE_NAME = 'main_body.tpl';
|
||||
$TEMPLATE_NAME = 'smarty_test.tpl';
|
||||
$PAGE_WIDTH = 750;
|
||||
require("set_paths.inc");
|
||||
|
||||
// smarty test
|
||||
$cms->DATA['SMARTY_TEST'] = 'Test Data';
|
||||
|
||||
require("smarty.inc");
|
||||
require("footer.inc");
|
||||
?>
|
||||
@@ -10,7 +10,8 @@
|
||||
"value" => $GLOBALS["name"],
|
||||
"output_name" => $this->l->__("Access Group Name"),
|
||||
"mandatory" => 1,
|
||||
"type" => "text"
|
||||
"type" => "text",
|
||||
"error_check" => "alphanumericspace|unique"
|
||||
),
|
||||
"description" => array (
|
||||
"value" => $GLOBALS["description"],
|
||||
@@ -20,7 +21,7 @@
|
||||
"color" => array (
|
||||
"value" => $GLOBALS["color"],
|
||||
"output_name" => $this->l->__("Color"),
|
||||
"mandatory" => 1,
|
||||
"mandatory" => 0,
|
||||
"type" => "text",
|
||||
"size" => 6,
|
||||
"length" => 6,
|
||||
@@ -28,7 +29,6 @@
|
||||
"error_regex" => "/[\dA-Fa-f]{6}/",
|
||||
"error_example" => "F6A544"
|
||||
)
|
||||
|
||||
),
|
||||
"table_name" => "edit_access",
|
||||
"load_query" => "SELECT edit_access_id, name FROM edit_access ORDER BY name",
|
||||
@@ -36,6 +36,43 @@
|
||||
array (
|
||||
"name" => "name"
|
||||
)
|
||||
),
|
||||
"element_list" => array (
|
||||
"edit_access_data" => array (
|
||||
"output_name" => "Edit Access Data",
|
||||
"type" => "reference_data", # is not a sub table read and connect, but only a sub table with data
|
||||
"max_empty" => 5, # maxium visible if no data is set, if filled add this number to visible
|
||||
"prefix" => "ead",
|
||||
"elements" => array (
|
||||
"edit_access_data_id" => array (
|
||||
"output_name" => "Activate",
|
||||
"type" => "hidden",
|
||||
"int" => 1,
|
||||
"pk_id" => 1
|
||||
),
|
||||
"name" => array (
|
||||
"type" => "text",
|
||||
"error_check" => "alphanumeric|unique",
|
||||
"output_name" => "Name"
|
||||
),
|
||||
"value" => array (
|
||||
"type" => "text",
|
||||
"output_name" => "Value"
|
||||
),
|
||||
"enabled" => array (
|
||||
"type" => "checkbox",
|
||||
"output_name" => "Activate",
|
||||
"int" => 1,
|
||||
"element_list" => array(1)
|
||||
),
|
||||
"edit_access_id" => array (
|
||||
"int" => 1,
|
||||
"type" => "hidden",
|
||||
"fk_id" => 1 # reference main key from master table above
|
||||
)
|
||||
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
?>
|
||||
|
||||
@@ -2,24 +2,24 @@
|
||||
$edit_users = array (
|
||||
"table_array" => array (
|
||||
"edit_user_id" => array (
|
||||
"value" => $GLOBALS["edit_user_id"],
|
||||
"value" => $GLOBALS["edit_user_id"],
|
||||
"type" => "hidden",
|
||||
"pk" => 1,
|
||||
"int" => 1
|
||||
),
|
||||
"username" => array (
|
||||
"value" => $GLOBALS["username"],
|
||||
"output_name" => "Username",
|
||||
"mandatory" => 1,
|
||||
"value" => $GLOBALS["username"],
|
||||
"output_name" => "Username",
|
||||
"mandatory" => 1,
|
||||
"error_check" => "unique|alphanumericextended",
|
||||
"type" => "text"
|
||||
),
|
||||
"password" => array (
|
||||
"value" => $GLOBALS["password"],
|
||||
"value" => $GLOBALS["password"],
|
||||
"HIDDEN_value" => $GLOBALS["HIDDEN_password"],
|
||||
"CONFIRM_value" => $GLOBALS["CONFIRM_password"],
|
||||
"output_name" => "Password",
|
||||
"mandatory" => 1,
|
||||
"output_name" => "Password",
|
||||
"mandatory" => 1,
|
||||
"type" => "password", // later has to be password for encryption in database
|
||||
'update' => array ( // connected field updates, and update data
|
||||
'password_change_date' => array ( // db row to update
|
||||
@@ -34,17 +34,18 @@
|
||||
'output_name' => 'Password change interval',
|
||||
'error_check' => 'intervalshort', // can be any date length format. n Y/M/D [not H/M/S], only one set, no combination
|
||||
'type' => 'text',
|
||||
'interval' => 1, // interval needs NULL write for empty
|
||||
'size' => 5, // make it 5 chars long
|
||||
'length' => 5
|
||||
),
|
||||
// password reset force interval, if set, user needs to reset password after X time period
|
||||
"enabled" => array (
|
||||
"value" => $GLOBALS["enabled"],
|
||||
"output_name" => "Enabled",
|
||||
"type" => "binary",
|
||||
"value" => $GLOBALS["enabled"],
|
||||
"output_name" => "Enabled",
|
||||
"type" => "binary",
|
||||
"int" => 1,
|
||||
"element_list" => array (
|
||||
"1" => "Yes",
|
||||
"1" => "Yes",
|
||||
"0" => "No"
|
||||
)
|
||||
),
|
||||
@@ -79,28 +80,38 @@
|
||||
)
|
||||
),
|
||||
"debug" => array (
|
||||
"value" => $GLOBALS["debug"],
|
||||
"output_name" => "Debug",
|
||||
"type" => "binary",
|
||||
"value" => $GLOBALS["debug"],
|
||||
"output_name" => "Debug",
|
||||
"type" => "binary",
|
||||
"int" => 1,
|
||||
"element_list" => array (
|
||||
"1" => "Yes",
|
||||
"1" => "Yes",
|
||||
"0" => "No"
|
||||
)
|
||||
),
|
||||
"db_debug" => array (
|
||||
"value" => $GLOBALS["db_debug"],
|
||||
"output_name" => "DB Debug",
|
||||
"type" => "binary",
|
||||
"value" => $GLOBALS["db_debug"],
|
||||
"output_name" => "DB Debug",
|
||||
"type" => "binary",
|
||||
"int" => 1,
|
||||
"element_list" => array (
|
||||
"1" => "Yes",
|
||||
"1" => "Yes",
|
||||
"0" => "No"
|
||||
)
|
||||
),
|
||||
"email" => array (
|
||||
"value" => $GLOBALS["email"],
|
||||
"output_name" => "E-Mail",
|
||||
"value" => $GLOBALS["email"],
|
||||
"output_name" => "E-Mail",
|
||||
"type" => "text"
|
||||
),
|
||||
"last_name" => array (
|
||||
"value" => $GLOBALS["last_name"],
|
||||
"output_name" => "Last Name",
|
||||
"type" => "text"
|
||||
),
|
||||
"first_name" => array (
|
||||
"value" => $GLOBALS["first_name"],
|
||||
"output_name" => "First Name",
|
||||
"type" => "text"
|
||||
),
|
||||
"edit_language_id" => array (
|
||||
|
||||
@@ -9,9 +9,9 @@
|
||||
|
||||
/************* SESSION NAMES *************/
|
||||
// backend
|
||||
DEFINE('EDIT_SESSION_NAME', "ADMIN_SESSION_NAME");
|
||||
DEFINE('EDIT_SESSION_NAME', "<ADMIN SESSION NAME>");
|
||||
// frontend
|
||||
DEFINE('SESSION_NAME', "SESSION_NAME");
|
||||
DEFINE('SESSION_NAME', "<SESSION NAME>");
|
||||
|
||||
/************* LANGUAGE / ENCODING *******/
|
||||
DEFINE('DEFAULT_LANG', "en_utf8");
|
||||
@@ -19,11 +19,22 @@
|
||||
DEFINE('DEFAULT_ENCODING', "UTF-8");
|
||||
|
||||
/************* PATHS *********************/
|
||||
// path to document root
|
||||
// ** NEW/BETTER DIR DECLARATIONS **
|
||||
// path to original file (if symlink)
|
||||
DEFINE('DIR', __DIR__."/");
|
||||
// libs base path based on DIR
|
||||
DEFINE('LIBDIR', DIR.'libs/');
|
||||
// SMARTY path based on DIR
|
||||
DEFINE('SMARTYDIR', DIR.'Smarty/');
|
||||
// table arrays for Class Form
|
||||
DEFINE('TABLEARRAYDIR', DIR.'table_arrays/');
|
||||
|
||||
// ** OLD DIR DECLARATIONS **
|
||||
// path to document root of file called
|
||||
DEFINE('ROOT', getcwd()."/");
|
||||
// libs path
|
||||
DEFINE('LIBS', "libs/");
|
||||
// includes (strings, arrays for stati, etc)
|
||||
// includes (strings, arrays for static, etc)
|
||||
DEFINE('INCLUDES', "includes/");
|
||||
// layout base path
|
||||
DEFINE('LAYOUT', 'layout/');
|
||||
@@ -74,7 +85,7 @@
|
||||
|
||||
/************* HASH / ACL DEFAULT / ERROR SETTINGS / SMARTY *************/
|
||||
// default hash type
|
||||
DEFINE('DEFAULT_HASH', 'ripemd160');
|
||||
DEFINE('DEFAULT_HASH', 'sha256');
|
||||
// default acl level
|
||||
DEFINE('DEFAULT_ACL_LEVEL', 80);
|
||||
// default levels for certain actions
|
||||
@@ -86,7 +97,7 @@
|
||||
DEFINE('DEFAULT_ACL_DEL', 80);
|
||||
DEFINE('DEFAULT_ACL_ADMIN', 100); */
|
||||
// SSL host name
|
||||
// DEFINE('SSL_HOST', "www4.adidas.co.jp");
|
||||
// DEFINE('SSL_HOST', "ssl.host.name");
|
||||
// error page strictness, Default is 3
|
||||
// 1: only show error page as the last mesure if really no mid & aid can be loaded and found at all
|
||||
// 2: if template not found, do not search, show error template
|
||||
@@ -95,7 +106,7 @@
|
||||
// DEFINE('ERROR_STRICT', 3);
|
||||
// allow page caching in general, set to "FALSE" if you do debugging or development!
|
||||
// DEFINE('ALLOW_SMARTY_CACHE', FALSE);
|
||||
// cache life time, in second', default here is 2 days (172800s)
|
||||
// cache life time, in seconds, default here is 2 days (172800s)
|
||||
// -1 is never expire cache
|
||||
// DEFINE('SMARTY_CACHE_LIFETIME', -1);
|
||||
|
||||
@@ -124,17 +135,23 @@
|
||||
// live_queue is a global queue system
|
||||
// DEFINE('QUEUE', 'live_queue');
|
||||
|
||||
/************* DB PATHS (PostgreSQL) *****************/
|
||||
// schema names, can also be defined per <DB INFO>
|
||||
DEFINE('PUBLIC_SCHEMA', 'public');
|
||||
DEFINE('DEV_SCHEMA', 'public');
|
||||
DEFINE('TEST_SCHEMA', 'public');
|
||||
|
||||
// non constant part
|
||||
/************* DB ACCESS *****************/
|
||||
// please be VERY carefull only to change the right side
|
||||
$DB_CONFIG = array(
|
||||
"test" => array (
|
||||
"db_name" => "gullevek",
|
||||
"db_user" => "gullevek",
|
||||
"db_pass" => "gullevek",
|
||||
"db_host" => "db.tokyo.tequila.jp",
|
||||
"<db id>" => array (
|
||||
"db_name" => "<database>",
|
||||
"db_user" => "<user>",
|
||||
"db_pass" => "<password>",
|
||||
"db_host" => "<host>",
|
||||
"db_port" => "5432",
|
||||
"db_schema" => "public",
|
||||
"db_schema" => "public", // if not set, uses public
|
||||
"db_type" => "pgsql",
|
||||
"db_encoding" => '',
|
||||
"db_ssl" => 'disable' // allow, disable, require, prefer
|
||||
@@ -149,27 +166,19 @@
|
||||
|
||||
// each host has a different db_host
|
||||
// development host
|
||||
$DB_HOST['soba'] = "test";
|
||||
$DB_HOST['soba.tokyo.tequila.jp'] = "test";
|
||||
$DB_HOST['<host>'] = "<db id>";
|
||||
// target host (live)
|
||||
// $DB_TARGET_HOST['soba'] = "<DB ID>";
|
||||
// $DB_TARGET_HOST['<host>'] = "<DB ID>";
|
||||
// url redirect database
|
||||
// $DB_URL_REDIRECT_HOST['soba'] = "<DB ID>";
|
||||
// $DB_URL_REDIRECT_HOST['<host>'] = "<DB ID>";
|
||||
// location flagging
|
||||
// test/dev/live
|
||||
$LOCATION['soba'] = 'test';
|
||||
$LOCATION['soba.tokyo.tequila.jp'] = 'test';
|
||||
$LOCATION['<host>'] = '<test|live|remote|etc>';
|
||||
// show DEBUG override
|
||||
// true/false
|
||||
$DEBUG_FLAG['soba'] = true;
|
||||
$DEBUG_FLAG['soba.tokyo.tequila.jp'] = true;
|
||||
// schema names, can also be defined per <DB INFO>
|
||||
DEFINE('PUBLIC_SCHEMA', 'public');
|
||||
DEFINE('DEV_SCHEMA', 'public');
|
||||
DEFINE('TEST_SCHEMA', 'public');
|
||||
// and set to domain
|
||||
$DB_PATH['soba'] = PUBLIC_SCHEMA;
|
||||
$DB_PATH['soba.tokyo.tequila.jp'] = PUBLIC_SCHEMA;
|
||||
$DEBUG_FLAG['<host>'] = true;
|
||||
// set postgresql paths (schemas)
|
||||
$DB_PATH['<host>'] = PUBLIC_SCHEMA;
|
||||
|
||||
// set the USE_DATABASE var, if there is nothing set, we assume TRUE
|
||||
$USE_DATABASE = defined('USE_DATABASE') ? USE_DATABASE : true;
|
||||
@@ -195,7 +204,7 @@
|
||||
// DEFINE('TEST_SCHEMA', $DB_CONFIG[MAIN_DB]['db_schema']);
|
||||
// DEFINE('PUBLIC_SCHEMA', $DB_CONFIG[TARGET_DB]['db_schema']);
|
||||
DEFINE('LOGIN_DB_SCHEMA', 'public'); // where the edit* tables are
|
||||
DEFINE('GLOBAL_DB_SCHEMA', 'public'); // where global tables are that are used by all schemas (eg queue tables for online', etc)
|
||||
DEFINE('GLOBAL_DB_SCHEMA', 'public'); // where global tables are that are used by all schemas (eg queue tables for online, etc)
|
||||
DEFINE('TARGET', $LOCATION[$HOST_NAME]);
|
||||
// DEFINE('CSV_PATH', $PATHS[TARGET]['csv_path']);
|
||||
// DEFINE('EXPORT_SCRIPT', $PATHS[TARGET]['perl_bin']);
|
||||
@@ -236,9 +245,36 @@
|
||||
$DEBUG_ALL = 0;
|
||||
$PRINT_ALL = 0;
|
||||
$DB_DEBUG = 0;
|
||||
$ENABLE_ERROR_HANDLING = 0;
|
||||
}
|
||||
|
||||
// any other global definitons here
|
||||
// DEFINE('SOME_ID', <SOME VALUE>);
|
||||
|
||||
|
||||
// function that will be called on top of each class include to load the class
|
||||
function _spl_autoload($include_file)
|
||||
{
|
||||
// where to search for the files to include
|
||||
$dirs = array (
|
||||
LIBDIR,
|
||||
SMARTYDIR,
|
||||
TABLEARRAYDIR,
|
||||
'',
|
||||
LIBS,
|
||||
SMARTY,
|
||||
TABLE_ARRAYS,
|
||||
__DIR__.'/'.LIBS,
|
||||
__DIR__.'/'.SMARTY
|
||||
);
|
||||
// try to find and load the class ifle
|
||||
foreach ($dirs as $folder)
|
||||
{
|
||||
if (file_exists($folder.$include_file))
|
||||
{
|
||||
require_once($folder.$include_file);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
?>
|
||||
|
||||
@@ -1,10 +1,5 @@
|
||||
<?
|
||||
/********************************************************************
|
||||
* $HeadURL: svn://svn/development/core_data/php/www/configs/config.template.inc $
|
||||
* $LastChangedBy: gullevek $
|
||||
* $LastChangedDate: 2013-02-18 16:27:24 +0900 (Mon, 18 Feb 2013) $
|
||||
* $LastChangedRevision: 4382 $
|
||||
*********************************************************************
|
||||
* AUTHOR: Clemens "Gullevek" Schwaighofer (www.gullevek.org)
|
||||
* CREATED: 2003/06/10
|
||||
* SHORT DESCRIPTION:
|
||||
@@ -24,11 +19,22 @@
|
||||
DEFINE('DEFAULT_ENCODING', "UTF-8");
|
||||
|
||||
/************* PATHS *********************/
|
||||
// path to document root
|
||||
// ** NEW/BETTER DIR DECLARATIONS **
|
||||
// path to original file (if symlink)
|
||||
DEFINE('DIR', __DIR__."/");
|
||||
// libs base path based on DIR
|
||||
DEFINE('LIBDIR', DIR.'libs/');
|
||||
// SMARTY path based on DIR
|
||||
DEFINE('SMARTYDIR', DIR.'Smarty/');
|
||||
// table arrays for Class Form
|
||||
DEFINE('TABLEARRAYDIR', DIR.'table_arrays/');
|
||||
|
||||
// ** OLD DIR DECLARATIONS **
|
||||
// path to document root of file called
|
||||
DEFINE('ROOT', getcwd()."/");
|
||||
// libs path
|
||||
DEFINE('LIBS', "libs/");
|
||||
// includes (strings', arrays for stati, etc)
|
||||
// includes (strings, arrays for static, etc)
|
||||
DEFINE('INCLUDES', "includes/");
|
||||
// layout base path
|
||||
DEFINE('LAYOUT', 'layout/');
|
||||
@@ -79,7 +85,7 @@
|
||||
|
||||
/************* HASH / ACL DEFAULT / ERROR SETTINGS / SMARTY *************/
|
||||
// default hash type
|
||||
DEFINE('DEFAULT_HASH', 'ripemd160');
|
||||
DEFINE('DEFAULT_HASH', 'sha256');
|
||||
// default acl level
|
||||
DEFINE('DEFAULT_ACL_LEVEL', 80);
|
||||
// default levels for certain actions
|
||||
@@ -91,7 +97,7 @@
|
||||
DEFINE('DEFAULT_ACL_DEL', 80);
|
||||
DEFINE('DEFAULT_ACL_ADMIN', 100); */
|
||||
// SSL host name
|
||||
// DEFINE('SSL_HOST', "www4.adidas.co.jp");
|
||||
// DEFINE('SSL_HOST', "ssl.host.name");
|
||||
// error page strictness, Default is 3
|
||||
// 1: only show error page as the last mesure if really no mid & aid can be loaded and found at all
|
||||
// 2: if template not found, do not search, show error template
|
||||
@@ -129,6 +135,12 @@
|
||||
// live_queue is a global queue system
|
||||
// DEFINE('QUEUE', 'live_queue');
|
||||
|
||||
/************* DB PATHS (PostgreSQL) *****************/
|
||||
// schema names, can also be defined per <DB INFO>
|
||||
DEFINE('PUBLIC_SCHEMA', 'public');
|
||||
DEFINE('DEV_SCHEMA', 'public');
|
||||
DEFINE('TEST_SCHEMA', 'public');
|
||||
|
||||
// non constant part
|
||||
/************* DB ACCESS *****************/
|
||||
// please be VERY carefull only to change the right side
|
||||
@@ -139,8 +151,9 @@
|
||||
"db_pass" => "<DB PASSWORD>",
|
||||
"db_host" => "<DB HOST>",
|
||||
"db_port" => "5432",
|
||||
"db_schema" => "<DB SCHEMA>",
|
||||
"db_schema" => "<DB SCHEMA>", // if not set, uses public
|
||||
"db_type" => "pgsql",
|
||||
"db_encoding" => '',
|
||||
"db_ssl" => 'disable' // allow, disable, require, prefer
|
||||
)
|
||||
);
|
||||
@@ -160,15 +173,11 @@
|
||||
// $DB_URL_REDIRECT_HOST['<HOST NAME>'] = "<DB ID>";
|
||||
// location flagging
|
||||
// test/dev/live
|
||||
$LOCATION['<HOST NAME>'] = 'test';
|
||||
$LOCATION['<HOST NAME>'] = '<test|live|remote|etc>';
|
||||
// show DEBUG override
|
||||
// true/false
|
||||
$DEBUG_FLAG['<HOST NAME>'] = true;
|
||||
// schema names, can also be defined per <DB INFO>
|
||||
DEFINE('PUBLIC_SCHEMA', 'public');
|
||||
DEFINE('DEV_SCHEMA', 'public');
|
||||
DEFINE('TEST_SCHEMA', 'public');
|
||||
// and set to domain
|
||||
// set postgresql paths (schemas)
|
||||
$DB_PATH['<HOST NAME>'] = PUBLIC_SCHEMA;
|
||||
|
||||
// set the USE_DATABASE var, if there is nothing set, we assume TRUE
|
||||
@@ -201,6 +210,7 @@
|
||||
// DEFINE('EXPORT_SCRIPT', $PATHS[TARGET]['perl_bin']);
|
||||
// DEFINE('REDIRECT_URL', $PATHS[TARGET]['redirect_url']);
|
||||
DEFINE('DEBUG', $DEBUG_FLAG[$HOST_NAME]);
|
||||
DEFINE('SHOW_ALL_ERRORS', false); // show all errors if debug_all & show_error_handling are enabled
|
||||
|
||||
/************* GENERAL PAGE TITLE ********/
|
||||
$G_TITLE = '<OVERALL PAGE TITLE>';
|
||||
@@ -228,8 +238,43 @@
|
||||
}
|
||||
}
|
||||
|
||||
// turn off debug if debug flag is OFF
|
||||
if (DEBUG == false)
|
||||
{
|
||||
$ECHO_ALL = 0;
|
||||
$DEBUG_ALL = 0;
|
||||
$PRINT_ALL = 0;
|
||||
$DB_DEBUG = 0;
|
||||
$ENABLE_ERROR_HANDLING = 0;
|
||||
}
|
||||
|
||||
// any other global definitons here
|
||||
// DEFINE('SOME_ID', <SOME VALUE>);
|
||||
|
||||
// $Id: config.template.inc 4382 2013-02-18 07:27:24Z gullevek $
|
||||
|
||||
// function that will be called on top of each class include to load the class
|
||||
function _spl_autoload($include_file)
|
||||
{
|
||||
// where to search for the files to include
|
||||
$dirs = array (
|
||||
LIBDIR,
|
||||
SMARTYDIR,
|
||||
TABLEARRAYDIR,
|
||||
'',
|
||||
LIBS,
|
||||
SMARTY,
|
||||
TABLE_ARRAYS,
|
||||
__DIR__.'/'.LIBS,
|
||||
__DIR__.'/'.SMARTY
|
||||
);
|
||||
// try to find and load the class ifle
|
||||
foreach ($dirs as $folder)
|
||||
{
|
||||
if (file_exists($folder.$include_file))
|
||||
{
|
||||
require_once($folder.$include_file);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
?>
|
||||
|
||||
1
www/layout/admin/default/javascript/datepickr/datepickr.min.css
vendored
Normal file
1
www/layout/admin/default/javascript/datepickr/datepickr.min.css
vendored
Normal file
@@ -0,0 +1 @@
|
||||
.datepickr-wrapper{display:inline-block;position:relative}.datepickr-calendar{font-family:'Trebuchet MS',Tahoma,Verdana,Arial,sans-serif;font-size:12px;background-color:#eee;color:#333;border:1px solid #ddd;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;padding:2px;display:none;position:absolute;top:100%;left:0;z-index:100}.open .datepickr-calendar{display:block}.datepickr-calendar .datepickr-months{background-color:#f6af3a;border:1px solid #e78f08;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;color:#fff;padding:2px;text-align:center;font-size:120%}.datepickr-calendar .datepickr-next-month,.datepickr-calendar .datepickr-prev-month{color:#fff;text-decoration:none;padding:0 .4em;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;cursor:pointer}.datepickr-calendar .datepickr-prev-month{float:left}.datepickr-calendar .datepickr-next-month{float:right}.datepickr-calendar .datepickr-current-month{padding:0 .5em}.datepickr-calendar .datepickr-next-month:hover,.datepickr-calendar .datepickr-prev-month:hover{background-color:#fdf5ce;color:#c77405}.datepickr-calendar table{border-collapse:collapse;padding:0;width:100%}.datepickr-calendar thead{font-size:90%}.datepickr-calendar td,.datepickr-calendar th{width:14.3%}.datepickr-calendar th{text-align:center;padding:5px}.datepickr-calendar td{text-align:right;padding:1px}.datepickr-calendar .datepickr-day{display:block;color:#1c94c4;background-color:#f6f6f6;border:1px solid #ccc;padding:5px;cursor:pointer}.datepickr-calendar .datepickr-day:hover{color:#C77405;background-color:#fdf5ce;border:1px solid #fbcb09}.datepickr-calendar .today .datepickr-day{background-color:#fff0A5;border:1px solid #fed22f;color:#363636}.datepickr-calendar .selected .datepickr-day{background-color:#1c94c4;color:#f6f6f6}.datepickr-calendar .disabled .datepickr-day,.datepickr-calendar .disabled .datepickr-day:hover{background-color:#eee;border:1px dotted #ccc;color:#bbb;cursor:default}
|
||||
13
www/layout/admin/default/javascript/datepickr/datepickr.min.js
vendored
Normal file
13
www/layout/admin/default/javascript/datepickr/datepickr.min.js
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
var datepickr=function(d,c){var f,h,a=[],k;datepickr.prototype=datepickr.init.prototype;h=function(a){a._datepickr&&a._datepickr.destroy();a._datepickr=new datepickr.init(a,c);return a._datepickr};if(d.nodeName)return h(d);f=datepickr.prototype.querySelectorAll(d);if(1===f.length)return h(f[0]);for(k=0;k<f.length;k++)a.push(h(f[k]));return a};
|
||||
datepickr.init=function(d,c){var f,h,a=this,k={dateFormat:"F j, Y",altFormat:null,altInput:null,minDate:null,maxDate:null,shorthandCurrentMonth:!1},l=document.createElement("div"),t=document.createElement("span"),u=document.createElement("table"),v=document.createElement("tbody"),g,m=new Date,B,n,p,w,C,r,x,D,E,s,F,G,y,H,z,A,I;l.className="datepickr-calendar";t.className="datepickr-current-month";c=c||{};B=function(){g=document.createElement("div");g.className="datepickr-wrapper";a.element.parentNode.insertBefore(g,
|
||||
a.element);g.appendChild(a.element)};f={year:function(){return m.getFullYear()},month:{integer:function(){return m.getMonth()},string:function(a){var e=m.getMonth();return p(e,a)}},day:function(){return m.getDate()}};h={string:function(){return p(a.currentMonthView,a.config.shorthandCurrentMonth)},numDays:function(){return 1===a.currentMonthView&&(0===a.currentYearView%4&&0!==a.currentYearView%100||0===a.currentYearView%400)?29:a.l10n.daysInMonth[a.currentMonthView]}};n=function(b,e){var q="",d=new Date(e),
|
||||
c={d:function(){var a=c.j();return 10>a?"0"+a:a},D:function(){return a.l10n.weekdays.shorthand[c.w()]},j:function(){return d.getDate()},l:function(){return a.l10n.weekdays.longhand[c.w()]},w:function(){return d.getDay()},F:function(){return p(c.n()-1,!1)},m:function(){var a=c.n();return 10>a?"0"+a:a},M:function(){return p(c.n()-1,!0)},n:function(){return d.getMonth()+1},U:function(){return d.getTime()/1E3},y:function(){return String(c.Y()).substring(2)},Y:function(){return d.getFullYear()}},f=b.split("");
|
||||
a.forEach(f,function(a,b){c[a]&&"\\"!==f[b-1]?q+=c[a]():"\\"!==a&&(q+=a)});return q};p=function(b,e){return!0===e?a.l10n.months.shorthand[b]:a.l10n.months.longhand[b]};w=function(b,e,c,d){return b===d&&a.currentMonthView===e&&a.currentYearView===c};C=function(){var b=document.createElement("thead"),e=a.l10n.firstDayOfWeek,c=a.l10n.weekdays.shorthand;0<e&&e<c.length&&(c=[].concat(c.splice(e,c.length),c.splice(0,e)));b.innerHTML="<tr><th>"+c.join("</th><th>")+"</th></tr>";u.appendChild(b)};r=function(){var b=
|
||||
(new Date(a.currentYearView,a.currentMonthView,1)).getDay(),c=h.numDays(),d=document.createDocumentFragment(),g=document.createElement("tr"),k,l="",p="",m="",n,b=b-a.l10n.firstDayOfWeek;0>b&&(b+=7);k=b;v.innerHTML="";0<b&&(g.innerHTML+='<td colspan="'+b+'"> </td>');for(b=1;b<=c;b++){7===k&&(d.appendChild(g),g=document.createElement("tr"),k=0);l=w(f.day(),f.month.integer(),f.year(),b)?" today":"";a.selectedDate&&(p=w(a.selectedDate.day,a.selectedDate.month,a.selectedDate.year,b)?" selected":"");
|
||||
if(a.config.minDate||a.config.maxDate)n=(new Date(a.currentYearView,a.currentMonthView,b)).getTime(),m="",a.config.minDate&&n<a.config.minDate&&(m=" disabled"),a.config.maxDate&&n>a.config.maxDate&&(m=" disabled");g.innerHTML+='<td class="'+l+p+m+'"><span class="datepickr-day">'+b+"</span></td>";k++}d.appendChild(g);v.appendChild(d)};x=function(){t.innerHTML=a.currentYearView+" "+h.string()};D=function(){var a=document.createElement("div");a.className="datepickr-months";a.innerHTML='<span class="datepickr-prev-month"><</span><span class="datepickr-next-month">></span>';
|
||||
a.appendChild(t);x();l.appendChild(a)};E=function(){0>a.currentMonthView&&(a.currentYearView--,a.currentMonthView=11);11<a.currentMonthView&&(a.currentYearView++,a.currentMonthView=0)};s=function(b){if(b.target!==a.element&&b.target!==g&&(b=b.target.parentNode,b!==g))for(;b!==g;)if(b=b.parentNode,null===b){A();break}};F=function(b){b=b.target;var c=b.className;c&&("datepickr-prev-month"===c||"datepickr-next-month"===c?("datepickr-prev-month"===c?a.currentMonthView--:a.currentMonthView++,E(),x(),r()):
|
||||
"datepickr-day"!==c||a.hasClass(b.parentNode,"disabled")||(a.selectedDate={day:parseInt(b.innerHTML,10),month:a.currentMonthView,year:a.currentYearView},b=(new Date(a.currentYearView,a.currentMonthView,a.selectedDate.day)).getTime(),a.config.altInput&&(a.config.altInput.value=a.config.altFormat?n(a.config.altFormat,b):n(a.config.dateFormat,b)),a.element.value=n(a.config.dateFormat,b),A(),r()))};G=function(){D();C();r();u.appendChild(v);l.appendChild(u);g.appendChild(l)};y=function(){return"INPUT"===
|
||||
a.element.nodeName?"focus":"click"};H=function(){a.addEventListener(a.element,y(),z);a.addEventListener(l,"click",F)};z=function(){a.addEventListener(document,"click",s);a.addClass(g,"open")};A=function(){a.removeEventListener(document,"click",s);a.removeClass(g,"open")};I=function(){var b,c;a.removeEventListener(document,"click",s);a.removeEventListener(a.element,y(),z);b=a.element.parentNode;b.removeChild(l);c=b.removeChild(a.element);b.parentNode.replaceChild(c,b)};(function(){var b,e;a.config=
|
||||
{};a.destroy=I;for(b in k)a.config[b]=c[b]||k[b];a.element=d;a.element.value&&(e=Date.parse(a.element.value));e&&!isNaN(e)?(e=new Date(e),a.selectedDate={day:e.getDate(),month:e.getMonth(),year:e.getFullYear()},a.currentYearView=a.selectedDate.year,a.currentMonthView=a.selectedDate.month,a.currentDayView=a.selectedDate.day):(a.selectedDate=null,a.currentYearView=f.year(),a.currentMonthView=f.month.integer(),a.currentDayView=f.day());B();G();H()})();return a};
|
||||
datepickr.init.prototype={hasClass:function(d,c){return d.classList.contains(c)},addClass:function(d,c){d.classList.add(c)},removeClass:function(d,c){d.classList.remove(c)},forEach:function(d,c){[].forEach.call(d,c)},querySelectorAll:document.querySelectorAll.bind(document),isArray:Array.isArray,addEventListener:function(d,c,f,h){d.addEventListener(c,f,h)},removeEventListener:function(d,c,f,h){d.removeEventListener(c,f,h)},l10n:{weekdays:{shorthand:"Sun Mon Tue Wed Thu Fri Sat".split(" "),longhand:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" ")},
|
||||
months:{shorthand:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),longhand:"January February March April May June July August September October November December".split(" ")},daysInMonth:[31,28,31,30,31,30,31,31,30,31,30,31],firstDayOfWeek:0}};
|
||||
10346
www/layout/admin/default/javascript/jquery-1.11.2.js
vendored
10346
www/layout/admin/default/javascript/jquery-1.11.2.js
vendored
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
4
www/layout/admin/default/javascript/jquery-3.1.0.min.js
vendored
Normal file
4
www/layout/admin/default/javascript/jquery-3.1.0.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
jquery-2.1.3.min.js
|
||||
jquery-3.1.0.min.js
|
||||
@@ -1 +1 @@
|
||||
jquery-2.1.3.js
|
||||
jquery-3.1.0.js
|
||||
@@ -21,5 +21,3 @@
|
||||
<input type="submit" name="new" value="{$new.new_name}">
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
{* $Id: edit_new.tpl 4897 2014-02-06 08:16:56Z gullevek $ *}
|
||||
|
||||
3
www/layout/admin/default/templates/smarty_test.tpl
Normal file
3
www/layout/admin/default/templates/smarty_test.tpl
Normal file
@@ -0,0 +1,3 @@
|
||||
<div>
|
||||
{$SMARTY_TEST}
|
||||
</div>
|
||||
62
www/layout/frontend/default/templates/main_body.old.tpl
Normal file
62
www/layout/frontend/default/templates/main_body.old.tpl
Normal file
@@ -0,0 +1,62 @@
|
||||
{*
|
||||
********************************************************************
|
||||
* AUTHOR: Clemens Schwaighofer
|
||||
* DATE: 2008/12/24
|
||||
* DESCRIPTION:
|
||||
* main body
|
||||
* HISTORY:
|
||||
********************************************************************
|
||||
*}
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>{$HTML_TITLE}</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset={$DEFAULT_ENCODING}">
|
||||
{if $STYLESHEET}
|
||||
<link rel=stylesheet type="text/css" href="{$CSS}{$STYLESHEET}">
|
||||
{/if}
|
||||
<script language="JavaScript">
|
||||
<!--
|
||||
var DEBUG = {$JS_DEBUG};
|
||||
//-->
|
||||
</script>
|
||||
<script language="JavaScript" src="{$js}/firebug.js"></script>
|
||||
<script language="JavaScript" src="{$js}/debug.js"></script>
|
||||
{if $JAVASCRIPT}
|
||||
<script language="JavaScript" src="{$JS}{$JAVASCRIPT}"></script>
|
||||
{/if}
|
||||
{if $ajax_javascript}
|
||||
<script language="JavaScript">
|
||||
{$ajax_javascript}
|
||||
</script>
|
||||
{/if}
|
||||
{if $JS_INCLUDE}
|
||||
<script language="JavaScript" src="{$JS_INCLUDE}"></script>
|
||||
{/if}
|
||||
{* for including datepickr *}
|
||||
{if $JS_DATEPICKR}
|
||||
<link rel=stylesheet type="text/css" href="{$js}/datepickr/datepickr.min.css">
|
||||
<script language="JavaScript" src="{$js}/datepickr/datepickr.min.js"></script>
|
||||
{/if}
|
||||
{* {popup_init src="`$js`/overlib/overlib.js"} *}
|
||||
</head>
|
||||
<body>
|
||||
<form name="product_search" method="get">
|
||||
<div style="border: 1px solid black; margin: 15px; padding: 5px;">
|
||||
{include file="top_menu.tpl"}
|
||||
</div>
|
||||
<div>
|
||||
{include file="$INCLUDE_TEMPLATE"}
|
||||
</div>
|
||||
</form>
|
||||
{* debug info *}
|
||||
{if $DEBUG}
|
||||
<div style="width:{$table_width}px;" class="debug_message">
|
||||
{$Id}<br>
|
||||
<b>{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}</b><br>
|
||||
{$debug_error_msg}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,57 +1,52 @@
|
||||
{*
|
||||
********************************************************************
|
||||
* AUTHOR: Clemens Schwaighofer
|
||||
* DATE: 2008/12/24
|
||||
* DATE: 2005/06/23
|
||||
* DESCRIPTION:
|
||||
* main body
|
||||
* edit body part
|
||||
* HISTORY:
|
||||
********************************************************************
|
||||
*}
|
||||
|
||||
<html>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<title>{$HTML_TITLE}</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset={$DEFAULT_ENCODING}">
|
||||
{if $STYLESHEET}
|
||||
<link rel=stylesheet type="text/css" href="{$CSS}{$STYLESHEET}">
|
||||
<link rel=stylesheet type="text/css" href="{$css}{$STYLESHEET}">
|
||||
{/if}
|
||||
{if $CSS_INCLUDE}
|
||||
<link rel=stylesheet type="text/css" href="{$CSS_INCLUDE}">
|
||||
{/if}
|
||||
{if $CSS_SPECIAL_INCLUDE}
|
||||
<link rel=stylesheet type="text/css" href="{$CSS_SPECIAL_INCLUDE}">
|
||||
{/if}
|
||||
<script language="JavaScript">
|
||||
<!--
|
||||
var DEBUG = {$JS_DEBUG};
|
||||
//-->
|
||||
</script>
|
||||
<script language="JavaScript" src="{$js}/firebug.js"></script>
|
||||
<script language="JavaScript" src="{$js}/debug.js"></script>
|
||||
{if $JAVASCRIPT}
|
||||
<script language="JavaScript" src="{$JS}{$JAVASCRIPT}"></script>
|
||||
<script language="JavaScript" src="{$js}{$JAVASCRIPT}"></script>
|
||||
{/if}
|
||||
{if $ajax_javascript}
|
||||
<script language="JavaScript">
|
||||
{$ajax_javascript}
|
||||
</script>
|
||||
{* declare prototype everywhere *}
|
||||
<script src="{$js}/scriptaculous/prototype.js" type="text/javascript"></script>
|
||||
{if $USE_SCRIPTACULOUS}
|
||||
<script src="{$js}/scriptaculous/scriptaculous.js" type="text/javascript"></script>
|
||||
{/if}
|
||||
{if $JS_INCLUDE}
|
||||
<script language="JavaScript" src="{$JS_INCLUDE}"></script>
|
||||
{/if}
|
||||
{* {popup_init src="`$js`/overlib/overlib.js"} *}
|
||||
{if $JS_SPECIAL_INCLUDE}
|
||||
<script language="JavaScript" src="{$JS_SPECIAL_INCLUDE}"></script>
|
||||
{/if}
|
||||
{* for including datepickr *}
|
||||
{if $JS_DATEPICKR}
|
||||
<link rel=stylesheet type="text/css" href="{$js}/datepickr/datepickr.min.css">
|
||||
<script language="JavaScript" src="{$js}/datepickr/datepickr.min.js"></script>
|
||||
{/if}
|
||||
{if $USE_OVERLIB}
|
||||
{popup_init src="`$js`/overlib/overlib.js"}
|
||||
{/if}
|
||||
</head>
|
||||
<body>
|
||||
<form name="product_search" method="get">
|
||||
<div style="border: 1px solid black; margin: 15px; padding: 5px;">
|
||||
{include file="top_menu.tpl"}
|
||||
</div>
|
||||
<div>
|
||||
{include file="$INCLUDE_TEMPLATE"}
|
||||
</div>
|
||||
</form>
|
||||
{* debug info *}
|
||||
{if $DEBUG}
|
||||
<div style="width:{$table_width}px;" class="debug_message">
|
||||
{$Id}<br>
|
||||
<b>{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}</b><br>
|
||||
{$debug_error_msg}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{include file="$TEMPLATE_NAME"}
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
* with your name on it ...
|
||||
* DESCRIPTION
|
||||
* Basic Admin interface backend
|
||||
* - sets ACLs
|
||||
* - sets action flags
|
||||
* - menu creation
|
||||
* - array vars for smarty
|
||||
@@ -25,7 +24,8 @@
|
||||
*
|
||||
*********************************************************************/
|
||||
|
||||
require_once(LIBS."Class.DB.IO.inc");
|
||||
// try to include file from LIBS path, or from normal path
|
||||
_spl_autoload('Class.DB.IO.inc');
|
||||
|
||||
class AdminBackend extends db_io
|
||||
{
|
||||
@@ -44,11 +44,8 @@
|
||||
public $action_loaded;
|
||||
public $action_value;
|
||||
public $action_error;
|
||||
// DEPRICATED -> use login acl
|
||||
// public $page_acl; // the acl the user has on this page
|
||||
// public $default_acl;
|
||||
// DEPRICATED access rights
|
||||
// public $access_rights = array ();
|
||||
// ACL array variable if we want to set acl data from outisde
|
||||
public $acl = array ();
|
||||
// the current active edit access id
|
||||
public $edit_access_id;
|
||||
// error/warning/info messages
|
||||
@@ -66,7 +63,7 @@
|
||||
public function __construct($db_config, $lang, $debug = 0, $db_debug = 0, $echo = 1, $print = 0)
|
||||
{
|
||||
// get the language sub class & init it
|
||||
require_once(LIBS."Class.l10n.inc");
|
||||
_spl_autoload('Class.l10n.inc');
|
||||
|
||||
$this->l = new l10n($lang);
|
||||
|
||||
@@ -138,10 +135,10 @@
|
||||
$q .= "ip, user_agent, referer, script_name, query_string, server_name, http_host, http_accept, http_accept_charset, http_accept_encoding, session_id, ";
|
||||
$q .= "action, action_id, action_yes, action_flag, action_menu, action_loaded, action_value, action_error) ";
|
||||
$q .= "VALUES ";
|
||||
$q .= "(".$_SESSION['EUID'].", NOW(), '".$this->db_escape_string($event)."', '".$data."', '".$data_binary."', '".$this->page_name."', ";
|
||||
$q .= "'".$_SERVER["REMOTE_ADDR"]."', '".$this->db_escape_string($_SERVER['HTTP_USER_AGENT'])."', '".$this->db_escape_string($_SERVER['HTTP_REFERER'])."', '".$this->db_escape_string($_SERVER['SCRIPT_FILENAME'])."', '".$this->db_escape_string($_SERVER['QUERY_STRING'])."', '".$this->db_escape_string($_SERVER['SERVER_NAME'])."', '".$this->db_escape_string($_SERVER['HTTP_HOST'])."', '".$this->db_escape_string($_SERVER['HTTP_ACCEPT'])."', '".$this->db_escape_string($_SERVER['HTTP_ACCEPT_CHARSET'])."', '".$this->db_escape_string($_SERVER['HTTP_ACCEPT_ENCODING'])."', '".session_id()."', ";
|
||||
$q .= "(".@$_SESSION['EUID'].", NOW(), '".$this->db_escape_string($event)."', '".$data."', '".$data_binary."', '".$this->page_name."', ";
|
||||
$q .= "'".@$_SERVER["REMOTE_ADDR"]."', '".$this->db_escape_string(@$_SERVER['HTTP_USER_AGENT'])."', '".$this->db_escape_string(@$_SERVER['HTTP_REFERER'])."', '".$this->db_escape_string(@$_SERVER['SCRIPT_FILENAME'])."', '".$this->db_escape_string(@$_SERVER['QUERY_STRING'])."', '".$this->db_escape_string(@$_SERVER['SERVER_NAME'])."', '".$this->db_escape_string(@$_SERVER['HTTP_HOST'])."', '".$this->db_escape_string(@$_SERVER['HTTP_ACCEPT'])."', '".$this->db_escape_string(@$_SERVER['HTTP_ACCEPT_CHARSET'])."', '".$this->db_escape_string(@$_SERVER['HTTP_ACCEPT_ENCODING'])."', '".session_id()."', ";
|
||||
$q .= "'".$this->db_escape_string($this->action)."', '".$this->db_escape_string($this->action_id)."', '".$this->db_escape_string($this->action_yes)."', '".$this->db_escape_string($this->action_flag)."', '".$this->db_escape_string($this->action_menu)."', '".$this->db_escape_string($this->action_loaded)."', '".$this->db_escape_string($this->action_value)."', '".$this->db_escape_string($this->action_error)."')";
|
||||
$this->db_exec($q, 'edit_log_id');
|
||||
$this->db_exec($q, 'NULL');
|
||||
}
|
||||
|
||||
|
||||
@@ -334,5 +331,72 @@
|
||||
$this->db_exec($q);
|
||||
}
|
||||
|
||||
// METHOD: adbPrintDateTime
|
||||
// PARAMS: year, month, day, hour, min: the date and time values
|
||||
// suffix: additional info printed after the date time variable in the drop down, also used for ID in the on change JS call
|
||||
// minute steps, can be 1 (default), 5, 10, etc, if invalid (outside 1h range, it falls back to 1min)
|
||||
// RETURN: HTML formated strings for drop down lists of date and time
|
||||
// DESC: print the date/time drop downs, used in any queue/send/insert at date/time place
|
||||
public function adbPrintDateTime($year, $month, $day, $hour, $min, $suffix = '', $min_steps = 1)
|
||||
{
|
||||
// if suffix given, add _ before
|
||||
if ($suffix)
|
||||
$suffix = '_'.$suffix;
|
||||
if ($min_steps < 1 || $min_steps > 59)
|
||||
$min_steps = 1;
|
||||
|
||||
$on_change_call = 'dt_list(\''.$suffix.'\');';
|
||||
|
||||
// always be 1h ahead (for safety)
|
||||
$timestamp = time() + 3600; // in seconds
|
||||
|
||||
// the max year is this year + 1;
|
||||
$max_year = date("Y", $timestamp) + 1;
|
||||
|
||||
// preset year, month, ...
|
||||
$year = (!$year) ? date("Y", $timestamp) : $year;
|
||||
$month = (!$month) ? date("m", $timestamp) : $month;
|
||||
$day = (!$day) ? date("d", $timestamp) : $day;
|
||||
$hour = (!$hour) ? date("H", $timestamp) : $hour;
|
||||
$min = (!$min) ? date("i", $timestamp) : $min; // add to five min?
|
||||
// max days in selected month
|
||||
$days_in_month = date("t", strtotime($year."-".$month."-".$day." ".$hour.":".$min.":0"));
|
||||
|
||||
// from now to ?
|
||||
$string = $this->l->__('Year').' ';
|
||||
$string .= '<select id="year'.$suffix.'" name="year'.$suffix.'" onChange="'.$on_change_call.'">';
|
||||
for ($i = date("Y"); $i <= $max_year; $i ++)
|
||||
{
|
||||
$string .= '<option value="'.$i.'" '.(($year == $i) ? 'selected' : '').'>'.$i.'</option>';
|
||||
}
|
||||
$string .= '</select> '.$this->l->__('Month').' ';
|
||||
$string .= '<select id="month'.$suffix.'" name="month'.$suffix.'" onChange="'.$on_change_call.'">';
|
||||
for ($i = 1; $i <= 12; $i ++)
|
||||
{
|
||||
$string .= '<option value="'.(($i < 10) ? '0'.$i : $i).'" '.(($month == $i) ? 'selected' : '').'>'.$i.'</option>';
|
||||
}
|
||||
$string .= '</select> '.$this->l->__('Day').' ';
|
||||
$string .= '<select id="day'.$suffix.'" name="day'.$suffix.'" onChange="'.$on_change_call.'">';
|
||||
for ($i = 1; $i <= $days_in_month; $i ++)
|
||||
{
|
||||
// set weekday text based on current month ($month) and year ($year)
|
||||
$string .= '<option value="'.(($i < 10) ? '0'.$i : $i).'" '.(($day == $i) ? 'selected' : '').'>'.$i.' ('.$this->l->__(date('D', mktime(0, 0, 0, $month, $i, $year))).')</option>';
|
||||
}
|
||||
$string .= '</select> '.$this->l->__('Hour').' ';
|
||||
$string .= '<select id="hour'.$suffix.'" name="hour'.$suffix.'" onChange="'.$on_change_call.'">';
|
||||
for ($i = 0; $i <= 23; $i ++)
|
||||
{
|
||||
$string .= '<option value="'.(($i < 10) ? '0'.$i : $i).'" '.(($hour == $i) ? 'selected' : '').'>'.$i.'</option>';
|
||||
}
|
||||
$string .= '</select> '.$this->l->__('Minute').' ';
|
||||
$string .= '<select id="min'.$suffix.'" name="min'.$suffix.'" onChange="'.$on_change_call.'">';
|
||||
for ( $i = 0; $i <= 59; $i += $min_steps)
|
||||
{
|
||||
$string .= '<option value="'.(( $i < 10) ? '0'.$i : $i).'" '.(($min == $i) ? 'selected' : '').'>'.$i.'</option>';
|
||||
}
|
||||
$string .= '</select>';
|
||||
// return the datetime select string
|
||||
return $string;
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
||||
@@ -36,11 +36,11 @@
|
||||
* PUBLIC METHODS
|
||||
* debug -> calls with "level", "string" and flag to turn off (0) the newline at the end
|
||||
* debug_for -> sets debug on/off for a type (error, echo, print) for a certain level
|
||||
* print_error_msg -> prints out the error message, optional parameter is a header prefix
|
||||
* print_error_msg -> prints out the error message, optional parameter is a header prefix
|
||||
* fdebug -> prints line directly to debug_file.log in tmp
|
||||
*
|
||||
* print_time -> prints time + microtime, optional flag to turn off (0) microtime printout
|
||||
* basic -> constructor
|
||||
* basic -> constructor
|
||||
* _basic -> desconstructor
|
||||
* info -> info about that class
|
||||
* running_time -> prints out the time of start/end (automatically called on created and error printout
|
||||
@@ -103,7 +103,7 @@
|
||||
|
||||
private $error_id; // error ID for errors in classes
|
||||
private $error_string; // error strings in classes (for error_id)
|
||||
public $error_msg = array (); // the "connection" to the outside errors
|
||||
private $error_msg = array (); // the "connection" to the outside errors
|
||||
|
||||
public $debug_output; // if this is true, show debug on desconstructor
|
||||
public $debug_output_not;
|
||||
@@ -115,15 +115,16 @@
|
||||
public $print_output_not;
|
||||
public $print_output_all;
|
||||
|
||||
// file rotate flags, if they are over this, file gets rotated
|
||||
// old files are named print_file_YYYY-MM-DD_ddddd, where ddddd is a per day increasing number
|
||||
public $file_name_ext = ''; // use this for date rotate
|
||||
public $max_filesize = 0; // set in kilobytes
|
||||
// log file name
|
||||
public $print_file = 'error_msg##LEVEL####CLASS####PAGENAME##';
|
||||
public $one_file = 0; // if this is set to true, all log dat is written to one file
|
||||
public $per_page = 0;
|
||||
public $per_class = 0;
|
||||
private $log_file_name_ext = 'log'; // use this for date rotate
|
||||
public $log_max_filesize = 0; // set in kilobytes
|
||||
private $log_print_file = 'error_msg##LEVEL####CLASS####PAGENAME####DATE##';
|
||||
private $log_file_unique_id; // a unique ID set only once for call derived from this class
|
||||
public $log_print_file_date = 1; // if set add Y-m-d and do automatic daily rotation
|
||||
public $log_per_level = 0; // set, it will split per level (first parameter in debug call)
|
||||
public $log_per_class = 0; // set, will split log per class
|
||||
public $log_per_page = 0; // set, will split log per called file
|
||||
public $log_per_run = 0; // create a new log file per run (time stamp + unique ID)
|
||||
|
||||
public $starttime; // start time if time debug is used
|
||||
public $endtime; // end time if time debug is used
|
||||
@@ -165,9 +166,6 @@
|
||||
{
|
||||
// set per run UID for logging
|
||||
$this->running_uid = hash($this->hash_algo, uniqid(rand(), true));
|
||||
// set core file extension for logging with Y M D date
|
||||
if (!$this->file_name_ext)
|
||||
$this->file_name_ext = '_'.date('Y-m-d').'.log';
|
||||
|
||||
// internal info var
|
||||
$this->class_info["basic"] = array (
|
||||
@@ -175,7 +173,7 @@
|
||||
"class_version" => "0.9.0",
|
||||
"class_created" => "2003-03-24",
|
||||
"class_author" => 'Clemens "Gullevek" Schwaighofer (.at)'
|
||||
);
|
||||
);
|
||||
|
||||
// set the page name
|
||||
$this->page_name = $this->get_page_name();
|
||||
@@ -219,19 +217,17 @@
|
||||
if (isset($GLOBALS['PRINT_ALL']))
|
||||
$this->print_output_all = $GLOBALS['PRINT_ALL'];
|
||||
|
||||
if (isset($GLOBALS['FILE_NAME_EXT']) && !$this->file_name_ext)
|
||||
$this->file_name_ext = $GLOBALS['FILE_NAME_EXT'];
|
||||
if (isset($GLOBALS['MAX_FILESIZE']))
|
||||
$this->max_filesize = $GLOBALS['MAX_FILESIZE'];
|
||||
|
||||
// check the file_ext and max size
|
||||
if (!preg_match("/\w/", $this->file_name_ext))
|
||||
$this->file_name_ext = '';
|
||||
if (!preg_match("/\d/", $this->max_filesize))
|
||||
$this->max_filesize = 0;
|
||||
// set default extension
|
||||
if (!$this->file_name_ext)
|
||||
$this->file_name_ext = '.log';
|
||||
// GLOBAL rules for log writing
|
||||
if (isset($GLOBALS['LOG_PRINT_FILE_DATE']))
|
||||
$this->log_print_file_date = $GLOBALS['LOG_PRINT_FILE_DATE'];
|
||||
if (isset($GLOBALS['LOG_PER_LEVEL']))
|
||||
$this->log_per_level = $GLOBALS['LOG_PER_LEVEL'];
|
||||
if (isset($GLOBALS['LOG_PER_CLASS']))
|
||||
$this->log_per_class = $GLOBALS['LOG_PER_CLASS'];
|
||||
if (isset($GLOBALS['LOG_PER_PAGE']))
|
||||
$this->log_per_page = $GLOBALS['LOG_PER_PAGE'];
|
||||
if (isset($GLOBALS['LOG_PER_RUN']))
|
||||
$this->log_per_run = $GLOBALS['LOG_PER_RUN'];
|
||||
|
||||
// set the regex for checking emails
|
||||
$this->email_regex = "^[A-Za-z0-9!#$%&'*+-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+-\/=?^_`{|}~\.]{0,63}@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]{1,})*\.([a-zA-Z]{2,6}){1}$";
|
||||
@@ -247,23 +243,68 @@
|
||||
);
|
||||
// the array with the mobile types that are valid
|
||||
$this->mobile_email_type = array (
|
||||
'.*@docomo\.ne\.jp$' => 'docomo',
|
||||
'.*@([a-z0-9]{2}\.)?ezweb\.ne\.jp$' => 'kddi_ezweb', # correct are a[2-4], b2, c[1-9], e[2-9], h[2-4], t[1-9]
|
||||
'.*@(ez[a-j]{1}\.)?ido\.ne\.jp$' => 'kddi', # ez[a-j] or nothing
|
||||
'.*@([a-z]{2}\.)?sky\.tu-ka\.ne\.jp$' => 'kddi_tu-ka', # (sky group)
|
||||
'.*@([a-z]{2}\.)?sky\.tk[kc]{1}\.ne\.jp$' => 'kddi_sky', # (sky group) [tkk,tkc only]
|
||||
'.*@([a-z]{2}\.)?sky\.dtg\.ne\.jp$' => 'kddi', # dtg (sky group)
|
||||
'.*@[tkdhcrnsq]{1}\.vodafone\.ne\.jp$' => 'softbank', # old vodafone [t,k,d,h,c,r,n,s,q]
|
||||
'.*@jp-[dhtkrsnqc]{1}\.ne\.jp$' => 'softbank', # very old j-phone (pre vodafone) [d,h,t,k,r,s,n,q,c]
|
||||
'.*@([dhtcrknsq]{1}\.)?softbank\.ne\.jp$' => 'softbank', # add i for iphone also as keitai, others similar to the vodafone group
|
||||
'.*@i{1}\.softbank(\.ne)?\.jp$' => 'softbank_iphone', # add iPhone also as keitai and not as pc
|
||||
'.*@disney\.ne\.jp$' => 'softbank_disney', # (kids)
|
||||
'.*@willcom\.ne\.jp$' => 'willcom',
|
||||
'.*@willcom\.com$' => 'willcom', # new for pdx.ne.jp address
|
||||
'.*@pdx\.ne\.jp$' => 'willcom', # old pdx address for willcom
|
||||
'.*@bandai\.jp$' => 'willcom', # willcom paipo! (kids)
|
||||
'.*@pipopa\.ne\.jp$' => 'willcom', # willcom paipo! (kids)
|
||||
'.*@([a-z0-9]{2,4}\.)?pdx\.ne\.jp$' => 'willcom' # actually only di,dj,dk,wm -> all others are "wrong", but none also allowed?
|
||||
'.*@docomo\.ne\.jp$' => 'keitai_docomo',
|
||||
'.*@([a-z0-9]{2}\.)?ezweb\.ne\.jp$' => 'keitai_kddi_ezweb', # correct are a[2-4], b2, c[1-9], e[2-9], h[2-4], t[1-9]
|
||||
'.*@(ez[a-j]{1}\.)?ido\.ne\.jp$' => 'keitai_kddi_ido', # ez[a-j] or nothing
|
||||
'.*@([a-z]{2}\.)?sky\.tu-ka\.ne\.jp$' => 'keitai_kddi_tu-ka', # (sky group)
|
||||
'.*@([a-z]{2}\.)?sky\.tk[kc]{1}\.ne\.jp$' => 'keitai_kddi_sky', # (sky group) [tkk,tkc only]
|
||||
'.*@([a-z]{2}\.)?sky\.dtg\.ne\.jp$' => 'keitai_kddi_dtg', # dtg (sky group)
|
||||
'.*@[tkdhcrnsq]{1}\.vodafone\.ne\.jp$' => 'keitai_softbank_vodafone', # old vodafone [t,k,d,h,c,r,n,s,q]
|
||||
'.*@jp-[dhtkrsnqc]{1}\.ne\.jp$' => 'keitai_softbank_j-phone', # very old j-phone (pre vodafone) [d,h,t,k,r,s,n,q,c]
|
||||
'.*@([dhtcrknsq]{1}\.)?softbank\.ne\.jp$' => 'keitai_softbank', # add i for iphone also as keitai, others similar to the vodafone group
|
||||
'.*@i{1}\.softbank(\.ne)?\.jp$' => 'smartphone_softbank_iphone', # add iPhone also as keitai and not as pc
|
||||
'.*@disney\.ne\.jp$' => 'keitai_softbank_disney', # (kids)
|
||||
'.*@willcom\.ne\.jp$' => 'keitai_willcom',
|
||||
'.*@willcom\.com$' => 'keitai_willcom', # new for pdx.ne.jp address
|
||||
'.*@wcm\.ne\.jp$' => 'keitai_willcom', # old willcom wcm.ne.jp
|
||||
'.*@pdx\.ne\.jp$' => 'keitai_willcom_pdx', # old pdx address for willcom
|
||||
'.*@bandai\.jp$' => 'keitai_willcom_bandai', # willcom paipo! (kids)
|
||||
'.*@pipopa\.ne\.jp$' => 'keitai_willcom_pipopa', # willcom paipo! (kids)
|
||||
'.*@([a-z0-9]{2,4}\.)?pdx\.ne\.jp$' => 'keitai_willcom_pdx', # actually only di,dj,dk,wm -> all others are "wrong", but none also allowed?
|
||||
'.*@ymobile([1]{1})?\.ne\.jp$' => 'keitai_willcom_ymobile', # ymobile, ymobile1 techincally not willcom, but I group them there
|
||||
'.*@y-mobile\.ne\.jp$' => 'keitai_willcom_ymobile', # y-mobile techincally not willcom, but I group them there
|
||||
'.*@emnet\.ne\.jp$' => 'keitai_willcom_emnet', # e-mobile, group will willcom
|
||||
'.*@emobile\.ne\.jp$' => 'keitai_willcom_emnet', # e-mobile, group will willcom
|
||||
'.*@emobile-s\.ne\.jp$' => 'keitai_willcom_emnet' # e-mobile, group will willcom
|
||||
);
|
||||
// short list for mobile email types
|
||||
$this->mobile_email_type_short = array (
|
||||
'keitai_docomo' => 'docomo',
|
||||
'keitai_kddi_ezweb' => 'kddi',
|
||||
'keitai_kddi' => 'kddi',
|
||||
'keitai_kddi_tu-ka' => 'kddi',
|
||||
'keitai_kddi_sky' => 'kddi',
|
||||
'keitai_softbank' => 'softbank',
|
||||
'smartphone_softbank_iphone' => 'iphone',
|
||||
'keitai_softbank_disney' => 'softbank',
|
||||
'keitai_softbank_vodafone' => 'softbank',
|
||||
'keitai_softbank_j-phone' => 'softbank',
|
||||
'keitai_willcom' => 'willcom',
|
||||
'keitai_willcom_pdx' => 'willcom',
|
||||
'keitai_willcom_bandai' => 'willcom',
|
||||
'keitai_willcom_pipopa' => 'willcom',
|
||||
'keitai_willcom_ymobile' => 'willcom',
|
||||
'keitai_willcom_emnet' => 'willcom',
|
||||
'pc_html' => 'pc',
|
||||
// old sets -> to be removed later
|
||||
'docomo' => 'docomo',
|
||||
'kddi_ezweb' => 'kddi',
|
||||
'kddi' => 'kddi',
|
||||
'kddi_tu-ka' => 'kddi',
|
||||
'kddi_sky' => 'kddi',
|
||||
'softbank' => 'softbank',
|
||||
'keitai_softbank_iphone' => 'iphone',
|
||||
'softbank_iphone' => 'iphone',
|
||||
'softbank_disney' => 'softbank',
|
||||
'softbank_vodafone' => 'softbank',
|
||||
'softbank_j-phone' => 'softbank',
|
||||
'willcom' => 'willcom',
|
||||
'willcom_pdx' => 'willcom',
|
||||
'willcom_bandai' => 'willcom',
|
||||
'willcom_pipopa' => 'willcom',
|
||||
'willcom_ymobile' => 'willcom',
|
||||
'willcom_emnet' => 'willcom',
|
||||
'pc' => 'pc'
|
||||
);
|
||||
|
||||
// initial the session if there is no session running already
|
||||
@@ -299,7 +340,7 @@
|
||||
// this has to be changed, not returned here, this is the last class to close
|
||||
// return $this->error_msg;
|
||||
// close open file handles
|
||||
$this->fdebug_fp('c');
|
||||
// $this->fdebug_fp('c');
|
||||
}
|
||||
|
||||
// *************************************************************
|
||||
@@ -485,8 +526,8 @@
|
||||
$traces = debug_backtrace();
|
||||
// extended info (later)
|
||||
/*
|
||||
* $file = $trace[$level]['file'];
|
||||
* $line = $trace[$level]['line'];
|
||||
* $file = $trace[$level]['file'];
|
||||
* $line = $trace[$level]['line'];
|
||||
* $object = $trace[$level]['object'];
|
||||
* if (is_object($object)) { $object = get_class($object); }
|
||||
*
|
||||
@@ -565,34 +606,53 @@
|
||||
// $error_string = preg_replace("/(<\/?)(\w+)([^>]*>)/", "", $error_string);
|
||||
// replace special line break tag
|
||||
// $error_string = str_replace('<!--#BR#-->', "\n", $error_string);
|
||||
|
||||
// init output variable
|
||||
$output = $error_string; // output formated error string to output file
|
||||
$rpl_string = (!$this->one_file) ? '' : '_'.$level; // if request to write to one file
|
||||
$fn = ROOT.LOG.str_replace('##LEVEL##', $rpl_string, $this->print_file.$this->file_name_ext); // create output filename
|
||||
$rpl_string = (!$this->per_class) ? '' : '_'.get_class($this); // set sub class settings
|
||||
// init base file path
|
||||
$fn = ROOT.LOG.$this->log_print_file.'.'.$this->log_file_name_ext;
|
||||
|
||||
if ($this->log_per_run)
|
||||
{
|
||||
if ($GLOBALS['LOG_FILE_UNIQUE_ID'])
|
||||
$this->log_file_unique_id = $GLOBALS['LOG_FILE_UNIQUE_ID'];
|
||||
if (!$this->log_file_unique_id)
|
||||
$GLOBALS['LOG_FILE_UNIQUE_ID'] = $this->log_file_unique_id = date('Y-m-d_His').'_U_'.substr(hash('sha1', uniqid(mt_rand(), true)), 0, 8);
|
||||
$rpl_string = '_'.$this->log_file_unique_id; // add 8 char unique string
|
||||
}
|
||||
else
|
||||
{
|
||||
$rpl_string = !$this->log_print_file_date ? '' : '_'.date('Y-m-d'); // add date to file
|
||||
}
|
||||
$fn = str_replace('##DATE##', $rpl_string, $fn); // create output filename
|
||||
|
||||
$rpl_string = !$this->log_per_level ? '' : '_'.$level; // if request to write to one file
|
||||
$fn = str_replace('##LEVEL##', $rpl_string, $fn); // create output filename
|
||||
|
||||
$rpl_string = !$this->log_per_class ? '' : '_'.get_class($this); // set sub class settings
|
||||
$fn = str_replace('##CLASS##', $rpl_string, $fn); // create output filename
|
||||
$rpl_string = (!$this->per_page) ? '' : '_'.$this->get_page_name(1); // if request to write to one file
|
||||
|
||||
$rpl_string = !$this->log_per_page ? '' : '_'.$this->get_page_name(1); // if request to write to one file
|
||||
$fn = str_replace('##PAGENAME##', $rpl_string, $fn); // create output filename
|
||||
|
||||
// write to file
|
||||
// first check if max file size is is set and file is bigger
|
||||
if ($this->max_filesize > 0 && ((filesize($fn) / 1024) > $this->max_filesize))
|
||||
if ($this->log_max_filesize > 0 && ((filesize($fn) / 1024) > $this->log_max_filesize))
|
||||
{
|
||||
// for easy purpose, rename file only to attach timestamp, nur sequence numbering
|
||||
rename($fn, $fn.'.'.date("YmdHis"));
|
||||
// check list of "fn"* and see if we have alrady an extension one, if not add 00001, if yes, take this and add +1
|
||||
/* if (is_array(glob($fn."*")))
|
||||
{
|
||||
foreach (glob($fn."*") as $_filename)
|
||||
{
|
||||
if (preg_match("/\.(\d{5})$/", $_filename, $matches))
|
||||
{
|
||||
}
|
||||
}
|
||||
} */
|
||||
}
|
||||
$fp = fopen($fn, 'a');
|
||||
fwrite($fp, $output);
|
||||
fclose($fp);
|
||||
if ($fp !== false)
|
||||
{
|
||||
fwrite($fp, $output);
|
||||
fclose($fp);
|
||||
}
|
||||
else
|
||||
{
|
||||
echo "<!-- could not open file: $fn //-->";
|
||||
}
|
||||
|
||||
} // do write to file
|
||||
}
|
||||
}
|
||||
@@ -619,7 +679,7 @@
|
||||
// to use it call with set_error_handler(array("baisc", "ErrorHandler"));
|
||||
// NOTE: this will only catch any additional erros created AFTER the set_error_hanlder was set, so mostly no strict/notices from the classes are visible
|
||||
public static function ErrorHandler($type, $message, $file, $line, $context)
|
||||
{
|
||||
{
|
||||
// error levels for PHP
|
||||
// values based on 5.3
|
||||
$error_level = array (
|
||||
@@ -638,7 +698,7 @@
|
||||
4096 => 'E_RECOVERABLE_ERROR', // since 5.2
|
||||
8192 => 'E_DEPRICATED', // since 5.3
|
||||
16384 => 'E_USER_DEPRICATED', // since 5.3
|
||||
30719 => 'E_ALL' // 6143 in 5.2, 2047 in previous versions
|
||||
30719 => 'E_ALL' // 6143 in 5.2, 2047 in previous versions
|
||||
);
|
||||
|
||||
$fn = ROOT.LOG.'php_errors-'.date('Y-m-d').'.log';
|
||||
@@ -688,7 +748,7 @@
|
||||
// tries to find mailto:user@bubu.at and changes it into -> <a href="mailto:user@bubu.at">E-Mail senden</a>
|
||||
// or tries to take any url (http, ftp, etc) and transform it into a valid URL
|
||||
// the string is in the format: some url|name#css|, same for email
|
||||
public function magic_links($string, $target = "_blank")
|
||||
public function magic_links($string, $target = "_blank")
|
||||
{
|
||||
$output = $string;
|
||||
$protList = array("http", "https", "ftp", "news", "nntp");
|
||||
@@ -716,13 +776,13 @@
|
||||
// _1: URL or email
|
||||
// _2: atag (>)
|
||||
// _3: (_1) part of url or email [main url or email pre @ part]
|
||||
// _4: (_2) parameters of url or email post @ part
|
||||
// _4: (_2) parameters of url or email post @ part
|
||||
// _5: (_3) parameters of url or tld part of email
|
||||
// _7: link name/email link name
|
||||
// _9: style sheet class
|
||||
$self = $this;
|
||||
// $this->debug('URL', 'Before: '.$output);
|
||||
$output = preg_replace_callback("/(href=\")?(\>)?\b($protRegex)([\w\.\-?&=+%#~,;\/]+)\b([\.\-?&=+%#~,;\/]*)(\|([^\||^#]+)(#([^\|]+))?\|)?/",
|
||||
$output = preg_replace_callback("/(href=\")?(\>)?\b($protRegex)([\w\.\-?&=+%#~,;\/]+)\b([\.\-?&=+%#~,;\/]*)(\|([^\||^#]+)(#([^\|]+))?\|)?/",
|
||||
function ($matches) use ($self)
|
||||
{
|
||||
return @$self->create_url($matches[1], $matches[2], $matches[3], $matches[4], $matches[5], $matches[7], $matches[9]);
|
||||
@@ -730,17 +790,17 @@
|
||||
$output
|
||||
);
|
||||
// find email-addresses, but not mailto prefix ones
|
||||
$output = preg_replace_callback("/(mailto:)?(\>)?\b([\w\.-]+)@([\w\.\-]+)\.([a-zA-Z]{2,4})\b(\|([^\||^#]+)(#([^\|]+))?\|)?/",
|
||||
$output = preg_replace_callback("/(mailto:)?(\>)?\b([\w\.-]+)@([\w\.\-]+)\.([a-zA-Z]{2,4})\b(\|([^\||^#]+)(#([^\|]+))?\|)?/",
|
||||
function ($matches) use ($self)
|
||||
{
|
||||
return @$self->create_email($matches[1], $matches[2], $matches[3], $matches[4], $matches[5], $matches[7], $matches[9]);
|
||||
},
|
||||
},
|
||||
$output
|
||||
);
|
||||
|
||||
$this->debug('URL', 'After: '.$output);
|
||||
// // we have one slashes after the Protocol -> internal link no domain, strip out the proto
|
||||
// $output = preg_replace("/($protRegex)\/(.*)/e", "\\2", $ouput);
|
||||
// $output = preg_replace("/($protRegex)\/(.*)/e", "\\2", $ouput);
|
||||
// $this->debug('URL', "$output");
|
||||
|
||||
// post processing
|
||||
@@ -753,7 +813,7 @@
|
||||
}
|
||||
|
||||
// METHOD create_url [INTERNAL]
|
||||
// PARAMS url link, anchor tag (define both type or url),
|
||||
// PARAMS url link, anchor tag (define both type or url),
|
||||
// _1, _2, _3 = part of thel URL, if atag is set, _1 is not used
|
||||
// target: link target, name: name for the url, if not given _2 + _3 is used
|
||||
// class: style sheet
|
||||
@@ -768,7 +828,7 @@
|
||||
if (preg_match("/\/\/$/", $_1) && preg_match("/^\//", $_2))
|
||||
{
|
||||
$_1 = '';
|
||||
$target = '';
|
||||
$target = '';
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -898,7 +958,7 @@
|
||||
// haystack (search in)
|
||||
// key: the key to look for in
|
||||
// path: recursive call for previous path
|
||||
// RETURN all array elements paths where the element was found
|
||||
// RETURN all array elements paths where the element was found
|
||||
// DESCRIPTION
|
||||
// recursive array search function, which returns all found not only the first one
|
||||
public static function array_search_recursive_all($needle, $haystack, $key, $path = NULL)
|
||||
@@ -948,20 +1008,20 @@
|
||||
// DESCRIPTION
|
||||
// array search simple. looks for key, value combination, if found, returns true
|
||||
public static function array_search_simple($array, $key, $value)
|
||||
{
|
||||
{
|
||||
if (!is_array($array))
|
||||
$array = array ();
|
||||
foreach ($array as $_key => $_value)
|
||||
{
|
||||
{
|
||||
// if value is an array, we search
|
||||
if (is_array($_value))
|
||||
{
|
||||
{
|
||||
// call recursive, and return result if it is true, else continue
|
||||
if (($result = basic::array_search_simple($_value, $key, $value)) !== false)
|
||||
return $result;
|
||||
}
|
||||
elseif ($_key == $key && $_value = $value)
|
||||
{
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1004,17 +1064,17 @@
|
||||
}
|
||||
|
||||
// METHOD: ByteStringFormat
|
||||
// PARAMS: int
|
||||
// PARAMS: int bytes, boolean for space, default is set
|
||||
// RETURN: string
|
||||
// DESC: converts bytes into formated string with KB, MB, etc
|
||||
public static function ByteStringFormat($number)
|
||||
public static function ByteStringFormat($number, $space = true)
|
||||
{
|
||||
if (is_numeric($number) && $number > 0)
|
||||
{
|
||||
// labels in order of size
|
||||
$labels = array('B', 'KB', 'MB', 'GB', 'TB');
|
||||
// calc file size, round down too two digits, add label based max change
|
||||
return round($number / pow(1024, ($i = floor(log($number, 1024)))), 2).''.$labels[$i];
|
||||
return round($number / pow(1024, ($i = floor(log($number, 1024)))), 2).($space ? ' ' : '').$labels[$i];
|
||||
}
|
||||
return $number;
|
||||
}
|
||||
@@ -1036,6 +1096,20 @@
|
||||
return $number;
|
||||
}
|
||||
|
||||
// METHOD: DateStringFormat
|
||||
// PARAMS: unix timestamp, true/false to show microtime
|
||||
// RETURN: string formated date+time in Y-M-D h:m:s
|
||||
// DESC : a simple wrapper for the date format
|
||||
public static function DateStringFormat($timestamp, $show_micro = true)
|
||||
{
|
||||
list ($timestamp, $ms) = explode('.', round($timestamp, 4));
|
||||
if ($show_micro)
|
||||
$string = date("Y-m-d H:i:s", $timestamp).' '.$ms.'ms';
|
||||
else
|
||||
$string = date("Y-m-d H:i:s", $timestamp);
|
||||
return $string;
|
||||
}
|
||||
|
||||
// METHOD: TimeStringFormat
|
||||
// PARAMS: seconds
|
||||
// RETURN: formated time string
|
||||
@@ -1165,8 +1239,8 @@
|
||||
return FALSE;
|
||||
|
||||
// splits the data up with / or -
|
||||
list ($start_year, $start_month, $start_day) = split('[/-]', $start_date);
|
||||
list ($end_year, $end_month, $end_day) = split('[/-]', $end_date);
|
||||
list ($start_year, $start_month, $start_day) = preg_split('/[\/-]/', $start_date);
|
||||
list ($end_year, $end_month, $end_day) = preg_split('/[\/-]/', $end_date);
|
||||
// check that month & day are two digits and then combine
|
||||
foreach (array('start', 'end') as $prefix)
|
||||
{
|
||||
@@ -1212,9 +1286,10 @@
|
||||
// dummy -> empty, or file_type to show an icon instead of nothing if file is not found
|
||||
// path -> if source start is not ROOT path, if empty ROOT is choosen
|
||||
// cache -> cache path, if not given TMP is used
|
||||
// clear cache -> if set to true, will create thumb all the tame
|
||||
// RETURN: thumbnail name
|
||||
// DESC: converts picture to a thumbnail with max x and max y size
|
||||
public static function CreateThumbnail($pic, $size_x, $size_y, $dummy = "", $path = "", $cache_source = "")
|
||||
public static function CreateThumbnail($pic, $size_x, $size_y, $dummy = "", $path = "", $cache_source = "", $clear_cache = false)
|
||||
{
|
||||
// get image type flags
|
||||
$image_types = array (
|
||||
@@ -1241,20 +1316,46 @@
|
||||
$tmp = explode('/', $pic);
|
||||
$pic = $tmp[(count($tmp) - 1)];
|
||||
}
|
||||
// echo "[$pic] IN: $filename - ".strstr($pic, '/')." || ".file_exists($filename)." && ".is_file($filename)."<br>";
|
||||
// does this picture exist and is it a picture
|
||||
if (file_exists($filename) && is_file($filename))
|
||||
{
|
||||
list($width, $height, $type) = getimagesize($filename);
|
||||
$convert_prefix = '';
|
||||
$create_file = false;
|
||||
// check if we can skip the PDF creation: if we have size, if do not have type, we assume type png
|
||||
if (!$type && is_numeric($size_x) && is_numeric($size_y))
|
||||
{
|
||||
$check_thumb = $tmp_src.'thumb_'.$pic.'_'.$size_x.'x'.$size_y.'.'.$image_types[3];
|
||||
if (!is_file($check_thumb))
|
||||
$create_file = true;
|
||||
else
|
||||
$type = 3;
|
||||
}
|
||||
// if type is not in the list, but returns as PDF, we need to convert to JPEG before
|
||||
if (!$type)
|
||||
{
|
||||
// is this a PDF, if no, return from here with nothing
|
||||
$convert_prefix = 'png:';
|
||||
# TEMP convert to PNG, we then override the file name
|
||||
$convert_string = CONVERT.' '.$filename.' '.$convert_prefix.$filename.'_TEMP';
|
||||
$status = exec($convert_string, $output, $return);
|
||||
$filename .= '_TEMP';
|
||||
// for delete, in case we need to glob
|
||||
$delete_filename = $filename;
|
||||
// find file, if we can't find base name, use -0 as the first one (ignore other pages in multiple ones)
|
||||
if (!is_file($filename))
|
||||
$filename .= '-0';
|
||||
list($width, $height, $type) = getimagesize($filename);
|
||||
}
|
||||
// if no size given, set size to original
|
||||
if (!$size_x)
|
||||
if (!$size_x || $size_x < 1 || !is_numeric($size_x))
|
||||
$size_x = $width;
|
||||
if (!$size_y)
|
||||
if (!$size_y || $size_y < 1 || !is_numeric($size_y))
|
||||
$size_y = $height;
|
||||
$thumb = 'thumb_'.$pic.'_'.$size_x.'x'.$size_y.'.'.$image_types[$type];
|
||||
$thumbnail = $tmp_src.$thumb;
|
||||
// check if we already have this picture converted
|
||||
if (!is_file($thumbnail))
|
||||
if (!is_file($thumbnail) || $clear_cache == true)
|
||||
{
|
||||
// convert the picture
|
||||
if ($width > $size_x)
|
||||
@@ -1271,11 +1372,16 @@
|
||||
$status = exec($convert_string, $output, $return);
|
||||
}
|
||||
}
|
||||
if (!file_exists($thumbnail))
|
||||
if (!is_file($thumbnail))
|
||||
{
|
||||
copy($filename, $thumbnail);
|
||||
}
|
||||
$return_data = $thumb;
|
||||
// if we have a delete filename, delete here with glob
|
||||
if ($delete_filename)
|
||||
{
|
||||
array_map('unlink', glob($delete_filename.'*'));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1386,13 +1492,28 @@
|
||||
}
|
||||
|
||||
// METHOD: _sha1_short
|
||||
// PARAMS: string
|
||||
// PARAMS: string, flag to use sha
|
||||
// RETURN: sha1 short (9 chars), but current calls _crc32b
|
||||
// DESC : replacement for _crc32b call
|
||||
public function _sha1_short($string)
|
||||
public function _sha1_short($string, $use_sha = false)
|
||||
{
|
||||
// return substr(hash('sha1', $string), 0, 9);
|
||||
return $this->_crc32b($string);
|
||||
if ($use_sha)
|
||||
return substr(hash('sha1', $string), 0, 9);
|
||||
else
|
||||
return $this->_crc32b($string);
|
||||
}
|
||||
|
||||
// METHOD: _hash
|
||||
// PARAMS: string, type of hash to use
|
||||
// RETURN: hashed string
|
||||
// DESC : replacemend for _crc32b call (alternate)
|
||||
// defaults to adler 32, fnv132, fnv1a32, joaat
|
||||
// all that create 8 char long hashes
|
||||
public function _hash($string, $hash_type = 'adler32')
|
||||
{
|
||||
if (!in_array($hash_type, array('adler32', 'fnv132', 'fnv1a32', 'joaat')))
|
||||
$hash_type = 'adler32';
|
||||
return hash($hash_type, $string);
|
||||
}
|
||||
|
||||
// METHOD: checkPHPVersion
|
||||
@@ -1497,7 +1618,7 @@
|
||||
// RETURN: random string
|
||||
// DESC: creates a random string from alphanumeric characters: A-Z a-z 0-9 ./
|
||||
private function cryptSaltString($nSize = 22)
|
||||
{
|
||||
{
|
||||
// A-Z is 65,90
|
||||
// a-z is 97,122
|
||||
// 0-9 is 48,57
|
||||
@@ -1506,7 +1627,7 @@
|
||||
$max = array (57, 90, 122);
|
||||
$chars = array ();
|
||||
for ($i = 0; $i < count($min); $i ++)
|
||||
{
|
||||
{
|
||||
for ($j = $min[$i]; $j <= $max[$i]; $j ++)
|
||||
{
|
||||
$chars[] = chr($j);
|
||||
@@ -1516,9 +1637,9 @@
|
||||
$max_rand = count($chars) - 1;
|
||||
// create the salt part
|
||||
for ($i = 1; $i <= $nSize; $i ++)
|
||||
{
|
||||
{
|
||||
$salt_string .= $chars[mt_rand(0, $max_rand)];
|
||||
}
|
||||
}
|
||||
return $salt_string;
|
||||
}
|
||||
|
||||
@@ -1685,12 +1806,12 @@
|
||||
$L = round((($MAX + $MIN) / 2) * 100);
|
||||
|
||||
if ($MIN == $MAX)
|
||||
{
|
||||
{
|
||||
// H, S, L
|
||||
return array(0, 0, $L);
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
// HUE to 0~360
|
||||
if ($r == $MAX)
|
||||
$HUE = ($g - $b) / ($MAX - $MIN);
|
||||
@@ -1723,11 +1844,11 @@
|
||||
return array($l * 255, $l * 255, $l * 255);
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
$m2 = ($l < 0.5) ? $l * ($s + 1) : ($l + $s) - ($l * $s);
|
||||
$m1 = $l * 2 - $m2;
|
||||
$hue = function ($base) use ($m1, $m2)
|
||||
{
|
||||
{
|
||||
// base = hue, hue > 360 (1) - 360 (1), else < 0 + 360 (1)
|
||||
$base = ($base < 0) ? $base + 1 : (($base > 1) ? $base - 1 : $base);
|
||||
// 6: 60, 2: 180, 3: 240
|
||||
@@ -1790,22 +1911,40 @@
|
||||
}
|
||||
|
||||
// METHOD: getEmailType
|
||||
// PARAMS: email
|
||||
// PARAMS: email, short == false
|
||||
// RETURN: string for email type, eg "pc", "docomo", etc
|
||||
// DESC: guesses the email type (mostly for mobile) from the domain
|
||||
public function getEmailType($email)
|
||||
{
|
||||
// if second is set to true, it will return short naming scheme (only provider)
|
||||
public function getEmailType($email, $short = false)
|
||||
{
|
||||
// trip if there is no email address
|
||||
if (!$email)
|
||||
return "invalid";
|
||||
// loop until we match a mobile type, return this first found type
|
||||
foreach ($this->mobile_email_type as $email_regex => $email_type)
|
||||
{
|
||||
{
|
||||
if (preg_match("/$email_regex/", $email))
|
||||
return $email_type;
|
||||
{
|
||||
if ($short)
|
||||
return $this->getShortEmailType($email_type);
|
||||
else
|
||||
return $email_type;
|
||||
}
|
||||
}
|
||||
// if no previous return we assume this is a pc address
|
||||
return "pc";
|
||||
if ($short)
|
||||
return "pc";
|
||||
else
|
||||
return "pc_html";
|
||||
}
|
||||
|
||||
// METHOD: getShortEmailType
|
||||
// PARAMS: long email type (not email)
|
||||
// RETURN: short email type
|
||||
// DESC : gets the short email type from a long email type
|
||||
public function getShortEmailType($email_type)
|
||||
{
|
||||
return $this->mobile_email_type_short[$email_type];
|
||||
}
|
||||
|
||||
// METHOD: printDateTime
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
* PUBLIC VARIABLES
|
||||
*
|
||||
* PRIVATE VARIABLES
|
||||
*
|
||||
*
|
||||
* PUBLIC METHODS
|
||||
*
|
||||
* PRIVATE METHODS
|
||||
@@ -38,7 +38,8 @@
|
||||
// as it actually has nothing to do with this one here ? (or at least
|
||||
// put into separete function in this class)
|
||||
|
||||
require_once(LIBS."Class.DB.IO.inc");
|
||||
// try to include file from LIBS path, or from normal path
|
||||
_spl_autoload('Class.DB.IO.inc');
|
||||
|
||||
// subclass for one array handling
|
||||
class db_array_io extends db_io
|
||||
@@ -122,14 +123,14 @@
|
||||
$text = str_replace('>', '>', $text);
|
||||
$text = str_replace('&', '&', $text);
|
||||
$text = str_replace('"', '"', $text);
|
||||
$text = str_replace(''', "'", $text);
|
||||
$text = str_replace(''', "'", $text);
|
||||
return $text;
|
||||
}
|
||||
|
||||
// METHOD db_dump_array
|
||||
// PARAMS none
|
||||
// RETURN returns the current array
|
||||
// DESC dumps the current data
|
||||
// DESC dumps the current data
|
||||
public function db_dump_array($write = 0)
|
||||
{
|
||||
reset($this->table_array);
|
||||
@@ -219,11 +220,11 @@
|
||||
if (file_exists($this->table_array[$column]["path"].$dateiname))
|
||||
unlink($this->table_array[$column]["path"].$dateiname);
|
||||
}
|
||||
|
||||
|
||||
if ($this->table_array[$column]["fk"])
|
||||
{
|
||||
// zusammenstellen der FKs
|
||||
if ($q_where)
|
||||
if ($q_where)
|
||||
$q_where .= " AND ";
|
||||
$q_where .= $column." = ".$this->table_array[$column]["value"];
|
||||
}
|
||||
@@ -234,13 +235,13 @@
|
||||
// attach fk row if there ...
|
||||
if ($q_where)
|
||||
$q .= " AND ".$q_where;
|
||||
// if 0, error
|
||||
// if 0, error
|
||||
unset ($this->pk_id);
|
||||
if (!$this->db_exec($q))
|
||||
{
|
||||
$this->error_id=22;
|
||||
$this->_db_error();
|
||||
}
|
||||
}
|
||||
return $this->table_array;
|
||||
}
|
||||
|
||||
@@ -256,11 +257,11 @@
|
||||
if (!$this->db_check_pk_set())
|
||||
return $this->table_array;
|
||||
reset($this->table_array);
|
||||
// create select part & addition FK part
|
||||
// create select part & addition FK part
|
||||
while (list($column, $data_array)=each($this->table_array))
|
||||
{
|
||||
if ($q_select)
|
||||
$q_select .= ", ";
|
||||
if ($q_select)
|
||||
$q_select .= ", ";
|
||||
$q_select .= $column;
|
||||
|
||||
// check FK ...
|
||||
@@ -271,7 +272,7 @@
|
||||
$q_where .= $column .= " = ".$this->table_array[$column]["value"];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$q = "SELECT ";
|
||||
$q .= $q_select;
|
||||
$q .= " FROM ".$this->table_name." WHERE ";
|
||||
@@ -283,7 +284,7 @@
|
||||
if ($this->db_exec($q))
|
||||
{
|
||||
if ($res = $this->db_fetch_array())
|
||||
{
|
||||
{
|
||||
reset($this->table_array);
|
||||
while (list($column, $data_array) = each($this->table_array))
|
||||
{
|
||||
@@ -325,7 +326,7 @@
|
||||
{
|
||||
if (is_array($table_array))
|
||||
$this->table_array = $table_array;
|
||||
// PK ID check
|
||||
// PK ID check
|
||||
// if ($this->pk_id && !$this->table_array[$this->pk_name]["value"])
|
||||
// $this->table_array[$this->pk_name]["value"]=$this->pk_id;
|
||||
// checken ob PKs gesetzt, wenn alle -> update, wenn keiner -> insert, wenn ein paar -> ERROR!
|
||||
@@ -350,7 +351,7 @@
|
||||
unset($this->table_array[$column]["delete"]);
|
||||
if (file_exists($this->table_array[$column]["path"].$this->table_array[$column]["value"]))
|
||||
unlink($this->table_array[$column]["path"].$this->table_array[$column]["value"]);
|
||||
$dateiname = str_replace("_tn", "", $this->table_array[$column]["value"]);
|
||||
$dateiname = str_replace("_tn", "", $this->table_array[$column]["value"]);
|
||||
if (file_exists($this->table_array[$column]["path"].$dateiname))
|
||||
unlink($this->table_array[$column]["path"].$dateiname);
|
||||
$this->table_array[$column]["value"] = "";
|
||||
@@ -375,7 +376,7 @@
|
||||
copy($this->table_array[$column]["tmp"], $this->table_array[$column]["path"].$dateiname);
|
||||
// automatisch thumbnail generieren, geht nur mit convert (ImageMagic!!!), aber nur bei bild ..
|
||||
if (strtolower($ext) == "jpeg" || strtolower($ext) == "jpg" || strtolower($ext) == "gif" || strtolower($ext) == "png")
|
||||
{
|
||||
{
|
||||
$dateiname_tn = $name.$pk_ids_file."_tn.".$ext;
|
||||
$eingang = $this->table_array[$column]["path"].$dateiname;
|
||||
$ausgang = $this->table_array[$column]["path"].$dateiname_tn;
|
||||
@@ -402,7 +403,7 @@
|
||||
$this->table_array[$column]["value"] = $this->table_array[$column]["HIDDEN_value"];
|
||||
if (!$insert)
|
||||
{
|
||||
if (strlen($q_data))
|
||||
if (strlen($q_data))
|
||||
$q_data .= ", ";
|
||||
$q_data .= $column." = ";
|
||||
}
|
||||
@@ -428,6 +429,13 @@ $this->debug('write_check', "[$column][".$this->table_array[$column]["value"]."]
|
||||
$_value = $this->table_array[$column]["value"];
|
||||
$q_data .= $_value;
|
||||
}
|
||||
elseif ($this->table_array[$column]["interval"])
|
||||
{
|
||||
// for interval we check if no value, then we set null
|
||||
if (!$this->table_array[$column]["value"])
|
||||
$_value = 'NULL';
|
||||
$q_data .= $_value;
|
||||
}
|
||||
else
|
||||
// normal string
|
||||
{
|
||||
@@ -436,7 +444,7 @@ $this->debug('write_check', "[$column][".$this->table_array[$column]["value"]."]
|
||||
if ($addslashes)
|
||||
$q_data .= $this->db_escape_string($this->convert_entities($this->table_array[$column]["value"]));
|
||||
else
|
||||
$q_data .= addslashes($this->table_array[$column]["value"]);
|
||||
$q_data .= $this->db_escape_string($this->table_array[$column]["value"]);
|
||||
$q_data .= "'";
|
||||
}
|
||||
}
|
||||
@@ -445,7 +453,7 @@ $this->debug('write_check', "[$column][".$this->table_array[$column]["value"]."]
|
||||
// NOW get PK, and FK settings (FK only for update query)
|
||||
// get it at the end, cause now we can be more sure of no double IDs, etc
|
||||
reset($this->table_array);
|
||||
// create select part & addition FK part
|
||||
// create select part & addition FK part
|
||||
while (list($column, $data_array) = each($this->table_array))
|
||||
{
|
||||
// check FK ...
|
||||
@@ -483,7 +491,7 @@ $this->debug('write_check', "[$column][".$this->table_array[$column]["value"]."]
|
||||
{
|
||||
$q = "INSERT INTO ".$this->table_name." ";
|
||||
$q .= "(".$q_vars.") ";
|
||||
$q .= "VALUES (".$q_data.")";
|
||||
$q .= "VALUES (".$q_data.")";
|
||||
// write primary key too
|
||||
/* if ($q_data)
|
||||
$q .= ", ";
|
||||
@@ -496,12 +504,15 @@ $this->debug('write_check', "[$column][".$this->table_array[$column]["value"]."]
|
||||
{
|
||||
$this->error_id = 22;
|
||||
$this->_db_error();
|
||||
}
|
||||
}
|
||||
// set primary key
|
||||
if ($insert)
|
||||
$this->ok = $this->table_array[$this->pk_name]["value"] = $this->insert_id;
|
||||
{
|
||||
$this->table_array[$this->pk_name]["value"] = $this->insert_id;
|
||||
$this->ok = $this->insert_id;
|
||||
}
|
||||
// return the table if needed
|
||||
return $this->table_array;
|
||||
}
|
||||
}
|
||||
} // end of class
|
||||
?>
|
||||
|
||||
@@ -7,13 +7,13 @@
|
||||
* but let me know if u made changes, and please don't redistribute it
|
||||
* with your name on it ...
|
||||
* SHORT DESCRIPTON:
|
||||
* 2013/10/10, prepare/excute were added, including auto RETURNING primary key if
|
||||
* possible for any INSERT query in exec or prepare/execute, better debugging and
|
||||
* data dumping. Proper string escape wrapper, special db exec writer for complex
|
||||
* 2013/10/10, prepare/excute were added, including auto RETURNING primary key if
|
||||
* possible for any INSERT query in exec or prepare/execute, better debugging and
|
||||
* data dumping. Proper string escape wrapper, special db exec writer for complex
|
||||
* array inserts in auto calls. boolean converter from postresql to php
|
||||
*
|
||||
* 2003/12/08, one major change: renamed db_exec_ext to db_return, as it has not
|
||||
* much in common with the normal db_exec wrapper, as it was written only for
|
||||
* 2003/12/08, one major change: renamed db_exec_ext to db_return, as it has not
|
||||
* much in common with the normal db_exec wrapper, as it was written only for
|
||||
* SELECT statements and better handling of those.
|
||||
*
|
||||
* 2002/12/20, extended the "simple" functionality to what I wanted
|
||||
@@ -118,7 +118,7 @@
|
||||
* $mixed db_return_row($query)
|
||||
* - gibt die erste Zeile zurück (als array)
|
||||
* $array_of_hashes db_return_array($query)
|
||||
* - return an array of hashes with all data
|
||||
* - return an array of hashes with all data
|
||||
* db_close()
|
||||
* - closes db connection and writes error_msg to global error_msg
|
||||
* db_cursor_pos($query)
|
||||
@@ -181,7 +181,7 @@
|
||||
* 2004/07/15 (cs) changed the deconstructor to call _basic deconstructor
|
||||
* 2003-06-20: added a '3' flag to db_return so NO caching is done at all (if array might get too big)
|
||||
* 2003-06-19: made the error messages in DEBUG output red so they are better to see
|
||||
* 2003-06-09: never started class_basic, insert this, for mobile phone detection
|
||||
* 2003-06-09: never started class_basic, insert this, for mobile phone detection
|
||||
* 2003-04-10: moved the error handling out of the db_pgsql.inc back to db_io class
|
||||
* 2003-04-09: major change as db_io does not hold any DB specific calls anymore,
|
||||
* those are loaded dynamically during class start, from a include
|
||||
@@ -193,14 +193,14 @@
|
||||
* changed the "shape" of class info vars to fit into extend modell
|
||||
* 2003-02-13: in db_exec the setting for the last insert id was still via the function,
|
||||
* changed this to call the internal PHP mysql command.
|
||||
* 2003-01-28: ugly bug within creating the field_names. The array was not reseted
|
||||
* 2003-01-28: ugly bug within creating the field_names. The array was not reseted
|
||||
* before, and so the field for the db_exec where not correct.
|
||||
* 2003-01-16: fixed a "select" check in db_exec,
|
||||
* added a privet method for checking query of INSERT, UPDATE, DELETE
|
||||
* 2003-01-09: code cleanups and more inline documentation
|
||||
* 2003-01-08: renamed db_exec_ext to db_return for obious reasons
|
||||
* added a "check for select query" for all db_return* methods
|
||||
* 2003-01-08: db_return gets another functionality: if u use 1 or 2 as reset value,
|
||||
* 2003-01-08: db_return gets another functionality: if u use 1 or 2 as reset value,
|
||||
* the cursor will be reset BEFORE the read and no chaced data will be read.
|
||||
* if you use 2, the md5 array will be kept so next read with no flag is cached,
|
||||
* wheres with 1, the data gets DESTROYED at the end of the read
|
||||
@@ -210,9 +210,9 @@
|
||||
* 2003-01-07: fixed a small bug in return_array as he mixed up the order if you used
|
||||
* SELECT * FROM ...
|
||||
* 2002-12-26: changed strstr to stristr 'couse not everyone types SELECT, etc in capitals
|
||||
* 2002-12-24: moved the debug output in db_return to the call if,
|
||||
* 2002-12-24: moved the debug output in db_return to the call if,
|
||||
* so it is only printed once
|
||||
* 2002-12-20: added db_dump_data function for printing out all data in
|
||||
* 2002-12-20: added db_dump_data function for printing out all data in
|
||||
* cursor_ext (or from one query in it)
|
||||
* 2002-12-20: testing and implemtenting of session storing the class (not fully tested!)
|
||||
* documenting all the functions and some code cleenup
|
||||
@@ -222,7 +222,7 @@
|
||||
* more complex (array based IO fkts) moved into a seperate file
|
||||
* 2002-12-16: further reconstruction ...
|
||||
* 2002-12-10: further improvment in changing db_mysql to a class
|
||||
* 2002-10-18: renamed lesen to db_read, speichern to db_save and
|
||||
* 2002-10-18: renamed lesen to db_read, speichern to db_save and
|
||||
* loeschen to db_delete
|
||||
* 19.08.2002: 1 convertiert < > " & ĵ in original
|
||||
* HTML zeichen zurück (für htmlspecialcharsfct)
|
||||
@@ -230,7 +230,7 @@
|
||||
* addslashes (1=ja,0=nein/default)
|
||||
* 04.04.2002: FK added to lesen()
|
||||
* 10.07.2001: simple return row function geschrieben
|
||||
* 03.07.2001: kein Thumbnail erzeugen wenn Datei nicht:
|
||||
* 03.07.2001: kein Thumbnail erzeugen wenn Datei nicht:
|
||||
* JPG/JPEG/GIF/PNG als Endung hat
|
||||
* 22.06.2001: Mozilla Fix für File upload
|
||||
* 10.05.2001: alle fkt haben "db_" als pre zur identifizierung
|
||||
@@ -240,7 +240,8 @@
|
||||
* 23.11.2000: erster Test
|
||||
*********************************************************************/
|
||||
|
||||
require_once(LIBS.'Class.Basic.inc');
|
||||
// try to include file from LIBS path, or from normal path
|
||||
_spl_autoload('Class.Basic.inc');
|
||||
|
||||
class db_io extends basic
|
||||
{
|
||||
@@ -252,7 +253,7 @@
|
||||
// only inside
|
||||
// basic vars
|
||||
private $dbh; // the dbh handler
|
||||
private $db_debug; // DB_DEBUG ... (if set prints out debug msgs)
|
||||
public $db_debug; // DB_DEBUG ... (if set prints out debug msgs)
|
||||
private $db_name; // the DB connected to
|
||||
private $db_user; // the username used
|
||||
private $db_pwd; // the password used
|
||||
@@ -265,12 +266,13 @@
|
||||
// FOR BELOW: (This should be private and only readable through some method)
|
||||
// cursor array for cached readings
|
||||
public $cursor_ext; // hash of hashes
|
||||
// per query vars
|
||||
// per query vars
|
||||
public $cursor; // actual cursor (DBH)
|
||||
public $num_rows; // how many rows have been found
|
||||
public $num_fields; // how many fields has the query
|
||||
public $field_names; // array with the field names of the current query
|
||||
public $insert_id; // last inserted ID
|
||||
public $insert_id; // last inserted ID
|
||||
public $insert_id_ext; // extended insert ID (for data outside only primary key)
|
||||
// other vars
|
||||
private $nbsp = ''; // used by print_array recursion function
|
||||
// error & warning id
|
||||
@@ -330,7 +332,7 @@
|
||||
$this->error_string['14'] = 'Can\'t connect to DB server';
|
||||
$this->error_string['15'] = 'Can\'t select DB';
|
||||
$this->error_string['16'] = 'No DB Handler found / connect or reconnect failed';
|
||||
$this->error_string['17'] = 'all db_return* methods work only with SELECT statements, please use db_exec for everything else';
|
||||
$this->error_string['17'] = 'All db_return* methods work only with SELECT statements, please use db_exec for everything else';
|
||||
$this->error_string['18'] = 'Query not found in cache. Nothing has been reset';
|
||||
$this->error_string['19'] = 'Wrong PK name given or no PK name given at all, can\'t get Insert ID';
|
||||
$this->error_string['20'] = 'Found given Prepare Statement Name in array, Query not prepared, will use existing one';
|
||||
@@ -341,6 +343,8 @@
|
||||
$this->error_string['25'] = 'Prepare query data is not in array format.';
|
||||
$this->error_string['30'] = 'Query call in a possible endless loop. Was called more than '.$this->MAX_QUERY_CALL.' times';
|
||||
$this->error_string['31'] = 'Could not fetch PK after query insert';
|
||||
$this->error_string['32'] = 'Multiple PK return as array';
|
||||
$this->error_string['33'] = 'Returning PK was not found';
|
||||
$this->error_string['40'] = 'Query async call failed.';
|
||||
$this->error_string['41'] = 'Connection is busy with a different query. Cannot execute.';
|
||||
$this->error_string['42'] = 'Cannot check for async query, none has been started yet.';
|
||||
@@ -352,7 +356,7 @@
|
||||
$this->db_debug = $GLOBALS['DB_DEBUG'];
|
||||
|
||||
// includes sub class for db type
|
||||
include_once(LIBS.$this->db_type.'.inc');
|
||||
_spl_autoload($this->db_type.'.inc');
|
||||
$this->db_functions = new $this->db_type();
|
||||
|
||||
// connect to DB
|
||||
@@ -390,10 +394,10 @@
|
||||
// RETURN: true on successfull connect, false if failed
|
||||
// DESC:
|
||||
// internal connection function. Used to connect to the DB if there is no connection done yet.
|
||||
// Called before any execute
|
||||
// Called before any execute
|
||||
private function _connect_to_db()
|
||||
{
|
||||
// generate connect string
|
||||
// generate connect string
|
||||
$this->dbh = $this->db_functions->_db_connect($this->db_host, $this->db_user, $this->db_pwd, $this->db_name, $this->db_port, $this->db_ssl);
|
||||
// if no dbh here, we couldn't connect to the DB itself
|
||||
if (!$this->dbh)
|
||||
@@ -409,7 +413,7 @@
|
||||
$this->error_id = 15;
|
||||
$this->_db_error();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// set search path if needed
|
||||
if ($this->db_schema)
|
||||
{
|
||||
@@ -510,19 +514,20 @@
|
||||
if ($id)
|
||||
$prefix .= '[<span style="color: #920069;">'.$id.'</span>] ';
|
||||
if ($type)
|
||||
$prefix .= '{<span style="font-style: italic; color: #3f0092;">'.$type.'</span>} ';
|
||||
$prefix .= '{<span style="font-style: italic; color: #3f0092;">'.$type.'</span>} ';
|
||||
if ($prefix)
|
||||
$prefix .= '- ';
|
||||
$this->debug($debug_id, $prefix.$error_string, true);
|
||||
}
|
||||
|
||||
// METHOD _db_error
|
||||
// PARAMS cursor -> current cursor for pg_result_error, mysql uses dbh, pg_last_error too,
|
||||
// PARAMS cursor -> current cursor for pg_result_error, mysql uses dbh, pg_last_error too,
|
||||
// but pg_result_error is more accurate
|
||||
// msg -> optional message
|
||||
// RETURN none
|
||||
// DESC if error_id set, writes long error string into error_msg
|
||||
private function _db_error($cursor = '', $msg = '')
|
||||
// MARK: needed to make public so it can be called from DB.Array.IO too
|
||||
public function _db_error($cursor = '', $msg = '')
|
||||
{
|
||||
$where_called = $this->get_caller_method();
|
||||
if ($cursor)
|
||||
@@ -591,7 +596,7 @@
|
||||
// METHOD _db_return_table
|
||||
// PARAMS insert/select/update/delete query
|
||||
// RETURN array with schema and table
|
||||
// DESC extracts schema and table from the query, if no schema returns just empty string
|
||||
// DESC extracts schema and table from the query, if no schema returns just empty string
|
||||
private function _db_return_table($query)
|
||||
{
|
||||
if (preg_match("/^SELECT /i", $query))
|
||||
@@ -646,9 +651,9 @@
|
||||
if ($this->_check_query_for_insert($this->query, true))
|
||||
{
|
||||
$this->pk_name = $pk_name;
|
||||
if ($pk_name != 'NULL')
|
||||
if ($this->pk_name != 'NULL')
|
||||
{
|
||||
if (!$pk_name)
|
||||
if (!$this->pk_name)
|
||||
{
|
||||
// TODO: get primary key from table name
|
||||
list($schema, $table) = $this->_db_return_table($this->query);
|
||||
@@ -656,7 +661,7 @@
|
||||
{
|
||||
$this->pk_name_table[$table] = $this->db_functions->_db_primary_key($table, $schema);
|
||||
}
|
||||
$pk_name = $this->pk_name_table[$table];
|
||||
$this->pk_name = $this->pk_name_table[$table];
|
||||
}
|
||||
if (!preg_match("/ returning /i", $this->query) && $this->pk_name)
|
||||
{
|
||||
@@ -665,11 +670,12 @@
|
||||
}
|
||||
elseif (preg_match("/ returning (.*)/i", $this->query, $matches) && $this->pk_name)
|
||||
{
|
||||
// add the primary key if it is not in the returning set
|
||||
if (!preg_match("/$this->pk_name/", $matches[1]))
|
||||
{
|
||||
$this->query .= " , ".$this->pk_name;
|
||||
$this->returning_id = true;
|
||||
}
|
||||
$this->returning_id = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -739,16 +745,55 @@
|
||||
if ($this->_check_query_for_insert($this->query, true) && $this->pk_name != 'NULL')
|
||||
{
|
||||
// set insert_id
|
||||
// if we do not have a returning, we try to get it via the primary key and another select
|
||||
if (!$this->returning_id)
|
||||
{
|
||||
$this->insert_id = $this->db_functions->_db_insert_id($this->query, $this->pk_name);
|
||||
}
|
||||
else
|
||||
$this->insert_id = $this->db_functions->_db_fetch_array($this->cursor)[$this->pk_name];
|
||||
// this error handling is only for pgsql
|
||||
{
|
||||
$this->insert_id = array ();
|
||||
$this->insert_id_ext = array ();
|
||||
// echo "** PREPARE RETURNING FOR CURSOR: ".$this->cursor."<br>";
|
||||
// we have returning, now we need to check if we get one or many returned
|
||||
// we'll need to loop this, if we have multiple insert_id returns
|
||||
while ($_insert_id = $this->db_functions->_db_fetch_array($this->cursor, PGSQL_ASSOC))
|
||||
{
|
||||
// echo "*** RETURNING: ".print_r($_insert_id, 1)."<br>";
|
||||
$this->insert_id[] = $_insert_id;
|
||||
}
|
||||
// if we have only one, revert from array to single
|
||||
if (count($this->insert_id) == 1)
|
||||
{
|
||||
// echo "* SINGLE DATA CONVERT: ".count($this->insert_id[0])." => ".array_key_exists($this->pk_name, $this->insert_id[0])."<br>";
|
||||
// echo "* PK DIRECT: ".$this->insert_id[0][$this->pk_name]."<Br>";
|
||||
// if this has only the pk_name, then only return this, else array of all data (but without the position)
|
||||
// example if insert_id[0]['foo'] && insert_id[0]['bar'] it will become insert_id['foo'] & insert_id['bar']
|
||||
// if only ['foo_id'] and it is the PK then the PK is directly written to the insert_id
|
||||
if (count($this->insert_id[0]) > 1 || !array_key_exists($this->pk_name, $this->insert_id[0]))
|
||||
{
|
||||
$this->insert_id_ext = $this->insert_id[0];
|
||||
$this->insert_id = $this->insert_id[0][$this->pk_name];
|
||||
}
|
||||
elseif ($this->insert_id[0][$this->pk_name])
|
||||
{
|
||||
$this->insert_id = $this->insert_id[0][$this->pk_name];
|
||||
}
|
||||
}
|
||||
elseif (count($this->insert_id) == 0)
|
||||
{
|
||||
// failed to get insert id
|
||||
$this->insert_id = '';
|
||||
$this->warning_id = 33;
|
||||
$this->_db_error($this->cursor, '[db_exec]');
|
||||
}
|
||||
}
|
||||
// this warning handling is only for pgsql
|
||||
// we returned an array of PKs instread of a single one
|
||||
if (is_array($this->insert_id))
|
||||
{
|
||||
$this->warning_id = 19;
|
||||
$this->_db_error($this->insert_id[1], '[db_exec]');
|
||||
unset($this->insert_id);
|
||||
$this->warning_id = 32;
|
||||
$this->_db_error($this->cursor, '[db_exec]');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -760,6 +805,26 @@
|
||||
// PUBLIC METHODS
|
||||
// *************************************************************
|
||||
|
||||
// METHOD db_set_debug
|
||||
// PARAMS true/false or none
|
||||
// RETURN new set debug flag
|
||||
// DESC switches the debug flag on or off
|
||||
// if none given, then the debug flag auto switches from
|
||||
// the previous setting to either then on or off
|
||||
// else override with boolean true/false
|
||||
public function db_set_debug($debug = '')
|
||||
{
|
||||
if ($debug === true)
|
||||
$this->db_debug = 1;
|
||||
elseif ($debug === false)
|
||||
$this->db_debug = 0;
|
||||
elseif ($this->db_debug)
|
||||
$this->db_debug = 0;
|
||||
elseif (!$this->db_debug)
|
||||
$this->db_debug = 1;
|
||||
return $this->db_debug;
|
||||
}
|
||||
|
||||
// METHOD db_reset_query_called
|
||||
// PARAMS query
|
||||
// RETURN none
|
||||
@@ -852,7 +917,7 @@
|
||||
|
||||
// METHOD db_dump_data
|
||||
// PARAMS query -> if given, only from this quey (if found)
|
||||
// RETURN formated string with all the data in the array
|
||||
// RETURN formated string with all the data in the array
|
||||
// DESC dumps ALL data for this query, OR if no query given all in cursor_ext array
|
||||
public function db_dump_data($query = 0)
|
||||
{
|
||||
@@ -876,11 +941,11 @@
|
||||
// if set to 2, the data will be read new and cached (wheres 1 reads new AND destroys at end of read)
|
||||
// -> if set to 3, after EACH row, the data will be reset, no caching is done except for basic (count, etc)
|
||||
// RETURN res mixed (array/hash)
|
||||
// DESC single running function, if called creates md5 from
|
||||
// DESC single running function, if called creates md5 from
|
||||
// query string and so can itself call exec/return calls
|
||||
// caches data, so next time called with IDENTICAL (!!!!)
|
||||
// [this means 1:1 bit to bit identical query] returns cached
|
||||
// data, or with reset flag set calls data from DB again
|
||||
// data, or with reset flag set calls data from DB again
|
||||
public function db_return($query, $reset = 0)
|
||||
{
|
||||
if (!$query)
|
||||
@@ -913,7 +978,7 @@
|
||||
$this->_db_error('', $this->cursor_ext[$md5]['query']);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// if it is a call with reset in it we reset the cursor, so we get an uncached return
|
||||
// but only for the FIRST call (pos == 0)
|
||||
if ($reset && !$this->cursor_ext[$md5]['pos'])
|
||||
@@ -964,7 +1029,7 @@
|
||||
} // only go if NO cursor exists
|
||||
|
||||
// if cursor exists ...
|
||||
if ($this->cursor_ext[$md5]['cursor'])
|
||||
if ($this->cursor_ext[$md5]['cursor'])
|
||||
{
|
||||
if ($this->cursor_ext[$md5]['firstcall'] == 1)
|
||||
{
|
||||
@@ -985,7 +1050,7 @@
|
||||
$this->cursor_ext[$md5]['read_rows'] = 0;
|
||||
}
|
||||
// read data for further work ... but only if necessarry
|
||||
if ($this->cursor_ext[$md5]['read_rows'] == $this->cursor_ext[$md5]['num_rows'])
|
||||
if ($this->cursor_ext[$md5]['read_rows'] == $this->cursor_ext[$md5]['num_rows'])
|
||||
$return = 0;
|
||||
else
|
||||
$return = $this->_db_convert_encoding($this->db_functions->_db_fetch_array($this->cursor_ext[$md5]['cursor']));
|
||||
@@ -1000,7 +1065,7 @@
|
||||
$this->cursor_ext[$md5]['cursor'] = 1;
|
||||
$return = 0;
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
// unset return value ...
|
||||
unset($return);
|
||||
@@ -1010,7 +1075,7 @@
|
||||
$field_value = $this->cursor_ext[$md5][$this->cursor_ext[$md5]['pos']][$this->cursor_ext[$md5]['field_names'][$i]];
|
||||
$return[$i] = $field_value;
|
||||
$return[$this->cursor_ext[$md5]['field_names'][$i]] = $field_value;
|
||||
}
|
||||
}
|
||||
$this->cursor_ext[$md5]['pos'] ++;
|
||||
}
|
||||
}
|
||||
@@ -1041,7 +1106,7 @@
|
||||
{
|
||||
while (list($field_name, $data) = each($return))
|
||||
{
|
||||
$temp[$field_name] = $data;
|
||||
$temp[$field_name] = $data;
|
||||
}
|
||||
$this->cursor_ext[$md5][] = $temp;
|
||||
}
|
||||
@@ -1071,16 +1136,16 @@
|
||||
}
|
||||
|
||||
// METHOD db_exec
|
||||
// PARAMS query -> the query, if not given, the query class var will be used
|
||||
// PARAMS query -> the query, if not given, the query class var will be used
|
||||
// (if this was not set, method will quit with a 0 (failure)
|
||||
// pk_name -> optional primary key name, for insert id return if the pk name is very different
|
||||
// if pk name is table name and _id, pk_name is not needed to be set
|
||||
// if NULL is given here, no RETURNING will be auto added
|
||||
// RETURN cursor for this query
|
||||
// DESC executes the query and returns & sets the internal cursor
|
||||
// fruthermore this functions also sets varios other vars
|
||||
// fruthermore this functions also sets varios other vars
|
||||
// like num_rows, num_fields, etc depending on query
|
||||
// for INSERT INTO queries it is highly recommended to set the pk_name to avoid an additional
|
||||
// for INSERT INTO queries it is highly recommended to set the pk_name to avoid an additional
|
||||
// read from the database for the PK NAME
|
||||
public function db_exec($query = 0, $pk_name = '')
|
||||
{
|
||||
@@ -1103,7 +1168,7 @@
|
||||
// pk_name -> optional primary key name, only used with insert for returning call
|
||||
// RETURN true if async query was sent ok, false if error happened
|
||||
// DESC executres the query async so other methods can be run during this
|
||||
// for INSERT INTO queries it is highly recommended to set the pk_name to avoid an additional
|
||||
// for INSERT INTO queries it is highly recommended to set the pk_name to avoid an additional
|
||||
// read from the database for the PK NAME
|
||||
// NEEDS db_check_async
|
||||
public function db_exec_async($query, $pk_name = '')
|
||||
@@ -1292,7 +1357,7 @@
|
||||
// PARAMS $stm_name, $query, $pk_name: optional
|
||||
// RETURN false on error
|
||||
// DESC prepares a query
|
||||
// for INSERT INTO queries it is highly recommended to set the pk_name to avoid an additional
|
||||
// for INSERT INTO queries it is highly recommended to set the pk_name to avoid an additional
|
||||
// read from the database for the PK NAME
|
||||
public function db_prepare($stm_name, $query, $pk_name = '')
|
||||
{
|
||||
@@ -1326,34 +1391,41 @@
|
||||
// if this is an insert query, check if we can add a return
|
||||
if ($this->_check_query_for_insert($query, true))
|
||||
{
|
||||
// set primary key name
|
||||
// current: only via parameter
|
||||
if (!$pk_name)
|
||||
if ($pk_name != 'NULL')
|
||||
{
|
||||
// read the primary key from the table, if we do not have one, we get nothing in return
|
||||
list($schema, $table) = $this->_db_return_table($query);
|
||||
if (!$this->pk_name_table[$table])
|
||||
// set primary key name
|
||||
// current: only via parameter
|
||||
if (!$pk_name)
|
||||
{
|
||||
$this->pk_name_table[$table] = $this->db_functions->_db_primary_key($table, $schema);
|
||||
// read the primary key from the table, if we do not have one, we get nothing in return
|
||||
list($schema, $table) = $this->_db_return_table($query);
|
||||
if (!$this->pk_name_table[$table])
|
||||
{
|
||||
$this->pk_name_table[$table] = $this->db_functions->_db_primary_key($table, $schema);
|
||||
}
|
||||
$pk_name = $this->pk_name_table[$table];
|
||||
}
|
||||
$pk_name = $this->pk_name_table[$table];
|
||||
}
|
||||
if ($pk_name)
|
||||
$this->prepare_cursor[$stm_name]['pk_name'] = $pk_name;
|
||||
// if no returning, then add it
|
||||
if (!preg_match("/ returning /i", $query) && $this->prepare_cursor[$stm_name]['pk_name'])
|
||||
{
|
||||
$query .= " RETURNING ".$this->prepare_cursor[$stm_name]['pk_name'];
|
||||
$this->prepare_cursor[$stm_name]['returning_id'] = true;
|
||||
}
|
||||
// if returning exists but not pk_name, add it
|
||||
else if (preg_match("/ returning (.*)/i", $query, $matches) && $this->prepare_cursor[$stm_name]['pk_name'])
|
||||
{
|
||||
if (!preg_match("/{$this->prepare_cursor[$stm_name]['pk_name']}/", $matches[1]))
|
||||
if ($pk_name)
|
||||
$this->prepare_cursor[$stm_name]['pk_name'] = $pk_name;
|
||||
// if no returning, then add it
|
||||
if (!preg_match("/ returning /i", $query) && $this->prepare_cursor[$stm_name]['pk_name'])
|
||||
{
|
||||
$query .= " , ".$this->prepare_cursor[$stm_name]['pk_name'];
|
||||
$query .= " RETURNING ".$this->prepare_cursor[$stm_name]['pk_name'];
|
||||
$this->prepare_cursor[$stm_name]['returning_id'] = true;
|
||||
}
|
||||
// if returning exists but not pk_name, add it
|
||||
else if (preg_match("/ returning (.*)/i", $query, $matches) && $this->prepare_cursor[$stm_name]['pk_name'])
|
||||
{
|
||||
if (!preg_match("/{$this->prepare_cursor[$stm_name]['pk_name']}/", $matches[1]))
|
||||
{
|
||||
$query .= " , ".$this->prepare_cursor[$stm_name]['pk_name'];
|
||||
}
|
||||
$this->prepare_cursor[$stm_name]['returning_id'] = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->prepare_cursor[$stm_name]['pk_name'] = $pk_name;
|
||||
}
|
||||
}
|
||||
// search for $1, $2, in the query and push it into the control array
|
||||
@@ -1419,20 +1491,56 @@ $this->debug('ExecuteData', 'ERROR in STM['.$stm_name.'|'.$this->prepare_cursor[
|
||||
$this->_db_error($this->prepare_cursor[$stm_name]['result']);
|
||||
$this->_db_debug('db', '<span style="color: red;"><b>DB-Error</b> '.$stm_name.': Execution failed</span>', 'DB_ERROR');
|
||||
}
|
||||
if ($this->_check_query_for_insert($this->prepare_cursor[$stm_name]['query'], true))
|
||||
if ($this->_check_query_for_insert($this->prepare_cursor[$stm_name]['query'], true) && $this->prepare_cursor[$stm_name]['pk_name'] != 'NULL')
|
||||
{
|
||||
if (!$this->prepare_cursor[$stm_name]['returning_id'])
|
||||
{
|
||||
$this->insert_id = $this->db_functions->_db_insert_id($this->prepare_cursor[$stm_name]['query'], $this->prepare_cursor[$stm_name]['pk_name']);
|
||||
}
|
||||
elseif ($code)
|
||||
$this->insert_id = $this->db_functions->_db_fetch_array($code)[$this->prepare_cursor[$stm_name]['pk_name']];
|
||||
{
|
||||
$this->insert_id = array ();
|
||||
$this->insert_id_ext = array ();
|
||||
// we have returning, now we need to check if we get one or many returned
|
||||
// we'll need to loop this, if we have multiple insert_id returns
|
||||
while ($_insert_id = $this->db_functions->_db_fetch_array($code, PGSQL_ASSOC))
|
||||
{
|
||||
$this->insert_id[] = $_insert_id;
|
||||
}
|
||||
// if we have only one, revert from arry to single
|
||||
if (count($this->insert_id) == 1)
|
||||
{
|
||||
// echo "+ SINGLE DATA CONVERT: ".count($this->insert_id[0])." => ".array_key_exists($this->prepare_cursor[$stm_name]['pk_name'], $this->insert_id[0])."<br>";
|
||||
// echo "+ PK DIRECT: ".$this->insert_id[0][$this->prepare_cursor[$stm_name]['pk_name']]."<Br>";
|
||||
// if this has only the pk_name, then only return this, else array of all data (but without the position)
|
||||
// example if insert_id[0]['foo'] && insert_id[0]['bar'] it will become insert_id['foo'] & insert_id['bar']
|
||||
// if only ['foo_id'] and it is the PK then the PK is directly written to the insert_id
|
||||
if (count($this->insert_id[0]) > 1 || !array_key_exists($this->prepare_cursor[$stm_name]['pk_name'], $this->insert_id[0]))
|
||||
{
|
||||
$this->insert_id_ext = $this->insert_id[0];
|
||||
$this->insert_id = $this->insert_id[0][$this->prepare_cursor[$stm_name]['pk_name']];
|
||||
}
|
||||
elseif ($this->insert_id[0][$this->prepare_cursor[$stm_name]['pk_name']])
|
||||
{
|
||||
$this->insert_id = $this->insert_id[0][$this->prepare_cursor[$stm_name]['pk_name']];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// failed to get insert id
|
||||
$this->insert_id = '';
|
||||
$this->warning_id = 33;
|
||||
$this->_db_error('db', '<span style="color: orange;"><b>DB-Warning</b> '.$stm_name.': insert id returned no data</span>', 'DB_WARNING');
|
||||
}
|
||||
}
|
||||
// this error handling is only for pgsql
|
||||
if (is_array($this->insert_id))
|
||||
{
|
||||
$this->warning_id = 19;
|
||||
$this->_db_error($this->insert_id[1]);
|
||||
$this->_db_debug('db', '<span style="color: orange;"><b>DB-Warning</b> '.$stm_name.': Could not get insert id</span>', 'DB_WARNING');
|
||||
unset($this->insert_id);
|
||||
$this->warning_id = 32;
|
||||
$this->_db_error();
|
||||
$this->_db_debug('db', '<span style="color: orange;"><b>DB-Warning</b> '.$stm_name.': insert id data returned as array</span>', 'DB_WARNING');
|
||||
}
|
||||
// NOTE should we keep this inside
|
||||
elseif (!$this->insert_id)
|
||||
{
|
||||
$this->warning_id = 31;
|
||||
@@ -1467,7 +1575,7 @@ $this->debug('ExecuteData', 'ERROR in STM['.$stm_name.'|'.$this->prepare_cursor[
|
||||
// RETURN database version as string
|
||||
// DESC return current database version
|
||||
public function db_version()
|
||||
{
|
||||
{
|
||||
return $this->db_functions->_db_version();
|
||||
}
|
||||
|
||||
@@ -1477,7 +1585,7 @@ $this->debug('ExecuteData', 'ERROR in STM['.$stm_name.'|'.$this->prepare_cursor[
|
||||
// RETURN true/false
|
||||
// DESC returns boolean true or false if the string matches the database version
|
||||
public function db_compare_version($compare)
|
||||
{
|
||||
{
|
||||
// compare has =, >, < prefix, and gets stripped, if the rest is not X.Y format then error
|
||||
preg_match("/^([<>=]{1,2})(\d{1,2})\.(\d{1,2})/", $compare, $matches);
|
||||
$compare = $matches[1];
|
||||
@@ -1494,7 +1602,7 @@ $this->debug('ExecuteData', 'ERROR in STM['.$stm_name.'|'.$this->prepare_cursor[
|
||||
$return = false;
|
||||
// compare
|
||||
switch ($compare)
|
||||
{
|
||||
{
|
||||
case '=':
|
||||
if ($to_version == $version)
|
||||
$return = true;
|
||||
@@ -1660,7 +1768,7 @@ $this->debug('ExecuteData', 'ERROR in STM['.$stm_name.'|'.$this->prepare_cursor[
|
||||
$seconds = $matches[4] != '00' ? preg_replace('/^0/', '', $matches[4]) : '';
|
||||
$milliseconds = $matches[6];
|
||||
|
||||
return $prefix.($hour ? $hour.'h ' : '').($minutes ? $minutes.'m ' : '').($seconds ? $seconds.'s' : '').($show_micro && $milliseconds? ' '.$milliseconds.'ms' : '');
|
||||
return $prefix.($hour ? $hour.'h ' : '').($minutes ? $minutes.'m ' : '').($seconds ? $seconds.'s' : '').($show_micro && $milliseconds? ' '.$milliseconds.'ms' : '');
|
||||
}
|
||||
|
||||
// METHOD: db_array_parse
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user