Compare commits

..

12 Commits

Author SHA1 Message Date
Clemens Schwaighofer
0a80b28553 Add PHPCS ignore for errors in class debug test file 2021-06-17 09:20:19 +09:00
Clemens Schwaighofer
2c5fcd973f Debugger Test updates for logger attching to classes 2021-06-17 06:16:11 +09:00
Clemens Schwaighofer
4515a5fdd1 Change all internal debug printAr calls
Use the correct log->prAr call for debug array prints
2021-06-16 14:53:58 +09:00
Clemens Schwaighofer
f04487d553 Logging class update with dedicated print arrray wrapper
add a prAr that is a new wrapper around print_r, but it does not use
<pre> for layout formatting but {##HTMLPRE##} which will be removed for log
file write or replace with <pre> if printed to the web page
2021-06-16 14:42:52 +09:00
Clemens Schwaighofer
d068aaeed7 Update Debug\Logger for some simpler code
All strings are written to an array and not string append.
Group debug write/debug echo better to make it more simple.
Fixed bug with echo output in logging

Also set debug to be deprecated for phan testing
2021-06-16 10:11:44 +09:00
Clemens Schwaighofer
b628331a9b Fix Login class logging per class setting, fix per class getter
Add a new helper function to get current class that called the debug function.
Fix bug were log_per was not set correctly
Change all get_class calls in debug to the new helper function
2021-06-15 18:06:21 +09:00
Clemens Schwaighofer
3035287b5c Code clean up for Basic Class clean up
Fix all other class code for calling former Basic class methods.
Also try to replace all remaining array() calls to [] type

Some docblock updates when missing or wrong set
2021-06-14 17:03:45 +09:00
Clemens Schwaighofer
cb17b553b0 Update all core libs classes with new Basic class layout 2021-06-14 13:27:18 +09:00
Clemens Schwaighofer
448b54f5c1 Disable logging in Class Basic and redirect all to Debug\Logging 2021-06-11 20:47:42 +09:00
Clemens Schwaighofer
e80915cd5c Further split out Class.Basic
- Email/File/Hash class update
- add random key, running time
- get system calls
- Debug classes for logging, running time, etc
2021-06-08 18:11:09 +09:00
Clemens Schwaighofer
4ae1c2bde0 Basic Class update
Start moving all basic class methods into dedicated classes.
Most of them are static and can be direct called.
No need to group them into one big class that is hard to maintain and
check.

Work is ongoing
2021-06-04 21:22:30 +09:00
Clemens Schwaighofer
ee6e0581da Fix humand readable byte to number javascript method call 2021-05-20 20:43:52 +09:00
74 changed files with 6840 additions and 3531 deletions

View File

@@ -0,0 +1,105 @@
<?php declare(strict_types=1);
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-array';
ob_end_flush();
use CoreLibs\Combined\ArrayHandler;
use CoreLibs\Debug\Support as DgS;
$basic = new CoreLibs\Basic();
// $_array= new CoreLibs\Combined\ArrayHandler();
// $array_class = 'CoreLibs\Combination\ArrayHandler';
print "<html><head><title>TEST CLASS: ARRAY HANDLER</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
// recursive array search
$test_array = [
'foo' => 'bar',
'input' => [
'element_a' => [
'type' => 'text'
],
'element_b' => [
'type' => 'email'
],
'element_c' => [
'type' => 'email'
],
],
];
echo "SOURCE ARRAY: ".DgS::printAr($test_array)."<br>";
// frist return
echo "ARRAYSEARCHRECURSIVE(email, [array], type): ".DgS::printAr(ArrayHandler::arraySearchRecursive('email', $test_array, 'type'))."<br>";
echo "ARRAYSEARCHRECURSIVE(email, [array]['input'], type): ".DgS::printAr(ArrayHandler::arraySearchRecursive('email', $test_array['input'], 'type'))."<br>";
// all return
echo "ARRAYSEARCHRECURSIVEALL(email, [array], type): ".Dgs::printAr((array)ArrayHandler::arraySearchRecursiveAll('email', $test_array, 'type'))."<br>";
// simple search
echo "ARRAYSEARCHSIMPLE([array], type, email): ".(string)ArrayHandler::arraySearchSimple($test_array, 'type', 'email')."<br>";
$array_1 = [
'foo' => 'bar'
];
$array_2 = [
1, 2, 3
];
$array_3 = [
'alpha' => [
'beta' => 4
]
];
// recusrice merge
print "ARRAYMERGERECURSIVE: ".DgS::printAr(ArrayHandler::arrayMergeRecursive($array_1, $array_2, $array_3))."<br>";
// array difference
$array_left = [
'same' => 'data',
'left' => 'Has L'
];
$array_right = [
'same' => 'data',
'right' => 'has R'
];
print "ARRAYDIFF: ".DgS::printAr(ArrayHandler::arrayDiff($array_left, $array_right))."<br>";
// in array check
print "INARRAYANY([1,3], [array]): ".DgS::printAr(ArrayHandler::inArrayAny([1, 3], $array_2))."<br>";
// flatten array
print "FLATTENARRAY: ".DgS::printAr(ArrayHandler::flattenArray($test_array))."<br>";
print "FLATTENARRAYKEY: ".DgS::printAr(ArrayHandler::flattenArrayKey($test_array))."<br>";
// flatten for key set
print "ARRAYFLATFORKEY: ".DgS::printAr(ArrayHandler::arrayFlatForKey($test_array, 'type'))."<br>";
// DEPRECATED
// print "ARRAYMERGERECURSIVE: ".DgS::printAr($basic->arrayMergeRecursive($array_1, $array_2, $array_3))."<br>";
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,95 @@
<?php declare(strict_types=1);
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-byte';
ob_end_flush();
use CoreLibs\Convert\Byte;
$basic = new CoreLibs\Basic();
$byte_class = 'CoreLibs\Convert\Byte';
print "<html><head><title>TEST CLASS: BYTE CONVERT</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
// class
$byte = 254779258;
$string = '242.98 MB';
// static
print "S::BYTE TO: $byte: ".$byte_class::humanReadableByteFormat($byte)."<br>";
print "S::BYTE FROM: $string: ".$byte_class::stringByteFormat($string)."<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 :";
$_bytes = Byte::humanReadableByteFormat($byte);
print '</div><div style="width: 10%;">'.$_bytes;
print '</div><div style="width: 10%;">';
print Byte::stringByteFormat($_bytes);
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]:";
$_bytes = Byte::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_SI);
print '</div><div style="width: 10%;">'.$_bytes;
print '</div><div style="width: 10%;">';
print Byte::stringByteFormat($_bytes);
print "</div>";
//
print "</div>";
}
// DEPRECATED
/* $byte = 254779258;
$string = '242.98 MB';
print "BYTE TO: $byte: ".$basic->humanReadableByteFormat($byte)."<br>";
print "BYTE FROM: $string: ".$basic->stringByteFormat($string)."<br>"; */
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,66 @@
<?php declare(strict_types=1);
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-colors';
ob_end_flush();
use CoreLibs\Convert\Colors;
use CoreLibs\Debug\Support as DgS;
$basic = new CoreLibs\Basic();
$color_class = 'CoreLibs\Convert\Colors';
print "<html><head><title>TEST CLASS: COLORS</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
// define a list of from to color sets for conversion test
// A(out of bounds)
print "C::S/COLOR invalid rgb->hex (gray 125): -1, -1, -1: ".CoreLibs\Convert\Colors::rgb2hex(-1, -1, -1)."<br>";
print "\$C::S/COLOR invalid rgb->hex (gary 125): -1, -1, -1: ".$color_class::rgb2hex(-1, -1, -1)."<br>";
// B(valid)
$rgb = [10, 20, 30];
$hex = '#0a141e';
$hsb = [210, 67, 12];
$hsl = [210, 50, 7.8];
print "S::COLOR rgb->hex: $rgb[0], $rgb[1], $rgb[2]: ".Colors::rgb2hex($rgb[0], $rgb[1], $rgb[2])."<br>";
print "S::COLOR hex->rgb: $hex: ".DgS::printAr(Colors::hex2rgb($hex))."<br>";
print "C::S/COLOR rgb->hext: $hex: ".DgS::printAr(CoreLibs\Convert\Colors::hex2rgb($hex))."<br>";
// C(to hsb/hsl)
print "S::COLOR rgb->hsb: $rgb[0], $rgb[1], $rgb[2]: ".DgS::printAr(Colors::rgb2hsb($rgb[0], $rgb[1], $rgb[2]))."<br>";
print "S::COLOR rgb->hsl: $rgb[0], $rgb[1], $rgb[2]: ".DgS::printAr(Colors::rgb2hsl($rgb[0], $rgb[1], $rgb[2]))."<br>";
// D(from hsb/hsl) Note that param 2 + 3 is always 0-100 divided
print "S::COLOR hsb->rgb: $hsb[0], $hsb[1], $hsb[2]: ".DgS::printAr(Colors::hsb2rgb($hsb[0], $hsb[1], $hsb[2]))."<br>";
print "S::COLOR hsl->rgb: $hsl[0], $hsl[1], $hsl[2]: ".DgS::printAr(Colors::hsl2rgb($hsl[0], $hsl[1], $hsl[2]))."<br>";
// TODO: run compare check input must match output
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,149 @@
<?php declare(strict_types=1);
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-datetime';
ob_end_flush();
use CoreLibs\Combined\DateTime;
use CoreLibs\Debug\Support as DgS;
$basic = new CoreLibs\Basic();
$datetime_class = 'CoreLibs\Combination\DateTime';
print "<html><head><title>TEST CLASS: DATE/TIME</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
// class
$timestamp = 1622788315.123456;
// static
print "S::DATESTRINGFORMAT(sm:0): $timestamp: ".$datetime_class::dateStringFormat($timestamp)."<br>";
// time string thest
$timestamp = 5887998.33445;
$time_string = DateTime::timeStringFormat($timestamp);
print "PLANE TIME STRING: ".$timestamp."<br>";
print "TIME STRING TEST: ".$time_string."<br>";
print "REVERSE TIME STRING: ".DateTime::stringToTime($time_string)."<br>";
if (round($timestamp, 4) == DateTime::stringToTime($time_string)) {
print "REVERSE TIME STRING MATCH<br>";
} else {
print "REVERSE TRIME STRING DO NOT MATCH<br>";
}
print "ZERO TIME STRING: ".DateTime::timeStringFormat(0, true)."<br>";
print "ZERO TIME STRING: ".DateTime::timeStringFormat(0.0, true)."<br>";
print "ZERO TIME STRING: ".DateTime::timeStringFormat(1.005, true)."<br>";
$timestamps = [
1622788315.123456,
-1622788315.456789
];
foreach ($timestamps as $timestamp) {
print "DATESTRINGFORMAT(sm:0): $timestamp: ".DateTime::dateStringFormat($timestamp)."<br>";
print "DATESTRINGFORMAT(sm:1): $timestamp: ".DateTime::dateStringFormat($timestamp, true)."<br>";
}
$intervals = [
788315.123456,
-123.456
];
foreach ($intervals as $interval) {
print "TIMESTRINGFORMAT(sm:0): $interval: ".DateTime::timeStringFormat($interval, false)."<br>";
$reverse_interval = DateTime::timeStringFormat($interval);
print "TIMESTRINGFORMAT(sm:1): $interval: ".$reverse_interval."<br>";
print "STRINGTOTIME: $reverse_interval: ".DateTime::stringToTime($reverse_interval)."<br>";
}
$check_dates = [
'2021-05-01',
'2021-05-40'
];
foreach ($check_dates as $check_date) {
print "CHECKDATE: $check_date: ".(string)DateTime::checkDate($check_date)."<br>";
}
$check_datetimes = [
'2021-05-01',
'2021-05-40',
'2021-05-01 12:13:14',
'2021-05-40 12:13:14',
'2021-05-01 25:13:14',
];
foreach ($check_datetimes as $check_datetime) {
print "CHECKDATETIME: $check_datetime: ".(string)DateTime::checkDateTime($check_datetime)."<br>";
}
$compare_dates = [
[ '2021-05-01', '2021-05-02', ],
[ '2021-05-02', '2021-05-01', ],
[ '2021-05-02', '2021-05-02', ],
[ '2017/1/5', '2017-01-05', ],
];
// compareDate
foreach ($compare_dates as $compare_date) {
print "COMPAREDATE: $compare_date[0] = $compare_date[1]: ".(string)DateTime::compareDate($compare_date[0], $compare_date[1])."<br>";
}
$compare_datetimes = [
[ '2021-05-01', '2021-05-02', ],
[ '2021-05-02', '2021-05-01', ],
[ '2021-05-02', '2021-05-02', ],
[ '2021-05-01 10:00:00', '2021-05-01 11:00:00', ],
[ '2021-05-01 11:00:00', '2021-05-01 10:00:00', ],
[ '2021-05-01 10:00:00', '2021-05-01 10:00:00', ],
];
foreach ($compare_datetimes as $compare_datetime) {
print "COMPAREDATE: $compare_datetime[0] = $compare_datetime[1]: ".(string)DateTime::compareDateTime($compare_datetime[0], $compare_datetime[1])."<br>";
}
$compare_dates = [
[ '2021-05-01', '2021-05-10', ],
[ '2021-05-10', '2021-05-01', ],
[ '2021-05-02', '2021-05-01', ],
[ '2021-05-02', '2021-05-02', ],
];
foreach ($compare_dates as $compare_date) {
print "CALCDAYSINTERVAL: $compare_date[0] = $compare_date[1]: ".DgS::printAr(DateTime::calcDaysInterval($compare_date[0], $compare_date[1]))."<br>";
print "CALCDAYSINTERVAL(named): $compare_date[0] = $compare_date[1]: ".DgS::printAr(DateTime::calcDaysInterval($compare_date[0], $compare_date[1], true))."<br>";
}
// DEPRECATED
/* $timestamp = 1622788315.123456;
print "C->DATESTRINGFORMAT(sm:0): $timestamp: ".$basic->dateStringFormat($timestamp)."<br>";
$interval = 788315.123456;
$reverse_interval = $basic->timeStringFormat($interval);
print "TIMESTRINGFORMAT(sm:1): $interval: ".$reverse_interval."<br>";
print "STRINGTOTIME: $reverse_interval: ".$basic->stringToTime($reverse_interval)."<br>";
$check_date = '2021-05-01';
print "CHECKDATE: $check_date: ".(string)$basic->checkDate($check_date)."<br>";
$check_datetime = '2021-05-01 12:13:14';
print "CHECKDATETIME: $check_datetime: ".(string)$basic->checkDateTime($check_datetime)."<br>";
$compare_date = ['2021-05-01', '2021-05-02'];
print "COMPAREDATE: $compare_date[0] = $compare_date[1]: ".(string)$basic->compareDate($compare_date[0], $compare_date[1])."<br>";
$compare_datetime = ['2021-05-01 10:00:00', '2021-05-01 11:00:00'];
print "COMPAREDATE: $compare_datetime[0] = $compare_datetime[1]: ".(string)$basic->compareDateTime($compare_datetime[0], $compare_datetime[1])."<br>";
$compare_date = ['2021-05-01', '2021-05-10'];
print "CALCDAYSINTERVAL(named): $compare_date[0] = $compare_date[1]: ".DgS::printAr($basic->calcDaysInterval($compare_date[0], $compare_date[1], true))."<br>"; */
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

209
www/admin/class_test.db.php Normal file
View File

@@ -0,0 +1,209 @@
<?php declare(strict_types=1);
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
$DEBUG_ALL_OVERRIDE = false; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = true;
$PRINT_ALL = true;
$DB_DEBUG = true;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', true);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-db';
ob_end_flush();
use CoreLibs\Debug\Support as DgS;
$basic = new CoreLibs\Admin\Backend(DB_CONFIG);
print "<html><head><title>TEST CLASS: DB</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
print "DBINFO: ".$basic->dbInfo()."<br>";
echo "DB_CONFIG_SET constant: <pre>".print_r(DB_CONFIG, true)."</pre><br>";
// DB client encoding
print "DB Client encoding: ".$basic->dbGetEncoding()."<br>";
while ($res = $basic->dbReturn("SELECT * FROM max_test", 0, true)) {
print "TIME: ".$res['time']."<br>";
}
print "CACHED DATA: <pre>".print_r($basic->cursor_ext, true)."</pre><br>";
while ($res = $basic->dbReturn("SELECT * FROM max_test")) {
print "[CACHED] TIME: ".$res['time']."<br>";
}
print "<pre>";
$status = $basic->dbExec("INSERT INTO foo (test) VALUES ('FOO TEST ".time()."') RETURNING test");
print "DIRECT INSERT STATUS: $status | "
."PRIMARY KEY: ".$basic->dbGetInsertPK()." | "
."RETURNING EXT: ".print_r($basic->dbGetReturningExt(), true)." | "
."RETURNING ARRAY: ".print_r($basic->dbGetReturningArray(), true)."<br>";
// should throw deprecated error
// $basic->getReturningExt();
print "DIRECT INSERT PREVIOUS INSERTED: ".print_r($basic->dbReturnRow("SELECT foo_id, test FROM foo WHERE foo_id = ".$basic->dbGetInsertPK()), true)."<br>";
$basic->dbPrepare("ins_foo", "INSERT INTO foo (test) VALUES ($1)");
$status = $basic->dbExecute("ins_foo", array('BAR TEST '.time()));
print "PREPARE INSERT STATUS: $status | "
."PRIMARY KEY: ".$basic->dbGetInsertPK()." | "
."RETURNING EXT: ".print_r($basic->dbGetReturningExt(), true)." | "
."RETURNING RETURN: ".print_r($basic->dbGetReturningArray(), true)."<br>";
print "PREPARE INSERT PREVIOUS INSERTED: ".print_r($basic->dbReturnRow("SELECT foo_id, test FROM foo WHERE foo_id = ".$basic->dbGetInsertPK()), true)."<br>";
// returning test with multiple entries
// $status = $basic->db_exec("INSERT INTO foo (test) values ('BAR 1 ".time()."'), ('BAR 2 ".time()."'), ('BAR 3 ".time()."') RETURNING foo_id");
$status = $basic->dbExec("INSERT INTO foo (test) values ('BAR 1 ".time()."'), ('BAR 2 ".time()."'), ('BAR 3 ".time()."') RETURNING foo_id, test");
print "DIRECT MULTIPLE INSERT STATUS: $status | "
."PRIMARY KEYS: ".print_r($basic->dbGetInsertPK(), true)." | "
."RETURNING EXT: ".print_r($basic->dbGetReturningExt(), true)." | "
."RETURNING ARRAY: ".print_r($basic->dbGetReturningArray(), true)."<br>";
// no returning, but not needed ;
$status = $basic->dbExec("INSERT INTO foo (test) VALUES ('FOO; TEST ".time()."');");
print "DIRECT INSERT STATUS: $status | "
."PRIMARY KEY: ".$basic->dbGetInsertPK()." | "
."RETURNING EXT: ".print_r($basic->dbGetReturningExt(), true)." | "
."RETURNING ARRAY: ".print_r($basic->dbGetReturningArray(), true)."<br>";
// UPDATE WITH RETURNING
$status = $basic->dbExec("UPDATE foo SET test = 'SOMETHING DIFFERENT' WHERE foo_id = 3688452 RETURNING test");
print "UPDATE STATUS: $status | "
."RETURNING EXT: ".print_r($basic->dbGetReturningExt(), true)." | "
."RETURNING ARRAY: ".print_r($basic->dbGetReturningArray(), true)."<br>";
print "</pre>";
// REEAD PREPARE
if ($basic->dbPrepare('sel_foo', "SELECT foo_id, test, some_bool, string_a, number_a, number_a_numeric, some_time FROM foo ORDER BY foo_id DESC LIMIT 5") === false) {
print "Error in sel_foo prepare<br>";
} else {
$max_rows = 6;
// do not run this in dbFetchArray directly as
// dbFetchArray(dbExecute(...))
// this will end in an endless loop
$cursor = $basic->dbExecute('sel_foo', []);
$i = 1;
while (($res = $basic->dbFetchArray($cursor, true)) !== false) {
print "DB PREP EXEC FETCH ARR: ".$i.": <pre>".print_r($res, true)."</pre><br>";
$i ++;
}
}
# db write class test
$table = 'foo';
print "TABLE META DATA: ".DgS::printAr($basic->dbShowTableMetaData($table))."<br>";
$primary_key = ''; # unset
$db_write_table = array('test', 'string_a', 'number_a', 'some_bool');
// $db_write_table = array('test');
$object_fields_not_touch = array();
$object_fields_not_update = array();
$data = array('test' => 'BOOL TEST SOMETHING '.time(), 'string_a' => 'SOME TEXT', 'number_a' => 5);
$primary_key = $basic->dbWriteDataExt($db_write_table, $primary_key, $table, $object_fields_not_touch, $object_fields_not_update, $data);
print "Wrote to DB tabel $table and got primary key $primary_key<br>";
$data = array('test' => 'BOOL TEST ON '.time(), 'string_a' => '', 'number_a' => 0, 'some_bool' => 1);
$primary_key = $basic->dbWriteDataExt($db_write_table, $primary_key, $table, $object_fields_not_touch, $object_fields_not_update, $data);
print "Wrote to DB tabel $table and got primary key $primary_key<br>";
$data = array('test' => 'BOOL TEST OFF '.time(), 'string_a' => null, 'number_a' => null, 'some_bool' => 0);
$primary_key = $basic->dbWriteDataExt($db_write_table, $primary_key, $table, $object_fields_not_touch, $object_fields_not_update, $data);
print "Wrote to DB tabel $table and got primary key $primary_key<br>";
$data = array('test' => 'BOOL TEST UNSET '.time());
$primary_key = $basic->dbWriteDataExt($db_write_table, $primary_key, $table, $object_fields_not_touch, $object_fields_not_update, $data);
print "Wrote to DB tabel $table and got primary key $primary_key<br>";
// return Array Test
$query = "SELECT type, sdate, integer FROM foobar";
$data = $basic->dbReturnArray($query, true);
print "Full foobar list: <br><pre>".print_r($data, true)."</pre><br>";
# async test queries
/* $basic->dbExecAsync("SELECT test FROM foo, (SELECT pg_sleep(10)) as sub WHERE foo_id IN (27, 50, 67, 44, 10)");
echo "WAITING FOR ASYNC: ";
$chars = array('|', '/', '-', '\\');
while (($ret = $basic->dbCheckAsync()) === true)
{
if ((list($_, $char) = each($chars)) === FALSE)
{
reset($chars);
list($_, $char) = each($chars);
}
print $char;
sleep(1);
flush();
}
print "<br>END STATUS: ".$ret."<br>";
// while ($res = $basic->dbFetchArray($ret))
while ($res = $basic->dbFetchArray())
{
echo "RES: ".$res['test']."<br>";
}
# test async insert
$basic->dbExecAsync("INSERT INTO foo (Test) VALUES ('ASYNC TEST ".time()."')");
echo "WAITING FOR ASYNC INSERT: ";
while (($ret = $basic->dbCheckAsync()) === true)
{
print ".";
sleep(1);
flush();
}
print "<br>END STATUS: ".$ret." | PK: ".$basic->insert_id."<br>";
print "ASYNC PREVIOUS INSERTED: ".print_r($basic->dbReturnRow("SELECT foo_id, test FROM foo WHERE foo_id = ".$basic->insert_id), true)."<br>"; */
$to_db_version = '9.1.9';
print "VERSION DB: ".$basic->dbVersion()."<br>";
print "DB Version smaller $to_db_version: ".$basic->dbCompareVersion('<'.$to_db_version)."<br>";
print "DB Version smaller than $to_db_version: ".$basic->dbCompareVersion('<='.$to_db_version)."<br>";
print "DB Version equal $to_db_version: ".$basic->dbCompareVersion('='.$to_db_version)."<br>";
print "DB Version bigger than $to_db_version: ".$basic->dbCompareVersion('>='.$to_db_version)."<br>";
print "DB Version bigger $to_db_version: ".$basic->dbCompareVersion('>'.$to_db_version)."<br>";
/* $q = "SELECT FOO FRO BAR";
// $q = "Select * from foo";
$foo = $basic->dbExecAsync($q);
print "[ERR] Query: ".$q."<br>";
print "[ERR] RESOURCE: $foo<br>";
while (($ret = $basic->dbCheckAsync()) === true)
{
print "[ERR]: $ret<br>";
sleep(5);
} */
// search path check
$q = "SHOW search_path";
$cursor = $basic->dbExec($q);
$data = $basic->dbFetchArray($cursor)['search_path'];
print "RETURN DATA FOR search_path: ".$data."<br>";
// print "RETURN DATA FOR search_path: ".DgS::printAr($data)."<br>";
// insert something into test.schema_test and see if we get the PK back
$status = $basic->dbExec("INSERT INTO test.schema_test (contents, id) VALUES ('TIME: ".time()."', ".rand(1, 10).")");
print "OTHER SCHEMA INSERT STATUS: ".$status." | PK NAME: ".$basic->pk_name.", PRIMARY KEY: ".$basic->insert_id."<br>";
print "<b>NULL TEST DB READ</b><br>";
$q = "SELECT uid, null_varchar, null_int FROM test_null_data WHERE uid = 'A'";
$res = $basic->dbReturnRow($q);
var_dump($res);
print "RES: ".DgS::printAr($res)."<br>";
print "ISSET: ".isset($res['null_varchar'])."<br>";
print "EMPTY: ".empty($res['null_varchar'])."<br>";
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,138 @@
<?php // phpcs:ignore warning
declare(strict_types=1);
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
// all the settings are overruled by config
$DEBUG_ALL_OVERRIDE = true; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = true;
$PRINT_ALL = false;
$ECHO_ALL = true;
$DB_DEBUG = true;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-debug';
ob_end_flush();
// override ECHO ALL FALSE
$ECHO_ALL = true;
use CoreLibs\Debug\Support as DebugSupport;
use CoreLibs\Debug\FileWriter;
$basic = new CoreLibs\Basic();
$debug = new CoreLibs\Debug\Logging();
$debug_support_class = 'CoreLibs\Debug\Support';
$debug_logging_class = 'CoreLibs\Debug\Logging';
print "<html><head><title>TEST CLASS: DEBUG</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
function test()
{
return DebugSupport::getCallerMethod(1);
}
print "S::GETCALLERMETHOD: ".DebugSupport::getCallerMethod(0)."<br>";
print "S::GETCALLERMETHOD: ".test()."<br>";
print "S::PRINTAR: ".DebugSupport::printAr(['Foo', 'Bar'])."<br>";
print "V-S::PRINTAR: ".$debug_support_class::printAr(['Foo', 'Bar'])."<br>";
// debug
print "C->DEBUG: ".$debug->debug('CLASS-TEST-DEBUG', 'Class Test Debug')."<br>";
print "C->DEBUG(html): ".$debug->debug('CLASS-TEST-DEBUG', 'HTML TAG<br><b>BOLD</b>')."<br>";
print "C->DEBUG(html,strip): ".$debug->debug('CLASS-TEST-DEBUG', 'HTML TAG<br><b>BOLD</b>', true)."<br>";
print "C->PRINTERRORMSG: <br>".$debug->printErrorMsg()."<br>";
echo "<b>CLASS DEBUG CALL</b><br>";
// @codingStandardsIgnoreLine
class TestL
{
public $log;
public function __construct()
{
$this->log = new CoreLibs\Debug\Logging();
}
public function test(string $ts = null)
{
print "* GETCALLERCLASS(INSIDE CLASS): ".\CoreLibs\Debug\Support::getCallerClass()."<br>";
$this->log->debug('TESTL', 'Logging in class testL'.($ts !== null ? ': '.$ts : ''));
$this->log->debug('TESTL', 'Some other message');
return true;
}
}
// @codingStandardsIgnoreLine
class TestR extends TestL
{
public $foo;
public function __construct()
{
parent::__construct();
}
public function subTest()
{
print "** GETCALLERCLASS(INSIDE EXTND CLASS): ".\CoreLibs\Debug\Support::getCallerClass()."<br>";
$this->log->debug('TESTR', 'Logging in class testR (extends testL)');
$this->test('TESTR INSIDE');
$this->log->debug('TESTR', 'Array: '.$this->log->prAr(['a', 'b']).', Other: '.$this->log->prAr(['a', 'b']));
return true;
}
}
$tl = new TestL();
print "CLASS: LOG ECHO: ".(string)$tl->log->getLogLevelAll('echo')."<br>";
print "CLASS: DEBUG: ".$tl->test()."<br>";
print "CLASS: PRINTERRORMSG: <br>".$tl->log->printErrorMsg()."<br>";
$tr = new TestR();
print "CLASS: LOG ECHO: ".(string)$tr->log->getLogLevelAll('echo')."<br>";
print "CLASS EXTEND: DEBUG/tl: ".$tr->test('TESTR OUTSIDE')."<br>";
print "CLASS EXTEND: DEBUG/tr: ".$tr->subTest()."<br>";
print "CLASS EXTEND: PRINTERRORMSG: <br>".$tr->log->printErrorMsg()."<br>";
// test attaching a logger from outside
// @codingStandardsIgnoreLine
class AttachOutside
{
public $log;
public function __construct(object $logger_class)
{
$this->log = $logger_class;
}
public function test()
{
$this->log->debug('ATTACHOUTSIDE', 'A test');
return get_class($this);
}
}
$ao = new AttachOutside($basic->log);
print "AO-CLASS: DEBUG: ".$ao->test()."<br>";
print "GETCALLERCLASS(NON CLASS): ".\CoreLibs\Debug\Support::getCallerClass()."<br>";
// fdebug
print "S::FSETFILENAME: ".FileWriter::fsetFilename('class_test_debug_file.log')."<br>";
print "S::FDEBUG: ".FileWriter::fdebug('CLASS TEST DEBUG FILE: '.date('Y-m-d H:i:s'))."<br>";
// error message
// future DEPRECATED
// $basic->debug('BASIC CLASS', 'Debug test');
$basic->log->debug('BASIC CLASS', 'Debug test');
print "BASIC PRINTERRORMSG:<br>".$basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,64 @@
<?php declare(strict_types=1);
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-email';
ob_end_flush();
use CoreLibs\Check\Email;
use CoreLibs\Debug\Support as DgS;
$basic = new CoreLibs\Basic();
print "<html><head><title>TEST CLASS: HTML/ELEMENTS</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
// regex get
print "S::GETEMAILREGEX(0): ".Email::getEmailRegex(0)."<br>";
print "S::GETEMAILREGEX(2): ".Email::getEmailRegex(2)."<br>";
print "S::GETEMAILREGEX(7): ".Email::getEmailRegex(7)."<br>";
print "S::GETEMAILREGEX(8 invalid): ".Email::getEmailRegex(8)."<br>";
print "S::GETEMAILREGEXCHECK: ".DgS::printAr(Email::getEmailRegexCheck())."<br>";
$email = [
'foo@bar.org',
'foo@i.softbank.ne.jp'
];
foreach ($email as $s_email) {
print "S::EMAIL: $s_email: ".Email::getEmailType($s_email)."<br>";
print "S::EMAIL SHORT: $s_email: ".Email::getEmailType($s_email, true)."<br>";
}
// DEPRECATED
/* foreach ($email as $s_email) {
print "D/S-EMAIL: $s_email: ".$basic->getEmailType($s_email)."<br>";
print "D/S-EMAIL SHORT: $s_email: ".$basic->getEmailType($s_email, true)."<br>";
} */
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,94 @@
<?php declare(strict_types=1);
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-encoding';
ob_end_flush();
use CoreLibs\Language\Encoding;
$basic = new CoreLibs\Basic();
$_encoding = new CoreLibs\Language\Encoding();
$encoding_class = 'CoreLibs\Language\Encoding';
print "<html><head><title>TEST CLASS: ENCODING</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
// print "Valid encoding: ".$basic->printAr(mb_list_encodings())."<br>";
$mime_encodes = [
['Simple string UTF8', 'UTF-8'],
['Simple string ISO-2022-JP-MS', 'ISO-2022-JP-MS'],
['日本語ながい', 'UTF-8'],
['日本語ながい', 'ISO-2022-JP-MS'],
['日本語ながい日本語ながい日本語ながい日本語ながい日本語ながい日本語ながい日本語ながい', 'ISO-2022-JP-MS'],
];
foreach ($mime_encodes as $mime_encode) {
print "__MBMIMEENCODE: $mime_encode[0]: ".Encoding::__mbMimeEncode($mime_encode[0], $mime_encode[1])."<br>";
}
$enc_strings = [
'Normal Text',
'日本語',
// unworkable
''
];
// class
$_encoding->setErrorChar('∴');
foreach ($enc_strings as $_string) {
$string = $_encoding->checkConvertEncoding($_string, 'UTF-8', 'ISO-2022-JP-MS');
print "ENC CHECK: $_string: ".($string === false ? '-OK-' : $string)."<br>";
print "CONV ENCODING: $_string: ".$_encoding->convertEncoding($_string, 'ISO-2022-JP')."<br>";
print "CONV ENCODING (s): $_string: ".$_encoding->convertEncoding($_string, 'ISO-2022-JP', 'UTF-8')."<br>";
print "CONV ENCODING (s,a-false): $_string: ".$_encoding->convertEncoding($_string, 'ISO-2022-JP', 'UTF-8', false)."<br>";
}
print "ERROR CHAR: ".$_encoding->getErrorChar()."<br>";
// static
$encoding_class::setErrorChar('∴');
foreach ($enc_strings as $_string) {
$string = $encoding_class::checkConvertEncoding($_string, 'UTF-8', 'ISO-2022-JP-MS');
print "S::ENC CHECK: $_string: ".($string === false ? '-OK-' : $string)."<br>";
print "S::CONV ENCODING: $_string: ".$encoding_class::convertEncoding($_string, 'ISO-2022-JP')."<br>";
print "S::CONV ENCODING (s): $_string: ".$encoding_class::convertEncoding($_string, 'ISO-2022-JP', 'UTF-8')."<br>";
print "S::CONV ENCODING (s,a-false): $_string: ".$encoding_class::convertEncoding($_string, 'ISO-2022-JP', 'UTF-8', false)."<br>";
}
print "S::ERROR CHAR: ".$encoding_class::getErrorChar()."<br>";
// static use
$_string = $enc_strings[1];
$string = Encoding::checkConvertEncoding($_string, 'UTF-8', 'ISO-2022-JP-MS');
print "S::ENC CHECK: $_string: ".($string === false ? '-OK-' : $string)."<br>";
// DEPRECATED
/* $string = $basic->checkConvertEncoding($_string, 'UTF-8', 'ISO-2022-JP-MS');
print "ENC CHECK: $_string: ".($string === false ? '-OK-' : $string)."<br>";
print "CONV ENCODING: $_string: ".$basic->convertEncoding($_string, 'ISO-2022-JP')."<br>";
print "D/__MBMIMEENCODE: ".$basic->__mbMimeEncode('Some Text', 'UTF-8')."<br>"; */
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,47 @@
<?php declare(strict_types=1);
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-datetime';
ob_end_flush();
use CoreLibs\Check\File;
$basic = new CoreLibs\Basic();
print "<html><head><title>TEST CLASS: FILE</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
$file = '/some/path/to/some/file.txt';
print "GETFILENAMEENDING: $file: ".File::getFilenameEnding($file)."<br>";
$file = getcwd().DIRECTORY_SEPARATOR.'class_test.file.php';
print "GETLINESFROMFILE: $file: ".File::getLinesFromFile($file)."<br>";
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,62 @@
<?php declare(strict_types=1);
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-hash';
ob_end_flush();
use CoreLibs\Create\Hash;
$basic = new CoreLibs\Basic();
$hash_class = 'CoreLibs\Create\Hash';
// define a list of from to color sets for conversion test
print "<html><head><title>TEST CLASS: HASH</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
$to_crc = 'Some text block';
// static
print "S::__CRC32B: $to_crc: ".$hash_class::__crc32b($to_crc)."<br>";
print "S::__SHA1SHORT(off): $to_crc: ".$hash_class::__sha1short($to_crc)."<br>";
print "S::__SHA1SHORT(on): $to_crc: ".$hash_class::__sha1short($to_crc, true)."<br>";
print "S::__hash(d): $to_crc: ".$hash_class::__hash($to_crc)."<br>";
foreach (['adler32', 'fnv132', 'fnv1a32', 'joaat'] as $__hash_c) {
print "S::__hash($__hash_c): $to_crc: ".$hash_class::__hash($to_crc, $__hash_c)."<br>";
}
// static use
print "U-S::__CRC32B: $to_crc: ".Hash::__crc32b($to_crc)."<br>";
// DEPRECATED
/* print "D/__CRC32B: $to_crc: ".$basic->__crc32b($to_crc)."<br>";
print "D/__SHA1SHORT(off): $to_crc: ".$basic->__sha1short($to_crc)."<br>";
print "D/__hash(d): $to_crc: ".$basic->__hash($to_crc)."<br>"; */
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,102 @@
<?php declare(strict_types=1);
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-html';
ob_end_flush();
use CoreLibs\Convert\Html;
use CoreLibs\Output\Form\Elements;
$basic = new CoreLibs\Basic();
$_html = new CoreLibs\Convert\Html();
$_elements = new CoreLibs\Output\Form\Elements();
$html_class = 'CoreLibs\Convert\Html';
$elements_class = 'CoreLibs\Output\Form\Elements';
// define a list of from to color sets for conversion test
print "<html><head><title>TEST CLASS: HTML/ELEMENTS</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
$string = "Something < = > Other <br> Next line";
print "HTMLENT: ".Html::htmlent($string).": ".$_html->htmlent($string)."<br>";
print "REMOVELB: ".Html::htmlent($string).": ".$_html->removeLB($string)."<br>";
$date_str = [2021, 5, 1, 11, 10];
print "PRINTDATETIME: ".$_elements->printDateTime($date_str[0], $date_str[1], $date_str[2], $date_str[3], $date_str[4])."<br>";
// STATIC
$string = "Something < = > Other <br> Next line";
print "S::HTMLENT: ".Html::htmlent($string).": ".$html_class::htmlent($string)."<br>";
print "S::REMOVELB: ".Html::htmlent($string).": ".$html_class::removeLB($string)."<br>";
$date_str = [2021, 5, 1, 11, 10];
print "S::PRINTDATETIME: ".$elements_class::printDateTime($date_str[0], $date_str[1], $date_str[2], $date_str[3], $date_str[4])."<br>";
// STATIC use
echo "U-S::HTML ENT INT: ".Html::htmlent(5)."<br>";
echo "U-S::HTML ENT STRING: ".Html::htmlent('5<<>')."<br>";
echo "U-S::HTML ENT NULL: ".Html::htmlent(null)."<br>";
// check convert
$checked_list = [
['foo', 'foo'],
['foo', 'bar'],
['foo', ['foo', 'bar']],
['foo', ['bar']],
];
foreach ($checked_list as $check) {
print "CHECKED(0): $check[0]: ".Html::checked($check[1], $check[0])."<br>";
print "CHECKED(1): $check[0]: ".Html::checked($check[1], $check[0], 1)."<br>";
}
// magic link creation test
$magic_links = [
'mailto:user@bubu.at',
'user@bubu.at',
'user@bubu.at|Send me email|',
'http://www.somelink.com/?with=1234',
'http://www.somelink.com/?with=1234|Some Title|',
'http://www.somelink.com/?with=1234 <br>Some Title',
];
foreach ($magic_links as $magic_link) {
print "MAGICLINK: ".Html::htmlent($magic_link).": ".Html::htmlent(Elements::magicLinks($magic_link))."<br>";
}
// DEPREACTED
/* $string = "Deprecated Something < = > Other <br> Deprecated Next line";
print "D/HTMLENT: $string: ".$basic->htmlent($string)."<br>";
print "D/REMOVELB: $string: ".$basic->removeLB($string)."<br>";
$date_str = [2021, 5, 1, 11, 10];
print "D/PRINTDATETIME: ".$basic->printDateTime($date_str[0], $date_str[1], $date_str[2], $date_str[3], $date_str[4])."<br>";
$magic_link = 'http://www.somelink.com/?with=1234|Some Title|';
print "D/MAGICLINK: ".Html::htmlent($basic->magicLinks($magic_link))."<Br>";
*/
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,106 @@
<?php declare(strict_types=1);
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-image';
ob_end_flush();
use CoreLibs\Output\Image;
$basic = new CoreLibs\Basic();
$_image = new CoreLibs\Output\Image();
$image_class = 'CoreLibs\Output\Image';
// define a list of from to color sets for conversion test
print "<html><head><title>TEST CLASS: IMAGE</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
// thumb sizes
$thumb_width = 250;
$thumb_height = 300;
// class
$image = BASE.LAYOUT.CONTENT_PATH.IMAGES.'no_picture_square.jpg';
// rotate image first
$_image->correctImageOrientation($image);
// thumbnail tests
echo "<div>CLASS->CREATETHUMBNAILSIMPLE: ".basename($image).": WIDTH: $thumb_width<br><img src=".$_image->createThumbnailSimple($image, $thumb_width)."></div>";
// static
$image = BASE.LAYOUT.CONTENT_PATH.IMAGES.'no_picture.jpg';
// rotate image first
$image_class::correctImageOrientation($image);
// thumbnail tests
echo "<div>S::CREATETHUMBNAILSIMPLE: ".basename($image).": WIDTH: $thumb_width<br><img src=".$image_class::createThumbnailSimple($image, $thumb_width)."></div>";
echo "U-STATIC VARIOUS:<br>";
// image thumbnail
$images = array(
// height bigger
// 'no_picture.jpg',
// 'no_picture.png',
// width bigger
// 'no_picture_width_bigger.jpg',
// 'no_picture_width_bigger.png',
// square
// 'no_picture_square.jpg',
// 'no_picture_square.png',
// other sample images
// '5c501af48da6c.jpg',
// Apple HEIC files
// 'img_2145.heic',
// Photoshop
'photoshop_test.psd',
);
// 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><b>IMAGE INFO</b>: ".$height."x".$width.", TYPE: ".$img_type." [".$finfo->file($image)."]</div>";
// rotate image first
Image::correctImageOrientation($image);
// thumbnail tests
echo "<div>".basename($image).": WIDTH: $thumb_width<br><img src=".Image::createThumbnailSimple($image, $thumb_width)."></div>";
echo "<div>".basename($image).": HEIGHT: $thumb_height<br><img src=".Image::createThumbnailSimple($image, 0, $thumb_height)."></div>";
echo "<div>".basename($image).": WIDTH/HEIGHT: $thumb_width x $thumb_height<br><img src=".Image::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=".Image::createThumbnailSimple($image, $thumb_width, $thumb_height, null, true, false)."></div>";
echo "<hr>";
}
// DEPRECATED
// static
/* $image = BASE.LAYOUT.CONTENT_PATH.IMAGES.'no_picture.jpg';
// rotate image first
$basic->correctImageOrientation($image);
// thumbnail tests
echo "<div>S::CREATETHUMBNAILSIMPLE: ".basename($image).": WIDTH: $thumb_width<br><img src=".$basic->createThumbnailSimple($image, $thumb_width)."></div>"; */
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,73 @@
<?php declare(strict_types=1);
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-json';
ob_end_flush();
use CoreLibs\Check\Jason;
use CoreLibs\Debug\Support as DgS;
$basic = new CoreLibs\Basic();
$json_class = 'CoreLibs\Check\Jason';
// define a list of from to color sets for conversion test
print "<html><head><title>TEST CLASS: JSON</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
$json = '{"foo": "bar"}';
$output = Jason::jsonConvertToArray($json);
print "S::JSON: $json: ".DgS::printAr($output)."<br>";
print "S::JSON ERROR: ".Jason::jsonGetLastError().": ".Jason::jsonGetLastError(true)."<br>";
$json = '["f: {b"""ar}]';
$output = Jason::jsonConvertToArray($json);
print "S::E-JSON: $json: ".DgS::printAr($output)."<br>";
print "S::E-JSON ERROR: ".Jason::jsonGetLastError().": ".Jason::jsonGetLastError(true)."<br>";
// direct
$json = '{"direct": "static function call"}';
$output = $json_class::jsonConvertToArray($json);
print "J/S::JSON: $json: ".DgS::printAr($output)."<br>";
print "J/S::JSON ERROR: ".$json_class::jsonGetLastError().": ".$json_class::jsonGetLastError(true)."<br>";
$json = '["f: {b"""ar}]';
$output = $json_class::jsonConvertToArray($json);
print "J/S::E-JSON: $json: ".DgS::printAr($output)."<br>";
print "J/S::E-JSON ERROR: ".$json_class::jsonGetLastError().": ".$json_class::jsonGetLastError(true)."<br>";
// DEPRECATE TEST
/* $json = '["f: {b"""ar}]';
$output = $basic->jsonConvertToArray($json);
print "E-JSON: $json: ".DgS::printAr($output)."<br>";
print "E-JSON ERROR: ".$basic->jsonGetLastError().": ".$basic->jsonGetLastError(true)."<br>"; */
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,57 @@
<?php declare(strict_types=1);
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-math';
ob_end_flush();
$basic = new CoreLibs\Basic();
$_math = new CoreLibs\Convert\Math();
$math_class = 'CoreLibs\Convert\Math';
// define a list of from to color sets for conversion test
print "<html><head><title>TEST CLASS: MATH</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
print "FCEIL: ".$_math->fceil(5.1234567890, 5)."<br>";
print "FLOORP: ".$_math->floorp(5123456, -3)."<br>";
print "INITNUMERIC: ".$_math->initNumeric('123')."<br>";
print "S-FCEIL: ".$math_class::fceil(5.1234567890, 5)."<br>";
print "S-FLOORP: ".$math_class::floorp(5123456, -3)."<br>";
print "S-INITNUMERIC: ".$math_class::initNumeric('123')."<br>";
// DEPRECATED
/* print "FCEIL: ".$basic->fceil(5.1234567890, 5)."<br>";
print "FLOORP: ".$basic->floorp(5123456, -3)."<br>";
print "INITNUMERIC: ".$basic->initNumeric('123')."<br>"; */
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,65 @@
<?php declare(strict_types=1);
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-mime';
ob_end_flush();
$basic = new CoreLibs\Basic();
$_mime = new CoreLibs\Convert\MimeAppName();
print "<html><head><title>TEST CLASS: MIME</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
$mime = 'application/illustrator';
print "MIME $mime: ".$_mime->mimeGetAppName($mime)."<br>";
$mime = 'fake/mime';
$_mime->mimeSetAppName($mime, 'This is a fake mime');
print "MIME $mime: ".$_mime->mimeGetAppName($mime)."<br>";
// mime test
$mime = 'application/vnd.ms-excel';
print "App for mime $mime: ".$_mime->mimeGetAppName($mime)."<br>";
$_mime->mimeSetAppName($mime, 'Microsoft (better) Excel');
print "App for mime changed $mime: ".$_mime->mimeGetAppName($mime)."<br>";
// static call test
$mime = 'application/x-indesign';
print "S::App for mime $mime: ".\CoreLibs\Convert\MimeAppName::mimeGetAppName($mime)."<br>";
$mime = 'application/vnd.ms-excel';
print "S::App for mime $mime: ".\CoreLibs\Convert\MimeAppName::mimeGetAppName($mime)."<br>";
// DEPRECATED
/* $mime = 'application/illustrator';
print "MIME $mime: ".$basic->mimeGetAppName($mime)."<br>";
$mime = 'fake/mime';
$basic->mimeSetAppName($mime, 'This is a fake mime');
print "MIME $mime: ".$basic->mimeGetAppName($mime)."<br>"; */
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,67 @@
<?php declare(strict_types=1);
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-pass';
ob_end_flush();
use CoreLibs\Check\Password as PwdChk;
$basic = new CoreLibs\Basic();
$_password = new CoreLibs\Check\Password();
$password_class = 'CoreLibs\Check\Password';
// define a list of from to color sets for conversion test
print "<html><head><title>TEST CLASS: PASSWORD</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
$password = 'something1234';
$enc_password = $_password->passwordSet($password);
print "PASSWORD: $password: ".$enc_password."<br>";
print "PASSWORD VERIFY: ".(string)$_password->passwordVerify($password, $enc_password)."<br>";
print "PASSWORD REHASH: ".(string)$_password->passwordRehashCheck($enc_password)."<br>";
// static verify
$password = 'othername7890';
$enc_password = $password_class::passwordSet($password);
print "PASSWORD: $password: ".$enc_password."<br>";
print "S-PASSWORD VERIFY: ".(string)$password_class::passwordVerify($password, $enc_password)."<br>";
print "PASSWORD REHASH: ".(string)$password_class::passwordRehashCheck($enc_password)."<br>";
// direct static
print "S::PASSWORD VERFIY: ".(string)PwdChk::passwordVerify($password, $enc_password)."<br>";
// DEPRECATED
/* $password = 'deprecated4567';
$enc_password = $basic->passwordSet($password);
print "PASSWORD: $password: ".$enc_password."<br>";
print "PASSWORD VERIFY: ".(string)$basic->passwordVerify($password, $enc_password)."<br>";
print "PASSWORD REHASH: ".(string)$basic->passwordRehashCheck($enc_password)."<br>"; */
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -3,10 +3,10 @@
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
$DEBUG_ALL_OVERRIDE = false; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = true;
$PRINT_ALL = true;
$DB_DEBUG = true;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
@@ -31,21 +31,31 @@ $basic = new CoreLibs\Admin\Backend(DB_CONFIG);
$basic->dbInfo(true);
ob_end_flush();
echo "DB_CONFIG_SET constant: <pre>".print_r(DB_CONFIG, true)."</pre><br>";
print "<html><head><title>TEST CLASS</title><head>";
print "<body>";
$basic->hrRunningTime();
$basic->runningTime();
echo "RANDOM KEY [50]: ".$basic->randomKeyGen(50)."<br>";
echo "TIMED [hr]: ".$basic->hrRunningTime()."<br>";
echo "TIMED [def]: ".$basic->runningTime()."<br>";
echo "TIMED [string]: ".$basic->runningtime_string."<br>";
$basic->hrRunningTime();
echo "RANDOM KEY [default]: ".$basic->randomKeyGen()."<br>";
echo "TIMED [hr]: ".$basic->hrRunningTime()."<br>";
// color
print "COLOR: -1, -1, -1: ".$basic->rgb2hex(-1, -1, -1)."<br>";
print "COLOR: 10, 20, 30: ".$basic->rgb2hex(10, 20, 30)."<br>";
print '<div><a href="class_test.db.php">Class Test: DB</a></div>';
print '<div><a href="class_test.colors.php">Class Test: Colors</a></div>';
print '<div><a href="class_test.mime.php">Class Test: MIME</a></div>';
print '<div><a href="class_test.json.php">Class Test: Json</a></div>';
print '<div><a href="class_test.token.php">Class Test: Form Token</a></div>';
print '<div><a href="class_test.password.php">Class Test: Password</a></div>';
print '<div><a href="class_test.math.php">Class Test: Math</a></div>';
print '<div><a href="class_test.html.php">Class Test: HTML/ELEMENTS</a></div>';
print '<div><a href="class_test.email.php">Class Test: EMAIL</a></div>';
print '<div><a href="class_test.uids.php">Class Test: UIDS</a></div>';
print '<div><a href="class_test.phpv.php">Class Test: PHP VERSION</a></div>';
print '<div><a href="class_test.hash.php">Class Test: HASH</a></div>';
print '<div><a href="class_test.encoding.php">Class Test: ENCODING</a></div>';
print '<div><a href="class_test.image.php">Class Test: IMAGE</a></div>';
print '<div><a href="class_test.byte.php">Class Test: BYTE CONVERT</a></div>';
print '<div><a href="class_test.datetime.php">Class Test: DATE/TIME</a></div>';
print '<div><a href="class_test.array.php">Class Test: ARRAY HANDLER</a></div>';
print '<div><a href="class_test.file.php">Class Test: FILE</a></div>';
print '<div><a href="class_test.randomkey.php">Class Test: RANDOM KEY</a></div>';
print '<div><a href="class_test.system.php">Class Test: SYSTEM</a></div>';
print '<div><a href="class_test.runningtime.php">Class Test: RUNNING TIME</a></div>';
print '<div><a href="class_test.debug.php">Class Test: DEBUG</a></div>';
// set + check edit access id
$edit_access_id = 3;
@@ -61,33 +71,31 @@ if (is_object($login) && isset($login->acl['unit'])) {
print "Something went wrong with the login<br>";
}
// $basic->debug('SESSION', $basic->print_ar($_SESSION));
// $basic->log->debug('SESSION', \CoreLibs\Debug\Support::printAr($_SESSION));
print "<html><head><title>TEST CLASS</title><head>";
print "<body>";
print '<form method="post" name="loginlogout">';
print '<a href="javascript:document.loginlogout.login_logout.value=\'Logou\';document.loginlogout.submit();">Logout</a>';
print '<input type="hidden" name="login_logout" value="">';
print '</form>';
// print the debug core vars
print "DEBUG OUT: ".$basic->debug_output."<br>";
print "ECHO OUT: ".$basic->echo_output."<br>";
print "PRINT OUT: ".$basic->print_output."<br>";
print "NOT DEBUG OUT: ".$basic->debug_output_not."<br>";
print "NOT ECHO OUT: ".$basic->echo_output_not."<br>";
print "NOT PRINT OUT: ".$basic->print_output_not."<br>";
print "DEBUG OUT ALL: ".$basic->debug_output_all."<br>";
print "ECHO OUT ALL: ".$basic->echo_output_all."<br>";
print "PRINT OUT ALL: ".$basic->print_output_all."<br>";
foreach (['on', 'off'] as $flag) {
foreach (['debug', 'echo', 'print'] as $type) {
$prefix = $flag == 'off' ? 'NOT ' : '';
print $prefix.strtoupper($type).' OUT: '.\CoreLibs\Debug\Support::printAr($basic->log->getLogLevel($type, $flag)).'<br>';
}
}
foreach (['debug', 'echo', 'print'] as $type) {
print strtoupper($type).' OUT ALL: '.$basic->log->getLogLevelAll($type).'<br>';
}
print "CALLER BACKTRACE: ".$basic->getCallerMethod()."<br>";
$basic->debug('SOME MARK', 'Some error output');
$basic->log->debug('SOME MARK', 'Some error output');
// INTERNAL SET
print "EDIT ACCESS ID: ".$basic->edit_access_id."<br>";
if (is_object($login)) {
// print "ACL: <br>".$basic->print_ar($login->acl)."<br>";
$basic->debug('ACL', "ACL: ".$basic->printAr($login->acl));
$basic->log->debug('ACL', "ACL: ".\CoreLibs\Debug\Support::printAr($login->acl));
// print "DEFAULT ACL: <br>".$basic->print_ar($login->default_acl_list)."<br>";
// print "DEFAULT ACL: <br>".$basic->print_ar($login->default_acl_list)."<br>";
// $result = array_flip(array_filter(array_flip($login->default_acl_list), function ($key) { if (is_numeric($key)) return $key; }));
@@ -96,305 +104,9 @@ if (is_object($login)) {
// $basic->adbSetACL($login->acl);
}
// DB client encoding
print "DB Client encoding: ".$basic->dbGetEncoding()."<br>";
while ($res = $basic->dbReturn("SELECT * FROM max_test", 0, true)) {
print "TIME: ".$res['time']."<br>";
}
print "CACHED DATA: <pre>".print_r($basic->cursor_ext, true)."</pre><br>";
while ($res = $basic->dbReturn("SELECT * FROM max_test")) {
print "[CACHED] TIME: ".$res['time']."<br>";
}
print "<pre>";
$status = $basic->dbExec("INSERT INTO foo (test) VALUES ('FOO TEST ".time()."') RETURNING test");
print "DIRECT INSERT STATUS: $status | "
."PRIMARY KEY: ".$basic->dbGetInsertPK()." | "
."RETURNING EXT: ".print_r($basic->dbGetReturningExt(), true)." | "
."RETURNING ARRAY: ".print_r($basic->dbGetReturningArray(), true)."<br>";
// should throw deprecated error
// $basic->getReturningExt();
print "DIRECT INSERT PREVIOUS INSERTED: ".print_r($basic->dbReturnRow("SELECT foo_id, test FROM foo WHERE foo_id = ".$basic->dbGetInsertPK()), true)."<br>";
$basic->dbPrepare("ins_foo", "INSERT INTO foo (test) VALUES ($1)");
$status = $basic->dbExecute("ins_foo", array('BAR TEST '.time()));
print "PREPARE INSERT STATUS: $status | "
."PRIMARY KEY: ".$basic->dbGetInsertPK()." | "
."RETURNING EXT: ".print_r($basic->dbGetReturningExt(), true)." | "
."RETURNING RETURN: ".print_r($basic->dbGetReturningArray(), true)."<br>";
print "PREPARE INSERT PREVIOUS INSERTED: ".print_r($basic->dbReturnRow("SELECT foo_id, test FROM foo WHERE foo_id = ".$basic->dbGetInsertPK()), true)."<br>";
// returning test with multiple entries
// $status = $basic->db_exec("INSERT INTO foo (test) values ('BAR 1 ".time()."'), ('BAR 2 ".time()."'), ('BAR 3 ".time()."') RETURNING foo_id");
$status = $basic->dbExec("INSERT INTO foo (test) values ('BAR 1 ".time()."'), ('BAR 2 ".time()."'), ('BAR 3 ".time()."') RETURNING foo_id, test");
print "DIRECT MULTIPLE INSERT STATUS: $status | "
."PRIMARY KEYS: ".print_r($basic->dbGetInsertPK(), true)." | "
."RETURNING EXT: ".print_r($basic->dbGetReturningExt(), true)." | "
."RETURNING ARRAY: ".print_r($basic->dbGetReturningArray(), true)."<br>";
// no returning, but not needed ;
$status = $basic->dbExec("INSERT INTO foo (test) VALUES ('FOO; TEST ".time()."');");
print "DIRECT INSERT STATUS: $status | "
."PRIMARY KEY: ".$basic->dbGetInsertPK()." | "
."RETURNING EXT: ".print_r($basic->dbGetReturningExt(), true)." | "
."RETURNING ARRAY: ".print_r($basic->dbGetReturningArray(), true)."<br>";
// UPDATE WITH RETURNING
$status = $basic->dbExec("UPDATE foo SET test = 'SOMETHING DIFFERENT' WHERE foo_id = 3688452 RETURNING test");
print "UPDATE STATUS: $status | "
."RETURNING EXT: ".print_r($basic->dbGetReturningExt(), true)." | "
."RETURNING ARRAY: ".print_r($basic->dbGetReturningArray(), true)."<br>";
print "</pre>";
// REEAD PREPARE
if ($basic->dbPrepare('sel_foo', "SELECT foo_id, test, some_bool, string_a, number_a, number_a_numeric, some_time FROM foo ORDER BY foo_id DESC LIMIT 5") === false) {
print "Error in sel_foo prepare<br>";
} else {
$max_rows = 6;
// do not run this in dbFetchArray directly as
// dbFetchArray(dbExecute(...))
// this will end in an endless loop
$cursor = $basic->dbExecute('sel_foo', []);
$i = 1;
while (($res = $basic->dbFetchArray($cursor, true)) !== false) {
print "DB PREP EXEC FETCH ARR: ".$i.": <pre>".print_r($res, true)."</pre><br>";
$i ++;
}
}
# db write class test
$table = 'foo';
print "TABLE META DATA: ".$basic->printAr($basic->dbShowTableMetaData($table))."<br>";
$primary_key = ''; # unset
$db_write_table = array('test', 'string_a', 'number_a', 'some_bool');
// $db_write_table = array('test');
$object_fields_not_touch = array();
$object_fields_not_update = array();
$data = array('test' => 'BOOL TEST SOMETHING '.time(), 'string_a' => 'SOME TEXT', 'number_a' => 5);
$primary_key = $basic->dbWriteDataExt($db_write_table, $primary_key, $table, $object_fields_not_touch, $object_fields_not_update, $data);
print "Wrote to DB tabel $table and got primary key $primary_key<br>";
$data = array('test' => 'BOOL TEST ON '.time(), 'string_a' => '', 'number_a' => 0, 'some_bool' => 1);
$primary_key = $basic->dbWriteDataExt($db_write_table, $primary_key, $table, $object_fields_not_touch, $object_fields_not_update, $data);
print "Wrote to DB tabel $table and got primary key $primary_key<br>";
$data = array('test' => 'BOOL TEST OFF '.time(), 'string_a' => null, 'number_a' => null, 'some_bool' => 0);
$primary_key = $basic->dbWriteDataExt($db_write_table, $primary_key, $table, $object_fields_not_touch, $object_fields_not_update, $data);
print "Wrote to DB tabel $table and got primary key $primary_key<br>";
$data = array('test' => 'BOOL TEST UNSET '.time());
$primary_key = $basic->dbWriteDataExt($db_write_table, $primary_key, $table, $object_fields_not_touch, $object_fields_not_update, $data);
print "Wrote to DB tabel $table and got primary key $primary_key<br>";
// return Array Test
$query = "SELECT type, sdate, integer FROM foobar";
$data = $basic->dbReturnArray($query, true);
print "Full foobar list: <br><pre>".print_r($data, true)."</pre><br>";
# async test queries
/* $basic->dbExecAsync("SELECT test FROM foo, (SELECT pg_sleep(10)) as sub WHERE foo_id IN (27, 50, 67, 44, 10)");
echo "WAITING FOR ASYNC: ";
$chars = array('|', '/', '-', '\\');
while (($ret = $basic->dbCheckAsync()) === true)
{
if ((list($_, $char) = each($chars)) === FALSE)
{
reset($chars);
list($_, $char) = each($chars);
}
print $char;
sleep(1);
flush();
}
print "<br>END STATUS: ".$ret."<br>";
// while ($res = $basic->dbFetchArray($ret))
while ($res = $basic->dbFetchArray())
{
echo "RES: ".$res['test']."<br>";
}
# test async insert
$basic->dbExecAsync("INSERT INTO foo (Test) VALUES ('ASYNC TEST ".time()."')");
echo "WAITING FOR ASYNC INSERT: ";
while (($ret = $basic->dbCheckAsync()) === true)
{
print ".";
sleep(1);
flush();
}
print "<br>END STATUS: ".$ret." | PK: ".$basic->insert_id."<br>";
print "ASYNC PREVIOUS INSERTED: ".print_r($basic->dbReturnRow("SELECT foo_id, test FROM foo WHERE foo_id = ".$basic->insert_id), true)."<br>"; */
$to_db_version = '9.1.9';
print "VERSION DB: ".$basic->dbVersion()."<br>";
print "DB Version smaller $to_db_version: ".$basic->dbCompareVersion('<'.$to_db_version)."<br>";
print "DB Version smaller than $to_db_version: ".$basic->dbCompareVersion('<='.$to_db_version)."<br>";
print "DB Version equal $to_db_version: ".$basic->dbCompareVersion('='.$to_db_version)."<br>";
print "DB Version bigger than $to_db_version: ".$basic->dbCompareVersion('>='.$to_db_version)."<br>";
print "DB Version bigger $to_db_version: ".$basic->dbCompareVersion('>'.$to_db_version)."<br>";
/* $q = "SELECT FOO FRO BAR";
// $q = "Select * from foo";
$foo = $basic->dbExecAsync($q);
print "[ERR] Query: ".$q."<br>";
print "[ERR] RESOURCE: $foo<br>";
while (($ret = $basic->dbCheckAsync()) === true)
{
print "[ERR]: $ret<br>";
sleep(5);
} */
// search path check
$q = "SHOW search_path";
$cursor = $basic->dbExec($q);
$data = $basic->dbFetchArray($cursor)['search_path'];
print "RETURN DATA FOR search_path: ".$data."<br>";
// print "RETURN DATA FOR search_path: ".$basic->printAr($data)."<br>";
// insert something into test.schema_test and see if we get the PK back
$status = $basic->dbExec("INSERT INTO test.schema_test (contents, id) VALUES ('TIME: ".time()."', ".rand(1, 10).")");
print "OTHER SCHEMA INSERT STATUS: ".$status." | PK NAME: ".$basic->pk_name.", PRIMARY KEY: ".$basic->insert_id."<br>";
print "<b>NULL TEST DB READ</b><br>";
$q = "SELECT uid, null_varchar, null_int FROM test_null_data WHERE uid = 'A'";
$res = $basic->dbReturnRow($q);
var_dump($res);
print "RES: ".$basic->printAr($res)."<br>";
print "ISSET: ".isset($res['null_varchar'])."<br>";
print "EMPTY: ".empty($res['null_varchar'])."<br>";
// data read test
// time string thest
$timestamp = 5887998.33445;
$time_string = $basic->timeStringFormat($timestamp);
print "PLANE TIME STRING: ".$timestamp."<br>";
print "TIME STRING TEST: ".$time_string."<br>";
print "REVERSE TIME STRING: ".$basic->stringToTime($time_string)."<br>";
if (round($timestamp, 4) == $basic->stringToTime($time_string)) {
print "REVERSE TIME STRING MATCH<br>";
} 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>';
print $basic->magicLinks('http://test.com/foo/bar.php?foo=1').'<br>';
// compare date
$date_1 = '2017/1/5';
$date_2 = '2017-01-05';
print "COMPARE DATE: ".$basic->compareDate($date_1, $date_2)."<br>";
// recursive array search
$test_array = array(
'foo' => 'bar',
'input' => array(
'element_a' => array(
'type' => 'text'
),
'element_b' => array(
'type' => 'email'
),
'element_c' => array(
'type' => 'email'
)
)
);
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
// 'no_picture.jpg',
// 'no_picture.png',
// width bigger
// 'no_picture_width_bigger.jpg',
// 'no_picture_width_bigger.png',
// square
// 'no_picture_square.jpg',
// 'no_picture_square.png',
// other sample images
// '5c501af48da6c.jpg',
// Apple HEIC files
// 'img_2145.heic',
// Photoshop
'photoshop_test.psd',
);
$thumb_width = 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>";
}
// mime test
$mime = 'application/vnd.ms-excel';
print "App for mime: ".$basic->mimeGetAppName($mime)."<br>";
$basic->mimeSetAppName($mime, 'Microsoft Excel');
print "App for mime changed: ".$basic->mimeGetAppName($mime)."<br>";
// print error messages
// print $login->printErrorMsg();
print $basic->printErrorMsg();
// print $login->log->printErrorMsg();
print $basic->log->printErrorMsg();
print "</body></html>";

View File

@@ -0,0 +1,66 @@
<?php declare(strict_types=1);
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-phpv';
ob_end_flush();
use CoreLibs\Check\PhpVersion;
$basic = new CoreLibs\Basic();
$_phpv = new CoreLibs\Check\PhpVersion();
$phpv_class = 'CoreLibs\Check\PhpVersion';
// define a list of from to color sets for conversion test
print "<html><head><title>TEST CLASS: PHP VERSION</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
$min_version_s = '7';
$min_version_ss = '7.1';
$min_version = '7.1.0';
$max_version = '7.3.1';
// class
print "MIN: $min_version: ".(string)$_phpv->checkPHPVersion($min_version)."<br>";
print "MIN/MAX: $min_version/$max_version: ".(string)$_phpv->checkPHPVersion($min_version, $max_version)."<br>";
print "MIN/S: $min_version_s: ".(string)$_phpv->checkPHPVersion($min_version_s)."<br>";
print "MIN/SS: $min_version_ss: ".(string)$_phpv->checkPHPVersion($min_version_ss)."<br>";
// static
print "S::MIN: $min_version: ".(string)$phpv_class::checkPHPVersion($min_version)."<br>";
print "S::MIN/MAX: $min_version/$max_version: ".(string)$phpv_class::checkPHPVersion($min_version, $max_version)."<br>";
print "S::MIN/S: $min_version_s: ".(string)$phpv_class::checkPHPVersion($min_version_s)."<br>";
print "S::MIN/SS: $min_version_ss: ".(string)$phpv_class::checkPHPVersion($min_version_ss)."<br>";
// use stats
print "U-S::MIN: $min_version: ".(string)PhpVersion::checkPHPVersion($min_version)."<br>";
// DEPRECATED
// print "MIN: $min_version: ".(string)$basic->checkPHPVersion($min_version)."<br>";
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,55 @@
<?php declare(strict_types=1);
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-randomkey';
ob_end_flush();
use CoreLibs\Create\RandomKey;
$basic = new CoreLibs\Basic();
$array_class = 'CoreLibs\Create\RandomKey';
print "<html><head><title>TEST CLASS: RANDOM KEY</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
$key_length = 10;
$key_length_b = 5;
print "S::RANDOMKEYGEN(auto): ".RandomKey::randomKeyGen()."<br>";
print "S::SETRANDOMKEYLENGTH($key_length): ".RandomKey::setRandomKeyLength($key_length)."<br>";
print "S::RANDOMKEYGEN($key_length): ".RandomKey::randomKeyGen()."<br>";
print "S::RANDOMKEYGEN($key_length_b): ".RandomKey::randomKeyGen($key_length_b)."<br>";
print "S::RANDOMKEYGEN($key_length): ".RandomKey::randomKeyGen()."<br>";
$_array= new CoreLibs\Create\RandomKey();
print "C->RANDOMKEYGEN(auto): ".$_array->randomKeyGen()."<br>";
// DEPRECATED
// print "D\RANDOMKEYGEN(auto): ".$basic->randomKeyGen()."<br>";
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,63 @@
<?php declare(strict_types=1);
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-runningtime';
ob_end_flush();
use CoreLibs\Debug\RunningTime;
$basic = new CoreLibs\Basic();
print "<html><head><title>TEST CLASS: RUNNING IMTE</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
RunningTime::hrRunningTime();
RunningTime::runningTime();
echo "RANDOM KEY [50]: ".\CoreLibs\Create\RandomKey::randomKeyGen(50)."<br>";
echo "TIMED [hr]: ".RunningTime::hrRunningTime()."<br>";
echo "TIMED [def]: ".RunningTime::runningTime()."<br>";
echo "TIMED [string]: ".RunningTime::runningTimeString()."<br>";
RunningTime::hrRunningTime();
echo "RANDOM KEY [default]: ".\CoreLibs\Create\RandomKey::randomKeyGen()."<br>";
echo "TIMED [hr]: ".RunningTime::hrRunningTime()."<br>";
// DEPRECATED
/* $basic->hrRunningTime();
$basic->runningTime();
echo "RANDOM KEY [50]: ".$basic->randomKeyGen(50)."<br>";
echo "TIMED [hr]: ".$basic->hrRunningTime()."<br>";
echo "TIMED [def]: ".$basic->runningTime()."<br>";
echo "TIMED [string]: ".$basic->runningtime_string."<br>";
$basic->hrRunningTime();
echo "RANDOM KEY [default]: ".$basic->randomKeyGen()."<br>";
echo "TIMED [hr]: ".$basic->hrRunningTime()."<br>"; */
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,49 @@
<?php declare(strict_types=1);
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-system';
ob_end_flush();
use CoreLibs\Get\System;
use CoreLibs\Debug\Support as DgS;
$basic = new CoreLibs\Basic();
print "<html><head><title>TEST CLASS: SYSTEM</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
print "GETHOSTNAME: ".DgS::printAr(System::getHostName())."<br>";
print "GETPAGENAME(0): ".System::getPageName()."<br>";
print "GETPAGENAME(1): ".System::getPageName(1)."<br>";
print "GETPAGENAME(2): ".System::getPageName(2)."<br>";
// seting errro codes file upload
print "FILEUPLOADERRORMESSAGE(): ".System::fileUploadErrorMessage(-1)."<br>";
print "FILEUPLOADERRORMESSAGE(UPLOAD_ERR_CANT_WRITE): ".System::fileUploadErrorMessage(UPLOAD_ERR_CANT_WRITE)."<br>";
// error message
print $basic->log->printErrorMsg();
print "</body></html>";

View File

@@ -0,0 +1,58 @@
<?php declare(strict_types=1);
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-token';
ob_end_flush();
$basic = new CoreLibs\Basic();
$_token = new CoreLibs\Output\Form\Token();
$token_class = 'CoreLibs\Output\Form\Token';
print "<html><head><title>TEST CLASS: FORM TOKEN</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
$token = 'test_form_token';
$token_id = $_token->setFormToken($token);
print "TOKEN: $token: (ID) ".$token_id." => (S) ".$_SESSION[$token]."<br>";
print "VALIDATE: $token: ".(string)$_token->validateFormToken($token_id, $token)."<br>";
$token = 'test_form_token_static';
$token_id = $token_class::setFormToken($token);
print "S-TOKEN: $token: (ID) ".$token_id." => (S) ".$_SESSION[$token]."<br>";
print "S-VALIDATE: $token: ".(string)$token_class::validateFormToken($token_id, $token)."<br>";
// DEPRECATED
/* $token = 'test_form_token_deprecated';
$token_id = $basic->setFormToken($token);
print "TOKEN: $token: (ID) ".$token_id." => (S) ".$_SESSION[$token]."<br>";
print "VALIDATE: $token: ".(string)$basic->validateFormToken($token_id, $token)."<br>"; */
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,56 @@
<?php declare(strict_types=1);
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-uids';
ob_end_flush();
$basic = new CoreLibs\Basic();
$_uids = new CoreLibs\Create\Uids();
$uids_class = 'CoreLibs\Create\Uids';
print "<html><head><title>TEST CLASS: UIDS</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
// class
print "UUIDV4: ".$_uids->uuidv4()."<br>";
print "UNIQID (d): ".$_uids->uniqId()."<br>";
print "UNIQID (md5): ".$_uids->uniqId('md5')."<br>";
print "UNIQID (sha256): ".$_uids->uniqId('sha256')."<br>";
// statc
print "S::UUIDV4: ".$uids_class::uuidv4()."<br>";
print "S::UNIQID (d): ".$uids_class::uniqId()."<br>";
print "S::UNIQID (md5): ".$uids_class::uniqId('md5')."<br>";
print "S::UNIQID (sha256): ".$uids_class::uniqId('sha256')."<br>";
// DEPRECATED
/* print "D/UUIDV4: ".$basic->uuidv4()."<br>";
print "/DUNIQID (d): ".$basic->uniqId()."<br>"; */
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -17,3 +17,5 @@ require(BASE.LIB."Error.Handling.php");
if ($var) {
echo "OUT<br>";
}
// this wll throw an error and also write
// asdfa(09);

View File

@@ -20,23 +20,22 @@ if ($base->getConnectionStatus()) {
die("Cannot connect to database");
}
print "Start time: ".$base->runningTime()."<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>";
print "Start time: ".\CoreLibs\Debug\RunningTime::runningTime()."<br>";
print "HumanReadableByteFormat: ".\CoreLibs\Convert\Byte::HumanReadableByteFormat(1234567.12)."<br>";
print "humanReadableByteFormat: ".\CoreLibs\Convert\Byte::humanReadableByteFormat(1234567.12)."<br>";
print "getPageName: ". \CoreLibs\Get\System::getPageName()."<br>";
print "DB Info: ".$base->dbInfo(true)."<br>";
print "End Time: ".$base->runningTime()."<br>";
print "Start Time: ".$base->runningTime()."<br>";
print "End Time: ".\CoreLibs\Debug\RunningTime::runningTime()."<br>";
print "Start Time: ".\CoreLibs\Debug\RunningTime::runningTime()."<br>";
print "Lang: ".$base->l->__getLang().", MO File: ".$base->l->__getMoFile()."<br>";
print "Translate test: Year -> ".$base->l->__('Year')."<br>";
print "End Time: ".$base->runningTime()."<br>";
print "End Time: ".\CoreLibs\Debug\RunningTime::runningTime()."<br>";
// end error print
print $base->printErrorMsg();
print $base->log->printErrorMsg();
# __END__

View File

@@ -27,8 +27,8 @@ line breaks
in there. Theis
is sucky';
print "LB remove: ".$base->removeLB($text)."<br>";
print "LB remove: ".$base->removeLB($text, '##BR##')."<br>";
print "LB remove: ".\CoreLibs\Convert\Html::removeLB($text)."<br>";
print "LB remove: ".\CoreLibs\Convert\Html::removeLB($text, '##BR##')."<br>";
// $test = array (
// 'A' => array (
@@ -47,7 +47,7 @@ print "LB remove: ".$base->removeLB($text, '##BR##')."<br>";
// )
// );
// $base->debug('ARRAY', $base->printAr($test));
// $base->log->debug('ARRAY', \CoreLibs\Debug\Support::printAr($test));
function rec($pre, $cur, $node = array ())
{
@@ -103,9 +103,9 @@ $test = rec('C', 'U', $test);
$test = rec('F', 'U', $test);
$test = rec('', 'Al', $test);
$test = rec('B', 'B1', $test);
$base->debug('REC', $base->printAr($test));
print "FLATTEN: ".$base->printAr(flattenArrayKey($test))."<br>";
$base->log->debug('REC', \CoreLibs\Debug\Support::printAr($test));
print "FLATTEN: ".\CoreLibs\Debug\Support::printAr(flattenArrayKey($test))."<br>";
print $base->printErrorMsg();
print $base->log->printErrorMsg();
// __END__

View File

@@ -7,7 +7,7 @@
* HISTORY:
*********************************************************************/
$day_short = array(
$day_short = [
1 => 'Mon',
2 => 'Tue',
3 => 'Wed',
@@ -15,9 +15,9 @@ $day_short = array(
5 => 'Fri',
6 => 'Sat',
7 => 'Sun'
);
];
$day_long = array(
$day_long = [
1 => 'Monday',
2 => 'Tuesday',
3 => 'Wednesday',
@@ -25,10 +25,10 @@ $day_long = array(
5 => 'Friday',
6 => 'Saturday',
7 => 'Sunday'
);
];
// months
$month_long = array(
$month_long = [
1 => 'January',
2 => 'February',
3 => 'March',
@@ -41,9 +41,9 @@ $month_long = array(
10 => 'October',
11 => 'November',
12 => 'December'
);
];
$month_short = array(
$month_short = [
1 => 'Jan',
2 => 'Feb',
3 => 'Mar',
@@ -56,6 +56,6 @@ $month_short = array(
10 => 'Oct',
11 => 'Nov',
12 => 'Dec'
);
];
// __END__

View File

@@ -8,7 +8,7 @@
*********************************************************************/
// print debug messages
echo $login->printErrorMsg();
echo $cms->printErrorMsg();
echo $login->log->printErrorMsg();
echo $cms->log->printErrorMsg();
// __END__

View File

@@ -80,12 +80,10 @@ if (!$login->login) {
// 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) {
$login->debug_output_all = false;
$login->echo_output_all = false;
$login->print_output_all = false;
$cms->debug_output_all = false;
$cms->echo_output_all = false;
$cms->print_output_all = false;
foreach (['debug', 'echo', 'print'] as $target) {
$login->log->setLogLevelAll($type, false);
$cms->log->setLogLevelAll($type, false);
}
}
$smarty->DATA['JS_DEBUG'] = DEBUG;

View File

@@ -50,24 +50,24 @@ if ($form->mobile_phone) {
// smarty template engine (extended Translation version)
$smarty = new CoreLibs\Template\SmartyExtend();
// $form->debug('POST', $form->printAr($_POST));
// $form->log->debug('POST', $form->log->prAr($_POST));
if (TARGET == 'live' || TARGET == 'remote') {
// login
$login->debug_output_all = DEBUG ? 1 : 0;
$login->echo_output_all = 0;
$login->print_output_all = DEBUG ? 1 : 0;
$login->log->setLogLevelAll('debug', DEBUG ? true : false);
$login->log->setLogLevelAll('echo', false);
$login->log->setLogLevelAll('print', DEBUG ? true : false);
// form
$form->debug_output_all = DEBUG ? 1 : 0;
$form->echo_output_all = 0;
$form->print_output_all = DEBUG ? 1 : 0;
$form->log->setLogLevelAll('debug', DEBUG ? true : false);
$form->log->setLogLevelAll('echo', false);
$form->log->setLogLevelAll('print', DEBUG ? true : false);
}
// space for setting special debug flags
$login->debug_output_all = 1;
$login->log->setLogLevelAll('debug', true);
// set smarty arrays
$HEADER = array();
$DATA = array();
$DEBUG_DATA = array();
$HEADER = [];
$DATA = [];
$DEBUG_DATA = [];
// set the template dir
// WARNING: this has a special check for the mailing tool layout (old layout)
if (defined('LAYOUT')) {
@@ -94,13 +94,13 @@ if ($form->my_page_name == 'edit_order') {
// order name is _always_ order_number for the edit interface
// follwing arrays do exist here:
// $position ... has the positions of the array(0..max), cause in a <select>
// $position ... has the positions of the [0..max], cause in a <select>
// I can't put an number into the array field, in this array,
// there are the POSITION stored, that should CHANGE there order (up/down)
// $row_data_id ... has ALL ids from the sorting part
// $row_data_order ... has ALL order positions from the soirting part
if (!isset($position)) {
$position = array();
$position = [];
}
$row_data_id = $_POST['row_data_id'] ?? [];
$original_id = $row_data_id;
@@ -156,29 +156,33 @@ if ($form->my_page_name == 'edit_order') {
$q .= "ORDER BY order_number";
// init arrays
$row_data = array();
$options_id = array();
$options_name = array();
$options_selected = array();
$row_data = [];
$options_id = [];
$options_name = [];
$options_selected = [];
// DB read data for menu
while ($res = $form->dbReturn($q)) {
$row_data[] = array(
$row_data[] = [
"id" => $res[$table_name."_id"],
"name" => $res["name"],
"order" => $res["order_number"]
);
];
} // while read data ...
// html title
$HEADER['HTML_TITLE'] = $form->l->__('Edit Order');
$messages = array();
$messages = [];
// error msg
if (isset($error)) {
if (!isset($msg)) {
$msg = array();
$msg = [];
}
$messages[] = array('msg' => $msg, 'class' => 'error', 'width' => '100%');
$messages[] = [
'msg' => $msg,
'class' => 'error',
'width' => '100%'
];
}
$DATA['form_error_msg'] = $messages;
@@ -201,8 +205,8 @@ if ($form->my_page_name == 'edit_order') {
$DATA['options_selected'] = $options_selected;
// hidden list for the data (id, order number)
$row_data_id = array();
$row_data_order = array();
$row_data_id = [];
$row_data_order = [];
for ($i = 0; $i < count($row_data); $i++) {
$row_data_id[] = $row_data[$i]['id'];
$row_data_order[] = $row_data[$i]['order'];
@@ -230,7 +234,7 @@ if ($form->my_page_name == 'edit_order') {
$DATA['table_width'] = $table_width;
$messages = array();
$messages = [];
// write out error / status messages
$messages[] = $form->formPrintMsg();
$DATA['form_error_msg'] = $messages;
@@ -248,13 +252,13 @@ if ($form->my_page_name == 'edit_order') {
$DATA['GROUP_LEVEL'] = $_SESSION['GROUP_ACL_LEVEL'];
$PAGES = $_SESSION['PAGES'];
//$form->debug('menu', $form->printAr($PAGES));
//$form->log->debug('menu', $form->log->prAr($PAGES));
// build nav from $PAGES ...
if (!isset($PAGES) || !is_array($PAGES)) {
$PAGES = array();
$PAGES = [];
}
$menuarray = array();
$menuarray = [];
foreach ($PAGES as $PAGE_CUID => $PAGE_DATA) {
if ($PAGE_DATA['menu'] && $PAGE_DATA['online']) {
$menuarray[] = $PAGE_DATA;
@@ -273,7 +277,7 @@ if ($form->my_page_name == 'edit_order') {
}
$position = 0;
$menu_data = array();
$menu_data = [];
// for ($i = 1; $i <= count($menuarray); $i ++) {
foreach ($menuarray as $i => $data) {
// do that for new array
@@ -299,7 +303,7 @@ if ($form->my_page_name == 'edit_order') {
}
// on matching, we also need to check if we are in the same folder
if (isset($data['filename']) &&
$data['filename'] == $form->getPageName() &&
$data['filename'] == \CoreLibs\Get\System::getPageName() &&
(!isset($data['hostname']) || (
isset($data['hostname']) &&
(!$data['hostname'] || strstr($data['hostname'], CONTENT_PATH) !== false)
@@ -328,7 +332,7 @@ if ($form->my_page_name == 'edit_order') {
$menu_data[$i]['splitfactor_out'] = 0;
}
} // for
// $form->debug('MENU ARRAY', $form->printAr($menu_data));
// $form->log->debug('MENU ARRAY', $form->log->prAr($menu_data));
$DATA['menu_data'] = $menu_data;
$DATA['page_name'] = $menuarray[$position]['page_name'] ?? '-Undefined ['.$position.'] -';
$L_TITLE = $DATA['page_name'];
@@ -344,7 +348,7 @@ if ($form->my_page_name == 'edit_order') {
$DATA['form_my_page_name'] = $form->my_page_name;
$DATA['filename_exist'] = 0;
$DATA['drop_down_input'] = 0;
$elements = array();
$elements = [];
// depending on the "getPageName()" I show different stuff
switch ($form->my_page_name) {
case 'edit_users':
@@ -382,9 +386,9 @@ if ($form->my_page_name == 'edit_order') {
$q = "DELETE FROM temp_files";
$form->dbExec($q);
// gets all files in the current dir and dirs given ending with .php
$folders = array('../admin/', '../frontend/');
$files = array('*.php');
$search_glob = array();
$folders = ['../admin/', '../frontend/'];
$files = ['*.php'];
$search_glob = [];
foreach ($folders as $folder) {
// make sure this folder actually exists
if (is_dir(ROOT.$folder)) {
@@ -470,7 +474,7 @@ if ($form->my_page_name == 'edit_order') {
print '[No valid page definition given]';
break;
}
// $form->debug('edit', "Elements: <pre>".$form->printAr($elements));
// $form->log->debug('edit', "Elements: <pre>".$form->log->prAr($elements));
$DATA['elements'] = $elements;
$DATA['hidden'] = $form->formCreateHiddenFields();
$DATA['save_delete'] = $form->formCreateSaveDelete();
@@ -498,7 +502,7 @@ if (is_dir(BASE.CACHE)) {
$smarty->display($EDIT_TEMPLATE, 'editAdmin_'.$smarty->lang, 'editAdmin_'.$smarty->lang);
// debug output
echo $login->printErrorMsg();
echo $form->printErrorMsg();
echo $login->log->printErrorMsg();
echo $form->log->printErrorMsg();
// __END__

View File

@@ -1,26 +1,26 @@
<?php declare(strict_types=1);
$edit_access = array(
'table_array' => array(
'edit_access_id' => array(
'value' => isset($GLOBALS['edit_access_id']) ? $GLOBALS['edit_access_id'] : '',
$edit_access = [
'table_array' => [
'edit_access_id' => [
'value' => $GLOBALS['edit_access_id'] ?? '',
'type' => 'hidden',
'pk' => 1
),
'name' => array(
'value' => isset($GLOBALS['name']) ? $GLOBALS['name'] : '',
],
'name' => [
'value' => $GLOBALS['name'] ?? '',
'output_name' => 'Access Group Name',
'mandatory' => 1,
'type' => 'text',
'error_check' => 'alphanumericspace|unique'
),
'description' => array(
'value' => isset($GLOBALS['description']) ? $GLOBALS['description'] : '',
],
'description' => [
'value' => $GLOBALS['description'] ?? '',
'output_name' => 'Description',
'type' => 'textarea'
),
'color' => array(
'value' => isset($GLOBALS['color']) ? $GLOBALS['color'] : '',
],
'color' => [
'value' => $GLOBALS['color'] ?? '',
'output_name' => 'Color',
'mandatory' => 0,
'type' => 'text',
@@ -29,80 +29,80 @@ $edit_access = array(
'error_check' => 'custom',
'error_regex' => "/[\dA-Fa-f]{6}/",
'error_example' => 'F6A544'
),
'enabled' => array(
'value' => isset($GLOBALS['enabled']) ? $GLOBALS['enabled'] : 0,
],
'enabled' => [
'value' => $GLOBALS['enabled'] ?? 0,
'output_name' => 'Enabled',
'type' => 'binary',
'int' => 1, // OR 'bool' => 1
'element_list' => array(
'element_list' => [
'1' => 'Yes',
'0' => 'No'
)
),
'protected' => array(
'value' => isset($GLOBALS['protected']) ? $GLOBALS['protected'] : 0,
],
],
'protected' => [
'value' => $GLOBALS['protected'] ?? 0,
'output_name' => 'Protected',
'type' => 'binary',
'int' => 1,
'element_list' => array(
'element_list' => [
'1' => 'Yes',
'0' => 'No'
)
),
'additional_acl' => array(
'value' => isset($GLOBALS['additional_acl']) ? $GLOBALS['additional_acl'] : '',
],
],
'additional_acl' => [
'value' => $GLOBALS['additional_acl'] ?? '',
'output_name' => 'Additional ACL (as JSON)',
'type' => 'textarea',
'error_check' => 'json',
'rows' => 10,
'cols' => 60
),
),
],
],
'table_name' => 'edit_access',
"load_query" => "SELECT edit_access_id, name FROM edit_access ORDER BY name",
'show_fields' => array(
array(
'show_fields' => [
[
'name' => 'name'
)
),
'element_list' => array(
'edit_access_data' => array(
],
],
'element_list' => [
'edit_access_data' => [
'output_name' => 'Edit Access Data',
'delete_name' => 'remove_edit_access_data',
// 'type' => 'reference_data', # is not a sub table read and connect, but only a sub table with data
'max_empty' => 5, # maxium visible if no data is set, if filled add this number to visible
// 'type' => 'reference_data', // is not a sub table read and connect, but only a sub table with data
'max_empty' => 5, // maxium visible if no data is set, if filled add this number to visible
'prefix' => 'ead',
'elements' => array(
'name' => array(
'elements' => [
'name' => [
'type' => 'text',
'error_check' => 'alphanumeric|unique',
'output_name' => 'Name',
'mandatory' => 1
),
'value' => array(
],
'value' => [
'type' => 'text',
'output_name' => 'Value'
),
'enabled' => array(
],
'enabled' => [
'type' => 'checkbox',
'output_name' => 'Activate',
'int' => 1,
'element_list' => array(1)
),
/*'edit_access_id' => array(
'element_list' => [1]
],
/*'edit_access_id' => [
'int' => 1,
'type' => 'hidden',
'fk_id' => 1 # reference main key from master table above
),*/
'edit_access_data_id' => array(
'fk_id' => 1 // reference main key from master table above
],*/
'edit_access_data_id' => [
'type' => 'hidden',
'int' => 1,
'pk_id' => 1
)
)
)
)
);
],
],
],
],
];
// __END__

View File

@@ -1,109 +1,109 @@
<?php declare(strict_types=1);
$edit_groups = array(
'table_array' => array(
'edit_group_id' => array(
'value' => isset($GLOBALS['edit_group_id']) ? $GLOBALS['edit_group_id'] : '',
$edit_groups = [
'table_array' => [
'edit_group_id' => [
'value' => $GLOBALS['edit_group_id'] ?? '',
'pk' => 1,
'type' => 'hidden'
),
'enabled' => array(
'value' => isset($GLOBALS['enabled']) ? $GLOBALS['enabled'] : '',
],
'enabled' => [
'value' => $GLOBALS['enabled'] ?? '',
'output_name' => 'Enabled',
'int' => 1,
'type' => 'binary',
'element_list' => array(
'element_list' => [
'1' => 'Yes',
'0' => 'No'
)
),
'name' => array(
'value' => isset($GLOBALS['name']) ? $GLOBALS['name'] : '',
],
],
'name' => [
'value' => $GLOBALS['name'] ?? '',
'output_name' => 'Group Name',
'type' => 'text',
'mandatory' => 1
),
'edit_access_right_id' => array(
'value' => isset($GLOBALS['edit_access_right_id']) ? $GLOBALS['edit_access_right_id'] : '',
],
'edit_access_right_id' => [
'value' => $GLOBALS['edit_access_right_id'] ?? '',
'output_name' => 'Group Level',
'mandatory' => 1,
'int' => 1,
'type' => 'drop_down_db',
'query' => "SELECT edit_access_right_id, name FROM edit_access_right ORDER BY level"
),
'edit_scheme_id' => array(
'value' => isset($GLOBALS['edit_scheme_id']) ? $GLOBALS['edit_scheme_id'] : '',
],
'edit_scheme_id' => [
'value' => $GLOBALS['edit_scheme_id'] ?? '',
'output_name' => 'Group Scheme',
'int_null' => 1,
'type' => 'drop_down_db',
'query' => "SELECT edit_scheme_id, name FROM edit_scheme WHERE enabled = 1 ORDER BY name"
),
'additional_acl' => array(
'value' => isset($GLOBALS['additional_acl']) ? $GLOBALS['additional_acl'] : '',
],
'additional_acl' => [
'value' => $GLOBALS['additional_acl'] ?? '',
'output_name' => 'Additional ACL (as JSON)',
'type' => 'textarea',
'error_check' => 'json',
'rows' => 10,
'cols' => 60
),
),
],
],
'load_query' => "SELECT edit_group_id, name, enabled FROM edit_group ORDER BY name",
'table_name' => 'edit_group',
'show_fields' => array(
array(
'show_fields' => [
[
'name' => 'name'
),
array(
],
[
'name' => 'enabled',
'binary' => array('Yes', 'No'),
'binary' => ['Yes', 'No'],
'before_value' => 'Enabled: '
)
),
'element_list' => array(
'edit_page_access' => array(
],
],
'element_list' => [
'edit_page_access' => [
'output_name' => 'Pages',
'mandatory' => 1,
'delete' => 0, // set then reference entries are deleted, else the 'enable' flag is only set
'enable_name' => 'enable_page_access',
'prefix' => 'epa',
'read_data' => array(
'read_data' => [
'table_name' => 'edit_page',
'pk_id' => 'edit_page_id',
'name' => 'name',
'order' => 'order_number'
),
'elements' => array(
'edit_page_access_id' => array(
],
'elements' => [
'edit_page_access_id' => [
'type' => 'hidden',
'int' => 1,
'pk_id' => 1
),
'enabled' => array(
],
'enabled' => [
'type' => 'checkbox',
'output_name' => 'Activate',
'int' => 1,
'element_list' => array(1)
),
'edit_access_right_id' => array(
'element_list' => [1],
],
'edit_access_right_id' => [
'type' => 'drop_down_db',
'output_name' => 'Access Level',
'int' => 1,
'preset' => 1, // first of the select
'query' => "SELECT edit_access_right_id, name FROM edit_access_right ORDER BY level"
),
'edit_page_id' => array(
],
'edit_page_id' => [
'int' => 1,
'type' => 'hidden'
)
],
/*,
'edit_default' => array(
'edit_default' => [
'output_name' => 'Default',
'type' => 'radio',
'mandatory' => 1
)*/
)
) // edit pages ggroup
)
);
],*/
],
], // edit pages ggroup
],
];
// __END__

View File

@@ -1,75 +1,75 @@
<?php declare(strict_types=1);
$edit_languages=array(
'table_array' => array(
'edit_language_id' => array(
'value' => isset($GLOBALS['edit_language_id']) ? $GLOBALS['edit_language_id'] : '',
$edit_languages=[
'table_array' => [
'edit_language_id' => [
'value' => $GLOBALS['edit_language_id'] ?? '',
'type' => 'hidden',
'pk' => 1
),
'short_name' => array(
'value' => isset($GLOBALS['short_name']) ? $GLOBALS['short_name'] : '',
],
'short_name' => [
'value' => $GLOBALS['short_name'] ?? '',
'output_name' => 'Language (short)',
'mandatory' => 1,
'type' => 'text',
'size' => 2,
'length' => 2
),
'long_name' => array(
'value' => isset($GLOBALS['long_name']) ? $GLOBALS['long_name'] : '',
],
'long_name' => [
'value' => $GLOBALS['long_name'] ?? '',
'output_name' => 'Language (long)',
'mandatory' => 1,
'type' => 'text',
'size' => 40
),
'iso_name' => array(
'value' => isset($GLOBALS['iso_name']) ? $GLOBALS['iso_name'] : '',
],
'iso_name' => [
'value' => $GLOBALS['iso_name'] ?? '',
'output_name' => 'ISO Code',
'mandatory' => 1,
'type' => 'text'
),
'order_number' => array(
'value' => isset($GLOBALS['order_number']) ? $GLOBALS['order_number'] : '',
],
'order_number' => [
'value' => $GLOBALS['order_number'] ?? '',
'int' => 1,
'order' => 1
),
'enabled' => array(
'value' => isset($GLOBALS['enabled']) ? $GLOBALS['enabled'] : '',
],
'enabled' => [
'value' => $GLOBALS['enabled'] ?? '',
'output_name' => 'Enabled',
'int' => 1,
'type' => 'binary',
'element_list' => array(
'element_list' => [
'1' => 'Yes',
'0' => 'No'
)
),
'lang_default' => array(
'value' => isset($GLOBALS['lang_default']) ? $GLOBALS['lang_default'] : '',
],
],
'lang_default' => [
'value' => $GLOBALS['lang_default'] ?? '',
'output_name' => 'Default Language',
'int' => 1,
'type' => 'binary',
'element_list' => array(
'element_list' => [
'1' => 'Yes',
'0' => 'No'
)
)
),
],
],
],
'load_query' => "SELECT edit_language_id, long_name, iso_name, enabled FROM edit_language ORDER BY long_name",
'show_fields' => array(
array(
'show_fields' => [
[
'name' => 'long_name'
),
array(
],
[
'name' => 'iso_name',
'before_value' => 'ISO: '
),
array(
],
[
'name' => 'enabled',
'before_value' => 'Enabled: ',
'binary' => array('Yes','No')
)
),
'binary' => ['Yes','No'],
],
],
'table_name' => 'edit_language'
);
];
// __END__

View File

@@ -1,40 +1,40 @@
<?php declare(strict_types=1);
$edit_menu_group = array(
'table_array' => array(
'edit_menu_group_id' => array(
'value' => isset($GLOBALS['edit_menu_group_id']) ? $GLOBALS['edit_menu_group_id'] : '',
$edit_menu_group = [
'table_array' => [
'edit_menu_group_id' => [
'value' => $GLOBALS['edit_menu_group_id'] ?? '',
'type' => 'hidden',
'pk' => 1
),
'name' => array(
'value' => isset($GLOBALS['name']) ? $GLOBALS['name'] : '',
],
'name' => [
'value' => $GLOBALS['name'] ?? '',
'output_name' => 'Group name',
'mandatory' => 1,
'type' => 'text'
),
'flag' => array(
'value' => isset($GLOBALS['flag']) ? $GLOBALS['flag'] : '',
],
'flag' => [
'value' => $GLOBALS['flag'] ?? '',
'output_name' => 'Flag',
'mandatory' => 1,
'type' => 'text',
'error_check' => 'alphanumeric|unique'
),
'order_number' => array(
'value' => isset($GLOBALS['order_number']) ? $GLOBALS['order_number'] : '',
],
'order_number' => [
'value' => $GLOBALS['order_number'] ?? '',
'output_name' => 'Group order',
'type' => 'order',
'int' => 1,
'order' => 1
)
),
],
],
'table_name' => 'edit_menu_group',
'load_query' => "SELECT edit_menu_group_id, name FROM edit_menu_group ORDER BY name",
'show_fields' => array(
array(
'show_fields' => [
[
'name' => 'name'
)
)
);
],
],
];
// __END__

View File

@@ -1,101 +1,101 @@
<?php declare(strict_types=1);
$edit_pages = array(
'table_array' => array(
'edit_page_id' => array(
'value' => isset($GLOBALS['edit_page_id']) ? $GLOBALS['edit_page_id'] : '',
$edit_pages = [
'table_array' => [
'edit_page_id' => [
'value' => $GLOBALS['edit_page_id'] ?? '',
'type' => 'hidden',
'pk' => 1
),
'filename' => array(
'value' => isset($GLOBALS['filename']) ? $GLOBALS['filename'] : '',
],
'filename' => [
'value' => $GLOBALS['filename'] ?? '',
'output_name' => 'Add File ...',
'mandatory' => 1,
'type' => 'drop_down_db',
'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'] : '',
'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' => [
'value' => $GLOBALS['hostname'] ?? '',
'output_name' => 'Hostname or folder',
'type' => 'text'
),
'name' => array(
'value' => isset($GLOBALS['name']) ? $GLOBALS['name'] : '',
],
'name' => [
'value' => $GLOBALS['name'] ?? '',
'output_name' => 'Page name',
'mandatory' => 1,
'type' => 'text'
),
'order_number' => array(
'value' => isset($GLOBALS['order_number']) ? $GLOBALS['order_number'] : '',
],
'order_number' => [
'value' => $GLOBALS['order_number'] ?? '',
'output_name' => 'Page order',
'type' => 'order',
'int' => 1,
'order' => 1
),
/* 'flag' => array(
],
/* 'flag' => [
'value' => isset($GLOBALS['flag']) ? $GLOBALS['flag'] : '',
'output_name' => 'Page Flag',
'type' => 'drop_down_array',
'query' => array(
'query' => [
'0' => '0',
'1' => '1',
'2' => '2',
'3' => '3',
'4' => '4',
'5' => '5'
)
),*/
'online' => array(
'value' => isset($GLOBALS['online']) ? $GLOBALS['online'] : '',
],
],*/
'online' => [
'value' => $GLOBALS['online'] ?? '',
'output_name' => 'Online',
'int' => 1,
'type' => 'binary',
'element_list' => array(
'element_list' => [
'1' => 'Yes',
'0' => 'No'
)
),
'menu' => array(
'value' => isset($GLOBALS['menu']) ? $GLOBALS['menu'] : '',
],
],
'menu' => [
'value' => $GLOBALS['menu'] ?? '',
'output_name' => 'Menu',
'int' => 1,
'type' => 'binary',
'element_list' => array(
'element_list' => [
'1' => 'Yes',
'0' => 'No'
)
),
'popup' => array(
'value' => isset($GLOBALS['popup']) ? $GLOBALS['popup'] : '',
],
],
'popup' => [
'value' => $GLOBALS['popup'] ?? '',
'output_name' => 'Popup',
'int' => 1,
'type' => 'binary',
'element_list' => array(
'element_list' => [
'1' => 'Yes',
'0' => 'No'
)
),
'popup_x' => array(
'value' => isset($GLOBALS['popup_x']) ? $GLOBALS['popup_x'] : '',
],
],
'popup_x' => [
'value' => $GLOBALS['popup_x'] ?? '',
'output_name' => 'Popup Width',
'int_null' => 1,
'type' => 'text',
'size' => 4,
'length' => 4
),
'popup_y' => array(
'value' => isset($GLOBALS['popup_y']) ? $GLOBALS['popup_y'] : '',
],
'popup_y' => [
'value' => $GLOBALS['popup_y'] ?? '',
'output_name' => 'Popup Height',
'int_null' => 1,
'type' => 'text',
'size' => 4,
'length' => 4
),
'content_alias_edit_page_id' => array(
'value' => isset($GLOBALS['content_alias_edit_page_id']) ? $GLOBALS['content_alias_edit_page_id'] : '',
],
'content_alias_edit_page_id' => [
'value' => $GLOBALS['content_alias_edit_page_id'] ?? '',
'output_name' => 'Content Alias Source',
'int_null' => 1,
'type' => 'drop_down_db',
@@ -110,132 +110,132 @@ $edit_pages = array(
// "FROM edit_page ".
// (isset($GLOBALS['edit_page_id']) ? " WHERE edit_page_id <> ".$GLOBALS['edit_page_id'] : "")." ".
// "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(
'show_fields' => [
[
'name' => 'name'
),
array(
],
[
'name' => 'filename',
'before_value' => 'Filename: '
),
array(
],
[
'name' => 'online',
'binary' => array('Yes','No'),
'binary' => ['Yes','No'],
'before_value' => 'Online: '
),
array(
],
[
'name' => 'menu',
'binary' => array('Yes','No'),
'binary' => ['Yes','No'],
'before_value' => 'Menu: '
),
array(
],
[
'name' => 'popup',
'binary' => array('Yes','No'),
'binary' => ['Yes','No'],
'before_value' => 'Popup: '
)
),
'reference_arrays' => array(
'edit_visible_group' => array(
],
],
'reference_arrays' => [
'edit_visible_group' => [
'table_name' => 'edit_page_visible_group',
'other_table_pk' => 'edit_visible_group_id',
'output_name' => 'Visible Groups (access)',
'mandatory' => 1,
'select_size' => 10,
'selected' => isset($GLOBALS['edit_visible_group_id']) ? $GLOBALS['edit_visible_group_id'] : '',
'selected' => $GLOBALS['edit_visible_group_id'] ?? '',
'query' => "SELECT edit_visible_group_id, 'Name: ' || name || ', ' || 'Flag: ' || flag FROM edit_visible_group ORDER BY name"
),
'edit_menu_group' => array(
],
'edit_menu_group' => [
'table_name' => 'edit_page_menu_group',
'other_table_pk' => 'edit_menu_group_id',
'output_name' => 'Menu Groups (grouping)',
'mandatory' => 1,
'select_size' => 10,
'selected' => isset($GLOBALS['edit_menu_group_id']) ? $GLOBALS['edit_menu_group_id'] : '',
'selected' => $GLOBALS['edit_menu_group_id'] ?? '',
'query' => "SELECT edit_menu_group_id, 'Name: ' || name || ', ' || 'Flag: ' || flag FROM edit_menu_group ORDER BY order_number"
)
],
),
'element_list' => array(
'edit_query_string' => array(
],
'element_list' => [
'edit_query_string' => [
'output_name' => 'Query Strings',
'delete_name' => 'remove_query_string',
'prefix' => 'eqs',
'elements' => array(
'name' => array(
'elements' => [
'name' => [
'output_name' => 'Name',
'type' => 'text',
'error_check' => 'unique|alphanumeric',
'mandatory' => 1
),
'value' => array(
],
'value' => [
'output_name' => 'Value',
'type' => 'text'
),
'enabled' => array(
],
'enabled' => [
'output_name' => 'Enabled',
'int' => 1,
'type' => 'checkbox',
'element_list' => array(1)
),
'dynamic' => array(
'element_list' => [1],
],
'dynamic' => [
'output_name' => 'Dynamic',
'int' => 1,
'type' => 'checkbox',
'element_list' => array(1)
),
'edit_query_string_id' => array(
'element_list' => [1],
],
'edit_query_string_id' => [
'type' => 'hidden',
'pk_id' => 1
)
) // elements
), // query_string element list
'edit_page_content' => array(
],
], // elements
], // query_string element list
'edit_page_content' => [
'output_name' => 'Page Content',
'delete_name' => 'remove_page_content',
'prefix' => 'epc',
'elements' => array(
'name' => array(
'elements' => [
'name' => [
'output_name' => 'Content',
'type' => 'text',
'error_check' => 'alphanumeric',
'mandatory' => 1
),
'uid' => array(
],
'uid' => [
'output_name' => 'UID',
'type' => 'text',
'error_check' => 'unique|alphanumeric',
'mandatory' => 1
),
'order_number' => array(
],
'order_number' => [
'output_name' => 'Order',
'type' => 'text',
'error_check' => 'int',
'mandatory' => 1
),
'online' => array(
],
'online' => [
'output_name' => 'Online',
'int' => 1,
'type' => 'checkbox',
'element_list' => array(1)
),
'edit_access_right_id' => array(
'element_list' => [1],
],
'edit_access_right_id' => [
'type' => 'drop_down_db',
'output_name' => 'Access Level',
'int' => 1,
'preset' => 1, // first of the select
'query' => "SELECT edit_access_right_id, name FROM edit_access_right ORDER BY level"
),
'edit_page_content_id' => array(
],
'edit_page_content_id' => [
'type' => 'hidden',
'pk_id' => 1
)
)
)
) // element list
);
],
],
],
], // element list
];
// __END__

View File

@@ -1,20 +1,20 @@
<?php declare(strict_types=1);
$edit_schemes = array(
'table_array' => array(
'edit_scheme_id' => array(
'value' => isset($GLOBALS['edit_scheme_id']) ? $GLOBALS['edit_scheme_id'] : '',
$edit_schemes = [
'table_array' => [
'edit_scheme_id' => [
'value' => $GLOBALS['edit_scheme_id'] ?? '',
'type' => 'hidden',
'pk' => 1
),
'name' => array(
'value' => isset($GLOBALS['name']) ? $GLOBALS['name'] : '',
],
'name' => [
'value' => $GLOBALS['name'] ?? '',
'output_name' => 'Scheme Name',
'mandatory' => 1,
'type' => 'text'
),
'header_color' => array(
'value' => isset($GLOBALS['header_color']) ? $GLOBALS['header_color'] : '',
],
'header_color' => [
'value' => $GLOBALS['header_color'] ?? '',
'output_name' => 'Header Color',
'mandatory' => 1,
'type' => 'text',
@@ -23,35 +23,35 @@ $edit_schemes = array(
'error_check' => 'custom',
'error_regex' => '/[\dA-Fa-f]{6}/',
'error_example' => 'F6A544'
),
'enabled' => array(
'value' => isset($GLOBALS['enabled']) ? $GLOBALS['enabled'] : '',
],
'enabled' => [
'value' => $GLOBALS['enabled'] ?? '',
'output_name' => 'Enabled',
'int' => 1,
'type' => 'binary',
'element_list' => array(
'element_list' => [
'1' => 'Yes',
'0' => 'No'
)
),
'template' => array(
'value' => isset($GLOBALS['template']) ? $GLOBALS['template'] : '',
],
],
'template' => [
'value' => $GLOBALS['template'] ?? '',
'output_name' => 'Template',
'type' => 'text'
)
),
],
],
'table_name' => 'edit_scheme',
'load_query' => "SELECT edit_scheme_id, name, enabled FROM edit_scheme ORDER BY name",
'show_fields' => array(
array(
'show_fields' => [
[
'name' => 'name'
),
array(
],
[
'name' => 'enabled',
'binary' => array('Yes', 'No'),
'binary' => ['Yes', 'No'],
'before_value' => 'Enabled: '
)
)
); // main array
],
],
]; // main array
// __END__

View File

@@ -1,270 +1,270 @@
<?php declare(strict_types=1);
$edit_users = array(
'table_array' => array(
'edit_user_id' => array(
'value' => isset($GLOBALS['edit_user_id']) ? $GLOBALS['edit_user_id'] : '',
$edit_users = [
'table_array' => [
'edit_user_id' => [
'value' => $GLOBALS['edit_user_id'] ?? '',
'type' => 'hidden',
'pk' => 1,
'int' => 1
),
'username' => array(
'value' => isset($GLOBALS['username']) ? $GLOBALS['username'] : '',
],
'username' => [
'value' => $GLOBALS['username'] ?? '',
'output_name' => 'Username',
'mandatory' => 1,
'error_check' => 'unique|alphanumericextended',
'type' => 'text'
),
'password' => array(
'value' => isset($GLOBALS['password']) ? $GLOBALS['password'] : '',
'HIDDEN_value' => isset($GLOBALS['HIDDEN_password']) ? $GLOBALS['HIDDEN_password'] : '',
'CONFIRM_value' => isset($GLOBALS['CONFIRM_password']) ? $GLOBALS['CONFIRM_password'] : '',
],
'password' => [
'value' => $GLOBALS['password'] ?? '',
'HIDDEN_value' => $GLOBALS['HIDDEN_password'] ?? '',
'CONFIRM_value' => $GLOBALS['CONFIRM_password'] ?? '',
'output_name' => 'Password',
'mandatory' => 1,
'type' => 'password', // later has to be password for encryption in database
'update' => array( // connected field updates, and update data
'password_change_date' => array( // db row to update
'update' => [ // connected field updates, and update data
'password_change_date' => [ // db row to update
'type' => 'date', // type of field (int/text/date/etc)
'value' => 'NOW()' // value [todo: complex reference
)
)
),
],
],
],
// password date when first insert and password is set, needs special field with connection to password
// password reset force interval, if set, user needs to reset password after X time period
'password_change_interval' => array(
'value' => isset($GLOBALS['password_change_interval']) ? $GLOBALS['password_change_interval'] : '',
'password_change_interval' => [
'value' => $GLOBALS['password_change_interval'] ?? '',
'output_name' => 'Password change interval',
'error_check' => 'intervalshort', // can be any date length format. n Y/M/D [not H/M/S], only one set, no combination
'type' => 'text',
'interval' => 1, // interval needs NULL write for empty
'size' => 5, // make it 5 chars long
'length' => 5
),
'enabled' => array(
'value' => isset($GLOBALS['enabled']) ? $GLOBALS['enabled'] : '',
],
'enabled' => [
'value' => $GLOBALS['enabled'] ?? '',
'output_name' => 'Enabled',
'type' => 'binary',
'int' => 1,
'element_list' => array(
'element_list' => [
'1' => 'Yes',
'0' => 'No'
)
),
'strict' => array(
'value' => isset($GLOBALS['strict']) ? $GLOBALS['strict'] : '',
],
],
'strict' => [
'value' => $GLOBALS['strict'] ?? '',
'output_name' => 'Strict (Lock after errors)',
'type' => 'binary',
'int' => 1,
'element_list' => array(
'element_list' => [
'1' => 'Yes',
'0' => 'No'
)
),
'locked' => array(
'value' => isset($GLOBALS['locked']) ? $GLOBALS['locked'] : '',
],
],
'locked' => [
'value' => $GLOBALS['locked'] ?? '',
'output_name' => 'Locked (auto set if strict with errors)',
'type' => 'binary',
'int' => 1,
'element_list' => array(
'element_list' => [
'1' => 'Yes',
'0' => 'No'
)
),
'admin' => array(
'value' => isset($GLOBALS['admin']) ? $GLOBALS['admin'] : '',
],
],
'admin' => [
'value' => $GLOBALS['admin'] ?? '',
'output_name' => 'Admin',
'type' => 'binary',
'int' => 1,
'element_list' => array(
'element_list' => [
'1' => 'Yes',
'0' => 'No'
)
),
'debug' => array(
'value' => isset($GLOBALS['debug']) ? $GLOBALS['debug'] : '',
],
],
'debug' => [
'value' => $GLOBALS['debug'] ?? '',
'output_name' => 'Debug',
'type' => 'binary',
'int' => 1,
'element_list' => array(
'element_list' => [
'1' => 'Yes',
'0' => 'No'
)
),
'db_debug' => array(
'value' => isset($GLOBALS['db_debug']) ? $GLOBALS['db_debug'] : '',
],
],
'db_debug' => [
'value' => $GLOBALS['db_debug'] ?? '',
'output_name' => 'DB Debug',
'type' => 'binary',
'int' => 1,
'element_list' => array(
'element_list' => [
'1' => 'Yes',
'0' => 'No'
)
),
'email' => array(
'value' => isset($GLOBALS['email']) ? $GLOBALS['email'] : '',
],
],
'email' => [
'value' => $GLOBALS['email'] ?? '',
'output_name' => 'E-Mail',
'type' => 'text',
'error_check' => 'email'
),
'last_name' => array(
'value' => isset($GLOBALS['last_name']) ? $GLOBALS['last_name'] : '',
],
'last_name' => [
'value' => $GLOBALS['last_name'] ?? '',
'output_name' => 'Last Name',
'type' => 'text'
),
'first_name' => array(
'value' => isset($GLOBALS['first_name']) ? $GLOBALS['first_name'] : '',
],
'first_name' => [
'value' => $GLOBALS['first_name'] ?? '',
'output_name' => 'First Name',
'type' => 'text'
),
'edit_language_id' => array(
'value' => isset($GLOBALS['edit_language_id']) ? $GLOBALS['edit_language_id'] : '',
],
'edit_language_id' => [
'value' => $GLOBALS['edit_language_id'] ?? '',
'output_name' => 'Language',
'mandatory' => 1,
'int' => 1,
'type' => 'drop_down_db',
'query' => "SELECT edit_language_id, long_name FROM edit_language WHERE enabled = 1 ORDER BY order_number"
),
'edit_scheme_id' => array(
'value' => isset($GLOBALS['edit_scheme_id']) ? $GLOBALS['edit_scheme_id'] : '',
],
'edit_scheme_id' => [
'value' => $GLOBALS['edit_scheme_id'] ?? '',
'output_name' => 'Scheme',
'int_null' => 1,
'type' => 'drop_down_db',
'query' => "SELECT edit_scheme_id, name FROM edit_scheme WHERE enabled = 1 ORDER BY name"
),
'edit_group_id' => array(
'value' => isset($GLOBALS['edit_group_id']) ? $GLOBALS['edit_group_id'] : '',
],
'edit_group_id' => [
'value' => $GLOBALS['edit_group_id'] ?? '',
'output_name' => 'Group',
'int' => 1,
'type' => 'drop_down_db',
'query' => "SELECT edit_group_id, name FROM edit_group WHERE enabled = 1 ORDER BY name",
'mandatory' => 1
),
'edit_access_right_id' => array(
'value' => isset($GLOBALS['edit_access_right_id']) ? $GLOBALS['edit_access_right_id'] : '',
],
'edit_access_right_id' => [
'value' => $GLOBALS['edit_access_right_id'] ?? '',
'output_name' => 'User Level',
'mandatory' => 1,
'int' => 1,
'type' => 'drop_down_db',
'query' => "SELECT edit_access_right_id, name FROM edit_access_right ORDER BY level"
),
'login_error_count' => array(
],
'login_error_count' => [
'output_name' => 'Login error count',
'value' => isset($GLOBALS['login_error_count']) ? $GLOBALS['login_error_count'] : '',
'value' => $GLOBALS['login_error_count'] ?? '',
'type' => 'view',
'empty' => '0'
),
'login_error_date_last' => array(
],
'login_error_date_last' => [
'output_name' => 'Last login error',
'value' => isset($GLOBALS['login_error_date_liast']) ? $GLOBALS['login_error_date_liast'] : '',
'value' => $GLOBALS['login_error_date_liast'] ?? '',
'type' => 'view',
'empty' => '-'
),
'login_error_date_first' => array(
],
'login_error_date_first' => [
'output_name' => 'First login error',
'value' => isset($GLOBALS['login_error_date_first']) ? $GLOBALS['login_error_date_first'] : '',
'value' => $GLOBALS['login_error_date_first'] ?? '',
'type' => 'view',
'empty' => '-'
),
'protected' => array(
'value' => isset($GLOBALS['protected']) ? $GLOBALS['protected'] : '',
],
'protected' => [
'value' => $GLOBALS['protected'] ?? '',
'output_name' => 'Protected',
'type' => 'binary',
'int' => 1,
'element_list' => array(
'element_list' => [
'1' => 'Yes',
'0' => 'No'
)
),
'additional_acl' => array(
'value' => isset($GLOBALS['additional_acl']) ? $GLOBALS['additional_acl'] : '',
],
],
'additional_acl' => [
'value' => $GLOBALS['additional_acl'] ?? '',
'output_name' => 'Additional ACL (as JSON)',
'type' => 'textarea',
'error_check' => 'json',
'rows' => 10,
'cols' => 60
),
),
],
],
'load_query' => "SELECT edit_user_id, username, enabled, debug, db_debug, strict, locked, login_error_count FROM edit_user ORDER BY username",
'table_name' => 'edit_user',
'show_fields' => array(
array(
'show_fields' => [
[
'name' => 'username'
),
array(
],
[
'name' => 'enabled',
'binary' => array('Yes', 'No'),
'binary' => ['Yes', 'No'],
'before_value' => 'Enabled: '
),
array(
],
[
'name' => 'debug',
'binary' => array('Yes', 'No'),
'binary' => ['Yes', 'No'],
'before_value' => 'Debug: '
),
array(
],
[
'name' => 'db_debug',
'binary' => array('Yes', 'No'),
'binary' => ['Yes', 'No'],
'before_value' => 'DB Debug: '
),
array(
],
[
'name' => 'strict',
'binary' => array('Yes', 'No'),
'binary' => ['Yes', 'No'],
'before_value' => 'Strict: '
),
array(
],
[
'name' => 'locked',
'binary' => array('Yes', 'No'),
'binary' => ['Yes', 'No'],
'before_value' => 'Locked: '
),
array(
],
[
'name' => 'login_error_count',
'before_value' => 'Errors: '
)
),
'element_list' => array(
'edit_access_user' => array(
],
],
'element_list' => [
'edit_access_user' => [
'output_name' => 'Accounts',
'mandatory' => 1,
'delete' => 0, // set then reference entries are deleted, else the 'enable' flag is only set
'prefix' => 'ecu',
'read_data' => array(
'read_data' => [
'table_name' => 'edit_access',
'pk_id' => 'edit_access_id',
'name' => 'name',
'order' => 'name'
),
'elements' => array(
'edit_access_user_id' => array(
],
'elements' => [
'edit_access_user_id' => [
'output_name' => 'Activate',
'type' => 'hidden',
'int' => 1,
'pk_id' => 1
),
'enabled' => array(
],
'enabled' => [
'type' => 'checkbox',
'output_name' => 'Activate',
'int' => 1,
'element_list' => array(1)
),
'edit_access_right_id' => array(
'element_list' => [1],
],
'edit_access_right_id' => [
'type' => 'drop_down_db',
'output_name' => 'Access Level',
'preset' => 1, // first of the select
'int' => 1,
'query' => "SELECT edit_access_right_id, name FROM edit_access_right ORDER BY level"
),
'edit_default' => array(
],
'edit_default' => [
'type' => 'radio_group',
'output_name' => 'Default',
'int' => 1,
'element_list' => 'radio_group'
),
'edit_access_id' => array(
],
'edit_access_id' => [
'type' => 'hidden',
'int' => 1
)
)
) // edit pages ggroup
)
);
],
],
], // edit pages ggroup
],
];
// __END__

View File

@@ -1,33 +1,33 @@
<?php declare(strict_types=1);
$edit_visible_group = array(
'table_array' => array(
'edit_visible_group_id' => array(
'value' => isset($GLOBALS['edit_visible_group_id']) ? $GLOBALS['edit_visible_group_id'] : '',
$edit_visible_group = [
'table_array' => [
'edit_visible_group_id' => [
'value' => $GLOBALS['edit_visible_group_id'] ?? '',
'type' => 'hidden',
'pk' => 1
),
'name' => array(
'value' => isset($GLOBALS['name']) ? $GLOBALS['name'] : '',
],
'name' => [
'value' => $GLOBALS['name'] ?? '',
'output_name' => 'Group name',
'mandatory' => 1,
'type' => 'text'
),
'flag' => array(
'value' => isset($GLOBALS['flag']) ? $GLOBALS['flag'] : '',
],
'flag' => [
'value' => $GLOBALS['flag'] ?? '',
'output_name' => 'Flag',
'mandatory' => 1,
'type' => 'text',
'error_check' => 'alphanumeric|unique'
)
),
],
],
'table_name' => 'edit_visible_group',
'load_query' => "SELECT edit_visible_group_id, name FROM edit_visible_group ORDER BY name",
'show_fields' => array(
array(
'show_fields' => [
[
'name' => 'name'
)
)
);
],
],
];
// __END__

View File

@@ -458,13 +458,13 @@ function formatBytesLong(bytes)
/**
* Convert a string with B/K/M/etc into a byte number
* @param {String} bytes Any string with B/K/M/etc
* @return {Number} A byte number, or original string as is
* @param {String|Number} bytes Any string with B/K/M/etc
* @return {String|Number} A byte number, or original string as is
*/
function stringByteFormat(bytes)
{
// early abort if this is a number already
if (!isNaN(bytes)) {
// if anything not string return
if (!(typeof bytes === 'string' || bytes instanceof String)) {
return bytes;
}
// for pow exponent list

View File

@@ -59,6 +59,8 @@
namespace CoreLibs\ACL;
use CoreLibs\Check\Password;
class Login extends \CoreLibs\DB\IO
{
private $euid; // the user id var
@@ -78,33 +80,33 @@ class Login extends \CoreLibs\DB\IO
private $pw_old_password;
private $pw_new_password;
private $pw_new_password_confirm;
private $pw_change_deny_users = array(); // array of users for which the password change is forbidden
private $pw_change_deny_users = []; // array of users for which the password change is forbidden
private $logout_target;
private $max_login_error_count = -1;
private $lock_deny_users = array();
private $lock_deny_users = [];
// if we have password change we need to define some rules
private $password_min_length = PASSWORD_MIN_LENGTH;
// max length is fixed as 255 (for input type max), if set highter, it will be set back to 255
private $password_max_length = PASSWORD_MAX_LENGTH;
// can have several regexes, if nothing set, all is ok
private $password_valid_chars = array(
private $password_valid_chars = [
// '^(?=.*\d)(?=.*[A-Za-z])[0-9A-Za-z!@#$%]{8,}$',
// '^(?.*(\pL)u)(?=.*(\pN)u)(?=.*([^\pL\pN])u).{8,}',
);
];
// all possible login error conditions
private $login_error_msg = array();
private $login_error_msg = [];
// this is an array holding all strings & templates passed from the outside (translation)
private $login_template = array(
'strings' => array(),
private $login_template = [
'strings' => [],
'password_change' => '',
'template' => ''
);
];
// acl vars
public $acl = array();
public $default_acl_list = array();
public $acl = [];
public $default_acl_list = [];
// login html, if we are on an ajax page
private $login_html = '';
private $login_is_ajax_page = false;
@@ -118,11 +120,11 @@ class Login extends \CoreLibs\DB\IO
*/
public function __construct(array $db_config)
{
// log login data for this class only
$this->log_per_class = 1;
// create db connection and init base class
parent::__construct($db_config);
// log login data for this class only
$this->log->setLogPer('class', true);
// set db special errors
if ($this->db_init_error === true) {
echo 'Could not connect to DB<br>';
// if I can't connect to the DB to auth exit hard. No access allowed
@@ -190,7 +192,7 @@ class Login extends \CoreLibs\DB\IO
// logout target (from config)
$this->logout_target = LOGOUT_TARGET;
// disallow user list for password change
$this->pw_change_deny_users = array('admin');
$this->pw_change_deny_users = ['admin'];
// set flag if password change is okay
if (defined('PASSWORD_CHANGE')) {
$this->password_change = PASSWORD_CHANGE;
@@ -202,18 +204,18 @@ class Login extends \CoreLibs\DB\IO
// max login counts before error reporting
$this->max_login_error_count = 10;
// users that never get locked, even if they are set strict
$this->lock_deny_users = array('admin');
$this->lock_deny_users = ['admin'];
// init default ACL list array
$_SESSION['DEFAULT_ACL_LIST'] = array();
$_SESSION['DEFAULT_ACL_LIST'] = [];
// read the current edit_access_right list into an array
$q = "SELECT level, type, name FROM edit_access_right WHERE level >= 0 ORDER BY level";
while ($res = $this->dbReturn($q)) {
// level to description format (numeric)
$this->default_acl_list[$res['level']] = array(
$this->default_acl_list[$res['level']] = [
'type' => $res['type'],
'name' => $res['name']
);
];
}
// write that into the session
$_SESSION['DEFAULT_ACL_LIST'] = $this->default_acl_list;
@@ -246,12 +248,13 @@ class Login extends \CoreLibs\DB\IO
// do something with possible debug data?
if (TARGET == 'live' || TARGET == 'remote') {
// login
$this->debug_output_all = DEBUG ? 1 : 0;
$this->echo_output_all = 0;
$this->print_output_all = DEBUG ? 1 : 0;
$this->log->setLogLevelAll('debug', DEBUG ? true : false);
$this->log->setLogLevelAll('echo', false);
$this->log->setLogLevelAll('print', DEBUG ? true : false);
}
$status_msg = $this->printErrorMsg();
if ($this->echo_output_all) {
$status_msg = $this->log->printErrorMsg();
// if ($this->echo_output_all) {
if ($this->log->getLogLevelAll('echo')) {
echo $status_msg;
}
// exit so we don't process anything further, at all
@@ -259,8 +262,8 @@ class Login extends \CoreLibs\DB\IO
} else {
// if we are on an ajax page reset any POST/GET array data to avoid
// any accidentical processing going on
$_POST = array();
$_GET = array();
$_POST = [];
$_GET = [];
// set the action to login so we can trigger special login html return
$_POST['action'] = 'login';
$_POST['login_html'] = $this->login_html;
@@ -299,6 +302,7 @@ class Login extends \CoreLibs\DB\IO
if (!$password) {
$password = $this->password;
}
// first, errors on missing encryption
if ((preg_match("/^\\$2(a|y)\\$/", $hash) && CRYPT_BLOWFISH != 1) ||
(preg_match("/^\\$1\\$/", $hash) && CRYPT_MD5 != 1) ||
(preg_match("/^\\$[0-9A-Za-z.]{12}$/", $hash) && CRYPT_STD_DES != 1)
@@ -306,22 +310,11 @@ class Login extends \CoreLibs\DB\IO
// this means password cannot be decrypted because of missing crypt methods
$this->login_error = 9999;
$password_ok = false;
} elseif ((preg_match("/^\\$2(a)\\$/", $hash) ||
// old password have $07$ so we check this
(preg_match("/^\\$2(y)\\$/", $hash) && preg_match("/\\$07\\$/", $hash)) ||
preg_match("/^\\$1\\$/", $hash) ||
preg_match("/^\\$[0-9A-Za-z.]{12}$/", $hash)) &&
/** @phan-suppress-next-line PhanDeprecatedFunction */
!$this->verifyCryptString($password, $hash)
) {
// check passwword as crypted, $2a$ or $2y$ is blowfish start, $1$ is MD5 start, $\w{12} is standard DES
// this is only for OLD $07$ password
$this->login_error = 1011;
$password_ok = false;
} elseif (preg_match("/^\\$2y\\$/", $hash) &&
!$this->passwordVerify($password, $hash)
!Password::passwordVerify($password, $hash)
) {
// this is the new password hash methid, is only $2y$
// all others are not valid anymore
$this->login_error = 1013;
$password_ok = false;
} elseif (!preg_match("/^\\$2(a|y)\\$/", $hash) &&
@@ -393,10 +386,10 @@ class Login extends \CoreLibs\DB\IO
// none to be set, set in login password check
} else {
// check if the current password is an invalid hash and do a rehash and set password
// $this->debug('LOGIN', 'Hash: '.$res['password'].' -> VERIFY: '.($this->passwordVerify($this->password, $res['password']) ? 'OK' : 'FAIL').' => HASH: '.($this->passwordRehashCheck($res['password']) ? 'NEW NEEDED' : 'OK'));
if ($this->passwordRehashCheck($res['password'])) {
// $this->debug('LOGIN', 'Hash: '.$res['password'].' -> VERIFY: '.($Password::passwordVerify($this->password, $res['password']) ? 'OK' : 'FAIL').' => HASH: '.(Password::passwordRehashCheck($res['password']) ? 'NEW NEEDED' : 'OK'));
if (Password::passwordRehashCheck($res['password'])) {
// update password hash to new one now
$q = "UPDATE edit_user SET password = '".$this->dbEscapeString($this->passwordSet($this->password))."' WHERE edit_user_id = ".$res['edit_user_id'];
$q = "UPDATE edit_user SET password = '".$this->dbEscapeString(Password::passwordSet($this->password))."' WHERE edit_user_id = ".$res['edit_user_id'];
$this->dbExec($q);
}
// normal user processing
@@ -428,9 +421,9 @@ class Login extends \CoreLibs\DB\IO
$q .= "WHERE edit_user_id = ".$res['edit_user_id'];
$this->dbExec($q);
}
$edit_page_ids = array();
$pages = array();
$pages_acl = array();
$edit_page_ids = [];
$pages = [];
$pages_acl = [];
// set pages access
$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, ";
@@ -446,7 +439,7 @@ class Login extends \CoreLibs\DB\IO
// page id array for sub data readout
$edit_page_ids[$res['edit_page_id']] = $res['cuid'];
// create the array for pages
$pages[$res['cuid']] = array(
$pages[$res['cuid']] = [
'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
@@ -461,9 +454,9 @@ class Login extends \CoreLibs\DB\IO
'online' => $res['online'],
'acl_level' => $res['level'],
'acl_type' => $res['type'],
'query' => array(),
'visible' => array()
);
'query' => [],
'visible' => []
];
// make reference filename -> level
$pages_acl[$res['filename']] = $res['level'];
} // for each page
@@ -482,11 +475,11 @@ class Login extends \CoreLibs\DB\IO
$q .= "WHERE enabled = 1 AND edit_page_id IN (".join(', ', array_keys($edit_page_ids)).") ";
$q .= "ORDER BY eqs.edit_page_id";
while ($res = $this->dbReturn($q)) {
$pages[$edit_page_ids[$res['edit_page_id']]]['query'][] = array(
$pages[$edit_page_ids[$res['edit_page_id']]]['query'][] = [
'name' => $res['name'],
'value' => $res['value'],
'dynamic' => $res['dynamic']
);
];
}
// get the page content and add them to the page
$_edit_page_id = 0;
@@ -496,7 +489,7 @@ class Login extends \CoreLibs\DB\IO
$q .= "epc.edit_page_id IN (".join(', ', array_keys($edit_page_ids)).") ";
$q .= "ORDER BY epc.order_number";
while ($res = $this->dbReturn($q)) {
$pages[$edit_page_ids[$res['edit_page_id']]]['content'][$res['uid']] = array(
$pages[$edit_page_ids[$res['edit_page_id']]]['content'][$res['uid']] = [
'name' => $res['name'],
'uid' => $res['uid'],
'online' => $res['online'],
@@ -504,7 +497,7 @@ class Login extends \CoreLibs\DB\IO
// access name and level
'acl_type' => $res['type'],
'acl_level' => $res['level']
);
];
}
// write back the pages data to the output array
$_SESSION['PAGES'] = $pages;
@@ -515,18 +508,18 @@ class Login extends \CoreLibs\DB\IO
$q .= "WHERE eau.edit_access_id = ea.edit_access_id AND eau.edit_access_right_id = ear.edit_access_right_id ";
$q .= "AND eau.enabled = 1 AND edit_user_id = ".$this->euid." ";
$q .= "ORDER BY ea.name";
$unit_access = array();
$eauid = array();
$unit_acl = array();
$unit_access = [];
$eauid = [];
$unit_acl = [];
while ($res = $this->dbReturn($q)) {
// read edit access data fields and drop them into the unit access array
$q_sub ="SELECT name, value FROM edit_access_data WHERE enabled = 1 AND edit_access_id = ".$res['edit_access_id'];
$ea_data = array();
$ea_data = [];
while ($res_sub = $this->dbReturn($q_sub)) {
$ea_data[$res_sub['name']] = $res_sub['value'];
}
// build master unit array
$unit_access[$res['edit_access_id']] = array(
$unit_access[$res['edit_access_id']] = [
'id' => $res['edit_access_id'],
'acl_level' => $res['level'],
'acl_type' => $res['type'],
@@ -535,7 +528,7 @@ class Login extends \CoreLibs\DB\IO
'color' => $res['color'],
'default' => $res['edit_default'],
'data' => $ea_data
);
];
// set the default unit
if ($res['edit_default']) {
$_SESSION['UNIT_DEFAULT'] = $res['edit_access_id'];
@@ -636,24 +629,6 @@ class Login extends \CoreLibs\DB\IO
}
}
// METHOD: loginSetAcl
// WAS : login_set_acl
// PARAMS: none
// RETURN: none
// DESC : sets all the basic ACLs
// init set the basic acl the user has, based on the following rules
// * init set from config DEFAULT ACL
// * if page ACL is set, it overrides the default ACL
// * if group ACL is set, it overrides the page ACL
// * if user ACL is set, it overrides the group ACL
// set the page ACL
// * default ACL set
// * set group ACL if not default overrides default ACL
// * set page ACL if not default overrides group ACL
// set edit access ACL and set default edit access group
// * if an account ACL is set, set this parallel, account ACL overrides user ACL if it applies
// * if edit access ACL level is set, use this, else use page
// set all base ACL levels as a list keyword -> ACL number
/**
* sets all the basic ACLs
* init set the basic acl the user has, based on the following rules
@@ -729,13 +704,13 @@ class Login extends \CoreLibs\DB\IO
}
}
// detail name/level set
$this->acl['unit_detail'][$ea_id] = array(
$this->acl['unit_detail'][$ea_id] = [
'name' => $unit['name'],
'uid' => $unit['uid'],
'level' => $this->default_acl_list[$this->acl['unit'][$ea_id]]['name'],
'default' => $unit['default'],
'data' => $unit['data']
);
];
// set default
if ($unit['default']) {
$this->acl['unit_id'] = $unit['id'];
@@ -887,7 +862,7 @@ class Login extends \CoreLibs\DB\IO
// no error change this users password
if (!$this->login_error && $edit_user_id) {
// update the user (edit_user_id) with the new password
$q = "UPDATE edit_user SET password = '".$this->dbEscapeString($this->passwordSet($this->pw_new_password))."' WHERE edit_user_id = ".$edit_user_id;
$q = "UPDATE edit_user SET password = '".$this->dbEscapeString(Password::passwordSet($this->pw_new_password))."' WHERE edit_user_id = ".$edit_user_id;
$this->dbExec($q);
$data = 'Password change for user "'.$this->pw_username.'"';
$this->password_change_ok = true;
@@ -1013,7 +988,7 @@ class Login extends \CoreLibs\DB\IO
*/
private function loginSetTemplates(): void
{
$strings = array(
$strings = [
'HTML_TITLE' => $this->l->__('LOGIN'),
'TITLE' => $this->l->__('LOGIN'),
'USERNAME' => $this->l->__('Username'),
@@ -1022,9 +997,9 @@ class Login extends \CoreLibs\DB\IO
'ERROR_MSG' => '',
'LOGOUT_TARGET' => '',
'PASSWORD_CHANGE_BUTTON_VALUE' => $this->l->__('Change Password')
);
];
$error_msgs = array(
$error_msgs = [
'100' => $this->l->__('Fatal Error: <b>[EUID] came in as GET/POST!</b>'), // actually obsolete
'1010' => $this->l->__('Fatal Error: <b>Login Failed - Wrong Username or Password</b>'), // user not found
'1011' => $this->l->__('Fatal Error: <b>Login Failed - Wrong Username or Password</b>'), // blowfish password wrong
@@ -1043,11 +1018,11 @@ class Login extends \CoreLibs\DB\IO
'205' => $this->l->__('Fatal Error: <b>Password change - The new password is not in a valid format</b>'), // we should also not here WHAT is valid
'300' => $this->l->__('Success: <b>Password change successful</b>'), // for OK password change
'9999' => $this->l->__('Fatal Error: <b>necessary crypt engine could not be found</b>. Login is impossible') // this is bad bad error
);
];
// if password change is okay
if ($this->password_change) {
$strings = array_merge($strings, array(
$strings = array_merge($strings, [
'TITLE_PASSWORD_CHANGE' => 'Change Password for User',
'OLD_PASSWORD' => $this->l->__('Old Password'),
'NEW_PASSWORD' => $this->l->__('New Password'),
@@ -1055,7 +1030,7 @@ class Login extends \CoreLibs\DB\IO
'CLOSE' => $this->l->__('Close'),
'JS_SHOW_HIDE' => "function ShowHideDiv(id) { element = document.getElementById(id); if (element.className == 'visible' || !element.className) element.className = 'hidden'; else element.className = 'visible'; }",
'PASSWORD_CHANGE_BUTTON' => '<input type="button" name="pw_change" value="'.$strings['PASSWORD_CHANGE_BUTTON_VALUE'].'" OnClick="ShowHideDiv(\'pw_change_div\');">'
));
]);
$this->login_template['password_change'] = <<<EOM
<div id="pw_change_div" class="hidden" style="position: absolute; top: 30px; left: 50px; width: 400px; height: 220px; background-color: white; border: 1px solid black; padding: 25px;">
<table>
@@ -1074,11 +1049,11 @@ EOM;
if ($this->password_forgot) {
}
if (!$this->password_change && !$this->password_forgot) {
$strings = array_merge($strings, array(
$strings = array_merge($strings, [
'JS_SHOW_HIDE' => '',
'PASSWORD_CHANGE_BUTTON' => '',
'PASSWORD_CHANGE_DIV' => ''
));
]);
}
// first check if all strings are set from outside, if not, set with default ones
@@ -1179,13 +1154,13 @@ EOM;
} else {
$this->action = '';
}
$_data_binary = array(
$_data_binary = [
'_SESSION' => $_SESSION,
'_GET' => $_GET,
'_POST' => $_POST,
'_FILES' => $_FILES,
'error' => $this->login_error
);
];
$data_binary = $this->dbEscapeBytea(bzcompress(serialize($_data_binary)));
// SQL querie for log entry
$q = "INSERT INTO edit_log ";
@@ -1194,9 +1169,9 @@ EOM;
$q .= "action, action_id, action_yes, action_flag, action_menu, action_loaded, action_value, action_error) ";
$q .= "VALUES ('".$this->dbEscapeString($username)."', 'PASSWORD', ".($this->euid ? $this->euid : 'NULL').", ";
$q .= "NOW(), '".$this->dbEscapeString($event)."', '".$this->dbEscapeString((string)$error)."', '".$this->dbEscapeString($data)."', '".$data_binary."', '".$this->page_name."', ";
foreach (array(
foreach ([
'REMOTE_ADDR', 'HTTP_USER_AGENT', 'HTTP_REFERER', 'SCRIPT_FILENAME', 'QUERY_STRING', 'SERVER_NAME', 'HTTP_HOST', 'HTTP_ACCEPT', 'HTTP_ACCEPT_CHARSET', 'HTTP_ACCEPT_ENCODING'
) as $server_code) {
] as $server_code) {
if (array_key_exists($server_code, $_SERVER)) {
$q .= "'".$this->dbEscapeString($_SERVER[$server_code])."', ";
} else {

View File

@@ -27,10 +27,10 @@ namespace CoreLibs\Admin;
class Backend extends \CoreLibs\DB\IO
{
// page name
public $menu = array();
public $menu = [];
public $menu_show_flag = 0; // top menu flag (mostly string)
// action ids
public $action_list = array('action', 'action_id', 'action_sub_id', 'action_yes', 'action_flag', 'action_menu', 'action_value', 'action_error', 'action_loaded');
public $action_list = ['action', 'action_id', 'action_sub_id', 'action_yes', 'action_flag', 'action_menu', 'action_value', 'action_error', 'action_loaded'];
public $action;
public $action_id;
public $action_sub_id;
@@ -41,14 +41,14 @@ class Backend extends \CoreLibs\DB\IO
public $action_value;
public $action_error;
// ACL array variable if we want to set acl data from outisde
public $acl = array();
public $acl = [];
public $default_acl;
// queue key
public $queue_key;
// the current active edit access id
public $edit_access_id;
// error/warning/info messages
public $messages = array();
public $messages = [];
public $error = 0;
public $warning = 0;
public $info = 0;
@@ -88,7 +88,7 @@ class Backend extends \CoreLibs\DB\IO
// queue key
if (preg_match("/^(add|save|delete|remove|move|up|down|push_live)$/", $this->action)) {
$this->queue_key = $this->randomKeyGen(3);
$this->queue_key = \CoreLibs\Create\RandomKey::randomKeyGen(3);
}
}
@@ -221,9 +221,9 @@ class Backend extends \CoreLibs\DB\IO
// get the session pages array
$PAGES = $_SESSION['PAGES'] ?? null;
if (!isset($PAGES) || !is_array($PAGES)) {
$PAGES = array();
$PAGES = [];
}
$pages = array();
$pages = [];
foreach ($PAGES as $PAGE_CUID => $PAGE_DATA) {
$pages[] = $PAGE_DATA;
}
@@ -297,7 +297,7 @@ class Backend extends \CoreLibs\DB\IO
// if page name matchs -> set selected flag
$selected = 0;
if (isset($data['filename']) &&
$this->getPageName() == $data['filename'] &&
\CoreLibs\Get\System::getPageName() == $data['filename'] &&
(!isset($data['hostname']) || (
isset($data['hostname']) &&
(!$data['hostname'] || strstr($data['hostname'], CONTENT_PATH) !== false)
@@ -314,14 +314,14 @@ class Backend extends \CoreLibs\DB\IO
$enabled = 1;
}
// write in to view menu array
array_push($this->menu, array(
array_push($this->menu, [
'name' => $this->l->__($name),
'url' => $url,
'selected' => $selected,
'enabled' => $enabled,
'popup' => $type == 'popup' ? 1 : 0,
'type' => $type
));
]);
} // show page
} // online and in menu
} // for each page
@@ -355,11 +355,12 @@ class Backend extends \CoreLibs\DB\IO
* @param string|int|bool $key key
* @param string|int|bool $value value
* @return array associative array
* @deprecated \CoreLibs\Combined\ArrayHandler::genAssocArray()
*/
public function adbAssocArray(array $db_array, $key, $value): array
{
trigger_error('Method '.__METHOD__.' is deprecated', E_USER_DEPRECATED);
return $this->genAssocArray($db_array, $key, $value);
trigger_error('Method '.__METHOD__.' is deprecated: \CoreLibs\Combined\ArrayHandler::genAssocArray', E_USER_DEPRECATED);
return \CoreLibs\Combined\ArrayHandler::genAssocArray($db_array, $key, $value);
}
/**
@@ -367,11 +368,12 @@ class Backend extends \CoreLibs\DB\IO
* converts bytes into formated string with KB, MB, etc
* @param string|int|float $number string or int or number
* @return string formatted string
* @deprecated \CoreLibs\Convert\Byte::humanReadableByteFormat()
*/
public function adbByteStringFormat($number): string
{
trigger_error('Method '.__METHOD__.' is deprecated', E_USER_DEPRECATED);
return $this->humanReadableByteFormat($number);
trigger_error('Method '.__METHOD__.' is deprecated: \CoreLibs\Convert\Byte::humanReadableByteFormat()', E_USER_DEPRECATED);
return \CoreLibs\Convert\Byte::humanReadableByteFormat($number);
}
/**
@@ -383,11 +385,12 @@ class Backend extends \CoreLibs\DB\IO
* @param string $dummy empty, or file_type to show an icon instead of nothing if file is not found
* @param string $path if source start is not ROOT path, if empty ROOT is choosen
* @return string|bool thumbnail name, or false for error
* @deprecated \CoreLibs\Output\Image::createThumbnail()
*/
public function adbCreateThumbnail($pic, $size_x, $size_y, $dummy = '', $path = "", $cache = "")
{
trigger_error('Method '.__METHOD__.' is deprecated', E_USER_DEPRECATED);
return $this->createThumbnail($pic, $size_x, $size_y, $dummy, $path, $cache);
trigger_error('Method '.__METHOD__.' is deprecated: \CoreLibs\Output\Image::createThumbnail()', E_USER_DEPRECATED);
return \CoreLibs\Output\Image::createThumbnail($pic, $size_x, $size_y, $dummy, $path, $cache);
}
/**
@@ -397,15 +400,15 @@ class Backend extends \CoreLibs\DB\IO
* @param array $vars optional data for a possible printf formated msg
* @return void has no return
*/
public function adbMsg(string $level, string $msg, array $vars = array()): void
public function adbMsg(string $level, string $msg, array $vars = []): void
{
if (!preg_match("/^info|warning|error$/", $level)) {
$level = "info";
}
$this->messages[] = array(
$this->messages[] = [
'msg' => vsprintf($this->l->__($msg), $vars),
'class' => $level
);
];
switch ($level) {
case 'info':
$this->info = 1;
@@ -487,13 +490,13 @@ class Backend extends \CoreLibs\DB\IO
bool $name_pos_back = false
) {
// get the build layout
$html_time = $this->printDateTime($year, $month, $day, $hour, $min, $suffix, $min_steps, $name_pos_back);
$html_time = \CoreLibs\Output\Form\Elements::printDateTime($year, $month, $day, $hour, $min, $suffix, $min_steps, $name_pos_back);
// translate the strings inside
foreach (array('Year ', 'Month ', 'Day ', 'Hour ', 'Minute ') as $_time) {
foreach (['Year ', 'Month ', 'Day ', 'Hour ', 'Minute '] as $_time) {
$html_time = str_replace($_time, $this->l->__(str_replace(' ', '', $_time)).' ', $html_time);
}
// replace week days in short
foreach (array('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun') as $_date) {
foreach (['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] as $_date) {
$html_time = str_replace('('.$_date.')', '('.$this->l->__($_date).')', $html_time);
}
// return the datetime select string with strings translated

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,160 @@
<?php declare(strict_types=1);
namespace CoreLibs\Check;
class Email
{
// this is for error check parts in where the email regex failed
private static $email_regex_check = [
0 => "^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]{1,})*\.([a-zA-Z]{2,}){1}$", // MASTER
1 => "@(.*)@(.*)", // double @
2 => "^[A-Za-z0-9!#$%&'*+-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+-\/=?^_`{|}~\.]{0,63}@", // wrong part before @
3 => "@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]{1,})*\.([a-zA-Z]{2,}){1}$", // wrong part after @
4 => "@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]{1,})*\.", // wrong domain name part
5 => "\.([a-zA-Z]{2,6}){1}$", // wrong top level part
6 => "@(.*)\.{2,}", // double .. in domain name part
7 => "@.*\.$" // ends with a dot, top level, domain missing
];
// the array with the mobile types that are valid
private static $mobile_email_type = [
'.*@docomo\.ne\.jp$' => 'keitai_docomo',
'.*@([a-z0-9]{2}\.)?ezweb\.ne\.jp$' => 'keitai_kddi_ezweb', # correct are a[2-4], b2, c[1-9], e[2-9], h[2-4], t[1-9]
'.*@(ez[a-j]{1}\.)?ido\.ne\.jp$' => 'keitai_kddi_ido', # ez[a-j] or nothing
'.*@([a-z]{2}\.)?sky\.tu-ka\.ne\.jp$' => 'keitai_kddi_tu-ka', # (sky group)
'.*@([a-z]{2}\.)?sky\.tk[kc]{1}\.ne\.jp$' => 'keitai_kddi_sky', # (sky group) [tkk,tkc only]
'.*@([a-z]{2}\.)?sky\.dtg\.ne\.jp$' => 'keitai_kddi_dtg', # dtg (sky group)
'.*@[tkdhcrnsq]{1}\.vodafone\.ne\.jp$' => 'keitai_softbank_vodafone', # old vodafone [t,k,d,h,c,r,n,s,q]
'.*@jp-[dhtkrsnqc]{1}\.ne\.jp$' => 'keitai_softbank_j-phone', # very old j-phone (pre vodafone) [d,h,t,k,r,s,n,q,c]
'.*@([dhtcrknsq]{1}\.)?softbank\.ne\.jp$' => 'keitai_softbank', # add i for iphone also as keitai, others similar to the vodafone group
'.*@i{1}\.softbank(\.ne)?\.jp$' => 'smartphone_softbank_iphone', # add iPhone also as keitai and not as pc
'.*@disney\.ne\.jp$' => 'keitai_softbank_disney', # (kids)
'.*@willcom\.ne\.jp$' => 'keitai_willcom',
'.*@willcom\.com$' => 'keitai_willcom', # new for pdx.ne.jp address
'.*@willcom\.com$' => 'keitai_willcom', # new for pdx.ne.jp address
'.*@wcm\.ne\.jp$' => 'keitai_willcom', # old willcom wcm.ne.jp
'.*@pdx\.ne\.jp$' => 'keitai_willcom_pdx', # old pdx address for willcom
'.*@bandai\.jp$' => 'keitai_willcom_bandai', # willcom paipo! (kids)
'.*@pipopa\.ne\.jp$' => 'keitai_willcom_pipopa', # willcom paipo! (kids)
'.*@([a-z0-9]{2,4}\.)?pdx\.ne\.jp$' => 'keitai_willcom_pdx', # actually only di,dj,dk,wm -> all others are "wrong", but none also allowed?
'.*@ymobile([1]{1})?\.ne\.jp$' => 'keitai_willcom_ymobile', # ymobile, ymobile1 techincally not willcom, but I group them there (softbank sub)
'.*@y-mobile\.ne\.jp$' => 'keitai_willcom_ymobile', # y-mobile techincally not willcom, but I group them there (softbank sub)
'.*@emnet\.ne\.jp$' => 'keitai_willcom_emnet', # e-mobile, group will willcom
'.*@emobile\.ne\.jp$' => 'keitai_willcom_emnet', # e-mobile, group will willcom
'.*@emobile-s\.ne\.jp$' => 'keitai_willcom_emnet' # e-mobile, group will willcom
];
// short list for mobile email types
private static $mobile_email_type_short = [
'keitai_docomo' => 'docomo',
'keitai_kddi_ezweb' => 'kddi',
'keitai_kddi' => 'kddi',
'keitai_kddi_tu-ka' => 'kddi',
'keitai_kddi_sky' => 'kddi',
'keitai_softbank' => 'softbank',
'smartphone_softbank_iphone' => 'iphone',
'keitai_softbank_disney' => 'softbank',
'keitai_softbank_vodafone' => 'softbank',
'keitai_softbank_j-phone' => 'softbank',
'keitai_willcom' => 'willcom',
'keitai_willcom_pdx' => 'willcom',
'keitai_willcom_bandai' => 'willcom',
'keitai_willcom_pipopa' => 'willcom',
'keitai_willcom_ymobile' => 'willcom',
'keitai_willcom_emnet' => 'willcom',
'pc_html' => 'pc',
// old sets -> to be removed later
'docomo' => 'docomo',
'kddi_ezweb' => 'kddi',
'kddi' => 'kddi',
'kddi_tu-ka' => 'kddi',
'kddi_sky' => 'kddi',
'softbank' => 'softbank',
'keitai_softbank_iphone' => 'iphone',
'softbank_iphone' => 'iphone',
'softbank_disney' => 'softbank',
'softbank_vodafone' => 'softbank',
'softbank_j-phone' => 'softbank',
'willcom' => 'willcom',
'willcom_pdx' => 'willcom',
'willcom_bandai' => 'willcom',
'willcom_pipopa' => 'willcom',
'willcom_ymobile' => 'willcom',
'willcom_emnet' => 'willcom',
'pc' => 'pc'
];
/**
* Undocumented function
*
* @param int $type Which position in the regex list to get
* if not set or not valid get default pos 0
* @return string
*/
public static function getEmailRegex(int $type = 0): string
{
// make sure type is in valid range
if ($type < 0 || $type >= count(self::$email_regex_check)) {
$type = 0;
}
return self::$email_regex_check[$type];
}
/**
* get the full check array
* this will be deprected at some point
*
* @return array
*/
public static function getEmailRegexCheck(): array
{
return self::$email_regex_check;
}
/**
* guesses the email type (mostly for mobile) from the domain
* if second is set to true, it will return short naming scheme (only provider)
* @param string $email email string
* @param bool $short default false, if true, returns only short type (pc instead of pc_html)
* @return string|bool email type, eg "pc", "docomo", etc, false for invalid short type
*/
public static function getEmailType(string $email, bool $short = false)
{
// trip if there is no email address
if (!$email) {
return 'invalid';
}
// loop until we match a mobile type, return this first found type
foreach (self::$mobile_email_type as $email_regex => $email_type) {
if (preg_match("/$email_regex/", $email)) {
if ($short) {
return self::getShortEmailType($email_type);
} else {
return $email_type;
}
}
}
// if no previous return we assume this is a pc address
if ($short) {
return 'pc';
} else {
return 'pc_html';
}
}
/**
* gets the short email type from a long email type
* @param string $email_type email string
* @return string|bool short string or false for invalid
*/
public static function getShortEmailType(string $email_type)
{
// check if the short email type exists
if (isset(self::$mobile_email_type_short[$email_type])) {
return self::$mobile_email_type_short[$email_type];
} else {
// return false on not found
return false;
}
}
}
// __END__

View File

@@ -0,0 +1,48 @@
<?php declare(strict_types=1);
/*
* various file/file name functions
*/
namespace CoreLibs\Check;
class File
{
/**
* quick return the extension of the given file name
* @param string $filename file name
* @return string extension of the file name
*/
public static function getFilenameEnding(string $filename): string
{
$page_temp = pathinfo($filename);
return $page_temp['extension'] ?? '';
}
/**
* 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;
}
}
// __END__

View File

@@ -0,0 +1,86 @@
<?php declare(strict_types=1);
/*
* Converts a json string to array and stores error for later checking
* can also return empty array on demand
* and self set json as is on error as array
*/
namespace CoreLibs\Check;
class Jason
{
private static $json_last_error;
/**
* converts a json string to an array
* or inits an empty array on null string
* or failed convert to array
* In ANY case it will ALWAYS return array.
* Does not throw errors
* @param string|null $json a json string, or null data
* @param bool $override if set to true, then on json error
* set original value as array
* @return array returns an array from the json values
*/
public static function jsonConvertToArray(?string $json, bool $override = false): array
{
if ($json !== null) {
$_json = json_decode($json, true);
if (self::$json_last_error = json_last_error()) {
if ($override == true) {
// init return as array with original as element
$json = [$json];
} else {
$json = [];
}
} else {
$json = $_json;
}
} else {
$json = [];
}
// be sure that we return an array
return (array)$json;
}
/**
* [jsonGetLastError description]
* @param bool|boolean $return_string [default=false] if set to true
* it will return the message string and not
* the error number
* @return int|string Either error number (0 for no error)
* or error string ('' for no error)
*/
public static function jsonGetLastError(bool $return_string = false)
{
$json_error_string = '';
// valid errors as of php 8.0
switch (self::$json_last_error) {
case JSON_ERROR_NONE:
$json_error_string = '';
break;
case JSON_ERROR_DEPTH:
$json_error_string = 'Maximum stack depth exceeded';
break;
case JSON_ERROR_STATE_MISMATCH:
$json_error_string = 'Underflow or the modes mismatch';
break;
case JSON_ERROR_CTRL_CHAR:
$json_error_string = 'Unexpected control character found';
break;
case JSON_ERROR_SYNTAX:
$json_error_string = 'Syntax error, malformed JSON';
break;
case JSON_ERROR_UTF8:
$json_error_string = 'Malformed UTF-8 characters, possibly incorrectly encoded';
break;
default:
$json_error_string = 'Unknown error';
break;
}
return $return_string === true ? $json_error_string : self::$json_last_error;
}
}
// __END__

View File

@@ -0,0 +1,57 @@
<?php declare(strict_types=1);
/*
* core password set, check and rehash check wrapper functions
*/
namespace CoreLibs\Check;
class Password
{
/**
* creates the password hash
* @param string $password password
* @return string hashed password
*/
public static function passwordSet(string $password): string
{
// always use the PHP default for the password
// password options ca be set in the password init, but should be kept as default
return password_hash($password, PASSWORD_DEFAULT);
}
/**
* checks if the entered password matches the hash
* @param string $password password
* @param string $hash password hash
* @return bool true or false
*/
public static function passwordVerify(string $password, string $hash): bool
{
if (password_verify($password, $hash)) {
return true;
} else {
return false;
}
// in case something strange, return false on default
return false;
}
/**
* checks if the password needs to be rehashed
* @param string $hash password hash
* @return bool true or false
*/
public static function passwordRehashCheck(string $hash): bool
{
if (password_needs_rehash($hash, PASSWORD_DEFAULT)) {
return true;
} else {
return false;
}
// in case of strange, force re-hash
return true;
}
}
// __END__

View File

@@ -0,0 +1,55 @@
<?php declare(strict_types=1);
namespace CoreLibs\Check;
class PhpVersion
{
/**
* checks if running PHP version matches given PHP version (min or max)
* @param string $min_version minimum version as string (x, x.y, x.y.x)
* @param string $max_version optional maximum version as string (x, x.y, x.y.x)
* @return bool true if ok, false if not matching version
*/
public static function checkPHPVersion(string $min_version, string $max_version = ''): bool
{
// exit with false if the min/max strings are wrong
if (!preg_match("/^\d{1}(\.\d{1})?(\.\d{1,2})?$/", $min_version)) {
return false;
}
// max is only chcked if it is set
if ($max_version && !preg_match("/^\d{1}(\.\d{1})?(\.\d{1,2})?$/", $max_version)) {
return false;
}
// split up the version strings to calc the compare number
$version = explode('.', $min_version);
$min_version = (int)$version[0] * 10000 + (int)($version[1] ?? 0) * 100 + (int)($version[2] ?? 0);
if ($max_version) {
$version = explode('.', $max_version);
$max_version = (int)$version[0] * 10000 + (int)($version[1] ?? 0) * 100 + (int)($version[2] ?? 0);
// drop out if min is bigger max, equal size is okay, that would be only THIS
if ($min_version > $max_version) {
return false;
}
}
// set the php version id
if (!defined('PHP_VERSION_ID')) {
$version = explode('.', phpversion());
// creates something like 50107
define('PHP_VERSION_ID', (int)$version[0] * 10000 + (int)$version[1] * 100 + (int)$version[2]);
}
// check if matching for version
if ($min_version && !$max_version) {
if (PHP_VERSION_ID >= $min_version) {
return true;
}
} elseif ($min_version && $max_version) {
if (PHP_VERSION_ID >= $min_version && PHP_VERSION_ID <= $max_version) {
return true;
}
}
// if no previous return, fail
return false;
}
}
// __END__

View File

@@ -0,0 +1,343 @@
<?php declare(strict_types=1);
/*
* html convert functions
*/
namespace CoreLibs\Combined;
class ArrayHandler
{
/**
* searches key = value in an array / array
* only returns the first one found
* @param string|int $needle needle (search for)
* @param array $haystack haystack (search in)
* @param string|null $key_lookin the key to look out for, default empty
* @return array array with the elements where the needle can be
* found in the haystack array
*/
public static function arraySearchRecursive($needle, array $haystack, ?string $key_lookin = null): array
{
$path = [];
if (!is_array($haystack)) {
$haystack = [];
}
if ($key_lookin != null &&
!empty($key_lookin) &&
array_key_exists($key_lookin, $haystack) &&
$needle === $haystack[$key_lookin]
) {
$path[] = $key_lookin;
} else {
foreach ($haystack as $key => $val) {
if (is_scalar($val) &&
$val === $needle &&
empty($key_lookin)
) {
$path[] = $key;
break;
} elseif (is_scalar($val) &&
!empty($key_lookin) &&
$key === $key_lookin &&
$val == $needle
) {
$path[] = $key;
break;
} elseif (is_array($val) &&
$path = self::arraySearchRecursive(
$needle,
(array)$val,
// to avoid PhanTypeMismatchArgumentNullable
($key_lookin === null ? $key_lookin : (string)$key_lookin)
)
) {
array_unshift($path, $key);
break;
}
}
}
return $path;
}
/**
* recursive array search function, which returns all found not only the first one
* @param string|int $needle needle (search for)
* @param array $haystack haystack (search in)
* @param string|int $key the key to look for in
* @param array|null $path recursive call for previous path
* @return ?array all array elements paths where the element was found
*/
public static function arraySearchRecursiveAll($needle, array $haystack, $key, ?array $path = null): ?array
{
// init if not set on null
if ($path === null) {
$path = [
'level' => 0,
'work' => []
];
}
// init sub sets if not set
if (!isset($path['level'])) {
$path['level'] = 0;
}
if (!isset($path['work'])) {
$path['work'] = [];
}
// should not be needed because it would trigger a php mehtod error
if (!is_array($haystack)) {
$haystack = [];
}
// @phan HACK
$path['level'] = $path['level'] ?? 0;
// go through the array,
foreach ($haystack as $_key => $_value) {
if (is_scalar($_value) && $_value == $needle && !$key) {
// only value matches
$path['work'][$path['level']] = $_key;
$path['found'][] = $path['work'];
} elseif (is_scalar($_value) && $_value == $needle && $_key == $key) {
// key and value matches
$path['work'][$path['level']] = $_key;
$path['found'][] = $path['work'];
} elseif (is_array($_value)) {
// add position to working
$path['work'][$path['level']] = $_key;
// we will up a level
$path['level'] += 1;
// call recursive
$path = self::arraySearchRecursiveAll($needle, $_value, $key, $path);
}
}
// @phan HACK
$path['level'] = $path['level'] ?? 0;
$path['work'] = $path['work'] ?? [];
// cut all that is >= level
array_splice($path['work'], $path['level']);
// step back a level
$path['level'] -= 1;
return $path;
}
/**
* array search simple. looks for key, value combination, if found, returns true
* @param array $array array(search in)
* @param string|int $key key (key to search in)
* @param string|int $value value (what to find)
* @return bool true on found, false on not found
*/
public static function arraySearchSimple(array $array, $key, $value): bool
{
if (!is_array($array)) {
$array = [];
}
foreach ($array as $_key => $_value) {
// if value is an array, we search
if (is_array($_value)) {
// call recursive, and return result if it is true, else continue
if (($result = self::arraySearchSimple($_value, $key, $value)) !== false) {
return $result;
}
} elseif ($_key == $key && $_value == $value) {
return true;
}
}
// no true returned, not found
return false;
}
/**
* correctly recursive merges as an array as array_merge_recursive just glues things together
* array first array to merge
* array second array to merge
* ... etc
* bool key flag: true: handle keys as string or int
* default false: all keys are string
* @return array|bool merged array
*/
public static function arrayMergeRecursive()
{
// croak on not enough arguemnts (we need at least two)
if (func_num_args() < 2) {
trigger_error(__FUNCTION__ .' needs two or more array arguments', E_USER_WARNING);
return false;
}
// default key is not string
$key_is_string = false;
$arrays = func_get_args();
// if last is not array, then assume it is trigger for key is always string
if (!is_array(end($arrays))) {
if (array_pop($arrays)) {
$key_is_string = true;
}
}
// check that arrays count is at least two, else we don't have enough to do anything
if (count($arrays) < 2) {
trigger_error(__FUNCTION__.' needs two or more array arguments', E_USER_WARNING);
return false;
}
$merged = [];
while ($arrays) {
$array = array_shift($arrays);
if (!is_array($array)) {
trigger_error(__FUNCTION__ .' encountered a non array argument', E_USER_WARNING);
return false;
}
if (!$array) {
continue;
}
foreach ($array as $key => $value) {
// if string or if key is assumed to be string do key match else add new entry
if (is_string($key) || $key_is_string === false) {
if (is_array($value) && array_key_exists($key, $merged) && is_array($merged[$key])) {
// $merged[$key] = call_user_func(__METHOD__, $merged[$key], $value, $key_is_string);
$merged[$key] = self::arrayMergeRecursive($merged[$key], $value, $key_is_string);
} else {
$merged[$key] = $value;
}
} else {
$merged[] = $value;
}
}
}
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)
* @param array $needle elements to search for
* @param array $haystack array where the $needle elements should be searched int
* @return array|bool either the found elements or false for nothing found or error
*/
public static function inArrayAny(array $needle, array $haystack)
{
if (!is_array($needle)) {
return false;
}
if (!is_array($haystack)) {
return false;
}
$found = [];
foreach ($needle as $element) {
if (in_array($element, $haystack)) {
$found[] = $element;
}
}
if (count($found) == 0) {
return false;
} else {
return $found;
}
}
/**
* creates out of a normal db_return array an assoc array
* @param array $db_array return array from the database
* @param string|int|bool $key key set, false for not set
* @param string|int|bool $value value set, false for not set
* @param bool $set_only flag to return all (default), or set only
* @return array associative array
*/
public static function genAssocArray(array $db_array, $key, $value, bool $set_only = false): array
{
$ret_array = [];
// do this to only run count once
for ($i = 0, $iMax = count($db_array); $i < $iMax; $i ++) {
// if no key then we make an order reference
if ($key !== false &&
$value !== false &&
(($set_only && $db_array[$i][$value]) || (!$set_only))
) {
$ret_array[$db_array[$i][$key]] = $db_array[$i][$value];
} elseif ($key === false && $value !== false) {
$ret_array[] = $db_array[$i][$value];
} elseif ($key !== false && $value === false) {
$ret_array[$db_array[$i][$key]] = $i;
}
}
return $ret_array;
}
/**
* converts multi dimensional array to a flat array
* does NOT preserve keys
* @param array $array ulti dimensionial array
* @return array flattened array
*/
public static function flattenArray(array $array): array
{
$return = [];
array_walk_recursive(
$array,
function ($value) use (&$return) {
$return[] = $value;
}
);
return $return;
}
/**
* will loop through an array recursivly and write the array keys back
* @param array $array multidemnsional array to flatten
* @return array flattened keys array
*/
public static function flattenArrayKey(array $array): array
{
$return = [];
array_walk_recursive(
$array,
function ($value, $key) use (&$return) {
$return[] = $key;
}
);
return $return;
}
/**
* searches for key -> value in an array tree and writes the value one level up
* this will remove this leaf will all other values
* @param array $array array(nested)
* @param string|int $search key to find that has no sub leaf and will be pushed up
* @return array modified, flattened array
*/
public static function arrayFlatForKey(array $array, $search): array
{
if (!is_array($array)) {
$array = [];
}
foreach ($array as $key => $value) {
// if it is not an array do just nothing
if (is_array($value)) {
// probe it has search key
if (isset($value[$search])) {
// set as current
$array[$key] = $value[$search];
} else {
// call up next node down
// $array[$key] = call_user_func(__METHOD__, $value, $search);
$array[$key] = self::arrayFlatForKey($value, $search);
}
}
}
return $array;
}
}
// __END__

View File

@@ -0,0 +1,289 @@
<?php declare(strict_types=1);
/*
* image thumbnail, rotate, etc
*/
namespace CoreLibs\Combined;
class DateTime
{
/**
* a simple wrapper for the date format
* @param int|float $timestamp unix timestamp
* @param bool $show_micro show the micro time (default false)
* @return string formated date+time in Y-M-D h:m:s ms
*/
public static function dateStringFormat($timestamp, bool $show_micro = false): string
{
// split up the timestamp, assume . in timestamp
// array pad $ms if no microtime
list ($timestamp, $ms) = array_pad(explode('.', (string)round($timestamp, 4)), 2, null);
$string = date("Y-m-d H:i:s", (int)$timestamp);
if ($show_micro && $ms) {
$string .= ' '.$ms.'ms';
}
return $string;
}
/**
* formats a timestamp into interval, not into a date
* @param string|int|float $timestamp interval in seconds and optional float micro seconds
* @param bool $show_micro show micro seconds, default true
* @return string interval formatted string or string as is
*/
public static function timeStringFormat($timestamp, bool $show_micro = true): string
{
// check if the timestamp has any h/m/s/ms inside, if yes skip
if (!preg_match("/(h|m|s|ms)/", (string)$timestamp)) {
list($timestamp, $ms) = array_pad(explode('.', (string)round($timestamp, 4)), 2, null);
// if negative remember
$negative = false;
if ((int)$timestamp < 0) {
$negative = true;
}
$timestamp = abs((float)$timestamp);
$timegroups = [86400, 3600, 60, 1];
$labels = ['d', 'h', 'm', 's'];
$time_string = '';
// 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) ? ' ' : '');
}
}
}
// 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';
}
}
if ($negative) {
$time_string = '-'.$time_string;
}
} else {
$time_string = $timestamp;
}
return $time_string;
}
/**
* does a reverse of the TimeStringFormat and converts the string from
* xd xh xm xs xms to a timestamp.microtime format
* @param string|int|float $timestring formatted interval
* @return string|int|float converted float interval, or string as is
*/
public static function stringToTime($timestring)
{
$timestamp = 0;
if (preg_match("/(d|h|m|s|ms)/", $timestring)) {
// pos for preg match read + multiply factor
$timegroups = [2 => 86400, 4 => 3600, 6 => 60, 8 => 1];
$matches = [];
// if start with -, strip and set negative
$negative = false;
if (preg_match("/^-/", $timestring)) {
$negative = true;
$timestring = substr($timestring, 1);
}
// preg match: 0: full string
// 2, 4, 6, 8 are the to need values
preg_match("/^((\d+)d ?)?((\d+)h ?)?((\d+)m ?)?((\d+)s ?)?((\d+)ms)?$/", $timestring, $matches);
// multiply the returned matches and sum them up. the last one (ms) is added with .
foreach ($timegroups as $i => $time_multiply) {
if (isset($matches[$i]) && is_numeric($matches[$i])) {
$timestamp += (float)$matches[$i] * $time_multiply;
}
}
if (isset($matches[10]) && is_numeric($matches[10])) {
$timestamp .= '.'.$matches[10];
}
if ($negative) {
$timestamp *= -1;
}
return $timestamp;
} else {
return $timestring;
}
}
/**
* splits & checks date, wrap around for check_date function
* @param string $date a date string in the format YYYY-MM-DD
* @return bool true if valid date, false if date not valid
*/
public static function checkDate($date): bool
{
if (!$date) {
return false;
}
list ($year, $month, $day) = array_pad(preg_split("/[\/-]/", $date), 3, null);
if (!$year || !$month || !$day) {
return false;
}
if (!checkdate((int)$month, (int)$day, (int)$year)) {
return false;
}
return true;
}
/**
* splits & checks date, wrap around for check_date function
* @param string $datetime date (YYYY-MM-DD) + time (HH:MM:SS), SS can be dropped
* @return bool true if valid date, false if date not valid
*/
public static function checkDateTime($datetime): bool
{
if (!$datetime) {
return false;
}
list ($year, $month, $day, $hour, $min, $sec) = array_pad(preg_split("/[\/\- :]/", $datetime), 6, null);
if (!$year || !$month || !$day) {
return false;
}
if (!checkdate((int)$month, (int)$day, (int)$year)) {
return false;
}
if (!is_numeric($hour) || !is_numeric($min)) {
return false;
}
if (($hour < 0 || $hour > 24) ||
($min < 0 || $min > 60) ||
(is_numeric($sec) && ($sec < 0 || $sec > 60))
) {
return false;
}
return true;
}
/**
* plits & checks date, wrap around for check_date function
* returns int in:
* -1 if the first date is smaller the last
* 0 if both are equal
* 1 if the first date is bigger than the last
* false (bool): error
* @param string $start_date start date string in YYYY-MM-DD
* @param string $end_date end date string in YYYY-MM-DD
* @return int|bool false on error, or int -1/0/1 as difference
*/
public static function compareDate($start_date, $end_date)
{
// pre check for empty or wrong
if ($start_date == '--' || $end_date == '--' || !$start_date || !$end_date) {
return false;
}
// splits the data up with / or -
list ($start_year, $start_month, $start_day) = array_pad(preg_split('/[\/-]/', $start_date), 3, null);
list ($end_year, $end_month, $end_day) = array_pad(preg_split('/[\/-]/', $end_date), 3, null);
// check that month & day are two digits and then combine
foreach (array('start', 'end') as $prefix) {
foreach (array('month', 'day') as $date_part) {
$_date = $prefix.'_'.$date_part;
if (isset($$_date) && $$_date < 10 && !preg_match("/^0/", $$_date)) {
$$_date = '0'.$$_date;
}
}
$_date = $prefix.'_date';
$$_date = '';
foreach (array('year', 'month', 'day') as $date_part) {
$_sub_date = $prefix.'_'.$date_part;
$$_date .= $$_sub_date;
}
}
// now do the compare
if ($start_date < $end_date) {
return -1;
} elseif ($start_date == $end_date) {
return 0;
} elseif ($start_date > $end_date) {
return 1;
}
}
/**
* compares the two dates + times. if seconds missing in one set, add :00, converts / to -
* returns int/bool in:
* -1 if the first date is smaller the last
* 0 if both are equal
* 1 if the first date is bigger than the last
* false if no valid date/times chould be found
* @param string $start_datetime start date/time in YYYY-MM-DD HH:mm:ss
* @param string $end_datetime end date/time in YYYY-MM-DD HH:mm:ss
* @return int|bool false for error or -1/0/1 as difference
*/
public static function compareDateTime($start_datetime, $end_datetime)
{
// pre check for empty or wrong
if ($start_datetime == '--' || $end_datetime == '--' || !$start_datetime || !$end_datetime) {
return false;
}
$start_timestamp = strtotime($start_datetime);
$end_timestamp = strtotime($end_datetime);
if ($start_timestamp < $end_timestamp) {
return -1;
} elseif ($start_timestamp == $end_timestamp) {
return 0;
} elseif ($start_timestamp > $end_timestamp) {
return 1;
}
}
/**
* calculates the days between two dates
* return: overall days, week days, weekend days as array 0...2 or named
* as overall, weekday and weekend
* @param string $start_date valid start date (y/m/d)
* @param string $end_date valid end date (y/m/d)
* @param bool $return_named return array type, false (default), true for named
* @return array 0/overall, 1/weekday, 2/weekend
*/
public static function calcDaysInterval($start_date, $end_date, bool $return_named = false): array
{
// pos 0 all, pos 1 weekday, pos 2 weekend
$days = array();
$start = new \DateTime($start_date);
$end = new \DateTime($end_date);
// so we include the last day too, we need to add +1 second in the time
$end->setTime(0, 0, 1);
$days[0] = $end->diff($start)->days;
$days[1] = 0;
$days[2] = 0;
$period = new \DatePeriod($start, new \DateInterval('P1D'), $end);
foreach ($period as $dt) {
$curr = $dt->format('D');
if ($curr == 'Sat' || $curr == 'Sun') {
$days[2] ++;
} else {
$days[1] ++;
}
}
if ($return_named === true) {
return array(
'overall' => $days[0],
'weekday' => $days[1],
'weekend' => $days[2]
);
} else {
return $days;
}
}
}
// __END__

View File

@@ -0,0 +1,142 @@
<?php declare(strict_types=1);
/*
* image thumbnail, rotate, etc
*/
namespace CoreLibs\Convert;
class Byte
{
// define byteFormat
const BYTE_FORMAT_NOSPACE = 1;
const BYTE_FORMAT_ADJUST = 2;
const BYTE_FORMAT_SI = 4;
/**
* 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 ? ' ' : '').($labels[$exp] ?? '>E').($si ? 'i' : '').'B';
$bytes_calc = $abs_bytes / pow($unit, $exp);
// if original is negative, reverse
if ($bytes < 0) {
$bytes_calc *= -1;
}
if ($adjust) {
return sprintf("%.2f%s", $bytes_calc, $pre);
} else {
return round($bytes_calc, 2).$pre;
}
} else {
// if anything other return as string
return (string)$bytes;
}
}
/**
* calculates the bytes based on a string with nnG, nnGB, nnM, etc
* NOTE: large exabyte numbers will overflow
* flag allowed:
* BYTE_FORMAT_SI [3] use si standard 1000 instead of bytes 1024
* @param string|int|float $number any string or number to convert
* @param int $flags bitwise flag with use space turned on
* @return string|int|float converted value or original value
*/
public static function stringByteFormat($number, int $flags = 0)
{
// use SI 1000 mod and not 1024 mod
if ($flags & self::BYTE_FORMAT_SI) {
$si = true;
} else {
$si = false;
}
// matches in regex
$matches = [];
// all valid units
$valid_units_ = 'bkmgtpezy';
// detects up to exo bytes
preg_match("/([\d.,]*)\s?(eib|pib|tib|gib|mib|kib|eb|pb|tb|gb|mb|kb|e|p|t|g|m|k|b)$/i", strtolower($number), $matches);
if (isset($matches[1]) && isset($matches[2])) {
// remove all non valid characters from the number
$number = preg_replace('/[^0-9\.]/', '', $matches[1]);
// final clean up and convert to float
$number = (float)trim($number);
// convert any mb/gb/etc to single m/b
$unit = preg_replace('/[^bkmgtpezy]/i', '', $matches[2]);
if ($unit) {
$number = $number * pow($si ? 1000 : 1024, stripos($valid_units_, $unit[0]));
}
// convert to INT to avoid +E output
$number = (int)round($number);
}
// if not matching return as is
return $number;
}
}
// __END__

View File

@@ -0,0 +1,304 @@
<?php declare(strict_types=1);
/*
* Convert color spaces
* hex to rgb
* rgb to hex
* rgb to hsb
* hsb to rgb
* rgb to hsl
* hsl to rgb
*/
namespace CoreLibs\Convert;
class Colors
{
/**
* converts a hex RGB color to the int numbers
* @param string $hexStr RGB hexstring
* @param bool $returnAsString flag to return as string
* @param string $seperator string seperator: default: ","
* @return string|array|bool false on error or array with RGB or a string with the seperator
*/
public static function hex2rgb(string $hexStr, bool $returnAsString = false, string $seperator = ',')
{
$hexStr = preg_replace("/[^0-9A-Fa-f]/", '', $hexStr); // Gets a proper hex string
$rgbArray = array();
if (strlen($hexStr) == 6) {
// If a proper hex code, convert using bitwise operation. No overhead... faster
$colorVal = hexdec($hexStr);
$rgbArray['R'] = 0xFF & ($colorVal >> 0x10);
$rgbArray['G'] = 0xFF & ($colorVal >> 0x8);
$rgbArray['B'] = 0xFF & $colorVal;
} elseif (strlen($hexStr) == 3) {
// If shorthand notation, need some string manipulations
$rgbArray['R'] = hexdec(str_repeat(substr($hexStr, 0, 1), 2));
$rgbArray['G'] = hexdec(str_repeat(substr($hexStr, 1, 1), 2));
$rgbArray['B'] = hexdec(str_repeat(substr($hexStr, 2, 1), 2));
} else {
// Invalid hex color code
return false;
}
// returns the rgb string or the associative array
return $returnAsString ? implode($seperator, $rgbArray) : $rgbArray;
}
/**
* converts the rgb values from int data to the valid rgb html hex string
* optional can turn of leading #
* @param int $red red 0-255
* @param int $green green 0-255
* @param int $blue blue 0-255
* @param bool $hex_prefix default true, prefix with "#"
* @return string rgb in hex values with leading # if set
*/
public static function rgb2hex(int $red, int $green, int $blue, bool $hex_prefix = true): string
{
$hex_color = '';
if ($hex_prefix === true) {
$hex_color = '#';
}
foreach (array('red', 'green', 'blue') as $color) {
// if not valid, set to gray
if ($$color < 0 || $$color > 255) {
$$color = 125;
}
// pad left with 0
$hex_color .= str_pad(dechex($$color), 2, '0', STR_PAD_LEFT);
}
return $hex_color;
}
/**
* converts RGB to HSB/V values
* returns:
* array with hue (0-360), sat (0-100%), brightness/value (0-100%)
* @param int $red red 0-255
* @param int $green green 0-255
* @param int $blue blue 0-255
* @return array Hue, Sat, Brightness/Value
*/
public static function rgb2hsb(int $red, int $green, int $blue): array
{
// check that rgb is from 0 to 255
foreach (array('red', 'green', 'blue') as $c) {
if ($$c < 0 || $$c > 255) {
$$c = 0;
}
$$c = $$c / 255;
}
$MAX = max($red, $green, $blue);
$MIN = min($red, $green, $blue);
$HUE = 0;
if ($MAX == $MIN) {
return array(0, 0, round($MAX * 100));
}
if ($red == $MAX) {
$HUE = ($green - $blue) / ($MAX - $MIN);
} elseif ($green == $MAX) {
$HUE = 2 + (($blue - $red) / ($MAX - $MIN));
} elseif ($blue == $MAX) {
$HUE = 4 + (($red - $green) / ($MAX - $MIN));
}
$HUE *= 60;
if ($HUE < 0) {
$HUE += 360;
}
return array(
(int)round($HUE),
(int)round((($MAX - $MIN) / $MAX) * 100),
(int)round($MAX * 100)
);
}
/**
* converts HSB/V to RGB values RGB is full INT
* @param int $H hue 0-360
* @param int $S saturation 0-100 (int)
* @param int $V brightness/value 0-100 (int)
* @return array 0 red/1 green/2 blue array as 0-255
*/
public static function hsb2rgb(int $H, int $S, int $V): array
{
// check that H is 0 to 359, 360 = 0
// and S and V are 0 to 1
if ($H < 0 || $H > 359) {
$H = 0;
}
if ($S < 0 || $S > 100) {
$S = 0;
}
if ($V < 0 || $V > 100) {
$V = 0;
}
// convert to internal 0-1 format
$S /= 100;
$V /= 100;
if ($S == 0) {
return array($V * 255, $V * 255, $V * 255);
}
$Hi = floor($H / 60);
$f = ($H / 60) - $Hi;
$p = $V * (1 - $S);
$q = $V * (1 - ($S * $f));
$t = $V * (1 - ($S * (1 - $f)));
switch ($Hi) {
case 0:
$red = $V;
$green = $t;
$blue = $p;
break;
case 1:
$red = $q;
$green = $V;
$blue = $p;
break;
case 2:
$red = $p;
$green = $V;
$blue = $t;
break;
case 3:
$red = $p;
$green = $q;
$blue = $V;
break;
case 4:
$red = $t;
$green = $p;
$blue = $V;
break;
case 5:
$red = $V;
$green = $p;
$blue = $q;
break;
default:
$red = 0;
$green = 0;
$blue = 0;
}
return array(
(int)round($red * 255),
(int)round($green * 255),
(int)round($blue * 255)
);
}
/**
* converts a RGB (0-255) to HSL
* return:
* array with hue (0-360), saturation (0-100%) and luminance (0-100%)
* @param int $red red 0-255
* @param int $green green 0-255
* @param int $blue blue 0-255
* @return array hue/sat/luminance
*/
public static function rgb2hsl(int $red, int $green, int $blue): array
{
// check that rgb is from 0 to 255
foreach (array('red', 'green', 'blue') as $c) {
if ($$c < 0 || $$c > 255) {
$$c = 0;
}
$$c = $$c / 255;
}
$min = min($red, $green, $blue);
$max = max($red, $green, $blue);
$chroma = $max - $min;
$sat = 0;
$hue = 0;
// luminance
$lum = ($max + $min) / 2;
// achromatic
if ($chroma == 0) {
// H, S, L
return [0.0, 0.0, round($lum * 100, 1)];
} else {
$sat = $chroma / (1 - abs(2 * $lum - 1));
if ($max == $red) {
$hue = fmod((($green - $blue) / $chroma), 6);
if ($hue < 0) {
$hue = (6 - fmod(abs($hue), 6));
}
} elseif ($max == $green) {
$hue = ($blue - $red) / $chroma + 2;
} elseif ($max == $blue) {
$hue = ($red - $green) / $chroma + 4;
}
$hue = $hue * 60;
// $sat = 1 - abs(2 * $lum - 1);
return [
round($hue, 1),
round($sat * 100, 1),
round($lum * 100, 1)
];
}
}
/**
* converts an HSL to RGB
* @param int $hue hue: 0-360 (degrees)
* @param float $sat saturation: 0-100
* @param float $lum luminance: 0-100
* @return array red/blue/green 0-255 each
*/
public static function hsl2rgb(int $hue, float $sat, float $lum): array
{
if ($hue < 0 || $hue > 359) {
$hue = 0;
}
if ($sat < 0 || $sat > 100) {
$sat = 0;
}
if ($lum < 0 || $lum > 100) {
$lum = 0;
}
$hue = (1 / 360) * $hue; // calc to internal convert value for hue
// convert to internal 0-1 format
$sat /= 100;
$lum /= 100;
// if saturation is 0
if ($sat == 0) {
return array($lum * 255, $lum * 255, $lum * 255);
} else {
$m2 = $lum < 0.5 ? $lum * ($sat + 1) : ($lum + $sat) - ($lum * $sat);
$m1 = $lum * 2 - $m2;
$hueue = function ($base) use ($m1, $m2) {
// base = hue, hue > 360 (1) - 360 (1), else < 0 + 360 (1)
$base = $base < 0 ? $base + 1 : ($base > 1 ? $base - 1 : $base);
// 6: 60, 2: 180, 3: 240
// 2/3 = 240
// 1/3 = 120 (all from 360)
if ($base * 6 < 1) {
return $m1 + ($m2 - $m1) * $base * 6;
}
if ($base * 2 < 1) {
return $m2;
}
if ($base * 3 < 2) {
return $m1 + ($m2 - $m1) * ((2 / 3) - $base) * 6;
}
return $m1;
};
return array(
(int)round(255 * $hueue($hue + (1 / 3))),
(int)round(255 * $hueue($hue)),
(int)round(255 * $hueue($hue - (1 / 3)))
);
}
}
}
// __END__

View File

@@ -0,0 +1,60 @@
<?php declare(strict_types=1);
/*
* html convert functions
*/
namespace CoreLibs\Convert;
class Html
{
/**
* full wrapper for html entities
* @param mixed $string string to html encode
* @return mixed if string, encoded, else as is (eg null)
*/
public static function htmlent($string)
{
if (is_string($string)) {
return htmlentities($string, ENT_COMPAT|ENT_HTML401, 'UTF-8', false);
} else {
return $string;
}
}
/**
* strips out all line breaks or replaced with given string
* @param string $string string
* @param string $replace replace character, default ' '
* @return string cleaned string without any line breaks
*/
public static function removeLB(string $string, string $replace = ' '): string
{
return str_replace(array("\r", "\n"), $replace, $string);
}
/**
* returns 'checked' or 'selected' if okay
* $needle is a var, $haystack an array or a string
* **** THE RETURN: VALUE WILL CHANGE TO A DEFAULT NULL IF NOT FOUND ****
* @param array|string $haystack (search in) haystack can be an array or a string
* @param string $needle needle (search for)
* @param int $type type: 0: returns selected, 1, returns checked
* @return ?string returns checked or selected, else returns null
*/
public static function checked($haystack, $needle, int $type = 0): ?string
{
if (is_array($haystack)) {
if (in_array((string)$needle, $haystack)) {
return $type ? 'checked' : 'selected';
}
} else {
if ($haystack == $needle) {
return $type ? 'checked' : 'selected';
}
}
return null;
}
}
// __END__

View File

@@ -0,0 +1,51 @@
<?php declare(strict_types=1);
/*
* various math related function wrappers
*/
namespace CoreLibs\Convert;
class Math
{
/**
* some float numbers will be rounded up even if they have no decimal entries
* this function fixes this by pre-rounding before calling ceil
* @param float $number number to round
* @param int|integer $precision intermediat round up decimals (default 10)
* @return float correct ceil number
*/
public static function fceil(float $number, int $precision = 10): float
{
return ceil(round($number, $precision));
}
/**
* round inside an a number, not the decimal part only
* eg 48767 with -2 -> 48700
* @param float $number number to round
* @param int $precision negative number for position in number (default -2)
* @return float rounded number
*/
public static function floorp(float $number, int $precision = -2): float
{
$mult = pow(10, $precision); // Can be cached in lookup table
return floor($number * $mult) / $mult;
}
/**
* inits input to 0, if value is not numeric
* @param string|int|float $number string or number to check
* @return float if not number, then returns 0, else original input
*/
public static function initNumeric($number): float
{
if (!is_numeric($number)) {
return 0;
} else {
return (float)$number;
}
}
}
// __END__

View File

@@ -0,0 +1,76 @@
<?php declare(strict_types=1);
/*
* Translates a mime id string into the actual application or file name
* for example 'text/plain' will output 'Text file'
*/
namespace CoreLibs\Convert;
class MimeAppName
{
private static $mime_apps = [];
/**
* constructor: init mime list
*/
public function __construct()
{
self::$mime_apps = [
// zip
'application/zip' => 'Zip File',
// Powerpoint
'application/vnd.ms-powerpoint' => 'Microsoft Powerpoint',
'application/vnd.openxmlformats-officedocument.presentationml.presentation' => 'Microsoft Powerpoint',
// PDF
'pplication/pdf' => 'PDF',
// JPEG
'image/jpeg' => 'JPEG',
// PNG
'image/png' => 'PNG',
// Indesign
'application/x-indesign' => 'Adobe InDesign',
// Photoshop
'image/vnd.adobe.photoshop' => 'Adobe Photoshop',
'application/photoshop' => 'Adobe Photoshop',
// Illustrator
'application/illustrator' => 'Adobe Illustrator',
// Word
'application/vnd.ms-word' => 'Microsoft Word',
'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => 'Microsoft Word',
// Excel
'application/vnd.ms-excel' => 'Microsoft Excel',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => 'Microsoft Excel',
// plain text
'text/plain' => 'Text file',
// html
'text/html' => 'HTML',
// mp4 (max 45MB each)
'video/mpeg' => 'MPEG Video'
];
}
/**
* Sets or updates a mime type
* @param string $mime MIME Name, no validiation
* @param string $app Applicaiton name
* @return void
*/
public static function mimeSetAppName(string $mime, string $app): void
{
self::$mime_apps[$mime] = $app;
}
/**
* get the application name from mime type
* if not set returns "Other file"
* @param string $mime MIME Name
* @return string Application name matching
*/
public static function mimeGetAppName(string $mime): string
{
return self::$mime_apps[$mime] ?? 'Other file';
}
}
// __END__

View File

@@ -0,0 +1,72 @@
<?php declare(strict_types=1);
/*
* hash wrapper functions for old problem fixes
*/
namespace CoreLibs\Create;
class Hash
{
/**
* checks php version and if >=5.2.7 it will flip the string
* @param string $string string to crc
* @return string crc32b hash (old type)
*/
public static function __crc32b(string $string): string
{
// do normal hash crc32b
$string = hash('crc32b', $string);
// if bigger than 5.2.7, we need to "unfix" the fix
if (\CoreLibs\Check\PhpVersion::checkPHPVersion('5.2.7')) {
// flip it back to old (two char groups)
$string = preg_replace("/^([a-z0-9]{2})([a-z0-9]{2})([a-z0-9]{2})([a-z0-9]{2})$/", "$4$3$2$1", $string);
}
return $string;
}
/**
* replacement for __crc32b call
* @param string $string string to hash
* @param bool $use_sha use sha instead of crc32b (default false)
* @return string hash of the string
*/
public static function __sha1Short(string $string, bool $use_sha = false): string
{
if ($use_sha) {
// return only the first 9 characters
return substr(hash('sha1', $string), 0, 9);
} else {
return self::__crc32b($string);
}
}
/**
* replacemend for __crc32b call (alternate)
* defaults to adler 32
* allowed adler32, fnv132, fnv1a32, joaat
* all that create 8 char long hashes
* @param string $string string to hash
* @param string $hash_type hash type (default adler32)
* @return string hash of the string
*/
public static function __hash(string $string, string $hash_type = 'adler32'): string
{
if (!in_array($hash_type, ['adler32', 'fnv132', 'fnv1a32', 'joaat'])) {
$hash_type = 'adler32';
}
return hash($hash_type, $string);
}
/**
* create a unique id with the standard hash type defined in __hash
*
* @return string Unique ID with fixed length of 8 characters
*/
public static function __uniqId(): string
{
return self::__hash(uniqid((string)rand(), true));
}
}
// __END__

View File

@@ -0,0 +1,106 @@
<?php declare(strict_types=1);
/*
* html convert functions
*/
namespace CoreLibs\Create;
class RandomKey
{
// key generation
private static $key_range = [];
private static $one_key_length;
private static $key_length = 4; // default key length
private static $max_key_length = 256; // max allowed length
/**
* if launched as class, init random key data first
*/
public function __construct()
{
$this->initRandomKeyData();
}
/**
* sets the random key range with the default values
* @return void has no return
*/
private static function initRandomKeyData()
{
// random key generation
self::$key_range = array_merge(range('A', 'Z'), range('a', 'z'), range('0', '9'));
self::$one_key_length = count(self::$key_range);
}
/**
* validates they key length for random string generation
* @param int $key_length key length
* @return bool true for valid, false for invalid length
*/
private static function validateRandomKeyLenght(int $key_length): bool
{
if (is_numeric($key_length) &&
$key_length > 0 &&
$key_length <= self::$max_key_length
) {
return true;
} else {
return false;
}
}
/**
* sets the key length and checks that they key given is valid
* if failed it will not change the default key length and return false
* @param int $key_length key length
* @return bool true/false for set status
*/
public static function setRandomKeyLength(int $key_length): bool
{
// only if valid int key with valid length
if (self::validateRandomKeyLenght($key_length) === true) {
self::$key_length = $key_length;
return true;
} else {
return false;
}
}
/**
* get the current set random key length
*
* @return int Current set key length
*/
public static function getRandomKeyLength(): int
{
return self::$key_length;
}
/**
* creates a random key based on the key_range with key_length
* if override key length is set, it will check on valid key and use this
* this will not set the class key length variable
* @param int $key_length key length override, -1 for use default
* @return string random key
*/
public static function randomKeyGen(int $key_length = -1): string
{
// init random key strings if not set
if (!is_numeric(self::$one_key_length)) {
self::initRandomKeyData();
}
$use_key_length = 0;
// only if valid int key with valid length
if (self::validateRandomKeyLenght($key_length) === true) {
$use_key_length = $key_length;
} else {
$use_key_length = self::$key_length;
}
$pieces = [];
for ($i = 1; $i <= $use_key_length; $i ++) {
$pieces[] = self::$key_range[random_int(0, self::$one_key_length - 1)];
}
return join('', $pieces);
}
}

View File

@@ -0,0 +1,66 @@
<?php declare(strict_types=1);
namespace CoreLibs\Create;
class Uids
{
/**
* creates psuedo random uuid v4
* Code take from class here:
* https://www.php.net/manual/en/function.uniqid.php#94959
* @return string pseudo random uuid v4
*/
public static function uuidv4(): string
{
return sprintf(
'%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
// 32 bits for "time_low"
mt_rand(0, 0xffff),
mt_rand(0, 0xffff),
// 16 bits for "time_mid"
mt_rand(0, 0xffff),
// 16 bits for "time_hi_and_version",
// four most significant bits holds version number 4
mt_rand(0, 0x0fff) | 0x4000,
// 16 bits, 8 bits for "clk_seq_hi_res",
// 8 bits for "clk_seq_low",
// two most significant bits holds zero and one for variant DCE1.1
mt_rand(0, 0x3fff) | 0x8000,
// 48 bits for "node"
mt_rand(0, 0xffff),
mt_rand(0, 0xffff),
mt_rand(0, 0xffff)
);
}
/**
* 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 static 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;
}
}
// __END__

View File

@@ -10,14 +10,6 @@
* table from the connected DB.
* you don't have to write any SQL queries, worry over update/insert
*
* PUBLIC VARIABLES
*
* PRIVATE VARIABLES
*
* PUBLIC METHOD:S
*
* PRIVATE METHOD:S
*
* HISTORY:
* 2019/9/11 (cs) error string 21->91, 22->92 for not overlapping with IO
* 2005/07/07 (cs) updated array class for postgres: set 0 & NULL if int field given, insert uses () values () syntax
@@ -105,11 +97,6 @@ class ArrayIO extends \CoreLibs\DB\IO
return $text;
}
// METHOD: convertEntities
// WAS : convert_entities
// PARAMS: string -> string to be changed
// RETURN: string -> altered string
// DESC : changeds all HTML entities into non HTML ones
/**
* changeds all HTML entities into non HTML ones
* @param string $text encoded html string
@@ -139,7 +126,7 @@ class ArrayIO extends \CoreLibs\DB\IO
}
// add output to internal error_msg
if ($write === true) {
$this->error_msg['db'] .= $string;
$this->__dbDebug('dbArray', $string);
}
return $string;
}
@@ -188,7 +175,7 @@ class ArrayIO extends \CoreLibs\DB\IO
* set this as new table array too
* @return array returns the table array that was deleted
*/
public function dbDelete($table_array = array())
public function dbDelete($table_array = [])
{
// is array and has values, override set and set new
if (is_array($table_array) && count($table_array)) {
@@ -247,7 +234,7 @@ class ArrayIO extends \CoreLibs\DB\IO
* @param array $table_array optional table array, overwrites internal set array
* @return array set table array with values
*/
public function dbRead($edit = false, $table_array = array())
public function dbRead($edit = false, $table_array = [])
{
// if array give, overrules internal array
if (is_array($table_array) && count($table_array)) {
@@ -320,7 +307,7 @@ class ArrayIO extends \CoreLibs\DB\IO
* @param array $table_array optional table array, overwrites internal one
* @return array table array or null
*/
public function dbWrite($addslashes = false, $table_array = array())
public function dbWrite($addslashes = false, $table_array = [])
{
if (is_array($table_array) && count($table_array)) {
$this->table_array = $table_array;
@@ -420,7 +407,7 @@ class ArrayIO extends \CoreLibs\DB\IO
}
// integer is different
if (isset($this->table_array[$column]['int']) || isset($this->table_array[$column]['int_null'])) {
$this->debug('write_check', '['.$column.']['.$this->table_array[$column]['value'].']['.$this->table_array[$column]['type'].'] '.
$this->log->debug('write_check', '['.$column.']['.$this->table_array[$column]['value'].']['.$this->table_array[$column]['type'].'] '.
'VALUE SET: '.(string)isset($this->table_array[$column]['value']).
' | INT NULL: '.(string)isset($this->table_array[$column]['int_null']));
if (isset($this->table_array[$column]['value']) &&

View File

@@ -278,7 +278,7 @@ class IO extends \CoreLibs\Basic
// other vars
private $nbsp = ''; // used by print_array recursion function
// error & warning id
// not error_id is defined in \CoreLibs\Basic
protected $error_id;
private $had_error;
private $warning_id;
private $had_warning;
@@ -535,7 +535,7 @@ class IO extends \CoreLibs\Basic
* @param string $type query identifier (Q, I, etc)
* @return void has no return
*/
private function __dbDebug(string $debug_id, string $error_string, string $id = '', string $type = ''): void
protected function __dbDebug(string $debug_id, string $error_string, string $id = '', string $type = ''): void
{
$prefix = '';
if ($id) {
@@ -547,7 +547,7 @@ class IO extends \CoreLibs\Basic
if ($prefix) {
$prefix .= '- ';
}
$this->debug($debug_id, $prefix.$error_string, true);
$this->log->debug($debug_id, $prefix.$error_string, true);
}
/**
@@ -562,7 +562,7 @@ class IO extends \CoreLibs\Basic
public function __dbError($cursor = false, string $msg = ''): void
{
$pg_error_string = '';
$where_called = (string)$this->getCallerMethod();
$where_called = (string)\CoreLibs\Debug\Support::getCallerMethod();
if ($cursor) {
$pg_error_string = $this->db_functions->__dbPrintError($cursor);
}
@@ -1115,7 +1115,7 @@ class IO extends \CoreLibs\Basic
$md5 = md5($query);
// pre declare array
if (!isset($this->cursor_ext[$md5])) {
$this->cursor_ext[$md5] = array(
$this->cursor_ext[$md5] = [
'query' => '',
'pos' => 0,
'cursor' => 0,
@@ -1123,7 +1123,7 @@ class IO extends \CoreLibs\Basic
'num_rows' => 0,
'num_fields' => 0,
'read_rows' => 0
);
];
}
// set the query
$this->cursor_ext[$md5]['query'] = $query;
@@ -1624,7 +1624,7 @@ class IO extends \CoreLibs\Basic
}
$result = $this->db_functions->__dbExecute($stm_name, $data);
if (!$result) {
$this->debug('ExecuteData', 'ERROR in STM['.$stm_name.'|'.$this->prepare_cursor[$stm_name]['result'].']: '.$this->printAr($data));
$this->log->debug('ExecuteData', 'ERROR in STM['.$stm_name.'|'.$this->prepare_cursor[$stm_name]['result'].']: '.$this->log->prAr($data));
$this->error_id = 22;
$this->__dbError($this->prepare_cursor[$stm_name]['result']);
$this->__dbDebug('db', '<span style="color: red;"><b>DB-Error</b> '.$stm_name.': Execution failed</span>', 'DB_ERROR');
@@ -1868,10 +1868,10 @@ class IO extends \CoreLibs\Basic
array $data = []
) {
if (!is_array($primary_key)) {
$primary_key = array(
$primary_key = [
'row' => $table.'_id',
'value' => $primary_key
);
];
} else {
if (!isset($primary_key['row'])) {
$primary_key['row'] = '';

View File

@@ -266,7 +266,7 @@ class PgSQL
if ($q = $this->__dbQuery($q)) {
list($id) = $this->__dbFetchArray($q);
} else {
$id = array(-1, $q);
$id = [-1, $q];
}
return $id;
}
@@ -444,7 +444,7 @@ class PgSQL
{
if (false === $limit) {
$limit = strlen($text) - 1;
$output = array();
$output = [];
}
if ('{}' != $text) {
do {

View File

@@ -0,0 +1,61 @@
<?php declare(strict_types=1);
/*
* direct write to log file
* must have BASE folder and LOG foder defined
*/
namespace CoreLibs\Debug;
class FileWriter
{
private static $debug_filename = 'debug_file.log'; // where to write output
/**
* set new debug file name
* Must be alphanumeric and underscore only.
* Must end with .log
*
* @param string $filename File name to set
* @return bool True for valid file name, False if invalid
*/
public static function fsetFilename(string $filename): bool
{
// valid file. must be only ascii & _, must end with .log
if (!preg_match("/^[A-Za-z_-]+\.log$/", $filename)) {
return false;
}
self::$debug_filename = $filename;
return true;
}
/**
* writes a string to a file immediatly, for fast debug output
* @param string $string string to write to the file
* @param boolean $enter default true, if set adds a linebreak \n at the end
* @return bool True for log written, false for not wirrten
*/
public static function fdebug(string $string, bool $enter = true): bool
{
if (!self::$debug_filename) {
return false;
}
if (!is_writeable(BASE.LOG)) {
return false;
}
$filename = BASE.LOG.self::$debug_filename;
$fh = fopen($filename, 'a');
if ($fh === false) {
return false;
}
if ($enter === true) {
$string .= "\n";
}
$string = "[".\CoreLibs\Debug\Support::printTime()."] [".\CoreLibs\Get\System::getPageName(2)."] - ".$string;
fwrite($fh, $string);
fclose($fh);
return true;
}
}
// __END__

View File

@@ -0,0 +1,560 @@
<?php declare(strict_types=1);
/*
* Debug support functions
*
* These are if there is any debug to print out at all at the end
 * debug_output_all - general yes no
 * It's recommended to use the method "debug_for" to turn on of the array vars
 * debug_output - turn on for one level (Array)
 * debug_output_not - turn off for one level (array)
 *
 * Print out the debug at thend of the html
 * echo_output_all
 * echo_output
 * echo_output_not
 *
 * Write debug to file
 * print_output_all
 * print_output
 * print_output_not
*/
namespace CoreLibs\Debug;
class Logging
{
// page and host name
private $page_name;
private $host_name;
private $host_port;
// internal error reporting vars
private $error_msg = []; // the "connection" to the outside errors
// debug output prefix
private $error_msg_prefix = ''; // prefix to the error string (the class name)
// debug flags
private $debug_output = []; // if this is true, show debug on desconstructor
private $debug_output_not = [];
private $debug_output_all = false;
private $echo_output = []; // errors: echo out, default is 1
private $echo_output_not = [];
private $echo_output_all = false;
private $print_output = []; // errors: print to file, default is 0
private $print_output_not = [];
private $print_output_all = false;
// debug flags/settings
private $running_uid = ''; // unique ID set on class init and used in logging as prefix
// log file name
private $log_file_name_ext = 'log'; // use this for date rotate
private $log_max_filesize = 0; // set in kilobytes
private $log_print_file = 'error_msg##LOGID####LEVEL####CLASS####PAGENAME####DATE##';
private $log_file_unique_id; // a unique ID set only once for call derived from this class
private $log_print_file_date = true; // if set add Y-m-d and do automatic daily rotation
private $log_file_id = ''; // a alphanumeric name that has to be set as global definition
private $log_per_level = false; // set, it will split per level (first parameter in debug call)
private $log_per_class = false; // set, will split log per class
private $log_per_page = false; // set, will split log per called file
private $log_per_run = false; // create a new log file per run (time stamp + unique ID)
// script running time
private $script_starttime;
public function __construct()
{
// running time start for script
$this->script_starttime = microtime(true);
// set per run UID for logging
$this->running_uid = \CoreLibs\Create\Hash::__uniqId();
// set the page name
$this->page_name = \CoreLibs\Get\System::getPageName();
// set host name
list($this->host_name , $this->host_port) = \CoreLibs\Get\System::getHostName();
// add port to host name if not port 80
if ($this->host_port != 80) {
$this->host_name .= ':'.$this->host_port;
}
// can be overridden with basicSetLogFileId
if (isset($GLOBALS['LOG_FILE_ID'])) {
$this->basicSetLogId($GLOBALS['LOG_FILE_ID']);
} elseif (defined('LOG_FILE_ID')) {
$this->basicSetLogId(LOG_FILE_ID);
}
// init the log levels
$this->setLogLevels();
}
// *** PRIVATE ***
/**
* init the basic log levels based on global set variables
*
* @return void
*/
private function setLogLevels(): void
{
// if given via parameters, only for all
// globals overrule given settings, for one (array), eg $ECHO['db'] = 1;
if (isset($GLOBALS['DEBUG']) && is_array($GLOBALS['DEBUG'])) {
$this->debug_output = $GLOBALS['DEBUG'];
}
if (isset($GLOBALS['ECHO']) && is_array($GLOBALS['ECHO'])) {
$this->echo_output = $GLOBALS['ECHO'];
}
if (isset($GLOBALS['PRINT']) && is_array($GLOBALS['PRINT'])) {
$this->print_output = $GLOBALS['PRINT'];
}
// exclude these ones from output
if (isset($GLOBALS['DEBUG_NOT']) && is_array($GLOBALS['DEBUG_NOT'])) {
$this->debug_output_not = $GLOBALS['DEBUG_NOT'];
}
if (isset($GLOBALS['ECHO_NOT']) && is_array($GLOBALS['ECHO_NOT'])) {
$this->echo_output_not = $GLOBALS['ECHO_NOT'];
}
if (isset($GLOBALS['PRINT_NOT']) && is_array($GLOBALS['PRINT_NOT'])) {
$this->print_output_not = $GLOBALS['PRINT_NOT'];
}
// all overrule
$this->debug_output_all = $GLOBALS['DEBUG_ALL'] ?? false;
$this->echo_output_all = $GLOBALS['ECHO_ALL'] ?? false;
$this->print_output_all = $GLOBALS['PRINT_ALL'] ?? false;
// GLOBAL rules for log writing
$this->log_print_file_date = $GLOBALS['LOG_PRINT_FILE_DATE'] ?? true;
$this->log_per_level = $GLOBALS['LOG_PER_LEVEL'] ?? false;
$this->log_per_class = $GLOBALS['LOG_PER_CLASS'] ?? false;
$this->log_per_page = $GLOBALS['LOG_PER_PAGE'] ?? false;
$this->log_per_run = $GLOBALS['LOG_PER_RUN'] ?? false;
}
/**
* 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;
}
return $access;
}
/**
* writes error msg data to file for current level
* @param string $level the level to write
* @param string $error_string error string to write
* @return bool True if message written, FAlse if not
*/
private function writeErrorMsg(string $level, string $error_string): bool
{
// only write if write is requested
if (!($this->doDebugTrigger('debug', $level) &&
$this->doDebugTrigger('print', $level))
) {
return false;
}
// replace all html tags
// $error_string = preg_replace("/(<\/?)(\w+)([^>]*>)/", "##\\2##", $error_string);
// $error_string = preg_replace("/(<\/?)(\w+)([^>]*>)/", "", $error_string);
// replace special line break tag
// $error_string = str_replace('<!--#BR#-->', "\n", $error_string);
// init output variable
$output = $error_string; // output formated error string to output file
// init base file path
$fn = BASE.LOG.$this->log_print_file.'.'.$this->log_file_name_ext;
// log ID prefix settings, if not valid, replace with empty
if (preg_match("/^[A-Za-z0-9]+$/", $this->log_file_id)) {
$rpl_string = '_'.$this->log_file_id;
} else {
$rpl_string = '';
}
$fn = str_replace('##LOGID##', $rpl_string, $fn); // log id (like a log file prefix)
if ($this->log_per_run) {
if (isset($GLOBALS['LOG_FILE_UNIQUE_ID'])) {
$this->log_file_unique_id = $GLOBALS['LOG_FILE_UNIQUE_ID'];
}
if (!$this->log_file_unique_id) {
$GLOBALS['LOG_FILE_UNIQUE_ID'] = $this->log_file_unique_id = date('Y-m-d_His').'_U_'.substr(hash('sha1', uniqid((string)mt_rand(), true)), 0, 8);
}
$rpl_string = '_'.$this->log_file_unique_id; // add 8 char unique string
} else {
$rpl_string = !$this->log_print_file_date ? '' : '_'.date('Y-m-d'); // add date to file
}
$fn = str_replace('##DATE##', $rpl_string, $fn); // create output filename
$rpl_string = !$this->log_per_level ? '' : '_'.$level; // if request to write to one file
$fn = str_replace('##LEVEL##', $rpl_string, $fn); // create output filename
// set per class, but don't use get_class as we will only get self
$rpl_string = !$this->log_per_class ? '' : '_'.str_replace('\\', '-', \CoreLibs\Debug\Support::getCallerClass()); // set sub class settings
$fn = str_replace('##CLASS##', $rpl_string, $fn); // create output filename
$rpl_string = !$this->log_per_page ? '' : '_'.\CoreLibs\Get\System::getPageName(1); // if request to write to one file
$fn = str_replace('##PAGENAME##', $rpl_string, $fn); // create output filename
// write to file
// first check if max file size is is set and file is bigger
if ($this->log_max_filesize > 0 && ((filesize($fn) / 1024) > $this->log_max_filesize)) {
// for easy purpose, rename file only to attach timestamp, nur sequence numbering
rename($fn, $fn.'.'.date("YmdHis"));
}
$fp = fopen($fn, 'a');
if ($fp !== false) {
fwrite($fp, $output);
fclose($fp);
} else {
echo "<!-- could not open file: $fn //-->";
}
return true;
}
/**
* Superseeded by \CoreLibs\Debug\Support::getCallerClass() calls
*
* @return string Class name where called
* @deprecated Use \CoreLibs\Debug\Support::getCallerClass() insteader
*/
private function getCallerClass(): string
{
// get the last class entry and wrie that
$backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS) ?? [['class' => get_class($this)]];
return end($backtrace)['class'];
}
// *** PUBLIC ***
/**
* sets the internal log file prefix id
* string must be a alphanumeric string
* if non valid string is given it returns the previous set one only
* @param string $string log file id string value
* @return string returns the set log file id string
*/
public function basicSetLogId(string $string): string
{
if (preg_match("/^\w+$/", $string)) {
$this->log_file_id = $string;
}
return $this->log_file_id;
}
/**
* get the current log level setting for All level blocks
* @param string $type Type to get: debug, echo, print
* @return bool False on failure, or the boolean flag from the all var
*/
public function getLogLevelAll(string $type): bool
{
// type check for debug/echo/print
if (!in_array($type, ['debug', 'echo', 'print'])) {
return false;
}
return $this->{$type.'_output_all'};
}
/**
* set log level settings for All types
* if invalid type, skip
* @param string $type Type to get: debug, echo, print
* @param bool $set True or False
* @return void No return
*/
public function setLogLevelAll(string $type, bool $set): void
{
// skip set if not valid
if (!in_array($type, ['debug', 'echo', 'print'])) {
return;
}
$this->{$type.'_output_all'} = $set;
}
/**
* old name for setLogLevel
* @param string $type debug, echo, print
* @param string $flag on/off
* array $array of levels to turn on/off debug
* @return void has no return
*/
public function debugFor(string $type, string $flag): void
{
/** @phan-suppress-next-line PhanTypeMismatchArgumentReal */
$this->setLogLevel(...[func_get_args()]);
}
/**
* passes list of level names, to turn on debug
* eg $foo->debugFor('print', 'on', ['LOG', 'DEBUG', 'INFO']);
* TODO: currently we can only turn ON
* @param string $type debug, echo, print
* @param string $flag on/off
* array $array of levels to turn on/off debug
* @return void has no return
*/
public function setLogLevel(string $type, string $flag): void
{
// abort if not valid type
if (!in_array($type, ['debug', 'echo', 'print'])) {
return;
}
// invalid flag type
if (!in_array($flag, ['on', 'off'])) {
return;
}
$debug_on = func_get_args();
array_shift($debug_on); // kick out type
array_shift($debug_on); // kick out flag (on/off)
if (count($debug_on) >= 1) {
foreach ($debug_on as $level) {
$switch = $type.'_output'.($flag == 'off' ? '_not' : '');
$this->{$switch}[$level] = true;
}
}
}
/**
* return the log level for the array type normal and not (disable)
* @param string $type debug, echo, print
* @param string $flag on/off
* @param string|null $level if not null then check if this array entry is set
* else return false
* @return bool|array if $level is null, return array, else boolean true/false
*/
public function getLogLevel(string $type, string $flag, ?string $level = null)
{
// abort if not valid type
if (!in_array($type, ['debug', 'echo', 'print'])) {
return false;
}
// invalid flag type
if (!in_array($flag, ['on', 'off'])) {
return false;
}
$switch = $type.'_output'.($flag == 'off' ? '_not' : '');
// bool
if ($level !== null) {
return $this->{$switch}[$level] ?? false;
}
// array
return $this->{$switch};
}
/**
* set flags for per log level type
* - level: set per sub group level
* - class: split by class
* - page: split per page called
* - run: for each run
* @param string $type Type to get: level, class, page, run
* @param bool $set True or False
* @return void
*/
public function setLogPer(string $type, bool $set): void
{
if (!in_array($type, ['level', 'class', 'page', 'run'])) {
return;
}
$this->{'log_per_'.$type} = $set;
}
/**
* return current set log per flag in bool
* @param string $type Type to get: level, class, page, run
* @return bool True of false for turned on or off
*/
public function getLogPer(string $type): bool
{
if (!in_array($type, ['level', 'class', 'page', 'run'])) {
return false;
}
return $this->{'log_per_'.$type};
}
/**
* A replacement for the \CoreLibs\Debug\Support::printAr
* But this does not wrap it in <pre></pre>
* It uses some special code sets so we can convert that to pre flags
* for echo output {##HTMLPRE##} ... {##/HTMLPRE##}
* Do not use this without using it in a string in debug function
* @param array $a Array to format
* @return string print_r formated
*/
public function prAr(array $a): string
{
return '{##HTMLPRE##}'.print_r($a, true).'{##/HTMLPRE##}';
}
/**
* write debug data to error_msg array
* @param string $level id for error message, groups messages together
* @param string $string the actual error message
* @param bool $strip default on false, if set to true,
* all html tags will be stripped and <br> changed to \n
* this is only used for debug output
* @return bool True if logged, false if not logged
*/
public function debug(string $level, string $string, bool $strip = false): bool
{
if (!$this->doDebugTrigger('debug', $level)) {
return false;
}
// get the last class entry and wrie that
$class = \CoreLibs\Debug\Support::getCallerClass();
// get timestamp
$timestamp = \CoreLibs\Debug\Support::printTime();
// same string put for print (no html data inside)
// write to file if set
$this->writeErrorMsg(
$level,
'['.$timestamp.'] '
.'['.$this->host_name.'] '
.'['.\CoreLibs\Get\System::getPageName(2).'] '
.'['.$this->running_uid.'] '
.'{'.$class.'} '
.'<'.$level.'> - '
// strip the htmlpre special tags if exist
.preg_replace(
"/{##HTMLPRE##}((.|\n)*?){##\/HTMLPRE##}/m",
'\\1',
// if stripping all html, etc is requested, only for write error msg
($strip ?
// find any <br> and replace them with \n
// strip rest of html elements (base only)
preg_replace("/(<\/?)(\w+)([^>]*>)/", '', str_replace('<br>', "\n", $string)) :
$string
)
)
."\n"
);
// write to error level msg array if there is an echo request
if ($this->doDebugTrigger('echo', $level)) {
// init if not set
if (!isset($this->error_msg[$level])) {
$this->error_msg[$level] = [];
}
// HTML string
$this->error_msg[$level][] = '<div>'
.'[<span style="font-weight: bold; color: #5e8600;">'.$timestamp.'</span>] '
.'[<span style="font-weight: bold; color: #c56c00;">'.$level.'</span>] '
.'[<span style="color: #b000ab;">'.$this->host_name.'</span>] '
.'[<span style="color: #08b369;">'.$this->page_name.'</span>] '
.'[<span style="color: #0062A2;">'.$this->running_uid.'</span>] '
.'{<span style="font-style: italic; color: #928100;">'.$class.'</span>} - '
// we replace special HTMLPRE with <pre> entries
.preg_replace("/{##HTMLPRE##}((.|\n)*?){##\/HTMLPRE##}/m", "<pre>\\1</pre>", \CoreLibs\Convert\Html::htmlent($string))
."</div><!--#BR#-->";
}
return true;
}
/**
* merges the given error array with the one from this class
* only merges visible ones
* @param array $error_msg error array
* @return void has no return
*/
public function mergeErrors(array $error_msg = []): void
{
if (!is_array($error_msg)) {
$error_msg = [];
}
array_push($this->error_msg, ...$error_msg);
}
/**
* prints out the error string
* @param string $string prefix string for header
* @return string error msg for all levels
*/
public function printErrorMsg(string $string = ''): string
{
$string_output = '';
if ($this->debug_output_all) {
if ($this->error_msg_prefix) {
$string = $this->error_msg_prefix;
}
$script_end = microtime(true) - $this->script_starttime;
foreach ($this->error_msg as $level => $temp_debug_output) {
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>**** ".\CoreLibs\Convert\Html::htmlent($string)." ****</br>\n" : "")
.'</div>'
.join('', $temp_debug_output);
} // echo it out
} // do printout
} // for each level
// create the output wrapper around, so we have a nice formated output per class
if ($string_output) {
$string_prefix = '<div style="text-align: left; padding: 5px; font-size: 10px; font-family: sans-serif; border-top: 1px solid black; border-bottom: 1px solid black; margin: 10px 0 10px 0; background-color: white; color: black;">'
.'<div style="font-size: 12px;">{<span style="font-style: italic; color: #928100;">'.\CoreLibs\Debug\Support::getCallerClass().'</span>}</div>';
$string_output = $string_prefix.$string_output
.'<div><span style="font-style: italic; color: #108db3;">Script Run Time:</span> '.$script_end.'</div>'
.'</div>';
}
}
return $string_output;
}
/**
* unsests the error message array
* can be used if writing is primary to file
* if no level given resets all
* @param string $level optional level
* @return void has no return
*/
public function resetErrorMsg(string $level = ''): void
{
if (!$level) {
$this->error_msg = [];
} elseif (isset($this->error_msg[$level])) {
unset($this->error_msg[$level]);
}
}
}
// __END__

View File

@@ -0,0 +1,119 @@
<?php declare(strict_types=1);
/*
* various running time checkers
*/
namespace CoreLibs\Debug;
class RunningTime
{
// hr
private static $hr_starttime;
private static $hr_runtime;
private static $hr_endtime;
// normal
private static $starttime;
private static $endtime;
private static $runningtime_string;
/**
* for messure run time between two calls for this method
* uses the hrtime() for running time
* first call sets start time and returns 0,
* second call sets end time and returns the run time
* the out_time parameter can be:
* n/ns (nano), y/ys (micro), m/ms (milli), s
* default is milliseconds
* @param string $out_time set return time adjustment calculation
* @return float running time without out_time suffix
*/
public static function hrRunningTime(string $out_time = 'ms'): float
{
// if start time not set, set start time
if (!self::$hr_starttime) {
self::$hr_starttime = hrtime(true);
self::$hr_runtime = 0;
} else {
self::$hr_endtime = hrtime(true);
self::$hr_runtime = self::$hr_endtime - self::$hr_starttime;
// reset start and end time past run
self::$hr_starttime = 0;
self::$hr_endtime = 0;
}
// init divisor, just in case
$divisor = 1;
// check through valid out time, if nothing matches default to ms
switch ($out_time) {
case 'n':
case 'ns':
$divisor = 1;
break;
case 'y':
case 'ys':
$divisor = 1000;
break;
case 'm':
case 'ms':
$divisor = 1000000;
break;
case 's':
$divisor = 1000000000;
break;
// default is ms
default:
$divisor = 1000000;
break;
}
// return the run time in converted format
self::$hr_runtime /= $divisor;
return self::$hr_runtime;
}
/**
* prints start or end time in text format. On first call sets start time
* on second call it sends the end time and then also prints the running time
* Sets the internal runningtime_string variable with Start/End/Run time string
* NOTE: for pure running time check it is recommended to use hrRunningTime method
* @param bool|boolean $simple if true prints HTML strings, default text only
* @return float running time as float number
*/
public static function runningTime(bool $simple = false): float
{
list($micro, $timestamp) = explode(' ', microtime());
$running_time = 0;
// set start & end time
if (!self::$starttime) {
// always reset running time string on first call
self::$runningtime_string = '';
self::$starttime = ((float)$micro + (float)$timestamp);
self::$runningtime_string .= $simple ? 'Start: ' : "<b>Started at</b>: ";
} else {
self::$endtime = ((float)$micro + (float)$timestamp);
self::$runningtime_string .= $simple ? 'End: ' : "<b>Stopped at</b>: ";
}
self::$runningtime_string .= date('Y-m-d H:i:s', (int)$timestamp);
self::$runningtime_string .= ' '.$micro.($simple ? ', ' : '<br>');
// if both are set
if (self::$starttime && self::$endtime) {
$running_time = self::$endtime - self::$starttime;
self::$runningtime_string .= ($simple ? 'Run: ' : "<b>Script running time</b>: ").$running_time." s";
// reset start & end time after run
self::$starttime = 0;
self::$endtime = 0;
}
return $running_time;
}
/**
* get the runningTime string (for debug visual)
*
* @return string
*/
public static function runningTimeString(): string
{
return self::$runningtime_string;
}
}
// __END__

View File

@@ -0,0 +1,77 @@
<?php declare(strict_types=1);
/*
* Debug support functions
*/
namespace CoreLibs\Debug;
class Support
{
/**
* wrapper around microtime function to print out y-m-d h:i:s.ms
* @param int $set_microtime -1 to set micro time, 0 for none, positive for rounding
* @return string formated datetime string with microtime
*/
public static function printTime(int $set_microtime = -1): string
{
list($microtime, $timestamp) = explode(' ', microtime());
$string = date("Y-m-d H:i:s", (int)$timestamp);
// if microtime flag is -1 no round, if 0, no microtime, if >= 1, round that size
if ($set_microtime == -1) {
$string .= substr($microtime, 1);
} elseif ($set_microtime >= 1) {
// in round case we run this through number format to always get the same amount of digits
$string .= substr(number_format(round((float)$microtime, $set_microtime), $set_microtime), 1);
}
return $string;
}
/**
* prints a html formatted (pre) array
* @param array $array any array
* @return string formatted array for output with <pre> tag added
*/
public static function printAr(array $array): string
{
return "<pre>".print_r($array, true)."</pre>";
}
/**
* if there is a need to find out which parent method called a child method,
* eg for debugging, this function does this
* call this method in the child method and you get the parent function that called
* @param int $level debug level, default 2
* @return ?string null or the function that called the function where this method is called
*/
public static function getCallerMethod(int $level = 1): ?string
{
$traces = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
// print \CoreLibs\Debug\Support::printAr($traces);
// We should check from top down if unset?
// sets the start point here, and in level two (the sub call) we find this
if (isset($traces[$level])) {
return $traces[$level]['function'];
}
return null;
}
/**
* Get the current class where this function is called
* Is mostly used in debug log statements to get the class where the debug was called
* gets top level class
* loops over the debug backtrace until if finds the first class (from the end)
* @return string Class name with namespace
*/
public static function getCallerClass(): string
{
$backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS) ?? [['class' => get_called_class()]];
$class = null;
while ($class === null) {
$class = array_pop($backtrace)['class'] ?? null;
}
return $class ?? '';
}
}
// __END__

View File

@@ -0,0 +1,85 @@
<?php declare(strict_types=1);
/*
* system related functions to get self name, host name, error strings
*/
namespace CoreLibs\Get;
class System
{
/**
* 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 static 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;
}
/**
* get the host name without the port as given by the SELF var
* @return array host name/port name
*/
public static function getHostName(): array
{
$port = '';
if ($_SERVER['HTTP_HOST'] && preg_match("/:/", $_SERVER['HTTP_HOST'])) {
list($host_name, $port) = explode(":", $_SERVER['HTTP_HOST']);
} elseif ($_SERVER['HTTP_HOST']) {
$host_name = $_SERVER['HTTP_HOST'];
} else {
$host_name = 'NA';
}
return [$host_name, ($port ? $port : 80)];
}
/**
* get the page name of the curronte page
* @param int $strip_ext 1: strip page file name extension
* 0: keep filename as is
* 2: keep filename as is, but add dirname too
* @return string filename
*/
public static function getPageName(int $strip_ext = 0): string
{
// get the file info
$page_temp = pathinfo($_SERVER['PHP_SELF']);
if ($strip_ext == 1) {
return $page_temp['filename'];
} elseif ($strip_ext == 2) {
return $_SERVER['PHP_SELF'];
} else {
return $page_temp['basename'];
}
}
}
// __END__

View File

@@ -0,0 +1,148 @@
<?php declare(strict_types=1);
/*
* hash wrapper functions for old problem fixes
*/
namespace CoreLibs\Language;
class Encoding
{
private static $mb_error_char = '';
/**
* wrapper function for mb mime convert, for correct conversion with long strings
* @param string $string string to encode
* @param string $encoding target encoding
* @return string encoded string
*/
public static function __mbMimeEncode(string $string, string $encoding): string
{
// set internal encoding, so the mimeheader encode works correctly
mb_internal_encoding($encoding);
// if a subject, make a work around for the broken mb_mimencode
$pos = 0;
$split = 36; // after 36 single bytes characters, if then comes MB, it is broken
// has to 2 x 36 < 74 so the mb_encode_mimeheader 74 hardcoded split does not get triggered
$_string = '';
while ($pos < mb_strlen($string, $encoding)) {
$output = mb_strimwidth($string, $pos, $split, "", $encoding);
$pos += mb_strlen($output, $encoding);
// if the strinlen is 0 here, get out of the loop
if (!mb_strlen($output, $encoding)) {
$pos += mb_strlen($string, $encoding);
}
$_string_encoded = mb_encode_mimeheader($output, $encoding);
// only make linebreaks if we have mime encoded code inside
// the space only belongs in the second line
if ($_string && preg_match("/^=\?/", $_string_encoded)) {
$_string .= "\n ";
}
$_string .= $_string_encoded;
}
// strip out any spaces BEFORE a line break
$string = str_replace(" \n", "\n", $_string);
return $string;
}
/**
* set error char
*
* @param string $string The character to use to represent error chars
* @return void
*/
public static function setErrorChar(string $string): void
{
self::$mb_error_char = $string;
}
/**
* get the current set error character
*
* @return string Set error character
*/
public static function getErrorChar(): string
{
return self::$mb_error_char;
}
/**
* test if a string can be safely convert between encodings. mostly utf8 to shift jis
* the default compare has a possibility of failure, especially with windows
* it is recommended to the following in the script which uses this method:
* mb_substitute_character(0x2234);
* $class->mb_error_char = '∴';
* if check to Shift JIS
* if check to ISO-2022-JP
* if check to ISO-2022-JP-MS
* set three dots (∴) as wrong character for correct convert error detect
* (this char is used, because it is one of the least used ones)
* @param string $string string to test
* @param string $from_encoding encoding of string to test
* @param string $to_encoding target encoding
* @return bool|array false if no error or array with failed characters
*/
public static function checkConvertEncoding(string $string, string $from_encoding, string $to_encoding)
{
// convert to target encoding and convert back
$temp = mb_convert_encoding($string, $to_encoding, $from_encoding);
$compare = mb_convert_encoding($temp, $from_encoding, $to_encoding);
// if string does not match anymore we have a convert problem
if ($string != $compare) {
$failed = array();
// go through each character and find the ones that do not match
for ($i = 0, $iMax = mb_strlen($string, $from_encoding); $i < $iMax; $i ++) {
$char = mb_substr($string, $i, 1, $from_encoding);
$r_char = mb_substr($compare, $i, 1, $from_encoding);
// the ord 194 is a hack to fix the IE7/IE8 bug with line break and illegal character
if ((($char != $r_char && !self::$mb_error_char) || ($char != $r_char && $r_char == self::$mb_error_char && self::$mb_error_char)) && ord($char) != 194) {
$failed[] = $char;
}
}
return $failed;
} else {
return false;
}
}
/**
* detects the source encoding of the string and if doesn't match
* to the given target encoding it convert is
* if source encoding is set and auto check is true (default) a second
* check is done so that the source string encoding actually matches
* will be skipped if source encoding detection is ascii
* @param string $string string to convert
* @param string $to_encoding target encoding
* @param string $source_encoding optional source encoding, will try to auto detect
* @param bool $auto_check default true, if source encoding is set
* check that the source is actually matching
* to what we sav the source is
* @return string encoding converted string
*/
public static function convertEncoding(string $string, string $to_encoding, string $source_encoding = '', bool $auto_check = true): string
{
// set if not given
if (!$source_encoding) {
$source_encoding = mb_detect_encoding($string);
} else {
$_source_encoding = mb_detect_encoding($string);
}
if ($auto_check === true &&
isset($_source_encoding) &&
$_source_encoding == $source_encoding
) {
// trigger check if we have override source encoding.
// if different (_source is all but not ascii) then trigger skip if matching
}
if ($source_encoding != $to_encoding) {
if ($source_encoding) {
$string = mb_convert_encoding($string, $to_encoding, $source_encoding);
} else {
$string = mb_convert_encoding($string, $to_encoding);
}
}
return $string;
}
}
// __END__

View File

@@ -40,8 +40,7 @@ class L10n extends \CoreLibs\Basic
* @param string $lang language name (optional), fallback is en
* @param string $path path, if empty fallback on default internal path
*/
public function __construct(string $lang = '', string $path = ''
)
public function __construct(string $lang = '', string $path = '')
{
parent::__construct();
if (!$lang) {

View File

@@ -0,0 +1,238 @@
<?php declare(strict_types=1);
/*
* elements for html output direct
*/
namespace CoreLibs\Output\Form;
class Elements
{
/**
* print the date/time drop downs, used in any queue/send/insert at date/time place
* @param int $year year YYYY
* @param int $month month m
* @param int $day day d
* @param int $hour hour H
* @param int $min min i
* @param string $suffix additional info printed after the date time variable in the drop down
* also used for ID in the on change JS call
* @param int $min_steps default is 1 (minute), can set to anything, is used as sum up from 0
* @param bool $name_pos_back default false, if set to true, the name will be printend
* after the drop down and not before the drop down
* @return string HTML formated strings for drop down lists of date and time
*/
public static function printDateTime($year, $month, $day, $hour, $min, string $suffix = '', int $min_steps = 1, bool $name_pos_back = false)
{
// if suffix given, add _ before
if ($suffix) {
$suffix = '_'.$suffix;
}
if ($min_steps < 1 || $min_steps > 59) {
$min_steps = 1;
}
$on_change_call = 'dt_list(\''.$suffix.'\');';
// always be 1h ahead (for safety)
$timestamp = time() + 3600; // in seconds
// the max year is this year + 1;
$max_year = (int)date("Y", $timestamp) + 1;
// preset year, month, ...
$year = !$year ? date('Y', $timestamp) : $year;
$month = !$month ? date('m', $timestamp) : $month;
$day = !$day ? date('d', $timestamp) : $day;
$hour = !$hour ? date('H', $timestamp) : $hour;
$min = !$min ? date('i', $timestamp) : $min; // add to five min?
// max days in selected month
$days_in_month = date('t', strtotime($year.'-'.$month.'-'.$day.' '.$hour.':'.$min.':0'));
$string = '';
// from now to ?
if ($name_pos_back === false) {
$string = 'Year ';
}
$string .= '<select id="year'.$suffix.'" name="year'.$suffix.'" onChange="'.$on_change_call.'">';
for ($i = date("Y"); $i <= $max_year; $i ++) {
$string .= '<option value="'.$i.'" '.($year == $i ? 'selected' : '').'>'.$i.'</option>';
}
$string .= '</select> ';
if ($name_pos_back === true) {
$string .= 'Year ';
}
if ($name_pos_back === false) {
$string .= 'Month ';
}
$string .= '<select id="month'.$suffix.'" name="month'.$suffix.'" onChange="'.$on_change_call.'">';
for ($i = 1; $i <= 12; $i ++) {
$string .= '<option value="'.($i < 10 ? '0'.$i : $i).'" '.($month == $i ? 'selected' : '').'>'.$i.'</option>';
}
$string .= '</select> ';
if ($name_pos_back === true) {
$string .= 'Month ';
}
if ($name_pos_back === false) {
$string .= 'Day ';
}
$string .= '<select id="day'.$suffix.'" name="day'.$suffix.'" onChange="'.$on_change_call.'">';
for ($i = 1; $i <= $days_in_month; $i ++) {
// set weekday text based on current month ($month) and year ($year)
$string .= '<option value="'.($i < 10 ? '0'.$i : $i).'" '.($day == $i ? 'selected' : '').'>'.$i.' ('.date('D', mktime(0, 0, 0, $month, $i, $year)).')</option>';
}
$string .= '</select> ';
if ($name_pos_back === true) {
$string .= 'Day ';
}
if ($name_pos_back === false) {
$string .= 'Hour ';
}
$string .= '<select id="hour'.$suffix.'" name="hour'.$suffix.'" onChange="'.$on_change_call.'">';
for ($i = 0; $i <= 23; $i += $min_steps) {
$string .= '<option value="'.($i < 10 ? '0'.$i : $i).'" '.($hour == $i ? 'selected' : '').'>'.$i.'</option>';
}
$string .= '</select> ';
if ($name_pos_back === true) {
$string .= 'Hour ';
}
if ($name_pos_back === false) {
$string .= 'Minute ';
}
$string .= '<select id="min'.$suffix.'" name="min'.$suffix.'" onChange="'.$on_change_call.'">';
for ($i = 0; $i <= 59; $i ++) {
$string .= '<option value="'.($i < 10 ? '0'.$i : $i).'" '.($min == $i ? 'selected' : '').'>'.$i.'</option>';
}
$string .= '</select>';
if ($name_pos_back === true) {
$string .= ' Minute ';
}
// return the datetime select string
return $string;
}
/**
* tries to find mailto:user@bubu.at and changes it into -> <a href="mailto:user@bubu.at">E-Mail senden</a>
* or tries to take any url (http, ftp, etc) and transform it into a valid URL
* the string is in the format: some url|name#css|, same for email
* @param string $string data to transform to a valid HTML url
* @param string $target target string, default _blank
* @return string correctly formed html url link
*/
public static function magicLinks(string $string, string $target = "_blank"): string
{
$output = $string;
$protList = array("http", "https", "ftp", "news", "nntp");
// find urls w/o protocol
$output = preg_replace("/([^\/])www\.([\w\.-]+)\.([a-zA-Z]{2,4})/", "\\1http://www.\\2.\\3", $output);
$output = preg_replace("/([^\/])ftp\.([\w\.-]+)\.([a-zA-Z]{2,4})/", "\\1ftp://ftp.\\2.\\3", $output);
// remove doubles, generate protocol-regex
// DIRTY HACK
$protRegex = "";
foreach ($protList as $protocol) {
if ($protRegex) {
$protRegex .= "|";
}
$protRegex .= "$protocol:\/\/";
}
// find urls w/ protocol
// cs: escaped -, added / for http urls
// added | |, this time mandatory, todo: if no | |use \\1\\2
// backslash at the end of a url also allowed now
// do not touch <.*=".."> things!
// _1: URL or email
// _2: atag (>)
// _3: (_1) part of url or email [main url or email pre @ part]
// _4: (_2) parameters of url or email post @ part
// _5: (_3) parameters of url or tld part of email
// _7: link name/email link name
// _9: style sheet class
$output = preg_replace_callback(
"/(href=\")?(\>)?\b($protRegex)([\w\.\-?&=+%#~,;\/]+)\b([\.\-?&=+%#~,;\/]*)(\|([^\||^#]+)(#([^\|]+))?\|)?/",
function ($matches) {
return self::createUrl($matches[1] ?? '', $matches[2] ?? '', $matches[3] ?? '', $matches[4] ?? '', $matches[5] ?? '', $matches[7] ?? '', $matches[9] ?? '');
},
$output
);
// find email-addresses, but not mailto prefix ones
$output = preg_replace_callback(
"/(mailto:)?(\>)?\b([\w\.-]+)@([\w\.\-]+)\.([a-zA-Z]{2,4})\b(\|([^\||^#]+)(#([^\|]+))?\|)?/",
function ($matches) {
return self::createEmail($matches[1] ?? '', $matches[2] ?? '', $matches[3] ?? '', $matches[4] ?? '', $matches[5] ?? '', $matches[7] ?? '', $matches[9] ?? '');
},
$output
);
// we have one slashes after the Protocol -> internal link no domain, strip out the proto
// $output = preg_replace("/($protRegex)\/(.*)/e", "\\2", $ouput);
// post processing
$output = str_replace("{TARGET}", $target, $output);
$output = str_replace("##LT##", "<", $output);
$output = str_replace("##GT##", ">", $output);
$output = str_replace("##QUOT##", "\"", $output);
return $output;
}
/**
* internal function, called by the magic url create functions.
* checks if title $_4 exists, if not, set url as title
* @param string $href url link
* @param string $atag anchor tag (define both type or url)
* @param string $_1 part of the URL, if atag is set, _1 is not used
* @param string $_2 part of the URL
* @param string $_3 part of the URL
* @param string $name name for the url, if not given _2 + _3 is used
* @param string $class style sheet
* @return string correct string for url href process
*/
private static function createUrl($href, $atag, $_1, $_2, $_3, $name, $class): string
{
// $this->debug('URL', "1: $_1 - 2: $_2 - $_3 - atag: $atag - name: $name - class: $class");
// if $_1 ends with //, then we strip $_1 complete & target is also blanked (its an internal link)
if (preg_match("/\/\/$/", $_1) && preg_match("/^\//", $_2)) {
$_1 = '';
$target = '';
} else {
$target = '{TARGET}';
}
// if it is a link already just return the original link do not touch anything
if (!$href && !$atag) {
return "##LT##a href=##QUOT##".$_1.$_2.$_3."##QUOT##".($class ? ' class=##QUOT##'.$class.'##QUOT##' : '').($target ? " target=##QUOT##".$target."##QUOT##" : '')."##GT##".($name ? $name : $_2.$_3)."##LT##/a##GT##";
} elseif ($href && !$atag) {
return "href=##QUOT##$_1$_2$_3##QUOT##";
} elseif ($atag) {
return $atag.$_2.$_3;
} else {
return $href;
}
}
/**
* internal function for createing email, returns data to magic_url method
* @param string $mailto email address
* @param string $atag atag (define type of url)
* @param string $_1 parts of the email _1 before @, 3_ tld
* @param string $_2 _2 domain part after @
* @param string $_3 _3 tld
* @param string $title name for the link, if not given use email
* @param string $class style sheet
* @return string created html email a href string
*/
private static function createEmail($mailto, $atag, $_1, $_2, $_3, $title, $class)
{
$email = $_1."@".$_2.".".$_3;
if (!$mailto && !$atag) {
return "##LT##a href=##QUOT##mailto:".$email."##QUOT##".($class ? ' class=##QUOT##'.$class.'##QUOT##' : '')."##GT##".($title ? $title : $email)."##LT##/a##GT##";
} elseif ($mailto && !$atag) {
return "mailto:".$email;
} elseif ($atag) {
return $atag.$email;
}
}
}
// __END__

View File

@@ -14,10 +14,10 @@
* form data
*
* description of the variables && arrays that have to be set ...
* $name_u_choose=array(
* $name_u_choose = [
* # this is the description of ALL fields in the main table
* 'table_array' => array(
* 'name_of_col_in_table' => array(
* 'table_array' => [
* 'name_of_col_in_table' => [
* 'value' => $name_of_col_in_table',
* 'pk' => 1/0 - sets the primary key (only one)
* 'fk' => 1/0 - sets the foreign key (do not use at the moment ... buggy ;)
@@ -35,7 +35,7 @@
* 'order_by' => 'order bY' string for drop_down_db(_input) if no query given but fields set
* 'query' => for drop_down_db/array if no outer query given
* 'preset' => value to preset when array is unset (available for all types)
* 'element_list' => array( 'true', 'false') - MUST (!) be set for binary
* 'element_list' => ['true', 'false'] - MUST (!) be set for binary
* 'length' => 'nr' - only available for 'text' (maxlength)
* 'size' => 'nr' - only available for 'text' (size of input field)
* 'rows' => 'nr' - only available for 'textarea'
@@ -47,12 +47,12 @@
* --- file:
* 'save_dir' => 'directory where it should be saved to
* 'accept_type' => 'mime types accepted (mime/text,mime/jpeg ... etc)'
* ),
* ],
* ...
* ),
* ],
* # all reference tables (n<->n)
* 'reference_array' => array(
* 'name_u_choose' => array(
* 'reference_array' => [
* 'name_u_choose' => [
* 'table_name' => 'table_u_choose_for_n_to_n_table',
* 'other_table_pk' => 'primary_key_name_of_reference_table',
* 'output_name' => 'Printed out next to multiple select field',
@@ -61,18 +61,18 @@
* 'query' => 'the query to load the multiple select field
* (select id, concat_ws(' ',name_a, name_b) from reference_table)',
* 'selected' => $var_name for name='xx' in multiple select
* ),
* ],
* ...
* ),
* ],
* # fields that should be shown from the load_query and with what aditions
* 'show_fields' => array(
* array(
* 'show_fields' => [
* [
* 'name' => 'name_of_col_in_query' - col from the query that should be shown
* 'before_value' => 'text' - if set this text will be put in FRONT of the value from the col
* 'binary' => array('true','false') - for 1/0 fields in DB changes it int human readable format
* ),
* 'binary' => ['true','false'] - for 1/0 fields in DB changes it int human readable format
* ],
* ...
* ),
* ],
* # the laod query
* 'load_query' => 'query', - query for generting the list in 'load' function
* # the name of the main table
@@ -215,7 +215,7 @@ namespace CoreLibs\Output\Form;
class Generate extends \CoreLibs\DB\Extended\ArrayIO
{
// rest
public $field_array = array(); // for the load statetment describes which elements from the load query should be shown and i which format
public $field_array = []; // for the load statetment describes which elements from the load query should be shown and i which format
public $load_query; // the query needed for loading a data set (one row in the table)
public $col_name; // the name of the columen (before _<type>) [used for order button]
public $yes; // the yes flag that triggers the template to show ALL and not only new/load
@@ -224,9 +224,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
public $warning; // warning flag, for information (saved, loaded, etc)
public $archive_pk_name; // the pk name for the load select form
private $int_pk_name; // primary key, only internal usage
public $reference_array = array(); // reference arrays -> stored in $this->reference_array[$table_name]=>array();
public $reference_array = []; // reference arrays -> stored in $this->reference_array[$table_name] => [];
public $element_list; // element list for elements next to each other as a special sub group
public $table_array = array();
public $table_array = [];
public $my_page_name; // the name of the page without .php extension
public $mobile_phone = false;
// buttons and checkboxes
@@ -251,7 +251,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
public $l;
// now some default error msgs (english)
public $language_array = array();
public $language_array = [];
/**
* construct form generator
@@ -260,7 +260,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
*/
public function __construct(array $db_config, int $table_width = 750)
{
$this->my_page_name = $this->getPageName(1);
$this->my_page_name = \CoreLibs\Get\System::getPageName(1);
$this->setLangEncoding();
// init the language class
$this->l = new \CoreLibs\Language\L10n($this->lang);
@@ -281,10 +281,10 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$config_array = ${$this->my_page_name};
} else {
// dummy created
$config_array = array(
'table_array' => array(),
$config_array = [
'table_array' => [],
'table_name' => '',
);
];
}
// start the array_io class which will start db_io ...
@@ -333,21 +333,22 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
(is_array($config_array['security_level']) && count($config_array['security_level']) < 4))
)
) {
$this->security_level = array(
$this->security_level = [
'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,
[
'load' => 100,
'new' => 100,
'save' => 100,
'delete' => 100
);
];
}
}
@@ -408,7 +409,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
public function formDumpTableArray()
{
if (!is_array($this->table_array)) {
$this->table_array = array();
$this->table_array = [];
}
reset($this->table_array);
$string = '<b>TABLE ARRAY DUMP:</b> '.$this->table_name.'<br>';
@@ -429,7 +430,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
public function formGetColNameFromKey(string $want_key, ?string $key_value = null): ?string
{
if (!is_array($this->table_array)) {
$this->table_array = array();
$this->table_array = [];
}
reset($this->table_array);
foreach ($this->table_array as $key => $value) {
@@ -451,9 +452,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
*/
public function formGetColNameArrayFromKey(string $want_key, ?string $key_value = null): array
{
$key_array = array();
$key_array = [];
if (!is_array($this->table_array)) {
$this->table_array = array();
$this->table_array = [];
}
reset($this->table_array);
foreach ($this->table_array as $key => $value) {
@@ -480,11 +481,11 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
if ($this->warning) {
$class = 'warning';
}
return array(
return [
'msg' => $this->msg,
'width' => $this->table_width,
'class' => $class
);
];
}
// next for functions are pre_test fkts for easier default new,load, etc handling
@@ -577,9 +578,9 @@ 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);
$this->log->debug('REMOVE ELEMENT', 'Remove REF ELEMENT: '.$this->base_acl_level.' >= '.$this->security_level['delete']);
$this->log->debug('REMOVE ELEMENT', 'Protected Value set: '.(string)isset($this->table_array['protected']['value']));
$this->log->debug('REMOVE ELEMENT', 'Error: '.$this->error);
// only do if the user is allowed to delete
if (isset($this->security_level['delete']) &&
$this->base_acl_level >= $this->security_level['delete'] &&
@@ -588,10 +589,10 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
!$this->error
) {
if (!is_array($element_list)) {
$element_list = array();
$element_list = [];
}
for ($i = 0, $i_max = count($element_list); $i < $i_max; $i ++) {
// $this->debug('form_error', 'Array: '.is_array($this->element_list[$element_list[$i]]['read_data']).' | '.$this->element_list[$element_list[$i]]['delete']);
// $this->log->debug('form_error', 'Array: '.is_array($this->element_list[$element_list[$i]]['read_data']).' | '.$this->element_list[$element_list[$i]]['delete']);
// if prefix, set it
$prfx = ($this->element_list[$element_list[$i]]['prefix']) ? $this->element_list[$element_list[$i]]['prefix'].'_' : '';
// get the primary key
@@ -619,13 +620,13 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
!$this->element_list[$element_list[$i]]['delete']
) {
if (!isset($_POST[$id])) {
$_POST[$id] = array();
$_POST[$id] = [];
}
for ($j = 0, $j_max = count($_POST[$id]); $j < $j_max; $j ++) {
// if it is not activated
if (!$_POST[$remove_name[$i]][$j]) {
$q = 'UPDATE '.$element_list[$i].' WHERE '.$pk_name.' = '.$_POST[$prfx.$pk_name][$j];
// $this->debug('edit_db', 'UP: $q');
// $this->log->debug('edit_db', 'UP: $q');
// $this->dbExec($q);
$this->msg .= $this->l->__('Disabled deselected entries from list<br>');
$this->warning = 1;
@@ -634,13 +635,13 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
} elseif (isset($this->element_list[$element_list[$i]]['read_data']) &&
$this->element_list[$element_list[$i]]['delete']
) {
// $this->debug('form_clean', 'ID [$id] [$prfx.$pk_name]');
// $this->debug('form_clean', 'ID arr: '.$this->printAr($_POST[$id]));
// $this->debug('form_clean', 'PK arr: '.$this->printAr($_POST[$prfx.$pk_name]));
// $this->log->debug('form_clean', 'ID [$id] [$prfx.$pk_name]');
// $this->log->debug('form_clean', 'ID arr: '.$this->log->prAr($_POST[$id]));
// $this->log->debug('form_clean', 'PK arr: '.$this->log->prAr($_POST[$prfx.$pk_name]));
for ($j = 0, $j_max = count($_POST[$prfx.$pk_name]); $j < $j_max; $j ++) {
if (!$_POST[$remove_name[$i]][$j] && $_POST[$prfx.$pk_name][$j]) {
$q = 'DELETE FROM '.$element_list[$i].' WHERE '.$pk_name.' = '.$_POST[$prfx.$pk_name][$j];
// $this->debug('edit_db', 'DEL: $q');
// $this->log->debug('edit_db', 'DEL: $q');
$this->dbExec($q);
$this->msg .= $this->l->__('Deleted deselected entries from list<br>');
$this->warning = 1;
@@ -662,8 +663,8 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
{
$pk_selected = '';
$t_pk_name = '';
$pk_names = array();
$pk_ids = array();
$pk_names = [];
$pk_ids = [];
// when security level is okay ...
if (isset($this->security_level['load']) &&
$this->base_acl_level >= $this->security_level['load']
@@ -705,12 +706,12 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$pk_names[] = $t_string;
}
} // show it at all
return array(
return [
't_pk_name' => $t_pk_name,
'pk_ids' => $pk_ids,
'pk_names' => $pk_names,
'pk_selected' => $pk_selected
);
];
}
/**
@@ -736,10 +737,10 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$new_name = $this->l->__('New');
}
} // security level okay
return array(
return [
'new_name' => $new_name,
'show_checkbox' => $show_checkbox
);
];
}
/**
@@ -783,7 +784,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$show_delete = 1;
}
} // print save/delete row at all$
return array(
return [
'seclevel_okay' => $seclevel_okay,
'save' => $save,
'pk_name' => $pk_name,
@@ -791,7 +792,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
'show_delete' => $show_delete,
'old_school_hidden' => $old_school_hidden,
'hide_delete_checkbox' => $hide_delete_checkbox
);
];
} // end of function
/**
@@ -804,7 +805,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
*/
public function formCreateElement(string $element_name, ?string $query = null): array
{
$data = array();
$data = [];
// special 2nd color for 'binary' attribut
if ($this->table_array[$element_name]['type'] == 'binary' && !isset($this->table_array[$element_name]['value'])) {
$EDIT_FGCOLOR_T = 'edit_fgcolor_no';
@@ -997,12 +998,12 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$data['value'] = $this->table_array[$element_name]['value'];
}
}
return array(
return [
'output_name' => $output_name,
'color' => $EDIT_FGCOLOR_T,
'type' => $type,
'data' => $data
);
];
}
/**
@@ -1016,16 +1017,16 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
public function formErrorCheck(): void
{
if (!is_array($this->table_array)) {
$this->table_array = array();
$this->table_array = [];
}
reset($this->table_array);
foreach ($this->table_array as $key => $value) {
//if ($value['mandatory'] && $value['error_check'])
// if error value set && somethign input, check if input okay
if (isset($value['error_check']) && isset($this->table_array[$key]['value']) && !empty($this->table_array[$key]['value'])) {
$this->debug('ERROR CHECK', 'Key: '.$key.' => '.$value['error_check']);
$this->log->debug('ERROR CHECK', 'Key: '.$key.' => '.$value['error_check']);
// each error check can be a piped seperated value, lets split it
// $this->debug('edit', $value['error_check']);
// $this->log->debug('edit', $value['error_check']);
foreach (explode('|', $value['error_check']) as $error_check) {
switch ($error_check) {
case 'number':
@@ -1034,12 +1035,12 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
}
break;
case 'date': // YYYY-MM-DD
if (!$this->checkDate($this->table_array[$key]['value'])) {
if (!\CoreLibs\Combined\DateTime::checkDate($this->table_array[$key]['value'])) {
$this->msg .= sprintf($this->l->__('Please enter a vailid date (YYYY-MM-DD) for the <b>%s</b> Field!<br>'), $this->table_array[$key]['output_name']);
}
break;
case 'time': // HH:MM[:SS]
if (!$this->checkDateTime($this->table_array[$key]['value'])) {
if (!\CoreLibs\Combined\DateTime::checkDateTime($this->table_array[$key]['value'])) {
$this->msg .= sprintf($this->l->__('Please enter a vailid time (HH:MM[:SS]) for the <b>%s</b> Field!<br>'), $this->table_array[$key]['output_name']);
}
break;
@@ -1073,20 +1074,20 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
}
break;
case 'alphanumericspace':
// $this->debug('edit', 'IN Alphanumericspace');
// $this->log->debug('edit', 'IN Alphanumericspace');
if (!preg_match("/^[0-9A-Za-z_\-\ ]+$/", $this->table_array[$key]['value'])) {
$this->msg .= sprintf($this->l->__('Please enter a valid alphanumeric (Numbers and Letters, -, _ and spaces allowed) value for the <b>%s</b> Field!<br>'), $this->table_array[$key]['output_name']);
}
break;
case 'alphanumeric':
// $this->debug('edit', 'IN Alphanumeric');
// $this->log->debug('edit', 'IN Alphanumeric');
if (!preg_match("/^[0-9A-Za-z_\-]+$/", $this->table_array[$key]['value'])) {
$this->msg .= sprintf($this->l->__('Please enter a valid alphanumeric (Numbers and Letters only also - and _, no spaces) value for the <b>%s</b> Field!<br>'), $this->table_array[$key]['output_name']);
}
break;
// this one also allows @ and .
case 'alphanumericextended':
// $this->debug('edit', 'IN Alphanumericextended');
// $this->log->debug('edit', 'IN Alphanumericextended');
if (!preg_match("/^[0-9A-Za-z_\-@\.]+$/", $this->table_array[$key]['value'])) {
$this->msg .= sprintf($this->l->__('Please enter a valid alphanumeric extended (Numbers, Letters, -, _, @ and . only, no spaces) value for the <b>%s</b> Field!<br>'), $this->table_array[$key]['output_name']);
}
@@ -1101,7 +1102,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
case 'json':
// check if valid json
$json_out = json_decode($this->table_array[$key]['value'], true);
$this->debug('JSON ENCODE', 'LAST ERROR: '.json_last_error().' WITH: '.$this->table_array[$key]['value']);
$this->log->debug('JSON ENCODE', 'LAST ERROR: '.json_last_error().' WITH: '.$this->table_array[$key]['value']);
if (json_last_error()) {
$this->msg .= sprintf($this->l->__('Please enter a valid JSON string for the field <b>%s<b>: %s'), $this->table_array[$key]['output_name'], json_last_error_msg());
}
@@ -1121,7 +1122,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
// main if end
) {
// if mandatory && no input
// $this->debug('form', 'A: '.$this->table_array[$key]['type'].' -- '.$this->table_array[$key]['input_value'].' -- '.$this->table_array[$key]['value']);
// $this->log->debug('form', 'A: '.$this->table_array[$key]['type'].' -- '.$this->table_array[$key]['input_value'].' -- '.$this->table_array[$key]['value']);
if (!$this->table_array[$key]['value'] && $this->table_array[$key]['type'] != 'binary') {
$this->msg .= sprintf($this->l->__('Please enter something into the <b>%s</b> field!<br>'), $this->table_array[$key]['output_name']);
}
@@ -1160,15 +1161,15 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
}
}
} else {
$this->reference_array = array();
$this->reference_array = [];
}
// $this->debug('edit_error', 'QS: <pre>'.print_r($_POST, true).'</pre>');
// $this->log->debug('edit_error', 'QS: <pre>'.print_r($_POST, true).'</pre>');
if (is_array($this->element_list)) {
// check the mandatory stuff
// if mandatory, check that at least on pk exists or if at least the mandatory field is filled
foreach ($this->element_list as $table_name => $reference_array) {
if (!is_array($reference_array)) {
$reference_array = array();
$reference_array = [];
}
// set pk/fk id for this
$_pk_name = '';
@@ -1194,17 +1195,17 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
) {
$max = count($_POST[$prfx.$key]);
}
// $this->debug('edit_error_chk', 'KEY: $prfx$key | count: '.count($_POST[$prfx.$key]).' | M: $max');
// $this->debug('edit_error_chk', 'K: '.$_POST[$prfx.$key].' | '.$_POST[$prfx.$key][0]);
// $this->log->debug('edit_error_chk', 'KEY: $prfx$key | count: '.count($_POST[$prfx.$key]).' | M: $max');
// $this->log->debug('edit_error_chk', 'K: '.$_POST[$prfx.$key].' | '.$_POST[$prfx.$key][0]);
}
$this->debug('POST ARRAY', $this->printAr($_POST));
$this->log->debug('POST ARRAY', $this->log->prAr($_POST));
// init variables before inner loop run
$mand_okay = 0;
$mand_name = '';
$row_okay = array();
$default_wrong = array();
$error = array();
$element_set = array();
$row_okay = [];
$default_wrong = [];
$error = [];
$element_set = [];
# check each row
for ($i = 0; $i < $max; $i ++) {
// either one of the post pks is set, or the mandatory
@@ -1222,7 +1223,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
}
// we found a mandatory field. check now if one is set to satisfy the main mandatory
// also check, if this field is mandatory and its not set, but any other, throw an error
// $this->debug('edit_error_chk', 'RG error - Data['.$prfx.$el_name.': '.$_POST[$prfx.$el_name][$i].' | '.$_POST[$prfx.$el_name].' - '.$reference_array['enable_name'].' - '.$_POST[$reference_array['enable_name']][$_POST[$prfx.$el_name][$i]]);
// $this->log->debug('edit_error_chk', 'RG error - Data['.$prfx.$el_name.': '.$_POST[$prfx.$el_name][$i].' | '.$_POST[$prfx.$el_name].' - '.$reference_array['enable_name'].' - '.$_POST[$reference_array['enable_name']][$_POST[$prfx.$el_name][$i]]);
if (isset($data_array['mandatory']) &&
$data_array['mandatory'] &&
isset($_POST[$prfx.$el_name][$i]) &&
@@ -1234,12 +1235,12 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
!isset($_POST[$prfx.$el_name])
) {
// radio group and set where one not active
// $this->debug('edit_error_chk', 'RADIO GROUP');
// $this->log->debug('edit_error_chk', 'RADIO GROUP');
$row_okay[$_POST[$prfx.$el_name][$i] ?? 0] = 0;
$default_wrong[$_POST[$prfx.$el_name][$i] ?? 0] = 1;
$error[$_POST[$prfx.$el_name][$i] ?? 0] = 1;
} elseif (isset($_POST[$prfx.$el_name][$i]) && !isset($error[$i])) {
// $this->debug('edit_error_chk', '[$i]');
// $this->log->debug('edit_error_chk', '[$i]');
$element_set[$i] = 1;
$row_okay[$i] = 1;
} elseif (isset($data_array['mandatory']) &&
@@ -1332,7 +1333,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
{
$this->pk_id = null;
if (!is_array($this->table_array)) {
$this->table_array = array();
$this->table_array = [];
}
reset($this->table_array);
foreach ($this->table_array as $key => $value) {
@@ -1345,7 +1346,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
}
if (is_array($this->reference_array)) {
if (!is_array($this->reference_array)) {
$this->reference_array = array();
$this->reference_array = [];
}
reset($this->reference_array);
foreach ($this->reference_array as $key => $value) {
@@ -1370,7 +1371,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
// reset all temp fields
if (!is_array($this->table_array)) {
$this->table_array = array();
$this->table_array = [];
}
reset($this->table_array);
foreach ($this->table_array as $key => $value) {
@@ -1380,7 +1381,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
if (is_array($this->reference_array)) {
// load each reference_table
if (!is_array($this->reference_array)) {
$this->reference_array = array();
$this->reference_array = [];
}
reset($this->reference_array);
foreach ($this->reference_array as $key => $value) {
@@ -1407,17 +1408,17 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
// for drop_down_db_input check if text field is filled and if, if not yet in db ...
// and upload files
if (!is_array($this->table_array)) {
$this->table_array = array();
$this->table_array = [];
}
reset($this->table_array);
foreach ($this->table_array as $key => $value) {
// drop_down_db with input + reference table
// $this->debug('form', 'A: '.$this->table_array[$key]['type'].' --- '.$this->table_array[$key]['input_value']);
// $this->log->debug('form', 'A: '.$this->table_array[$key]['type'].' --- '.$this->table_array[$key]['input_value']);
if (isset($this->table_array[$key]['type']) &&
$this->table_array[$key]['type'] == 'drop_down_db_input' &&
$this->table_array[$key]['input_value']
) {
// $this->debug('form', 'HERE');
// $this->log->debug('form', 'HERE');
// check if this text name already exists (lowercase compare)
$q = 'SELECT '.$this->table_array[$key]['pk_name'].' FROM '.$this->table_array[$key]['table_name'].' WHERE LCASE('.$this->table_array[$key]['input_name'].') = '."'".$this->dbEscapeString(strtolower($this->table_array[$key]['input_value']))."'";
// if a where was given, add here
@@ -1471,8 +1472,8 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
// if smth in $key, keep as is
// $_file=$key.'_file';
// $_delete=$key.'_delete';
// $this->debug('form', 'UF: '.$GLOBALS['_FILES'][$key.'_file']['name']);
// $this->debug('form', 'delete: '.$key.'_delete => '.$GLOBALS[$key.'_delete']);
// $this->log->debug('form', 'UF: '.$GLOBALS['_FILES'][$key.'_file']['name']);
// $this->log->debug('form', 'delete: '.$key.'_delete => '.$GLOBALS[$key.'_delete']);
if ($GLOBALS['_FILES'][$key.'_file']['name']) {
// check if dir exists
if (is_dir($this->table_array[$key]['save_dir'])) {
@@ -1502,7 +1503,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
if (isset($this->table_array[$key]['type']) && $this->table_array[$key]['type'] == 'password') {
if ($this->table_array[$key]['value']) {
// use the better new passwordSet instead of crypt based
$this->table_array[$key]['value'] = $this->passwordSet($this->table_array[$key]['value']);
$this->table_array[$key]['value'] = \CoreLibs\Check\Password::passwordSet($this->table_array[$key]['value']);
$this->table_array[$key]['HIDDEN_value'] = $this->table_array[$key]['value'];
} else {
// $this->table_array[$key]['HIDDEN_value'] =
@@ -1518,7 +1519,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
// write reference array(s) if necessary
if (is_array($this->reference_array)) {
if (!is_array($this->reference_array)) {
$this->reference_array = array();
$this->reference_array = [];
}
reset($this->reference_array);
foreach ($this->reference_array as $reference_array) {
@@ -1533,18 +1534,18 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
} // if reference arrays
// write element list
if (isset($this->element_list) && is_array($this->element_list)) {
$type = array();
$type = [];
reset($this->element_list);
foreach ($this->element_list as $table_name => $reference_array) {
// init arrays
$q_begin = array();
$q_middle = array();
$q_end = array();
$q_names = array();
$q_data = array();
$q_values = array();
$no_write = array();
$block_write = array();
$q_begin = [];
$q_middle = [];
$q_end = [];
$q_names = [];
$q_data = [];
$q_values = [];
$no_write = [];
$block_write = [];
// get the number of keys from the elements array
$keys = array_keys($reference_array['elements']);
// element prefix name
@@ -1556,21 +1557,21 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$max = count($_POST[$prfx.$key]);
}
}
$this->debug('REF ELEMENT', 'RUN FOR TABLE: '.$table_name);
// $this->debug('edit_error', 'MAX: $max');
$this->log->debug('REF ELEMENT', 'RUN FOR TABLE: '.$table_name);
// $this->log->debug('edit_error', 'MAX: $max');
// check if there is a hidden key, update, else insert
foreach ($reference_array['elements'] as $el_name => $data_array) {
// $this->debug('edit_error_query', 'QUERY: '.$this->printAr($_POST));
// $this->log->debug('edit_error_query', 'QUERY: '.$this->log->prAr($_POST));
// go through all submitted data
// for ($i = 0; $i < count($_POST[$el_name]); $i ++)
for ($i = 0; $i < $max; $i ++) {
if (!isset($no_write[$i])) {
$no_write[$i] = 0;
// $this->debug('REF ELEMENT', 'Init no write for pos: '.$i);
// $this->log->debug('REF ELEMENT', 'Init no write for pos: '.$i);
}
if (!isset($block_write[$i])) {
$block_write[$i] = 0;
// $this->debug('REF ELEMENT', 'Init block write for pos: '.$i);
// $this->log->debug('REF ELEMENT', 'Init block write for pos: '.$i);
}
// if we have enable name & delete set, then only insert/update those which are flagged as active
// check if mandatory field is set, if not set 'do not write flag'
@@ -1580,15 +1581,18 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
) {
$no_write[$i] = 1;
}
// $this->debug('REF ELEMENT', "[$i] [".$prfx.$el_name."]: MANDATORY: ".isset($data_array['mandatory'])." SET: ".isset($_POST[$prfx.$el_name][$i]).", EMPTY: ".empty($_POST[$prfx.$el_name][$i])." | DO ACTION ".((!isset($_POST[$prfx.$el_name][$i]) || (isset($_POST[$prfx.$el_name][$i]) && empty($_POST[$prfx.$el_name][$i]))) ? 'YES' : 'NO')." => NO WRITE: ".$no_write[$i]);
// $this->log->debug('REF ELEMENT', "[$i] [".$prfx.$el_name."]: MANDATORY: ".isset($data_array['mandatory'])
// ." SET: ".isset($_POST[$prfx.$el_name][$i]).", EMPTY: ".empty($_POST[$prfx.$el_name][$i])
// ." | DO ACTION ".((!isset($_POST[$prfx.$el_name][$i]) || (isset($_POST[$prfx.$el_name][$i]) && empty($_POST[$prfx.$el_name][$i]))) ? 'YES' : 'NO')." => NO WRITE: ".$no_write[$i]);
if (!empty($reference_array['enable_name']) &&
isset($reference_array['delete']) && $reference_array['delete'] &&
(!isset($_POST[$reference_array['enable_name']][$i]) || empty($_POST[$reference_array['enable_name']][$i]))
) {
$no_write[$i] = 1;
}
// $this->debug('REF ELEMENT', "[$i] [".$prfx.$el_name."]: ENABLED NAME: ".isset($reference_array['enable_name']).", DELETE: ".isset($reference_array['delete']).", NOT ENABLED FOR POS: ".(isset($reference_array['enable_name']) ? isset($_POST[$reference_array['enable_name']][$i]) : '-'));
$this->debug('REF ELEMENT', "[$i] [".$prfx.$el_name."]: WRITE: ".$no_write[$i]);
// $this->log->debug('REF ELEMENT', "[$i] [".$prfx.$el_name."]: ENABLED NAME: ".isset($reference_array['enable_name'])
// .", DELETE: ".isset($reference_array['delete']).", NOT ENABLED FOR POS: ".(isset($reference_array['enable_name']) ? isset($_POST[$reference_array['enable_name']][$i]) : '-'));
$this->log->debug('REF ELEMENT', "[$i] [".$prfx.$el_name."]: WRITE: ".$no_write[$i]);
// flag if data is in the text field and we are in a reference data set
if (isset($reference_array['type']) && $reference_array['type'] == 'reference_data') {
if (!empty($data_array['type']) && $data_array['type'] == 'text' &&
@@ -1599,7 +1603,8 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
} else {
$block_write[$i] = 1;
}
// $this->debug('REF ELEMENT', "[$i] [".$prfx.$el_name."]: REFERENCE TYPE: ".isset($reference_array['type']).", SET REFERENCE TYPE: ".(isset($reference_array['type']) ? $reference_array['type'] : '-').", DATA TYPE: ".$data_array['type'].", SET: ".isset($_POST[$prfx.$el_name][$i]).", => BLOCK WIRTE: ".$block_write[$i]);
// $this->log->debug('REF ELEMENT', "[$i] [".$prfx.$el_name."]: REFERENCE TYPE: ".isset($reference_array['type'])
// .", SET REFERENCE TYPE: ".(isset($reference_array['type']) ? $reference_array['type'] : '-').", DATA TYPE: ".$data_array['type'].", SET: ".isset($_POST[$prfx.$el_name][$i]).", => BLOCK WIRTE: ".$block_write[$i]);
// set type and boundaries for insert/update
if (isset($data_array['pk_id']) &&
!empty($data_array['pk_id']) &&
@@ -1608,7 +1613,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$q_begin[$i] = 'UPDATE '.$table_name.' SET ';
$q_end[$i] = ' WHERE '.$el_name.' = '.$_POST[$prfx.$el_name][$i];
$type[$i] = 'update';
$this->debug('REF ELEMENT', 'SET UPDATE');
$this->log->debug('REF ELEMENT', 'SET UPDATE');
} elseif (isset($data_array['pk_id']) &&
!empty($data_array['pk_id']) &&
empty($_POST[$prfx.$el_name][$i])
@@ -1617,13 +1622,13 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$q_middle[$i] = ') VALUES (';
$q_end[$i] = ')';
$type[$i] = 'insert';
$this->debug('REF ELEMENT', 'SET INSERT');
$this->log->debug('REF ELEMENT', 'SET INSERT');
}
// $this->debug('REF ELEMENT', "[$i] [".$prfx.$el_name."] PK SET: ".isset($data_array['pk_id']).'/'.empty($data_array['pk_id']).', KEY SET: '.empty($_POST[$prfx.$el_name][$i])." -> TYPE: ".(isset($type[$i]) ? $type[$i] : '-'));
// $this->log->debug('REF ELEMENT', "[$i] [".$prfx.$el_name."] PK SET: ".isset($data_array['pk_id']).'/'.empty($data_array['pk_id']).', KEY SET: '.empty($_POST[$prfx.$el_name][$i])." -> TYPE: ".(isset($type[$i]) ? $type[$i] : '-'));
// write all data (insert/update) because I don't know until all are processed if it is insert or update
// don't write primary key backup for update
// for reference_data type, only write if at least one text type field is set
// $this->debug('edit_error', 'I: $i | EL Name: '.$prfx.$el_name.' | Data: '.$_POST[$prfx.$el_name][$i].' | Type: '.$type[$i].' | PK: '.$data_array['pk_id'].', Block write: '.$block_write[$i]);
// $this->log->debug('edit_error', 'I: $i | EL Name: '.$prfx.$el_name.' | Data: '.$_POST[$prfx.$el_name][$i].' | Type: '.$type[$i].' | PK: '.$data_array['pk_id'].', Block write: '.$block_write[$i]);
// only add elements that are not PK or FK flaged
if (!isset($data_array['pk_id']) && !isset($data_array['fk_id'])) {
// update data list
@@ -1701,7 +1706,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$q_end[$i];
}
/** @phan-suppress-next-line PhanTypePossiblyInvalidDimOffset */
$this->debug('edit', 'Pos['.$i.'] => '.$type[$i].' Q: '.$q.'<br>');
$this->log->debug('edit', 'Pos['.$i.'] => '.$type[$i].' Q: '.$q.'<br>');
// write the dataset
if ($q) {
$this->dbExec($q);
@@ -1714,17 +1719,16 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$this->msg = $this->l->__('Dataset has been saved!<Br>');
}
// METHOD: formDeleteTableArray
// WAS : form_delete_table_array
// PARAMS: none
// RETURN: none
// DESC : delete a table and reference fields
/**
* delete a table and reference fields
* @return void
*/
public function formDeleteTableArray()
{
// remove any reference arrays
if (is_array($this->reference_array)) {
if (!is_array($this->reference_array)) {
$this->reference_array = array();
$this->reference_array = [];
}
reset($this->reference_array);
foreach ($this->reference_array as $reference_array) {
@@ -1735,7 +1739,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
// remove any element list references
if (is_array($this->element_list)) {
if (!is_array($this->element_list)) {
$this->element_list = array();
$this->element_list = [];
}
reset($this->element_list);
foreach ($this->element_list as $table_name => $data_array) {
@@ -1745,7 +1749,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
}
// unlink ALL files
if (!is_array($this->table_array)) {
$this->table_array = array();
$this->table_array = [];
}
reset($this->table_array);
foreach ($this->table_array as $key => $value) {
@@ -1758,16 +1762,16 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$this->msg = $this->l->__('Dataset has been deleted!');
}
// METHOD: formCreateHiddenFields
// WAS : form_create_hidden_fields
// PARAMS: $hidden_array
// RETURN: the input fields (html)
// DESC : creates HTML hidden input fields out of an hash array
public function formCreateHiddenFields($hidden_array = array())
/**
* creates HTML hidden input fields out of an hash array
* @param array $hidden_array The list of fields to be added as hidden
* @return array key -> value list of hidden fileds data
*/
public function formCreateHiddenFields(array $hidden_array = []): array
{
$hidden = array();
$hidden = [];
if (!is_array($this->table_array)) {
$this->table_array = array();
$this->table_array = [];
}
reset($this->table_array);
foreach ($this->table_array as $key => $value) {
@@ -1784,20 +1788,20 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
if (is_array($hidden_array)) {
reset($hidden_array);
foreach ($hidden_array as $key => $value) {
$hidden[] = array('key' => $key, 'value' => $value);
$hidden[] = ['key' => $key, 'value' => $value];
}
}
return $hidden;
}
// METHOD: formCreateElementReferenceTable
// WAS : form_create_element_reference_table
// PARAMS: show which reference table
// RETURN: array for output
// DESC : creates the multiple select part for a reference_table
public function formCreateElementReferenceTable($table_name)
/**
* creates the multiple select part for a reference_table
* @param string $table_name Table name for reference array lookup
* @return array Reference table output array
*/
public function formCreateElementReferenceTable(string $table_name): array
{
$data = array();
$data = [];
$output_name = $this->reference_array[$table_name]['output_name'];
if (isset($this->reference_array[$table_name]['mandatory']) &&
$this->reference_array[$table_name]['mandatory']
@@ -1809,13 +1813,18 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
while ($res = $this->dbReturn($this->reference_array[$table_name]['query'])) {
$data['value'][] = $res[0];
$data['output'][] = $res[1];
$data['selected'][] = ($this->checked(
$data['selected'][] = (\CoreLibs\Convert\Html::checked(
$this->reference_array[$table_name]['selected'] ?? '',
$res[0]
)) ? $res[0] : '';
}
$type = 'reference_table';
return array('output_name' => $output_name, 'type' => $type, 'color' => 'edit_fgcolor', 'data' => $data);
return [
'output_name' => $output_name,
'type' => $type,
'color' => 'edit_fgcolor',
'data' => $data
];
}
/**
@@ -1829,22 +1838,22 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
public function formCreateElementListTable(string $table_name): array
{
// init data rray
$data = array(
$data = [
'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(),
'type' => [],
'output_name' => [],
'preset' => [],
'element_list' => [],
'output_data' => [],
'content' => [],
'pos' => [],
'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']) &&
@@ -1870,15 +1879,15 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
// build the select part
if (!isset($this->element_list[$table_name]['elements']) || !is_array($this->element_list[$table_name]['elements'])) {
$this->element_list[$table_name]['elements'] = array();
$this->element_list[$table_name]['elements'] = [];
}
reset($this->element_list[$table_name]['elements']);
// generic data read in (counts for all rows)
// visible list data output
$q_select = array();
$proto = array();
$q_select = [];
$proto = [];
foreach ($this->element_list[$table_name]['elements'] as $el_name => $data_array) {
// $this->debug('CFG', 'El: '.$el_name.' -> '.$this->printAr($data_array));
// $this->log->debug('CFG', 'El: '.$el_name.' -> '.$this->log->prAr($data_array));
// if the element name matches the read array, then set the table as a name prefix
// this is for reading the data
$q_select[] = $el_name;
@@ -1901,7 +1910,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$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: '.($data_array['preset'] ?? '-').' | set: '.($data['preset'][$el_name] ?? '-'));
$this->log->debug('edit', 'Q['.$md_q.'] pos: '.$this->cursor_ext[$md_q]['pos'].' | want: '.($data_array['preset'] ?? '-').' | set: '.($data['preset'][$el_name] ?? '-'));
// first is default for this element
if (isset($data_array['preset']) &&
(!isset($data['preset'][$el_name]) || empty($data['preset'][$el_name])) &&
@@ -1916,8 +1925,8 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
} elseif (isset($data_array['element_list'])) {
$data['element_list'][$el_name] = $data_array['element_list']; // this is for the checkboxes
}
$this->debug('CREATE ELEMENT LIST TABLE', 'Table: '.$table_name.', Post: '.$el_name.' => '.
((isset($_POST[$el_name]) && is_array($_POST[$el_name])) ? 'AS ARRAY'/*.$this->printAr($_POST[$el_name])*/ : 'NOT SET/OR NOT ARRAY').
$this->log->debug('CREATE ELEMENT LIST TABLE', 'Table: '.$table_name.', Post: '.$el_name.' => '.
((isset($_POST[$el_name]) && is_array($_POST[$el_name])) ? 'AS ARRAY'/*.$this->log->prAr($_POST[$el_name])*/ : 'NOT SET/OR NOT ARRAY').
((isset($_POST[$el_name]) && !is_array($_POST[$el_name])) ? $_POST[$el_name] : ''));
// if error, check new line addition so we don't loose it
if ($this->error) {
@@ -1932,17 +1941,17 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
}
// $proto[$el_name] = $this->error ? $_POST[$el_name][(count($_POST[$el_name]) - 1)] : '';
}
// $this->debug('CFG DATA', 'Data: '.$this->printAr($data));
// $this->debug('CFG PROTO', 'Proto: '.$this->printAr($proto));
// $this->debug('CFG SELECT', 'Proto: '.$this->printAr($q_select));
// $this->log->debug('CFG DATA', 'Data: '.$this->log->prAr($data));
// $this->log->debug('CFG PROTO', 'Proto: '.$this->log->prAr($proto));
// $this->log->debug('CFG SELECT', 'Proto: '.$this->log->prAr($q_select));
// query for reading in the data
$this->debug('edit_error', 'ERR: '.$this->error);
$this->log->debug('edit_error', 'ERR: '.$this->error);
// if we got a read data, build the read select for the read, and read out the 'selected'
/** @phan-assert array $this->element_list[$table_name]['read_data'] */
if (isset($this->element_list[$table_name]['read_data'])) {
// we need a second one for the query build only
// prefix all elements with the $table name
$_q_select = array();
$_q_select = [];
foreach ($q_select as $_pos => $element) {
$_q_select[$_pos] = $table_name.'.'.$element;
}
@@ -2003,19 +2012,19 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$q = 'SELECT '.implode(', ', $q_select).' FROM '.$table_name.' WHERE '.$this->int_pk_name.' = '.$this->table_array[$this->int_pk_name]['value'];
}
}
// $this->debug('CFG QUERY', 'Q: '.$q);
// $this->log->debug('CFG QUERY', 'Q: '.$q);
// only run if we have query strnig
if (isset($q)) {
$pos = 0; // position in while for overwrite if needed
// read out the list and add the selected data if needed
while ($res = $this->dbReturn($q)) {
$_data = array();
$_data = [];
$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
$el_name = $q_select[$i];
// $this->debug('edit_error', '[$i] ELNAME: $el_name | POS[$prfx$el_name]: '.$_POST[$prfx.$el_name][$pos].' | RES: '.$res[$el_name]);
// $this->log->debug('edit_error', '[$i] ELNAME: $el_name | POS[$prfx$el_name]: '.$_POST[$prfx.$el_name][$pos].' | RES: '.$res[$el_name]);
// if we have an error, we take what we have in the vars, if not we take the data from the db
if ($this->error) {
// if we have a radio group, set a bit different
@@ -2035,7 +2044,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
}
}
$data['content'][] = $_data;
$data['pos'][] = array(0 => $pos); // this is for the checkboxes
$data['pos'][] = [0 => $pos]; // this is for the checkboxes
$pos ++; // move up one
// reset and unset before next run
unset($_data);
@@ -2056,16 +2065,16 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
// check if we need to fill fields
$element_count = (isset($data['content']) && is_array($data['content'])) ? count($data['content']) : 0;
$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);
$this->log->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
) {
for ($pos = $element_count, $pos_max = $this->element_list[$table_name]['max_empty'] + $element_count; $pos <= $pos_max; $pos ++) {
$_data = array();
$_data = [];
// just in case
if (!isset($data['type'])) {
$data['type'] = array();
$data['type'] = [];
}
// the fields that need to be filled are in data->type array:
// pk fields are unfilled
@@ -2085,10 +2094,10 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
}
$data['content'][] = $_data;
// this is for the checkboxes
$data['pos'][] = array(
$data['pos'][] = [
0 => $pos
);
$this->debug('CFG ELEMENT LIST FILL', 'Pos: '.$pos.'/'.$pos_max.', Content: '.count($data['content']).', Pos: '.count($data['pos']));
];
$this->log->debug('CFG ELEMENT LIST FILL', 'Pos: '.$pos.'/'.$pos_max.', Content: '.count($data['content']).', Pos: '.count($data['pos']));
}
}
}
@@ -2097,18 +2106,18 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
if (isset($data['delete_name']) && !empty($data['delete_name'])) {
$data['content'][] = $proto;
// we also need the pos add or we through an error in smarty
$data['pos'][] = array(
$data['pos'][] = [
0 => isset($data['pos']) ? count($data['pos']) : 0
);
];
}
// $this->debug('CFG ELEMENT LIST FILL', 'Data array: '.$this->printAr($data));
// $this->log->debug('CFG ELEMENT LIST FILL', 'Data array: '.$this->log->prAr($data));
$type = 'element_list';
return array(
return [
'output_name' => $output_name,
'type' => $type,
'color' => 'edit_fgcolor',
'data' => $data
);
];
}
} // end of class

View File

@@ -0,0 +1,40 @@
<?php declare(strict_types=1);
/*
* sets a form token in the _SESSION variable
*/
namespace CoreLibs\Output\Form;
class Token
{
/**
* sets a form token in a session and returns form token
* @param string $name optional form name, default form_token
* @return string token name for given form id string
*/
public static function setFormToken(string $name = 'form_token'): string
{
// current hard set to sha256
$token = uniqid(hash('sha256', (string)rand()));
$_SESSION[$name] = $token;
return $token;
}
/**
* checks if the form token matches the session set form token
* @param string $token token string to check
* @param string $name optional form name to check to, default form_token
* @return bool false if not set, or true/false if matching or not mtaching
*/
public static function validateFormToken(string $token, string $name = 'form_token'): bool
{
if (isset($_SESSION[$name])) {
return $_SESSION[$name] === $token;
} else {
return false;
}
}
}
// __END_

View File

@@ -0,0 +1,422 @@
<?php declare(strict_types=1);
/*
* image thumbnail, rotate, etc
*/
namespace CoreLibs\Output;
class Image
{
/**
* converts picture to a thumbnail with max x and max y size
* @param string $pic source image file with or without path
* @param int $size_x maximum size width
* @param int $size_y maximum size height
* @param string $dummy empty, or file_type to show an icon instead of nothing if file is not found
* @param string $path if source start is not ROOT path, if empty ROOT is choosen
* @param string $cache_source cache path, if not given TMP is used
* @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
) {
// get image type flags
$image_types = array(
1 => 'gif',
2 => 'jpg',
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 {
$tmp_src = BASE.TMP;
}
// check if pic has a path, and override next sets
if (strstr($pic, '/') === false) {
if (empty($path)) {
$path = BASE;
}
$filename = $path.MEDIA.PICTURES.$pic;
} else {
$filename = $pic;
// and get the last part for pic (the filename)
$tmp = explode('/', $pic);
$pic = $tmp[(count($tmp) - 1)];
}
// does this picture exist and is it a picture
if (file_exists($filename) && is_file($filename)) {
list($width, $height, $type) = getimagesize($filename);
$convert_prefix = '';
$create_file = false;
$delete_filename = '';
// check if we can skip the PDF creation: if we have size, if do not have type, we assume type png
if (!$type && is_numeric($size_x) && is_numeric($size_y)) {
$check_thumb = $tmp_src.'thumb_'.$pic.'_'.$size_x.'x'.$size_y.'.'.$image_types[3];
if (!is_file($check_thumb)) {
$create_file = true;
} else {
$type = 3;
}
}
// if type is not in the list, but returns as PDF, we need to convert to JPEG before
if (!$type) {
$output = [];
$return = null;
// is this a PDF, if no, return from here with nothing
$convert_prefix = 'png:';
# TEMP convert to PNG, we then override the file name
$convert_string = $CONVERT.' '.$filename.' '.$convert_prefix.$filename.'_TEMP';
$status = exec($convert_string, $output, $return);
$filename .= '_TEMP';
// for delete, in case we need to glob
$delete_filename = $filename;
// find file, if we can't find base name, use -0 as the first one (ignore other pages in multiple ones)
if (!is_file($filename)) {
$filename .= '-0';
}
list($width, $height, $type) = getimagesize($filename);
}
// if no size given, set size to original
if (!$size_x || $size_x < 1 || !is_numeric($size_x)) {
$size_x = $width;
}
if (!$size_y || $size_y < 1 || !is_numeric($size_y)) {
$size_y = $height;
}
$thumb = 'thumb_'.$pic.'_'.$size_x.'x'.$size_y.'.'.$image_types[$type];
$thumbnail = $tmp_src.$thumb;
// check if we already have this picture converted
if (!is_file($thumbnail) || $clear_cache == true) {
// convert the picture
if ($width > $size_x) {
$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)) {
list ($width, $height, $type) = getimagesize($thumbnail);
}
}
if ($height > $size_y) {
$convert_string = $CONVERT.' -geometry x'.$size_y.' '.$filename.' '.$thumbnail;
$status = exec($convert_string, $output, $return);
}
}
if (!is_file($thumbnail)) {
copy($filename, $thumbnail);
}
$return_data = $thumb;
// if we have a delete filename, delete here with glob
if ($delete_filename) {
array_map('unlink', glob($delete_filename.'*'));
}
} else {
if ($dummy && strstr($dummy, '/') === false) {
// check if we have the "dummy" image flag set
$filename = PICTURES.ICONS.strtoupper($dummy).".png";
if ($dummy && file_exists($filename) && is_file($filename)) {
$return_data = $filename;
} else {
$return_data = false;
}
} else {
$filename = $dummy;
}
}
return $return_data;
}
/**
* simple thumbnail creation for jpeg, png only
* TODO: add other types like gif, etc
* - bails with false on failed create
* - if either size_x or size_y are empty (0)
* the resize is to max of one size
* if both are set, those are the max sizes (aspect ration is always ekpt)
* - if path is not given will cache folder for current path set
* @param string $filename source file name with full path
* @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
* to use quick but less nice version
* @param int $jpeg_quality default 80, set image quality for jpeg only
* @return string|bool thumbnail with path
*/
public static function createThumbnailSimple(
string $filename,
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
) {
$thumbnail = false;
// $this->debug('IMAGE PREPARE', "FILE: $filename (exists ".(string)file_exists($filename)."), WIDTH: $thumb_width, HEIGHT: $thumb_height");
// check that input image exists and is either jpeg or png
// also fail if the basic CACHE folder does not exist at all
if (file_exists($filename) &&
is_dir(BASE.LAYOUT.CONTENT_PATH.CACHE) &&
is_writable(BASE.LAYOUT.CONTENT_PATH.CACHE)
) {
// $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 == IMAGETYPE_JPEG ||
$img_type == IMAGETYPE_PNG ||
$create_dummy === true
) {
// $this->debug('IMAGE PREPARE', "IMAGE TYPE OK: ".$inc_width.'x'.$inc_height);
// set thumbnail paths
$thumbnail_write_path = BASE.LAYOUT.CONTENT_PATH.CACHE.IMAGES;
$thumbnail_web_path = LAYOUT.CACHE.IMAGES;
// if images folder in cache does not exist create it, if failed, fall back to base cache folder
if (!is_dir($thumbnail_write_path)) {
if (false === mkdir($thumbnail_write_path)) {
$thumbnail_write_path = BASE.LAYOUT.CONTENT_PATH.CACHE;
$thumbnail_web_path = LAYOUT.CACHE;
}
}
}
// do resize or fall back on dummy run
if ($img_type == IMAGETYPE_JPEG ||
$img_type == IMAGETYPE_PNG
) {
// if missing width or height in thumb, use the set one
if ($thumb_width == 0) {
$thumb_width = $inc_width;
}
if ($thumb_height == 0) {
$thumb_height = $inc_height;
}
// check resize parameters
if ($inc_width > $thumb_width || $inc_height > $thumb_height) {
$thumb_width_r = 0;
$thumb_height_r = 0;
// we need to keep the aspect ration on longest side
if (($inc_height > $inc_width &&
// and the height is bigger than thumb set
$inc_height > $thumb_height) ||
// or the height is smaller or equal width
// but the width for the thumb is equal to the image height
($inc_height <= $inc_width &&
$inc_width == $thumb_width
)
) {
// $this->debug('IMAGE PREPARE', 'HEIGHT > WIDTH');
$ratio = $inc_height / $thumb_height;
$thumb_width_r = (int)ceil($inc_width / $ratio);
$thumb_height_r = $thumb_height;
} else {
// $this->debug('IMAGE PREPARE', 'WIDTH > HEIGHT');
$ratio = $inc_width / $thumb_width;
$thumb_width_r = $thumb_width;
$thumb_height_r = (int)ceil($inc_height / $ratio);
}
// $this->debug('IMAGE PREPARE', "Ratio: $ratio, Target size $thumb_width_r x $thumb_height_r");
// set output thumbnail name
$thumbnail = 'thumb-'.pathinfo($filename)['filename'].'-'.$thumb_width_r.'x'.$thumb_height_r;
if ($use_cache === false ||
!file_exists($thumbnail_write_path.$thumbnail)
) {
// image, copy source image, offset in image, source x/y, new size, source image size
$thumb = imagecreatetruecolor($thumb_width_r, $thumb_height_r);
if ($img_type == IMAGETYPE_PNG) {
// preservere transaprency
imagecolortransparent(
$thumb,
imagecolorallocatealpha($thumb, 0, 0, 0, 127)
);
imagealphablending($thumb, false);
imagesavealpha($thumb, true);
}
$source = null;
switch ($img_type) {
case IMAGETYPE_JPEG:
$source = imagecreatefromjpeg($filename);
break;
case IMAGETYPE_PNG:
$source = imagecreatefrompng($filename);
break;
}
// check that we have a source image resource
if ($source !== null) {
// resize no shift
if ($high_quality === true) {
imagecopyresized($thumb, $source, 0, 0, 0, 0, $thumb_width_r, $thumb_height_r, $inc_width, $inc_height);
} else {
imagecopyresampled($thumb, $source, 0, 0, 0, 0, $thumb_width_r, $thumb_height_r, $inc_width, $inc_height);
}
// write file
switch ($img_type) {
case IMAGETYPE_JPEG:
imagejpeg($thumb, $thumbnail_write_path.$thumbnail, $jpeg_quality);
break;
case IMAGETYPE_PNG:
imagepng($thumb, $thumbnail_write_path.$thumbnail);
break;
}
// free up resources (in case we are called in a loop)
imagedestroy($source);
imagedestroy($thumb);
} else {
$thumbnail = false;
}
}
} else {
// we just copy over the image as is, we never upscale
$thumbnail = 'thumb-'.pathinfo($filename)['filename'].'-'.$inc_width.'x'.$inc_height;
if ($use_cache === false ||
!file_exists($thumbnail_write_path.$thumbnail)
) {
copy($filename, $thumbnail_write_path.$thumbnail);
}
}
// add output path
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
return $thumbnail;
}
/**
* reads the rotation info of an file and rotates it to be correctly upright
* this is done because not all software honers the exit Orientation flag
* only works with jpg or png
* @param string $filename path + filename to rotate. This file must be writeable
* @return void
*/
public static function correctImageOrientation($filename): void
{
if (function_exists('exif_read_data') && is_writeable($filename)) {
list($inc_width, $inc_height, $img_type) = getimagesize($filename);
// add @ to avoid "file not supported error"
$exif = @exif_read_data($filename);
$orientation = null;
$img = null;
if ($exif && isset($exif['Orientation'])) {
$orientation = $exif['Orientation'];
}
if ($orientation != 1) {
switch ($img_type) {
case IMAGETYPE_JPEG:
$img = imagecreatefromjpeg($filename);
break;
case IMAGETYPE_PNG:
$img = imagecreatefrompng($filename);
break;
}
$deg = 0;
// 1 top, 6: left, 8: right, 3: bottom
switch ($orientation) {
case 3:
$deg = 180;
break;
case 6:
$deg = -90;
break;
case 8:
$deg = 90;
break;
}
if ($img !== null) {
if ($deg) {
$img = imagerotate($img, $deg, 0);
}
// then rewrite the rotated image back to the disk as $filename
switch ($img_type) {
case IMAGETYPE_JPEG:
imagejpeg($img, $filename);
break;
case IMAGETYPE_PNG:
imagepng($img, $filename);
break;
}
// clean up image if we have an image
imagedestroy($img);
}
} // only if we need to rotate
} // function exists & file is writeable, else do nothing
}
}
// __END__

View File

@@ -22,12 +22,12 @@ class ProgressBar
public $code; // unique code
public $status = 'new'; // current status (new,show,hide)
public $step = 0; // current step
public $position = array( // current bar position
public $position = [ // current bar position
'left' => null,
'top' => null,
'width' => null,
'height' => null,
);
];
public $clear_buffer_size = 1; // we need to send this before the lfush to get browser output
public $clear_buffer_size_init = 1024*1024; // if I don't send that junk, it won't send anything
@@ -50,7 +50,7 @@ class ProgressBar
public $direction = 'right'; // direction of motion (right,left,up,down)
public $frame = array('show' => false); // ProgressBar Frame
public $frame = ['show' => false]; // ProgressBar Frame
/* 'show' => false, # frame show (true/false)
'left' => 200, # frame position from left
'top' => 100, # frame position from top
@@ -61,8 +61,8 @@ class ProgressBar
'brd_color' => '#dfdfdf #404040 #404040 #dfdfdf' # frame border color
*/
public $label = array(); // ProgressBar Labels
/* 'name' => array( # label name
public $label = []; // ProgressBar Labels
/* 'name' => [ # label name
'type' => 'text', # label type (text,button,step,percent,crossbar)
'value' => 'Please wait ...', # label value
'left' => 10, # label position from left
@@ -75,7 +75,7 @@ class ProgressBar
'font-weight' => '', # label font weight
'color' => '#000000', # label font color
'bgr_color' => '' # label background color
)
]
*/
// output strings
@@ -166,7 +166,7 @@ class ProgressBar
$pixel = $bar - ($this->pedding * 2);
}
$position = array();
$position = [];
switch ($this->direction) {
case 'right':
$position['left'] = $this->pedding;
@@ -221,7 +221,7 @@ class ProgressBar
*/
public function setFrame(int $width = 0, int $height = 0): void
{
$this->frame = array(
$this->frame = [
'show' => true,
'left' => 20,
'top' => 35,
@@ -230,7 +230,7 @@ class ProgressBar
'color' => '#c0c0c0',
'border' => 2,
'brd_color' => '#dfdfdf #404040 #404040 #dfdfdf'
);
];
if ($width > 0) {
$this->frame['width'] = $width;
@@ -252,7 +252,7 @@ class ProgressBar
{
switch ($type) {
case 'text':
$this->label[$name] = array(
$this->label[$name] = [
'type' => 'text',
'value' => $value,
'left' => 0, // keep all to the left in box
@@ -265,10 +265,10 @@ class ProgressBar
'font-weight' => 'normal',
'color' => '#000000',
'bgr_color' => ''
);
];
break;
case 'button':
$this->label[$name] = array(
$this->label[$name] = [
'type' => 'button',
'value' => $value,
'action' => '',
@@ -283,10 +283,10 @@ class ProgressBar
'font-weight' => 'normal',
'color' => '#000000',
'bgr_color' => ''
);
];
break;
case 'step':
$this->label[$name] = array(
$this->label[$name] = [
'type' => 'step',
'value' => $value,
'left' => $this->left + 5,
@@ -299,7 +299,7 @@ class ProgressBar
'font-weight' => 'normal',
'color' => '#000000',
'bgr_color' => ''
);
];
break;
case 'percentlbl':
case 'percent':
@@ -309,7 +309,7 @@ class ProgressBar
} else {
$font_size = 11;
}
$this->label[$name] = array(
$this->label[$name] = [
'type' => $type, // either percent or percentlbl
'value' => $value,
'left' => false,
@@ -322,10 +322,10 @@ class ProgressBar
'font-weight' => 'normal',
'color' => '#000000',
'bgr_color' => ''
);
];
break;
case 'crossbar':
$this->label[$name] = array(
$this->label[$name] = [
'type' => 'crossbar',
'value' => $value,
'left' => $this->left + ($this->width / 2),
@@ -338,7 +338,7 @@ class ProgressBar
'font-weight' => 'normal',
'color' => '#000000',
'bgr_color' => ''
);
];
break;
}
}
@@ -373,7 +373,7 @@ class ProgressBar
// print "SET POSITION[$name]: $left<br>";
// if this is percent, we ignore anything, it is auto positioned
if ($this->label[$name]['type'] != 'percent') {
foreach (array('top', 'left', 'width', 'height') as $pos_name) {
foreach (['top', 'left', 'width', 'height'] as $pos_name) {
if ($$pos_name !== false) {
$this->label[$name][$pos_name] = intval($$pos_name);
}

View File

@@ -107,8 +107,8 @@ class SmartyExtend extends SmartyBC
// 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->register_modifier('getvar', [&$this, 'get_template_vars']);
$this->registerPlugin('modifier', 'getvar', [&$this, 'get_template_vars']);
$this->page_name = pathinfo($_SERVER["PHP_SELF"])['basename'];
@@ -357,7 +357,7 @@ class SmartyExtend extends SmartyBC
// 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/...')
// messages = ['msg' =>, 'class' => 'error/warning/...']
$this->DATA['messages'] = $cms->messages ?? [];
// the page name
$this->DATA['page_name'] = $this->page_name;
@@ -375,7 +375,7 @@ class SmartyExtend extends SmartyBC
// 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) : '') :
ucfirst(str_replace('_', ' ', \CoreLibs\Get\System::getPageName(1))).(defined(G_TITLE) ? ' - '.$this->l10n->__(G_TITLE) : '') :
$this->l10n->__($this->L_TITLE);
// LANG
@@ -408,7 +408,7 @@ class SmartyExtend extends SmartyBC
public function mergeCmsSmartyVars(object $cms): void
{
// array merge HEADER, DATA, DEBUG DATA
foreach (array('HEADER', 'DATA', 'DEBUG_DATA') as $ext_smarty) {
foreach (['HEADER', 'DATA', 'DEBUG_DATA'] as $ext_smarty) {
if (isset($cms->{$ext_smarty}) &&
is_array($cms->{$ext_smarty})
) {

View File

@@ -16,20 +16,22 @@ if (defined('BASE')) {
DEFINE('CURRENT_WORKING_DIR', str_replace('lib', '', __DIR__));
}
// METHOD: MyErrorHandler
// PARAMS: $type: the error code from PHP
// $message: the error message from php
// $file: in which file the error happend. this is the source file (eg include)
// $line: in which line the error happened
// $context: array with all the variable
// RETURN: true, so cought errors do not get processed by the PHP error engine
// DESC: will catch any error except E_ERROR and try to write them to the log file in log/php_error-<DAY>.llog
// if this fails, it will print the data to the window via echo
function MyErrorHandler($type, $message, $file, $line, $context)
/**
* will catch any error except E_ERROR and try to write them to the log file
* in log/php_error-<DAY>.log
* if this fails, it will print the data to the window via echo
* @param int $type the error code from PHP
* @param string $message the error message from php
* @param string $file in which file the error happend. this is the source file (eg include)
* @param int $line in which line the error happened
* @param array $context array with all the variable
* @return bool true, so cought errors do not get processed by the PHP error engine
*/
function MyErrorHandler(int $type, string $message, string $file, int $line, array $context): bool
{
if (!(error_reporting() & $type) && !SHOW_ALL_ERRORS) {
// This error code is not included in error_reporting
return;
return false;
}
// ERROR LEVEL
$error_level = array(
@@ -52,7 +54,7 @@ function MyErrorHandler($type, $message, $file, $line, $context)
);
// get the current page name (strip path)
$page_temp = explode("/", $_SERVER["PHP_SELF"]);
$page_temp = explode(DIRECTORY_SEPARATOR, $_SERVER["PHP_SELF"]);
// the output string:
// [] current timestamp
// {} the current page name in which the error occured (running script)
@@ -63,7 +65,7 @@ function MyErrorHandler($type, $message, $file, $line, $context)
$output = '{'.array_pop($page_temp).'} ['.$file.'] <'.$line.'> ['.$error_level[$type].'|'.$type.']: '.$message;
# try to open file
$ROOT = CURRENT_WORKING_DIR;
$LOG = 'log/';
$LOG = 'log'.DIRECTORY_SEPARATOR;
// if the log folder is not found, try to create it
if (!is_dir($ROOT.$LOG) && !is_file($ROOT.LOG)) {
$ok = mkdir($ROOT.$LOG);