Compare commits
21 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e46d0fa4a4 | ||
|
|
f7db84c62f | ||
|
|
3267fc0266 | ||
|
|
d9e13ae14c | ||
|
|
50db770992 | ||
|
|
e439945a54 | ||
|
|
8223441ca9 | ||
|
|
0153c9721f | ||
|
|
b6f6eeac9b | ||
|
|
beedf629e5 | ||
|
|
04b47574eb | ||
|
|
ecc52e2dbd | ||
|
|
12e335c69c | ||
|
|
3ae3b1b761 | ||
|
|
3c9ca025f5 | ||
|
|
96afa463e0 | ||
|
|
5195212fae | ||
|
|
e990d6b410 | ||
|
|
b5dd85bc75 | ||
|
|
b2945a8fa0 | ||
|
|
c77562b595 |
@@ -56,6 +56,7 @@ return [
|
||||
"./www/configs/config.db.php",
|
||||
"./www/configs/config.host.php",
|
||||
"./www/configs/config.path.php",
|
||||
"./www/configs/config.other.php",
|
||||
"./www/configs/config.master.php",
|
||||
"./www/includes/admin_header.php",
|
||||
],
|
||||
|
||||
14
4dev/database/update/edit_tables_missing_columns.sql
Executable file
14
4dev/database/update/edit_tables_missing_columns.sql
Executable file
@@ -0,0 +1,14 @@
|
||||
-- update missing edit_* table data
|
||||
|
||||
ALTER TABLE edit_generic ADD cuid VARCHAR;
|
||||
|
||||
ALTER TABLE edit_access ADD enabled SMALLINT DEFAULT 0;
|
||||
ALTER TABLE edit_access ADD protected SMALLINT DEFAULT 0;
|
||||
|
||||
ALTER TABLE edit_group ADD uid VARCHAR;
|
||||
ALTER TABLE edit_group ADD deleted SMALLINT DEFAULT 0;
|
||||
|
||||
ALTER TABLE temp_files ADD folder varchar;
|
||||
ALTER TABLE edit_page ADD hostname varchar;
|
||||
|
||||
ALTER TABLE edit_user ADD deleted SMALLINT DEFAULT 0;
|
||||
@@ -64,3 +64,14 @@ msgstr "日"
|
||||
|
||||
msgid "INPUT TEST"
|
||||
msgstr "OUTPUT TEST JA"
|
||||
|
||||
# login string
|
||||
msgid "Hello %s"
|
||||
msgstr "こにちは %s"
|
||||
|
||||
msgid "I should be translated"
|
||||
msgstr "「スマーティー」これは正しいです"
|
||||
|
||||
msgid "Are we translated?"
|
||||
msgstr "「クラス」これは翻訳です?"
|
||||
|
||||
|
||||
@@ -88,3 +88,5 @@ UPDATE edit_query_string SET cuid = random_string(12) WHERE cuid IS NULL;
|
||||
UPDATE edit_scheme SET cuid = random_string(12) WHERE cuid IS NULL;
|
||||
UPDATE edit_user SET cuid = random_string(12) WHERE cuid IS NULL;
|
||||
UPDATE edit_visible_group SET cuid = random_string(12) WHERE cuid IS NULL;
|
||||
|
||||
-- update all triggers
|
||||
|
||||
498
bin/Progress.pm
Normal file
498
bin/Progress.pm
Normal file
@@ -0,0 +1,498 @@
|
||||
package Progress;
|
||||
|
||||
# AUTHOR: Clemens Schwaighofer
|
||||
# DATE CREATED: 2009/6/16
|
||||
# DESCRIPTION: progress percent class
|
||||
|
||||
# METHODS
|
||||
# * init
|
||||
# my $prg = Progress->new();
|
||||
# will init a new progress class in the var $prg
|
||||
# the following parameters can be set directly during a new call
|
||||
# - verbose (1/0)
|
||||
# - precision (-1~10)
|
||||
# - wide_time (0/1)
|
||||
# - microtime (0/1)
|
||||
# setting is done via
|
||||
# my $prg = Progress->new(verbose => 1, microtime = 1);
|
||||
# * setting methods
|
||||
# verbose($level int)
|
||||
# $level has to be int, if not set there is no output show, at least 1 has to be given to see visible output
|
||||
# precision($decimals int)
|
||||
# $decimals has to be int, if set to -1 then the steps are done in 10 increase, else it sets how many decimals are visible, 0 for no decimals
|
||||
# wide_time(0/1 int)
|
||||
# sets the flag for wide time, if set to 1 the estimated time to end and time run is left prefixed with 15 chars
|
||||
# microtime(0/1 int)
|
||||
# sets the flag to always show microtime (1) or only if the previous time was the same (0)
|
||||
# reset()
|
||||
# resets all the internal vars for another new run
|
||||
# SetStartTime(optional timestamp)
|
||||
# sets the start times for this progress run, the overall start/end time is set, and the time used for the actual progress
|
||||
# in case there is some processing done before the run starts, it is highly recommended to call SetETAStartTime before the actual processing starts
|
||||
# if no timestamp is given, internal timestamp is used (this is recommended)
|
||||
# SetETAStartTime(optional timestamp)
|
||||
# only sets the start/end time for the actual "estimated time" calculation. It is recommended to call this right before the processing loop starts
|
||||
# eg if there is a big query running that takes a lot of time, this method should be called before the reading loop
|
||||
# as with SetStartTime a timestamp can be given, if not then the internal timestamp is used (this is recommended)
|
||||
# SetEndTime(optional timestamp)
|
||||
# sets the end time for the overall processing. This should be called at the very end of the script before any final stat data is printed
|
||||
# linecount($lines int)
|
||||
# sets the maximum lines that will be processed, used for percentage calculation. If non int is given, will set to 1. This will be only set once, to
|
||||
# reset used reset() method.
|
||||
# Either this or filesize NEED to be set
|
||||
# filesize($bytes int)
|
||||
# filesize in bytes, if non valid data is given, then it is set to 1.
|
||||
# filesize() and linecount() can both be set, but at least one of them has to be set.
|
||||
# if filesize is set a byte data output is added, if only linecount is given, only the linecount output will be given (no bytes per second, etc)
|
||||
# ShowPosition(optional current byte position int)
|
||||
# this is the main processing and has to be called at the end of the loop where the data is processed. If no bytes are given the internal counter (linecount)
|
||||
# is used.
|
||||
# for bytes it is recommended to use IO::File and $FH->tell to pass on the bytes
|
||||
#
|
||||
# VARIABLES
|
||||
# * internal set
|
||||
# change: flagged 1 if output is given or would be given. can be used for any post processing after the ShowPosition is called
|
||||
# precision_ten_step: flagged 1 if the precision was set to -1
|
||||
# start: overall start time
|
||||
# end: overall end time
|
||||
# count: count of processed lines
|
||||
# [TODO: describe the others too, at the moment only below in %fields]
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use utf8;
|
||||
|
||||
BEGIN {
|
||||
use POSIX;
|
||||
use Carp;
|
||||
use Time::HiRes qw(time);
|
||||
use File::Basename;
|
||||
use Number::Format qw(format_number);
|
||||
use vars qw($AUTOLOAD);
|
||||
push(@INC, File::Basename::dirname($0).'/');
|
||||
}
|
||||
|
||||
# important includes
|
||||
use functions;
|
||||
|
||||
# variable declarationf or access
|
||||
# * can be set
|
||||
# = only for read
|
||||
# unmarked are internal only, but can be read if they are needed in further processing in the script
|
||||
my %fields = (
|
||||
linecount => 0, # * max lines in input
|
||||
filesize => 0, # * max file size
|
||||
precision => 1, # * comma after percent
|
||||
wide_time => 0, # * if flagged 1, then the wide 15 char left bound format is used
|
||||
verbose => 0, # * verbose status from outside
|
||||
microtime => 0, # * microtime output for last run time (1 for enable, 0 for auto, -1 for disable)
|
||||
change => 0, # = flag if output was given
|
||||
start => undef, # = global start for the full script running time
|
||||
start_run => undef, # = for the eta time, can be set after a query or long read in, to not create a wrong ETA time
|
||||
start_time => undef, # loop start
|
||||
end => undef, # = global end
|
||||
end_time => undef, # loop end
|
||||
count_size => undef, # = filesize current
|
||||
count => 0, # = position current
|
||||
current_count => 0, # last count (position)
|
||||
lines_processed => 0, # lines processed in the last run
|
||||
last_group => 0, # time in seconds for the last group run (until percent change)
|
||||
lines_in_last_group => 0, # float value, lines processed per second to the last group run
|
||||
lines_in_global => 0, # float values, lines processed per second to complete run
|
||||
bytes_in_last_group => 0, # flaot value, bytes processes per second in the last group run
|
||||
bytes_in_global => 0, # float value, bytes processed per second to complete run
|
||||
size_in_last_group => 0, # bytes processed in last run (in bytes)
|
||||
current_size => 0, # current file position (size)
|
||||
last_percent => 0, # last percent position
|
||||
precision_ten_step => 0, # if we have normal % or in steps of 10
|
||||
percent_print => 5, # the default size, this is precision + 4
|
||||
percent_precision => 1, # this is 1 if it is 1 or 0 for precision, or precision size
|
||||
eta => undef, # estimated time to finish
|
||||
full_time_needed => undef, # run time since start
|
||||
lg_microtime => 0 # last group microtime, this is auto set during process.
|
||||
);
|
||||
|
||||
# class init
|
||||
sub new
|
||||
{
|
||||
my $proto = shift;
|
||||
my $class = ref($proto) || $proto;
|
||||
my %data = @_;
|
||||
my $self = {
|
||||
_permitted => \%fields,
|
||||
%fields,
|
||||
};
|
||||
# vars to init
|
||||
bless ($self, $class);
|
||||
if ($data{'verbose'} && $data{'verbose'} =~ /^\d{1}$/) {
|
||||
$self->{verbose} = $data{'verbose'};
|
||||
}
|
||||
if (exists($data{'precision'}) && (($data{'precision'} || $data{'precision'} == 0) && $data{'precision'} =~ /^\-?\d{1,2}$/)) {
|
||||
$self->precision($data{'precision'});
|
||||
}
|
||||
if ($data{'microtime'} && $data{'microtime'} =~ /^(0|1)$/) {
|
||||
$self->microtime($data{'microtime'});
|
||||
}
|
||||
if ($data{'wide_time'} && $data{'wide_time'} =~ /^(0|1)$/) {
|
||||
$self->wide_time($data{'wide_time'});
|
||||
}
|
||||
return $self;
|
||||
}
|
||||
|
||||
# auto load for vars
|
||||
sub AUTOLOAD
|
||||
{
|
||||
my $self = shift;
|
||||
my $type = ref($self) || croak "$self is not an object";
|
||||
my $name = $AUTOLOAD;
|
||||
$name =~ s/.*://;
|
||||
|
||||
unless (exists $self->{_permitted}->{$name}) {
|
||||
croak "Can't access '$name' field in class $type";
|
||||
}
|
||||
|
||||
if (@_) {
|
||||
return $self->{$name} = shift;
|
||||
} else {
|
||||
return $self->{$name};
|
||||
}
|
||||
}
|
||||
|
||||
# destructor
|
||||
sub DESTROY
|
||||
{
|
||||
# do nothing, there is nothing to close or finish
|
||||
}
|
||||
|
||||
# SUB: reset
|
||||
# PARAMS: none
|
||||
# DESC: resets all the current counters only and current start times
|
||||
sub reset
|
||||
{
|
||||
my $self = shift;
|
||||
# reset what always gets reset
|
||||
$self->{count} = 0;
|
||||
$self->{count_size} = undef;
|
||||
$self->{current_count} = 0;
|
||||
$self->{linecount} = 0;
|
||||
$self->{lines_processed} = 0;
|
||||
$self->{last_group} = 0;
|
||||
$self->{lines_in_last_group} = 0;
|
||||
$self->{lines_in_global} = 0;
|
||||
$self->{bytes_in_last_group} = 0;
|
||||
$self->{bytes_in_global} = 0;
|
||||
$self->{size_in_last_group} = 0;
|
||||
$self->{filesize} = 0;
|
||||
$self->{current_size} = 0;
|
||||
$self->{last_percent} = 0;
|
||||
$self->{eta} = 0;
|
||||
$self->{full_time_needed} = 0;
|
||||
$self->{start_run} = undef;
|
||||
$self->{start_time} = undef;
|
||||
$self->{end_time} = undef;
|
||||
}
|
||||
|
||||
# SUB: microtime
|
||||
# PARAMS: 1/0
|
||||
# DESC: flag to set microtime on or off in the time output
|
||||
# if not 1 or 0, set to 0
|
||||
sub microtime
|
||||
{
|
||||
my $self = shift;
|
||||
my $microtime;
|
||||
if (@_) {
|
||||
$microtime = shift;
|
||||
if ($microtime == 1 || $microtime == 0) {
|
||||
$self->{microtime} = $microtime;
|
||||
} else {
|
||||
$self->{microtime} = 0;
|
||||
}
|
||||
}
|
||||
return $self->{microtime};
|
||||
}
|
||||
|
||||
|
||||
# SUB: wide_time
|
||||
# PARAMS: 1/0
|
||||
# DESC: flag to set wide_time (15 char spacer).
|
||||
# if not 1 or 0, set to 0
|
||||
sub wide_time
|
||||
{
|
||||
my $self = shift;
|
||||
my $wide;
|
||||
if (@_) {
|
||||
$wide = shift;
|
||||
if ($wide == 1 || $wide == 0) {
|
||||
$self->{wide_time} = $wide;
|
||||
} else {
|
||||
$self->{wide_time} = 0;
|
||||
}
|
||||
}
|
||||
return $self->{wide_time};
|
||||
}
|
||||
|
||||
# SUB: precision
|
||||
# PARAMS: precision in int
|
||||
# DESC: sets the output percent precision calculation and printf width
|
||||
# if negative, to ten step, if bigger 10, set to one
|
||||
sub precision
|
||||
{
|
||||
my $self = shift;
|
||||
my $comma;
|
||||
if (@_) {
|
||||
$comma = shift;
|
||||
$comma = 0 if ($comma !~ /^\-?\d{1,}$/);
|
||||
if ($comma < 0) {
|
||||
# -2 is 5 step
|
||||
# -1 is 10 step
|
||||
if ($comma < -1) {
|
||||
$self->{precision_ten_step} = 5;
|
||||
} else {
|
||||
$self->{precision_ten_step} = 10;
|
||||
}
|
||||
$self->{precision} = 0; # no comma
|
||||
$self->{percent_precision} = 0; # no print precision
|
||||
$self->{percent_print} = 3; # max 3 length
|
||||
} else {
|
||||
$self->{precision} = $comma < 0 || $comma > 10 ? 10 : $comma;
|
||||
$self->{percent_precision} = $comma < 0 || $comma > 10 ? 10 : $comma;
|
||||
$self->{percent_print} = ($comma == 0 ? 3 : 4) + $self->{percent_precision};
|
||||
}
|
||||
}
|
||||
return $self->{precision};
|
||||
}
|
||||
|
||||
# SUB: linecount
|
||||
# PARAMS: max number of lines to be processed
|
||||
# DESC: sets the max number for lines for the percent calculation, if negative or not number, set to 1
|
||||
# can only be set ONCE
|
||||
sub linecount
|
||||
{
|
||||
my $self = shift;
|
||||
my $linecount;
|
||||
if (!$self->{linecount}) {
|
||||
if (@_) {
|
||||
$linecount = shift;
|
||||
$self->{linecount} = $linecount;
|
||||
$self->{linecount} = 1 if ($linecount < 0 || $linecount !~ /\d+/)
|
||||
}
|
||||
}
|
||||
return $self->{linecount};
|
||||
}
|
||||
|
||||
# SUB: filesize
|
||||
# PARAMS: max filesize for the to processed data
|
||||
# DESC: sets the max filesize for the to processed data, if negative or not number, set to 1
|
||||
# input data has to be in bytes without any suffix (no b, kb, etc)
|
||||
# can only be set ONCE
|
||||
sub filesize
|
||||
{
|
||||
my $self = shift;
|
||||
my $filesize;
|
||||
if (!$self->{filesize}) {
|
||||
if (@_) {
|
||||
$filesize = shift;
|
||||
$self->{filesize} = $filesize;
|
||||
$self->{filesize} = 1 if ($filesize < 0 || $filesize !~ /\d+/)
|
||||
}
|
||||
}
|
||||
return $self->{filesize};
|
||||
}
|
||||
|
||||
# SUB: SetStartTime
|
||||
# PARAMS: time, or nothing
|
||||
# DESC: sets all the start times
|
||||
sub SetStartTime
|
||||
{
|
||||
my $self = shift;
|
||||
if (@_) {
|
||||
$self->{start} = shift;
|
||||
} else {
|
||||
$self->{start} = time();
|
||||
}
|
||||
$self->{start_time} = $self->{start};
|
||||
$self->{start_run} = $self->{start};
|
||||
}
|
||||
|
||||
# SUB: SetETAStartTime
|
||||
# PARAMS: time, or nothing
|
||||
# DESC: sets the loop & run time, for correct ETA callculation
|
||||
sub SetETAStartTime
|
||||
{
|
||||
my $self = shift;
|
||||
if (@_) {
|
||||
$self->{start_time} = shift;
|
||||
} else {
|
||||
$self->{start_time} = time();
|
||||
}
|
||||
$self->{start_run} = $self->{start_time};
|
||||
}
|
||||
|
||||
# SUB: SetEndTime
|
||||
# PARAMS: time, or nothing
|
||||
# DESC: sets the end time for running time calculation
|
||||
sub SetEndTime
|
||||
{
|
||||
my $self = shift;
|
||||
if (@_) {
|
||||
$self->{end} = shift;
|
||||
} else {
|
||||
$self->{end} = time();
|
||||
}
|
||||
}
|
||||
|
||||
# SUB: ShowPosition
|
||||
# PARAMS: optiona; file position (via file pointer)
|
||||
# RETURN: string for percent position output
|
||||
# DESC: calculates the current percent position based on the passed parameter, if no parameter uses intneral counter
|
||||
sub ShowPosition
|
||||
{
|
||||
my $self = shift;
|
||||
# set local vars
|
||||
my $percent; # current percent
|
||||
my $full_time_needed; # complete process time
|
||||
my $full_time_per_line; # time per line
|
||||
my $eta; # estimated end time
|
||||
my $string = ''; # percent string that gets output
|
||||
my $show_filesize = 1;
|
||||
# microtime flags
|
||||
my $eta_microtime = 0;
|
||||
my $ftn_microtime = 0;
|
||||
my $lg_microtime = 0;
|
||||
# percent precision calc
|
||||
my $_p_spf = "%.".$self->{precision}."f";
|
||||
# output format for percent
|
||||
my $_pr_p_spf = "%".$self->{percent_print}.".".$self->{percent_precision}."f";
|
||||
# set the linecount precision based on the final linecount, if not, leave it empty
|
||||
my $_pr_lc = "%s";
|
||||
$_pr_lc = "%".length(format_number($self->{linecount}))."s" if ($self->{linecount});
|
||||
# time format, if flag is set, the wide format is used
|
||||
my $_pr_tf = "%s";
|
||||
$_pr_tf = "%-15s" if ($self->{'wide_time'});
|
||||
# do the smae for file size
|
||||
# my $_pr_fs = "%s";
|
||||
# $_pr_fs = "%".length(function::convert_number($self->{filesize}))."s" if ($self->{filesize});
|
||||
|
||||
# increase position by one
|
||||
$self->{count} ++;
|
||||
# see if we get anything from IO tell
|
||||
if (@_) {
|
||||
$self->{file_pos} = shift;
|
||||
} else {
|
||||
# we did not, so we set internal value
|
||||
$self->{file_pos} = $self->{count};
|
||||
# we also check if the filesize was set now
|
||||
if (!$self->{filesize}) {
|
||||
$self->{filesize} = $self->{linecount};
|
||||
}
|
||||
# set ignore filesize output (no data)
|
||||
$show_filesize = 0;
|
||||
}
|
||||
# set the count size based on the file pos, is only used if we have filesize
|
||||
$self->{count_size} = $self->{file_pos};
|
||||
|
||||
# do normal or down to 10 (0, 10, ...) %
|
||||
if ($self->{precision_ten_step}) {
|
||||
# calc 0 comma precision, so just do a floor
|
||||
my $_percent = sprintf("%d", ($self->{file_pos} / $self->{filesize}) * 100);
|
||||
# mod that to 10
|
||||
my $mod = $_percent % $self->{precision_ten_step};
|
||||
# either write this one, or write the previous, old one
|
||||
$percent = $mod == 0 ? $_percent : $self->last_percent;
|
||||
# print "P: $percent, Last: ".$self->last_percent.", Mod: ".$mod.", Calc: ".$_percent."\n";
|
||||
} else {
|
||||
$percent = sprintf($_p_spf, ($self->{file_pos} / $self->{filesize}) * 100);
|
||||
}
|
||||
# print "POS: ".$self->{file_pos}.", PERCENT: $percent / ".$self->last_percent."\n";
|
||||
if ($percent != $self->last_percent) {
|
||||
$self->{end_time} = time();
|
||||
# for from the beginning
|
||||
$full_time_needed = $self->{end_time} - $self->{start_run}; # how long from the start;
|
||||
$self->{last_group} = $self->{end_time} - $self->{start_time};
|
||||
$self->{lines_processed} = $self->{count} - $self->{current_count};
|
||||
# lines in last group
|
||||
$self->{lines_in_last_group} = $self->{'last_group'} ? ($self->{lines_processed} / $self->{last_group}) : 0;
|
||||
# lines in global
|
||||
$self->{lines_in_global} = $full_time_needed ? ($self->{'count'} / $full_time_needed) : 0;
|
||||
# if we have linecount
|
||||
if (!$self->{linecount}) {
|
||||
$full_time_per_line = (($full_time_needed) ? $full_time_needed : 1) / $self->{count_size}; # how long for all
|
||||
$eta = $full_time_per_line * ($self->{filesize} - $self->{count_size}); # estimate for the rest
|
||||
} else {
|
||||
$full_time_per_line = (($full_time_needed) ? $full_time_needed : 1) / $self->{count}; # how long for all
|
||||
$eta = $full_time_per_line * ($self->{linecount} - $self->{count}); # estimate for the rest
|
||||
}
|
||||
|
||||
# just in case ...
|
||||
$eta = '0' if ($eta < 0);
|
||||
# check if to show microtime
|
||||
# ON: if microtime is flagged as one
|
||||
$eta_microtime = $ftn_microtime = $lg_microtime = 1 if ($self->{microtime} == 1);
|
||||
# AUTO: foir microtime
|
||||
if ($self->{microtime} == 0) {
|
||||
$eta_microtime = 1 if ($eta > 0 && $eta < 1);
|
||||
$ftn_microtime = 1 if ($full_time_needed > 0 && $full_time_needed < 1);
|
||||
# pre check last group: if pre comma part is same add microtime anyway
|
||||
$lg_microtime = 1 if ($self->{last_group} > 0 && $self->{last_group} < 1);
|
||||
}
|
||||
# print out
|
||||
if ($show_filesize) {
|
||||
# last group size
|
||||
$self->{size_in_last_group} = $self->{count_size} - $self->{current_size};
|
||||
# calc kb/s if there is any filesize data
|
||||
# last group
|
||||
$self->{bytes_in_last_group} = $self->{'last_group'} ? ($self->{size_in_last_group} / $self->{last_group}) : 0;
|
||||
# global
|
||||
$self->{bytes_in_global} = $full_time_needed ? ($self->{count_size} / $full_time_needed) : 0;
|
||||
# only used if we run with file size for the next check
|
||||
$self->{current_size} = $self->{count_size};
|
||||
|
||||
$string = sprintf(
|
||||
"Processed ".$_pr_p_spf."%% [%s / %s] | ".$_pr_lc." / ".$_pr_lc." Lines | ETA: ".$_pr_tf." / TR: ".$_pr_tf." / LR: %s lines (%s) in %s, %s (%s) lines/s, %s (%s) b/s\n",
|
||||
$percent,
|
||||
function::convert_number($self->{count_size}),
|
||||
function::convert_number($self->{filesize}),
|
||||
format_number($self->{count}),
|
||||
format_number($self->{linecount}),
|
||||
function::convert_time($eta, $eta_microtime),
|
||||
function::convert_time($full_time_needed, $ftn_microtime),
|
||||
format_number($self->{lines_processed}),
|
||||
function::convert_number($self->{size_in_last_group}),
|
||||
function::convert_time($self->{last_group}, $lg_microtime),
|
||||
format_number($self->{lines_in_global}, 2, 1),
|
||||
format_number($self->{lines_in_last_group}, 2, 1),
|
||||
function::convert_number($self->{bytes_in_global}),
|
||||
function::convert_number($self->{bytes_in_last_group})
|
||||
) if ($self->{verbose} >= 1);
|
||||
} else {
|
||||
$string = sprintf(
|
||||
"Processed ".$_pr_p_spf."%% | ".$_pr_lc." / ".$_pr_lc." Lines | ETA: ".$_pr_tf." / TR: ".$_pr_tf." / LR: %s lines in %s, %s (%s) lines/s\n",
|
||||
$percent,
|
||||
format_number($self->{count}),
|
||||
format_number($self->{linecount}),
|
||||
function::convert_time($eta, $eta_microtime),
|
||||
function::convert_time($full_time_needed, $ftn_microtime),
|
||||
format_number($self->{lines_processed}),
|
||||
function::convert_time($self->{last_group}, $lg_microtime),
|
||||
format_number($self->{lines_in_global}, 2, 1),
|
||||
format_number($self->{lines_in_last_group}, 2, 1)
|
||||
) if ($self->{verbose} >= 1);
|
||||
}
|
||||
# write back vars
|
||||
$self->{last_percent} = $percent;
|
||||
$self->{eta} = $eta;
|
||||
$self->{full_time_needed} = $full_time_needed;
|
||||
$self->{lg_microtime} = $lg_microtime;
|
||||
# for the next run, check data
|
||||
$self->{start_time} = time();
|
||||
$self->{current_count} = $self->{count};
|
||||
# trigger if this is a change
|
||||
$self->{change} = 1;
|
||||
} else {
|
||||
# trigger if this is a change
|
||||
$self->{change} = 0;
|
||||
}
|
||||
return $string;
|
||||
}
|
||||
|
||||
1;
|
||||
501
bin/functions.pm
Normal file
501
bin/functions.pm
Normal file
@@ -0,0 +1,501 @@
|
||||
package function;
|
||||
|
||||
# AUTHOR: Clemens Schwaighofer
|
||||
# DATE CREATED: 2004/11/09
|
||||
# DESCRIPTION: functions collection for Adidas scripts
|
||||
# HISTORY:
|
||||
# 2005/06/22 (cs) added header key check function
|
||||
# 2005/02/10 (cs) added debug flag to print output, added two new functions to format a number into B, KB, etc
|
||||
# 2005/01/13 (cs) fixed array problem with the clean up and int function
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use 5.000_000;
|
||||
use POSIX qw(floor);
|
||||
use File::Copy;
|
||||
use Digest::SHA qw(sha1_hex);
|
||||
use utf8;
|
||||
#require Exporter;
|
||||
#our @ISA = qw(Exporter);
|
||||
#our @EXPORT = qw();
|
||||
|
||||
# depending on the options given to the program, it gets the correct settings
|
||||
# to which db it should connect
|
||||
sub get_db_user
|
||||
{
|
||||
my ($target, $db) = @_;
|
||||
|
||||
# the parts of the hash array (tab seperated)
|
||||
my @array_names = qw{db_name db_port db_user db_pass db_host db_type db_test db_ssl};
|
||||
my %db_out = ();
|
||||
|
||||
# based on the two parameters find the correct vars
|
||||
# each level can hold data, higher level data overrules lower data
|
||||
# eg $config::db{'test'}{'db_user'} overrules $config::db{'db_user'}
|
||||
for (my $i = 1; $i <= 3; $i ++) {
|
||||
foreach my $name (@array_names) {
|
||||
# depending on the level check the level of data
|
||||
if ($i == 1) {
|
||||
$db_out{$name} = $config::db{$name} if (defined($config::db{$name}));
|
||||
} elsif ($i == 2) {
|
||||
$db_out{$name} = $config::db{$target}{$name} if (defined($config::db{$target}{$name}));
|
||||
} elsif ($i == 3) {
|
||||
$db_out{$name} = $config::db{$target}{$db}{$name} if (defined($config::db{$target}{$db}{$name}));
|
||||
}
|
||||
} # for each db data var
|
||||
} # for each data level in the hash
|
||||
|
||||
return (
|
||||
$db_out{'db_name'},
|
||||
$db_out{'db_port'},
|
||||
$db_out{'db_user'},
|
||||
$db_out{'db_pass'},
|
||||
$db_out{'db_host'},
|
||||
$db_out{'db_type'},
|
||||
$db_out{'db_test'},
|
||||
$db_out{'db_ssl'}
|
||||
);
|
||||
}
|
||||
|
||||
# get the DSN string for the DB connect
|
||||
sub get_db_dsn
|
||||
{
|
||||
my (
|
||||
$db_name,
|
||||
$db_port,
|
||||
$db_user,
|
||||
$db_pass,
|
||||
$db_host,
|
||||
$db_type,
|
||||
$db_ssl
|
||||
) = @_;
|
||||
my $dsn = '';
|
||||
|
||||
if ($db_type eq 'mysql' && $db_name && $db_host && $db_user) {
|
||||
$dsn = "DBI:mysql:database=".$db_name.";host=".$db_host.";port=".$db_port;
|
||||
} elsif ($db_type eq 'pgsql' && $db_name && $db_host && $db_user) {
|
||||
$dsn = "DBI:Pg:dbname=".$db_name.";host=".$db_host.";port=".$db_port.";sslmode=".$db_ssl;
|
||||
} else {
|
||||
# invalid db type
|
||||
$dsn = -1;
|
||||
}
|
||||
return $dsn;
|
||||
}
|
||||
|
||||
sub strip_white_spaces
|
||||
{
|
||||
my ($element) = @_;
|
||||
# get rid of spaces at the end and at the beginning of each bloack
|
||||
$element =~ s/^\s+//g;
|
||||
$element =~ s/\s+$//g;
|
||||
return $element;
|
||||
}
|
||||
|
||||
sub prepare_hash_keys
|
||||
{
|
||||
my($csv, $data, $csv_header) = @_;
|
||||
|
||||
# unset value starts at 1000 and goes up ...
|
||||
my $unset_value = 1000;
|
||||
my %keys = ();
|
||||
|
||||
# parse header
|
||||
if ($csv->parse($data)) {
|
||||
my @cols = $csv->fields();
|
||||
for (my $i = 0; $i < @cols; $i ++) {
|
||||
# remove all spaces before and afterward
|
||||
$cols[$i] = function::strip_white_spaces($cols[$i]);
|
||||
# write key - id number
|
||||
$keys{$cols[$i]} = $i;
|
||||
print $::DEBUG "\tPostion [".$i."]: ".$cols[$i]."\n" if ($::debug);
|
||||
print "\tPosition [".$i."]: ".$cols[$i]."\n" if ($::verbose > 1);
|
||||
}
|
||||
} else {
|
||||
die "ERROR[".$csv->error_diag()."]: ".$csv->error_input()."\n";
|
||||
}
|
||||
# add empty values
|
||||
foreach my $csv_header_value (@$csv_header) {
|
||||
if (!defined($keys{$csv_header_value})) {
|
||||
$keys{$csv_header_value} = $unset_value;
|
||||
$unset_value ++;
|
||||
print $::DEBUG "\tKey [$csv_header_value] gets position [".$keys{$csv_header_value}."]\n" if ($::debug);
|
||||
print "\tKey [$csv_header_value] gets position [".$keys{$csv_header_value}."]\n" if ($::verbose > 1);
|
||||
}
|
||||
}
|
||||
|
||||
return %keys;
|
||||
}
|
||||
|
||||
sub error_check_keys
|
||||
{
|
||||
my($csv_header, $keys) = @_;
|
||||
|
||||
if ((keys %$keys) != @$csv_header) {
|
||||
print $::ERR "TOTAL WRONG COUNT: CSV header ".(keys %$keys)." vs Needed headers ".@$csv_header.": perhaps your input file is not fitting this?\n";
|
||||
print "TOTAL WRONG COUNT: CSV header ".(keys %$keys)." vs Needed headers ".@$csv_header.": perhaps your input file is not fitting this?\n";
|
||||
|
||||
# if there are more keys in CSV file, then in the header defined in here
|
||||
if ((keys %$keys) > @$csv_header) {
|
||||
print $::ERR "Listing Perl Header missing\n";
|
||||
print "Listing Perl Header missing\n";
|
||||
foreach my $key (keys %$keys) {
|
||||
print $::ERR "Missing in perl Header list: $key\n" if (!grep {$_ eq $key} @$csv_header);
|
||||
print "Missing in perl Header list: $key\n" if (!grep {$_ eq $key} @$csv_header);
|
||||
}
|
||||
# if more keys are in the header defined than in the csv file
|
||||
} else {
|
||||
print $::ERR "Listing CSV Header missing\n";
|
||||
print "Listing CSV Header missing\n";
|
||||
for (my $i = 0; $i < @$csv_header; $i ++) {
|
||||
print $::ERR "Missing in CSV file: ".$$csv_header[$i]."\n" if (!defined($$keys{$$csv_header[$i]}));
|
||||
print "Missing in CSV file: ".$$csv_header[$i]."\n" if (!defined($$keys{$$csv_header[$i]}));
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub clean_up_row
|
||||
{
|
||||
my ($row) = @_;
|
||||
|
||||
for (my $i = 0; $i < @$row; $i++) {
|
||||
# get rid of spaces at the end and at the beginning of each bloack
|
||||
$$row[$i] =~ s/^\s+//g;
|
||||
$$row[$i] =~ s/\s+$//g;
|
||||
# convert all half width Katakan to Full width Katakana
|
||||
$$row[$i] = Unicode::Japanese->new($$row[$i])->h2zKana->get;
|
||||
# need to decode the converted string, somehow Unicode::Japanese does not return proper utf8 if use utf8 is on
|
||||
utf8::decode($$row[$i]);
|
||||
}
|
||||
|
||||
return @$row;
|
||||
}
|
||||
|
||||
sub set_int_fields
|
||||
{
|
||||
my ($row, $keys, $int_fields) = @_;
|
||||
|
||||
# check ALL smallint/int/etc rows to be set to a number
|
||||
for (my $i = 0; $i < @$int_fields; $i++) {
|
||||
print "\t\tCheck ".$$int_fields[$i]." {".$$keys{$$int_fields[$i]}."} ... " if ($::verbose > 1);
|
||||
if (!$$row[$$keys{$$int_fields[$i]}]) {
|
||||
$$row[$$keys{$$int_fields[$i]}] = 0;
|
||||
}
|
||||
# if its filled, but not a digit, set to 1
|
||||
if ($$row[$$keys{$$int_fields[$i]}] =~ /\D/) {
|
||||
$$row[$$keys{$$int_fields[$i]}] = 1;
|
||||
}
|
||||
print "[".$$row[$$keys{$$int_fields[$i]}]."] [DONE]\n" if ($::verbose > 1);
|
||||
}
|
||||
return @$row;
|
||||
}
|
||||
|
||||
# formats a number with dots and ,
|
||||
sub format_number
|
||||
{
|
||||
my ($number) = @_;
|
||||
# dummy, does nothing now
|
||||
# should put . or , every 3 digits later
|
||||
return $number;
|
||||
}
|
||||
|
||||
# converts bytes to human readable format
|
||||
sub convert_number
|
||||
{
|
||||
my ($number) = @_;
|
||||
my $pos; # the original position in the labels array
|
||||
# divied number until its division would be < 1024. count that position for label usage
|
||||
for ($pos = 0; $number > 1024; $pos ++) {
|
||||
$number = $number / 1024;
|
||||
}
|
||||
# before we return it, we format it [rounded to 2 digits, if has decimals, else just int]
|
||||
# we add the right label to it and return
|
||||
return sprintf(!$pos ? '%d' : '%.2f', $number)." ".qw(B KB MB GB TB PB EB)[$pos];
|
||||
}
|
||||
|
||||
# make time from seconds string
|
||||
sub convert_time
|
||||
{
|
||||
my ($timestamp, $show_micro) = @_;
|
||||
my $ms = '';
|
||||
# cut of the ms, but first round them up to four
|
||||
$timestamp = sprintf("%.4f", $timestamp);
|
||||
# print "T: ".$timestamp."\n";
|
||||
($timestamp, $ms) = split(/\./, $timestamp);
|
||||
my @timegroups = ("86400", "3600", "60", "1");
|
||||
my @output = ();
|
||||
for (my $i = 0; $i < @timegroups; $i ++) {
|
||||
push(@output, floor($timestamp / $timegroups[$i]));
|
||||
$timestamp = $timestamp % $timegroups[$i];
|
||||
}
|
||||
# output has days|hours|min|sec
|
||||
return (($output[0]) ? $output[0]."d " : "").
|
||||
(($output[1] || $output[0]) ? $output[1]."h " : "").
|
||||
(($output[2] ||$output[1] || $output[0]) ? $output[2]."m " : "").
|
||||
$output[3]."s".
|
||||
(($show_micro) ? " ".((!$ms) ? 0 : $ms)."ms" : "");
|
||||
}
|
||||
|
||||
# get a timestamp and create a proper formated date/time field
|
||||
sub create_time
|
||||
{
|
||||
my ($timestamp, $show_micro) = @_;
|
||||
my $ms = '';
|
||||
$timestamp = 0 if (!$timestamp);
|
||||
# round ms to 4 numbers
|
||||
$timestamp = sprintf("%.4f", $timestamp);
|
||||
($timestamp, $ms) = split(/\./, $timestamp);
|
||||
# array for time
|
||||
my ($sec, $min, $hour, $day, $month, $year, $wday, $yday, $isdst) = localtime($timestamp);
|
||||
# year, month fix
|
||||
$year += 1900;
|
||||
$month += 1;
|
||||
# string for return
|
||||
return $year."-".
|
||||
($month < 10 ? '0'.$month : $month)."-".
|
||||
($day < 10 ? '0'.$day : $day)." ".
|
||||
($hour < 10 ? '0'.$hour : $hour).":".
|
||||
($min < 10 ? '0'.$min : $min).":".
|
||||
($sec < 10 ? '0'.$sec : $sec).
|
||||
(($ms && $show_micro) ? ".".$ms : "");
|
||||
}
|
||||
|
||||
# create YYYYMMDD data
|
||||
sub create_date
|
||||
{
|
||||
my ($timestamp, $split_string) = @_;
|
||||
my $split = $split_string ? $split_string : '';
|
||||
$timestamp = time() if (!$timestamp);
|
||||
# array for time
|
||||
my ($sec, $min, $hour, $day, $month, $year, $wday, $yday, $isdst) = localtime($timestamp);
|
||||
# year, month fix
|
||||
$year += 1900;
|
||||
$month += 1;
|
||||
# string for return
|
||||
return $year.$split.
|
||||
($month < 10 ? '0'.$month : $month).$split.
|
||||
($day < 10 ? '0'.$day : $day);
|
||||
}
|
||||
|
||||
# create YYYYMMDD_HHMMSS data
|
||||
sub create_datetime
|
||||
{
|
||||
my ($timestamp, $split_string) = @_;
|
||||
my $split = $split_string ? $split_string : '';
|
||||
$timestamp = time() if (!$timestamp);
|
||||
# array for time
|
||||
my ($sec, $min, $hour, $day, $month, $year, $wday, $yday, $isdst) = localtime($timestamp);
|
||||
# year, month fix
|
||||
$year += 1900;
|
||||
$month += 1;
|
||||
# string for return
|
||||
return $year.$split.
|
||||
($month < 10 ? '0'.$month : $month).$split.
|
||||
($day < 10 ? '0'.$day : $day).'_'.
|
||||
($hour < 10 ? '0'.$hour : $hour).$split.
|
||||
($min < 10 ? '0'.$min : $min).$split.
|
||||
($sec < 10 ? '0'.$sec : $sec);
|
||||
}
|
||||
|
||||
sub left_fill
|
||||
{
|
||||
my($number, $size, $char) = @_;
|
||||
return sprintf($char x ($size - length($number)).$number);
|
||||
}
|
||||
|
||||
# wrapper to flip the crc32 hex string, so it is like buggy php one (php <= 5.2.6)
|
||||
sub crc32b_fix
|
||||
{
|
||||
my ($crc) = @_;
|
||||
# left pad with 0 to 8 chars
|
||||
$crc = ('0' x (8 - length($crc))).$crc;
|
||||
# flip two chars (byte hex)
|
||||
$crc =~ s/^([a-z0-9]{2})([a-z0-9]{2})([a-z0-9]{2})([a-z0-9]{2})$/$4$3$2$1/;
|
||||
return $crc;
|
||||
}
|
||||
|
||||
# short sha1 (9 char) function
|
||||
sub sha1_short
|
||||
{
|
||||
my ($string) = @_;
|
||||
return substr(sha1_hex($string), 0, 9);
|
||||
}
|
||||
|
||||
# DEBUG helpers for dumping data
|
||||
# from: http://www.perlmonks.org/?node_id=390153
|
||||
# alternative use Dump::Dumper and print Dump(VAR);
|
||||
sub dump_data
|
||||
{
|
||||
my ($level, $base, $data) = @_;
|
||||
my $nextlevel = $level + 1;
|
||||
if (ref($data) eq 'ARRAY') {
|
||||
foreach my $k (0 .. $#{$data}) {
|
||||
my $baseval = $base.'['.$k.']';
|
||||
dump_it($nextlevel, $baseval, $data->[$k]);
|
||||
}
|
||||
} elsif (ref($data) eq 'HASH') {
|
||||
foreach my $k (sort(keys(%{$data}))) {
|
||||
my $baseval = $base.'{'.$k.'}';
|
||||
dump_it($nextlevel, $baseval, $data->{$k});
|
||||
}
|
||||
} elsif (ref($data) eq 'SCALAR') {
|
||||
my $baseval = $base;
|
||||
dump_it($nextlevel, $baseval, ${$data});
|
||||
}
|
||||
}
|
||||
|
||||
sub dump_it
|
||||
{
|
||||
my ($nextlevel, $baseval, $datum) = @_;
|
||||
my $reftype = ref($datum);
|
||||
if ($reftype eq 'HASH') {
|
||||
dump_data($nextlevel, $baseval, \%{$datum});
|
||||
} elsif ($reftype eq 'ARRAY') {
|
||||
dump_data($nextlevel, $baseval, \@{$datum});
|
||||
} else {
|
||||
process_data($nextlevel, $baseval, $datum);
|
||||
}
|
||||
}
|
||||
|
||||
sub process_data
|
||||
{
|
||||
my ($nextlevel, $baseval, $datum) = @_;
|
||||
my $indentation = ' ' x $nextlevel;
|
||||
print $indentation, $baseval, ' = ', $datum, "\n";
|
||||
}
|
||||
|
||||
# METHOD: lock_run
|
||||
# PARAMS: file (plus path) to lock to
|
||||
# the current running pid (if not given will be set in script)
|
||||
# the current name of the script (auto set if not given)
|
||||
# optional write encoding (set to utf8 if not given)
|
||||
# RETURN: nothing
|
||||
# DESC: checks if this script is already running based on the lock file, if if yes will abort
|
||||
# if file is there but pid not find it automatically cleans up the stale lock file
|
||||
sub lock_run
|
||||
{
|
||||
my ($file, $run_pid, $name, $encoding) = @_;
|
||||
# if no encoding, set utf8
|
||||
$encoding = 'utf8' if (!$encoding);
|
||||
# set the run pid if no pid is given
|
||||
$run_pid = $$ if (!$run_pid);
|
||||
# set the script base name
|
||||
$name = File::Basename::fileparse($0) if (!$name);
|
||||
# if lock file exists
|
||||
if (-f $file) {
|
||||
my $exists = 0;
|
||||
my $pid = `cat $file`;
|
||||
chomp($pid);
|
||||
# printDebug("Lock file found for $pid", 1);
|
||||
# check if process excists with this pid
|
||||
# better todo A for ALL processes
|
||||
# ps axu OR short ps a
|
||||
open(PS, 'ps axu|') || die("$!");
|
||||
while (<PS>) {
|
||||
# search for pid and run file name
|
||||
if ($_ =~ /\ $pid\ / && $_ =~ /$name/) {
|
||||
$exists = 1;
|
||||
}
|
||||
last if ($exists);
|
||||
}
|
||||
close(PS);
|
||||
if (!$exists) {
|
||||
# printDebug("Lock file cleaned up for $pid", 1);
|
||||
unlink($file);
|
||||
} else {
|
||||
die("Script is already running with PID $pid\n");
|
||||
}
|
||||
}
|
||||
# write current PID into lock file
|
||||
open(FP, '>:encoding('.$encoding.')', $file) || die ("Cannot open run lock file '$file' for writing\n");
|
||||
print FP $run_pid;
|
||||
close(FP);
|
||||
}
|
||||
|
||||
# METHOD: printDebug
|
||||
# PARAMS: message, verbose level
|
||||
# RETURN: nothing
|
||||
# DESC: depeding on the verbose and debug settings it will print out message and or write it to a debug file
|
||||
sub printDebug
|
||||
{
|
||||
my($msg, $vrb, $dbg) = @_;
|
||||
# print debug only if debug is on and debug file is available
|
||||
print $::DEBUG '['.create_time(time(), 1).'] '.$msg."\n" if ($::debug && $::DEBUG);
|
||||
# print to log if log is accessable and the verbose flag matches, or for debug flag if debug statement is set and not log only, or if log only, if not debug statement
|
||||
print $::LOG $msg."\n" if (($::verbose >= $vrb || (!$::log_only && $dbg && $::debug) || ($::log_only && !$dbg)) && $::LOG);
|
||||
# print to screen if verbose matches, but it is not a log only, or if it is debug statement and debug flag is set
|
||||
print $msg."\n" if (($::verbose >= $vrb && !$::log_only) || ($dbg && $::debug));
|
||||
}
|
||||
|
||||
# METHOD: waitAbort
|
||||
# PARAMS: time in seconds, if not provided set to 5
|
||||
# RETURN: nothing
|
||||
# DESC: simple prints out a char while waiting for an abort command
|
||||
sub waitAbort
|
||||
{
|
||||
my($sleep) = @_;
|
||||
$sleep = 5 if ($sleep !~ /\d/);
|
||||
print "Waiting $sleep seconds (Press CTRL + C to abort)\n";
|
||||
for (my $i = 1; $i <= $sleep; $i ++) {
|
||||
print ".";
|
||||
sleep 1;
|
||||
}
|
||||
print "\n\n";
|
||||
}
|
||||
|
||||
# METHOD: copyToTemporary
|
||||
# PARAMS: file to copy, and target file name
|
||||
# RETURN: the target file name
|
||||
# DESC : sets the source to read only and makes a copy, the copy is also set to read only
|
||||
sub copyToTemporary
|
||||
{
|
||||
my ($source, $target) = @_;
|
||||
# get the current rights
|
||||
my $current_chmod = (stat $source)[2];
|
||||
# set source file ARGV to read only
|
||||
# we skip that, the source might be NOT from the same user as the script read, just copy the file and set the target read only
|
||||
chmod(0444, $source);
|
||||
# create tmp backup file from which we read, data gets removed at the end of an run, or during an abort call
|
||||
copy($source, $target) || die("Copy failed: $!\n");
|
||||
# set read rights to r only for the copied file
|
||||
chmod(0444, $target);
|
||||
# set old access rights for ARGV file
|
||||
chmod($current_chmod, $source);
|
||||
# return target file name
|
||||
return $target;
|
||||
}
|
||||
|
||||
# METHOD: uniq
|
||||
# PARAMS: @array
|
||||
# RETURN: array with only unique entries
|
||||
# DESC : used in uniq(@array) to get only unique data back
|
||||
sub uniq
|
||||
{
|
||||
my %seen;
|
||||
grep !$seen{$_}++, @_;
|
||||
}
|
||||
|
||||
# METHOD: clean_test
|
||||
# PARAMS: array of data
|
||||
# RETURN: cleaned up array of data
|
||||
# DESC : sets all undefs to '' for debug output
|
||||
sub clean_test
|
||||
{
|
||||
my (@data) = @_;
|
||||
# map check for defined, if not, return ''
|
||||
return map { defined($_) ? $_ : '' } @data;
|
||||
}
|
||||
|
||||
# METHOD: clean_test_string
|
||||
# PARAMS: string to be checked
|
||||
# RETURN: data or empty for output
|
||||
# DESC : sets all input data to '' if it is undefined
|
||||
sub clean_test_string
|
||||
{
|
||||
my ($data) = @_;
|
||||
return defined($data) ? $data : '';
|
||||
}
|
||||
|
||||
1;
|
||||
@@ -24,12 +24,10 @@ if (!defined('SET_SESSION_NAME')) {
|
||||
}
|
||||
// define log file id
|
||||
$LOG_FILE_ID = 'classTest';
|
||||
// set language for l10n
|
||||
$lang = 'en_utf8';
|
||||
|
||||
// init login & backend class
|
||||
$login = new CoreLibs\ACL\Login(DB_CONFIG, $lang);
|
||||
$basic = new CoreLibs\Admin\Backend(DB_CONFIG, $lang);
|
||||
$login = new CoreLibs\ACL\Login(DB_CONFIG);
|
||||
$basic = new CoreLibs\Admin\Backend(DB_CONFIG);
|
||||
$basic->dbInfo(true);
|
||||
ob_end_flush();
|
||||
|
||||
@@ -226,6 +224,13 @@ if (round($timestamp, 4) == $basic->stringToTime($time_string)) {
|
||||
} else {
|
||||
print "REVERSE TRIME STRING DO NOT MATCH<br>";
|
||||
}
|
||||
print "ZERO TIME STRING: ".$basic->timeStringFormat(0, true)."<br>";
|
||||
print "ZERO TIME STRING: ".$basic->timeStringFormat(0.0, true)."<br>";
|
||||
print "ZERO TIME STRING: ".$basic->timeStringFormat(1.005, true)."<br>";
|
||||
|
||||
echo "HTML ENT INT: ".$basic->htmlent(5)."<br>";
|
||||
echo "HTML ENT STRING: ".$basic->htmlent('5<<>')."<br>";
|
||||
echo "HTML ENT NULL: ".$basic->htmlent(null)."<br>";
|
||||
|
||||
// magic links test
|
||||
print $basic->magicLinks('user@bubu.at').'<br>';
|
||||
@@ -256,30 +261,79 @@ echo "SOURCE ARRAY: ".$basic->printAr($test_array)."<br>";
|
||||
echo "FOUND ELEMENTS [base]: ".$basic->printAr($basic->arraySearchRecursive('email', $test_array, 'type'))."<br>";
|
||||
echo "FOUND ELEMENTS [input]: ".$basic->printAr($basic->arraySearchRecursive('email', $test_array['input'], 'type'))."<br>";
|
||||
|
||||
// *** BYTES TEST ***
|
||||
$bytes = array(
|
||||
-123123123,
|
||||
999999, // KB-1
|
||||
999999999, // MB-1
|
||||
254779258, // MB-n
|
||||
999999999999999, // TB-1
|
||||
588795544887632, // TB-n
|
||||
999999999999999999, // PB-1
|
||||
9223372036854775807, // MAX INT
|
||||
999999999999999999999, // EB-1
|
||||
);
|
||||
print "<b>BYTE FORMAT TESTS</b><br>";
|
||||
foreach ($bytes as $byte) {
|
||||
print '<div style="display: flex; border-bottom: 1px dashed gray;">';
|
||||
//
|
||||
print '<div style="width: 35%; text-align: right; padding-right: 2px;">';
|
||||
print "(".number_format($byte)."/".$byte.") bytes :";
|
||||
print '</div><div style="width: 40%;">';
|
||||
print $basic->humanReadableByteFormat($byte);
|
||||
print "</div>";
|
||||
//
|
||||
print "</div>";
|
||||
//
|
||||
print '<div style="display: flex; border-bottom: 1px dotted red;">';
|
||||
//
|
||||
print '<div style="width: 35%; text-align: right; padding-right: 2px;">';
|
||||
print "bytes [si]:";
|
||||
print '</div><div style="width: 40%;">';
|
||||
// print $basic->byteStringFormat($byte, true, false, true);
|
||||
print $basic->humanReadableByteFormat($byte, $basic::BYTE_FORMAT_SI);
|
||||
print "</div>";
|
||||
//
|
||||
print "</div>";
|
||||
}
|
||||
|
||||
|
||||
// *** IMAGE TESTS ***
|
||||
echo "<hr>";
|
||||
// image thumbnail
|
||||
$images = array(
|
||||
// height bigger
|
||||
// BASE.LAYOUT.CONTENT_PATH.IMAGES.'no_picture.jpg',
|
||||
// BASE.LAYOUT.CONTENT_PATH.IMAGES.'no_picture.png',
|
||||
// 'no_picture.jpg',
|
||||
// 'no_picture.png',
|
||||
// width bigger
|
||||
// BASE.LAYOUT.CONTENT_PATH.IMAGES.'no_picture_width_bigger.jpg',
|
||||
// BASE.LAYOUT.CONTENT_PATH.IMAGES.'no_picture_width_bigger.png',
|
||||
// 'no_picture_width_bigger.jpg',
|
||||
// 'no_picture_width_bigger.png',
|
||||
// square
|
||||
// BASE.LAYOUT.CONTENT_PATH.IMAGES.'no_picture_square.jpg',
|
||||
// BASE.LAYOUT.CONTENT_PATH.IMAGES.'no_picture_square.png',
|
||||
// 'no_picture_square.jpg',
|
||||
// 'no_picture_square.png',
|
||||
// other sample images
|
||||
BASE.LAYOUT.CONTENT_PATH.IMAGES.'5c501af48da6c.jpg'
|
||||
// '5c501af48da6c.jpg',
|
||||
// Apple HEIC files
|
||||
// 'img_2145.heic',
|
||||
// Photoshop
|
||||
'photoshop_test.psd',
|
||||
);
|
||||
echo "<hr>";
|
||||
$thumb_width = 250;
|
||||
$thumb_height = 250;
|
||||
$thumb_height = 300;
|
||||
// return mime type ala mimetype
|
||||
$finfo = new finfo(FILEINFO_MIME_TYPE);
|
||||
foreach ($images as $image) {
|
||||
$image = BASE.LAYOUT.CONTENT_PATH.IMAGES.$image;
|
||||
list ($height, $width, $img_type) = getimagesize($image);
|
||||
echo "<div>IMAGE INFO: ".$height."x".$width.", TYPE: ".$img_type." [".$finfo->file($image)."]</div>";
|
||||
// rotate image first
|
||||
$basic->correctImageOrientation($image);
|
||||
// thumbnail tests
|
||||
echo "<div>".basename($image).": WIDTH: $thumb_width<br><img src=".$basic->createThumbnailSimple($image, $thumb_width)."></div>";
|
||||
echo "<div>".basename($image).": HEIGHT: $thumb_height<br><img src=".$basic->createThumbnailSimple($image, 0, $thumb_height)."></div>";
|
||||
echo "<div>".basename($image).": WIDTH/HEIGHT: $thumb_width x $thumb_height<br><img src=".$basic->createThumbnailSimple($image, $thumb_width, $thumb_height)."></div>";
|
||||
// test with dummy
|
||||
echo "<div>".basename($image).": WIDTH/HEIGHT: $thumb_width x $thumb_height (+DUMMY)<br><img src=".$basic->createThumbnailSimple($image, $thumb_width, $thumb_height, null, true, false)."></div>";
|
||||
echo "<hr>";
|
||||
}
|
||||
|
||||
|
||||
@@ -14,16 +14,15 @@ $SET_SESSION_NAME = EDIT_SESSION_NAME;
|
||||
|
||||
echo "DIR: ".DIR."<br>ROOT: ".ROOT."<br>BASE: ".BASE."<br>";
|
||||
|
||||
$lang = 'ja_utf8';
|
||||
$base = new CoreLibs\Admin\Backend(DB_CONFIG, $lang);
|
||||
$base = new CoreLibs\Admin\Backend(DB_CONFIG);
|
||||
ob_end_flush();
|
||||
if ($base->getConnectionStatus()) {
|
||||
die("Cannot connect to database");
|
||||
}
|
||||
|
||||
print "Start time: ".$base->runningTime()."<br>";
|
||||
print "ByteStringFormat: ".$base->ByteStringFormat(1234567.12)."<br>";
|
||||
print "byteStringFormat: ".$base->byteStringFormat(1234567.12)."<br>";
|
||||
print "HumanReadableByteFormat: ".$base->HumanReadableByteFormat(1234567.12)."<br>";
|
||||
print "humanReadableByteFormat: ".$base->humanReadableByteFormat(1234567.12)."<br>";
|
||||
// print "get_page_name [DEPRECATED]: ".$base->get_page_name()."<br>";
|
||||
print "getPageName: ".$base->getPageName()."<br>";
|
||||
|
||||
|
||||
@@ -10,24 +10,28 @@ define('USE_DATABASE', true);
|
||||
define('USE_HEADER', true);
|
||||
require 'config.php';
|
||||
require BASE.INCLUDES.'admin_header.php';
|
||||
$MASTER_TEMPLATE_NAME = 'main_body.tpl';
|
||||
$TEMPLATE_NAME = 'smarty_test.tpl';
|
||||
$CSS_NAME = 'smart_test.css';
|
||||
$USE_PROTOTYPE = false;
|
||||
$USE_JQUERY = true;
|
||||
$JS_DATEPICKR = false;
|
||||
if ($USE_PROTOTYPE) {
|
||||
$ADMIN_JAVASCRIPT = 'edit.pt.js';
|
||||
$JS_NAME = 'prototype.test.js';
|
||||
} elseif ($USE_JQUERY) {
|
||||
$ADMIN_JAVASCRIPT = 'edit.jq.js';
|
||||
$JS_NAME = 'jquery.test.js';
|
||||
}
|
||||
$PAGE_WIDTH = "100%";
|
||||
require BASE.INCLUDES.'admin_set_paths.php';
|
||||
if (is_object($smarty)) {
|
||||
$smarty->MASTER_TEMPLATE_NAME = 'main_body.tpl';
|
||||
$smarty->TEMPLATE_NAME = 'smarty_test.tpl';
|
||||
$smarty->CSS_SPECIAL_TEMPLATE_NAME = 'smart_test.css';
|
||||
$smarty->USE_PROTOTYPE = false;
|
||||
$smarty->USE_JQUERY = true;
|
||||
$smarty->JS_DATEPICKR = false;
|
||||
if ($smarty->USE_PROTOTYPE) {
|
||||
$smarty->ADMIN_JAVASCRIPT = 'edit.pt.js';
|
||||
$smarty->JS_SPECIAL_TEMPLATE_NAME = 'prototype.test.js';
|
||||
} elseif ($smarty->USE_JQUERY) {
|
||||
$smarty->ADMIN_JAVASCRIPT = 'edit.jq.js';
|
||||
$smarty->JS_SPECIAL_TEMPLATE_NAME = 'jquery.test.js';
|
||||
}
|
||||
$smarty->PAGE_WIDTH = '100%';
|
||||
// require BASE.INCLUDES.'admin_set_paths.php';
|
||||
$smarty->setSmartyPaths();
|
||||
|
||||
// smarty test
|
||||
$cms->DATA['SMARTY_TEST'] = 'Test Data';
|
||||
// smarty test
|
||||
$smarty->DATA['SMARTY_TEST'] = 'Test Data';
|
||||
$smarty->DATA['TRANSLATE_TEST'] = $cms->l->__('Are we translated?');
|
||||
}
|
||||
|
||||
// drop down test with optgroups
|
||||
$options = array (
|
||||
@@ -46,7 +50,9 @@ $options = array (
|
||||
)
|
||||
);
|
||||
|
||||
$cms->DATA['drop_down_test'] = $options;
|
||||
|
||||
require BASE.INCLUDES.'admin_smarty.php';
|
||||
if (is_object($smarty)) {
|
||||
$smarty->DATA['drop_down_test'] = $options;
|
||||
// require BASE.INCLUDES.'admin_smarty.php';
|
||||
$smarty->setSmartyVarsAdmin();
|
||||
}
|
||||
require BASE.INCLUDES.'admin_footer.php';
|
||||
|
||||
@@ -9,146 +9,146 @@
|
||||
|
||||
/************* PATHS *********************/
|
||||
// directory seperator
|
||||
DEFINE('DS', DIRECTORY_SEPARATOR);
|
||||
define('DS', DIRECTORY_SEPARATOR);
|
||||
// ** NEW/BETTER DIR DECLARATIONS **
|
||||
// path to original file (if symlink)
|
||||
DEFINE('DIR', __DIR__.DS);
|
||||
define('DIR', __DIR__.DS);
|
||||
// base dir root folder level
|
||||
DEFINE('BASE', str_replace('/configs', '', __DIR__).DS);
|
||||
define('BASE', str_replace('/configs', '', __DIR__).DS);
|
||||
|
||||
// ** OLD DIR DECLARATIONS **
|
||||
// path to document root of file called
|
||||
DEFINE('ROOT', getcwd().DS);
|
||||
define('ROOT', getcwd().DS);
|
||||
// libs path
|
||||
DEFINE('LIB', 'lib'.DS);
|
||||
DEFINE('LIBS', 'lib'.DS);
|
||||
define('LIB', 'lib'.DS);
|
||||
define('LIBS', 'lib'.DS);
|
||||
// configs folder
|
||||
DEFINE('CONFIGS', 'configs'.DS);
|
||||
define('CONFIGS', 'configs'.DS);
|
||||
// includes (strings, arrays for static, etc)
|
||||
DEFINE('INCLUDES', 'includes'.DS);
|
||||
define('INCLUDES', 'includes'.DS);
|
||||
// data folder (mostly in includes)
|
||||
DEFINE('DATA', 'data'.DS);
|
||||
define('DATA', 'data'.DS);
|
||||
// layout base path
|
||||
DEFINE('LAYOUT', 'layout'.DS);
|
||||
define('LAYOUT', 'layout'.DS);
|
||||
// pic-root (compatible to CMS)
|
||||
DEFINE('PICTURES', 'images'.DS);
|
||||
define('PICTURES', 'images'.DS);
|
||||
// images
|
||||
DEFINE('IMAGES', 'images'.DS);
|
||||
define('IMAGES', 'images'.DS);
|
||||
// icons (below the images/ folder)
|
||||
DEFINE('ICONS', 'icons'.DS);
|
||||
define('ICONS', 'icons'.DS);
|
||||
// media
|
||||
DEFINE('MEDIA', 'media'.DS);
|
||||
define('MEDIA', 'media'.DS);
|
||||
// flash-root (below media)
|
||||
DEFINE('FLASH', 'flash'.DS);
|
||||
define('FLASH', 'flash'.DS);
|
||||
// uploads (anything to keep)
|
||||
DEFINE('UPLOADS', 'uploads'.DS);
|
||||
define('UPLOADS', 'uploads'.DS);
|
||||
// files (binaries) (below media)
|
||||
DEFINE('BINARIES', 'binaries'.DS);
|
||||
define('BINARIES', 'binaries'.DS);
|
||||
// files (videos) (below media)
|
||||
DEFINE('VIDEOS', 'videos'.DS);
|
||||
define('VIDEOS', 'videos'.DS);
|
||||
// files (documents) (below media)
|
||||
DEFINE('DOCUMENTS', 'documents'.DS);
|
||||
define('DOCUMENTS', 'documents'.DS);
|
||||
// files (pdfs) (below media)
|
||||
DEFINE('PDFS', 'documents'.DS);
|
||||
define('PDFS', 'documents'.DS);
|
||||
// CSV
|
||||
DEFINE('CSV', 'csv'.DS);
|
||||
define('CSV', 'csv'.DS);
|
||||
// css
|
||||
DEFINE('CSS', 'css'.DS);
|
||||
define('CSS', 'css'.DS);
|
||||
// font (web)
|
||||
define('FONT', 'font'.DS);
|
||||
// js
|
||||
DEFINE('JS', 'javascript'.DS);
|
||||
define('JS', 'javascript'.DS);
|
||||
// table arrays
|
||||
DEFINE('TABLE_ARRAYS', 'table_arrays'.DS);
|
||||
define('TABLE_ARRAYS', 'table_arrays'.DS);
|
||||
// smarty libs path
|
||||
DEFINE('SMARTY', 'Smarty'.DS);
|
||||
define('SMARTY', 'Smarty'.DS);
|
||||
// po langs
|
||||
DEFINE('LANG', 'lang'.DS);
|
||||
define('LANG', 'lang'.DS);
|
||||
// cache path
|
||||
DEFINE('CACHE', 'cache'.DS);
|
||||
define('CACHE', 'cache'.DS);
|
||||
// temp path
|
||||
DEFINE('TMP', 'tmp'.DS);
|
||||
define('TMP', 'tmp'.DS);
|
||||
// log files
|
||||
DEFINE('LOG', 'log'.DS);
|
||||
define('LOG', 'log'.DS);
|
||||
// compiled template folder
|
||||
DEFINE('TEMPLATES_C', 'templates_c'.DS);
|
||||
define('TEMPLATES_C', 'templates_c'.DS);
|
||||
// template base
|
||||
DEFINE('TEMPLATES', 'templates'.DS);
|
||||
define('TEMPLATES', 'templates'.DS);
|
||||
|
||||
/************* HASH / ACL DEFAULT / ERROR SETTINGS / SMARTY *************/
|
||||
// default hash type
|
||||
DEFINE('DEFAULT_HASH', 'sha256');
|
||||
define('DEFAULT_HASH', 'sha256');
|
||||
// default acl level
|
||||
DEFINE('DEFAULT_ACL_LEVEL', 80);
|
||||
// default levels for certain actions
|
||||
/* DEFINE('DEFAULT_ACL_READ', 20);
|
||||
DEFINE('DEFAULT_ACL_CONFIRM', 35);
|
||||
DEFINE('DEFAULT_ACL_MOD', 40);
|
||||
DEFINE('DEFAULT_ACL_WRITE', 60);
|
||||
DEFINE('DEFAULT_ACL_SEND', 70);
|
||||
DEFINE('DEFAULT_ACL_DEL', 80);
|
||||
DEFINE('DEFAULT_ACL_ADMIN', 100); */
|
||||
define('DEFAULT_ACL_LEVEL', 80);
|
||||
// SSL host name
|
||||
// DEFINE('SSL_HOST', 'ssl.host.name');
|
||||
// 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
|
||||
// 3: if default template is not found, show error template, do not fall back to default tree
|
||||
// 4: very strict, even on normal fixable errors through error
|
||||
// DEFINE('ERROR_STRICT', 3);
|
||||
// define('ERROR_STRICT', 3);
|
||||
// allow page caching in general, set to 'FALSE' if you do debugging or development!
|
||||
// DEFINE('ALLOW_SMARTY_CACHE', FALSE);
|
||||
// define('ALLOW_SMARTY_CACHE', false);
|
||||
// cache life time, in second', default here is 2 days (172800s)
|
||||
// -1 is never expire cache
|
||||
// DEFINE('SMARTY_CACHE_LIFETIME', -1);
|
||||
// define('SMARTY_CACHE_LIFETIME', -1);
|
||||
|
||||
/************* LOGOUT ********************/
|
||||
// logout target
|
||||
DEFINE('LOGOUT_TARGET', '');
|
||||
define('LOGOUT_TARGET', '');
|
||||
// password change allowed
|
||||
DEFINE('PASSWORD_CHANGE', false);
|
||||
DEFINE('PASSWORD_FORGOT', false);
|
||||
define('PASSWORD_CHANGE', false);
|
||||
define('PASSWORD_FORGOT', false);
|
||||
// min/max password length
|
||||
DEFINE('PASSWORD_MIN_LENGTH', 8);
|
||||
DEFINE('PASSWORD_MAX_LENGTH', 255);
|
||||
define('PASSWORD_MIN_LENGTH', 8);
|
||||
define('PASSWORD_MAX_LENGTH', 255);
|
||||
|
||||
/************* AJAX / ACCESS *************/
|
||||
// ajax request type
|
||||
DEFINE('AJAX_REQUEST_TYPE', 'POST');
|
||||
define('AJAX_REQUEST_TYPE', 'POST');
|
||||
// what AJAX type to use
|
||||
DEFINE('USE_PROTOTYPE', false);
|
||||
DEFINE('USE_SCRIPTACULOUS', false);
|
||||
DEFINE('USE_JQUERY', true);
|
||||
define('USE_PROTOTYPE', false);
|
||||
define('USE_SCRIPTACULOUS', false);
|
||||
define('USE_JQUERY', true);
|
||||
|
||||
/************* LAYOUT WIDTHS *************/
|
||||
DEFINE('PAGE_WIDTH', 800);
|
||||
define('PAGE_WIDTH', 800);
|
||||
define('CONTENT_WIDTH', 800);
|
||||
// the default template name
|
||||
DEFINE('MASTER_TEMPLATE_NAME', 'main_body.tpl');
|
||||
define('MASTER_TEMPLATE_NAME', 'main_body.tpl');
|
||||
|
||||
/************* OVERALL CONTROL NAMES *************/
|
||||
// BELOW has HAS to be changed
|
||||
// base name for all session and log names
|
||||
define('BASE_NAME', 'CoreLibs');
|
||||
|
||||
/************* SESSION NAMES *************/
|
||||
// base name
|
||||
DEFINE('BASE_NAME', 'CoreLibs');
|
||||
// server name HASH
|
||||
DEFINE('SERVER_NAME_HASH', hash('crc32b', $_SERVER['HTTP_HOST']));
|
||||
DEFINE('SERVER_PATH_HASH', hash('crc32b', BASE));
|
||||
define('SERVER_NAME_HASH', hash('crc32b', $_SERVER['HTTP_HOST']));
|
||||
define('SERVER_PATH_HASH', hash('crc32b', BASE));
|
||||
// backend
|
||||
DEFINE('EDIT_SESSION_NAME', BASE_NAME.'Admin'.SERVER_NAME_HASH.SERVER_PATH_HASH);
|
||||
define('EDIT_SESSION_NAME', BASE_NAME.'Admin'.SERVER_NAME_HASH.SERVER_PATH_HASH);
|
||||
// frontend
|
||||
DEFINE('SESSION_NAME', BASE_NAME.SERVER_NAME_HASH.SERVER_PATH_HASH);
|
||||
define('SESSION_NAME', BASE_NAME.SERVER_NAME_HASH.SERVER_PATH_HASH);
|
||||
// SET_SESSION_NAME should be set in the header if a special session name is needed
|
||||
DEFINE('SET_SESSION_NAME', SESSION_NAME);
|
||||
define('SET_SESSION_NAME', SESSION_NAME);
|
||||
|
||||
/************* CACHE/COMPILE IDS *************/
|
||||
DEFINE('CACHE_ID', 'CACHE_'.BASE_NAME.'_'.SERVER_NAME_HASH);
|
||||
DEFINE('COMPILE_ID', 'COMPILE_'.BASE_NAME.'_'.SERVER_NAME_HASH);
|
||||
define('CACHE_ID', 'CACHE_'.BASE_NAME.'_'.SERVER_NAME_HASH);
|
||||
define('COMPILE_ID', 'COMPILE_'.BASE_NAME.'_'.SERVER_NAME_HASH);
|
||||
|
||||
/************* LANGUAGE / ENCODING *******/
|
||||
DEFINE('DEFAULT_LANG', 'en_utf8');
|
||||
define('DEFAULT_LANG', 'en_utf8');
|
||||
// default web page encoding setting
|
||||
DEFINE('DEFAULT_ENCODING', 'UTF-8');
|
||||
define('DEFAULT_ENCODING', 'UTF-8');
|
||||
|
||||
/************* LOGGING *******************/
|
||||
// below two can be defined here, but they should be
|
||||
// defined in either the header file or the file itself
|
||||
/************* LOGGING *******************/
|
||||
DEFINE('LOG_FILE_ID', '');
|
||||
// as $LOG_FILE_ID which takes presence over LOG_FILE_ID
|
||||
// see Basic class constructor
|
||||
define('LOG_FILE_ID', BASE_NAME);
|
||||
|
||||
/************* CLASS ERRORS *******************/
|
||||
// 0 = default all OFF
|
||||
@@ -161,14 +161,14 @@ define('CLASS_VARIABLE_ERROR_MODE', 3);
|
||||
// if we have a dev/live system
|
||||
// set_live is a per page/per item
|
||||
// live_queue is a global queue system
|
||||
// DEFINE('QUEUE', 'live_queue');
|
||||
// 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');
|
||||
DEFINE('LIVE_SCHEMA', 'public');
|
||||
define('PUBLIC_SCHEMA', 'public');
|
||||
define('DEV_SCHEMA', 'public');
|
||||
define('TEST_SCHEMA', 'public');
|
||||
define('LIVE_SCHEMA', 'public');
|
||||
|
||||
/************* CORE HOST SETTINGS *****************/
|
||||
if (file_exists(BASE.CONFIGS.'config.host.php')) {
|
||||
@@ -189,12 +189,13 @@ if (file_exists(BASE.CONFIGS.'config.path.php')) {
|
||||
require BASE.CONFIGS.'config.path.php';
|
||||
}
|
||||
|
||||
/************* MASTER INIT *****************/
|
||||
// live frontend pages
|
||||
// ** missing live domains **
|
||||
// get the name without the port
|
||||
list($HOST_NAME) = array_pad(explode(':', $_SERVER['HTTP_HOST'], 2), 2, null);
|
||||
// set HOST name
|
||||
DEFINE('HOST_NAME', $HOST_NAME);
|
||||
define('HOST_NAME', $HOST_NAME);
|
||||
// BAIL ON MISSING MASTER SITE CONFIG
|
||||
if (!isset($SITE_CONFIG[HOST_NAME]['location'])) {
|
||||
echo 'Missing SITE_CONFIG entry for: "'.HOST_NAME.'". Contact Administrator';
|
||||
@@ -219,61 +220,50 @@ if ((!isset($SITE_CONFIG[HOST_NAME]['db_host']) && count($DB_CONFIG)) ||
|
||||
// set SSL on
|
||||
if ((array_key_exists('HTTPS', $_SERVER) && !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ||
|
||||
$_SERVER['SERVER_PORT'] == 443) {
|
||||
DEFINE('HOST_SSL', true);
|
||||
DEFINE('HOST_PROTOCOL', 'https://');
|
||||
define('HOST_SSL', true);
|
||||
define('HOST_PROTOCOL', 'https://');
|
||||
} else {
|
||||
DEFINE('HOST_SSL', false);
|
||||
DEFINE('HOST_PROTOCOL', 'http://');
|
||||
define('HOST_SSL', false);
|
||||
define('HOST_PROTOCOL', 'http://');
|
||||
}
|
||||
// define the db config set name, the db config and the db schema
|
||||
DEFINE('DB_CONFIG_NAME', $SITE_CONFIG[HOST_NAME]['db_host']);
|
||||
DEFINE('DB_CONFIG', isset($DB_CONFIG[DB_CONFIG_NAME]) ? $DB_CONFIG[DB_CONFIG_NAME] : array());
|
||||
// DEFINE('DB_CONFIG_TARGET', SITE_CONFIG[$HOST_NAME]['db_host_target']);
|
||||
// DEFINE('DB_CONFIG_OTHER', SITE_CONFIG[$HOST_NAME]['db_host_other']);
|
||||
define('DB_CONFIG_NAME', $SITE_CONFIG[HOST_NAME]['db_host']);
|
||||
define('DB_CONFIG', isset($DB_CONFIG[DB_CONFIG_NAME]) ? $DB_CONFIG[DB_CONFIG_NAME] : array());
|
||||
// define('DB_CONFIG_TARGET', SITE_CONFIG[$HOST_NAME]['db_host_target']);
|
||||
// define('DB_CONFIG_OTHER', SITE_CONFIG[$HOST_NAME]['db_host_other']);
|
||||
// override for login and global schemas
|
||||
// DEFINE('LOGIN_DB_SCHEMA', PUBLIC_SCHEMA); // where the edit* tables are
|
||||
// DEFINE('GLOBAL_DB_SCHEMA', PUBLIC_SCHEMA); // where global tables are that are used by all schemas (eg queue tables for online, etc)
|
||||
// define('LOGIN_DB_SCHEMA', PUBLIC_SCHEMA); // where the edit* tables are
|
||||
// define('GLOBAL_DB_SCHEMA', PUBLIC_SCHEMA); // where global tables are that are used by all schemas (eg queue tables for online, etc)
|
||||
// debug settings, site lang, etc
|
||||
DEFINE('TARGET', $SITE_CONFIG[HOST_NAME]['location']);
|
||||
DEFINE('DEBUG', $SITE_CONFIG[HOST_NAME]['debug_flag']);
|
||||
DEFINE('SITE_LANG', $SITE_CONFIG[HOST_NAME]['site_lang']);
|
||||
DEFINE('LOGIN_ENABLED', $SITE_CONFIG[HOST_NAME]['login_enabled']);
|
||||
define('TARGET', $SITE_CONFIG[HOST_NAME]['location']);
|
||||
define('DEBUG', $SITE_CONFIG[HOST_NAME]['debug_flag']);
|
||||
define('SITE_LANG', $SITE_CONFIG[HOST_NAME]['site_lang']);
|
||||
define('LOGIN_ENABLED', $SITE_CONFIG[HOST_NAME]['login_enabled']);
|
||||
// paths
|
||||
// DEFINE('CSV_PATH', $PATHS[TARGET]['csv_path']);
|
||||
// DEFINE('EXPORT_SCRIPT', $PATHS[TARGET]['perl_bin']);
|
||||
// DEFINE('REDIRECT_URL', $PATHS[TARGET]['redirect_url']);
|
||||
// define('CSV_PATH', $PATHS[TARGET]['csv_path']);
|
||||
// define('EXPORT_SCRIPT', $PATHS[TARGET]['perl_bin']);
|
||||
// define('REDIRECT_URL', $PATHS[TARGET]['redirect_url']);
|
||||
|
||||
// show all errors if debug_all & show_error_handling are enabled
|
||||
DEFINE('SHOW_ALL_ERRORS', true);
|
||||
define('SHOW_ALL_ERRORS', true);
|
||||
|
||||
/************* GENERAL PAGE TITLE ********/
|
||||
DEFINE('G_TITLE', '<OVERALL FALLBACK PAGE TITLE>');
|
||||
define('G_TITLE', '<OVERALL FALLBACK PAGE TITLE>');
|
||||
|
||||
/************ STYLE SHEETS / JS **********/
|
||||
DEFINE('ADMIN_STYLESHEET', 'edit.css');
|
||||
DEFINE('ADMIN_JAVASCRIPT', 'edit.js');
|
||||
DEFINE('STYLESHEET', 'frontend.css');
|
||||
DEFINE('JAVASCRIPT', 'frontend.js');
|
||||
define('ADMIN_STYLESHEET', 'edit.css');
|
||||
define('ADMIN_JAVASCRIPT', 'edit.js');
|
||||
define('STYLESHEET', 'frontend.css');
|
||||
define('JAVASCRIPT', 'frontend.js');
|
||||
|
||||
// anything optional
|
||||
/************* INTERNAL ******************/
|
||||
// any other global definitons here
|
||||
// DEFINE('SOME_ID', <SOME VALUE>);
|
||||
|
||||
/************* CONVERT *******************/
|
||||
$paths = array(
|
||||
'/bin',
|
||||
'/usr/bin',
|
||||
'/usr/local/bin'
|
||||
);
|
||||
// find convert
|
||||
foreach ($paths as $path) {
|
||||
if (file_exists($path.DS.'convert') && is_file($path.DS.'convert')) {
|
||||
// image magick convert location
|
||||
DEFINE('CONVERT', $path.DS.'convert');
|
||||
}
|
||||
// any other global definitons in the config.other.php
|
||||
if (file_exists(BASE.CONFIGS.'config.other.php')) {
|
||||
require BASE.CONFIGS.'config.other.php';
|
||||
}
|
||||
|
||||
/************* DEBUG *******************/
|
||||
// turn off debug if debug flag is OFF
|
||||
if (defined('DEBUG') && DEBUG == false) {
|
||||
$ECHO_ALL = false;
|
||||
@@ -291,6 +281,7 @@ if (defined('DEBUG') && DEBUG == false) {
|
||||
$DEBUG_ALL_OVERRIDE = false;
|
||||
}
|
||||
|
||||
/************* AUTO LOADER *******************/
|
||||
// read auto loader
|
||||
require BASE.LIB.'autoloader.php';
|
||||
|
||||
|
||||
28
www/configs/config.other.php
Executable file
28
www/configs/config.other.php
Executable file
@@ -0,0 +1,28 @@
|
||||
<?php declare(strict_types=1);
|
||||
/********************************************************************
|
||||
* AUTHOR: Clemens Schwaighofer
|
||||
* CREATED: 2019/10/28
|
||||
* SHORT DESCRIPTION:
|
||||
* other global constant variables
|
||||
* HISTORY:
|
||||
*********************************************************************/
|
||||
|
||||
// DEFINE('SOME_ID', <SOME VALUE>);
|
||||
|
||||
/************* CONVERT *******************/
|
||||
// this only needed if the external thumbnail create is used
|
||||
$paths = array(
|
||||
'/bin',
|
||||
'/usr/bin',
|
||||
'/usr/local/bin'
|
||||
);
|
||||
// find convert
|
||||
foreach ($paths as $path) {
|
||||
if (file_exists($path.DS.'convert') && is_file($path.DS.'convert')) {
|
||||
// image magick convert location
|
||||
DEFINE('CONVERT', $path.DS.'convert');
|
||||
}
|
||||
}
|
||||
unset($paths);
|
||||
|
||||
// __END__
|
||||
@@ -13,10 +13,9 @@ if ($DEBUG_ALL && $ENABLE_ERROR_HANDLING) {
|
||||
include BASE.LIBS."Error.Handling.php";
|
||||
}
|
||||
// predefine vars
|
||||
$lang = '';
|
||||
$messages = array();
|
||||
// import all POST vars
|
||||
extract($_POST, EXTR_SKIP);
|
||||
// extract($_POST, EXTR_SKIP);
|
||||
//------------------------------ variable init end
|
||||
|
||||
//------------------------------ library include start
|
||||
@@ -24,6 +23,7 @@ extract($_POST, EXTR_SKIP);
|
||||
ob_start();
|
||||
// set the session name
|
||||
$SET_SESSION_NAME = EDIT_SESSION_NAME;
|
||||
$LOG_FILE_ID = BASE_NAME.'Admin';
|
||||
//------------------------------ library include end
|
||||
|
||||
//------------------------------ basic variable settings start
|
||||
@@ -34,18 +34,12 @@ if (!isset($ZIP_STREAM)) {
|
||||
$ZIP_STREAM = false;
|
||||
}
|
||||
// set encoding
|
||||
if (!isset($encoding)) {
|
||||
$encoding = DEFAULT_ENCODING;
|
||||
}
|
||||
// set the default lang, if not given
|
||||
if (session_id() && $_SESSION['DEFAULT_LANG']) {
|
||||
$lang = $_SESSION['DEFAULT_LANG'];
|
||||
} elseif (!$lang) {
|
||||
$lang = defined('SITE_LANG') ? SITE_LANG : DEFAULT_LANG;
|
||||
if (!isset($ENCODING) || !$ENCODING) {
|
||||
$ENCODING = DEFAULT_ENCODING;
|
||||
}
|
||||
// end the stop of the output flow, but only if we didn't request a csv file download
|
||||
if (isset($_POST['action']) && $_POST['action'] != 'download_csv' && !$AJAX_PAGE) {
|
||||
header("Content-type: text/html; charset=".$encoding);
|
||||
header("Content-type: text/html; charset=".$ENCODING);
|
||||
}
|
||||
if ($AJAX_PAGE && !$ZIP_STREAM) {
|
||||
header("Content-Type: application/json; charset=UTF-8");
|
||||
@@ -54,21 +48,17 @@ if ($AJAX_PAGE && !$ZIP_STREAM) {
|
||||
|
||||
//------------------------------ class init start
|
||||
// login & page access check
|
||||
$login = new CoreLibs\ACL\Login(DB_CONFIG, $lang);
|
||||
// post login lang check
|
||||
if ($_SESSION['DEFAULT_LANG']) {
|
||||
$lang = $_SESSION['DEFAULT_LANG'];
|
||||
}
|
||||
$login = new CoreLibs\ACL\Login(DB_CONFIG);
|
||||
// create smarty object
|
||||
$smarty = new CoreLibs\Template\SmartyExtend($lang);
|
||||
$smarty = new CoreLibs\Template\SmartyExtend();
|
||||
// create new DB class
|
||||
$cms = new CoreLibs\Admin\Backend(DB_CONFIG, $lang);
|
||||
$cms = new CoreLibs\Admin\Backend(DB_CONFIG);
|
||||
// the menu show flag (what menu to show)
|
||||
$cms->menu_show_flag = 'main';
|
||||
// db nfo
|
||||
$cms->dbInfo();
|
||||
// set acl
|
||||
$cms->acl = $login->acl;
|
||||
$cms->setACL($login->acl);
|
||||
// flush
|
||||
ob_end_flush();
|
||||
//------------------------------ class init end
|
||||
@@ -89,12 +79,6 @@ if (!$login->login) {
|
||||
}
|
||||
//------------------------------ logging end
|
||||
|
||||
//------------------------------ page rights start
|
||||
// flag if to show the edit access id drop down list
|
||||
// check if we have more than one EA ID
|
||||
$cms->DATA['show_ea_extra'] = isset($login->acl['show_ea_extra']) ? $login->acl['show_ea_extra'] : false;
|
||||
//------------------------------ page rights ned
|
||||
|
||||
// automatic hide for DEBUG messages on live server
|
||||
// can be overridden when setting DEBUG_ALL_OVERRIDE on top of the script (for emergency debugging of one page only)
|
||||
if ((TARGET == 'live' || TARGET == 'remote') && !$DEBUG_ALL_OVERRIDE) {
|
||||
@@ -105,6 +89,6 @@ if ((TARGET == 'live' || TARGET == 'remote') && !$DEBUG_ALL_OVERRIDE) {
|
||||
$cms->echo_output_all = false;
|
||||
$cms->print_output_all = false;
|
||||
}
|
||||
$cms->DATA['JS_DEBUG'] = DEBUG;
|
||||
$smarty->DATA['JS_DEBUG'] = DEBUG;
|
||||
|
||||
// __END__
|
||||
|
||||
@@ -7,161 +7,13 @@
|
||||
* HISTORY:
|
||||
*********************************************************************/
|
||||
|
||||
// master template
|
||||
if (!isset($MASTER_TEMPLATE_NAME)) {
|
||||
$MASTER_TEMPLATE_NAME = MASTER_TEMPLATE_NAME;
|
||||
}
|
||||
|
||||
// just emergency fallback for language
|
||||
// set encoding
|
||||
if (isset($_SESSION['DEFAULT_CHARSET'])) {
|
||||
$encoding = $_SESSION['DEFAULT_CHARSET'];
|
||||
} elseif (!isset($encoding)) {
|
||||
$encoding = DEFAULT_ENCODING;
|
||||
}
|
||||
// just emergency fallback for language
|
||||
if (isset($_SESSION['DEFAULT_LANG'])) {
|
||||
$lang = $_SESSION['DEFAULT_LANG'];
|
||||
} elseif (!isset($lang)) {
|
||||
$lang = defined('SITE_LANG') ? SITE_LANG : DEFAULT_LANG;
|
||||
}
|
||||
// create the char lang encoding
|
||||
$lang_short = substr($lang, 0, 2);
|
||||
|
||||
// set include & template names
|
||||
$PAGE_FILE_NAME = str_replace('.php', '', $cms->page_name);
|
||||
// set include & template names
|
||||
if (!isset($CONTENT_INCLUDE)) {
|
||||
$CONTENT_INCLUDE = $PAGE_FILE_NAME.'.tpl';
|
||||
}
|
||||
$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->getPageName(1))).(defined(G_TITLE) ? ' - '.G_TITLE : '');
|
||||
// strip tpl and replace it with php
|
||||
// php include file per page
|
||||
$cms->INC_TEMPLATE_NAME = str_replace('.tpl', '.php', $CONTENT_INCLUDE);
|
||||
// javascript include per page
|
||||
$cms->JS_TEMPLATE_NAME = str_replace('.tpl', '.js', $CONTENT_INCLUDE);
|
||||
// css per page
|
||||
$cms->CSS_TEMPLATE_NAME = str_replace('.tpl', '.css', $CONTENT_INCLUDE);
|
||||
// special CSS file
|
||||
$cms->CSS_SPECIAL_TEMPLATE_NAME = isset($CSS_NAME) ? $CSS_NAME : '';
|
||||
// special JS file
|
||||
$cms->JS_SPECIAL_TEMPLATE_NAME = isset($JS_NAME) ? $JS_NAME : '';
|
||||
// compile & cache id
|
||||
$cms->CACHE_ID = isset($CACHE_ID) ? $CACHE_ID : CACHE_ID;
|
||||
$cms->COMPILE_ID = isset($COMPILE_ID) ? $COMPILE_ID : CACHE_ID;
|
||||
|
||||
// set basic template path (tmp)
|
||||
$cms->includes = BASE.INCLUDES; // no longer in templates, only global
|
||||
$cms->template_path = BASE.INCLUDES.TEMPLATES.CONTENT_PATH;
|
||||
/******
|
||||
NOTE THAT THIS INCLUDE IS OBSOLETE
|
||||
USE THE BELOW FUNCTION CALL IN THE SCRIPT ITSELF
|
||||
*******/
|
||||
trigger_error('admin_set_paths.php is deprecated. Use SmartyExtended->setSmartyPaths();', E_USER_DEPRECATED);
|
||||
if ($smarty) {
|
||||
$smarty->setTemplateDir($cms->template_path);
|
||||
}
|
||||
if (isset($LANGUAGE_FOLDER)) {
|
||||
$cms->lang_dir = $LANGUAGE_FOLDER;
|
||||
} else {
|
||||
$cms->lang_dir = BASE.INCLUDES.LANG.CONTENT_PATH; // no outside
|
||||
}
|
||||
$cms->javascript = LAYOUT.JS;
|
||||
$cms->css = LAYOUT.CSS;
|
||||
$cms->pictures = LAYOUT.IMAGES;
|
||||
$cms->cache_pictures = LAYOUT.CACHE;
|
||||
$cms->cache_pictures_root = ROOT.$cms->cache_pictures;
|
||||
if (!is_dir($cms->cache_pictures_root)) {
|
||||
mkdir($cms->cache_pictures_root);
|
||||
}
|
||||
// check if we have an external file with the template name
|
||||
if (file_exists($cms->includes.$cms->INC_TEMPLATE_NAME) &&
|
||||
is_file($cms->includes.$cms->INC_TEMPLATE_NAME)
|
||||
) {
|
||||
include($cms->includes.$cms->INC_TEMPLATE_NAME);
|
||||
}
|
||||
// only CSS/JS/etc include stuff if we have non AJAX page
|
||||
if (isset($AJAX_PAGE) && !$AJAX_PAGE) {
|
||||
// check for template include
|
||||
if (isset($USE_INCLUDE_TEMPLATE) && $USE_INCLUDE_TEMPLATE === true && !isset($TEMPLATE_NAME)) {
|
||||
$TEMPLATE_NAME = $CONTENT_INCLUDE;
|
||||
// add to cache & compile id
|
||||
$cms->COMPILE_ID .= '_'.$TEMPLATE_NAME;
|
||||
$cms->CACHE_ID .= '_'.$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;
|
||||
}
|
||||
if ($smarty) {
|
||||
// check if template names exist
|
||||
if (!file_exists($smarty->getTemplateDir()[0].DS.$MASTER_TEMPLATE_NAME)) {
|
||||
// abort if master template could not be found
|
||||
exit('MASTER TEMPLATE: '.$MASTER_TEMPLATE_NAME.' could not be found');
|
||||
}
|
||||
if (isset($TEMPLATE_NAME) && !file_exists($smarty->getTemplateDir()[0].DS.$TEMPLATE_NAME)) {
|
||||
exit('INCLUDE TEMPLATE: '.$TEMPLATE_NAME.' could not be found');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// if the lang folder is different to the default one
|
||||
// if the default lang is not like the lang given, switch lang
|
||||
/** @phan-suppress-next-line PhanParamSuspiciousOrder */
|
||||
if (false === strstr(BASE.INCLUDES.LANG.CONTENT_PATH, $cms->lang_dir) ||
|
||||
strcasecmp(defined('SITE_LANG') ? SITE_LANG : DEFAULT_LANG, $lang)
|
||||
) {
|
||||
$cms->debug('LANG', 'Orig: '.BASE.INCLUDES.LANG.CONTENT_PATH.', New: '.$cms->lang_dir.' | Orig Lang: '.(defined('SITE_LANG') ? SITE_LANG : DEFAULT_LANG).', New Lang: '.$lang);
|
||||
$cms->l->l10nReloadMOfile($lang, $cms->lang_dir);
|
||||
// if we have login class
|
||||
if ($login) {
|
||||
$login->l->l10nReloadMOfile($lang, $cms->lang_dir);
|
||||
}
|
||||
// if we have smarty template class
|
||||
if ($smarty) {
|
||||
$smarty->l10n->l10nReloadMOfile($lang, $cms->lang_dir);
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($AJAX_PAGE) && !$AJAX_PAGE) {
|
||||
// javascript translate data as template for auto translate
|
||||
if (empty($TEMPLATE_TRANSLATE)) {
|
||||
$TEMPLATE_TRANSLATE = 'jsTranslate_'.$lang.'.tpl';
|
||||
$cms->debug('LANG', 'Load lang: '.$lang.', for page file '.$TEMPLATE_TRANSLATE);
|
||||
} else {
|
||||
// we assume we have some fixed set
|
||||
// we must add _<$lang>
|
||||
// if .tpl, put before .tpl
|
||||
// if not .tpl, add _<$lang>.tpl
|
||||
if (strpos($TEMPLATE_TRANSLATE, '.tpl')) {
|
||||
$TEMPLATE_TRANSLATE = str_replace('.tpl', '_'.$lang.'.tpl', $TEMPLATE_TRANSLATE);
|
||||
} else {
|
||||
$TEMPLATE_TRANSLATE .= '_'.$lang.'.tpl';
|
||||
}
|
||||
}
|
||||
// if we can't find it, dump it
|
||||
if ($smarty && !file_exists($smarty->getTemplateDir()[0].DS.$TEMPLATE_TRANSLATE)) {
|
||||
unset($TEMPLATE_TRANSLATE);
|
||||
}
|
||||
}
|
||||
|
||||
// $cms->debug("LANGUAGE", "L: $lang | ".$cms->lang_dir." | MO File: ".$cms->l->mofile);
|
||||
$cms->debug("LANGUAGE", "SL: ".$_SESSION['DEFAULT_CHARSET']." | ".$_SESSION['LANG']." | ".$_SESSION['DEFAULT_LANG']);
|
||||
if ($smarty) {
|
||||
$cms->debug("TEMPLATE", "P: ".$smarty->getTemplateDir()[0]);
|
||||
$smarty->setSmartyPaths();
|
||||
}
|
||||
|
||||
// __END__
|
||||
|
||||
@@ -7,109 +7,11 @@
|
||||
* HISTORY:
|
||||
*********************************************************************/
|
||||
|
||||
// trigger flags
|
||||
$cms->HEADER['USE_PROTOTYPE'] = isset($USE_PROTOTYPE) ? $USE_PROTOTYPE : USE_PROTOTYPE;
|
||||
// scriptacolous, can only be used with prototype
|
||||
if ($cms->HEADER['USE_PROTOTYPE']) {
|
||||
$cms->HEADER['USE_SCRIPTACULOUS'] = isset($USE_SCRIPTACULOUS) ? $USE_SCRIPTACULOUS : USE_SCRIPTACULOUS;
|
||||
}
|
||||
// jquery and prototype should not be used together
|
||||
$cms->HEADER['USE_JQUERY'] = isset($USE_JQUERY) ? $USE_JQUERY : USE_JQUERY; // don't use either of those two together
|
||||
|
||||
// check if we have an external file with the template name
|
||||
if (file_exists($cms->includes.$cms->INC_TEMPLATE_NAME) && is_file($cms->includes.$cms->INC_TEMPLATE_NAME)) {
|
||||
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;
|
||||
}
|
||||
|
||||
// the actual include files for javascript (per page)
|
||||
$cms->HEADER['JS_INCLUDE'] = $cms->JS_INCLUDE;
|
||||
$cms->HEADER['CSS_INCLUDE'] = $cms->CSS_INCLUDE;
|
||||
$cms->HEADER['CSS_SPECIAL_INCLUDE'] = $cms->CSS_SPECIAL_INCLUDE;
|
||||
$cms->HEADER['JS_SPECIAL_INCLUDE'] = $cms->JS_SPECIAL_INCLUDE;
|
||||
// paths to the files
|
||||
$cms->DATA['includes'] = $cms->includes;
|
||||
$cms->DATA['js'] = $cms->javascript;
|
||||
$cms->DATA['css'] = $cms->css;
|
||||
$cms->DATA['pictures'] = $cms->pictures;
|
||||
|
||||
// default CMS settings
|
||||
// define all needed smarty stuff for the general HTML/page building
|
||||
$cms->HEADER['CSS'] = CSS;
|
||||
$cms->HEADER['JS'] = JS;
|
||||
$cms->HEADER['ENCODING'] = $encoding;
|
||||
$cms->HEADER['DEFAULT_ENCODING'] = DEFAULT_ENCODING;
|
||||
$cms->HEADER['STYLESHEET'] = isset($ADMIN_STYLESHEET) ? $ADMIN_STYLESHEET : ADMIN_STYLESHEET;
|
||||
$cms->HEADER['JAVASCRIPT'] = isset($ADMIN_JAVASCRIPT) ? $ADMIN_JAVASCRIPT : ADMIN_JAVASCRIPT;
|
||||
// html title
|
||||
$cms->HEADER['HTML_TITLE'] = isset($L_TITLE) ? $cms->l->__($L_TITLE) : $cms->l->__(G_TITLE);
|
||||
$cms->DATA['table_width'] = isset($PAGE_WIDTH) ? $PAGE_WIDTH : PAGE_WIDTH;
|
||||
|
||||
// messages = array('msg' =>, 'class' => 'error/warning/...')
|
||||
$cms->DATA['messages'] = $cms->messages;
|
||||
|
||||
// top menu
|
||||
$cms->DATA['nav_menu'] = $cms->adbTopMenu();
|
||||
$cms->DATA['nav_menu_count'] = is_array($cms->DATA['nav_menu']) ? count($cms->DATA['nav_menu']) : 0;
|
||||
// the page name
|
||||
$cms->DATA['page_name'] = $cms->page_name;
|
||||
// user name
|
||||
$cms->DATA['USER_NAME'] = $_SESSION['USER_NAME'];
|
||||
$cms->DATA['ADMIN'] = $login->acl['admin'];
|
||||
// the template part to include into the body
|
||||
$cms->DATA['TEMPLATE_NAME'] = $TEMPLATE_NAME;
|
||||
$cms->DATA['CONTENT_INCLUDE'] = $CONTENT_INCLUDE;
|
||||
$cms->DATA['TEMPLATE_TRANSLATE'] = isset($TEMPLATE_TRANSLATE) ? $TEMPLATE_TRANSLATE : null;
|
||||
$cms->DATA['PAGE_FILE_NAME'] = $PAGE_FILE_NAME;
|
||||
// LANG
|
||||
$cms->DATA['LANG'] = $lang;
|
||||
$cms->DATA['TINYMCE_LANG'] = $lang_short;
|
||||
// form name
|
||||
$cms->DATA['FORM_NAME'] = $FORM_NAME;
|
||||
// include flags
|
||||
$cms->DATA['USE_TINY_MCE'] = isset($USE_TINY_MCE) ? $USE_TINY_MCE : false;
|
||||
$cms->DATA['JS_DATEPICKR'] = isset($JS_DATEPICKR) ? $JS_DATEPICKR : false;
|
||||
$cms->DATA['JS_FLATPICKR'] = isset($JS_FLATPICKR) ? $JS_FLATPICKR : false;
|
||||
|
||||
// debug data, if DEBUG flag is on, this data is print out
|
||||
$cms->DEBUG_DATA['debug_error_msg'] = $cms->runningTime();
|
||||
$cms->DEBUG_DATA['DEBUG'] = @$DEBUG_TMPL;
|
||||
|
||||
// create main data array
|
||||
$cms->CONTENT_DATA = array_merge($cms->HEADER, $cms->DATA, $cms->DEBUG_DATA);
|
||||
// data is 1:1 mapping (all vars, values, etc)
|
||||
foreach ($cms->CONTENT_DATA as $key => $value) {
|
||||
$smarty->assign($key, $value);
|
||||
}
|
||||
if (is_dir(BASE.TEMPLATES_C)) {
|
||||
$smarty->setCompileDir(BASE.TEMPLATES_C);
|
||||
}
|
||||
if (is_dir(BASE.CACHE)) {
|
||||
$smarty->setCacheDir(BASE.CACHE);
|
||||
}
|
||||
$smarty->display(
|
||||
$MASTER_TEMPLATE_NAME,
|
||||
$cms->CACHE_ID.($cms->CACHE_ID ? '_' : '').$lang,
|
||||
$cms->COMPILE_ID.($cms->COMPILE_ID ? '_' : '').$lang
|
||||
);
|
||||
/******
|
||||
NOTE THAT THIS INCLUDE IS OBSOLETE
|
||||
USE THE BELOW FUNCTION CALL IN THE SCRIPT ITSELF
|
||||
*******/
|
||||
trigger_error('admin_smarty.php is deprecated. Use SmartyExtended->setSmartyVarsAdmin(); or setSmartyVarsFrontend();', E_USER_DEPRECATED);
|
||||
$smarty->setSmartyVarsAdmin();
|
||||
|
||||
// __END__
|
||||
|
||||
@@ -36,23 +36,19 @@ if (!DEBUG) {
|
||||
$ECHO_ALL = 0;
|
||||
}
|
||||
|
||||
// set default lang if not set otherwise
|
||||
if (!isset($lang)) {
|
||||
$lang = DEFAULT_LANG;
|
||||
}
|
||||
// should be utf8
|
||||
header("Content-type: text/html; charset=".DEFAULT_ENCODING);
|
||||
ob_end_flush();
|
||||
$login = new CoreLibs\ACL\Login(DB_CONFIG, $lang);
|
||||
$login = new CoreLibs\ACL\Login(DB_CONFIG);
|
||||
|
||||
// create form class
|
||||
$form = new CoreLibs\Output\Form\Generate(DB_CONFIG, $lang);
|
||||
$form = new CoreLibs\Output\Form\Generate(DB_CONFIG);
|
||||
if ($form->mobile_phone) {
|
||||
echo "I am sorry, but this page cannot be viewed by a mobile phone";
|
||||
exit;
|
||||
}
|
||||
// smarty template engine (extended Translation version)
|
||||
$smarty = new CoreLibs\Template\SmartyExtend($lang);
|
||||
$smarty = new CoreLibs\Template\SmartyExtend();
|
||||
|
||||
// $form->debug('POST', $form->printAr($_POST));
|
||||
|
||||
@@ -274,38 +270,58 @@ if ($form->my_page_name == 'edit_order') {
|
||||
|
||||
$position = 0;
|
||||
$menu_data = array();
|
||||
for ($i = 1; $i <= count($menuarray); $i ++) {
|
||||
// for ($i = 1; $i <= count($menuarray); $i ++) {
|
||||
foreach ($menuarray as $i => $data) {
|
||||
// do that for new array
|
||||
$j = $i - 1;
|
||||
$menu_data[$j]['pagename'] = htmlentities($menuarray[($i-1)]['page_name']);
|
||||
$menu_data[$j]['filename'] = $menuarray[($i-1)]['filename'].(isset($menuarray[$j]['query_string']) ? $menuarray[$j]['query_string'] : '');
|
||||
if ($i == 1 || !($j % $SPLIT_FACTOR)) {
|
||||
$menu_data[$j]['splitfactor_in'] = 1;
|
||||
$j = $i + 1;
|
||||
$menu_data[$i]['pagename'] = htmlentities($data['page_name']);
|
||||
$menu_data[$i]['filename'] =
|
||||
// prefix folder or host name
|
||||
(isset($data['hostname']) && $data['hostname'] ?
|
||||
$data['hostname'] :
|
||||
''
|
||||
).
|
||||
// filename
|
||||
(isset($data['filename']) ? $data['filename'] : '').
|
||||
// query string
|
||||
(isset($data['query_string']) && $data['query_string'] ?
|
||||
$data['query_string'] :
|
||||
''
|
||||
);
|
||||
if ($j == 1 || !($i % $SPLIT_FACTOR)) {
|
||||
$menu_data[$i]['splitfactor_in'] = 1;
|
||||
} else {
|
||||
$menu_data[$j]['splitfactor_in'] = 0;
|
||||
$menu_data[$i]['splitfactor_in'] = 0;
|
||||
}
|
||||
if ($menuarray[$j]['filename'] == $form->getPageName()) {
|
||||
// on matching, we also need to check if we are in the same folder
|
||||
if (isset($data['filename']) &&
|
||||
$data['filename'] == $form->getPageName() &&
|
||||
(!isset($data['hostname']) || (
|
||||
isset($data['hostname']) &&
|
||||
(!$data['hostname'] || strstr($data['hostname'], CONTENT_PATH) !== false)
|
||||
))
|
||||
) {
|
||||
$position = $j;
|
||||
$menu_data[$j]['position'] = 1;
|
||||
$menu_data[$j]['popup'] = 0;
|
||||
$menu_data[$i]['position'] = 1;
|
||||
$menu_data[$i]['popup'] = 0;
|
||||
} else {
|
||||
// add query stuff
|
||||
// HAS TO DONE LATER ... set urlencode, etc ...
|
||||
// check if popup needed
|
||||
if (isset($menuarray[$j]['popup']) && $menuarray[$j]['popup'] == 1) {
|
||||
$menu_data[$j]['popup'] = 1;
|
||||
$menu_data[$j]['rand'] = uniqid((string)rand());
|
||||
$menu_data[$j]['width'] = $menuarray[$j]['popup_x'];
|
||||
$menu_data[$j]['height'] = $menuarray[$j]['popup_y'];
|
||||
if (isset($data['popup']) && $data['popup'] == 1) {
|
||||
$menu_data[$i]['popup'] = 1;
|
||||
$menu_data[$i]['rand'] = uniqid((string)rand());
|
||||
$menu_data[$i]['width'] = $data['popup_x'];
|
||||
$menu_data[$i]['height'] = $data['popup_y'];
|
||||
} else {
|
||||
$menu_data[$j]['popup'] = 0;
|
||||
$menu_data[$i]['popup'] = 0;
|
||||
}
|
||||
$menu_data[$j]['position'] = 0;
|
||||
$menu_data[$i]['position'] = 0;
|
||||
} // highlight or not
|
||||
if (!($i % $SPLIT_FACTOR) || (($i + 1) > count($menuarray))) {
|
||||
$menu_data[$j]['splitfactor_out'] = 1;
|
||||
if (!($j % $SPLIT_FACTOR) || (($j + 1) > count($menuarray))) {
|
||||
$menu_data[$i]['splitfactor_out'] = 1;
|
||||
} else {
|
||||
$menu_data[$j]['splitfactor_out'] = 0;
|
||||
$menu_data[$i]['splitfactor_out'] = 0;
|
||||
}
|
||||
} // for
|
||||
// $form->debug('MENU ARRAY', $form->printAr($menu_data));
|
||||
@@ -361,14 +377,35 @@ if ($form->my_page_name == 'edit_order') {
|
||||
if (!isset($form->table_array['edit_page_id']['value'])) {
|
||||
$q = "DELETE FROM temp_files";
|
||||
$form->dbExec($q);
|
||||
// gets all files in the current dir ending with .php
|
||||
$crap = exec('ls *.php', $output, $status);
|
||||
// now get all that are NOT in de DB
|
||||
$q = "INSERT INTO temp_files VALUES ";
|
||||
for ($i = 0; $i < count($output); $i ++) {
|
||||
$t_q = "('".$form->dbEscapeString($output[$i])."')";
|
||||
$form->dbExec($q.$t_q, 'NULL');
|
||||
// gets all files in the current dir and dirs given ending with .php
|
||||
$folders = array('../admin/', '../frontend/');
|
||||
$files = array('*.php');
|
||||
$search_glob = array();
|
||||
foreach ($folders as $folder) {
|
||||
// make sure this folder actually exists
|
||||
if (is_dir(ROOT.$folder)) {
|
||||
foreach ($files as $file) {
|
||||
$search_glob[] = $folder.$file;
|
||||
}
|
||||
}
|
||||
}
|
||||
$crap = exec('ls '.join(' ', $search_glob), $output, $status);
|
||||
// now get all that are NOT in de DB
|
||||
$q = "INSERT INTO temp_files (folder, filename) VALUES ";
|
||||
$t_q = '';
|
||||
foreach ($output as $output_file) {
|
||||
// split the ouput into folder and file
|
||||
// eg ../admin/test.php is ../admin/ and test.php
|
||||
preg_match("/([\.\/\w]+\/)+(\w+\.\w{1,})$/", $output_file, $matches);
|
||||
// if named config.php, skip
|
||||
if ($matches[2] != 'config.php') {
|
||||
if ($t_q) {
|
||||
$t_q .= ', ';
|
||||
}
|
||||
$t_q .= "('".$form->dbEscapeString($matches[1])."', '".$form->dbEscapeString($matches[2])."')";
|
||||
}
|
||||
}
|
||||
$form->dbExec($q.$t_q, 'NULL');
|
||||
$elements[] = $form->formCreateElement('filename');
|
||||
} else {
|
||||
// show file menu
|
||||
@@ -376,6 +413,7 @@ if ($form->my_page_name == 'edit_order') {
|
||||
$DATA['filename_exist'] = 1;
|
||||
$DATA['filename'] = $form->table_array['filename']['value'];
|
||||
} // File Name View IF
|
||||
$elements[] = $form->formCreateElement('hostname');
|
||||
$elements[] = $form->formCreateElement('name');
|
||||
// $elements[] = $form->formCreateElement('tag');
|
||||
// $elements[] = $form->formCreateElement('min_acl');
|
||||
@@ -453,7 +491,7 @@ if (is_dir(BASE.TEMPLATES_C)) {
|
||||
if (is_dir(BASE.CACHE)) {
|
||||
$smarty->setCacheDir(BASE.CACHE);
|
||||
}
|
||||
$smarty->display($EDIT_TEMPLATE, 'editAdmin_'.$lang, 'editAdmin_'.$lang);
|
||||
$smarty->display($EDIT_TEMPLATE, 'editAdmin_'.$smarty->lang, 'editAdmin_'.$smarty->lang);
|
||||
|
||||
// debug output
|
||||
echo $login->printErrorMsg();
|
||||
|
||||
Binary file not shown.
@@ -12,11 +12,16 @@ $edit_pages = array(
|
||||
'output_name' => 'Add File ...',
|
||||
'mandatory' => 1,
|
||||
'type' => 'drop_down_db',
|
||||
'query' => "SELECT DISTINCT temp_files.filename AS id, temp_files.filename AS name ".
|
||||
'query' => "SELECT DISTINCT temp_files.filename AS id, temp_files.folder || temp_files.filename AS name ".
|
||||
"FROM temp_files ".
|
||||
"LEFT JOIN edit_page ep ON temp_files.filename = ep.filename ".
|
||||
"WHERE ep.filename IS NULL"
|
||||
),
|
||||
'hostname' => array(
|
||||
'value' => isset($GLOBALS['hostname']) ? $GLOBALS['hostname'] : '',
|
||||
'output_name' => 'Hostname or folder',
|
||||
'type' => 'text'
|
||||
),
|
||||
'name' => array(
|
||||
'value' => isset($GLOBALS['name']) ? $GLOBALS['name'] : '',
|
||||
'output_name' => 'Page name',
|
||||
@@ -107,7 +112,7 @@ $edit_pages = array(
|
||||
// "ORDER BY order_number"
|
||||
)
|
||||
),
|
||||
'load_query' => "SELECT edit_page_id, filename, name, online, menu, popup FROM edit_page ORDER BY order_number",
|
||||
'load_query' => "SELECT edit_page_id, CASE WHEN hostname IS NOT NULL THEN hostname ELSE ''::VARCHAR END || filename AS filename, name, online, menu, popup FROM edit_page ORDER BY order_number",
|
||||
'table_name' => 'edit_page',
|
||||
'show_fields' => array(
|
||||
array(
|
||||
|
||||
@@ -1,113 +0,0 @@
|
||||
{*
|
||||
********************************************************************
|
||||
* AUTHOR: Clemens Schwaighofer
|
||||
* DATE: 2007/10/18
|
||||
* DESCRIPTION:
|
||||
* content main part (buttons, load, etc)
|
||||
* HISTORY:
|
||||
********************************************************************
|
||||
*}
|
||||
|
||||
<script language="JavaScript">
|
||||
<!--
|
||||
var form_name = '{$form_name}';
|
||||
var load_id = '{if $primary_key}{$primary_key}{else}0{/if}';
|
||||
var show_sort = {$show_sort};
|
||||
//-->
|
||||
</script>
|
||||
<div style="position:relative; width: {$table_width}px; margin-top: 5px; margin-bottom: 5px; top: 0px; left: 0px;">
|
||||
<div id="main_menu" style="position: absolute; top: 0px; left: 0px; width: 750px; height: 550px; z-index: 5; overflow: auto; padding: 2px; visibility: hidden;" class="sidemenu">
|
||||
<div style="position: absolute; top: 2px; left: 2px;">
|
||||
<input type="button" id="show_menu" name="show_menu" value="{t}Close Menu{/t}" OnClick="ShowHideMenu('hide', 'main_menu');"> {if $primary_key}<a href="#{$primary_key}">↓</a>{/if} <input type="text" id="search" name="search" value="{$search}" OnKeyup="QuickSearch(); return false;" {popup text="Search" width="150"}> <span id="search_status">{t}Enter Value{/t}</span>
|
||||
<div id="search_found">{t 1=$menu_elements}Found: %1{/t}</div>
|
||||
</div>
|
||||
<div id="search_results" style="position: relative; top: 32px; left: 2px; padding: 2px; margin: 2px; width: 95%; height: 90%; overflow: auto; visibility: hidden; display: none; z-index: 3;">
|
||||
</div>
|
||||
<div id="element_list" style="position: relative; top: 32px; left: 2px; padding: 2px; margin: 2px; width: 95%; height: 90%; overflow: auto; z-index: 3;">
|
||||
{foreach from=$table_menu key=key item=item}
|
||||
{if $s_title != $item.title && $item.title}
|
||||
{assign var='s_title' value=$item.title}
|
||||
<div style="font-weight: bold;">{$item.title}</div>
|
||||
{/if}
|
||||
{if $show_sort}
|
||||
{strip}
|
||||
<span style="font-family: monospace;">[
|
||||
{if $item.order_move == '-' || !$item.order_move}
|
||||
|
||||
{/if}
|
||||
{if $item.order_move == '+' || $item.order_move == '*'}
|
||||
<a href="javascript:me({$item.id}, '+');" {popup text="Up" width="20"}>↑</a>
|
||||
{/if}
|
||||
{if $item.order_move == '-' || $item.order_move == '*'}
|
||||
<a href="javascript:me({$item.id}, '-');" {popup text="Down" width="20"}>↓</a>
|
||||
{/if}
|
||||
{if $item.order_move == '+' || !$item.order_move}
|
||||
|
||||
{/if}
|
||||
]</span>
|
||||
{/strip}
|
||||
{/if}
|
||||
<a name="{$item.id}"></a>
|
||||
{if $item.key}[{$item.key}] {/if}{if $item.status}[{$item.status}] {/if}<a href="javascript:le('{$item.id}');" class="{if $item.deleted == 't' && $primary_key == $item.id}item_loaded_deleted{elseif $item.deleted == 't'}item_deleted{elseif $primary_key == $item.id}item_loaded{/if}" {popup text="`$item.desc`" caption="Info" width="350"}>{$item.name}</a><br>
|
||||
{/foreach}
|
||||
</div>
|
||||
<div style="position: absolute; bottom: 2px; left: 2px; z-index: 5;">
|
||||
<input type="button" id="show_menu" name="show_menu" value="{t}Close Menu{/t}" OnClick="ShowHideMenu('hide', 'main_menu');">
|
||||
</div>
|
||||
</div>
|
||||
<div style="position: relative; top: 0px; left: 0px; width: 790px; z-index: 0; margin: 2px; padding: 2px;">
|
||||
<form method="post" name="{$form_name}" enctype="multipart/form-data">
|
||||
{* menu button *}
|
||||
{if !$hide_menu}
|
||||
<div style="margin-bottom: 2px; padding: 2px; position: relative;">
|
||||
<input type="button" id="show_menu" name="show_menu" value="{t}Show Menu{/t}" OnClick="ShowHideMenu('show', 'main_menu');" {if $page_acl < 20}disabled{/if}>
|
||||
</div>
|
||||
{/if}
|
||||
{* save, delete commands *}
|
||||
<div style="margin-bottom: 2px; padding: 2px; position: relative;" class="buttongroup">
|
||||
<div style="margin-bottom: 2px; padding: 2px; position: relative; height: 20px;">
|
||||
<input type="button" name="new" value="{t}New{/t}" OnClick="document.{$form_name}.action.value='new';document.{$form_name}.action_yes.value=confirm('{t}Do you want to create a new entry entry?{/t}');if (document.{$form_name}.action_yes.value == 'true') document.{$form_name}.submit();" {if $page_acl < 60}disabled{/if}>
|
||||
<input type="button" name="save" value="{t}Save{/t}" OnClick="document.{$form_name}.action.value='save';document.{$form_name}.submit();" {if $page_acl < 60}disabled{/if}>
|
||||
{if $show_delete_button && !$show_undelete_button}
|
||||
<input type="button" name="delete" value="{t}Delete{/t}" OnClick="document.{$form_name}.action.value='delete';document.{$form_name}.action_yes.value=confirm('{t}Do you want to delete this entry?{/t}');document.{$form_name}.action_id.value='{$primary_key}';if (document.{$form_name}.action_yes.value == 'true') document.{$form_name}.submit();" {if $page_acl < 80}disabled{/if}>
|
||||
{/if}
|
||||
{if $show_delete_button && $show_undelete_button}
|
||||
<input type="button" name="un_delete" value="{t}Un-Delete{/t}" OnClick="document.{$form_name}.action.value='undelete';document.{$form_name}.action_yes.value=confirm('{t}Do you want to undelete this entry?{/t}');document.{$form_name}.action_id.value='{$primary_key}';if (document.{$form_name}.action_yes.value == 'true') document.{$form_name}.submit();" {if $page_acl < 80}disabled{/if}>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
{* status messages *}
|
||||
<div id="status_message" style="margin-bottom: 2px; padding: 2px; text-align: center; position: relative; visibility: hidden;">
|
||||
</div>
|
||||
{* main grouping *}
|
||||
<div style="margin-bottom: 5px; padding: 2px; position: relative; min-height: 400px;" class="{$status_color}">
|
||||
{include file=$CONTENT_INCLUDE}
|
||||
</div>
|
||||
|
||||
{* save, delete commands *}
|
||||
<div style="margin-bottom: 2px; padding: 2px; position: relative;" class="buttongroup">
|
||||
<div style="margin-bottom: 2px; padding: 2px; position: relative; height: 20px;">
|
||||
<input type="button" name="new" value="{t}New{/t}" OnClick="document.{$form_name}.action.value='new';document.{$form_name}.action_yes.value=confirm('{t}Do you want to create a new entry entry?{/t}');if (document.{$form_name}.action_yes.value == 'true') document.{$form_name}.submit();" {if $page_acl < 60}disabled{/if}>
|
||||
<input type="button" name="save" value="{t}Save{/t}" OnClick="document.{$form_name}.action.value='save';document.{$form_name}.submit();" {if $page_acl < 60}disabled{/if}>
|
||||
{if $show_delete_button && !$show_undelete_button}
|
||||
<input type="button" name="delete" value="{t}Delete{/t}" OnClick="document.{$form_name}.action.value='delete';document.{$form_name}.action_yes.value=confirm('{t}Do you want to delete this entry?{/t}');document.{$form_name}.action_id.value='{$primary_key}';if (document.{$form_name}.action_yes.value == 'true') document.{$form_name}.submit();" {if $page_acl < 80}disabled{/if}>
|
||||
{/if}
|
||||
{if $show_delete_button && $show_undelete_button}
|
||||
<input type="button" name="un_delete" value="{t}Un-Delete{/t}" OnClick="document.{$form_name}.action.value='undelete';document.{$form_name}.action_yes.value=confirm('{t}Do you want to undelete this entry?{/t}');document.{$form_name}.action_id.value='{$primary_key}';if (document.{$form_name}.action_yes.value == 'true') document.{$form_name}.submit();" {if $page_acl < 80}disabled{/if}>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
{* hidden group *}
|
||||
<input type="hidden" id="primary_key" name="primary_key" value="{$primary_key}">
|
||||
{* action var set *}
|
||||
<input type="hidden" id="action" name="action" value="">
|
||||
<input type="hidden" id="action_flag" name="action_flag" value="">
|
||||
<input type="hidden" id="action_yes" name="action_yes" value="">
|
||||
<input type="hidden" id="action_id" name="action_id" value="">
|
||||
<input type="hidden" id="action_value" name="action_value" value="">
|
||||
<input type="hidden" id="action_menu" name="action_menu" value="">
|
||||
<input type="hidden" id="action_error" name="action_error" value="">
|
||||
<input type="hidden" name="action_loaded" value="true">
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,42 +0,0 @@
|
||||
{*
|
||||
********************************************************************
|
||||
* AUTHOR: Clemens Schwaighofer
|
||||
* DATE: 2007/10/18
|
||||
* DESCRIPTION:
|
||||
* content main part (buttons, load, etc)
|
||||
* HISTORY:
|
||||
********************************************************************
|
||||
*}
|
||||
|
||||
<script language="JavaScript">
|
||||
<!--
|
||||
var form_name = '{$form_name}';
|
||||
var load_id = '{if $primary_key}{$primary_key}{/if}';
|
||||
var show_sort = {if $show_sort}{$show_sort}{else}0{/if};
|
||||
//-->
|
||||
</script>
|
||||
|
||||
<div style="width: {$table_width}px; margin-top: 5px; margin-bottom: 5px;">
|
||||
<form method="post" name="{$form_name}" enctype="multipart/form-data">
|
||||
{* save, delete commands *}
|
||||
<div style="margin-bottom: 2px; padding: 2px;" class="buttongroup">
|
||||
{include file=cms_buttons.tpl}
|
||||
</div>
|
||||
{include file=$CONTENT_INCLUDE}
|
||||
{* save, delete commands *}
|
||||
<div style="margin-bottom: 2px; padding: 2px;" class="buttongroup">
|
||||
{include file=cms_buttons.tpl}
|
||||
</div> <!-- button close //-->
|
||||
{* hidden group *}
|
||||
<input type="hidden" id="primary_key" name="primary_key" value="{$primary_key}">
|
||||
{* action var set *}
|
||||
<input type="hidden" id="action" name="action" value="">
|
||||
<input type="hidden" id="action_flag" name="action_flag" value="">
|
||||
<input type="hidden" id="action_yes" name="action_yes" value="">
|
||||
<input type="hidden" id="action_id" name="action_id" value="">
|
||||
<input type="hidden" id="action_value" name="action_value" value="">
|
||||
<input type="hidden" id="action_menu" name="action_menu" value="">
|
||||
<input type="hidden" id="action_error" name="action_error" value="">
|
||||
<input type="hidden" name="action_loaded" value="true">
|
||||
</form>
|
||||
</div>
|
||||
@@ -1,19 +0,0 @@
|
||||
{*
|
||||
********************************************************************
|
||||
* AUTHOR: Clemens Schwaighofer
|
||||
* DATE: 2007/10/18
|
||||
* DESCRIPTION:
|
||||
* content main part (buttons, load, etc)
|
||||
* HISTORY:
|
||||
********************************************************************
|
||||
*}
|
||||
|
||||
<script language="JavaScript">
|
||||
<!--
|
||||
var form_name = '{$form_name}';
|
||||
var load_id = {if $primary_key}{$primary_key}{else}0{/if};
|
||||
var show_sort = {if $show_sort}{$show_sort}{else}0{/if};
|
||||
//-->
|
||||
</script>
|
||||
|
||||
{include file=$CONTENT_INCLUDE}
|
||||
@@ -1,91 +0,0 @@
|
||||
{*
|
||||
********************************************************************
|
||||
* AUTHOR: Clemens Schwaighofer
|
||||
* DATE: 2008/04/11
|
||||
* DESCRIPTION:
|
||||
* special content main part (buttons, load, etc)
|
||||
* HISTORY:
|
||||
********************************************************************
|
||||
*}
|
||||
|
||||
<script language="JavaScript">
|
||||
<!--
|
||||
var form_name = '{$form_name}';
|
||||
var load_id = {if $primary_key}{$primary_key}{else}0{/if};
|
||||
//-->
|
||||
</script>
|
||||
|
||||
<div style="position:relative; width: {$table_width}px; margin-top: 5px; margin-bottom: 5px; top: 0px; left: 0px;">
|
||||
<div style="position: relative; top: 0px; left: 0px; width: 790px; z-index: 0; margin: 2px; padding: 2px;">
|
||||
<form method="post" name="{$form_name}">
|
||||
{* save, delete commands *}
|
||||
<div style="margin: 2px; padding: 2px; position: relative;" class="buttongroup">
|
||||
<div style="padding: 2px; position: relative; height: 20px;">
|
||||
<input type="button" name="new" value="{t}New{/t}" OnClick="document.{$form_name}.action.value='new';document.{$form_name}.action_yes.value=confirm('{t}Do you want to create a new entry entry?{/t}');if (document.{$form_name}.action_yes.value == 'true') document.{$form_name}.submit();" {if $page_acl < 60}disabled{/if}>
|
||||
<input type="button" name="save" value="{t}Save{/t}" OnClick="document.{$form_name}.action.value='save';document.{$form_name}.submit();" {if $page_acl < 60}disabled{/if}>
|
||||
{if $show_delete_button && !$show_undelete_button}
|
||||
<input type="button" name="delete" value="{t}Delete{/t}" OnClick="document.{$form_name}.action.value='delete';document.{$form_name}.action_yes.value=confirm('{t}Do you want to delete this entry?{/t}');document.{$form_name}.action_id.value={$primary_key};if (document.{$form_name}.action_yes.value == 'true') document.{$form_name}.submit();" {if $page_acl < 80}disabled{/if}>
|
||||
{/if}
|
||||
{if $show_delete_button && $show_undelete_button}
|
||||
<input type="button" name="un_delete" value="{t}Un-Delete{/t}" OnClick="document.{$form_name}.action.value='undelete';document.{$form_name}.action_yes.value=confirm('{t}Do you want to undelete this entry?{/t}');document.{$form_name}.action_id.value={$primary_key};if (document.{$form_name}.action_yes.value == 'true') document.{$form_name}.submit();" {if $page_acl < 80}disabled{/if}>
|
||||
{/if}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
{* status messages *}
|
||||
<div id="status_message" style="margin-bottom: 2px; padding: 2px; text-align: center; position: relative; visibility: hidden; display: none;">
|
||||
</div>
|
||||
{* main grouping *}
|
||||
<div>
|
||||
<div class="spacer"></div>
|
||||
<div id="main_menu" style="float: left; position: relative; width: 200px; height: 450px; z-index: 5; overflow: auto; padding: 2px; margin: 2px;" class="sidemenu">
|
||||
<div style="position: absolute; top: 2px; left: 2px;">
|
||||
{if $primary_key}<a href="#{$primary_key}">↓</a>{/if} <input type="text" id="search" name="search" size="15" value="{$search}" OnKeyup="QuickSearch(); return false;" {popup text="Search" width="150"}> <span id="search_status">{t}Search{/t}</span>
|
||||
<div id="search_found">{t}Found:{/t} {$menu_elements}</div>
|
||||
</div>
|
||||
<div id="search_results" style="position: relative; top: 32px; left: 2px; padding: 2px; margin: 2px; width: 95%; height: 90%; overflow: auto; visibility: hidden; display: none;">
|
||||
</div>
|
||||
<div id="element_list" style="position: relative; top: 32px; left: 2px; padding: 2px; margin: 2px; width: 95%; height: 90%; overflow: auto;">
|
||||
{foreach from=$table_menu key=key item=item}
|
||||
<a name="{$item.id}"></a>
|
||||
{if $item.key}[{$item.key}] {/if}{if $item.status}[{$item.status}] {/if}<a href="javascript:le({$item.id});" class="{if $item.deleted == 't' && $primary_key == $item.id}item_loaded_deleted{elseif $item.deleted == 't'}item_deleted{elseif $primary_key == $item.id}item_loaded{/if}">{$item.name}</a><br>
|
||||
{/foreach}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="float: left; margin: 2px; padding: 2px; position: relative; width: 570px; min-height: 450px;" class="{$status_color}">
|
||||
{* START CONTENT *}
|
||||
{include file="$CONTENT_INCLUDE"}
|
||||
{* END CONTENT *}
|
||||
</div>
|
||||
<div class="spacer"></div>
|
||||
{* END MENU / CONTENT BLOCK *}
|
||||
</div>
|
||||
|
||||
{* save, delete commands *}
|
||||
<div style="margin: 2px; padding: 2px; position: relative;" class="buttongroup">
|
||||
<div style="padding: 2px; position: relative; height: 20px;">
|
||||
<input type="button" name="new" value="{t}New{/t}" OnClick="document.{$form_name}.action.value='new';document.{$form_name}.action_yes.value=confirm('{t}Do you want to create a new entry entry?{/t}');if (document.{$form_name}.action_yes.value == 'true') document.{$form_name}.submit();" {if $page_acl < 60}disabled{/if}>
|
||||
<input type="button" name="save" value="{t}Save{/t}" OnClick="document.{$form_name}.action.value='save';document.{$form_name}.submit();" {if $page_acl < 60}disabled{/if}>
|
||||
{if $show_delete_button && !$show_undelete_button}
|
||||
<input type="button" name="delete" value="{t}Delete{/t}" OnClick="document.{$form_name}.action.value='delete';document.{$form_name}.action_yes.value=confirm('{t}Do you want to delete this entry?{/t}');document.{$form_name}.action_id.value={$primary_key};if (document.{$form_name}.action_yes.value == 'true') document.{$form_name}.submit();" {if $page_acl < 80}disabled{/if}>
|
||||
{/if}
|
||||
{if $show_delete_button && $show_undelete_button}
|
||||
<input type="button" name="un_delete" value="{t}Un-Delete{/t}" OnClick="document.{$form_name}.action.value='undelete';document.{$form_name}.action_yes.value=confirm('{t}Do you want to undelete this entry?{/t}');document.{$form_name}.action_id.value={$primary_key};if (document.{$form_name}.action_yes.value == 'true') document.{$form_name}.submit();" {if $page_acl < 80}disabled{/if}>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
{* hidden group *}
|
||||
<input type="hidden" id="primary_key" name="primary_key" value="{$primary_key}">
|
||||
{* action var set *}
|
||||
<input type="hidden" id="action" name="action" value="">
|
||||
<input type="hidden" id="action_flag" name="action_flag" value="">
|
||||
<input type="hidden" id="action_yes" name="action_yes" value="">
|
||||
<input type="hidden" id="action_id" name="action_id" value="">
|
||||
<input type="hidden" id="action_value" name="action_value" value="">
|
||||
<input type="hidden" id="action_menu" name="action_menu" value="">
|
||||
<input type="hidden" id="action_error" name="action_error" value="">
|
||||
<input type="hidden" name="action_loaded" value="true">
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,6 +1,9 @@
|
||||
<div>
|
||||
{$SMARTY_TEST}
|
||||
</div>
|
||||
<div>
|
||||
TRANSLATION CLASS: {$TRANSLATE_TEST}
|
||||
</div>
|
||||
<div>
|
||||
<select id="drop_down_test" name="drop_down_test">
|
||||
{html_options options=$drop_down_test selected=$drop_down_test_selected}
|
||||
@@ -11,6 +14,9 @@
|
||||
<div id="test-div" class="test-div">
|
||||
Some content ehre or asdfasdfasf
|
||||
</div>
|
||||
<div id="translate-div">
|
||||
TRANSLATION SMARTY: {t}I should be translated{/t}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{* progresss indicator *}
|
||||
|
||||
BIN
www/layout/admin/images/img_2145.heic
Executable file
BIN
www/layout/admin/images/img_2145.heic
Executable file
Binary file not shown.
|
Before Width: | Height: | Size: 1.5 MiB After Width: | Height: | Size: 1.5 MiB |
|
Before Width: | Height: | Size: 489 KiB After Width: | Height: | Size: 489 KiB |
|
Before Width: | Height: | Size: 807 KiB After Width: | Height: | Size: 807 KiB |
BIN
www/layout/admin/images/photoshop_test.psd
Executable file
BIN
www/layout/admin/images/photoshop_test.psd
Executable file
Binary file not shown.
BIN
www/layout/admin/images/tiff_compressed_lzw.tif
Executable file
BIN
www/layout/admin/images/tiff_compressed_lzw.tif
Executable file
Binary file not shown.
BIN
www/layout/admin/images/tiff_compressed_zip.tif
Executable file
BIN
www/layout/admin/images/tiff_compressed_zip.tif
Executable file
Binary file not shown.
BIN
www/layout/admin/images/tiff_uncompressed.tif
Executable file
BIN
www/layout/admin/images/tiff_uncompressed.tif
Executable file
Binary file not shown.
@@ -86,9 +86,10 @@ function getScrollOffset()
|
||||
function setCenter(id, left, top)
|
||||
{
|
||||
// get size of id
|
||||
var dimensions = {};
|
||||
dimensions.height = $('#' + id).height();
|
||||
dimensions.width = $('#' + id).width();
|
||||
var dimensions = {
|
||||
height: $('#' + id).height(),
|
||||
width: $('#' + id).width()
|
||||
};
|
||||
var type = $('#' + id).css('position');
|
||||
var viewport = getWindowSize();
|
||||
var offset = getScrollOffset();
|
||||
@@ -114,8 +115,8 @@ function setCenter(id, left, top)
|
||||
|
||||
/**
|
||||
* goes to an element id position
|
||||
* @param {String} element element id to move to
|
||||
* @param {Number} [offset=0] offset from top, default is 0 (px)
|
||||
* @param {String} element element id to move to
|
||||
* @param {Number} offset offset from top, default is 0 (px)
|
||||
*/
|
||||
function goToPos(element, offset = 0)
|
||||
{
|
||||
@@ -172,11 +173,12 @@ if (!String.prototype.format) {
|
||||
* @param {Number} x number to be formated
|
||||
* @return {String} formatted with , in thousands
|
||||
*/
|
||||
const numberWithCommas = (x) => {
|
||||
function numberWithCommas(x)
|
||||
{
|
||||
var parts = x.toString().split(".");
|
||||
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",");
|
||||
return parts.join(".");
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* converts line breaks to br
|
||||
@@ -289,17 +291,25 @@ function isObject(val) {
|
||||
return ((typeof val === 'function') || (typeof val === 'object'));
|
||||
}
|
||||
|
||||
/**
|
||||
* get the length of an object (entries)
|
||||
* @param {Object} object object to check
|
||||
* @return {Number} number of entry
|
||||
*/
|
||||
function getObjectCount(object) {
|
||||
return Object.keys(object).length;
|
||||
}
|
||||
|
||||
/**
|
||||
* checks if a key exists in a given object
|
||||
* @param {String} key key name
|
||||
* @param {Object} object object to search key in
|
||||
* @return {Boolean} true/false if key exists in object
|
||||
*/
|
||||
const keyInObject = (key, object) => (Object.prototype.hasOwnProperty.call(object, key)) ? true : false;
|
||||
/*function keyInObject(key, object)
|
||||
function keyInObject(key, object)
|
||||
{
|
||||
return (Object.prototype.hasOwnProperty.call(object, key)) ? true : false;
|
||||
}*/
|
||||
}
|
||||
|
||||
/**
|
||||
* returns matching key of value
|
||||
@@ -307,11 +317,13 @@ const keyInObject = (key, object) => (Object.prototype.hasOwnProperty.call(objec
|
||||
* @param {Mixed} value any value (String, Number, etc)
|
||||
* @return {String} the key found for the first matching value
|
||||
*/
|
||||
const getKeyByValue = (obj, value) => Object.keys(obj).find(key => obj[key] === value);
|
||||
// function getKeyByValue(object, value)
|
||||
// {
|
||||
// return Object.keys(object).find(key => object[key] === value);
|
||||
// }
|
||||
function getKeyByValue(object, value)
|
||||
{
|
||||
return Object.keys(object).find(key => object[key] === value);
|
||||
// return Object.keys(object).find(function (key) {
|
||||
// return object[key] === value;
|
||||
// });
|
||||
}
|
||||
|
||||
/**
|
||||
* returns true if value is found in object with a key
|
||||
@@ -319,18 +331,23 @@ const getKeyByValue = (obj, value) => Object.keys(obj).find(key => obj[key] ===
|
||||
* @param {Mixed} value any value (String, Number, etc)
|
||||
* @return {Boolean} true on value found, false on not found
|
||||
*/
|
||||
const valueInObject = (obj, value) => (Object.keys(obj).find(key => obj[key] === value)) ? true : false;
|
||||
function valueInObject(object, value)
|
||||
{
|
||||
return (Object.keys(object).find(key => object[key] === value)) ? true : false;
|
||||
// return Object.keys(object).find(function (key) {
|
||||
// return object[key] === value;
|
||||
// }) ? true : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* checks if a DOM element actually exists
|
||||
* @param {String} id Element id to check for
|
||||
* @return {Boolean} true if element exists, false on failure
|
||||
*/
|
||||
const exists = (id) => $('#' + id).length > 0 ? true : false;
|
||||
/*function exists(id)
|
||||
function exists(id)
|
||||
{
|
||||
return $('#' + id).length > 0 ? true : false;
|
||||
}*/
|
||||
}
|
||||
|
||||
/**
|
||||
* converts a int number into bytes with prefix in two decimals precision
|
||||
@@ -345,7 +362,6 @@ function formatBytes(bytes)
|
||||
bytes = bytes / 1024;
|
||||
i++;
|
||||
} while (bytes > 99);
|
||||
|
||||
return parseFloat(Math.round(bytes * Math.pow(10, 2)) / Math.pow(10, 2)) + ['kB', 'MB', 'GB', 'TB', 'PB', 'EB'][i];
|
||||
}
|
||||
|
||||
@@ -380,42 +396,52 @@ function errorCatch(err)
|
||||
|
||||
/**
|
||||
* show or hide the "do" overlay
|
||||
* @param {String} [loc=''] location name for action indicator, default empty. for console.log
|
||||
* @param {String} loc location name for action indicator
|
||||
* default empty. for console.log
|
||||
* @param {Boolean} [overlay=true] override the auto hide/show over the overlay div block
|
||||
*/
|
||||
function actionIndicator(loc = '')
|
||||
function actionIndicator(loc, overlay = true)
|
||||
{
|
||||
if ($('#overlayBox').is(':visible')) {
|
||||
actionIndicatorHide(loc);
|
||||
actionIndicatorHide(loc, overlay);
|
||||
} else {
|
||||
actionIndicatorShow(loc);
|
||||
actionIndicatorShow(loc, overlay);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* explicit show for action Indicator
|
||||
* instead of automatically show or hide, do on command show
|
||||
* @param {String} [loc=''] optional location name, empty if not set. for console.log
|
||||
* @param {String} loc location name for action indicator
|
||||
* default empty. for console.log
|
||||
* @param {Boolean} [overlay=true] override the auto hide/show over the overlay div block
|
||||
*/
|
||||
function actionIndicatorShow(loc = '')
|
||||
function actionIndicatorShow(loc, overlay = true)
|
||||
{
|
||||
console.log('Indicator: SHOW [%s]', loc);
|
||||
$('#indicator').addClass('progress');
|
||||
setCenter('indicator', true, true);
|
||||
$('#indicator').show();
|
||||
overlayBoxShow();
|
||||
if (overlay === true) {
|
||||
overlayBoxShow();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* explicit hide for action Indicator
|
||||
* instead of automatically show or hide, do on command hide
|
||||
* @param {String} [loc=''] optional location name, empty if not set. for console.log
|
||||
* @param {String} loc location name for action indicator
|
||||
* default empty. for console.log
|
||||
* @param {Boolean} [overlay=true] override the auto hide/show over the overlay div block
|
||||
*/
|
||||
function actionIndicatorHide(loc = '')
|
||||
function actionIndicatorHide(loc, overlay = true)
|
||||
{
|
||||
console.log('Indicator: HIDE [%s]', loc);
|
||||
$('#indicator').hide();
|
||||
$('#indicator').removeClass('progress');
|
||||
overlayBoxHide();
|
||||
if (overlay === true) {
|
||||
overlayBoxHide();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -449,11 +475,11 @@ function overlayBoxHide()
|
||||
*/
|
||||
function setOverlayBox()
|
||||
{
|
||||
var viewport = document.viewport.getDimensions();
|
||||
$('#overlayBox').setStyle ({
|
||||
/* var viewport = document.viewport.getDimensions();
|
||||
$('#overlayBox').css ({
|
||||
width: '100%',
|
||||
height: '100%'
|
||||
});
|
||||
});*/
|
||||
$('#overlayBox').show();
|
||||
}
|
||||
|
||||
@@ -477,8 +503,9 @@ function ClearCall()
|
||||
* @param {Object} [options={}] anything else (value, placeholder, OnClick, style)
|
||||
* @return {Object} created element as an object
|
||||
*/
|
||||
const cel = (tag, id = '', content = '', css = [], options = {}) =>
|
||||
_element = {
|
||||
function cel(tag, id = '', content = '', css = [], options = {})
|
||||
{
|
||||
return {
|
||||
tag: tag,
|
||||
id: id,
|
||||
name: options.name, // override name if set [name gets ignored in tree build anyway]
|
||||
@@ -487,6 +514,7 @@ const cel = (tag, id = '', content = '', css = [], options = {}) =>
|
||||
options: options,
|
||||
sub: []
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* attach a cel created object to another to create a basic DOM tree
|
||||
@@ -536,10 +564,11 @@ function aelx(base, ...attach)
|
||||
* @param {Object} base cel created element
|
||||
* @return {Object} returns reset base element
|
||||
*/
|
||||
const rel = (base) => {
|
||||
function rel(base)
|
||||
{
|
||||
base.sub = [];
|
||||
return base;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* searches and removes style from css array
|
||||
@@ -853,12 +882,12 @@ function parseQueryString(query = '', return_key = '') {
|
||||
function getQueryStringParam(key)
|
||||
{
|
||||
var url = new URL(window.location.href);
|
||||
var param = url.searchParams.get(key);
|
||||
if (param) {
|
||||
return param;
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
var param = url.searchParams.get(key);
|
||||
if (param) {
|
||||
return param;
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
// *** MASTER logout call
|
||||
@@ -878,4 +907,80 @@ function loginLogout()
|
||||
form.submit();
|
||||
}
|
||||
|
||||
/**
|
||||
* create login string and logout button elements
|
||||
* @param {String} login_string the login string to show on the left
|
||||
* @param {String} [header_id='mainHeader'] the target for the main element block
|
||||
* if not set mainHeader is assumed
|
||||
* this is the target div for the "loginRow"
|
||||
*/
|
||||
function createLoginRow(login_string, header_id = 'mainHeader')
|
||||
{
|
||||
// if header does not exist, we do nothing
|
||||
if (exists(header_id)) {
|
||||
// that row must exist already, if not it must be the first in the "mainHeader"
|
||||
if (!exists('loginRow')) {
|
||||
$('#' + header_id).html(phfo(cel('div', 'loginRow', '', ['loginRow', 'flx-spbt'])));
|
||||
}
|
||||
// clear out just in case for first entry
|
||||
// fill with div name & login/logout button
|
||||
$('#loginRow').html(phfo(cel('div', '', login_string)));
|
||||
$('#loginRow').append(phfo(
|
||||
aelx(
|
||||
// outer div
|
||||
cel('div'),
|
||||
// inner element
|
||||
cel('input', 'logout', '', [], {
|
||||
value: __('Logout'),
|
||||
type: 'button',
|
||||
onClick: 'loginLogout()'
|
||||
})
|
||||
)
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* create the top nav menu that switches physical between pages
|
||||
* (edit access data based)
|
||||
* @param {Object} nav_menu the built nav menu with highlight info
|
||||
* @param {String} [header_id='mainHeader'] the target for the main element block
|
||||
* if not set mainHeader is assumed
|
||||
* this is the target div for the "menuRow"
|
||||
*/
|
||||
function createNavMenu(nav_menu, header_id = 'mainHeader') {
|
||||
// must be an object
|
||||
if (isObject(nav_menu) && getObjectCount(nav_menu) > 1) {
|
||||
// do we have more than one entry, if not, do not show (single page)
|
||||
if (!exists('menuRow')) {
|
||||
$('#' + header_id).html(phfo(cel('div', 'menuRow', '', ['menuRow', 'flx-s'])));
|
||||
}
|
||||
var content = [];
|
||||
$.each(nav_menu, function(key, item) {
|
||||
// key is number
|
||||
// item is object with entries
|
||||
if (key != 0) {
|
||||
content.push(phfo(cel('div', '', '·', ['pd-2'])));
|
||||
}
|
||||
// ignore item.popup for now
|
||||
if (item.enabled) {
|
||||
// set selected based on window.location.href as the php set will not work
|
||||
if (window.location.href.indexOf(item.url) != -1) {
|
||||
item.selected = 1;
|
||||
}
|
||||
// create the entry
|
||||
content.push(phfo(
|
||||
aelx(
|
||||
cel('div'),
|
||||
cel('a', '', item.name, ['pd-2'].concat(item.selected ? 'highlight': ''), {
|
||||
href: item.url
|
||||
})
|
||||
)
|
||||
));
|
||||
}
|
||||
});
|
||||
$('#menuRow').html(content.join(''));
|
||||
}
|
||||
}
|
||||
|
||||
/* END */
|
||||
|
||||
@@ -3,8 +3,9 @@
|
||||
* firebug 1.2+ and the webkit console */
|
||||
|
||||
var ConsoleSetup = function() {
|
||||
if (!window.console)
|
||||
if (!window.console) {
|
||||
window.console = {};
|
||||
}
|
||||
|
||||
var names = ['log', 'debug', 'info', 'warn', 'error', 'assert', 'dir', 'dirxml', 'group', 'groupEnd', 'time', 'timeEnd', 'count', 'trace', 'profile', 'profileEnd'];
|
||||
|
||||
|
||||
@@ -115,10 +115,9 @@ class Login extends \CoreLibs\DB\IO
|
||||
/**
|
||||
* constructor, does ALL, opens db, works through connection checks, closes itself
|
||||
* @param array $db_config db config array
|
||||
* @param string $lang language string (default en_utf8)
|
||||
* @param int $set_control_flag class variable check flags
|
||||
*/
|
||||
public function __construct(array $db_config, string $lang = 'en_utf8', int $set_control_flag = 0)
|
||||
public function __construct(array $db_config, int $set_control_flag = 0)
|
||||
{
|
||||
// log login data for this class only
|
||||
$this->log_per_class = 1;
|
||||
@@ -150,8 +149,14 @@ class Login extends \CoreLibs\DB\IO
|
||||
|
||||
// set global is ajax page for if we show the data directly, or need to pass it back
|
||||
// to the continue AJAX class for output back to the user
|
||||
$this->login_is_ajax_page = $this->ajax_page_flag;
|
||||
|
||||
$this->login_is_ajax_page = isset($GLOBALS['AJAX_PAGE']) && $GLOBALS['AJAX_PAGE'] ? true : false;
|
||||
// set the default lang
|
||||
$lang = 'en_utf8';
|
||||
if (session_id() && isset($_SESSION['DEFAULT_LANG']) && $_SESSION['DEFAULT_LANG']) {
|
||||
$lang = $_SESSION['DEFAULT_LANG'];
|
||||
} else {
|
||||
$lang = defined('SITE_LANG') ? SITE_LANG : DEFAULT_LANG;
|
||||
}
|
||||
$this->l = new \CoreLibs\Language\L10n($lang);
|
||||
|
||||
// if we have a search path we need to set it, to use the correct DB to login
|
||||
@@ -173,44 +178,17 @@ class Login extends \CoreLibs\DB\IO
|
||||
$this->euid = array_key_exists('EUID', $_SESSION) ? $_SESSION['EUID'] : 0; // if there is none, there is none, saves me POST/GET check
|
||||
// get login vars, are so, can't be changed
|
||||
// prepare
|
||||
if (!isset($_POST['login_login'])) {
|
||||
$_POST['login_login'] = '';
|
||||
}
|
||||
if (!isset($_POST['login_username'])) {
|
||||
$_POST['login_username'] = '';
|
||||
}
|
||||
if (!isset($_POST['login_password'])) {
|
||||
$_POST['login_password'] = '';
|
||||
}
|
||||
if (!isset($_POST['login_logout'])) {
|
||||
$_POST['login_logout'] = '';
|
||||
}
|
||||
if (!isset($_POST['change_password'])) {
|
||||
$_POST['change_password'] = '';
|
||||
}
|
||||
if (!isset($_POST['pw_username'])) {
|
||||
$_POST['pw_username'] = '';
|
||||
}
|
||||
if (!isset($_POST['pw_old_password'])) {
|
||||
$_POST['pw_old_password'] = '';
|
||||
}
|
||||
if (!isset($_POST['pw_new_password'])) {
|
||||
$_POST['pw_new_password'] = '';
|
||||
}
|
||||
if (!isset($_POST['pw_new_password_confirm'])) {
|
||||
$_POST['pw_new_password_confirm'] = '';
|
||||
}
|
||||
// pass on vars to Object vars
|
||||
$this->login = $_POST['login_login'];
|
||||
$this->username = $_POST['login_username'];
|
||||
$this->password = $_POST['login_password'];
|
||||
$this->logout = $_POST['login_logout'];
|
||||
$this->login = isset($_POST['login_login']) ? $_POST['login_login'] : '';
|
||||
$this->username = isset($_POST['login_username']) ? $_POST['login_username'] : '';
|
||||
$this->password = isset($_POST['login_password']) ? $_POST['login_password'] : '';
|
||||
$this->logout = isset($_POST['login_logout']) ? $_POST['login_logout'] : '';
|
||||
// password change vars
|
||||
$this->change_password = $_POST['change_password'];
|
||||
$this->pw_username = $_POST['pw_username'];
|
||||
$this->pw_old_password = $_POST['pw_old_password'];
|
||||
$this->pw_new_password = $_POST['pw_new_password'];
|
||||
$this->pw_new_password_confirm = $_POST['pw_new_password_confirm'];
|
||||
$this->change_password = isset($_POST['change_password']) ? $_POST['change_password'] : '';
|
||||
$this->pw_username = isset($_POST['pw_username']) ? $_POST['pw_username'] : '';
|
||||
$this->pw_old_password = isset($_POST['pw_old_password']) ? $_POST['pw_old_password'] : '';
|
||||
$this->pw_new_password = isset($_POST['pw_new_password']) ? $_POST['pw_new_password'] : '';
|
||||
$this->pw_new_password_confirm = isset($_POST['pw_new_password_confirm']) ? $_POST['pw_new_password_confirm'] : '';
|
||||
// logout target (from config)
|
||||
$this->logout_target = LOGOUT_TARGET;
|
||||
// disallow user list for password change
|
||||
@@ -367,7 +345,7 @@ class Login extends \CoreLibs\DB\IO
|
||||
* if user pressed login button this script is called, but only if there is no preview euid set]
|
||||
* @return void has not return
|
||||
*/
|
||||
private function loginLoginUser()
|
||||
private function loginLoginUser(): void
|
||||
{
|
||||
// have to get the global stuff here for setting it later
|
||||
if (!$this->euid && $this->login) {
|
||||
@@ -456,7 +434,9 @@ class Login extends \CoreLibs\DB\IO
|
||||
$pages = array();
|
||||
$pages_acl = array();
|
||||
// set pages access
|
||||
$q = "SELECT ep.edit_page_id, ep.cuid, epca.cuid AS content_alias_uid, ep.filename, ep.name AS edit_page_name, ep.order_number AS edit_page_order, ep.menu, ";
|
||||
$q = "SELECT ep.edit_page_id, ep.cuid, epca.cuid AS content_alias_uid, ";
|
||||
$q .= "ep.hostname, ep.filename, ep.name AS edit_page_name, ";
|
||||
$q .= "ep.order_number AS edit_page_order, ep.menu, ";
|
||||
$q .= "ep.popup, ep.popup_x, ep.popup_y, ep.online, ear.level, ear.type ";
|
||||
$q .= "FROM edit_page ep ";
|
||||
$q .= "LEFT JOIN edit_page epca ON (epca.edit_page_id = ep.content_alias_edit_page_id)";
|
||||
@@ -472,6 +452,7 @@ class Login extends \CoreLibs\DB\IO
|
||||
'edit_page_id' => $res['edit_page_id'],
|
||||
'cuid' => $res['cuid'],
|
||||
'content_alias_uid' => $res['content_alias_uid'], // for reference of content data on a differen page
|
||||
'hostname' => $res['hostname'],
|
||||
'filename' => $res['filename'],
|
||||
'page_name' => $res['edit_page_name'],
|
||||
'order' => $res['edit_page_order'],
|
||||
@@ -606,7 +587,7 @@ class Login extends \CoreLibs\DB\IO
|
||||
* for every page the user access this script checks if he is allowed to do so
|
||||
* @return bool permission okay as true/false
|
||||
*/
|
||||
public function loginCheckPermissions()
|
||||
public function loginCheckPermissions(): bool
|
||||
{
|
||||
if ($this->euid && $this->login_error != 103) {
|
||||
$q = "SELECT filename ";
|
||||
@@ -632,7 +613,7 @@ class Login extends \CoreLibs\DB\IO
|
||||
* if a user pressed on logout, destroyes session and unsets all global vars
|
||||
* @return void has no return
|
||||
*/
|
||||
public function loginLogoutUser()
|
||||
public function loginLogoutUser(): void
|
||||
{
|
||||
if ($this->logout || $this->login_error) {
|
||||
// unregister and destroy session vars
|
||||
@@ -692,10 +673,13 @@ class Login extends \CoreLibs\DB\IO
|
||||
* set all base ACL levels as a list keyword -> ACL number
|
||||
* @return void has no return
|
||||
*/
|
||||
private function loginSetAcl()
|
||||
private function loginSetAcl(): void
|
||||
{
|
||||
// only set acl if we have permission okay
|
||||
if ($this->permission_okay) {
|
||||
// username (login), group name
|
||||
$this->acl['user_name'] = $_SESSION['USER_NAME'];
|
||||
$this->acl['group_name'] = $_SESSION['GROUP_NAME'];
|
||||
// we start with the default acl
|
||||
$this->acl['base'] = DEFAULT_ACL_LEVEL;
|
||||
|
||||
@@ -782,8 +766,8 @@ class Login extends \CoreLibs\DB\IO
|
||||
|
||||
/**
|
||||
* checks if this edit access id is valid
|
||||
* @param int $edit_access_id access id pk to check
|
||||
* @return bool true/false: if the edit access is not in the valid list: false
|
||||
* @param int|null $edit_access_id access id pk to check
|
||||
* @return bool true/false: if the edit access is not in the valid list: false
|
||||
*/
|
||||
public function loginCheckEditAccess($edit_access_id): bool
|
||||
{
|
||||
@@ -799,7 +783,7 @@ class Login extends \CoreLibs\DB\IO
|
||||
* @param string $password the new password
|
||||
* @return bool true or false if valid password or not
|
||||
*/
|
||||
private function loginPasswordChangeValidPassword($password)
|
||||
private function loginPasswordChangeValidPassword($password): bool
|
||||
{
|
||||
$is_valid_password = true;
|
||||
// check for valid in regex arrays in list
|
||||
@@ -821,7 +805,7 @@ class Login extends \CoreLibs\DB\IO
|
||||
* dummy declare for password forget
|
||||
* @return void has no return
|
||||
*/
|
||||
private function loginPasswordForgot()
|
||||
private function loginPasswordForgot(): void
|
||||
{
|
||||
// will do some password recovert, eg send email
|
||||
}
|
||||
@@ -847,7 +831,7 @@ class Login extends \CoreLibs\DB\IO
|
||||
* changes a user password
|
||||
* @return void has no return
|
||||
*/
|
||||
private function loginPasswordChange()
|
||||
private function loginPasswordChange(): void
|
||||
{
|
||||
if ($this->change_password) {
|
||||
$event = 'Password Change';
|
||||
@@ -1029,7 +1013,7 @@ class Login extends \CoreLibs\DB\IO
|
||||
* checks if there are external templates, if not uses internal fallback ones
|
||||
* @return void has no return
|
||||
*/
|
||||
private function loginSetTemplates()
|
||||
private function loginSetTemplates(): void
|
||||
{
|
||||
$strings = array(
|
||||
'HTML_TITLE' => $this->l->__('LOGIN'),
|
||||
@@ -1188,7 +1172,7 @@ EOM;
|
||||
* @param string $username login user username
|
||||
* @return void has no return
|
||||
*/
|
||||
private function writeLog(string $event, string $data, $error = '', string $username = '')
|
||||
private function writeLog(string $event, string $data, $error = '', string $username = ''): void
|
||||
{
|
||||
if ($this->login) {
|
||||
$this->action = 'Login';
|
||||
@@ -1233,28 +1217,33 @@ EOM;
|
||||
}
|
||||
|
||||
/**
|
||||
*checks that the given edit access id is valid for this user
|
||||
* @param int $edit_access_id edit access id to check
|
||||
* @return int same edit access id if ok, or the default edit access id if given one is not valid
|
||||
* checks that the given edit access id is valid for this user
|
||||
* @param int|null $edit_access_id edit access id to check
|
||||
* @return int|null same edit access id if ok
|
||||
* or the default edit access id if given one is not valid
|
||||
*/
|
||||
public function loginCheckEditAccessId(int $edit_access_id)
|
||||
public function loginCheckEditAccessId(?int $edit_access_id): ?int
|
||||
{
|
||||
if (!array_key_exists($edit_access_id, $_SESSION["UNIT"])) {
|
||||
return $_SESSION["UNIT_DEFAULT"];
|
||||
if (isset($_SESSION['UNIT']) &&
|
||||
is_array($_SESSION['UNIT']) &&
|
||||
!array_key_exists($edit_access_id, $_SESSION['UNIT'])
|
||||
) {
|
||||
return $_SESSION['UNIT_DEFAULT'];
|
||||
} else {
|
||||
return $edit_access_id;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* [loginSetEditAccessData description]
|
||||
* retunrn a set entry from the UNIT session for an edit access_id
|
||||
* if not found return false
|
||||
* @param int $edit_access_id edit access id
|
||||
* @param string|int $data_key key value to search for
|
||||
* @return bool|string false for not found or string for found data
|
||||
*/
|
||||
public function loginSetEditAccessData(int $edit_access_id, $data_key)
|
||||
{
|
||||
if (!$_SESSION['UNIT'][$edit_access_id]['data'][$data_key]) {
|
||||
if (!isset($_SESSION['UNIT'][$edit_access_id]['data'][$data_key])) {
|
||||
return false;
|
||||
} else {
|
||||
return $_SESSION['UNIT'][$edit_access_id]['data'][$data_key];
|
||||
|
||||
@@ -52,45 +52,30 @@ class Backend extends \CoreLibs\DB\IO
|
||||
public $error = 0;
|
||||
public $warning = 0;
|
||||
public $info = 0;
|
||||
// smarty publics
|
||||
// internal lang & encoding vars
|
||||
public $lang_dir = '';
|
||||
public $lang;
|
||||
public $lang_short;
|
||||
public $encoding;
|
||||
// language
|
||||
public $l;
|
||||
// smarty publics [end processing in smarty class]
|
||||
public $DATA;
|
||||
public $HEADER;
|
||||
public $DEBUG_DATA;
|
||||
public $CONTENT_DATA;
|
||||
// smarty include/set var
|
||||
public $INC_TEMPLATE_NAME;
|
||||
public $JS_TEMPLATE_NAME;
|
||||
public $CSS_TEMPLATE_NAME;
|
||||
public $CSS_SPECIAL_TEMPLATE_NAME;
|
||||
public $JS_SPECIAL_TEMPLATE_NAME;
|
||||
public $CACHE_ID;
|
||||
public $COMPILE_ID;
|
||||
public $includes;
|
||||
public $template_path;
|
||||
public $lang_dir = '';
|
||||
public $javascript;
|
||||
public $css;
|
||||
public $pictures;
|
||||
public $cache_pictures;
|
||||
public $cache_pictures_root;
|
||||
public $JS_INCLUDE;
|
||||
public $JS_SPECIAL_INCLUDE;
|
||||
public $CSS_INCLUDE;
|
||||
public $CSS_SPECIAL_INCLUDE;
|
||||
// language
|
||||
public $l;
|
||||
|
||||
// CONSTRUCTOR / DECONSTRUCTOR |====================================>
|
||||
/**
|
||||
* main class constructor
|
||||
* @param array $db_config db config array
|
||||
* @param string $lang language string
|
||||
* @param int|integer $set_control_flag class variable check flag
|
||||
*/
|
||||
public function __construct(array $db_config, string $lang, int $set_control_flag = 0)
|
||||
public function __construct(array $db_config, int $set_control_flag = 0)
|
||||
{
|
||||
$this->setLangEncoding();
|
||||
// get the language sub class & init it
|
||||
$this->l = new \CoreLibs\Language\L10n($lang);
|
||||
$this->l = new \CoreLibs\Language\L10n($this->lang);
|
||||
|
||||
// init the database class
|
||||
parent::__construct($db_config, $set_control_flag);
|
||||
@@ -118,9 +103,52 @@ class Backend extends \CoreLibs\DB\IO
|
||||
|
||||
// INTERNAL METHODS |===============================================>
|
||||
|
||||
/**
|
||||
* set the language encoding and language settings
|
||||
* use $OVERRIDE_LANG to override all language settings
|
||||
* the default charset from _SESSION login or from
|
||||
* config DEFAULT ENCODING
|
||||
* the lang full name for mo loading from _SESSION login
|
||||
* or SITE LANG or DEFAULT LANG from config
|
||||
* creates short lang (only first two chars) from the lang
|
||||
* @return void
|
||||
*/
|
||||
private function setLangEncoding(): void
|
||||
{
|
||||
// just emergency fallback for language
|
||||
// set encoding
|
||||
if (isset($_SESSION['DEFAULT_CHARSET'])) {
|
||||
$this->encoding = $_SESSION['DEFAULT_CHARSET'];
|
||||
} else {
|
||||
$this->encoding = DEFAULT_ENCODING;
|
||||
}
|
||||
// gobal override
|
||||
if (isset($GLOBALS['OVERRIDE_LANG'])) {
|
||||
$this->lang = $GLOBALS['OVERRIDE_LANG'];
|
||||
} elseif (isset($_SESSION['DEFAULT_LANG'])) {
|
||||
// session (login)
|
||||
$this->lang = $_SESSION['DEFAULT_LANG'];
|
||||
} else {
|
||||
// mostly default SITE LANG or DEFAULT LANG
|
||||
$this->lang = defined('SITE_LANG') ? SITE_LANG : DEFAULT_LANG;
|
||||
}
|
||||
// create the char lang encoding
|
||||
$this->lang_short = substr($this->lang, 0, 2);
|
||||
// set the language folder
|
||||
$this->lang_dir = BASE.INCLUDES.LANG.CONTENT_PATH;
|
||||
}
|
||||
|
||||
// PUBLIC METHODS |=================================================>
|
||||
|
||||
/**
|
||||
* set internal ACL from login ACL
|
||||
* @param array $acl login acl array
|
||||
*/
|
||||
public function setACL(array $acl): void
|
||||
{
|
||||
$this->acl = $acl;
|
||||
}
|
||||
|
||||
/**
|
||||
* writes all action vars plus other info into edit_log tabl
|
||||
* @param string $event any kind of event description,
|
||||
@@ -157,9 +185,9 @@ class Backend extends \CoreLibs\DB\IO
|
||||
$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 .= "(".$this->dbEscapeString(isset($_SESSION['EUID']) ? $_SESSION['EUID'] : '').", ";
|
||||
$q .= "(".$this->dbEscapeString(isset($_SESSION['EUID']) && is_numeric($_SESSION['EUID']) ? $_SESSION['EUID'] : 'NULL').", ";
|
||||
$q .= "NOW(), ";
|
||||
$q .= "'".$this->dbEscapeString((string)$event)."', '".$data."', '".$data_binary."', '".$this->dbEscapeString($this->page_name)."', ";
|
||||
$q .= "'".$this->dbEscapeString((string)$event)."', '".$data."', '".$data_binary."', '".$this->dbEscapeString((string)$this->page_name)."', ";
|
||||
$q .= "'".@$_SERVER["REMOTE_ADDR"]."', '".$this->dbEscapeString(@$_SERVER['HTTP_USER_AGENT'])."', ";
|
||||
$q .= "'".$this->dbEscapeString(isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '')."', ";
|
||||
$q .= "'".$this->dbEscapeString(isset($_SERVER['SCRIPT_FILENAME']) ? $_SERVER['SCRIPT_FILENAME'] : '')."', ";
|
||||
@@ -205,13 +233,14 @@ class Backend extends \CoreLibs\DB\IO
|
||||
// if flag is 0, then we show all, else, we show only the matching flagges array points
|
||||
// array is already sorted after correct order
|
||||
reset($pages);
|
||||
for ($i = 0, $iMax = count($pages); $i < $iMax; $i ++) {
|
||||
foreach ($pages as $i => $data) {
|
||||
// for ($i = 0, $iMax = count($pages); $i < $iMax; $i ++) {
|
||||
$show = 0;
|
||||
// is it visible in the menu & is it online
|
||||
if ($pages[$i]['menu'] && $pages[$i]['online']) {
|
||||
if ($data['menu'] && $data['online']) {
|
||||
// check if it falls into our flag if we have a flag
|
||||
if ($flag) {
|
||||
foreach ($pages[$i]['visible'] as $name => $key) {
|
||||
foreach ($data['visible'] as $name => $key) {
|
||||
if ($key == $flag) {
|
||||
$show = 1;
|
||||
}
|
||||
@@ -223,40 +252,68 @@ class Backend extends \CoreLibs\DB\IO
|
||||
|
||||
if ($show) {
|
||||
// if it is popup, write popup arrayound
|
||||
if (isset($pages[$i]['popup']) && $pages[$i]['popup']) {
|
||||
if (isset($data['popup']) && $data['popup']) {
|
||||
$type = 'popup';
|
||||
} else {
|
||||
$type = 'normal';
|
||||
$pages[$i]['popup'] = 0;
|
||||
/** @phan-suppress-next-line PhanTypeArraySuspicious */
|
||||
$data['popup'] = 0;
|
||||
}
|
||||
$query_string = '';
|
||||
if (isset($pages[$i]['query']) && count($pages[$i]['query'])) {
|
||||
for ($j = 0, $jMax = count($pages[$i]['query']); $j < $jMax; $j ++) {
|
||||
if (strlen($query_string)) {
|
||||
$query_string .= '&';
|
||||
}
|
||||
$query_string .= $pages[$i]['query'][$j]['name'].'=';
|
||||
if (!$pages[$i]['query'][$j]['dynamic']) {
|
||||
$query_string .= urlencode($pages[$i]['query'][$j]['value']);
|
||||
} else {
|
||||
$query_string .= $_GET[$pages[$i]['query'][$j]['value']] ? urlencode($_GET[$pages[$i]['query'][$j]['value']]) : urlencode($_POST[$pages[$i]['query'][$j]['value']]);
|
||||
|
||||
if (isset($data['query']) &&
|
||||
is_array($data['query']) &&
|
||||
count($data['query'])
|
||||
) {
|
||||
// for ($j = 0, $jMax = count($pages[$i]['query']); $j < $jMax; $j ++) {
|
||||
foreach ($data['query'] as $j => $query) {
|
||||
if (!empty($query['name']) &&
|
||||
!empty($query['value'])
|
||||
) {
|
||||
if (strlen($query_string)) {
|
||||
$query_string .= '&';
|
||||
}
|
||||
$query_string .= $query['name'].'=';
|
||||
if (isset($query['dynamic']) &&
|
||||
$query['dynamic']
|
||||
) {
|
||||
if (isset($_GET[$query['value']])) {
|
||||
$query_string .= urlencode($_GET[$query['value']]);
|
||||
} elseif (isset($_POST[$query['value']])) {
|
||||
$query_string .= urlencode($_POST[$query['value']]);
|
||||
}
|
||||
} else {
|
||||
$query_string .= urlencode($query['value']);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$url = $pages[$i]['filename'];
|
||||
$url = '';
|
||||
if (isset($data['hostname']) && $data['hostname']) {
|
||||
$url .= $data['hostname'];
|
||||
}
|
||||
$url .= isset($data['filename']) ? $data['filename'] : '';
|
||||
if (strlen($query_string)) {
|
||||
$url .= '?'.$query_string;
|
||||
}
|
||||
$name = $pages[$i]['page_name'];
|
||||
$name = isset($data['page_name']) ? $data['page_name'] : '';
|
||||
// if page name matchs -> set selected flag
|
||||
$selected = 0;
|
||||
if ($this->getPageName() == $pages[$i]['filename']) {
|
||||
if (isset($data['filename']) &&
|
||||
$this->getPageName() == $data['filename'] &&
|
||||
(!isset($data['hostname']) || (
|
||||
isset($data['hostname']) &&
|
||||
(!$data['hostname'] || strstr($data['hostname'], CONTENT_PATH) !== false)
|
||||
))
|
||||
) {
|
||||
$selected = 1;
|
||||
$this->page_name = $name;
|
||||
}
|
||||
// last check, is this menu point okay to show
|
||||
$enabled = 0;
|
||||
if ($this->adbShowMenuPoint($pages[$i]['filename'])) {
|
||||
if (isset($data['filename']) &&
|
||||
$this->adbShowMenuPoint($data['filename'])
|
||||
) {
|
||||
$enabled = 1;
|
||||
}
|
||||
// write in to view menu array
|
||||
@@ -276,12 +333,15 @@ class Backend extends \CoreLibs\DB\IO
|
||||
|
||||
/**
|
||||
* checks if this filename is in the current situation (user id, etc) available
|
||||
* @param string $filename filename
|
||||
* @return bool true for visible/accessable menu point, false for not
|
||||
* @param string|null $filename filename
|
||||
* @return bool true for visible/accessable menu point, false for not
|
||||
*/
|
||||
public function adbShowMenuPoint(string $filename): bool
|
||||
public function adbShowMenuPoint(?string $filename): bool
|
||||
{
|
||||
$enabled = false;
|
||||
if ($filename === null) {
|
||||
return $enabled;
|
||||
}
|
||||
switch ($filename) {
|
||||
default:
|
||||
$enabled = true;
|
||||
@@ -313,7 +373,7 @@ class Backend extends \CoreLibs\DB\IO
|
||||
public function adbByteStringFormat($number): string
|
||||
{
|
||||
trigger_error('Method '.__METHOD__.' is deprecated', E_USER_DEPRECATED);
|
||||
return $this->byteStringFormat($number);
|
||||
return $this->humanReadableByteFormat($number);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -100,6 +100,10 @@ class Basic
|
||||
// define check vars for the flags we can have
|
||||
const CLASS_STRICT_MODE = 1;
|
||||
const CLASS_OFF_COMPATIBLE_MODE = 2;
|
||||
// define byteFormat
|
||||
const BYTE_FORMAT_NOSPACE = 1;
|
||||
const BYTE_FORMAT_ADJUST = 2;
|
||||
const BYTE_FORMAT_SI = 4;
|
||||
// control vars
|
||||
/** @var bool compatible mode sets variable even if it is not defined */
|
||||
private $set_compatible = true;
|
||||
@@ -682,6 +686,63 @@ class Basic
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* checks if we have a need to work on certain debug output
|
||||
* Needs debug/echo/print ad target for which of the debug flag groups we check
|
||||
* also needs level string to check in the per level output flag check.
|
||||
* In case we have invalid target it will return false
|
||||
* @param string $target target group to check debug/echo/print
|
||||
* @param string $level level to check in detailed level flag
|
||||
* @return bool true on access allowed or false on no access
|
||||
*/
|
||||
private function doDebugTrigger(string $target, string $level): bool
|
||||
{
|
||||
$access = false;
|
||||
// check if we do debug, echo or print
|
||||
switch ($target) {
|
||||
case 'debug':
|
||||
if ((
|
||||
(isset($this->debug_output[$level]) && $this->debug_output[$level]) ||
|
||||
$this->debug_output_all
|
||||
) &&
|
||||
(!isset($this->debug_output_not[$level]) ||
|
||||
(isset($this->debug_output_not[$level]) && !$this->debug_output_not[$level])
|
||||
)
|
||||
) {
|
||||
$access = true;
|
||||
}
|
||||
break;
|
||||
case 'echo':
|
||||
if ((
|
||||
(isset($this->echo_output[$level]) && $this->echo_output[$level]) ||
|
||||
$this->echo_output_all
|
||||
) &&
|
||||
(!isset($this->echo_output_not[$level]) ||
|
||||
(isset($this->echo_output_not[$level]) && !$this->echo_output_not[$level])
|
||||
)
|
||||
) {
|
||||
$access = true;
|
||||
}
|
||||
break;
|
||||
case 'print':
|
||||
if ((
|
||||
(isset($this->print_output[$level]) && $this->print_output[$level]) ||
|
||||
$this->print_output_all
|
||||
) &&
|
||||
(!isset($this->print_output_not[$level]) ||
|
||||
(isset($this->print_output_not[$level]) && !$this->print_output_not[$level])
|
||||
)
|
||||
) {
|
||||
$access = true;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
// fall through with access false
|
||||
break;
|
||||
}
|
||||
return $access;
|
||||
}
|
||||
|
||||
/**
|
||||
* write debug data to error_msg array
|
||||
* @param string $level id for error message, groups messages together
|
||||
@@ -693,7 +754,7 @@ class Basic
|
||||
*/
|
||||
public function debug(string $level, string $string, bool $strip = false): void
|
||||
{
|
||||
if (($this->debug_output[$level] || $this->debug_output_all) && !$this->debug_output_not[$level]) {
|
||||
if ($this->doDebugTrigger('debug', $level)) {
|
||||
if (!isset($this->error_msg[$level])) {
|
||||
$this->error_msg[$level] = '';
|
||||
}
|
||||
@@ -717,7 +778,7 @@ class Basic
|
||||
// write to file if set
|
||||
$this->writeErrorMsg($level, $error_string_print);
|
||||
// write to error level
|
||||
if (($this->echo_output[$level] || $this->echo_output_all) && !$this->echo_output_not[$level]) {
|
||||
if ($this->doDebugTrigger('echo', $level)) {
|
||||
$this->error_msg[$level] .= $error_string;
|
||||
}
|
||||
}
|
||||
@@ -778,8 +839,8 @@ class Basic
|
||||
}
|
||||
$script_end = microtime(true) - $this->script_starttime;
|
||||
foreach ($this->error_msg as $level => $temp_debug_output) {
|
||||
if (($this->debug_output[$level] || $this->debug_output_all) && !$this->debug_output_not[$level]) {
|
||||
if (($this->echo_output[$level] || $this->echo_output_all) && !$this->echo_output_not[$level]) {
|
||||
if ($this->doDebugTrigger('debug', $level)) {
|
||||
if ($this->doDebugTrigger('echo', $level)) {
|
||||
$string_output .= '<div style="font-size: 12px;">[<span style="font-style: italic; color: #c56c00;">'.$level.'</span>] '.(($string) ? "<b>**** ".$this->htmlent($string)." ****</b>\n" : "").'</div>';
|
||||
$string_output .= $temp_debug_output;
|
||||
} // echo it out
|
||||
@@ -805,9 +866,9 @@ class Basic
|
||||
*/
|
||||
private function writeErrorMsg(string $level, string $error_string): void
|
||||
{
|
||||
if (($this->debug_output[$level] || $this->debug_output_all) && !$this->debug_output_not[$level]) {
|
||||
if ($this->doDebugTrigger('debug', $level)) {
|
||||
// only write if write is requested
|
||||
if (($this->print_output[$level] || $this->print_output_all) && !$this->print_output_not[$level]) {
|
||||
if ($this->doDebugTrigger('print', $level)) {
|
||||
// replace all html tags
|
||||
// $error_string = preg_replace("/(<\/?)(\w+)([^>]*>)/", "##\\2##", $error_string);
|
||||
// $error_string = preg_replace("/(<\/?)(\w+)([^>]*>)/", "", $error_string);
|
||||
@@ -891,6 +952,42 @@ class Basic
|
||||
return "<pre>".print_r($array, true)."</pre>";
|
||||
}
|
||||
|
||||
/**
|
||||
* helper function for PHP file upload error messgaes to messge string
|
||||
* @param int $error_code integer _FILE upload error code
|
||||
* @return string message string, translated
|
||||
*/
|
||||
public function fileUploadErrorMessage(int $error_code): string
|
||||
{
|
||||
switch ($error_code) {
|
||||
case UPLOAD_ERR_INI_SIZE:
|
||||
$message = 'The uploaded file exceeds the upload_max_filesize directive in php.ini';
|
||||
break;
|
||||
case UPLOAD_ERR_FORM_SIZE:
|
||||
$message = 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form';
|
||||
break;
|
||||
case UPLOAD_ERR_PARTIAL:
|
||||
$message = 'The uploaded file was only partially uploaded';
|
||||
break;
|
||||
case UPLOAD_ERR_NO_FILE:
|
||||
$message = 'No file was uploaded';
|
||||
break;
|
||||
case UPLOAD_ERR_NO_TMP_DIR:
|
||||
$message = 'Missing a temporary folder';
|
||||
break;
|
||||
case UPLOAD_ERR_CANT_WRITE:
|
||||
$message = 'Failed to write file to disk';
|
||||
break;
|
||||
case UPLOAD_ERR_EXTENSION:
|
||||
$message = 'File upload stopped by extension';
|
||||
break;
|
||||
default:
|
||||
$message = 'Unknown upload error';
|
||||
break;
|
||||
}
|
||||
return $message;
|
||||
}
|
||||
|
||||
// ****** DEBUG/ERROR FUNCTIONS ******
|
||||
|
||||
// ****** RANDOM KEY GEN ******
|
||||
@@ -1100,6 +1197,8 @@ class Basic
|
||||
return "href=##QUOT##$_1$_2$_3##QUOT##";
|
||||
} elseif ($atag) {
|
||||
return $atag.$_2.$_3;
|
||||
} else {
|
||||
return $href;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1174,7 +1273,7 @@ class Basic
|
||||
public static function getFilenameEnding(string $filename): string
|
||||
{
|
||||
$page_temp = pathinfo($filename);
|
||||
return $page_temp['extension'];
|
||||
return isset($page_temp['extension']) ? $page_temp['extension'] : '';
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1200,12 +1299,22 @@ class Basic
|
||||
$path[] = $key_lookin;
|
||||
} else {
|
||||
foreach ($haystack as $key => $val) {
|
||||
if (is_scalar($val) && $val === $needle && empty($key_lookin)) {
|
||||
break;
|
||||
} elseif (is_scalar($val) && !empty($key_lookin) && $key === $key_lookin && $val == $needle) {
|
||||
if (is_scalar($val) &&
|
||||
$val === $needle &&
|
||||
empty($key_lookin)
|
||||
) {
|
||||
$path[] = $key;
|
||||
break;
|
||||
} elseif (is_array($val) && $path = Basic::arraySearchRecursive($needle, $val, $key_lookin)) {
|
||||
} elseif (is_scalar($val) &&
|
||||
!empty($key_lookin) &&
|
||||
$key === $key_lookin &&
|
||||
$val == $needle
|
||||
) {
|
||||
$path[] = $key;
|
||||
break;
|
||||
} elseif (is_array($val) &&
|
||||
$path = Basic::arraySearchRecursive($needle, $val, $key_lookin)
|
||||
) {
|
||||
array_unshift($path, $key);
|
||||
break;
|
||||
}
|
||||
@@ -1224,16 +1333,27 @@ class Basic
|
||||
*/
|
||||
public static function arraySearchRecursiveAll($needle, array $haystack, $key, $path = null): ?array
|
||||
{
|
||||
// init if not set on null
|
||||
if ($path === null) {
|
||||
$path = array(
|
||||
'level' => 0,
|
||||
'work' => array()
|
||||
);
|
||||
}
|
||||
// init sub sets if not set
|
||||
if (!isset($path['level'])) {
|
||||
$path['level'] = 0;
|
||||
}
|
||||
if (!isset($path['work'])) {
|
||||
$path['work'] = array();
|
||||
}
|
||||
// should not be needed because it would trigger a php mehtod error
|
||||
if (!is_array($haystack)) {
|
||||
$haystack = array();
|
||||
}
|
||||
|
||||
// @phan HACK
|
||||
$path['level'] = $path['level'] ?? 0;
|
||||
// go through the array,
|
||||
foreach ($haystack as $_key => $_value) {
|
||||
if (is_scalar($_value) && $_value == $needle && !$key) {
|
||||
@@ -1253,6 +1373,9 @@ class Basic
|
||||
$path = Basic::arraySearchRecursiveAll($needle, $_value, $key, $path);
|
||||
}
|
||||
}
|
||||
// @phan HACK
|
||||
$path['level'] = $path['level'] ?? 0;
|
||||
$path['work'] = $path['work'] ?? array();
|
||||
// cut all that is >= level
|
||||
array_splice($path['work'], $path['level']);
|
||||
// step back a level
|
||||
@@ -1344,6 +1467,21 @@ class Basic
|
||||
return $merged;
|
||||
}
|
||||
|
||||
/**
|
||||
* correct array_diff that does an actualy difference between two arrays.
|
||||
* array_diff only checks elements from A that are not in B, but not the
|
||||
* other way around.
|
||||
* Note that like array_diff this only checks first level values not keys
|
||||
* @param array $a array to compare a
|
||||
* @param array $b array to compare b
|
||||
* @return array array with missing elements from a & b
|
||||
*/
|
||||
public static function arrayDiff(array $a, array $b): array
|
||||
{
|
||||
$intersect = array_intersect($a, $b);
|
||||
return array_merge(array_diff($a, $intersect), array_diff($b, $intersect));
|
||||
}
|
||||
|
||||
/**
|
||||
* search for the needle array elements in haystack and return the ones found as an array,
|
||||
* is there nothing found, it returns FALSE (boolean)
|
||||
@@ -1481,6 +1619,31 @@ class Basic
|
||||
return $array;
|
||||
}
|
||||
|
||||
/**
|
||||
* get lines in a file
|
||||
* @param string $file file for line count read
|
||||
* @return int number of lines or -1 for non readable file
|
||||
*/
|
||||
public static function getLinesFromFile(string $file): int
|
||||
{
|
||||
if (is_file($file) &&
|
||||
file_exists($file) &&
|
||||
is_readable($file)
|
||||
) {
|
||||
$f = fopen($file, 'rb');
|
||||
$lines = 0;
|
||||
while (!feof($f)) {
|
||||
$lines += substr_count(fread($f, 8192), "\n");
|
||||
}
|
||||
fclose($f);
|
||||
} else {
|
||||
// if file does not exist or is not readable, return -1
|
||||
$lines = -1;
|
||||
}
|
||||
// return lines in file
|
||||
return $lines;
|
||||
}
|
||||
|
||||
/**
|
||||
* wrapper function for mb mime convert, for correct conversion with long strings
|
||||
* @param string $string string to encode
|
||||
@@ -1517,20 +1680,117 @@ class Basic
|
||||
}
|
||||
|
||||
/**
|
||||
* WRAPPER call to new humanReadableByteFormat
|
||||
* converts bytes into formated string with KB, MB, etc
|
||||
* @param string|int|float $number bytes as string int or pure int
|
||||
* @param bool $space true (default) to add space between number and suffix
|
||||
* @param string|int|float $bytes bytes as string int or pure int
|
||||
* @param bool $space default true, to add space between number and suffix
|
||||
* @param bool $adjust default false, always print two decimals (sprintf)
|
||||
* @param bool $si default false, if set to true, use 1000 for calculation
|
||||
* @return string converted byte number (float) with suffix
|
||||
* @deprecated Use humanReadableByteFormat instead
|
||||
*/
|
||||
public static function byteStringFormat($number, bool $space = true): string
|
||||
public static function byteStringFormat($bytes, bool $space = true, bool $adjust = false, bool $si = false): string
|
||||
{
|
||||
if (is_numeric($number) && $number > 0) {
|
||||
// labels in order of size
|
||||
$labels = array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB');
|
||||
// calc file size, round down too two digits, add label based max change
|
||||
return round((float)$number / pow(1024, ($i = floor(log((float)$number, 1024)))), 2).($space ? ' ' : '').(isset($labels[(int)$i]) ? $labels[(int)$i] : '>EB');
|
||||
// trigger_error('Method '.__METHOD__.' is deprecated, use humanReadableByteFormat', E_USER_DEPRECATED);
|
||||
$flags = 0;
|
||||
// match over the true/false flags to the new int style flag
|
||||
// if space need to set 1
|
||||
if ($space === false) {
|
||||
$flags |= self::BYTE_FORMAT_NOSPACE;
|
||||
}
|
||||
// if adjust need to set 2
|
||||
if ($adjust === true) {
|
||||
$flags |= self::BYTE_FORMAT_ADJUST;
|
||||
}
|
||||
// if si need to set 3
|
||||
if ($si === true) {
|
||||
$flags |= self::BYTE_FORMAT_SI;
|
||||
}
|
||||
|
||||
// call
|
||||
return self::humanReadableByteFormat($bytes, $flags);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This function replaces the old byteStringFormat
|
||||
*
|
||||
* Converts any number string to human readable byte format
|
||||
* Maxium is Exobytes and above that the Exobytes suffix is used for all
|
||||
* If more are needed only the correct short name for the suffix has to be
|
||||
* added to the labels array
|
||||
* On no number string it returns string as is
|
||||
* Source Idea: SOURCE: https://programming.guide/worlds-most-copied-so-snippet.html
|
||||
*
|
||||
* The class itself hast the following defined
|
||||
* BYTE_FORMAT_NOSPACE [1] turn off spaces between number and extension
|
||||
* BYTE_FORMAT_ADJUST [2] use sprintf to always print two decimals
|
||||
* BYTE_FORMAT_SI [3] use si standard 1000 instead of bytes 1024
|
||||
* To use the constant from outside use $class::CONSTANT
|
||||
* @param string|int|float $bytes bytes as string int or pure int
|
||||
* @param int $flags bitwise flag with use space turned on
|
||||
* @return string converted byte number (float) with suffix
|
||||
*/
|
||||
public static function humanReadableByteFormat($bytes, int $flags = 0): string
|
||||
{
|
||||
// if not numeric, return as is
|
||||
if (is_numeric($bytes)) {
|
||||
// flags bit wise check
|
||||
// remove space between number and suffix
|
||||
if ($flags & self::BYTE_FORMAT_NOSPACE) {
|
||||
$space = false;
|
||||
} else {
|
||||
$space = true;
|
||||
}
|
||||
// use sprintf instead of round
|
||||
if ($flags & self::BYTE_FORMAT_ADJUST) {
|
||||
$adjust = true;
|
||||
} else {
|
||||
$adjust = false;
|
||||
}
|
||||
// use SI 1000 mod and not 1024 mod
|
||||
if ($flags & self::BYTE_FORMAT_SI) {
|
||||
$si = true;
|
||||
} else {
|
||||
$si = false;
|
||||
}
|
||||
|
||||
// si or normal
|
||||
$unit = $si ? 1000 : 1024;
|
||||
// always positive
|
||||
$abs_bytes = $bytes == PHP_INT_MIN ? PHP_INT_MAX : abs($bytes);
|
||||
// smaller than unit is always B
|
||||
if ($abs_bytes < $unit) {
|
||||
return $bytes.'B';
|
||||
}
|
||||
// labels in order of size [Y, Z]
|
||||
$labels = array('', 'K', 'M', 'G', 'T', 'P', 'E');
|
||||
// exp position calculation
|
||||
$exp = floor(log($abs_bytes, $unit));
|
||||
// avoid printing out anything larger than max labels
|
||||
if ($exp >= count($labels)) {
|
||||
$exp = count($labels) - 1;
|
||||
}
|
||||
// deviation calculation
|
||||
$dev = pow($unit, $exp) * ($unit - 0.05);
|
||||
// shift the exp +1 for on the border units
|
||||
if ($exp < 6 &&
|
||||
$abs_bytes > ($dev - (((int)$dev & 0xfff) == 0xd00 ? 52 : 0))
|
||||
) {
|
||||
$exp ++;
|
||||
}
|
||||
// label name, including leading space if flagged
|
||||
$pre = ($space ? ' ' : '').(isset($labels[$exp]) ? $labels[$exp] : '>E').($si ? 'i' : '').'B';
|
||||
$bytes_calc = $abs_bytes / pow($unit, $exp);
|
||||
if ($adjust) {
|
||||
return sprintf("%.2f%sB", $bytes_calc, $pre);
|
||||
} else {
|
||||
return round($bytes_calc, 2).$pre;
|
||||
}
|
||||
} else {
|
||||
// if anything other return as string
|
||||
return (string)$bytes;
|
||||
}
|
||||
return (string)$number;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1615,26 +1875,33 @@ class Basic
|
||||
{
|
||||
// check if the timestamp has any h/m/s/ms inside, if yes skip
|
||||
if (!preg_match("/(h|m|s|ms)/", (string)$timestamp)) {
|
||||
$ms = 0;
|
||||
list ($timestamp, $ms) = explode('.', (string)round($timestamp, 4));
|
||||
list ($timestamp, $ms) = array_pad(explode('.', (string)round($timestamp, 4)), 2, null);
|
||||
$timegroups = array(86400, 3600, 60, 1);
|
||||
$labels = array('d', 'h', 'm', 's');
|
||||
$time_string = '';
|
||||
for ($i = 0, $iMax = count($timegroups); $i < $iMax; $i ++) {
|
||||
$output = floor((float)$timestamp / $timegroups[$i]);
|
||||
$timestamp = (float)$timestamp % $timegroups[$i];
|
||||
// output has days|hours|min|sec
|
||||
if ($output || $time_string) {
|
||||
$time_string .= $output.$labels[$i].(($i + 1) != count($timegroups) ? ' ' : '');
|
||||
// if timestamp is zero, return zero string
|
||||
if ($timestamp == 0) {
|
||||
$time_string = '0s';
|
||||
} else {
|
||||
for ($i = 0, $iMax = count($timegroups); $i < $iMax; $i ++) {
|
||||
$output = floor((float)$timestamp / $timegroups[$i]);
|
||||
$timestamp = (float)$timestamp % $timegroups[$i];
|
||||
// output has days|hours|min|sec
|
||||
if ($output || $time_string) {
|
||||
$time_string .= $output.$labels[$i].(($i + 1) != count($timegroups) ? ' ' : '');
|
||||
}
|
||||
}
|
||||
}
|
||||
// if we have ms and it has leading zeros, remove them
|
||||
$ms = preg_replace("/^0+/", '', $ms);
|
||||
// add ms if there
|
||||
if ($show_micro) {
|
||||
$time_string .= ' '.(!$ms ? 0 : $ms).'ms';
|
||||
} elseif (!$time_string) {
|
||||
$time_string .= (!$ms ? 0 : $ms).'ms';
|
||||
// only add ms if we have an ms value
|
||||
if ($ms !== null) {
|
||||
// if we have ms and it has leading zeros, remove them, but only if it is nut just 0
|
||||
$ms = preg_replace("/^0+(\d+)$/", '${1}', $ms);
|
||||
// add ms if there
|
||||
if ($show_micro) {
|
||||
$time_string .= ' '.(!$ms ? 0 : $ms).'ms';
|
||||
} elseif (!$time_string) {
|
||||
$time_string .= (!$ms ? 0 : $ms).'ms';
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$time_string = $timestamp;
|
||||
@@ -1703,7 +1970,7 @@ class Basic
|
||||
if (!$datetime) {
|
||||
return false;
|
||||
}
|
||||
list ($year, $month, $day, $hour, $min, $sec) = preg_split("/[\/\- :]/", $datetime);
|
||||
list ($year, $month, $day, $hour, $min, $sec) = array_pad(preg_split("/[\/\- :]/", $datetime), 6, null);
|
||||
if (!$year || !$month || !$day) {
|
||||
return false;
|
||||
}
|
||||
@@ -1850,8 +2117,15 @@ class Basic
|
||||
* @param bool $clear_cache if set to true, will create thumb all the tame
|
||||
* @return string|bool thumbnail name, or false for error
|
||||
*/
|
||||
public static function createThumbnail(string $pic, int $size_x, int $size_y, string $dummy = '', string $path = '', string $cache_source = '', bool $clear_cache = false)
|
||||
{
|
||||
public static function createThumbnail(
|
||||
string $pic,
|
||||
int $size_x,
|
||||
int $size_y,
|
||||
string $dummy = '',
|
||||
string $path = '',
|
||||
string $cache_source = '',
|
||||
bool $clear_cache = false
|
||||
) {
|
||||
// get image type flags
|
||||
$image_types = array(
|
||||
1 => 'gif',
|
||||
@@ -1859,6 +2133,15 @@ class Basic
|
||||
3 => 'png'
|
||||
);
|
||||
$return_data = false;
|
||||
$CONVERT = '';
|
||||
// if CONVERT is not defined, abort
|
||||
/** @phan-suppress-next-line PhanUndeclaredConstant */
|
||||
if (defined('CONVERT') && is_executable(CONVERT)) {
|
||||
/** @phan-suppress-next-line PhanUndeclaredConstant */
|
||||
$CONVERT = CONVERT;
|
||||
} else {
|
||||
return $return_data;
|
||||
}
|
||||
if (!empty($cache_source)) {
|
||||
$tmp_src = $cache_source;
|
||||
} else {
|
||||
@@ -1896,7 +2179,7 @@ class Basic
|
||||
// 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';
|
||||
$convert_string = $CONVERT.' '.$filename.' '.$convert_prefix.$filename.'_TEMP';
|
||||
$status = exec($convert_string, $output, $return);
|
||||
$filename .= '_TEMP';
|
||||
// for delete, in case we need to glob
|
||||
@@ -1920,7 +2203,7 @@ class Basic
|
||||
if (!is_file($thumbnail) || $clear_cache == true) {
|
||||
// convert the picture
|
||||
if ($width > $size_x) {
|
||||
$convert_string = CONVERT.' -geometry '.$size_x.'x '.$filename.' '.$thumbnail;
|
||||
$convert_string = $CONVERT.' -geometry '.$size_x.'x '.$filename.' '.$thumbnail;
|
||||
$status = exec($convert_string, $output, $return);
|
||||
// get the size of the converted data, if converted
|
||||
if (is_file($thumbnail)) {
|
||||
@@ -1928,7 +2211,7 @@ class Basic
|
||||
}
|
||||
}
|
||||
if ($height > $size_y) {
|
||||
$convert_string = CONVERT.' -geometry x'.$size_y.' '.$filename.' '.$thumbnail;
|
||||
$convert_string = $CONVERT.' -geometry x'.$size_y.' '.$filename.' '.$thumbnail;
|
||||
$status = exec($convert_string, $output, $return);
|
||||
}
|
||||
}
|
||||
@@ -1968,6 +2251,8 @@ class Basic
|
||||
* @param int $thumb_width thumbnail width
|
||||
* @param int $thumb_height thumbnail height
|
||||
* @param string|null $thumbnail_path altnerative path for thumbnails
|
||||
* @param bool $create_dummy if we encounter an invalid file
|
||||
* create a dummy image file and return it
|
||||
* @param bool $use_cache default to true, set to false to skip
|
||||
* creating new image if exists
|
||||
* @param bool $high_quality default to true, uses sample version, set to false
|
||||
@@ -1980,6 +2265,7 @@ class Basic
|
||||
int $thumb_width = 0,
|
||||
int $thumb_height = 0,
|
||||
?string $thumbnail_path = null,
|
||||
bool $create_dummy = true,
|
||||
bool $use_cache = true,
|
||||
bool $high_quality = true,
|
||||
int $jpeg_quality = 80
|
||||
@@ -1994,8 +2280,12 @@ class Basic
|
||||
) {
|
||||
// $this->debug('IMAGE PREPARE', "FILENAME OK, THUMB WIDTH/HEIGHT OK");
|
||||
list($inc_width, $inc_height, $img_type) = getimagesize($filename);
|
||||
$thumbnail_write_path = null;
|
||||
$thumbnail_web_path = null;
|
||||
// path set first
|
||||
if ($img_type == IMG_JPG ||
|
||||
$img_type == IMG_PNG
|
||||
$img_type == IMG_PNG ||
|
||||
$create_dummy === true
|
||||
) {
|
||||
// $this->debug('IMAGE PREPARE', "IMAGE TYPE OK: ".$inc_width.'x'.$inc_height);
|
||||
// set thumbnail paths
|
||||
@@ -2008,6 +2298,11 @@ class Basic
|
||||
$thumbnail_web_path = LAYOUT.CACHE;
|
||||
}
|
||||
}
|
||||
}
|
||||
// do resize or fall back on dummy run
|
||||
if ($img_type == IMG_JPG ||
|
||||
$img_type == IMG_PNG
|
||||
) {
|
||||
// if missing width or height in thumb, use the set one
|
||||
if ($thumb_width == 0) {
|
||||
$thumb_width = $inc_width;
|
||||
@@ -2102,6 +2397,57 @@ class Basic
|
||||
if ($thumbnail !== false) {
|
||||
$thumbnail = $thumbnail_web_path.$thumbnail;
|
||||
}
|
||||
} elseif ($create_dummy === true) {
|
||||
// create dummy image in the thumbnail size
|
||||
// if one side is missing, use the other side to create a square
|
||||
if (!$thumb_width) {
|
||||
$thumb_width = $thumb_height;
|
||||
}
|
||||
if (!$thumb_height) {
|
||||
$thumb_height = $thumb_width;
|
||||
}
|
||||
// do we have an image already?
|
||||
$thumbnail = 'thumb-'.pathinfo($filename)['filename'].'-'.$thumb_width.'x'.$thumb_height;
|
||||
if ($use_cache === false ||
|
||||
!file_exists($thumbnail_write_path.$thumbnail)
|
||||
) {
|
||||
// if both are unset, set to 250
|
||||
if ($thumb_height == 0) {
|
||||
$thumb_height = 250;
|
||||
}
|
||||
if ($thumb_width == 0) {
|
||||
$thumb_width = 250;
|
||||
}
|
||||
$thumb = imagecreatetruecolor($thumb_width, $thumb_height);
|
||||
// add outside border px = 5% (rounded up)
|
||||
// eg 50px -> 2.5px
|
||||
$gray = imagecolorallocate($thumb, 200, 200, 200);
|
||||
$white = imagecolorallocate($thumb, 255, 255, 255);
|
||||
// fill gray background
|
||||
imagefill($thumb, 0, 0, $gray);
|
||||
// now create rectangle
|
||||
if (imagesx($thumb) < imagesy($thumb)) {
|
||||
$width = (int)round(imagesx($thumb) / 100 * 5);
|
||||
} else {
|
||||
$width = (int)round(imagesy($thumb) / 100 * 5);
|
||||
}
|
||||
imagefilledrectangle($thumb, 0 + $width, 0 + $width, imagesx($thumb) - $width, imagesy($thumb) - $width, $white);
|
||||
// add "No valid images source"
|
||||
// OR add circle
|
||||
// * find center
|
||||
// * width/height is 75% of size - border
|
||||
// smaller size is taken
|
||||
$base_width = imagesx($thumb) > imagesy($thumb) ? imagesy($thumb) : imagesx($thumb);
|
||||
// get 75% width
|
||||
$cross_width = (int)round((($base_width - ($width * 2)) / 100 * 75) / 2);
|
||||
$center_x = (int)round(imagesx($thumb) / 2);
|
||||
$center_y = (int)round(imagesy($thumb) / 2);
|
||||
imagefilledellipse($thumb, $center_x, $center_y, $cross_width, $cross_width, $gray);
|
||||
// find top left and bottom left for first line
|
||||
imagepng($thumb, $thumbnail_write_path.$thumbnail);
|
||||
}
|
||||
// add web path
|
||||
$thumbnail = $thumbnail_web_path.$thumbnail;
|
||||
}
|
||||
}
|
||||
// either return false or the thumbnail name + output path web
|
||||
@@ -2119,7 +2465,8 @@ class Basic
|
||||
{
|
||||
if (function_exists('exif_read_data') && is_writeable($filename)) {
|
||||
list($inc_width, $inc_height, $img_type) = getimagesize($filename);
|
||||
$exif = exif_read_data($filename);
|
||||
// add @ to avoid "file not supported error"
|
||||
$exif = @exif_read_data($filename);
|
||||
$orientation = null;
|
||||
$img = null;
|
||||
if ($exif && isset($exif['Orientation'])) {
|
||||
@@ -2358,6 +2705,35 @@ class Basic
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: make this a proper uniq ID creation
|
||||
* add uuidv4 subcall to the uuid function too
|
||||
* creates a uniq id
|
||||
* @param string $type uniq id type, currently md5 or sha256 allowed
|
||||
* if not set will use DEFAULT_HASH if set
|
||||
* @return string uniq id
|
||||
*/
|
||||
public function uniqId(string $type = ''): string
|
||||
{
|
||||
$uniq_id = '';
|
||||
switch ($type) {
|
||||
case 'md5':
|
||||
$uniq_id = md5(uniqid((string)rand(), true));
|
||||
break;
|
||||
case 'sha256':
|
||||
$uniq_id = hash('sha256', uniqid((string)rand(), true));
|
||||
break;
|
||||
default:
|
||||
$hash = 'sha256';
|
||||
if (defined(DEFAULT_HASH)) {
|
||||
$hash = DEFAULT_HASH;
|
||||
}
|
||||
$uniq_id = hash($hash, uniqid((string)rand(), true));
|
||||
break;
|
||||
}
|
||||
return $uniq_id;
|
||||
}
|
||||
|
||||
// [!!! DEPRECATED !!!]
|
||||
// ALL crypt* methids are DEPRECATED and SHALL NOT BE USED
|
||||
// use the new password* instead
|
||||
@@ -2663,7 +3039,11 @@ class Basic
|
||||
$HUE += 360;
|
||||
}
|
||||
|
||||
return array(round($HUE), round((($MAX - $MIN) / $MAX) * 100), round($MAX * 100));
|
||||
return array(
|
||||
(int)round($HUE),
|
||||
(int)round((($MAX - $MIN) / $MAX) * 100),
|
||||
(int)round($MAX * 100)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2734,7 +3114,11 @@ class Basic
|
||||
$blue = 0;
|
||||
}
|
||||
|
||||
return array(round($red * 255), round($green * 255), round($blue * 255));
|
||||
return array(
|
||||
(int)round($red * 255),
|
||||
(int)round($green * 255),
|
||||
(int)round($blue * 255)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2781,7 +3165,11 @@ class Basic
|
||||
|
||||
// H, S, L
|
||||
// S= L <= 0.5 ? C/2L : C/2 - 2L
|
||||
return array(round($HUE), round((($MAX - $MIN) / (($L <= 0.5) ? ($MAX + $MIN) : (2 - $MAX - $MIN))) * 100), $L);
|
||||
return array(
|
||||
(int)round($HUE),
|
||||
(int)round((($MAX - $MIN) / (($L <= 0.5) ? ($MAX + $MIN) : (2 - $MAX - $MIN))) * 100),
|
||||
(int)$L
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2819,7 +3207,11 @@ class Basic
|
||||
return $m1;
|
||||
};
|
||||
|
||||
return array(round(255 * $hue($h + (1 / 3))), round(255 * $hue($h)), round(255 * $hue($h - (1 / 3))));
|
||||
return array(
|
||||
(int)round(255 * $hue($h + (1 / 3))),
|
||||
(int)round(255 * $hue($h)),
|
||||
(int)round(255 * $hue($h - (1 / 3)))
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2974,10 +3366,10 @@ class Basic
|
||||
|
||||
/**
|
||||
* full wrapper for html entities
|
||||
* @param string $string string to html encode
|
||||
* @return mixed if string, encoded, else as is
|
||||
* @param mixed $string string to html encode
|
||||
* @return mixed if string, encoded, else as is (eg null)
|
||||
*/
|
||||
public function htmlent(string $string)
|
||||
public function htmlent($string)
|
||||
{
|
||||
if (is_string($string)) {
|
||||
return htmlentities($string, ENT_COMPAT|ENT_HTML401, 'UTF-8', false);
|
||||
|
||||
@@ -321,7 +321,7 @@ class IO extends \CoreLibs\Basic
|
||||
$this->db_user = $db_config['db_user'] ?? '';
|
||||
$this->db_pwd = $db_config['db_pass'] ?? '';
|
||||
$this->db_host = $db_config['db_host'] ?? '';
|
||||
$this->db_port = !empty($db_config['db_port']) ? $db_config['db_port'] : '5432';
|
||||
$this->db_port = !empty($db_config['db_port']) ? $db_config['db_port'] : 5432;
|
||||
$this->db_schema = !empty($db_config['db_schema']) ? $db_config['db_schema'] : ''; // do not set to 'public' if not set, because the default is already public
|
||||
$this->db_encoding = !empty($db_config['db_encoding']) ? $db_config['db_encoding'] : '';
|
||||
$this->db_type = $db_config['db_type'] ?? '';
|
||||
@@ -957,6 +957,28 @@ class IO extends \CoreLibs\Basic
|
||||
return $this->dbReturnRow('SHOW client_encoding')['client_encoding'];
|
||||
}
|
||||
|
||||
/**
|
||||
* get certain settings like username, db name
|
||||
* @param string $name what setting to query
|
||||
* @return mixed setting value, if not allowed name return false
|
||||
*/
|
||||
public function dbGetSetting(string $name)
|
||||
{
|
||||
$setting = '';
|
||||
switch ($name) {
|
||||
case 'name':
|
||||
$setting = $this->db_name;
|
||||
break;
|
||||
case 'user':
|
||||
$setting = $this->db_user;
|
||||
break;
|
||||
default:
|
||||
$setting = false;
|
||||
break;
|
||||
}
|
||||
return $setting;
|
||||
}
|
||||
|
||||
/**
|
||||
* prints out status info from the connected DB (might be usefull for debug stuff)
|
||||
* @param bool|boolean $show show db connection info, default true
|
||||
@@ -1462,7 +1484,7 @@ class IO extends \CoreLibs\Basic
|
||||
if (!$pk_name) {
|
||||
// read the primary key from the table, if we do not have one, we get nothing in return
|
||||
list($schema, $table) = $this->__dbReturnTable($query);
|
||||
if (!$this->pk_name_table[$table]) {
|
||||
if (empty($this->pk_name_table[$table])) {
|
||||
$this->pk_name_table[$table] = $this->db_functions->__dbPrimaryKey($table, $schema);
|
||||
}
|
||||
$pk_name = $this->pk_name_table[$table];
|
||||
@@ -1779,16 +1801,30 @@ class IO extends \CoreLibs\Basic
|
||||
'row' => $table.'_id',
|
||||
'value' => $primary_key
|
||||
);
|
||||
} elseif (!isset($primary_key['value'])) {
|
||||
$primary_key['value'] = '';
|
||||
} else {
|
||||
if (!isset($primary_key['row'])) {
|
||||
$primary_key['row'] = '';
|
||||
}
|
||||
if (!isset($primary_key['value'])) {
|
||||
$primary_key['value'] = '';
|
||||
}
|
||||
}
|
||||
// var set for strings
|
||||
$q_sub_value = '';
|
||||
$q_sub_data = '';
|
||||
// get the table layout and row types
|
||||
$table_data = $this->dbShowTableMetaData(($this->db_schema ? $this->db_schema.'.' : '').$table);
|
||||
// @phan HACK
|
||||
$primary_key['value'] = $primary_key['value'] ?? '';
|
||||
$primary_key['row'] = $primary_key['row'] ?? '';
|
||||
// loop through the write array and each field to build the query
|
||||
foreach ($write_array as $field) {
|
||||
if ((!$primary_key['value'] || ($primary_key['value'] && !in_array($field, $not_write_update_array))) && !in_array($field, $not_write_array)) {
|
||||
if ((!$primary_key['value'] ||
|
||||
($primary_key['value'] &&
|
||||
!in_array($field, $not_write_update_array))
|
||||
) &&
|
||||
!in_array($field, $not_write_array)
|
||||
) {
|
||||
// data from external or data field
|
||||
$_data = null;
|
||||
if (count($data) >= 1 && array_key_exists($field, $data)) {
|
||||
@@ -1842,7 +1878,7 @@ class IO extends \CoreLibs\Basic
|
||||
}
|
||||
|
||||
// first work contact itself (we need contact id for everything else)
|
||||
if ($primary_key['value']) {
|
||||
if ($primary_key['value'] && $primary_key['row']) {
|
||||
$q = 'UPDATE '.$table.' SET ';
|
||||
$q .= $q_sub_data.' ';
|
||||
$q .= 'WHERE '.$primary_key['row'].' = '.$primary_key['value'];
|
||||
@@ -1861,8 +1897,8 @@ class IO extends \CoreLibs\Basic
|
||||
if (!$primary_key['value']) {
|
||||
$primary_key['value'] = $this->insert_id;
|
||||
}
|
||||
|
||||
return $primary_key['value'];
|
||||
// if there is not priamry key value field return false
|
||||
return isset($primary_key['value']) ? $primary_key['value'] : false;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -448,10 +448,10 @@ class PgSQL
|
||||
}
|
||||
if ('{}' != $text) {
|
||||
do {
|
||||
if ('{' != $text{$offset}) {
|
||||
if ('{' != $text[$offset]) {
|
||||
preg_match("/(\\{?\"([^\"\\\\]|\\\\.)*\"|[^,{}]+)+([,}]+)/", $text, $match, 0, $offset);
|
||||
$offset += strlen($match[0]);
|
||||
$output[] = ('"' != $match[1]{0} ? $match[1] : stripcslashes(substr($match[1], 1, -1)));
|
||||
$output[] = ('"' != $match[1][0] ? $match[1] : stripcslashes(substr($match[1], 1, -1)));
|
||||
if ('},' == $match[3]) {
|
||||
return $offset;
|
||||
}
|
||||
|
||||
@@ -242,6 +242,11 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
||||
public $security_level;
|
||||
// layout publics
|
||||
public $table_width;
|
||||
// internal lang & encoding vars
|
||||
public $lang_dir = '';
|
||||
public $lang;
|
||||
public $lang_short;
|
||||
public $encoding;
|
||||
// language
|
||||
public $l;
|
||||
|
||||
@@ -251,15 +256,15 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
||||
/**
|
||||
* construct form generator
|
||||
* @param array $db_config db config array
|
||||
* @param string $lang interface language
|
||||
* @param int|integer $table_width table/div width (default 750)
|
||||
* @param int|integer $set_control_flag basic class set/get variable error flags
|
||||
*/
|
||||
public function __construct(array $db_config, string $lang, int $table_width = 750, int $set_control_flag = 0)
|
||||
public function __construct(array $db_config, int $table_width = 750, int $set_control_flag = 0)
|
||||
{
|
||||
$this->my_page_name = $this->getPageName(1);
|
||||
$this->setLangEncoding();
|
||||
// init the language class
|
||||
$this->l = new \CoreLibs\Language\L10n($lang);
|
||||
$this->l = new \CoreLibs\Language\L10n($this->lang);
|
||||
// load config array
|
||||
// get table array definitions for current page name
|
||||
// WARNING: auto spl load does not work with this as it is an array and not a function/object
|
||||
@@ -323,18 +328,28 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
||||
$this->base_acl_level = isset($_SESSION['BASE_ACL_LEVEL']) ? $_SESSION['BASE_ACL_LEVEL'] : 0;
|
||||
// security levels for buttons/actions
|
||||
// if array does not exists create basic
|
||||
if (!isset($config_array['security_level']) || !is_array($config_array['security_level']) ||
|
||||
(is_array($config_array['security_level']) && count($config_array['security_level']) < 4)
|
||||
if (!isset($config_array['security_level']) ||
|
||||
(isset($config_array['security_level']) &&
|
||||
(!is_array($config_array['security_level']) ||
|
||||
(is_array($config_array['security_level']) && count($config_array['security_level']) < 4))
|
||||
)
|
||||
) {
|
||||
$config_array['security_level'] = array(
|
||||
$this->security_level = array(
|
||||
'load' => 100,
|
||||
'new' => 100,
|
||||
'save' => 100,
|
||||
'delete' => 100
|
||||
);
|
||||
} else {
|
||||
// write array to class var
|
||||
$this->security_level = isset($config_array['security_level']) ?
|
||||
$config_array['security_level'] :
|
||||
array('load' => 100,
|
||||
'new' => 100,
|
||||
'save' => 100,
|
||||
'delete' => 100
|
||||
);
|
||||
}
|
||||
// write array to class var
|
||||
$this->security_level = $config_array['security_level'];
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -348,6 +363,45 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
||||
parent::__destruct();
|
||||
}
|
||||
|
||||
// INTERNAL METHODS |===============================================>
|
||||
|
||||
/**
|
||||
* ORIGINAL in \CoreLibs\Admin\Backend
|
||||
* set the language encoding and language settings
|
||||
* the default charset from _SESSION login or from
|
||||
* config DEFAULT ENCODING
|
||||
* the lang full name for mo loading from _SESSION login
|
||||
* or SITE LANG or DEFAULT LANG from config
|
||||
* creates short lang (only first two chars) from the lang
|
||||
* @return void
|
||||
*/
|
||||
private function setLangEncoding(): void
|
||||
{
|
||||
// just emergency fallback for language
|
||||
// set encoding
|
||||
if (isset($_SESSION['DEFAULT_CHARSET'])) {
|
||||
$this->encoding = $_SESSION['DEFAULT_CHARSET'];
|
||||
} else {
|
||||
$this->encoding = DEFAULT_ENCODING;
|
||||
}
|
||||
// gobal override
|
||||
if (isset($GLOBALS['OVERRIDE_LANG'])) {
|
||||
$this->lang = $GLOBALS['OVERRIDE_LANG'];
|
||||
} elseif (isset($_SESSION['DEFAULT_LANG'])) {
|
||||
// session (login)
|
||||
$this->lang = $_SESSION['DEFAULT_LANG'];
|
||||
} else {
|
||||
// mostly default SITE LANG or DEFAULT LANG
|
||||
$this->lang = defined('SITE_LANG') ? SITE_LANG : DEFAULT_LANG;
|
||||
}
|
||||
// create the char lang encoding
|
||||
$this->lang_short = substr($this->lang, 0, 2);
|
||||
// set the language folder
|
||||
$this->lang_dir = BASE.INCLUDES.LANG.CONTENT_PATH;
|
||||
}
|
||||
|
||||
// PUBLIC METHODS |=================================================>
|
||||
|
||||
/**
|
||||
* dumps all values into output (for error msg)
|
||||
* @return string full table array data output as string html formatted
|
||||
@@ -442,7 +496,11 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
||||
*/
|
||||
public function formProcedureLoad(string $archive_id): void
|
||||
{
|
||||
if ($this->archive && $archive_id && $this->base_acl_level >= $this->security_level['load']) {
|
||||
if (isset($this->security_level['load']) &&
|
||||
$this->archive &&
|
||||
$archive_id &&
|
||||
$this->base_acl_level >= $this->security_level['load']
|
||||
) {
|
||||
$this->formLoadTableArray($archive_id);
|
||||
$this->yes = 1;
|
||||
}
|
||||
@@ -454,7 +512,10 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
||||
*/
|
||||
public function formProcedureNew(): void
|
||||
{
|
||||
if ($this->new && $this->base_acl_level >= $this->security_level['new']) {
|
||||
if (isset($this->security_level['new']) &&
|
||||
$this->new &&
|
||||
$this->base_acl_level >= $this->security_level['new']
|
||||
) {
|
||||
if ($this->really_new == 'yes') {
|
||||
$this->formUnsetTablearray();
|
||||
} else {
|
||||
@@ -471,7 +532,10 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
||||
*/
|
||||
public function formProcedureSave(): void
|
||||
{
|
||||
if ($this->save && $this->base_acl_level >= $this->security_level['save']) {
|
||||
if (isset($this->security_level['save']) &&
|
||||
$this->save &&
|
||||
$this->base_acl_level >= $this->security_level['save']
|
||||
) {
|
||||
$this->formErrorCheck();
|
||||
if (!$this->error) {
|
||||
$this->formSaveTableArray();
|
||||
@@ -487,7 +551,10 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
||||
public function formProcedureDelete(): void
|
||||
{
|
||||
// delete is also by 'protected'
|
||||
if ($this->delete && $this->base_acl_level >= $this->security_level['delete']) {
|
||||
if (isset($this->security_level['delete']) &&
|
||||
$this->delete &&
|
||||
$this->base_acl_level >= $this->security_level['delete']
|
||||
) {
|
||||
if (isset($this->table_array['protected']['value']) && $this->table_array['protected']['value']) {
|
||||
$this->msg .= $this->l->__('Cannot delete this Dataset, because it is internaly protected!');
|
||||
$this->error = 2;
|
||||
@@ -510,11 +577,13 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
||||
*/
|
||||
public function formProcedureDeleteFromElementList(array $element_list, array $remove_name): void
|
||||
{
|
||||
/** @phan-suppress-next-line PhanTypeArraySuspiciousNullable */
|
||||
$this->debug('REMOVE ELEMENT', 'Remove REF ELEMENT: '.$this->base_acl_level.' >= '.$this->security_level['delete']);
|
||||
$this->debug('REMOVE ELEMENT', 'Protected Value set: '.(string)isset($this->table_array['protected']['value']));
|
||||
$this->debug('REMOVE ELEMENT', 'Error: '.$this->error);
|
||||
// only do if the user is allowed to delete
|
||||
if ($this->base_acl_level >= $this->security_level['delete'] &&
|
||||
if (isset($this->security_level['delete']) &&
|
||||
$this->base_acl_level >= $this->security_level['delete'] &&
|
||||
(!isset($this->table_array['protected']['value']) ||
|
||||
(isset($this->table_array['protected']['value']) && !$this->table_array['protected']['value'])) &&
|
||||
!$this->error
|
||||
@@ -597,7 +666,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
||||
$pk_names = array();
|
||||
$pk_ids = array();
|
||||
// when security level is okay ...
|
||||
if ($this->base_acl_level >= $this->security_level['load']) {
|
||||
if (isset($this->security_level['load']) &&
|
||||
$this->base_acl_level >= $this->security_level['load']
|
||||
) {
|
||||
$t_pk_name = $this->archive_pk_name;
|
||||
|
||||
// load list data
|
||||
@@ -610,17 +681,26 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
||||
$pk_selected = $res[$this->int_pk_name];
|
||||
}
|
||||
$t_string = '';
|
||||
for ($i = 0, $i_max = count($this->field_array); $i < $i_max; $i ++) {
|
||||
foreach ($this->field_array as $i => $field_array) {
|
||||
if ($t_string) {
|
||||
$t_string .= ', ';
|
||||
}
|
||||
if (isset($this->field_array[$i]['before_value'])) {
|
||||
$t_string .= $this->field_array[$i]['before_value'];
|
||||
if (isset($field_array['before_value'])) {
|
||||
$t_string .= $field_array['before_value'];
|
||||
}
|
||||
if (isset($this->field_array[$i]['binary'])) {
|
||||
$t_string .= ($res[$this->field_array[$i]['name']]) ? $this->field_array[$i]['binary'][0] : $this->field_array[$i]['binary'][1];
|
||||
} else {
|
||||
$t_string .= $res[$this->field_array[$i]['name']];
|
||||
// must have res element set
|
||||
if (isset($field_array['name']) &&
|
||||
isset($res[$field_array['name']])
|
||||
) {
|
||||
if (isset($field_array['binary'])) {
|
||||
if (isset($field_array['binary'][0])) {
|
||||
$t_string .= $field_array['binary'][0];
|
||||
} elseif (isset($field_array['binary'][1])) {
|
||||
$t_string .= $field_array['binary'][1];
|
||||
}
|
||||
} else {
|
||||
$t_string .= $res[$field_array['name']];
|
||||
}
|
||||
}
|
||||
}
|
||||
$pk_names[] = $t_string;
|
||||
@@ -644,7 +724,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
||||
$show_checkbox = 0;
|
||||
$new_name = '';
|
||||
// when security level is okay
|
||||
if ($this->base_acl_level >= $this->security_level['new']) {
|
||||
if (isset($this->security_level['new']) &&
|
||||
$this->base_acl_level >= $this->security_level['new']
|
||||
) {
|
||||
if ($this->yes && !$hide_new_checkbox) {
|
||||
$show_checkbox = 1;
|
||||
}
|
||||
@@ -675,7 +757,11 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
||||
$pk_value = '';
|
||||
$show_delete = 0;
|
||||
$old_school_hidden = 0;
|
||||
if ($this->base_acl_level >= $this->security_level['save'] || $this->base_acl_level >= $this->security_level['delete']) {
|
||||
if ((isset($this->security_level['save']) &&
|
||||
$this->base_acl_level >= $this->security_level['save']) ||
|
||||
(isset($this->security_level['delete']) &&
|
||||
$this->base_acl_level >= $this->security_level['delete'])
|
||||
) {
|
||||
$old_school_hidden = 0;
|
||||
if ($this->base_acl_level >= $this->security_level['save']) {
|
||||
$seclevel_okay = 1;
|
||||
@@ -899,7 +985,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
||||
$data['value'] = isset($this->table_array[$element_name]['value']) ? $this->table_array[$element_name]['value'] : 0;
|
||||
$data['col_name'] = $this->col_name;
|
||||
$data['table_name'] = $this->table_name;
|
||||
$data['query'] = urlencode($query);
|
||||
$data['query'] = $query !== null ? urlencode($query) : '';
|
||||
}
|
||||
// file upload
|
||||
if ($this->table_array[$element_name]['type'] == 'file') {
|
||||
@@ -1590,13 +1676,28 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
||||
$q = '';
|
||||
// skip empty or not fully filled rows
|
||||
if (isset($no_write[$i]) && !$no_write[$i]) {
|
||||
if (!isset($q_begin[$i])) {
|
||||
$q_begin[$i] = '';
|
||||
}
|
||||
if (!isset($q_end[$i])) {
|
||||
$q_end[$i] = '';
|
||||
}
|
||||
// if tpye is update
|
||||
if ($type[$i] == 'update') {
|
||||
$q = $q_begin[$i].$q_data[$i].$q_end[$i];
|
||||
if (isset($type[$i]) && $type[$i] == 'update') {
|
||||
$q = $q_begin[$i].
|
||||
(isset($q_data[$i]) ? $q_data[$i] : '').
|
||||
$q_end[$i];
|
||||
// or if we have block write, then it is insert (new)
|
||||
} elseif (isset($block_write[$i]) && $block_write[$i]) {
|
||||
$q = $q_begin[$i].$q_names[$i].', '.$this->int_pk_name.$q_middle[$i].$q_values[$i].', '.$this->table_array[$this->int_pk_name]['value'].$q_end[$i];
|
||||
$q = $q_begin[$i].
|
||||
(isset($q_names[$i]) ? $q_names[$i] : '').', '.
|
||||
$this->int_pk_name.
|
||||
(isset($q_middle[$i]) ? $q_middle[$i] : '').
|
||||
(isset($q_values[$i]) ? $q_values[$i] : '').', '.
|
||||
$this->table_array[$this->int_pk_name]['value'].
|
||||
$q_end[$i];
|
||||
}
|
||||
/** @phan-suppress-next-line PhanTypePossiblyInvalidDimOffset */
|
||||
$this->debug('edit', 'Pos['.$i.'] => '.$type[$i].' Q: '.$q.'<br>');
|
||||
// write the dataset
|
||||
if ($q) {
|
||||
@@ -1724,7 +1825,23 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
||||
*/
|
||||
public function formCreateElementListTable(string $table_name): array
|
||||
{
|
||||
$data = array();
|
||||
// init data rray
|
||||
$data = array(
|
||||
'delete_name' => '',
|
||||
'delete' => 0,
|
||||
'enable_name' => '',
|
||||
'prefix' => '',
|
||||
'pk_name' => '',
|
||||
'fk_name' => '',
|
||||
'type' => array(),
|
||||
'output_name' => array(),
|
||||
'preset' => array(),
|
||||
'element_list' => array(),
|
||||
'output_data' => array(),
|
||||
'content' => array(),
|
||||
'pos' => array(),
|
||||
'table_name' => $table_name // sub table name
|
||||
);
|
||||
// output name for the viewable left table td box, prefixed with * if mandatory
|
||||
$output_name = $this->element_list[$table_name]['output_name'];
|
||||
if (isset($this->element_list[$table_name]['mandatory']) &&
|
||||
@@ -1735,8 +1852,6 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
||||
// delete button name, if there is one set
|
||||
if (isset($this->element_list[$table_name]['delete_name'])) {
|
||||
$data['delete_name'] = $this->element_list[$table_name]['delete_name'];
|
||||
} else {
|
||||
$data['delete_name'] = '';
|
||||
}
|
||||
// set the enable checkbox for delete, if the delete flag is given if there is one
|
||||
if (isset($this->element_list[$table_name]['enable_name'])) {
|
||||
@@ -1744,17 +1859,11 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
||||
if (isset($this->element_list[$table_name]['delete'])) {
|
||||
$data['delete'] = 1;
|
||||
}
|
||||
} else {
|
||||
$data['enable_name'] = '';
|
||||
}
|
||||
// prefix for the elements, to not collide with names in the master set
|
||||
if (isset($this->element_list[$table_name]['prefix'])) {
|
||||
$data['prefix'] = $this->element_list[$table_name]['prefix'].'_';
|
||||
} else {
|
||||
$data['prefix'] = '';
|
||||
}
|
||||
// the sub data table name
|
||||
$data['table_name'] = $table_name;
|
||||
|
||||
// build the select part
|
||||
if (!isset($this->element_list[$table_name]['elements']) || !is_array($this->element_list[$table_name]['elements'])) {
|
||||
@@ -1788,10 +1897,11 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
||||
if (isset($data_array['type']) && $data_array['type'] == 'drop_down_db') {
|
||||
$md_q = md5($data_array['query']);
|
||||
while ($res = $this->dbReturn($data_array['query'])) {
|
||||
/** @phan-suppress-next-line PhanTypeInvalidDimOffset */
|
||||
$this->debug('edit', 'Q['.$md_q.'] pos: '.$this->cursor_ext[$md_q]['pos'].' | want: '.(isset($data_array['preset']) ? $data_array['preset'] : '-').' | set: '.(isset($data['preset'][$el_name]) ? $data['preset'][$el_name] : '-'));
|
||||
// first is default for this element
|
||||
if (isset($data_array['preset']) &&
|
||||
(!isset($data['preset'][$el_name]) || (isset($data['preset'][$el_name]) && !$data['preset'][$el_name])) &&
|
||||
(!isset($data['preset'][$el_name]) || empty($data['preset'][$el_name])) &&
|
||||
($this->cursor_ext[$md_q]['pos'] == $data_array['preset'])
|
||||
) {
|
||||
$data['preset'][$el_name] = $res[0];
|
||||
@@ -1840,6 +1950,8 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
||||
array_unshift($q_select, $read_name);
|
||||
}
|
||||
}
|
||||
// @phan HACK
|
||||
$data['prefix'] = $data['prefix'] ?? '';
|
||||
// set the rest of the data so we can print something out
|
||||
$data['type'][$data['prefix'].$this->element_list[$table_name]['read_data']['name']] = 'string';
|
||||
// build the read query
|
||||
@@ -1864,7 +1976,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
||||
} else {
|
||||
// only create query if we have a primary key
|
||||
// reads directly from the reference table
|
||||
if (isset($this->table_array[$this->int_pk_name]['value'])) {
|
||||
if (isset($this->table_array[$this->int_pk_name]['value']) &&
|
||||
$this->table_array[$this->int_pk_name]['value']
|
||||
) {
|
||||
$q = 'SELECT '.implode(', ', $q_select).' FROM '.$table_name.' WHERE '.$this->int_pk_name.' = '.$this->table_array[$this->int_pk_name]['value'];
|
||||
}
|
||||
}
|
||||
@@ -1875,7 +1989,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
||||
// read out the list and add the selected data if needed
|
||||
while ($res = $this->dbReturn($q)) {
|
||||
$_data = array();
|
||||
$prfx = $data['prefix']; // short
|
||||
$prfx = $data['prefix'] ?? ''; // short
|
||||
// go through each res
|
||||
for ($i = 0, $i_max = count($q_select); $i < $i_max; $i ++) {
|
||||
// query select part, set to the element name
|
||||
@@ -1923,15 +2037,23 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
||||
$missing_empty_count = $this->element_list[$table_name]['max_empty'] - $element_count;
|
||||
$this->debug('CFG MAX', 'Max empty: '.$this->element_list[$table_name]['max_empty'].', Missing: '.$missing_empty_count.', Has: '.$element_count);
|
||||
// set if we need more open entries or if we do not have any entries yet
|
||||
if (($missing_empty_count < $this->element_list[$table_name]['max_empty']) || $element_count == 0) {
|
||||
if (($missing_empty_count < $this->element_list[$table_name]['max_empty']) ||
|
||||
$element_count == 0
|
||||
) {
|
||||
for ($pos = $element_count, $pos_max = $this->element_list[$table_name]['max_empty'] + $element_count; $pos <= $pos_max; $pos ++) {
|
||||
$_data = array();
|
||||
// just in case
|
||||
if (!isset($data['type'])) {
|
||||
$data['type'] = array();
|
||||
}
|
||||
// the fields that need to be filled are in data->type array:
|
||||
// pk fields are unfilled
|
||||
// fk fields are filled with the fk_id 'int_pk_name' value
|
||||
foreach ($data['type'] as $el_name => $type) {
|
||||
$_data[$el_name] = '';
|
||||
if ($el_name == $data['pk_name']) {
|
||||
if (isset($data['pk_name']) &&
|
||||
$el_name == $data['pk_name']
|
||||
) {
|
||||
// do nothing for pk name
|
||||
} elseif (isset($data['fk_name']) &&
|
||||
$el_name == $data['fk_name'] &&
|
||||
@@ -1941,8 +2063,11 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
||||
}
|
||||
}
|
||||
$data['content'][] = $_data;
|
||||
$data['pos'][] = array(0 => $pos); // this is for the checkboxes
|
||||
// $this->debug('CFG ELEMENT LIST FILL', 'Pos: '.$pos.'/'.$pos_max.', Content: '.count($data['content']).', Pos: '.count($data['pos']));
|
||||
// this is for the checkboxes
|
||||
$data['pos'][] = array(
|
||||
0 => $pos
|
||||
);
|
||||
$this->debug('CFG ELEMENT LIST FILL', 'Pos: '.$pos.'/'.$pos_max.', Content: '.count($data['content']).', Pos: '.count($data['pos']));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -110,7 +110,8 @@ class ProgressBar
|
||||
$clear_buffer_size = $this->clear_buffer_size;
|
||||
}
|
||||
echo str_repeat(' ', $clear_buffer_size);
|
||||
ob_flush();
|
||||
// a small hack to avoid warnings about no buffer to flush
|
||||
@ob_flush();
|
||||
flush();
|
||||
}
|
||||
|
||||
@@ -541,6 +542,7 @@ class ProgressBar
|
||||
$html = '';
|
||||
$js = '';
|
||||
$html_button = '';
|
||||
$html_percent = '';
|
||||
|
||||
$this->__setStep($this->step);
|
||||
$this->position = $this->__calculatePosition($this->step);
|
||||
@@ -636,7 +638,7 @@ class ProgressBar
|
||||
case 'percent':
|
||||
// only one inner percent
|
||||
// print "STYLE[$name]: ".$style_lbl."<br>";
|
||||
if (!isset($html_percent)) {
|
||||
if (empty($html_percent)) {
|
||||
$html_percent = '<div id="plbl'.$name.$this->code.'" style="'.$style_lbl.'width:'.$data['width'].'px;line-height:1;text-shadow: 0 0 .2em white, 0 0 .5em white;">'.$this->__calculatePercent($this->step).'%</div>'."\n";
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -22,22 +22,418 @@ use SmartyBC;
|
||||
|
||||
class SmartyExtend extends SmartyBC
|
||||
{
|
||||
// internal translation engine
|
||||
public $l10n;
|
||||
|
||||
// lang & encoding
|
||||
public $lang_dir = '';
|
||||
public $lang;
|
||||
public $lang_short;
|
||||
public $encoding;
|
||||
// page name
|
||||
public $page_name;
|
||||
|
||||
// array for data parsing
|
||||
public $HEADER = array();
|
||||
public $DATA = array();
|
||||
public $DEBUG_DATA = array();
|
||||
private $CONTENT_DATA = array();
|
||||
// control vars
|
||||
public $USE_PROTOTYPE = USE_PROTOTYPE;
|
||||
public $USE_JQUERY = USE_JQUERY;
|
||||
public $USE_SCRIPTACULOUS = USE_SCRIPTACULOUS;
|
||||
// sub content input vars
|
||||
public $USE_TINY_MCE = false;
|
||||
public $JS_DATEPICKR = false;
|
||||
public $JS_FLATPICKR = false;
|
||||
public $JS_FILE_UPLOADER = false;
|
||||
public $DEBUG_TMPL = false;
|
||||
public $USE_INCLUDE_TEMPLATE = false;
|
||||
// cache & compile
|
||||
public $CACHE_ID = '';
|
||||
public $COMPILE_ID = '';
|
||||
// template vars
|
||||
public $MASTER_TEMPLATE_NAME;
|
||||
public $PAGE_FILE_NAME;
|
||||
public $CONTENT_INCLUDE;
|
||||
public $FORM_NAME;
|
||||
public $FORM_ACTION;
|
||||
public $L_TITLE;
|
||||
public $PAGE_WIDTH;
|
||||
// smarty include/set var
|
||||
public $TEMPLATE_PATH;
|
||||
public $TEMPLATE_NAME;
|
||||
public $INC_TEMPLATE_NAME;
|
||||
public $JS_TEMPLATE_NAME;
|
||||
public $CSS_TEMPLATE_NAME;
|
||||
public $TEMPLATE_TRANSLATE;
|
||||
// local names
|
||||
public $JS_SPECIAL_TEMPLATE_NAME = '';
|
||||
public $CSS_SPECIAL_TEMPLATE_NAME = '';
|
||||
public $JS_INCLUDE;
|
||||
public $CSS_INCLUDE;
|
||||
public $JS_SPECIAL_INCLUDE;
|
||||
public $CSS_SPECIAL_INCLUDE;
|
||||
public $ADMIN_JAVASCRIPT;
|
||||
public $ADMIN_STYLESHEET;
|
||||
public $FRONTEND_JAVASCRIPT;
|
||||
public $FRONTEND_STYLESHEET;
|
||||
// other smarty folder vars
|
||||
public $INCLUDES;
|
||||
public $JAVASCRIPT;
|
||||
public $CSS;
|
||||
public $FONT;
|
||||
public $PICTURES;
|
||||
public $CACHE_PICTURES;
|
||||
public $CACHE_PICTURES_ROOT;
|
||||
|
||||
// constructor class, just sets the language stuff
|
||||
/**
|
||||
* constructor class, just sets the language stuff
|
||||
* calls L10 for pass on internaly in smarty
|
||||
* also registers the getvar caller pliugin
|
||||
* @param string $lang language string to set
|
||||
* also registers the getvar caller plugin
|
||||
*/
|
||||
public function __construct(string $lang)
|
||||
public function __construct()
|
||||
{
|
||||
// call basic smarty
|
||||
parent::__construct();
|
||||
$this->l10n = new \CoreLibs\Language\L10n($lang);
|
||||
// set lang vars
|
||||
$this->setLangEncoding();
|
||||
// iinit lang
|
||||
$this->l10n = new \CoreLibs\Language\L10n($this->lang);
|
||||
// variable variable register
|
||||
// $this->register_modifier('getvar', array(&$this, 'get_template_vars'));
|
||||
$this->registerPlugin('modifier', 'getvar', array(&$this, 'get_template_vars'));
|
||||
|
||||
$this->page_name = pathinfo($_SERVER["PHP_SELF"])['basename'];
|
||||
|
||||
// set internal settings
|
||||
$this->CACHE_ID = defined('CACHE_ID') ? CACHE_ID : '';
|
||||
$this->COMPILE_ID = defined('COMPILE_ID') ? COMPILE_ID : '';
|
||||
}
|
||||
|
||||
/**
|
||||
* ORIGINAL in \CoreLibs\Admin\Backend
|
||||
* set the language encoding and language settings
|
||||
* the default charset from _SESSION login or from
|
||||
* config DEFAULT ENCODING
|
||||
* the lang full name for mo loading from _SESSION login
|
||||
* or SITE LANG or DEFAULT LANG from config
|
||||
* creates short lang (only first two chars) from the lang
|
||||
* @return void
|
||||
*/
|
||||
private function setLangEncoding(): void
|
||||
{
|
||||
// just emergency fallback for language
|
||||
// set encoding
|
||||
if (isset($_SESSION['DEFAULT_CHARSET'])) {
|
||||
$this->encoding = $_SESSION['DEFAULT_CHARSET'];
|
||||
} else {
|
||||
$this->encoding = DEFAULT_ENCODING;
|
||||
}
|
||||
// gobal override
|
||||
if (isset($GLOBALS['OVERRIDE_LANG'])) {
|
||||
$this->lang = $GLOBALS['OVERRIDE_LANG'];
|
||||
} elseif (isset($_SESSION['DEFAULT_LANG'])) {
|
||||
// session (login)
|
||||
$this->lang = $_SESSION['DEFAULT_LANG'];
|
||||
} else {
|
||||
// mostly default SITE LANG or DEFAULT LANG
|
||||
$this->lang = defined('SITE_LANG') ? SITE_LANG : DEFAULT_LANG;
|
||||
}
|
||||
// create the char lang encoding
|
||||
$this->lang_short = substr($this->lang, 0, 2);
|
||||
// set the language folder
|
||||
$this->lang_dir = BASE.INCLUDES.LANG.CONTENT_PATH;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* sets all internal paths and names that need to be passed on to the smarty template
|
||||
* @return void
|
||||
*/
|
||||
public function setSmartyPaths(): void
|
||||
{
|
||||
// master template
|
||||
if (!isset($this->MASTER_TEMPLATE_NAME)) {
|
||||
$this->MASTER_TEMPLATE_NAME = MASTER_TEMPLATE_NAME;
|
||||
}
|
||||
|
||||
// set include & template names
|
||||
if (!isset($this->CONTENT_INCLUDE)) {
|
||||
$this->CONTENT_INCLUDE = str_replace('.php', '', $this->page_name).'.tpl';
|
||||
}
|
||||
// strip tpl and replace it with php
|
||||
// php include file per page
|
||||
$this->INC_TEMPLATE_NAME = str_replace('.tpl', '.php', $this->CONTENT_INCLUDE);
|
||||
// javascript include per page
|
||||
$this->JS_TEMPLATE_NAME = str_replace('.tpl', '.js', $this->CONTENT_INCLUDE);
|
||||
// css per page
|
||||
$this->CSS_TEMPLATE_NAME = str_replace('.tpl', '.css', $this->CONTENT_INCLUDE);
|
||||
|
||||
// set basic template path (tmp)
|
||||
$this->INCLUDES = BASE.INCLUDES; // no longer in templates, only global
|
||||
$this->TEMPLATE_PATH = BASE.INCLUDES.TEMPLATES.CONTENT_PATH;
|
||||
$this->setTemplateDir($this->TEMPLATE_PATH);
|
||||
$this->JAVASCRIPT = LAYOUT.JS;
|
||||
$this->CSS = LAYOUT.CSS;
|
||||
$this->FONT = LAYOUT.FONT;
|
||||
$this->PICTURES = LAYOUT.IMAGES;
|
||||
$this->CACHE_PICTURES = LAYOUT.CACHE;
|
||||
$this->CACHE_PICTURES_ROOT = ROOT.$this->CACHE_PICTURES;
|
||||
// check if we have an external file with the template name
|
||||
if (file_exists($this->INCLUDES.$this->INC_TEMPLATE_NAME) &&
|
||||
is_file($this->INCLUDES.$this->INC_TEMPLATE_NAME)
|
||||
) {
|
||||
include($this->INCLUDES.$this->INC_TEMPLATE_NAME);
|
||||
}
|
||||
// check for template include
|
||||
if ($this->USE_INCLUDE_TEMPLATE === true &&
|
||||
!$this->TEMPLATE_NAME
|
||||
) {
|
||||
$this->TEMPLATE_NAME = $this->CONTENT_INCLUDE;
|
||||
// add to cache & compile id
|
||||
$this->COMPILE_ID .= '_'.$this->TEMPLATE_NAME;
|
||||
$this->CACHE_ID .= '_'.$this->TEMPLATE_NAME;
|
||||
}
|
||||
// additional per page Javascript include
|
||||
$this->JS_INCLUDE = '';
|
||||
if (file_exists($this->JAVASCRIPT.$this->JS_TEMPLATE_NAME) &&
|
||||
is_file($this->JAVASCRIPT.$this->JS_TEMPLATE_NAME)
|
||||
) {
|
||||
$this->JS_INCLUDE = $this->JAVASCRIPT.$this->JS_TEMPLATE_NAME;
|
||||
}
|
||||
// per page css file
|
||||
$this->CSS_INCLUDE = '';
|
||||
if (file_exists($this->CSS.$this->CSS_TEMPLATE_NAME) &&
|
||||
is_file($this->CSS.$this->CSS_TEMPLATE_NAME)
|
||||
) {
|
||||
$this->CSS_INCLUDE = $this->CSS.$this->CSS_TEMPLATE_NAME;
|
||||
}
|
||||
// optional CSS file
|
||||
$this->CSS_SPECIAL_INCLUDE = '';
|
||||
if (file_exists($this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME) &&
|
||||
is_file($this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME)
|
||||
) {
|
||||
$this->CSS_SPECIAL_INCLUDE = $this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME;
|
||||
}
|
||||
// optional JS file
|
||||
$this->JS_SPECIAL_INCLUDE = '';
|
||||
if (file_exists($this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME) &&
|
||||
is_file($this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME)
|
||||
) {
|
||||
$this->JS_SPECIAL_INCLUDE = $this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME;
|
||||
}
|
||||
// check if template names exist
|
||||
if (!$this->MASTER_TEMPLATE_NAME) {
|
||||
exit('MASTER TEMPLATE is not set');
|
||||
} elseif (!file_exists($this->getTemplateDir()[0].DS.$this->MASTER_TEMPLATE_NAME)) {
|
||||
// abort if master template could not be found
|
||||
exit('MASTER TEMPLATE: '.$this->MASTER_TEMPLATE_NAME.' could not be found');
|
||||
}
|
||||
if ($this->TEMPLATE_NAME &&
|
||||
!file_exists($this->getTemplateDir()[0].DS.$this->TEMPLATE_NAME)
|
||||
) {
|
||||
exit('INCLUDE TEMPLATE: '.$this->TEMPLATE_NAME.' could not be found');
|
||||
}
|
||||
// javascript translate data as template for auto translate
|
||||
if (empty($this->TEMPLATE_TRANSLATE)) {
|
||||
$this->TEMPLATE_TRANSLATE = 'jsTranslate_'.$this->lang.'.tpl';
|
||||
} else {
|
||||
// we assume we have some fixed set
|
||||
// we must add _<$this->lang>
|
||||
// if .tpl, put before .tpl
|
||||
// if not .tpl, add _<$this->lang>.tpl
|
||||
if (strpos($this->TEMPLATE_TRANSLATE, '.tpl')) {
|
||||
$this->TEMPLATE_TRANSLATE = str_replace('.tpl', '_'.$this->lang.'.tpl', $this->TEMPLATE_TRANSLATE);
|
||||
} else {
|
||||
$this->TEMPLATE_TRANSLATE .= '_'.$this->lang.'.tpl';
|
||||
}
|
||||
}
|
||||
// if we can't find it, dump it
|
||||
if (!file_exists($this->getTemplateDir()[0].DS.$this->TEMPLATE_TRANSLATE)) {
|
||||
$this->TEMPLATE_TRANSLATE = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* wrapper call for setSmartyVars
|
||||
* this is for frontend type and will not set any only admin needed variables
|
||||
* @return void
|
||||
*/
|
||||
public function setSmartyVarsFrontend(): void
|
||||
{
|
||||
$this->setSmartyVars();
|
||||
}
|
||||
|
||||
/**
|
||||
* wrapper call for setSmartyVars
|
||||
* this is only for admin interface and will set additional variables
|
||||
*/
|
||||
public function setSmartyVarsAdmin(): void
|
||||
{
|
||||
$this->setSmartyVars(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* set smarty pass on variables, sub template names and finally calls the smarty parser
|
||||
* @param boolean $admin_call default false, will set admin only variables
|
||||
* @return void
|
||||
*/
|
||||
private function setSmartyVars($admin_call = false): void
|
||||
{
|
||||
global $cms;
|
||||
$this->mergeCmsSmartyVars($cms);
|
||||
|
||||
// trigger flags
|
||||
$this->HEADER['USE_PROTOTYPE'] = $this->USE_PROTOTYPE;
|
||||
// scriptacolous, can only be used with prototype
|
||||
if ($this->HEADER['USE_PROTOTYPE']) {
|
||||
$this->HEADER['USE_SCRIPTACULOUS'] = $this->USE_SCRIPTACULOUS;
|
||||
}
|
||||
// jquery and prototype should not be used together
|
||||
$this->HEADER['USE_JQUERY'] = $this->USE_JQUERY;
|
||||
|
||||
// additional per page Javascript include
|
||||
$this->JS_INCLUDE = '';
|
||||
if (file_exists($this->JAVASCRIPT.$this->JS_TEMPLATE_NAME) &&
|
||||
is_file($this->JAVASCRIPT.$this->JS_TEMPLATE_NAME)
|
||||
) {
|
||||
$this->JS_INCLUDE = $this->JAVASCRIPT.$this->JS_TEMPLATE_NAME;
|
||||
}
|
||||
// per page css file
|
||||
$this->CSS_INCLUDE = '';
|
||||
if (file_exists($this->CSS.$this->CSS_TEMPLATE_NAME) &&
|
||||
is_file($this->CSS.$this->CSS_TEMPLATE_NAME)
|
||||
) {
|
||||
$this->CSS_INCLUDE = $this->CSS.$this->CSS_TEMPLATE_NAME;
|
||||
}
|
||||
// optional CSS file
|
||||
$this->CSS_SPECIAL_INCLUDE = '';
|
||||
if (file_exists($this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME) &&
|
||||
is_file($this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME)
|
||||
) {
|
||||
$this->CSS_SPECIAL_INCLUDE = $this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME;
|
||||
}
|
||||
// optional JS file
|
||||
$this->JS_SPECIAL_INCLUDE = '';
|
||||
if (file_exists($this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME) &&
|
||||
is_file($this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME)
|
||||
) {
|
||||
$this->JS_SPECIAL_INCLUDE = $this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME;
|
||||
}
|
||||
|
||||
// the actual include files for javascript (per page)
|
||||
$this->HEADER['JS_INCLUDE'] = $this->JS_INCLUDE;
|
||||
$this->HEADER['CSS_INCLUDE'] = $this->CSS_INCLUDE;
|
||||
$this->HEADER['CSS_SPECIAL_INCLUDE'] = $this->CSS_SPECIAL_INCLUDE;
|
||||
$this->HEADER['JS_SPECIAL_INCLUDE'] = $this->JS_SPECIAL_INCLUDE;
|
||||
// paths to the files
|
||||
$this->DATA['includes'] = $this->INCLUDES;
|
||||
$this->DATA['js'] = $this->JAVASCRIPT;
|
||||
$this->DATA['css'] = $this->CSS;
|
||||
$this->DATA['pictures'] = $this->PICTURES;
|
||||
|
||||
// default CMS settings
|
||||
// define all needed smarty stuff for the general HTML/page building
|
||||
$this->HEADER['CSS'] = CSS;
|
||||
$this->HEADER['FONT'] = FONT;
|
||||
$this->HEADER['JS'] = JS;
|
||||
$this->HEADER['ENCODING'] = $this->encoding;
|
||||
$this->HEADER['DEFAULT_ENCODING'] = DEFAULT_ENCODING;
|
||||
|
||||
// special for admin
|
||||
if ($admin_call === true) {
|
||||
// set ACL extra show
|
||||
$this->DATA['show_ea_extra'] = isset($cms->acl['show_ea_extra']) ? $cms->acl['show_ea_extra'] : false;
|
||||
$this->DATA['ADMIN'] = !empty($cms->acl['admin']) ? $cms->acl['admin'] : 0;
|
||||
// set style sheets
|
||||
$this->HEADER['STYLESHEET'] = $this->ADMIN_STYLESHEET ? $this->ADMIN_STYLESHEET : ADMIN_STYLESHEET;
|
||||
$this->HEADER['JAVASCRIPT'] = $this->ADMIN_JAVASCRIPT ? $this->ADMIN_JAVASCRIPT : ADMIN_JAVASCRIPT;
|
||||
// top menu
|
||||
$this->DATA['nav_menu'] = $cms->adbTopMenu();
|
||||
$this->DATA['nav_menu_count'] = is_array($this->DATA['nav_menu']) ? count($this->DATA['nav_menu']) : 0;
|
||||
// messages = array('msg' =>, 'class' => 'error/warning/...')
|
||||
$this->DATA['messages'] = isset($cms->messages) ? $cms->messages : $cms->messages;
|
||||
// the page name
|
||||
$this->DATA['page_name'] = $this->page_name;
|
||||
$this->DATA['table_width'] = isset($this->PAGE_WIDTH) ? $this->PAGE_WIDTH : PAGE_WIDTH;
|
||||
// for tinymce special
|
||||
$this->DATA['TINYMCE_LANG'] = $this->lang_short;
|
||||
// include flags
|
||||
$this->DATA['USE_TINY_MCE'] = $this->USE_TINY_MCE;
|
||||
// debug data, if DEBUG flag is on, this data is print out
|
||||
$this->DEBUG_DATA['DEBUG'] = $this->DEBUG_TMPL;
|
||||
} else {
|
||||
$this->HEADER['STYLESHEET'] = $this->FRONTEND_STYLESHEET ? $this->FRONTEND_STYLESHEET : STYLESHEET;
|
||||
$this->HEADER['JAVASCRIPT'] = $this->FRONTEND_JAVASCRIPT ? $this->FRONTEND_JAVASCRIPT : JAVASCRIPT;
|
||||
}
|
||||
// html title
|
||||
// set local page title
|
||||
$this->HEADER['HTML_TITLE'] = !$this->L_TITLE ?
|
||||
ucfirst(str_replace('_', ' ', $cms->getPageName(1))).(defined(G_TITLE) ? ' - '.$this->l10n->__(G_TITLE) : '') :
|
||||
$this->l10n->__($this->L_TITLE);
|
||||
|
||||
// LANG
|
||||
$this->DATA['LANG'] = $this->lang;
|
||||
// form name
|
||||
$this->DATA['FORM_NAME'] = !$this->FORM_NAME ?
|
||||
str_replace('.php', '', $this->page_name) :
|
||||
$this->FORM_NAME;
|
||||
$this->DATA['FORM_ACTION'] = $this->FORM_ACTION;
|
||||
// include flags
|
||||
$this->DATA['JS_DATEPICKR'] = $this->JS_DATEPICKR;
|
||||
$this->DATA['JS_FLATPICKR'] = $this->JS_FLATPICKR;
|
||||
$this->DATA['JS_FILE_UPLOADER'] = $this->JS_FILE_UPLOADER;
|
||||
// user name
|
||||
$this->DATA['USER_NAME'] = !empty($_SESSION['USER_NAME']) ? $_SESSION['USER_NAME'] : '';
|
||||
// the template part to include into the body
|
||||
$this->DATA['TEMPLATE_NAME'] = $this->TEMPLATE_NAME;
|
||||
$this->DATA['CONTENT_INCLUDE'] = $this->CONTENT_INCLUDE;
|
||||
$this->DATA['TEMPLATE_TRANSLATE'] = isset($this->TEMPLATE_TRANSLATE) ? $this->TEMPLATE_TRANSLATE : null;
|
||||
$this->DATA['PAGE_FILE_NAME'] = str_replace('.php', '', $this->page_name).'.tpl';
|
||||
// render page
|
||||
$this->renderSmarty();
|
||||
}
|
||||
|
||||
/**
|
||||
* merge outside object HEADER/DATA/DEBUG_DATA vars into the smarty class
|
||||
* @param object $cms object that has header/data/debug_data
|
||||
* @return void
|
||||
*/
|
||||
public function mergeCmsSmartyVars(object $cms): void
|
||||
{
|
||||
// array merge HEADER, DATA, DEBUG DATA
|
||||
foreach (array('HEADER', 'DATA', 'DEBUG_DATA') as $ext_smarty) {
|
||||
if (is_array($cms->{$ext_smarty})) {
|
||||
$this->{$ext_smarty} = array_merge($this->{$ext_smarty}, $cms->{$ext_smarty});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* render smarty data (can be called sepparate)
|
||||
* @return void
|
||||
*/
|
||||
public function renderSmarty(): void
|
||||
{
|
||||
// create main data array
|
||||
$this->CONTENT_DATA = array_merge($this->HEADER, $this->DATA, $this->DEBUG_DATA);
|
||||
// data is 1:1 mapping (all vars, values, etc)
|
||||
foreach ($this->CONTENT_DATA as $key => $value) {
|
||||
$this->assign($key, $value);
|
||||
}
|
||||
if (is_dir(BASE.TEMPLATES_C)) {
|
||||
$this->setCompileDir(BASE.TEMPLATES_C);
|
||||
}
|
||||
if (is_dir(BASE.CACHE)) {
|
||||
$this->setCacheDir(BASE.CACHE);
|
||||
}
|
||||
$this->display(
|
||||
$this->MASTER_TEMPLATE_NAME,
|
||||
$this->CACHE_ID.($this->CACHE_ID ? '_' : '').$this->lang,
|
||||
$this->COMPILE_ID.($this->COMPILE_ID ? '_' : '').$this->lang
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -35,8 +35,8 @@ class qqUploadedFileXhr
|
||||
}
|
||||
public function getSize()
|
||||
{
|
||||
if (isset($_SERVER["CONTENT_LENGTH"])) {
|
||||
return (int)$_SERVER["CONTENT_LENGTH"];
|
||||
if (isset($_SERVER['CONTENT_LENGTH'])) {
|
||||
return (int)$_SERVER['CONTENT_LENGTH'];
|
||||
} else {
|
||||
throw new \Exception('Getting content length is not supported.');
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
namespace FileUpload;
|
||||
|
||||
use \FileUpload\Core;
|
||||
// use \FileUpload\Core;
|
||||
|
||||
class qqFileUploader
|
||||
{
|
||||
@@ -84,7 +84,7 @@ class qqFileUploader
|
||||
$pathinfo = pathinfo($this->file->getName());
|
||||
$filename = $pathinfo['filename'];
|
||||
//$filename = md5(uniqid());
|
||||
$ext = $pathinfo['extension'];
|
||||
$ext = $pathinfo['extension'] ?? '';
|
||||
|
||||
if ($this->allowedExtensions && !in_array(strtolower($ext), $this->allowedExtensions)) {
|
||||
$these = implode(', ', $this->allowedExtensions);
|
||||
|
||||
1
www/lib/font
Symbolic link
1
www/lib/font
Symbolic link
@@ -0,0 +1 @@
|
||||
Fonts/
|
||||
Reference in New Issue
Block a user