Compare commits

...

9 Commits

Author SHA1 Message Date
Clemens Schwaighofer
70a30c3182 Javascript byte human readable functions
Add a new format bytes with using bytes for lowest tear instead of 0.n
kb

Add a new reverse function to convert from human readable bytes to byte
number
2021-05-20 10:25:37 +09:00
Clemens Schwaighofer
9d54d6b0d1 Bug fix in human readable byte convert 2021-05-19 11:01:23 +09:00
Clemens Schwaighofer
a46888d101 Supress array errors in form generate 2021-05-17 09:35:09 +09:00
Clemens Schwaighofer
be092fc449 Add some missing array set checks 2021-05-17 08:57:50 +09:00
Clemens Schwaighofer
6059b83637 Fix IMG_PNG constant error, jquery update, other minor fixes
Big fix with IMG_PNG constant use. Switched to IMAGETYPE_*

Some code cleanup in config files (array, DEFINE->define, etc)

Code cleanup in DB:IO class, especially for consistent returning
array/single data blocks

Some javascript core lib update
2021-04-28 11:03:26 +09:00
Clemens Schwaighofer
b6c6d76b43 Basic::json handling, better string to bytes function
Some basic json string to array with second function to check last
cought error.

Updated string to bytes convert to make it shorter and more compact

Some minor fixes in DB::IO helper methods
2021-02-09 14:55:32 +09:00
Clemens Schwaighofer
80993a06ac Main Template CORE css/js, remove unused JS code, fix method names DB/IO
DB::IO all public names are prefixed with db. All others are set as
deprecated.
2021-02-09 06:49:30 +09:00
Clemens Schwaighofer
50073479d4 Last login value, minor update for array to [, smarty include core
When logged in, the last loggedin time is stored in the edit_user table,
additional to the normal logging.

More array() to [] conversion in config files, etc

Javascript: add math.round

Basic Class: Fix key length array mapping to more efficiont loop run
DB/IO: some name fixes in get key function description/comments
SmartyExtended: add CORE CSS/JS file include if exists. Follows after
MAIN and BEFORE page and special
2021-01-21 06:55:28 +09:00
Clemens Schwaighofer
85f701ab2a Core Class Updates
Basic: remove all error handling override for any class vars to avoid
exploiting private/public/protected settings

Basic: Add MIME lookup table with array. So you can return a File name
description (human understandable) to a mime handler.
See mimeInitApps for basic list

IO: Bug fix for counting prepared statment place holders. If there are
$1, $1, $2 then those are TWO and not THREE

IO: various wrappers for returning PK, Extended return set, Number for
rows
Those will be extended to all variables
2020-11-25 20:38:25 +09:00
19 changed files with 1527 additions and 882 deletions

View File

@@ -31,6 +31,7 @@ CREATE TABLE edit_user (
email VARCHAR,
protected SMALLINT NOT NULL DEFAULT 0,
admin SMALLINT NOT NULL DEFAULT 0,
last_login TIMESTAMP WITHOUT TIME ZONE,
login_error_count INT DEFAULT 0,
login_error_date_last TIMESTAMP WITHOUT TIME ZONE,
login_error_date_first TIMESTAMP WITHOUT TIME ZONE,

View File

@@ -107,23 +107,62 @@ 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->insert_id." | PRIMARY KEY EXT: ".print_r($basic->insert_id_ext, true)."<br>";
print "DIRECT INSERT PREVIOUS INSERTED: ".print_r($basic->dbReturnRow("SELECT foo_id, test FROM foo WHERE foo_id = ".$basic->insert_id), true)."<br>";
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->insert_id." | PRIMARY KEY EXT: ".print_r($basic->insert_id_ext, true)."<br>";
print "PREPARE INSERT PREVIOUS INSERTED: ".print_r($basic->dbReturnRow("SELECT foo_id, test FROM foo WHERE foo_id = ".$basic->insert_id), true)."<br>";
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->insert_id, true)." | PRIMARY KEY EXT: ".print_r($basic->insert_id_ext, true)."<br>";
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->insert_id." | PRIMARY KEY EXT: ".print_r($basic->insert_id_ext, true)."<br>";
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->insert_id_ext, true)."<br>";
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';
@@ -347,6 +386,12 @@ foreach ($images as $image) {
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();

View File

@@ -8,8 +8,8 @@
*********************************************************************/
// please be VERY carefull only to change the right side
$DB_CONFIG = array(
'test' => array(
$DB_CONFIG = [
'test' => [
'db_name' => 'gullevek',
'db_user' => 'gullevek',
'db_pass' => 'gullevek',
@@ -19,7 +19,7 @@ $DB_CONFIG = array(
'db_type' => 'pgsql',
'db_encoding' => '',
'db_ssl' => 'disable' // allow, disable, require, prefer
)
);
]
];
// __END__

View File

@@ -12,18 +12,18 @@
*********************************************************************/
// other master config to attach
// $__LOCAL_CONFIG = array(
// $__LOCAL_CONFIG = [
// 'db_host' => '',
// 'location' => '',
// 'debug_flag' => true,
// 'site_lang' => 'en_utf8',
// 'login_enabled' => true
// );
// ];
// each host has a different db_host
$SITE_CONFIG = array(
$SITE_CONFIG = [
// development host
'soba.tokyo.tequila.jp' => array(
'soba.tokyo.tequila.jp' => [
// db config selection
'db_host' => 'test',
// other db connections
@@ -37,8 +37,8 @@ $SITE_CONFIG = array(
'site_lang' => 'en_utf8',
// enable/disable login override
'login_enabled' => true
),
],
// 'other.host.com' => $__LOCAL_CONFIG
);
];
// __END__

View File

@@ -26,7 +26,7 @@ define('LIBS', 'lib'.DS);
define('CONFIGS', 'configs'.DS);
// includes (strings, arrays for static, etc)
define('INCLUDES', 'includes'.DS);
// data folder (mostly in includes)
// data folder (mostly in includes, or root for internal data)
define('DATA', 'data'.DS);
// layout base path
define('LAYOUT', 'layout'.DS);
@@ -36,20 +36,22 @@ define('PICTURES', 'images'.DS);
define('IMAGES', 'images'.DS);
// icons (below the images/ folder)
define('ICONS', 'icons'.DS);
// media
// media (accessable from outside)
define('MEDIA', 'media'.DS);
// flash-root (below media)
// flash-root (below media or data)
define('FLASH', 'flash'.DS);
// uploads (anything to keep)
// uploads (anything to keep or data)
define('UPLOADS', 'uploads'.DS);
// files (binaries) (below media)
// files (binaries) (below media or data)
define('BINARIES', 'binaries'.DS);
// files (videos) (below media)
// files (videos) (below media or data)
define('VIDEOS', 'videos'.DS);
// files (documents) (below media)
// files (documents) (below media or data)
define('DOCUMENTS', 'documents'.DS);
// files (pdfs) (below media)
// files (pdfs) (below media or data)
define('PDFS', 'documents'.DS);
// files (general) (below media or data)
define('FILES', 'files'.DS);
// CSV
define('CSV', 'csv'.DS);
// css
@@ -104,15 +106,15 @@ define('PASSWORD_FORGOT', false);
define('PASSWORD_MIN_LENGTH', 9);
define('PASSWORD_MAX_LENGTH', 255);
// defines allowed special characters
DEFINE('PASSWORD_SPECIAL_RANGE', '@$!%*?&');
define('PASSWORD_SPECIAL_RANGE', '@$!%*?&');
// password must have upper case, lower case, number, special
// comment out for not mandatory
DEFINE('PASSWORD_LOWER', '(?=.*[a-z])');
DEFINE('PASSWORD_UPPER', '(?=.*[A-Z])');
DEFINE('PASSWORD_NUMBER', '(?=.*\d)');
DEFINE('PASSWORD_SPECIAL', "(?=.*[".PASSWORD_SPECIAL_RANGE."])");
define('PASSWORD_LOWER', '(?=.*[a-z])');
define('PASSWORD_UPPER', '(?=.*[A-Z])');
define('PASSWORD_NUMBER', '(?=.*\d)');
define('PASSWORD_SPECIAL', "(?=.*[".PASSWORD_SPECIAL_RANGE."])");
// define full regex
DEFINE('PASSWORD_REGEX', "/^".
define('PASSWORD_REGEX', "/^".
(defined('PASSWORD_LOWER') ? PASSWORD_LOWER : '').
(defined('PASSWORD_UPPER') ? PASSWORD_UPPER : '').
(defined('PASSWORD_NUMBER') ? PASSWORD_NUMBER : '').
@@ -165,13 +167,6 @@ define('DEFAULT_ENCODING', 'UTF-8');
// see Basic class constructor
define('LOG_FILE_ID', BASE_NAME);
/************* CLASS ERRORS *******************/
// 0 = default all OFF
// 1 = throw notice on unset class var
// 2 = no notice on unset class var, but do not set undefined class var
// 3 = throw error and do not set class var
define('CLASS_VARIABLE_ERROR_MODE', 3);
/************* QUEUE TABLE *************/
// if we have a dev/live system
// set_live is a per page/per item
@@ -192,14 +187,14 @@ if (file_exists(BASE.CONFIGS.'config.host.php')) {
require BASE.CONFIGS.'config.host.php';
}
if (!isset($SITE_CONFIG)) {
$SITE_CONFIG = array();
$SITE_CONFIG = [];
}
/************* DB ACCESS *****************/
if (file_exists(BASE.CONFIGS.'config.db.php')) {
require BASE.CONFIGS.'config.db.php';
}
if (!isset($DB_CONFIG)) {
$DB_CONFIG = array();
$DB_CONFIG = [];
}
/************* OTHER PATHS *****************/
if (file_exists(BASE.CONFIGS.'config.path.php')) {
@@ -245,7 +240,7 @@ if ((array_key_exists('HTTPS', $_SERVER) && !empty($_SERVER['HTTPS']) && $_SERVE
}
// define the db config set name, the db config and the db schema
define('DB_CONFIG_NAME', $SITE_CONFIG[HOST_NAME]['db_host']);
define('DB_CONFIG', isset($DB_CONFIG[DB_CONFIG_NAME]) ? $DB_CONFIG[DB_CONFIG_NAME] : array());
define('DB_CONFIG', isset($DB_CONFIG[DB_CONFIG_NAME]) ? $DB_CONFIG[DB_CONFIG_NAME] : []);
// define('DB_CONFIG_TARGET', SITE_CONFIG[$HOST_NAME]['db_host_target']);
// define('DB_CONFIG_OTHER', SITE_CONFIG[$HOST_NAME]['db_host_other']);
// override for login and global schemas

View File

@@ -11,11 +11,11 @@
/************* CONVERT *******************/
// this only needed if the external thumbnail create is used
$paths = array(
$paths = [
'/bin',
'/usr/bin',
'/usr/local/bin'
);
];
// find convert
foreach ($paths as $path) {
if (file_exists($path.DS.'convert') && is_file($path.DS.'convert')) {

View File

@@ -10,12 +10,12 @@
// File and Folder paths
// ID is TARGET (first array element)
/*$PATHS = array(
'test' => array(
/*$PATHS = [
'test' => [
'csv_path' => '',
'perl_bin' => '',
'other_url' => '',
)
)*/
]
];*/
// __END__

View File

@@ -22,7 +22,7 @@ if (!defined('DS')) {
exit('Base config unloadable');
}
// find trigger name "admin/" or "frontend/" in the getcwd() folder
foreach (array('admin', 'frontend') as $folder) {
foreach (['admin', 'frontend'] as $folder) {
if (strstr(getcwd(), DS.$folder)) {
define('CONTENT_PATH', $folder.DS);
break;

View File

@@ -16,6 +16,9 @@
{if $STYLESHEET}
<link rel=stylesheet type="text/css" href="{$css}{$STYLESHEET}">
{/if}
{if $CSS_CORE_INCLUDE}
<link rel=stylesheet type="text/css" href="{$CSS_CORE_INCLUDE}">
{/if}
{if $CSS_INCLUDE}
<link rel=stylesheet type="text/css" href="{$CSS_INCLUDE}">
{/if}
@@ -23,9 +26,6 @@
<link rel=stylesheet type="text/css" href="{$CSS_SPECIAL_INCLUDE}">
{/if}
<script language="JavaScript" src="{$js}/firebug.js"></script>
{if $JAVASCRIPT}
<script language="JavaScript" src="{$js}{$JAVASCRIPT}"></script>
{/if}
{if $USE_JQUERY}
{* JQuery *}
<script type="text/javascript" src="{$js}/jquery.min.js"></script>
@@ -37,6 +37,12 @@
<script src="{$js}/scriptaculous/scriptaculous.js" type="text/javascript"></script>
{/if}
{/if}
{if $JAVASCRIPT}
<script language="JavaScript" src="{$js}{$JAVASCRIPT}"></script>
{/if}
{if $JS_CORE_INCLUDE}
<script language="JavaScript" src="{$JS_CORE_INCLUDE}"></script>
{/if}
{if $JS_INCLUDE}
<script language="JavaScript" src="{$JS_INCLUDE}"></script>
{/if}

View File

@@ -13,8 +13,8 @@ if (!DEBUG) {
}*/
// open overlay boxes counter
var GL_OB_S = 10;
var GL_OB_BASE = 10;
var GL_OB_S = 30;
var GL_OB_BASE = 30;
/**
* opens a popup window with winName and given features (string)
@@ -119,16 +119,18 @@ function setCenter(id, left, top)
/**
* goes to an element id position
* @param {String} element element id to move to
* @param {Number} offset offset from top, default is 0 (px)
* @param {String} element element id to move to
* @param {Number} [offset=0] offset from top, default is 0 (px)
* @param {Number} [duration=500] animation time, default 500ms
* @param {String} [base='body,html'] base element for offset scroll
*/
function goToPos(element, offset = 0)
function goToPos(element, offset = 0, duration = 500, base = 'body,html')
{
try {
if ($('#' + element).length) {
$('body,html').animate({
$(base).animate({
scrollTop: $('#' + element).offset().top - offset
}, 500);
}, duration);
}
} catch (err) {
errorCatch(err);
@@ -154,8 +156,8 @@ function __(string)
* simple sprintf formater for replace
* usage: "{0} is cool, {1} is not".format("Alpha", "Beta");
* First, checks if it isn't implemented yet.
* @param {String} !String.prototype.format string with elements to be replaced
* @return {String} Formated string
* @param {String} String.prototype.format string with elements to be replaced
* @return {String} Formated string
*/
if (!String.prototype.format) {
String.prototype.format = function()
@@ -171,6 +173,18 @@ if (!String.prototype.format) {
};
}
/**
* round to digits (float)
* @param {Float} Number.prototype.round Float type number to round
* @param {Number} prec Precision to round to
* @return {Float} Rounded number
*/
if (Number.prototype.round) {
Number.prototype.round = function (prec) {
return Math.round(this * Math.pow(10, prec)) / Math.pow(10, prec);
};
}
/**
* formats flat number 123456 to 123,456
* @param {Number} x number to be formated
@@ -178,9 +192,9 @@ if (!String.prototype.format) {
*/
function numberWithCommas(x)
{
var parts = x.toString().split(".");
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",");
return parts.join(".");
var parts = x.toString().split('.');
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
return parts.join('.');
}
/**
@@ -430,6 +444,49 @@ function formatBytes(bytes)
return parseFloat(Math.round(bytes * Math.pow(10, 2)) / Math.pow(10, 2)) + ['kB', 'MB', 'GB', 'TB', 'PB', 'EB'][i];
}
/**
* like formatBytes, but returns bytes for <1KB and not 0.n KB
* @param {Number} bytes bytes in int
* @return {String} string in GB/MB/KB
*/
function formatBytesLong(bytes)
{
var i = Math.floor(Math.log(bytes) / Math.log(1024));
var sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
return (bytes / Math.pow(1024, i)).toFixed(2) * 1 + ' ' + sizes[i];
}
/**
* 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
*/
function stringByteFormat(bytes)
{
// early abort if this is a number already
if (!isNaN(bytes)) {
return bytes;
}
// for pow exponent list
let valid_units = 'bkmgtpezy';
// valid string that can be converted
let regex = /([\d.,]*)\s?(eb|pb|tb|gb|mb|kb|e|p|t|g|m|k|b)$/i;
let matches = bytes.match(regex);
// if nothing found, return original input
if (matches !== null) {
// remove all non valid entries outside numbers and .
// convert to float number
let m1 = parseFloat(matches[1].replace(/[^0-9.]/,''));
// only get the FIRST letter from the size, convert it to lower case
let m2 = matches[2].replace(/[^bkmgtpezy]/i, '').charAt(0).toLowerCase();
if (m2) {
// use the position in the valid unit list to do the math conversion
bytes = m1 * Math.pow(1024, valid_units.indexOf(m2));
}
}
return bytes;
}
/**
* prints out error messages based on data available from the browser
* @param {Object} err error from try/catch block
@@ -630,7 +687,7 @@ function showActionIndicator(loc)
/**
* hide action indicator, if it is visiable
* If the global variable GL_OB_S is > 10 then
* If the global variable GL_OB_S is > GL_OB_BASE then
* the overlayBox is not hidden but the zIndex
* is set to this value
* @param {String} loc ID string, only used for console log
@@ -954,7 +1011,7 @@ function phfo(tree)
function phfa(list)
{
var content = [];
for (i = 0; i < list.length; i ++) {
for (var i = 0; i < list.length; i ++) {
content.push(phfo(list[i]));
}
return content.join('');
@@ -999,9 +1056,10 @@ function html_options(name, data, selected = '', options_only = false, return_st
* @param {Boolean} [return_string=false] return as string and not as element
* @param {String} [sort=''] if empty as is, else allowed 'keys',
* 'values' all others are ignored
* @param {String} [onchange=''] onchange trigger call, default unset
* @return {String} html with build options block
*/
function html_options_block(name, data, selected = '', multiple = 0, options_only = false, return_string = false, sort = '')
function html_options_block(name, data, selected = '', multiple = 0, options_only = false, return_string = false, sort = '', onchange = '')
{
var content = [];
var element_select;
@@ -1009,13 +1067,16 @@ function html_options_block(name, data, selected = '', multiple = 0, options_onl
var element_option;
var data_list = []; // for sorted output
var value;
var option;
// var option;
if (multiple > 0) {
select_options.multiple = '';
if (multiple > 1) {
select_options.size = multiple;
}
}
if (onchange) {
select_options.OnChange = onchange;
}
// set outside select, gets stripped on return if options only is true
element_select = cel('select', name, '', [], select_options);
// console.log('Call for %s, options: %s', name, options_only);
@@ -1049,35 +1110,6 @@ function html_options_block(name, data, selected = '', multiple = 0, options_onl
element_option = cel('option', '', value, '', options);
// attach it to the select element
ael(element_select, element_option);
/*
// get the original data for this key
var opt_value = r_value[opt_key];
// if it is an object, we assume a sub group [original data]
if (isObject(opt_value)) {
element_group = document.createElement('optgroup');
element_group.label = opt_key;
// loop through attached sub key elements in order (key is orignal)
$.each(data.form_reference_order[key][opt_key], function(opt_group_pos, opt_group_key) {
var opt_group_value = r_value[opt_key][opt_group_key];
element_sub = document.createElement('option');
// check if w is object, if yes, the element is a subset drop down
element_sub.label = opt_group_value;
element_sub.value = opt_group_key;
element_sub.innerHTML = opt_group_value;
element_group.appendChild(element_sub);
});
element.appendChild(element_group);
} else if (!isObject(opt_key)) {
// if this is a plain element, attach as is
// we also skip any objects in the reference order group as they are handled different
element_sub = document.createElement('option');
element_sub.label = opt_value;
element_sub.value = opt_key;
element_sub.innerHTML = opt_value;
element.appendChild(element_sub);
}
*/
}
// if with select part, convert to text
if (!options_only) {
@@ -1135,6 +1167,9 @@ function html_options_refill(name, data, sort = '')
element_option.label = value;
element_option.value = key;
element_option.innerHTML = value;
if (key == option_selected) {
element_option.selected = true;
}
document.getElementById(name).appendChild(element_option);
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
jquery-3.4.1.js
jquery-3.6.0.js

View File

@@ -1 +1 @@
jquery-3.4.1.min.js
jquery-3.6.0.min.js

View File

@@ -97,18 +97,10 @@ namespace CoreLibs;
/** Basic core class declaration */
class Basic
{
// define check vars for the flags we can have
const CLASS_STRICT_MODE = 1;
const CLASS_OFF_COMPATIBLE_MODE = 2;
// define byteFormat
const BYTE_FORMAT_NOSPACE = 1;
const BYTE_FORMAT_ADJUST = 2;
const BYTE_FORMAT_SI = 4;
// control vars
/** @var bool compatible mode sets variable even if it is not defined */
private $set_compatible = true;
/** @var bool strict mode throws an error if the variable is not defined */
private $set_strict_mode = false;
// page and host name
public $page_name;
public $host_name;
@@ -188,6 +180,12 @@ class Basic
// ajax flag
protected $ajax_page_flag = false;
// mime application list
private $mime_apps = [];
// last json error
private $json_last_error;
/**
* main Basic constructor to init and check base settings
*/
@@ -402,6 +400,9 @@ class Basic
// key generation init
$this->initRandomKeyData();
// init mime apps
$this->mimeInitApps();
}
// METHOD: __destruct
@@ -978,15 +979,11 @@ class Basic
$use_key_length = $this->key_length;
}
return join(
'',
array_map(
function ($value) {
return $this->key_range[rand(0, $this->one_key_length - 1)];
},
range(1, $use_key_length)
)
);
$pieces = [];
for ($i = 1; $i <= $use_key_length; $i ++) {
$pieces[] = $this->key_range[random_int(0, $this->one_key_length - 1)];
}
return join('', $pieces);
}
// ****** RANDOM KEY GEN ******
@@ -1704,8 +1701,12 @@ class Basic
// 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%sB", $bytes_calc, $pre);
return sprintf("%.2f%s", $bytes_calc, $pre);
} else {
return round($bytes_calc, 2).$pre;
}
@@ -1717,54 +1718,28 @@ class Basic
/**
* calculates the bytes based on a string with nnG, nnGB, nnM, etc
* if the number has a non standard thousand seperator ","" inside, the second
* flag needs to be set true (eg german style notaded numbers)
* @param string|int|float $number any string or number to convert
* @param bool $dot_thousand default is ".", set true for ","
* @return string|int|float converted value or original value
*/
public static function stringByteFormat($number, bool $dot_thousand = false)
public static function stringByteFormat($number)
{
$matches = [];
// all valid units
$valid_units_ = 'bkmgtpezy';
// detects up to exo bytes
preg_match("/([\d.,]*)\s?(eb|pb|tb|gb|mb|kb|e|p|t|g|m|k|b)$/", strtolower($number), $matches);
preg_match("/([\d.,]*)\s?(eb|pb|tb|gb|mb|kb|e|p|t|g|m|k|b)$/i", strtolower($number), $matches);
if (isset($matches[1]) && isset($matches[2])) {
// $last = strtolower($number[strlen($number) - 1]);
if ($dot_thousand === false) {
$number = str_replace(',', '', $matches[1]);
} else {
$number = str_replace('.', '', $matches[1]);
}
// 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);
// match string in type to calculate
switch ($matches[2]) {
// exo bytes
case 'e':
case 'eb':
$number *= 1024;
// peta bytes
case 'p':
case 'pb':
$number *= 1024;
// tera bytes
case 't':
case 'tb':
$number *= 1024;
// giga bytes
case 'g':
case 'gb':
$number *= 1024;
// mega bytes
case 'm':
case 'mb':
$number *= 1024;
// kilo bytes
case 'k':
case 'kb':
$number *= 1024;
break;
// convert any mb/gb/etc to single m/b
$unit = preg_replace('/[^bkmgtpezy]/i', '', $matches[2]);
if ($unit) {
$number = $number * pow(1024, stripos($valid_units_, $unit[0]));
}
$number = (int)round($number, 0);
// convert to INT to avoid +E output
$number = (int)round($number);
}
// if not matching return as is
return $number;
@@ -2208,8 +2183,8 @@ class Basic
$thumbnail_write_path = null;
$thumbnail_web_path = null;
// path set first
if ($img_type == IMG_JPG ||
$img_type == IMG_PNG ||
if ($img_type == IMAGETYPE_JPEG ||
$img_type == IMAGETYPE_PNG ||
$create_dummy === true
) {
// $this->debug('IMAGE PREPARE', "IMAGE TYPE OK: ".$inc_width.'x'.$inc_height);
@@ -2225,8 +2200,8 @@ class Basic
}
}
// do resize or fall back on dummy run
if ($img_type == IMG_JPG ||
$img_type == IMG_PNG
if ($img_type == IMAGETYPE_JPEG ||
$img_type == IMAGETYPE_PNG
) {
// if missing width or height in thumb, use the set one
if ($thumb_width == 0) {
@@ -2267,7 +2242,7 @@ class Basic
) {
// 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 == IMG_PNG) {
if ($img_type == IMAGETYPE_PNG) {
// preservere transaprency
imagecolortransparent(
$thumb,
@@ -2278,10 +2253,10 @@ class Basic
}
$source = null;
switch ($img_type) {
case IMG_JPG:
case IMAGETYPE_JPEG:
$source = imagecreatefromjpeg($filename);
break;
case IMG_PNG:
case IMAGETYPE_PNG:
$source = imagecreatefrompng($filename);
break;
}
@@ -2295,10 +2270,10 @@ class Basic
}
// write file
switch ($img_type) {
case IMG_JPG:
case IMAGETYPE_JPEG:
imagejpeg($thumb, $thumbnail_write_path.$thumbnail, $jpeg_quality);
break;
case IMG_PNG:
case IMAGETYPE_PNG:
imagepng($thumb, $thumbnail_write_path.$thumbnail);
break;
}
@@ -2400,10 +2375,10 @@ class Basic
if ($orientation != 1) {
$this->debug('IMAGE FILE ROTATE', 'Need to rotate image ['.$filename.'] from: '.$orientation);
switch ($img_type) {
case IMG_JPG:
case IMAGETYPE_JPEG:
$img = imagecreatefromjpeg($filename);
break;
case IMG_PNG:
case IMAGETYPE_PNG:
$img = imagecreatefrompng($filename);
break;
}
@@ -2426,10 +2401,10 @@ class Basic
}
// then rewrite the rotated image back to the disk as $filename
switch ($img_type) {
case IMG_JPG:
case IMAGETYPE_JPEG:
imagejpeg($img, $filename);
break;
case IMG_PNG:
case IMAGETYPE_PNG:
imagepng($img, $filename);
break;
}
@@ -3396,6 +3371,144 @@ class Basic
return false;
}
}
// *** MIME PARTS
// to be moved to some mime class
/**
* init array for mime type to application name lookup
* @return void
*/
private function mimeInitApps(): void
{
// match mime type to some application description
// this is NOT translated
$this->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 function mimeSetAppName(string $mime, string $app): void
{
$this->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 function mimeGetAppName(string $mime): string
{
return $this->mime_apps[$mime] ?? 'Other file';
}
/**
* 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 function jsonConvertToArray(?string $json, bool $override = false): array
{
if ($json !== null) {
$_json = json_decode($json, true);
if ($this->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 function jsonGetLastError(bool $return_string = false)
{
$json_error_string = '';
// valid errors as of php 8.0
switch ($this->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 : $this->json_last_error;
}
}
// __END__

View File

@@ -273,6 +273,7 @@ class IO extends \CoreLibs\Basic
public $field_names = []; // array with the field names of the current query
public $insert_id; // last inserted ID
public $insert_id_ext; // extended insert ID (for data outside only primary key)
public $insert_id_arr; // always return as array, even if only one
private $temp_sql;
// other vars
private $nbsp = ''; // used by print_array recursion function
@@ -589,22 +590,22 @@ class IO extends \CoreLibs\Basic
/**
* if there is the 'to_encoding' var set, and the field is in the wrong encoding converts it to the target
* @param array|bool $row array from fetch_row
* @return array|bool convert fetch_row array, or false
* @param array|bool|null $row array from fetch_row
* @return array|bool|null convert fetch_row array, or false
*/
private function __dbConvertEncoding($row)
{
// only do if array, else pass through row (can be false)
if (is_array($row)) {
if ($this->to_encoding && $this->db_encoding) {
// go through each row and convert the encoding if needed
foreach ($row as $key => $value) {
$from_encoding = mb_detect_encoding($value);
// convert only if encoding doesn't match and source is not pure ASCII
if ($from_encoding != $this->to_encoding && $from_encoding != 'ASCII') {
$row[$key] = mb_convert_encoding($value, $this->to_encoding, $from_encoding);
}
}
if (!is_array($row) || empty($this->to_encoding) || empty($this->db_encoding)
) {
return $row;
}
// go through each row and convert the encoding if needed
foreach ($row as $key => $value) {
$from_encoding = mb_detect_encoding($value);
// convert only if encoding doesn't match and source is not pure ASCII
if ($from_encoding != $this->to_encoding && $from_encoding != 'ASCII') {
$row[$key] = mb_convert_encoding($value, $this->to_encoding, $from_encoding);
}
}
return $row;
@@ -787,9 +788,12 @@ class IO extends \CoreLibs\Basic
// if we do not have a returning, we try to get it via the primary key and another select
if (!$this->returning_id) {
$this->insert_id = $this->db_functions->__dbInsertId($this->query, $this->pk_name);
$this->insert_id_ext = $this->insert_id;
$this->insert_id_arr[] = $this->insert_id;
} else {
$this->insert_id = [];
$this->insert_id_ext = [];
$this->insert_id_arr = [];
// echo "** PREPARE RETURNING FOR CURSOR: ".$this->cursor."<br>";
// we have returning, now we need to check if we get one or many returned
// we'll need to loop this, if we have multiple insert_id returns
@@ -799,6 +803,7 @@ class IO extends \CoreLibs\Basic
)) {
// echo "*** RETURNING: ".print_r($_insert_id, true)."<br>";
$this->insert_id[] = $_insert_id;
$this->insert_id_arr[] = $_insert_id;
}
// if we have only one, revert from array to single
if (count($this->insert_id) == 1) {
@@ -807,7 +812,9 @@ class IO extends \CoreLibs\Basic
// if this has only the pk_name, then only return this, else array of all data (but without the position)
// example if insert_id[0]['foo'] && insert_id[0]['bar'] it will become insert_id['foo'] & insert_id['bar']
// if only ['foo_id'] and it is the PK then the PK is directly written to the insert_id
if (count($this->insert_id[0]) > 1 || !array_key_exists($this->pk_name, $this->insert_id[0])) {
if (count($this->insert_id[0]) > 1 ||
!array_key_exists($this->pk_name, $this->insert_id[0])
) {
$this->insert_id_ext = $this->insert_id[0];
if (isset($this->insert_id[0][$this->pk_name])) {
$this->insert_id = $this->insert_id[0][$this->pk_name];
@@ -1199,6 +1206,10 @@ class IO extends \CoreLibs\Basic
$this->db_functions->__dbResultType($assoc_only)
)
);
// if returned is NOT an array, abort to false
if (!is_array($return)) {
$return = false;
}
}
// check if cached call or reset call ...
if (!$return && !$reset) {
@@ -1563,8 +1574,9 @@ class IO extends \CoreLibs\Basic
}
$match = [];
// search for $1, $2, in the query and push it into the control array
// skip counts for same eg $1, $1, $2 = 2 and not 3
preg_match_all('/(\$[0-9]{1,})/', $query, $match);
$this->prepare_cursor[$stm_name]['count'] = count($match[1]);
$this->prepare_cursor[$stm_name]['count'] = count(array_unique($match[1]));
$this->prepare_cursor[$stm_name]['query'] = $query;
$result = $this->db_functions->__dbPrepare($stm_name, $query);
if ($result) {
@@ -1606,71 +1618,74 @@ class IO extends \CoreLibs\Basic
$this->error_id = 23;
$this->__dbDebug('db', '<span style="color: red;"><b>DB-Error</b> '.$stm_name.': Array data count does not match prepared fields. Need: '.$this->prepare_cursor[$stm_name]['count'].', has: '.count($data).'</span>', 'DB_ERROR');
return false;
} else {
if ($this->db_debug) {
$this->__dbDebug('db', $this->__dbDebugPrepare($stm_name, $data), 'dbExecPrep', 'Q');
}
$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->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');
return false;
}
if ($this->__checkQueryForInsert($this->prepare_cursor[$stm_name]['query'], true) &&
$this->prepare_cursor[$stm_name]['pk_name'] != 'NULL'
) {
if (!$this->prepare_cursor[$stm_name]['returning_id']) {
$this->insert_id = $this->db_functions->__dbInsertId($this->prepare_cursor[$stm_name]['query'], $this->prepare_cursor[$stm_name]['pk_name']);
} elseif ($result) {
$this->insert_id = [];
$this->insert_id_ext = [];
// we have returning, now we need to check if we get one or many returned
// we'll need to loop this, if we have multiple insert_id returns
while ($_insert_id = $this->db_functions->__dbFetchArray(
$result,
$this->db_functions->__dbResultType(true)
)) {
$this->insert_id[] = $_insert_id;
}
// if we have only one, revert from arry to single
if (count($this->insert_id) == 1) {
// echo "+ SINGLE DATA CONVERT: ".count($this->insert_id[0])." => ".array_key_exists($this->prepare_cursor[$stm_name]['pk_name'], $this->insert_id[0])."<br>";
// echo "+ PK DIRECT: ".$this->insert_id[0][$this->prepare_cursor[$stm_name]['pk_name']]."<Br>";
// if this has only the pk_name, then only return this, else array of all data (but without the position)
// example if insert_id[0]['foo'] && insert_id[0]['bar'] it will become insert_id['foo'] & insert_id['bar']
// if only ['foo_id'] and it is the PK then the PK is directly written to the insert_id
if (count($this->insert_id[0]) > 1 ||
!array_key_exists($this->prepare_cursor[$stm_name]['pk_name'], $this->insert_id[0])
) {
$this->insert_id_ext = $this->insert_id[0];
$this->insert_id = $this->insert_id[0][$this->prepare_cursor[$stm_name]['pk_name']];
} elseif ($this->insert_id[0][$this->prepare_cursor[$stm_name]['pk_name']]) {
$this->insert_id = $this->insert_id[0][$this->prepare_cursor[$stm_name]['pk_name']];
}
} elseif (count($this->insert_id) == 0) {
// failed to get insert id
$this->insert_id = '';
$this->warning_id = 33;
$this->__dbError();
$this->__dbDebug('db', '<span style="color: orange;"><b>DB-Warning</b> '.$stm_name.': insert id returned no data</span>', 'DB_WARNING');
}
}
// this error handling is only for pgsql
if (is_array($this->insert_id)) {
$this->warning_id = 32;
$this->__dbError();
$this->__dbDebug('db', '<span style="color: orange;"><b>DB-Warning</b> '.$stm_name.': insert id data returned as array</span>', 'DB_WARNING');
} elseif (!$this->insert_id) {
// NOTE should we keep this inside
$this->warning_id = 31;
$this->__dbError();
$this->__dbDebug('db', '<span style="color: orange;"><b>DB-Warning</b> '.$stm_name.': Could not get insert id</span>', 'DB_WARNING');
}
}
return $result;
}
if ($this->db_debug) {
$this->__dbDebug('db', $this->__dbDebugPrepare($stm_name, $data), 'dbExecPrep', 'Q');
}
$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->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');
return false;
}
if ($this->__checkQueryForInsert($this->prepare_cursor[$stm_name]['query'], true) &&
$this->prepare_cursor[$stm_name]['pk_name'] != 'NULL'
) {
if (!$this->prepare_cursor[$stm_name]['returning_id']) {
$this->insert_id = $this->db_functions->__dbInsertId($this->prepare_cursor[$stm_name]['query'], $this->prepare_cursor[$stm_name]['pk_name']);
$this->insert_id_ext = $this->insert_id;
$this->insert_id_arr[] = $this->insert_id;
} elseif ($result) {
$this->insert_id = [];
$this->insert_id_ext = [];
$this->insert_id_arr = [];
// we have returning, now we need to check if we get one or many returned
// we'll need to loop this, if we have multiple insert_id returns
while ($_insert_id = $this->db_functions->__dbFetchArray(
$result,
$this->db_functions->__dbResultType(true)
)) {
$this->insert_id[] = $_insert_id;
$this->insert_id_arr[] = $_insert_id;
}
// if we have only one, revert from arry to single
if (count($this->insert_id) == 1) {
// echo "+ SINGLE DATA CONVERT: ".count($this->insert_id[0])." => ".array_key_exists($this->prepare_cursor[$stm_name]['pk_name'], $this->insert_id[0])."<br>";
// echo "+ PK DIRECT: ".$this->insert_id[0][$this->prepare_cursor[$stm_name]['pk_name']]."<Br>";
// if this has only the pk_name, then only return this, else array of all data (but without the position)
// example if insert_id[0]['foo'] && insert_id[0]['bar'] it will become insert_id['foo'] & insert_id['bar']
// if only ['foo_id'] and it is the PK then the PK is directly written to the insert_id
if (count($this->insert_id[0]) > 1 ||
!array_key_exists($this->prepare_cursor[$stm_name]['pk_name'], $this->insert_id[0])
) {
$this->insert_id_ext = $this->insert_id[0];
$this->insert_id = $this->insert_id[0][$this->prepare_cursor[$stm_name]['pk_name']];
} elseif ($this->insert_id[0][$this->prepare_cursor[$stm_name]['pk_name']]) {
$this->insert_id = $this->insert_id[0][$this->prepare_cursor[$stm_name]['pk_name']];
}
} elseif (count($this->insert_id) == 0) {
// failed to get insert id
$this->insert_id = '';
$this->warning_id = 33;
$this->__dbError();
$this->__dbDebug('db', '<span style="color: orange;"><b>DB-Warning</b> '.$stm_name.': insert id returned no data</span>', 'DB_WARNING');
}
}
// this error handling is only for pgsql
if (is_array($this->insert_id)) {
$this->warning_id = 32;
$this->__dbError();
$this->__dbDebug('db', '<span style="color: orange;"><b>DB-Warning</b> '.$stm_name.': insert id data returned as array</span>', 'DB_WARNING');
} elseif (!$this->insert_id) {
// NOTE should we keep this inside
$this->warning_id = 31;
$this->__dbError();
$this->__dbDebug('db', '<span style="color: orange;"><b>DB-Warning</b> '.$stm_name.': Could not get insert id</span>', 'DB_WARNING');
}
}
return $result;
}
/**
@@ -2019,17 +2034,34 @@ class IO extends \CoreLibs\Basic
return $value;
}
// ***************************
// INTERNAL VARIABLES READ
// ***************************
/**
* return current set insert_id as is
* @return string|int|null Primary key value, most likely int
* Empty string for unset
* Null for error
* @return array|string|int|null Primary key value, most likely int
* Array for multiple return set
* Empty string for unset
* Null for error
*/
public function getInsertPK()
public function dbGetReturning()
{
return $this->insert_id;
}
/**
* alternative name, returns insert_id
* @return array|string|int|null Primary key value, most likely int
* Array for multiple return set
* Empty string for unset
* Null for error
*/
public function dbGetInsertPK()
{
return $this->dbGetReturning();
}
/**
* return the extended insert return string set
* Most likely Array
@@ -2040,7 +2072,7 @@ class IO extends \CoreLibs\Basic
* Empty string for unset
* Null for error
*/
public function getInsertReturn($key = null)
public function dbGetReturningExt($key = null)
{
if ($key !== null) {
if (isset($this->insert_id_ext[$key])) {
@@ -2052,15 +2084,24 @@ class IO extends \CoreLibs\Basic
return $this->insert_id_ext;
}
/**
* Always returns the returning block as an array
* @return array All returning data as array. even if one row only
*/
public function dbGetReturningArray(): array
{
return $this->insert_id_arr;
}
/**
* returns the full array for cursor ext
* @param string|null $q Query string, if not null convert to md5
* and return set cursor ext for only this
* if not found or null return null
* @return array|nul Cursor Extended array
* @return array|null Cursor Extended array
* Key is md5 string from query run
*/
public function getCursorExt($q = null)
public function dbGetCursorExt($q = null)
{
if ($q !== null) {
$q_md5 = md5($q);
@@ -2072,6 +2113,106 @@ class IO extends \CoreLibs\Basic
}
return $this->cursor_ext;
}
/**
* returns current number of rows that where
* affected by UPDATE/SELECT, etc
* null on empty
* @return int|null Number of rows
*/
public function dbGetNumRows()
{
return $this->num_rows ?? null;
}
/**
* Switches db debug flag on or off
* OR
* with the optional parameter fix sets debug
* returns current set stats
* @param bool|null $debug Flag to turn debug on off
* @return bool True for debug is on, False for off
*/
public function dbToggleDebug(?bool $debug = null)
{
if ($debug !== null) {
$this->db_debug = $debug;
} else {
$this->db_debug = $this->db_debug ? false : true;
}
return $this->db_debug;
}
// DEPEREACTED CALLS
/**
* old call for getInserReturnExt
* @param string|null $key See above
* @return array|string|null See above
* @deprecated use getReturningExt($key = null) instead
*/
public function getInsertReturn($key = null)
{
trigger_error('Method '.__METHOD__.' is deprecated, use getReturningExt($key = null)', E_USER_DEPRECATED);
return $this->dbGetReturningExt($key);
}
/**
* DEPRECATED: getReturning
* @return array|string|int|null [DEPRECATED]
* @deprecated use dbGetReturning() instead
*/
public function getReturning()
{
trigger_error('Method '.__METHOD__.' is deprecated, use dbGetReturning()', E_USER_DEPRECATED);
return $this->dbGetReturning();
}
/**
* DEPRECATED: getInsertPK
* @return array|string|int|null [DEPRECATED]
* @deprecated use dbGetInsertPK() instead
*/
public function getInsertPK()
{
trigger_error('Method '.__METHOD__.' is deprecated, use dbGetInsertPK()', E_USER_DEPRECATED);
return $this->dbGetReturning();
}
/**
* DEPRECATED: getReturningExt
* @param string|null $key [DEPRECATED]
* @return array|string|null [DEPRECATED]
* @deprecated use dbGetReturningExt($key = null) instead
*/
public function getReturningExt($key = null)
{
trigger_error('Method '.__METHOD__.' is deprecated, use dbGetReturningExt($key = null)', E_USER_DEPRECATED);
return $this->dbGetReturningExt($key);
}
/**
* DEPRECATED: getCursorExt
* @param string|null $q [DEPRECATED]
* @return array|null [DEPRECATED]
* @deprecated use dbGetCursorExt($q = null) instead
*/
public function getCursorExt($q = null)
{
trigger_error('Method '.__METHOD__.' is deprecated, use dbGetCursorExt($q = null)', E_USER_DEPRECATED);
return $this->dbGetCursorExt($q);
}
/**
* DEPRECATED: getNumRows
* @return int|null [DEPRECATED]
* @deprecated use dbGetNumRows() instead
*/
public function getNumRows()
{
trigger_error('Method '.__METHOD__.' is deprecated, use dbGetNumRows()', E_USER_DEPRECATED);
return $this->dbGetNumRows();
}
} // end if db class
// __END__

View File

@@ -1230,7 +1230,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
) {
$mand_okay = 1;
$row_okay[$i] = 1;
} elseif ($data_array['type'] == 'radio_group' && !isset($_POST[$prfx.$el_name])) {
} elseif (!empty($data_array['type']) && $data_array['type'] == 'radio_group' &&
!isset($_POST[$prfx.$el_name])
) {
// radio group and set where one not active
// $this->debug('edit_error_chk', 'RADIO GROUP');
$row_okay[$_POST[$prfx.$el_name][$i] ?? 0] = 0;
@@ -1589,7 +1591,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$this->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 ($data_array['type'] == 'text' && isset($_POST[$prfx.$el_name][$i])) {
if (!empty($data_array['type']) && $data_array['type'] == 'text' &&
isset($_POST[$prfx.$el_name][$i])
) {
$block_write[$i] = 1;
}
} else {
@@ -1644,7 +1648,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$q_names[$i] .= $el_name;
// data part, read from where [POST]
// radio group selections (only one can be active)
if ($data_array['type'] == 'radio_group') {
if (isset($data_array['type']) && $data_array['type'] == 'radio_group') {
if (isset($_POST[$prfx.$el_name]) && $i == $_POST[$prfx.$el_name]) {
$_value = $i + 1;
} else {
@@ -1933,7 +1937,8 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
// $this->debug('CFG SELECT', 'Proto: '.$this->printAr($q_select));
// query for reading in the data
$this->debug('edit_error', 'ERR: '.$this->error);
// if we got a read data, build the read select for the read, and read out the 'selected' data
// 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
@@ -1941,10 +1946,22 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
foreach ($q_select as $_pos => $element) {
$_q_select[$_pos] = $table_name.'.'.$element;
}
// set if missing
if (!isset($this->element_list[$table_name]['read_data']['pk_id'])) {
$this->element_list[$table_name]['read_data']['pk_id'] = '';
}
if (!isset($this->element_list[$table_name]['read_data']['name'])) {
$this->element_list[$table_name]['read_data']['name'] = '';
}
if (!isset($this->element_list[$table_name]['read_data']['table_name'])) {
$this->element_list[$table_name]['read_data']['table_name'] = '';
}
// add the read names in here, prefix them with the table name
// earch to read part is split by |
if ($this->element_list[$table_name]['read_data']['name']) {
if (!empty($this->element_list[$table_name]['read_data']['name'])) {
/** @phan-suppress-next-line PhanTypeArraySuspiciousNullable */
foreach (explode('|', $this->element_list[$table_name]['read_data']['name']) as $read_name) {
/** @phan-suppress-next-line PhanTypeArraySuspiciousNullable */
array_unshift($_q_select, $this->element_list[$table_name]['read_data']['table_name'].'.'.$read_name);
array_unshift($q_select, $read_name);
}
@@ -1952,24 +1969,29 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
// @phan HACK
$data['prefix'] = $data['prefix'] ?? '';
// set the rest of the data so we can print something out
/** @phan-suppress-next-line PhanTypeArraySuspiciousNullable */
$data['type'][$data['prefix'].$this->element_list[$table_name]['read_data']['name']] = 'string';
// build the read query
$q = 'SELECT ';
// if (!$this->table_array[$this->int_pk_name]['value'])
// $q .= 'DISTINCT ';
// prefix join key with table name, and implode the query select part
/** @phan-suppress-next-line PhanTypeArraySuspiciousNullable */
$q .= str_replace($table_name.'.'.$this->element_list[$table_name]['read_data']['pk_id'], $this->element_list[$table_name]['read_data']['table_name'].'.'.$this->element_list[$table_name]['read_data']['pk_id'], implode(', ', $_q_select)).' ';
// if (!$this->table_array[$this->int_pk_name]['value'] && $this->element_list[$table_name]['read_data']['order'])
// $q .= ', '.$this->element_list[$table_name]['read_data']['order'].' ';
// read from the read table as main, and left join to the sub table to read the actual data
/** @phan-suppress-next-line PhanTypeArraySuspiciousNullable */
$q .= 'FROM '.$this->element_list[$table_name]['read_data']['table_name'].' ';
$q .= 'LEFT JOIN '.$table_name.' ';
$q .= 'ON (';
/** @phan-suppress-next-line PhanTypeArraySuspiciousNullable */
$q .= $this->element_list[$table_name]['read_data']['table_name'].'.'.$this->element_list[$table_name]['read_data']['pk_id'].' = '.$table_name.'.'.$this->element_list[$table_name]['read_data']['pk_id'].' ';
// if ($this->table_array[$this->int_pk_name]['value'])
$q .= 'AND '.$table_name.'.'.$this->int_pk_name.' = '.(!empty($this->table_array[$this->int_pk_name]['value']) ? $this->table_array[$this->int_pk_name]['value'] : 'NULL').' ';
$q .= ') ';
if (isset($this->element_list[$table_name]['read_data']['order'])) {
/** @phan-suppress-next-line PhanTypeArraySuspiciousNullable */
$q .= ' ORDER BY '.$this->element_list[$table_name]['read_data']['table_name'].'.'.$this->element_list[$table_name]['read_data']['order'];
}
} else {

View File

@@ -67,6 +67,11 @@ class SmartyExtend extends SmartyBC
public $JS_TEMPLATE_NAME;
public $CSS_TEMPLATE_NAME;
public $TEMPLATE_TRANSLATE;
// core group
public $JS_CORE_TEMPLATE_NAME;
public $CSS_CORE_TEMPLATE_NAME;
public $JS_CORE_INCLUDE;
public $CSS_CORE_INCLUDE;
// local names
public $JS_SPECIAL_TEMPLATE_NAME = '';
public $CSS_SPECIAL_TEMPLATE_NAME = '';
@@ -147,6 +152,55 @@ class SmartyExtend extends SmartyBC
$this->lang_dir = BASE.INCLUDES.LANG.CONTENT_PATH;
}
/**
* @return void
*/
private function setSmartCoreIncludeCssJs(): void
{
// core CS
$this->CSS_CORE_INCLUDE = '';
if (file_exists($this->CSS.$this->CSS_CORE_TEMPLATE_NAME) &&
is_file($this->CSS.$this->CSS_CORE_TEMPLATE_NAME)
) {
$this->CSS_CORE_INCLUDE = $this->CSS.$this->CSS_CORE_TEMPLATE_NAME;
}
// core JS
$this->JS_CORE_INCLUDE = '';
if (file_exists($this->JAVASCRIPT.$this->JS_CORE_TEMPLATE_NAME) &&
is_file($this->JAVASCRIPT.$this->JS_CORE_TEMPLATE_NAME)
) {
$this->JS_CORE_INCLUDE = $this->JAVASCRIPT.$this->JS_CORE_TEMPLATE_NAME;
}
// additional per page Javascript include
$this->JS_INCLUDE = '';
if (file_exists($this->JAVASCRIPT.$this->JS_TEMPLATE_NAME) &&
is_file($this->JAVASCRIPT.$this->JS_TEMPLATE_NAME)
) {
$this->JS_INCLUDE = $this->JAVASCRIPT.$this->JS_TEMPLATE_NAME;
}
// per page css file
$this->CSS_INCLUDE = '';
if (file_exists($this->CSS.$this->CSS_TEMPLATE_NAME) &&
is_file($this->CSS.$this->CSS_TEMPLATE_NAME)
) {
$this->CSS_INCLUDE = $this->CSS.$this->CSS_TEMPLATE_NAME;
}
// optional CSS file
$this->CSS_SPECIAL_INCLUDE = '';
if (file_exists($this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME) &&
is_file($this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME)
) {
$this->CSS_SPECIAL_INCLUDE = $this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME;
}
// optional JS file
$this->JS_SPECIAL_INCLUDE = '';
if (file_exists($this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME) &&
is_file($this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME)
) {
$this->JS_SPECIAL_INCLUDE = $this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME;
}
}
/**
* sets all internal paths and names that need to be passed on to the smarty template
@@ -196,34 +250,8 @@ class SmartyExtend extends SmartyBC
$this->COMPILE_ID .= '_'.$this->TEMPLATE_NAME;
$this->CACHE_ID .= '_'.$this->TEMPLATE_NAME;
}
// additional per page Javascript include
$this->JS_INCLUDE = '';
if (file_exists($this->JAVASCRIPT.$this->JS_TEMPLATE_NAME) &&
is_file($this->JAVASCRIPT.$this->JS_TEMPLATE_NAME)
) {
$this->JS_INCLUDE = $this->JAVASCRIPT.$this->JS_TEMPLATE_NAME;
}
// per page css file
$this->CSS_INCLUDE = '';
if (file_exists($this->CSS.$this->CSS_TEMPLATE_NAME) &&
is_file($this->CSS.$this->CSS_TEMPLATE_NAME)
) {
$this->CSS_INCLUDE = $this->CSS.$this->CSS_TEMPLATE_NAME;
}
// optional CSS file
$this->CSS_SPECIAL_INCLUDE = '';
if (file_exists($this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME) &&
is_file($this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME)
) {
$this->CSS_SPECIAL_INCLUDE = $this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME;
}
// optional JS file
$this->JS_SPECIAL_INCLUDE = '';
if (file_exists($this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME) &&
is_file($this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME)
) {
$this->JS_SPECIAL_INCLUDE = $this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME;
}
// set all the additional CSS/JS parths
$this->setSmartCoreIncludeCssJs();
// check if template names exist
if (!$this->MASTER_TEMPLATE_NAME) {
exit('MASTER TEMPLATE is not set');
@@ -294,36 +322,12 @@ class SmartyExtend extends SmartyBC
// jquery and prototype should not be used together
$this->HEADER['USE_JQUERY'] = $this->USE_JQUERY;
// additional per page Javascript include
$this->JS_INCLUDE = '';
if (file_exists($this->JAVASCRIPT.$this->JS_TEMPLATE_NAME) &&
is_file($this->JAVASCRIPT.$this->JS_TEMPLATE_NAME)
) {
$this->JS_INCLUDE = $this->JAVASCRIPT.$this->JS_TEMPLATE_NAME;
}
// per page css file
$this->CSS_INCLUDE = '';
if (file_exists($this->CSS.$this->CSS_TEMPLATE_NAME) &&
is_file($this->CSS.$this->CSS_TEMPLATE_NAME)
) {
$this->CSS_INCLUDE = $this->CSS.$this->CSS_TEMPLATE_NAME;
}
// optional CSS file
$this->CSS_SPECIAL_INCLUDE = '';
if (file_exists($this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME) &&
is_file($this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME)
) {
$this->CSS_SPECIAL_INCLUDE = $this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME;
}
// optional JS file
$this->JS_SPECIAL_INCLUDE = '';
if (file_exists($this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME) &&
is_file($this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME)
) {
$this->JS_SPECIAL_INCLUDE = $this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME;
}
// set all the additional CSS/JS parths
$this->setSmartCoreIncludeCssJs();
// the actual include files for javascript (per page)
$this->HEADER['JS_CORE_INCLUDE'] = $this->JS_CORE_INCLUDE;
$this->HEADER['CSS_CORE_INCLUDE'] = $this->CSS_CORE_INCLUDE;
$this->HEADER['JS_INCLUDE'] = $this->JS_INCLUDE;
$this->HEADER['CSS_INCLUDE'] = $this->CSS_INCLUDE;
$this->HEADER['CSS_SPECIAL_INCLUDE'] = $this->CSS_SPECIAL_INCLUDE;