Compare commits

...

52 Commits

Author SHA1 Message Date
Clemens Schwaighofer
e46d0fa4a4 Phan fixes with smarty class and file uploader class 2020-01-22 15:48:34 +09:00
Clemens Schwaighofer
f7db84c62f Minor fixes in corelibs 2020-01-22 15:14:25 +09:00
Clemens Schwaighofer
3267fc0266 Updates and fixes, remove .htaccess
Remove .htaccess file with php variable settings as this will not work
on FPM calls.
Various minor fixes in core libs

Basic lib debug output check is now a sub class so we can use this
everywhere without writing the whole if statement again

Basic lib has a dummy uniq id method added. Not yet finished
2020-01-22 14:55:23 +09:00
Clemens Schwaighofer
d9e13ae14c Updates and fixes to CoreLibs
- fixed all DEFINE to define in config* files
- Updates Login class with missing strict declarations
- some fixes in Login class for possible errors
- Basic class return array layout updates for all rgb sets plus correct
  static update
- Basic class timestamp method fix for not full set (eg missing seconds)
- Basic class add method for getting linecount from a file
- DB IO class gets a get settings return value method
2020-01-07 15:45:24 +09:00
Clemens Schwaighofer
50db770992 Move the convert config setting to config other
the convert constant setting for inmage magick is now in config.other as
it is no longer core

Also add the base Progress and functions perl modules for central
tagging.

We will add config.pm, import_functions.pm, layout.pm and a basic test
script later too
2019-12-11 18:02:42 +09:00
Clemens Schwaighofer
e439945a54 Add edit_base* with admin/frontend folder file listing
Before it only listed files in current directory. Because of the hard
split select from both.
Add hostname/folder input (optional) to prefix files outside the same
folder.

Note: If no hostname/folder is set and two files in admin and frontend
have the same name they will be both highlighted as the point to the
same place.
2019-12-11 16:08:00 +09:00
Clemens Schwaighofer
8223441ca9 Add Front folder for web fonts
The font folder is set in the layout folder for frontend and holds web
fonts.

There is a new symlink folder in the libs directory to match the FONT
folder name for backend fonts
2019-12-11 13:54:37 +09:00
Clemens Schwaighofer
0153c9721f Add missing return in CoreLibs Basic internal url parser
Just to fulfill check, is only used internal
2019-12-06 15:35:07 +09:00
Clemens Schwaighofer
b6f6eeac9b Update byteStringFormat with si units and bitwise mask
The old method name byteStringFormat is currently deprecated and it is
recommended to move to the new humanReadableByteFormat method.
Difference is that the new version uses a bitfield settings mask
BYTE_FORMAT_NOSPACE, BYTE_FORMAT_ADJUST, BYTE_FORMAT_SI
2019-12-06 15:29:06 +09:00
Clemens Schwaighofer
beedf629e5 Fixups for phan 2.4.4 run checks
Lines with @phan HACK comment are added to supress phan warnings, but do
actually no additional work.
On newer phan version those lines should be checked and removed if
needed
2019-12-05 16:01:44 +09:00
Clemens Schwaighofer
04b47574eb CoreLibs\Basic arrayDiff for full array diff
PHP array_diff only compares missing elements in the second and existing
in the first so a full diff is only achieved if compares both ways (a,b)
and (b,a)
This function uns a full compare and returns difference in an array
2019-12-04 12:12:43 +09:00
Clemens Schwaighofer
ecc52e2dbd Basic class if layout fixes 2019-11-28 15:44:39 +09:00
Clemens Schwaighofer
12e335c69c Move fileUploadErrorMessage from Admin\Backend to Basic
Also removed the auto translate, return just string.
Is also a static method so can be called by
Basic::fileUploadErrorMessage too

Removed left over LANG settings in admin header
2019-11-15 17:53:21 +09:00
Clemens Schwaighofer
3ae3b1b761 Simplify language calls
There are no more lang vars passed on to any class calls
The new order is the following
$OVERRIDE_LANG > _SESSION > SITE_LANG > DEFAULT_LANG

Todo: make the setLang better so we do not have the same method in
Backend/Generic/SmartyExtended
2019-11-15 17:07:35 +09:00
Clemens Schwaighofer
3c9ca025f5 Smarty Extended split out cms var merge & content render
The down merge of outside class smarty vars is now an extra function
that can be called stand alone.

The smarty render function call is also a stand alone function that can
be called from outside
2019-11-15 15:20:12 +09:00
Clemens Schwaighofer
96afa463e0 Smarty Extended add method documentation 2019-11-15 14:47:40 +09:00
Clemens Schwaighofer
5195212fae Smarty Extended move set paths method on top 2019-11-15 14:43:22 +09:00
Clemens Schwaighofer
e990d6b410 Smarty Extended class update
Move all smarty and path settings into the Smarty Extended class

the include files <admin|frontend>_set_paths.php and <admin|frontend>_smarty.php

are deprecated.

For special frontend smarty (which will be not used in future anyway) a
dedicated sub class to Smarty Extended with its own methods should be
created
2019-11-15 14:15:12 +09:00
Clemens Schwaighofer
b5dd85bc75 add test images 2019-11-05 18:09:26 +09:00
Clemens Schwaighofer
b2945a8fa0 Update Create Thumbnail calls in Basic class
ImageMagick direct convert call uses pre-set vars
GD Thumbnail creator can create dummy thumbnails if they are not in the
normal convertable type
2019-11-05 14:01:21 +09:00
Clemens Schwaighofer
c77562b595 config master update
- use config.other.php to include other none core settings
- fix tab intends for not used defines
- remove old ACL defines that are not needed
- move BASE_NAME out to new area

TODO: think about removing G_TITLE
TODO: think about BASE_NAME external setting
2019-10-29 12:00:55 +09:00
Clemens Schwaighofer
2210f62441 Simple Thumbnail with GD only, base config master update, test images add 2019-10-28 16:39:46 +09:00
Clemens Schwaighofer
dfb2a93fbd Basic class add two new methods
correctImageOrientation: fixes the orientation of a JPEG image with
the exif Orientation header set

uuidv4: creates a uuid v4 string
2019-10-16 18:58:19 +09:00
Clemens Schwaighofer
ca073c1b56 Fix JS key in object check function
instead of using "in" which could return true for other entries in the
object use the proper hasOwnProperty call
2019-10-16 15:08:08 +09:00
Clemens Schwaighofer
f316dde8b7 CoreLibs Fix mandator check & sub group checks for unique input 2019-10-09 10:55:54 +09:00
Clemens Schwaighofer
13b18c3a62 Add ajax page flag to basic class and updated login class to reflect this 2019-10-08 18:34:29 +09:00
Clemens Schwaighofer
18bf829c6b Fix JS comments 2019-10-04 18:56:23 +09:00
Clemens Schwaighofer
723b6345bb Info text about target base library for edit.js 2019-10-04 11:38:41 +09:00
Clemens Schwaighofer
e235721c8b Update JQUERY to jdocs3 comment style 2019-10-04 11:33:54 +09:00
Clemens Schwaighofer
fd0af5a294 Update Login class to return login screen with reset _POST
Login class checks if AJAX_PAGE is set to true and then does not print
the login html to the screen directly, but returns it in the _POST array
login_html, _POST action is set to login
It also resets _POST & _GET arrays before hand to avoid any misuese.
All _SESSION array access needs to be checked in any following class as
the _SESSION is unset in this moment

html element should be overwritten with this JS:
document.getElementsByTagName('html')[0].innerHTML  =
data.content.login_html;
2019-10-03 15:37:06 +09:00
Clemens Schwaighofer
fd8caaf5de htaccess update for short open tag 2019-10-02 11:54:19 +09:00
Clemens Schwaighofer
3d842d4107 Missing strict declares, Progress bar init, missing site config bail
In master config if there is no site config for this page, bail out.
In the other config pages the strict declare header was missing.

Progress bar inits the progress array with all set to null to avoid
calls on not set index
2019-10-01 15:43:50 +09:00
Clemens Schwaighofer
c895beb35f IO: reset field names update
instead of set to array, set to null as we fully reset this entry
2019-09-30 15:57:23 +09:00
Clemens Schwaighofer
b6a35d15cf Basic: resurcive array search, IO unset fix
Basic: recusrive array search has correct parameter declarations &
checks for null/empty/not string

IO: all unset are removed and null or init to array is used to reset

Update for other include pages with some missing default data
2019-09-30 15:52:14 +09:00
Clemens Schwaighofer
20c44694e8 Default config fix for HOST_NAME and example db host array update 2019-09-26 15:03:00 +09:00
Clemens Schwaighofer
f6424bdd35 Minor updates for set checks, example update for host config
Host config example for a pre-set config array to attach.

Update fixes for admin_set_paths, ACL\Login unset variable/index check
2019-09-26 12:36:54 +09:00
Clemens Schwaighofer
ea3a8edae6 phpstan tmp dir folder name fix 2019-09-24 14:16:08 +09:00
Clemens Schwaighofer
d04cc380b2 Set phpstan tmp dir, Basic class check date/time empty date fix
set explicit tmp folder for phpstan to not overlap with other users

Basic class return false for unset date or datetime parameter
2019-09-24 14:12:33 +09:00
Clemens Schwaighofer
98bf11e0c9 Bug fix in Basic class string to bytes convert 2019-09-20 16:25:14 +09:00
Clemens Schwaighofer
a6918bac6f phpstan config update, move const in basic into class
the basic class const for self checks are class const variables now
2019-09-20 14:53:27 +09:00
Clemens Schwaighofer
86c5085f92 php-pan/stan test pages update 2019-09-20 14:35:04 +09:00
Clemens Schwaighofer
63bcdc0eff Fixes for array ( calls, fixes for phan warning reports
Renamed all array ( to array( that where left over

Fixed various minor bugs for phan level 0 reporting
2019-09-20 13:15:09 +09:00
Clemens Schwaighofer
ef1df6f171 Switch all array init calles to no space before bracket
Also bug fix in Form General for load int PK calls with non int types
2019-09-20 11:10:13 +09:00
Clemens Schwaighofer
8ade113070 autoloader update, config master, db io minor fixes
Various not needed isset checks removed
autoloader correctly checks that "LIB" is at the end of the path only
2019-09-19 18:54:46 +09:00
Clemens Schwaighofer
4508692330 Bug fix for translation class, DB IO connection error set fix
- The translation file reader did an isset on a set variable insetad of
checking if the variable is zero and so never started the translation
system
- The DB IO connection not set was wrongly set. If the connection failed
it is not TRUE and else FALSE. There is a new internal method
getConnectionStatus to query this status it returns TRUE/FALSE depending
if the connection failed

- Update the l10n test page with proper translation tests
  - init OK
  - show current lang/file
  - translation test
  - switch language test
2019-09-19 15:30:04 +09:00
Clemens Schwaighofer
98c87a755a Switch config default JS lib from Prototype to Jquery 2019-09-19 13:11:54 +09:00
Clemens Schwaighofer
bf96eb755d Fix all classes with PHP-DOC style method comments
Also various fixes for clean phan run
Update config base for array type host settings and no long single
entries
2019-09-19 11:56:27 +09:00
Clemens Schwaighofer
9ea8364aab phpan/phpstan clean up runs, minor update to DB\IO
DB\IO dbReturn method has a third parameter to set read only assoc and
not number data from the query

Install basic composer for trying out psalm

setting phpan/phpstan for basic static checking and do basic clean up on
all of the files
2019-09-18 09:25:35 +09:00
Clemens Schwaighofer
25941f4b49 Fix in explode in Basic class 2019-09-13 16:59:10 +09:00
Clemens Schwaighofer
56612cb13b Clean up for move to .php files an phan checks 2019-09-13 16:08:49 +09:00
Clemens Schwaighofer
d9ad041c47 Renamed all .inc PHP files to .php and replaced all .inc calls
Because .inc style is deprecated and also dangerious as often not setup
correctly on the server all .inc files have been renamed to .php files.

All internall calls have been udpated.
2019-09-13 15:47:37 +09:00
Clemens Schwaighofer
5558a21824 Composter update to 1.9.0 2019-09-13 10:43:07 +09:00
120 changed files with 8360 additions and 4973 deletions

View File

@@ -9,6 +9,7 @@ php_value xdebug.show_local_vars 0
# allowed COOKIE, FILES, GET, POST, REQUEST, SERVER, SESSION # allowed COOKIE, FILES, GET, POST, REQUEST, SERVER, SESSION
#php_value xdebug.dump.GET * #php_value xdebug.dump.GET *
# PHP ERROR SETTINGS # PHP ERROR SETTINGS
php_flag short_open_tag off
php_flag display_startup_errors on php_flag display_startup_errors on
php_flag display_errors on php_flag display_errors on
php_flag html_errors on php_flag html_errors on

125
.phan/config.php Normal file
View File

@@ -0,0 +1,125 @@
<?php
use Phan\Config;
/**
* This configuration will be read and overlaid on top of the
* default configuration. Command line arguments will be applied
* after this file is read.
*
* @see src/Phan/Config.php
* See Config for all configurable options.
*
* A Note About Paths
* ==================
*
* Files referenced from this file should be defined as
*
* ```
* Config::projectPath('relative_path/to/file')
* ```
*
* where the relative path is relative to the root of the
* project which is defined as either the working directory
* of the phan executable or a path passed in via the CLI
* '-d' flag.
*/
return [
// If true, missing properties will be created when
// they are first seen. If false, we'll report an
// error message.
"allow_missing_properties" => false,
// Allow null to be cast as any type and for any
// type to be cast to null.
"null_casts_as_any_type" => false,
// Backwards Compatibility Checking
'backward_compatibility_checks' => true,
// Run a quick version of checks that takes less
// time
"quick_mode" => false,
// Only emit critical issues to start with
// (0 is low severity, 5 is normal severity, 10 is critical)
"minimum_severity" => 0,
// default false for include path check
"enable_include_path_checks" => true,
"include_paths" => [
'.', '../configs/'
],
'ignore_undeclared_variables_in_global_scope' => true,
"file_list" => [
"./www/configs/config.db.php",
"./www/configs/config.host.php",
"./www/configs/config.path.php",
"./www/configs/config.other.php",
"./www/configs/config.master.php",
"./www/includes/admin_header.php",
],
// A list of directories that should be parsed for class and
// method information. After excluding the directories
// defined in exclude_analysis_directory_list, the remaining
// files will be statically analyzed for errors.
//
// Thus, both first-party and third-party code being used by
// your application should be included in this list.
'directory_list' => [
// Change this to include the folders you wish to analyze
// (and the folders of their dependencies)
'www',
// To speed up analysis, we recommend going back later and
// limiting this to only the vendor/ subdirectories your
// project depends on.
// `phan --init` will generate a list of folders for you
//'www/vendor',
],
// A list of directories holding code that we want
// to parse, but not analyze
"exclude_analysis_directory_list" => [
'www/vendor',
'www/lib/FileUpload',
'www/lib/pChart',
'www/lib/pChart2.1.4',
'www/lib/Smarty',
'www/lib/smarty-3.1.30',
'www/templates_c',
'www/log',
'www/tmp',
'www/cache',
'www/media',
],
'exclude_file_list' => [
// ignore all symlink files to edit
'www/admin/edit_access.php',
'www/admin/edit_groups.php',
'www/admin/edit_languages.php',
'www/admin/edit_menu_group.php',
'www/admin/edit_order.php',
'www/admin/edit_pages.php',
'www/admin/edit_schemes.php',
'www/admin/edit_users.php',
'www/admin/edit_visible_group.php',
// ignore the old qq tests
'www/admin/qq_file_upload_front.php',
'www/admin/qq_file_upload_ajax.php',
],
// what not to show as problem
'suppress_issue_types' => [
// 'PhanUndeclaredMethod',
'PhanEmptyFile',
],
// Override to hardcode existence and types of (non-builtin) globals in the global scope.
// Class names should be prefixed with `\`.
//
// (E.g. `['_FOO' => '\FooClass', 'page' => '\PageClass', 'userId' => 'int']`)
'globals_type_map' => [],
];

View File

@@ -16,6 +16,7 @@ table/edit_scheme.sql
table/edit_language.sql table/edit_language.sql
table/edit_group.sql table/edit_group.sql
table/edit_page_access.sql table/edit_page_access.sql
table/edit_page_content.sql
table/edit_user.sql table/edit_user.sql
table/edit_log.sql table/edit_log.sql
table/edit_access.sql table/edit_access.sql
@@ -31,6 +32,7 @@ trigger/trg_edit_group.sql
trigger/trg_edit_language.sql trigger/trg_edit_language.sql
trigger/trg_edit_log.sql trigger/trg_edit_log.sql
trigger/trg_edit_page_access.sql trigger/trg_edit_page_access.sql
trigger/trg_edit_page_content.sql
trigger/trg_edit_page.sql trigger/trg_edit_page.sql
trigger/trg_edit_query_string.sql trigger/trg_edit_query_string.sql
trigger/trg_edit_scheme.sql trigger/trg_edit_scheme.sql

View File

@@ -0,0 +1,14 @@
-- update missing edit_* table data
ALTER TABLE edit_generic ADD cuid VARCHAR;
ALTER TABLE edit_access ADD enabled SMALLINT DEFAULT 0;
ALTER TABLE edit_access ADD protected SMALLINT DEFAULT 0;
ALTER TABLE edit_group ADD uid VARCHAR;
ALTER TABLE edit_group ADD deleted SMALLINT DEFAULT 0;
ALTER TABLE temp_files ADD folder varchar;
ALTER TABLE edit_page ADD hostname varchar;
ALTER TABLE edit_user ADD deleted SMALLINT DEFAULT 0;

View File

@@ -1,11 +1,11 @@
#******************************************************************** # ********************************************************************
# AUTHOR: Clemens Schwaighofer # AUTHOR: Clemens Schwaighofer
# CREATED: 2005/08/09 # CREATED: 2005/08/09
# SHORT DESCRIPTION: # SHORT DESCRIPTION:
# Backned English Messages file for gettext # Backned English Messages file for gettext
# to craete: msgfmt -o ja.mo messages_en.po # to craete: msgfmt -o ja.mo messages_en.po
# HISTORY: # HISTORY:
#********************************************************************/ # ********************************************************************/
msgid "" msgid ""
msgstr "" msgstr ""
@@ -24,3 +24,6 @@ msgstr "Year"
msgid "Month" msgid "Month"
msgstr "Month" msgstr "Month"
msgid "INPUT TEST"
msgstr "OUTPUT TEST EN"

View File

@@ -1,11 +1,11 @@
#******************************************************************** # ********************************************************************
# AUTHOR: Clemens Schwaighofer # AUTHOR: Clemens Schwaighofer
# CREATED: 2018/03/28 # CREATED: 2018/03/28
# SHORT DESCRIPTION: # SHORT DESCRIPTION:
# Backend Japanese Messages file for gettext # Backend Japanese Messages file for gettext
# to craete: msgfmt -o ja.mo messages_ja.po # to craete: msgfmt -o ja.mo messages_ja.po
# HISTORY: # HISTORY:
#********************************************************************/ # ********************************************************************/
msgid "" msgid ""
msgstr "" msgstr ""
@@ -61,3 +61,17 @@ msgstr "土"
msgid "Sun" msgid "Sun"
msgstr "日" msgstr "日"
msgid "INPUT TEST"
msgstr "OUTPUT TEST JA"
# login string
msgid "Hello %s"
msgstr "こにちは %s"
msgid "I should be translated"
msgstr "「スマーティー」これは正しいです"
msgid "Are we translated?"
msgstr "「クラス」これは翻訳です?"

View File

@@ -1,7 +1,92 @@
-- 2019/9/10 update edit_page with reference -- 2019/9/10 update edit_page with reference and additional ACLs, update core functions
-- page content reference settings -- * random_string function
-- * add cuid column in edit_generic
-- * update generic trigger function
-- * edit_page_content table/trigger
-- * edit_* additional_acl entries
-- * edit_page content alias link
-- * update any missing cuid entries
-- create random string with length X
CREATE FUNCTION random_string(randomLength int)
RETURNS text AS $$
SELECT array_to_string(
ARRAY(
SELECT substring(
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',
trunc(random() * 62)::int + 1,
1
)
FROM generate_series(1, randomLength) AS gs(x)
),
''
)
$$ LANGUAGE SQL
RETURNS NULL ON NULL INPUT
VOLATILE;
-- edit_gneric update
ALTER TABLE edit_generic ADD cuid VARCHAR;
-- adds the created or updated date tags
CREATE OR REPLACE FUNCTION set_edit_generic() RETURNS TRIGGER AS '
DECLARE
random_length INT = 12; -- that should be long enough
BEGIN
IF TG_OP = ''INSERT'' THEN
NEW.date_created := ''now'';
NEW.cuid := random_string(random_length);
ELSIF TG_OP = ''UPDATE'' THEN
NEW.date_updated := ''now'';
END IF;
RETURN NEW;
END;
' LANGUAGE 'plpgsql';
-- DROP TABLE edit_page_content;
CREATE TABLE edit_page_content (
edit_page_content_id SERIAL PRIMARY KEY,
edit_page_id INT NOT NULL,
edit_access_right_id INT NOT NULL,
name VARCHAR,
uid VARCHAR UNIQUE,
order_number INT NOT NULL,
online SMALLINT NOT NULL DEFAULT 0,
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
) INHERITS (edit_generic) WITHOUT OIDS;
DROP TRIGGER trg_edit_page_content ON edit_page_content;
CREATE TRIGGER trg_edit_page_content
BEFORE INSERT OR UPDATE ON edit_page_content
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
-- INSERT new list entry
INSERT INTO edit_access_right (name, level, type) VALUES ('List', 10, 'list');
-- UPDATE -- UPDATE
ALTER TABLE edit_user ADD additional_acl JSONB;
ALTER TABLE edit_group ADD additional_acl JSONB;
ALTER TABLE edit_access ADD additional_acl JSONB;
-- page content reference settings
ALTER TABLE edit_page ADD content_alias_edit_page_id INT; ALTER TABLE edit_page ADD content_alias_edit_page_id INT;
ALTER TABLE edit_page ADD CONSTRAINT edit_page_content_alias_edit_page_id_fkey FOREIGN KEY (content_alias_edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE edit_page ADD CONSTRAINT edit_page_content_alias_edit_page_id_fkey FOREIGN KEY (content_alias_edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE RESTRICT ON UPDATE CASCADE;
-- 2019/9/10 UPDATE missing cuid in edit_* tables
UPDATE edit_access SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_access_data SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_access_right SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_access_user SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_group SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_language SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_log SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_menu_group SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_page SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_page_access SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_page_content SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_query_string SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_scheme SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_user SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_visible_group SET cuid = random_string(12) WHERE cuid IS NULL;
-- update all triggers

498
bin/Progress.pm Normal file
View File

@@ -0,0 +1,498 @@
package Progress;
# AUTHOR: Clemens Schwaighofer
# DATE CREATED: 2009/6/16
# DESCRIPTION: progress percent class
# METHODS
# * init
# my $prg = Progress->new();
# will init a new progress class in the var $prg
# the following parameters can be set directly during a new call
# - verbose (1/0)
# - precision (-1~10)
# - wide_time (0/1)
# - microtime (0/1)
# setting is done via
# my $prg = Progress->new(verbose => 1, microtime = 1);
# * setting methods
# verbose($level int)
# $level has to be int, if not set there is no output show, at least 1 has to be given to see visible output
# precision($decimals int)
# $decimals has to be int, if set to -1 then the steps are done in 10 increase, else it sets how many decimals are visible, 0 for no decimals
# wide_time(0/1 int)
# sets the flag for wide time, if set to 1 the estimated time to end and time run is left prefixed with 15 chars
# microtime(0/1 int)
# sets the flag to always show microtime (1) or only if the previous time was the same (0)
# reset()
# resets all the internal vars for another new run
# SetStartTime(optional timestamp)
# sets the start times for this progress run, the overall start/end time is set, and the time used for the actual progress
# in case there is some processing done before the run starts, it is highly recommended to call SetETAStartTime before the actual processing starts
# if no timestamp is given, internal timestamp is used (this is recommended)
# SetETAStartTime(optional timestamp)
# only sets the start/end time for the actual "estimated time" calculation. It is recommended to call this right before the processing loop starts
# eg if there is a big query running that takes a lot of time, this method should be called before the reading loop
# as with SetStartTime a timestamp can be given, if not then the internal timestamp is used (this is recommended)
# SetEndTime(optional timestamp)
# sets the end time for the overall processing. This should be called at the very end of the script before any final stat data is printed
# linecount($lines int)
# sets the maximum lines that will be processed, used for percentage calculation. If non int is given, will set to 1. This will be only set once, to
# reset used reset() method.
# Either this or filesize NEED to be set
# filesize($bytes int)
# filesize in bytes, if non valid data is given, then it is set to 1.
# filesize() and linecount() can both be set, but at least one of them has to be set.
# if filesize is set a byte data output is added, if only linecount is given, only the linecount output will be given (no bytes per second, etc)
# ShowPosition(optional current byte position int)
# this is the main processing and has to be called at the end of the loop where the data is processed. If no bytes are given the internal counter (linecount)
# is used.
# for bytes it is recommended to use IO::File and $FH->tell to pass on the bytes
#
# VARIABLES
# * internal set
# change: flagged 1 if output is given or would be given. can be used for any post processing after the ShowPosition is called
# precision_ten_step: flagged 1 if the precision was set to -1
# start: overall start time
# end: overall end time
# count: count of processed lines
# [TODO: describe the others too, at the moment only below in %fields]
use strict;
use warnings;
use utf8;
BEGIN {
use POSIX;
use Carp;
use Time::HiRes qw(time);
use File::Basename;
use Number::Format qw(format_number);
use vars qw($AUTOLOAD);
push(@INC, File::Basename::dirname($0).'/');
}
# important includes
use functions;
# variable declarationf or access
# * can be set
# = only for read
# unmarked are internal only, but can be read if they are needed in further processing in the script
my %fields = (
linecount => 0, # * max lines in input
filesize => 0, # * max file size
precision => 1, # * comma after percent
wide_time => 0, # * if flagged 1, then the wide 15 char left bound format is used
verbose => 0, # * verbose status from outside
microtime => 0, # * microtime output for last run time (1 for enable, 0 for auto, -1 for disable)
change => 0, # = flag if output was given
start => undef, # = global start for the full script running time
start_run => undef, # = for the eta time, can be set after a query or long read in, to not create a wrong ETA time
start_time => undef, # loop start
end => undef, # = global end
end_time => undef, # loop end
count_size => undef, # = filesize current
count => 0, # = position current
current_count => 0, # last count (position)
lines_processed => 0, # lines processed in the last run
last_group => 0, # time in seconds for the last group run (until percent change)
lines_in_last_group => 0, # float value, lines processed per second to the last group run
lines_in_global => 0, # float values, lines processed per second to complete run
bytes_in_last_group => 0, # flaot value, bytes processes per second in the last group run
bytes_in_global => 0, # float value, bytes processed per second to complete run
size_in_last_group => 0, # bytes processed in last run (in bytes)
current_size => 0, # current file position (size)
last_percent => 0, # last percent position
precision_ten_step => 0, # if we have normal % or in steps of 10
percent_print => 5, # the default size, this is precision + 4
percent_precision => 1, # this is 1 if it is 1 or 0 for precision, or precision size
eta => undef, # estimated time to finish
full_time_needed => undef, # run time since start
lg_microtime => 0 # last group microtime, this is auto set during process.
);
# class init
sub new
{
my $proto = shift;
my $class = ref($proto) || $proto;
my %data = @_;
my $self = {
_permitted => \%fields,
%fields,
};
# vars to init
bless ($self, $class);
if ($data{'verbose'} && $data{'verbose'} =~ /^\d{1}$/) {
$self->{verbose} = $data{'verbose'};
}
if (exists($data{'precision'}) && (($data{'precision'} || $data{'precision'} == 0) && $data{'precision'} =~ /^\-?\d{1,2}$/)) {
$self->precision($data{'precision'});
}
if ($data{'microtime'} && $data{'microtime'} =~ /^(0|1)$/) {
$self->microtime($data{'microtime'});
}
if ($data{'wide_time'} && $data{'wide_time'} =~ /^(0|1)$/) {
$self->wide_time($data{'wide_time'});
}
return $self;
}
# auto load for vars
sub AUTOLOAD
{
my $self = shift;
my $type = ref($self) || croak "$self is not an object";
my $name = $AUTOLOAD;
$name =~ s/.*://;
unless (exists $self->{_permitted}->{$name}) {
croak "Can't access '$name' field in class $type";
}
if (@_) {
return $self->{$name} = shift;
} else {
return $self->{$name};
}
}
# destructor
sub DESTROY
{
# do nothing, there is nothing to close or finish
}
# SUB: reset
# PARAMS: none
# DESC: resets all the current counters only and current start times
sub reset
{
my $self = shift;
# reset what always gets reset
$self->{count} = 0;
$self->{count_size} = undef;
$self->{current_count} = 0;
$self->{linecount} = 0;
$self->{lines_processed} = 0;
$self->{last_group} = 0;
$self->{lines_in_last_group} = 0;
$self->{lines_in_global} = 0;
$self->{bytes_in_last_group} = 0;
$self->{bytes_in_global} = 0;
$self->{size_in_last_group} = 0;
$self->{filesize} = 0;
$self->{current_size} = 0;
$self->{last_percent} = 0;
$self->{eta} = 0;
$self->{full_time_needed} = 0;
$self->{start_run} = undef;
$self->{start_time} = undef;
$self->{end_time} = undef;
}
# SUB: microtime
# PARAMS: 1/0
# DESC: flag to set microtime on or off in the time output
# if not 1 or 0, set to 0
sub microtime
{
my $self = shift;
my $microtime;
if (@_) {
$microtime = shift;
if ($microtime == 1 || $microtime == 0) {
$self->{microtime} = $microtime;
} else {
$self->{microtime} = 0;
}
}
return $self->{microtime};
}
# SUB: wide_time
# PARAMS: 1/0
# DESC: flag to set wide_time (15 char spacer).
# if not 1 or 0, set to 0
sub wide_time
{
my $self = shift;
my $wide;
if (@_) {
$wide = shift;
if ($wide == 1 || $wide == 0) {
$self->{wide_time} = $wide;
} else {
$self->{wide_time} = 0;
}
}
return $self->{wide_time};
}
# SUB: precision
# PARAMS: precision in int
# DESC: sets the output percent precision calculation and printf width
# if negative, to ten step, if bigger 10, set to one
sub precision
{
my $self = shift;
my $comma;
if (@_) {
$comma = shift;
$comma = 0 if ($comma !~ /^\-?\d{1,}$/);
if ($comma < 0) {
# -2 is 5 step
# -1 is 10 step
if ($comma < -1) {
$self->{precision_ten_step} = 5;
} else {
$self->{precision_ten_step} = 10;
}
$self->{precision} = 0; # no comma
$self->{percent_precision} = 0; # no print precision
$self->{percent_print} = 3; # max 3 length
} else {
$self->{precision} = $comma < 0 || $comma > 10 ? 10 : $comma;
$self->{percent_precision} = $comma < 0 || $comma > 10 ? 10 : $comma;
$self->{percent_print} = ($comma == 0 ? 3 : 4) + $self->{percent_precision};
}
}
return $self->{precision};
}
# SUB: linecount
# PARAMS: max number of lines to be processed
# DESC: sets the max number for lines for the percent calculation, if negative or not number, set to 1
# can only be set ONCE
sub linecount
{
my $self = shift;
my $linecount;
if (!$self->{linecount}) {
if (@_) {
$linecount = shift;
$self->{linecount} = $linecount;
$self->{linecount} = 1 if ($linecount < 0 || $linecount !~ /\d+/)
}
}
return $self->{linecount};
}
# SUB: filesize
# PARAMS: max filesize for the to processed data
# DESC: sets the max filesize for the to processed data, if negative or not number, set to 1
# input data has to be in bytes without any suffix (no b, kb, etc)
# can only be set ONCE
sub filesize
{
my $self = shift;
my $filesize;
if (!$self->{filesize}) {
if (@_) {
$filesize = shift;
$self->{filesize} = $filesize;
$self->{filesize} = 1 if ($filesize < 0 || $filesize !~ /\d+/)
}
}
return $self->{filesize};
}
# SUB: SetStartTime
# PARAMS: time, or nothing
# DESC: sets all the start times
sub SetStartTime
{
my $self = shift;
if (@_) {
$self->{start} = shift;
} else {
$self->{start} = time();
}
$self->{start_time} = $self->{start};
$self->{start_run} = $self->{start};
}
# SUB: SetETAStartTime
# PARAMS: time, or nothing
# DESC: sets the loop & run time, for correct ETA callculation
sub SetETAStartTime
{
my $self = shift;
if (@_) {
$self->{start_time} = shift;
} else {
$self->{start_time} = time();
}
$self->{start_run} = $self->{start_time};
}
# SUB: SetEndTime
# PARAMS: time, or nothing
# DESC: sets the end time for running time calculation
sub SetEndTime
{
my $self = shift;
if (@_) {
$self->{end} = shift;
} else {
$self->{end} = time();
}
}
# SUB: ShowPosition
# PARAMS: optiona; file position (via file pointer)
# RETURN: string for percent position output
# DESC: calculates the current percent position based on the passed parameter, if no parameter uses intneral counter
sub ShowPosition
{
my $self = shift;
# set local vars
my $percent; # current percent
my $full_time_needed; # complete process time
my $full_time_per_line; # time per line
my $eta; # estimated end time
my $string = ''; # percent string that gets output
my $show_filesize = 1;
# microtime flags
my $eta_microtime = 0;
my $ftn_microtime = 0;
my $lg_microtime = 0;
# percent precision calc
my $_p_spf = "%.".$self->{precision}."f";
# output format for percent
my $_pr_p_spf = "%".$self->{percent_print}.".".$self->{percent_precision}."f";
# set the linecount precision based on the final linecount, if not, leave it empty
my $_pr_lc = "%s";
$_pr_lc = "%".length(format_number($self->{linecount}))."s" if ($self->{linecount});
# time format, if flag is set, the wide format is used
my $_pr_tf = "%s";
$_pr_tf = "%-15s" if ($self->{'wide_time'});
# do the smae for file size
# my $_pr_fs = "%s";
# $_pr_fs = "%".length(function::convert_number($self->{filesize}))."s" if ($self->{filesize});
# increase position by one
$self->{count} ++;
# see if we get anything from IO tell
if (@_) {
$self->{file_pos} = shift;
} else {
# we did not, so we set internal value
$self->{file_pos} = $self->{count};
# we also check if the filesize was set now
if (!$self->{filesize}) {
$self->{filesize} = $self->{linecount};
}
# set ignore filesize output (no data)
$show_filesize = 0;
}
# set the count size based on the file pos, is only used if we have filesize
$self->{count_size} = $self->{file_pos};
# do normal or down to 10 (0, 10, ...) %
if ($self->{precision_ten_step}) {
# calc 0 comma precision, so just do a floor
my $_percent = sprintf("%d", ($self->{file_pos} / $self->{filesize}) * 100);
# mod that to 10
my $mod = $_percent % $self->{precision_ten_step};
# either write this one, or write the previous, old one
$percent = $mod == 0 ? $_percent : $self->last_percent;
# print "P: $percent, Last: ".$self->last_percent.", Mod: ".$mod.", Calc: ".$_percent."\n";
} else {
$percent = sprintf($_p_spf, ($self->{file_pos} / $self->{filesize}) * 100);
}
# print "POS: ".$self->{file_pos}.", PERCENT: $percent / ".$self->last_percent."\n";
if ($percent != $self->last_percent) {
$self->{end_time} = time();
# for from the beginning
$full_time_needed = $self->{end_time} - $self->{start_run}; # how long from the start;
$self->{last_group} = $self->{end_time} - $self->{start_time};
$self->{lines_processed} = $self->{count} - $self->{current_count};
# lines in last group
$self->{lines_in_last_group} = $self->{'last_group'} ? ($self->{lines_processed} / $self->{last_group}) : 0;
# lines in global
$self->{lines_in_global} = $full_time_needed ? ($self->{'count'} / $full_time_needed) : 0;
# if we have linecount
if (!$self->{linecount}) {
$full_time_per_line = (($full_time_needed) ? $full_time_needed : 1) / $self->{count_size}; # how long for all
$eta = $full_time_per_line * ($self->{filesize} - $self->{count_size}); # estimate for the rest
} else {
$full_time_per_line = (($full_time_needed) ? $full_time_needed : 1) / $self->{count}; # how long for all
$eta = $full_time_per_line * ($self->{linecount} - $self->{count}); # estimate for the rest
}
# just in case ...
$eta = '0' if ($eta < 0);
# check if to show microtime
# ON: if microtime is flagged as one
$eta_microtime = $ftn_microtime = $lg_microtime = 1 if ($self->{microtime} == 1);
# AUTO: foir microtime
if ($self->{microtime} == 0) {
$eta_microtime = 1 if ($eta > 0 && $eta < 1);
$ftn_microtime = 1 if ($full_time_needed > 0 && $full_time_needed < 1);
# pre check last group: if pre comma part is same add microtime anyway
$lg_microtime = 1 if ($self->{last_group} > 0 && $self->{last_group} < 1);
}
# print out
if ($show_filesize) {
# last group size
$self->{size_in_last_group} = $self->{count_size} - $self->{current_size};
# calc kb/s if there is any filesize data
# last group
$self->{bytes_in_last_group} = $self->{'last_group'} ? ($self->{size_in_last_group} / $self->{last_group}) : 0;
# global
$self->{bytes_in_global} = $full_time_needed ? ($self->{count_size} / $full_time_needed) : 0;
# only used if we run with file size for the next check
$self->{current_size} = $self->{count_size};
$string = sprintf(
"Processed ".$_pr_p_spf."%% [%s / %s] | ".$_pr_lc." / ".$_pr_lc." Lines | ETA: ".$_pr_tf." / TR: ".$_pr_tf." / LR: %s lines (%s) in %s, %s (%s) lines/s, %s (%s) b/s\n",
$percent,
function::convert_number($self->{count_size}),
function::convert_number($self->{filesize}),
format_number($self->{count}),
format_number($self->{linecount}),
function::convert_time($eta, $eta_microtime),
function::convert_time($full_time_needed, $ftn_microtime),
format_number($self->{lines_processed}),
function::convert_number($self->{size_in_last_group}),
function::convert_time($self->{last_group}, $lg_microtime),
format_number($self->{lines_in_global}, 2, 1),
format_number($self->{lines_in_last_group}, 2, 1),
function::convert_number($self->{bytes_in_global}),
function::convert_number($self->{bytes_in_last_group})
) if ($self->{verbose} >= 1);
} else {
$string = sprintf(
"Processed ".$_pr_p_spf."%% | ".$_pr_lc." / ".$_pr_lc." Lines | ETA: ".$_pr_tf." / TR: ".$_pr_tf." / LR: %s lines in %s, %s (%s) lines/s\n",
$percent,
format_number($self->{count}),
format_number($self->{linecount}),
function::convert_time($eta, $eta_microtime),
function::convert_time($full_time_needed, $ftn_microtime),
format_number($self->{lines_processed}),
function::convert_time($self->{last_group}, $lg_microtime),
format_number($self->{lines_in_global}, 2, 1),
format_number($self->{lines_in_last_group}, 2, 1)
) if ($self->{verbose} >= 1);
}
# write back vars
$self->{last_percent} = $percent;
$self->{eta} = $eta;
$self->{full_time_needed} = $full_time_needed;
$self->{lg_microtime} = $lg_microtime;
# for the next run, check data
$self->{start_time} = time();
$self->{current_count} = $self->{count};
# trigger if this is a change
$self->{change} = 1;
} else {
# trigger if this is a change
$self->{change} = 0;
}
return $string;
}
1;

501
bin/functions.pm Normal file
View File

@@ -0,0 +1,501 @@
package function;
# AUTHOR: Clemens Schwaighofer
# DATE CREATED: 2004/11/09
# DESCRIPTION: functions collection for Adidas scripts
# HISTORY:
# 2005/06/22 (cs) added header key check function
# 2005/02/10 (cs) added debug flag to print output, added two new functions to format a number into B, KB, etc
# 2005/01/13 (cs) fixed array problem with the clean up and int function
use strict;
use warnings;
use 5.000_000;
use POSIX qw(floor);
use File::Copy;
use Digest::SHA qw(sha1_hex);
use utf8;
#require Exporter;
#our @ISA = qw(Exporter);
#our @EXPORT = qw();
# depending on the options given to the program, it gets the correct settings
# to which db it should connect
sub get_db_user
{
my ($target, $db) = @_;
# the parts of the hash array (tab seperated)
my @array_names = qw{db_name db_port db_user db_pass db_host db_type db_test db_ssl};
my %db_out = ();
# based on the two parameters find the correct vars
# each level can hold data, higher level data overrules lower data
# eg $config::db{'test'}{'db_user'} overrules $config::db{'db_user'}
for (my $i = 1; $i <= 3; $i ++) {
foreach my $name (@array_names) {
# depending on the level check the level of data
if ($i == 1) {
$db_out{$name} = $config::db{$name} if (defined($config::db{$name}));
} elsif ($i == 2) {
$db_out{$name} = $config::db{$target}{$name} if (defined($config::db{$target}{$name}));
} elsif ($i == 3) {
$db_out{$name} = $config::db{$target}{$db}{$name} if (defined($config::db{$target}{$db}{$name}));
}
} # for each db data var
} # for each data level in the hash
return (
$db_out{'db_name'},
$db_out{'db_port'},
$db_out{'db_user'},
$db_out{'db_pass'},
$db_out{'db_host'},
$db_out{'db_type'},
$db_out{'db_test'},
$db_out{'db_ssl'}
);
}
# get the DSN string for the DB connect
sub get_db_dsn
{
my (
$db_name,
$db_port,
$db_user,
$db_pass,
$db_host,
$db_type,
$db_ssl
) = @_;
my $dsn = '';
if ($db_type eq 'mysql' && $db_name && $db_host && $db_user) {
$dsn = "DBI:mysql:database=".$db_name.";host=".$db_host.";port=".$db_port;
} elsif ($db_type eq 'pgsql' && $db_name && $db_host && $db_user) {
$dsn = "DBI:Pg:dbname=".$db_name.";host=".$db_host.";port=".$db_port.";sslmode=".$db_ssl;
} else {
# invalid db type
$dsn = -1;
}
return $dsn;
}
sub strip_white_spaces
{
my ($element) = @_;
# get rid of spaces at the end and at the beginning of each bloack
$element =~ s/^\s+//g;
$element =~ s/\s+$//g;
return $element;
}
sub prepare_hash_keys
{
my($csv, $data, $csv_header) = @_;
# unset value starts at 1000 and goes up ...
my $unset_value = 1000;
my %keys = ();
# parse header
if ($csv->parse($data)) {
my @cols = $csv->fields();
for (my $i = 0; $i < @cols; $i ++) {
# remove all spaces before and afterward
$cols[$i] = function::strip_white_spaces($cols[$i]);
# write key - id number
$keys{$cols[$i]} = $i;
print $::DEBUG "\tPostion [".$i."]: ".$cols[$i]."\n" if ($::debug);
print "\tPosition [".$i."]: ".$cols[$i]."\n" if ($::verbose > 1);
}
} else {
die "ERROR[".$csv->error_diag()."]: ".$csv->error_input()."\n";
}
# add empty values
foreach my $csv_header_value (@$csv_header) {
if (!defined($keys{$csv_header_value})) {
$keys{$csv_header_value} = $unset_value;
$unset_value ++;
print $::DEBUG "\tKey [$csv_header_value] gets position [".$keys{$csv_header_value}."]\n" if ($::debug);
print "\tKey [$csv_header_value] gets position [".$keys{$csv_header_value}."]\n" if ($::verbose > 1);
}
}
return %keys;
}
sub error_check_keys
{
my($csv_header, $keys) = @_;
if ((keys %$keys) != @$csv_header) {
print $::ERR "TOTAL WRONG COUNT: CSV header ".(keys %$keys)." vs Needed headers ".@$csv_header.": perhaps your input file is not fitting this?\n";
print "TOTAL WRONG COUNT: CSV header ".(keys %$keys)." vs Needed headers ".@$csv_header.": perhaps your input file is not fitting this?\n";
# if there are more keys in CSV file, then in the header defined in here
if ((keys %$keys) > @$csv_header) {
print $::ERR "Listing Perl Header missing\n";
print "Listing Perl Header missing\n";
foreach my $key (keys %$keys) {
print $::ERR "Missing in perl Header list: $key\n" if (!grep {$_ eq $key} @$csv_header);
print "Missing in perl Header list: $key\n" if (!grep {$_ eq $key} @$csv_header);
}
# if more keys are in the header defined than in the csv file
} else {
print $::ERR "Listing CSV Header missing\n";
print "Listing CSV Header missing\n";
for (my $i = 0; $i < @$csv_header; $i ++) {
print $::ERR "Missing in CSV file: ".$$csv_header[$i]."\n" if (!defined($$keys{$$csv_header[$i]}));
print "Missing in CSV file: ".$$csv_header[$i]."\n" if (!defined($$keys{$$csv_header[$i]}));
}
}
return 0;
}
return 1;
}
sub clean_up_row
{
my ($row) = @_;
for (my $i = 0; $i < @$row; $i++) {
# get rid of spaces at the end and at the beginning of each bloack
$$row[$i] =~ s/^\s+//g;
$$row[$i] =~ s/\s+$//g;
# convert all half width Katakan to Full width Katakana
$$row[$i] = Unicode::Japanese->new($$row[$i])->h2zKana->get;
# need to decode the converted string, somehow Unicode::Japanese does not return proper utf8 if use utf8 is on
utf8::decode($$row[$i]);
}
return @$row;
}
sub set_int_fields
{
my ($row, $keys, $int_fields) = @_;
# check ALL smallint/int/etc rows to be set to a number
for (my $i = 0; $i < @$int_fields; $i++) {
print "\t\tCheck ".$$int_fields[$i]." {".$$keys{$$int_fields[$i]}."} ... " if ($::verbose > 1);
if (!$$row[$$keys{$$int_fields[$i]}]) {
$$row[$$keys{$$int_fields[$i]}] = 0;
}
# if its filled, but not a digit, set to 1
if ($$row[$$keys{$$int_fields[$i]}] =~ /\D/) {
$$row[$$keys{$$int_fields[$i]}] = 1;
}
print "[".$$row[$$keys{$$int_fields[$i]}]."] [DONE]\n" if ($::verbose > 1);
}
return @$row;
}
# formats a number with dots and ,
sub format_number
{
my ($number) = @_;
# dummy, does nothing now
# should put . or , every 3 digits later
return $number;
}
# converts bytes to human readable format
sub convert_number
{
my ($number) = @_;
my $pos; # the original position in the labels array
# divied number until its division would be < 1024. count that position for label usage
for ($pos = 0; $number > 1024; $pos ++) {
$number = $number / 1024;
}
# before we return it, we format it [rounded to 2 digits, if has decimals, else just int]
# we add the right label to it and return
return sprintf(!$pos ? '%d' : '%.2f', $number)." ".qw(B KB MB GB TB PB EB)[$pos];
}
# make time from seconds string
sub convert_time
{
my ($timestamp, $show_micro) = @_;
my $ms = '';
# cut of the ms, but first round them up to four
$timestamp = sprintf("%.4f", $timestamp);
# print "T: ".$timestamp."\n";
($timestamp, $ms) = split(/\./, $timestamp);
my @timegroups = ("86400", "3600", "60", "1");
my @output = ();
for (my $i = 0; $i < @timegroups; $i ++) {
push(@output, floor($timestamp / $timegroups[$i]));
$timestamp = $timestamp % $timegroups[$i];
}
# output has days|hours|min|sec
return (($output[0]) ? $output[0]."d " : "").
(($output[1] || $output[0]) ? $output[1]."h " : "").
(($output[2] ||$output[1] || $output[0]) ? $output[2]."m " : "").
$output[3]."s".
(($show_micro) ? " ".((!$ms) ? 0 : $ms)."ms" : "");
}
# get a timestamp and create a proper formated date/time field
sub create_time
{
my ($timestamp, $show_micro) = @_;
my $ms = '';
$timestamp = 0 if (!$timestamp);
# round ms to 4 numbers
$timestamp = sprintf("%.4f", $timestamp);
($timestamp, $ms) = split(/\./, $timestamp);
# array for time
my ($sec, $min, $hour, $day, $month, $year, $wday, $yday, $isdst) = localtime($timestamp);
# year, month fix
$year += 1900;
$month += 1;
# string for return
return $year."-".
($month < 10 ? '0'.$month : $month)."-".
($day < 10 ? '0'.$day : $day)." ".
($hour < 10 ? '0'.$hour : $hour).":".
($min < 10 ? '0'.$min : $min).":".
($sec < 10 ? '0'.$sec : $sec).
(($ms && $show_micro) ? ".".$ms : "");
}
# create YYYYMMDD data
sub create_date
{
my ($timestamp, $split_string) = @_;
my $split = $split_string ? $split_string : '';
$timestamp = time() if (!$timestamp);
# array for time
my ($sec, $min, $hour, $day, $month, $year, $wday, $yday, $isdst) = localtime($timestamp);
# year, month fix
$year += 1900;
$month += 1;
# string for return
return $year.$split.
($month < 10 ? '0'.$month : $month).$split.
($day < 10 ? '0'.$day : $day);
}
# create YYYYMMDD_HHMMSS data
sub create_datetime
{
my ($timestamp, $split_string) = @_;
my $split = $split_string ? $split_string : '';
$timestamp = time() if (!$timestamp);
# array for time
my ($sec, $min, $hour, $day, $month, $year, $wday, $yday, $isdst) = localtime($timestamp);
# year, month fix
$year += 1900;
$month += 1;
# string for return
return $year.$split.
($month < 10 ? '0'.$month : $month).$split.
($day < 10 ? '0'.$day : $day).'_'.
($hour < 10 ? '0'.$hour : $hour).$split.
($min < 10 ? '0'.$min : $min).$split.
($sec < 10 ? '0'.$sec : $sec);
}
sub left_fill
{
my($number, $size, $char) = @_;
return sprintf($char x ($size - length($number)).$number);
}
# wrapper to flip the crc32 hex string, so it is like buggy php one (php <= 5.2.6)
sub crc32b_fix
{
my ($crc) = @_;
# left pad with 0 to 8 chars
$crc = ('0' x (8 - length($crc))).$crc;
# flip two chars (byte hex)
$crc =~ s/^([a-z0-9]{2})([a-z0-9]{2})([a-z0-9]{2})([a-z0-9]{2})$/$4$3$2$1/;
return $crc;
}
# short sha1 (9 char) function
sub sha1_short
{
my ($string) = @_;
return substr(sha1_hex($string), 0, 9);
}
# DEBUG helpers for dumping data
# from: http://www.perlmonks.org/?node_id=390153
# alternative use Dump::Dumper and print Dump(VAR);
sub dump_data
{
my ($level, $base, $data) = @_;
my $nextlevel = $level + 1;
if (ref($data) eq 'ARRAY') {
foreach my $k (0 .. $#{$data}) {
my $baseval = $base.'['.$k.']';
dump_it($nextlevel, $baseval, $data->[$k]);
}
} elsif (ref($data) eq 'HASH') {
foreach my $k (sort(keys(%{$data}))) {
my $baseval = $base.'{'.$k.'}';
dump_it($nextlevel, $baseval, $data->{$k});
}
} elsif (ref($data) eq 'SCALAR') {
my $baseval = $base;
dump_it($nextlevel, $baseval, ${$data});
}
}
sub dump_it
{
my ($nextlevel, $baseval, $datum) = @_;
my $reftype = ref($datum);
if ($reftype eq 'HASH') {
dump_data($nextlevel, $baseval, \%{$datum});
} elsif ($reftype eq 'ARRAY') {
dump_data($nextlevel, $baseval, \@{$datum});
} else {
process_data($nextlevel, $baseval, $datum);
}
}
sub process_data
{
my ($nextlevel, $baseval, $datum) = @_;
my $indentation = ' ' x $nextlevel;
print $indentation, $baseval, ' = ', $datum, "\n";
}
# METHOD: lock_run
# PARAMS: file (plus path) to lock to
# the current running pid (if not given will be set in script)
# the current name of the script (auto set if not given)
# optional write encoding (set to utf8 if not given)
# RETURN: nothing
# DESC: checks if this script is already running based on the lock file, if if yes will abort
# if file is there but pid not find it automatically cleans up the stale lock file
sub lock_run
{
my ($file, $run_pid, $name, $encoding) = @_;
# if no encoding, set utf8
$encoding = 'utf8' if (!$encoding);
# set the run pid if no pid is given
$run_pid = $$ if (!$run_pid);
# set the script base name
$name = File::Basename::fileparse($0) if (!$name);
# if lock file exists
if (-f $file) {
my $exists = 0;
my $pid = `cat $file`;
chomp($pid);
# printDebug("Lock file found for $pid", 1);
# check if process excists with this pid
# better todo A for ALL processes
# ps axu OR short ps a
open(PS, 'ps axu|') || die("$!");
while (<PS>) {
# search for pid and run file name
if ($_ =~ /\ $pid\ / && $_ =~ /$name/) {
$exists = 1;
}
last if ($exists);
}
close(PS);
if (!$exists) {
# printDebug("Lock file cleaned up for $pid", 1);
unlink($file);
} else {
die("Script is already running with PID $pid\n");
}
}
# write current PID into lock file
open(FP, '>:encoding('.$encoding.')', $file) || die ("Cannot open run lock file '$file' for writing\n");
print FP $run_pid;
close(FP);
}
# METHOD: printDebug
# PARAMS: message, verbose level
# RETURN: nothing
# DESC: depeding on the verbose and debug settings it will print out message and or write it to a debug file
sub printDebug
{
my($msg, $vrb, $dbg) = @_;
# print debug only if debug is on and debug file is available
print $::DEBUG '['.create_time(time(), 1).'] '.$msg."\n" if ($::debug && $::DEBUG);
# print to log if log is accessable and the verbose flag matches, or for debug flag if debug statement is set and not log only, or if log only, if not debug statement
print $::LOG $msg."\n" if (($::verbose >= $vrb || (!$::log_only && $dbg && $::debug) || ($::log_only && !$dbg)) && $::LOG);
# print to screen if verbose matches, but it is not a log only, or if it is debug statement and debug flag is set
print $msg."\n" if (($::verbose >= $vrb && !$::log_only) || ($dbg && $::debug));
}
# METHOD: waitAbort
# PARAMS: time in seconds, if not provided set to 5
# RETURN: nothing
# DESC: simple prints out a char while waiting for an abort command
sub waitAbort
{
my($sleep) = @_;
$sleep = 5 if ($sleep !~ /\d/);
print "Waiting $sleep seconds (Press CTRL + C to abort)\n";
for (my $i = 1; $i <= $sleep; $i ++) {
print ".";
sleep 1;
}
print "\n\n";
}
# METHOD: copyToTemporary
# PARAMS: file to copy, and target file name
# RETURN: the target file name
# DESC : sets the source to read only and makes a copy, the copy is also set to read only
sub copyToTemporary
{
my ($source, $target) = @_;
# get the current rights
my $current_chmod = (stat $source)[2];
# set source file ARGV to read only
# we skip that, the source might be NOT from the same user as the script read, just copy the file and set the target read only
chmod(0444, $source);
# create tmp backup file from which we read, data gets removed at the end of an run, or during an abort call
copy($source, $target) || die("Copy failed: $!\n");
# set read rights to r only for the copied file
chmod(0444, $target);
# set old access rights for ARGV file
chmod($current_chmod, $source);
# return target file name
return $target;
}
# METHOD: uniq
# PARAMS: @array
# RETURN: array with only unique entries
# DESC : used in uniq(@array) to get only unique data back
sub uniq
{
my %seen;
grep !$seen{$_}++, @_;
}
# METHOD: clean_test
# PARAMS: array of data
# RETURN: cleaned up array of data
# DESC : sets all undefs to '' for debug output
sub clean_test
{
my (@data) = @_;
# map check for defined, if not, return ''
return map { defined($_) ? $_ : '' } @data;
}
# METHOD: clean_test_string
# PARAMS: string to be checked
# RETURN: data or empty for output
# DESC : sets all input data to '' if it is undefined
sub clean_test_string
{
my ($data) = @_;
return defined($data) ? $data : '';
}
1;

6
phpstan-bootstrap.php Executable file
View File

@@ -0,0 +1,6 @@
<?php
// Boostrap file for PHPstand
// sets the _SERVER['HTTP_HOST'] var so we can have DB detection
$_SERVER['HTTP_HOST'] = 'soba.tokyo.tequila.jp';
// __END__

55
phpstan.neon Normal file
View File

@@ -0,0 +1,55 @@
# PHP Stan Config
parameters:
tmpDir: /tmp/phpstan-corelibs
level: 1
paths:
- %currentWorkingDirectory%/www
#bootstrap: %currentWorkingDirectory%/phpstan-bootstrap.php
#bootstrap: phpstan-bootstrap.php
autoload_directories:
autoload_files:
- %currentWorkingDirectory%/phpstan-bootstrap.php
- www/configs/config.master.php
- www/lib/autoloader.php
- www/vendor/autoload.php
excludes_analyse:
# no check admin
- www/admin/qq_file_upload_front.php
- www/admin/qq_file_upload_ajax.php
# admin synlink files
- www/admin/edit_access.php
- www/admin/edit_groups.php
- www/admin/edit_languages.php
- www/admin/edit_menu_group.php
- www/admin/edit_order.php
- www/admin/edit_pages.php
- www/admin/edit_schemes.php
- www/admin/edit_users.php
- www/admin/edit_visible_group.php
# ignore admin header stuff
- www/includes/admin_header.php # ignore the admin include stuff
- www/includes/admin_footer.php # ignore the admin include stuff
- www/includes/admin_set_paths.php # ignore the admin include stuff
- www/includes/admin_smarty.php # ignore the admin include stuff
# folders with data no check needed
- www/templates_c
- www/cache
- www/log
- www/media
- www/tmp
- www/lib/pChart
- www/lib/pChart2.1.4
- www/lib/Smarty/
- www/lib/smarty-3.1.30/
# ignore composer
- www/vendor
# ignore errores with
# ignoreErrors:
#- 'error regex'
#-
# message: 'error regex'
# path: %currentWorkingDirectory%/www/some/*
# paths:
# - ...
# - ...

9
static_checkers.txt Normal file
View File

@@ -0,0 +1,9 @@
# main static checker
phan --progress-bar -C -o 4dev/tmp/analysis.txt
# sub static checker
phpstan analyse -c phpstan.neon --memory-limit=4G -l 0 www
# only if we work with composer only
www/: psalm (this needs the composer autoloader defined)
# for linting
parallel-lint www/

View File

@@ -1,4 +1,7 @@
<?php declare(strict_types=1); <?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_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1; $DEBUG_ALL = 1;
@@ -14,36 +17,41 @@ ob_start();
// basic class test file // basic class test file
define('USE_DATABASE', true); define('USE_DATABASE', true);
// sample config // sample config
// require("config.inc");
require 'config.php'; require 'config.php';
// set session name // set session name
if (!defined('SET_SESSION_NAME')) { if (!defined('SET_SESSION_NAME')) {
DEFINE('SET_SESSION_NAME', EDIT_SESSION_NAME); define('SET_SESSION_NAME', EDIT_SESSION_NAME);
} }
// define log file id // define log file id
DEFINE('LOG_FILE_ID', 'classTest'); $LOG_FILE_ID = 'classTest';
// set language for l10n
$lang = 'en_utf8';
// init login & backend class // init login & backend class
$login = new CoreLibs\ACL\Login($DB_CONFIG[LOGIN_DB], $lang); $login = new CoreLibs\ACL\Login(DB_CONFIG);
$basic = new CoreLibs\Admin\Backend($DB_CONFIG[MAIN_DB], $lang); $basic = new CoreLibs\Admin\Backend(DB_CONFIG);
$basic->dbInfo(1); $basic->dbInfo(true);
ob_end_flush(); ob_end_flush();
echo "DB_CONFIG_SET constant: <pre>".print_r(DB_CONFIG, true)."</pre><br>";
$basic->hrRunningTime(); $basic->hrRunningTime();
$basic->runningTime(); $basic->runningTime();
echo "RANDOM KEY [50]: ".$basic->randomKeyGen(50)."<br>"; echo "RANDOM KEY [50]: ".$basic->randomKeyGen(50)."<br>";
echo "TIMED [hr]: ".$basic->hrRunningTime()."<br>"; echo "TIMED [hr]: ".$basic->hrRunningTime()."<br>";
echo "TIMED [def]: ".$basic->runningTime()."<br>"; echo "TIMED [def]: ".$basic->runningTime()."<br>";
echo "TIMED [string]: ".$basic->runningtime_string."<br>";
$basic->hrRunningTime(); $basic->hrRunningTime();
echo "RANDOM KEY [default]: ".$basic->randomKeyGen()."<br>"; echo "RANDOM KEY [default]: ".$basic->randomKeyGen()."<br>";
echo "TIMED: ".$basic->hrRunningTime()."<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>";
// set + check edit access id // set + check edit access id
$edit_access_id = 3; $edit_access_id = 3;
if (isset($login) && is_object($login) && isset($login->acl['unit'])) { if (is_object($login) && isset($login->acl['unit'])) {
print "ACL UNIT: ".print_r(array_keys($login->acl['unit']), true)."<br>"; print "ACL UNIT: ".print_r(array_keys($login->acl['unit']), true)."<br>";
print "ACCESS CHECK: ".$login->loginCheckEditAccess($edit_access_id)."<br>"; print "ACCESS CHECK: ".(string)$login->loginCheckEditAccess($edit_access_id)."<br>";
if ($login->loginCheckEditAccess($edit_access_id)) { if ($login->loginCheckEditAccess($edit_access_id)) {
$basic->edit_access_id = $edit_access_id; $basic->edit_access_id = $edit_access_id;
} else { } else {
@@ -77,7 +85,7 @@ print "CALLER BACKTRACE: ".$basic->getCallerMethod()."<br>";
$basic->debug('SOME MARK', 'Some error output'); $basic->debug('SOME MARK', 'Some error output');
print "EDIT ACCESS ID: ".$basic->edit_access_id."<br>"; print "EDIT ACCESS ID: ".$basic->edit_access_id."<br>";
if (isset($login)) { if (is_object($login)) {
// print "ACL: <br>".$basic->print_ar($login->acl)."<br>"; // print "ACL: <br>".$basic->print_ar($login->acl)."<br>";
$basic->debug('ACL', "ACL: ".$basic->printAr($login->acl)); $basic->debug('ACL', "ACL: ".$basic->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>";
@@ -91,9 +99,13 @@ if (isset($login)) {
// DB client encoding // DB client encoding
print "DB Client encoding: ".$basic->dbGetEncoding()."<br>"; print "DB Client encoding: ".$basic->dbGetEncoding()."<br>";
while ($res = $basic->dbReturn("SELECT * FROM max_test")) { while ($res = $basic->dbReturn("SELECT * FROM max_test", 0, true)) {
print "TIME: ".$res['time']."<br>"; 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>";
}
$status = $basic->dbExec("INSERT INTO foo (test) VALUES ('FOO TEST ".time()."') RETURNING test"); $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 STATUS: $status | PRIMARY KEY: ".$basic->insert_id." | PRIMARY KEY EXT: ".print_r($basic->insert_id_ext, true)."<br>";
@@ -117,20 +129,20 @@ print "UPDATE STATUS: $status | RETURNING EXT: ".print_r($basic->insert_id_ext,
$table = 'foo'; $table = 'foo';
print "TABLE META DATA: ".$basic->printAr($basic->dbShowTableMetaData($table))."<br>"; print "TABLE META DATA: ".$basic->printAr($basic->dbShowTableMetaData($table))."<br>";
$primary_key = ''; # unset $primary_key = ''; # unset
$db_write_table = array ('test', 'string_a', 'number_a', 'some_bool'); $db_write_table = array('test', 'string_a', 'number_a', 'some_bool');
// $db_write_table = array ('test'); // $db_write_table = array('test');
$object_fields_not_touch = array (); $object_fields_not_touch = array();
$object_fields_not_update = array (); $object_fields_not_update = array();
$data = array ('test' => 'BOOL TEST SOMETHING '.time(), 'string_a' => 'SOME TEXT', 'number_a' => 5); $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); $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>"; 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); $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); $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>"; 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); $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); $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>"; print "Wrote to DB tabel $table and got primary key $primary_key<br>";
$data = array ('test' => 'BOOL TEST UNSET '.time()); $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); $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>"; print "Wrote to DB tabel $table and got primary key $primary_key<br>";
@@ -212,6 +224,13 @@ if (round($timestamp, 4) == $basic->stringToTime($time_string)) {
} else { } else {
print "REVERSE TRIME STRING DO NOT MATCH<br>"; 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 // magic links test
print $basic->magicLinks('user@bubu.at').'<br>'; print $basic->magicLinks('user@bubu.at').'<br>';
@@ -222,8 +241,101 @@ $date_1 = '2017/1/5';
$date_2 = '2017-01-05'; $date_2 = '2017-01-05';
print "COMPARE DATE: ".$basic->compareDate($date_1, $date_2)."<br>"; 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'
)
)
);
// array re 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>";
}
// print error messages // print error messages
// print $login->printErrorMsg(); // print $login->printErrorMsg();

View File

@@ -1 +1 @@
../includes/edit_base.inc ../includes/edit_base.php

View File

@@ -1 +1 @@
../includes/edit_base.inc ../includes/edit_base.php

View File

@@ -1 +1 @@
../includes/edit_base.inc ../includes/edit_base.php

View File

@@ -1 +1 @@
../includes/edit_base.inc ../includes/edit_base.php

View File

@@ -1 +1 @@
../includes/edit_base.inc ../includes/edit_base.php

View File

@@ -1 +1 @@
../includes/edit_base.inc ../includes/edit_base.php

View File

@@ -1 +1 @@
../includes/edit_base.inc ../includes/edit_base.php

View File

@@ -1 +1 @@
../includes/edit_base.inc ../includes/edit_base.php

View File

@@ -1 +1 @@
../includes/edit_base.inc ../includes/edit_base.php

View File

@@ -11,8 +11,8 @@ if ($DEBUG_ALL) {
// sample config // sample config
require 'config.php'; require 'config.php';
echo "FILE: ".BASE.LIB."Error.Handling.inc<br>"; echo "FILE: ".BASE.LIB."Error.Handling.php<br>";
require(BASE.LIB."Error.Handling.inc"); require(BASE.LIB."Error.Handling.php");
if ($var) { if ($var) {
echo "OUT<br>"; echo "OUT<br>";

View File

@@ -5,13 +5,25 @@
// namespace test // namespace test
ob_start(); ob_start();
// init language
$lang = 'en_utf8'; $lang = 'en_utf8';
// admin class tests // admin class tests
require 'config.php'; require 'config.php';
$l = new CoreLibs\Language\L10n($lang); $l = new CoreLibs\Language\L10n($lang);
echo "OK<br>";
ob_end_flush(); ob_end_flush();
$string = 'INPUT TEST';
echo "LANGUAGE SET: ".$l->__getLang()."<br>";
echo "LANGUAGE FILE: ".$l->__getMoFile()."<br>";
echo "INPUT TEST: ".$string." => ".$l->__($string)."<br>";
// switch to other language
$lang = 'ja_utf8';
$l->l10nReloadMOfile($lang);
echo "LANGUAGE SET: ".$l->__getLang()."<br>";
echo "LANGUAGE FILE: ".$l->__getMoFile()."<br>";
echo "INPUT TEST: ".$string." => ".$l->__($string)."<br>";
// __END__ // __END__

View File

@@ -1,7 +1,5 @@
<?php declare(strict_types=1); <?php declare(strict_types=1);
declare(strict_types=1);
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations $DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1; $DEBUG_ALL = 1;
$PRINT_ALL = 1; $PRINT_ALL = 1;
@@ -12,30 +10,32 @@ ob_start();
// admin class tests // admin class tests
require 'config.php'; require 'config.php';
DEFINE('SET_SESSION_NAME', EDIT_SESSION_NAME); $SET_SESSION_NAME = EDIT_SESSION_NAME;
echo "DIR: ".DIR."<br>ROOT: ".ROOT."<br>BASE: ".BASE."<br>"; echo "DIR: ".DIR."<br>ROOT: ".ROOT."<br>BASE: ".BASE."<br>";
$lang = 'ja_utf8'; $base = new CoreLibs\Admin\Backend(DB_CONFIG);
$base = new CoreLibs\Admin\Backend($DB_CONFIG[MAIN_DB], $lang);
ob_end_flush(); ob_end_flush();
if ($base->getConnectionStatus()) {
die("Cannot connect to database");
}
print "Start time: ".$base->runningTime()."<br>"; print "Start time: ".$base->runningTime()."<br>";
print "ByteStringFormat: ".$base->ByteStringFormat(1234567.12)."<br>"; print "HumanReadableByteFormat: ".$base->HumanReadableByteFormat(1234567.12)."<br>";
print "byteStringFormat: ".$base->byteStringFormat(1234567.12)."<br>"; print "humanReadableByteFormat: ".$base->humanReadableByteFormat(1234567.12)."<br>";
print "get_page_name [DEPRECATED]: ".$base->get_page_name()."<br>"; // print "get_page_name [DEPRECATED]: ".$base->get_page_name()."<br>";
print "getPageName: ".$base->getPageName()."<br>"; print "getPageName: ".$base->getPageName()."<br>";
print "DB Info: ".$base->dbInfo(1)."<br>"; print "DB Info: ".$base->dbInfo(true)."<br>";
print "End Time: ".$base->runningTime()."<br>"; print "End Time: ".$base->runningTime()."<br>";
print "Run Time: ".$base->runningTime()."<br>"; print "Start Time: ".$base->runningTime()."<br>";
$base->resetRunningtime();
print "Lang: ".$base->l->__getLang().", MO File: ".$base->l->__getMoFile()."<br>"; print "Lang: ".$base->l->__getLang().", MO File: ".$base->l->__getMoFile()."<br>";
print "Translate test: Year -> ".$base->l->__('Year')."<br>"; print "Translate test: Year -> ".$base->l->__('Year')."<br>";
print "End Time: ".$base->runningTime()."<br>";
// end error print // end error print
print $base->printErrorMsg(); print $base->printErrorMsg();

View File

@@ -21,3 +21,14 @@ class FooBar
echo "B: $wrong<br>"; echo "B: $wrong<br>";
} }
} }
$foo = $bar ?? 'EMPTY';
echo "BAR: ".$foo."<br>";
// define('DS', DIRECTORY_SEPARATOR);
$ds = defined('DS') ? DS : DIRECTORY_SEPARATOR;
$du = DS ?? DIRECTORY_SEPARATOR;
echo "DS is: ".$ds."<br>";
echo "SERVER HOST: ".$_SERVER['HTTP_HOST']."<br>";
// __END__

View File

@@ -16,7 +16,7 @@ $MAX_UPLOAD_SIZE = $base->StringByteFormat(ini_get('upload_max_filesize'));
$allowedExtensions = array ('csv', 'zip', 'jpg', 'pdf', 'bz2'); $allowedExtensions = array ('csv', 'zip', 'jpg', 'pdf', 'bz2');
$sizeLimit = $MAX_UPLOAD_SIZE; // as set in php ini $sizeLimit = $MAX_UPLOAD_SIZE; // as set in php ini
$base->debug('AJAX UPLOAD', 'Size: '.$sizeLimit.', Memory Limit: '.ini_get('memory_limit')); $base->debug('AJAX UPLOAD', 'Size: '.$sizeLimit.', Memory Limit: '.ini_get('memory_limit'));
$uploader = new CoreLibs\Upload\qqFileUploader($allowedExtensions, $sizeLimit); $uploader = new FileUpload\qqFileUploader($allowedExtensions, $sizeLimit);
// either in post or get // either in post or get
$_action= $_POST['action'] ? $_POST['action'] : $_GET['action']; $_action= $_POST['action'] ? $_POST['action'] : $_GET['action'];
$_task_uid = $_POST['task_uid'] ? $_POST['task_uid'] : $_GET['task_uid']; $_task_uid = $_POST['task_uid'] ? $_POST['task_uid'] : $_GET['task_uid'];

View File

@@ -9,25 +9,29 @@ $LOG_PER_RUN = 1;
define('USE_DATABASE', true); define('USE_DATABASE', true);
define('USE_HEADER', true); define('USE_HEADER', true);
require 'config.php'; require 'config.php';
require BASE.INCLUDES.'admin_header.inc'; require BASE.INCLUDES.'admin_header.php';
$MASTER_TEMPLATE_NAME = 'main_body.tpl'; if (is_object($smarty)) {
$TEMPLATE_NAME = 'smarty_test.tpl'; $smarty->MASTER_TEMPLATE_NAME = 'main_body.tpl';
$CSS_NAME = 'smart_test.css'; $smarty->TEMPLATE_NAME = 'smarty_test.tpl';
$USE_PROTOTYPE = false; $smarty->CSS_SPECIAL_TEMPLATE_NAME = 'smart_test.css';
$USE_JQUERY = true; $smarty->USE_PROTOTYPE = false;
$JS_DATEPICKR = false; $smarty->USE_JQUERY = true;
if ($USE_PROTOTYPE) { $smarty->JS_DATEPICKR = false;
$ADMIN_JAVASCRIPT = 'edit.pt.js'; if ($smarty->USE_PROTOTYPE) {
$JS_NAME = 'prototype.test.js'; $smarty->ADMIN_JAVASCRIPT = 'edit.pt.js';
} elseif ($USE_JQUERY) { $smarty->JS_SPECIAL_TEMPLATE_NAME = 'prototype.test.js';
$ADMIN_JAVASCRIPT = 'edit.jq.js'; } elseif ($smarty->USE_JQUERY) {
$JS_NAME = 'jquery.test.js'; $smarty->ADMIN_JAVASCRIPT = 'edit.jq.js';
} $smarty->JS_SPECIAL_TEMPLATE_NAME = 'jquery.test.js';
$PAGE_WIDTH = "100%"; }
require BASE.INCLUDES.'admin_set_paths.inc'; $smarty->PAGE_WIDTH = '100%';
// require BASE.INCLUDES.'admin_set_paths.php';
$smarty->setSmartyPaths();
// smarty test // smarty test
$cms->DATA['SMARTY_TEST'] = 'Test Data'; $smarty->DATA['SMARTY_TEST'] = 'Test Data';
$smarty->DATA['TRANSLATE_TEST'] = $cms->l->__('Are we translated?');
}
// drop down test with optgroups // drop down test with optgroups
$options = array ( $options = array (
@@ -46,7 +50,9 @@ $options = array (
) )
); );
$cms->DATA['drop_down_test'] = $options; if (is_object($smarty)) {
$smarty->DATA['drop_down_test'] = $options;
require BASE.INCLUDES.'admin_smarty.inc'; // require BASE.INCLUDES.'admin_smarty.php';
require BASE.INCLUDES.'admin_footer.inc'; $smarty->setSmartyVarsAdmin();
}
require BASE.INCLUDES.'admin_footer.php';

View File

@@ -1,4 +1,9 @@
<?php <?php
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
namespace CoreLibs;
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations $DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1; $DEBUG_ALL = 1;
@@ -6,16 +11,15 @@ $PRINT_ALL = 1;
$DB_DEBUG = 1; $DB_DEBUG = 1;
// admin class tests // admin class tests
// require 'config.inc';
require 'config.php'; require 'config.php';
DEFINE('SET_SESSION_NAME', EDIT_SESSION_NAME); $SET_SESSION_NAME = EDIT_SESSION_NAME;
$base = new CoreLibs\Basic(); $base = new Basic();
print "THIS HOST: ".HOST_NAME.", with PROTOCOL: ".HOST_PROTOCOL." is running SSL: ".HOST_SSL."<br>"; print "THIS HOST: ".HOST_NAME.", with PROTOCOL: ".HOST_PROTOCOL." is running SSL: ".HOST_SSL."<br>";
print "DIR: ".DIR."<br>"; print "DIR: ".DIR."<br>";
print "BASE: ".BASE."<br>"; print "BASE: ".BASE."<br>";
print "ROOT: ".ROOT."<br>"; print "ROOT: ".ROOT."<br>";
print "HOST: ".$HOST_NAME." => DB HOST: ".$DB_HOST[$HOST_NAME]." => ".MAIN_DB."<br>"; print "HOST: ".HOST_NAME." => DB HOST: ".DB_CONFIG_NAME." => ".print_r(DB_CONFIG, true)."<br>";
$text = 'I am some text $text = 'I am some text
with some with some
@@ -43,7 +47,7 @@ print "LB remove: ".$base->removeLB($text, '##BR##')."<br>";
// ) // )
// ); // );
$base->debug('ARRAY', $base->printAr($test)); // $base->debug('ARRAY', $base->printAr($test));
function rec($pre, $cur, $node = array ()) function rec($pre, $cur, $node = array ())
{ {
@@ -82,6 +86,7 @@ function flattenArrayKey(array $array, array $return = array ())
return $return; return $return;
} }
$test = array ();
// core // core
$test = rec('', 'A', $test); $test = rec('', 'A', $test);
$test = rec('', '1', $test); $test = rec('', '1', $test);

12
www/composer.json Normal file
View File

@@ -0,0 +1,12 @@
{
"name": "gullevek/www",
"description": "CoreLibs",
"type": "library",
"authors": [
{
"name": "Clemens Schwaighofer",
"email": "clemens.schwaighofer@egplusww.com"
}
],
"require": {}
}

Binary file not shown.

View File

@@ -1,4 +1,4 @@
<?php <?php declare(strict_types=1);
/******************************************************************** /********************************************************************
* AUTHOR: Clemens Schwaighofer * AUTHOR: Clemens Schwaighofer
* CREATED: 2018/10/11 * CREATED: 2018/10/11
@@ -8,13 +8,13 @@
*********************************************************************/ *********************************************************************/
// please be VERY carefull only to change the right side // please be VERY carefull only to change the right side
$DB_CONFIG = array ( $DB_CONFIG = array(
'test' => array ( 'test' => array(
'db_name' => 'gullevek', 'db_name' => 'gullevek',
'db_user' => 'gullevek', 'db_user' => 'gullevek',
'db_pass' => 'gullevek', 'db_pass' => 'gullevek',
'db_host' => 'db.tokyo.tequila.jp', 'db_host' => 'db.tokyo.tequila.jp',
'db_port' => '5432', 'db_port' => 5432,
'db_schema' => 'public', 'db_schema' => 'public',
'db_type' => 'pgsql', 'db_type' => 'pgsql',
'db_encoding' => '', 'db_encoding' => '',

View File

@@ -1,33 +0,0 @@
<?php
/********************************************************************
* AUTHOR: Clemens Schwaighofer
* CREATED: 2018/10/11
* SHORT DESCRIPTION:
* configuration file for core host settings
* - DB access name (array group from config.db)
* - location (test/stage/live)
* - debug flag (true/false)
* - DB path (eg PUBLIC_SCHEMA)
* - stie lang
* HISTORY:
*********************************************************************/
// each host has a different db_host
// development host
$DB_HOST['soba.tokyo.tequila.jp'] = 'test';
// target host (live)
// $DB_TARGET_HOST['soba'] = '<DB ID>';
// url redirect database
// $DB_URL_REDIRECT_HOST['soba'] = '<DB ID>';
// location flagging
// test/dev/live
$LOCATION['soba.tokyo.tequila.jp'] = 'test';
// show DEBUG override
// true/false
$DEBUG_FLAG['soba.tokyo.tequila.jp'] = true;
// set postgresql paths (schemas)
$DB_PATH['soba.tokyo.tequila.jp'] = PUBLIC_SCHEMA;
// site language
$SITE_LANG['soba.tokyo.tequila.jp'] = 'en_utf8';
// __END__

44
www/configs/config.host.php Executable file
View File

@@ -0,0 +1,44 @@
<?php declare(strict_types=1);
/********************************************************************
* AUTHOR: Clemens Schwaighofer
* CREATED: 2018/10/11
* SHORT DESCRIPTION:
* configuration file for core host settings
* - DB access name (array group from config.db)
* - location (test/stage/live)
* - debug flag (true/false)
* - site lang
* HISTORY:
*********************************************************************/
// other master config to attach
// $__LOCAL_CONFIG = array(
// 'db_host' => '',
// 'location' => '',
// 'debug_flag' => true,
// 'site_lang' => 'en_utf8',
// 'login_enabled' => true
// );
// each host has a different db_host
$SITE_CONFIG = array(
// development host
'soba.tokyo.tequila.jp' => array(
// db config selection
'db_host' => 'test',
// other db connections
// 'db_host_target' => '',
// 'db_host_other' => '',
// location flagging (test/dev/live) for debug output
'location' => 'test',
// show DEBUG override
'debug_flag' => true,
// site language
'site_lang' => 'en_utf8',
// enable/disable login override
'login_enabled' => true
),
// 'other.host.com' => $__LOCAL_CONFIG
);
// __END__

View File

@@ -1,271 +0,0 @@
<?php
/********************************************************************
* AUTHOR: Clemens Schwaighofer
* CREATED: 2003/06/10
* SHORT DESCRIPTION:
* configuration file
* HISTORY:
*********************************************************************/
/************* PATHS *********************/
// directory seperator
DEFINE('DS', DIRECTORY_SEPARATOR);
// ** NEW/BETTER DIR DECLARATIONS **
// path to original file (if symlink)
DEFINE('DIR', __DIR__.DS);
// base dir root folder level
DEFINE('BASE', str_replace('/configs', '', __DIR__).DS);
// ** OLD DIR DECLARATIONS **
// path to document root of file called
DEFINE('ROOT', getcwd().DS);
// libs path
DEFINE('LIB', 'lib'.DS);
DEFINE('LIBS', 'lib'.DS);
// configs folder
DEFINE('CONFIGS', 'configs'.DS);
// includes (strings, arrays for static, etc)
DEFINE('INCLUDES', 'includes'.DS);
// data folder (mostly in includes)
DEFINE('DATA', 'data'.DS);
// layout base path
DEFINE('LAYOUT', 'layout'.DS);
// pic-root (compatible to CMS)
DEFINE('PICTURES', 'images'.DS);
// images
DEFINE('IMAGES', 'images'.DS);
// icons (below the images/ folder)
DEFINE('ICONS', 'icons'.DS);
// media
DEFINE('MEDIA', 'media'.DS);
// flash-root (below media)
DEFINE('FLASH', 'flash'.DS);
// uploads (anything to keep)
DEFINE('UPLOADS', 'uploads'.DS);
// files (binaries) (below media)
DEFINE('BINARIES', 'binaries'.DS);
// files (videos) (below media)
DEFINE('VIDEOS', 'videos'.DS);
// files (documents) (below media)
DEFINE('DOCUMENTS', 'documents'.DS);
// files (pdfs) (below media)
DEFINE('PDFS', 'documents'.DS);
// CSV
DEFINE('CSV', 'csv'.DS);
// css
DEFINE('CSS', 'css'.DS);
// js
DEFINE('JS', 'javascript'.DS);
// table arrays
DEFINE('TABLE_ARRAYS', 'table_arrays'.DS);
// smarty libs path
DEFINE('SMARTY', 'Smarty'.DS);
// po langs
DEFINE('LANG', 'lang'.DS);
// cache path
DEFINE('CACHE', 'cache'.DS);
// temp path
DEFINE('TMP', 'tmp'.DS);
// log files
DEFINE('LOG', 'log'.DS);
// compiled template folder
DEFINE('TEMPLATES_C', 'templates_c'.DS);
// template base
DEFINE('TEMPLATES', 'templates'.DS);
/************* HASH / ACL DEFAULT / ERROR SETTINGS / SMARTY *************/
// default hash type
DEFINE('DEFAULT_HASH', 'sha256');
// default acl level
DEFINE('DEFAULT_ACL_LEVEL', 80);
// default levels for certain actions
/* DEFINE('DEFAULT_ACL_READ', 20);
DEFINE('DEFAULT_ACL_CONFIRM', 35);
DEFINE('DEFAULT_ACL_MOD', 40);
DEFINE('DEFAULT_ACL_WRITE', 60);
DEFINE('DEFAULT_ACL_SEND', 70);
DEFINE('DEFAULT_ACL_DEL', 80);
DEFINE('DEFAULT_ACL_ADMIN', 100); */
// SSL host name
// DEFINE('SSL_HOST', 'ssl.host.name');
// error page strictness, Default is 3
// 1: only show error page as the last mesure if really no mid & aid can be loaded and found at all
// 2: if template not found, do not search, show error template
// 3: if default template is not found, show error template, do not fall back to default tree
// 4: very strict, even on normal fixable errors through error
// DEFINE('ERROR_STRICT', 3);
// allow page caching in general, set to 'FALSE' if you do debugging or development!
// DEFINE('ALLOW_SMARTY_CACHE', FALSE);
// cache life time, in second', default here is 2 days (172800s)
// -1 is never expire cache
// DEFINE('SMARTY_CACHE_LIFETIME', -1);
/************* LOGOUT ********************/
// logout target
DEFINE('LOGOUT_TARGET', '');
// password change allowed
DEFINE('PASSWORD_CHANGE', false);
// min/max password length
DEFINE('PASSWORD_MIN_LENGTH', 8);
DEFINE('PASSWORD_MAX_LENGTH', 255);
/************* AJAX / ACCESS *************/
// ajax request type
DEFINE('AJAX_REQUEST_TYPE', 'POST');
// what AJAX type to use
DEFINE('USE_PROTOTYPE', true);
DEFINE('USE_SCRIPTACULOUS', false);
DEFINE('USE_JQUERY', false);
/************* LAYOUT WIDTHS *************/
DEFINE('PAGE_WIDTH', 800);
// the default template name
DEFINE('MASTER_TEMPLATE_NAME', 'main_body.tpl');
/************* SESSION NAMES *************/
// server name HASH
DEFINE('SERVER_NAME_HASH', hash('crc32b', $_SERVER['HTTP_HOST']));
// backend
DEFINE('EDIT_SESSION_NAME', 'ADMIN_SESSION_NAME'.SERVER_NAME_HASH);
// frontend
DEFINE('SESSION_NAME', 'SESSION_NAME'.SERVER_NAME_HASH);
// SET_SESSION_NAME should be set in the header if a special session name is needed
// DEFINE('SET_SESSION_NAME', SESSION_NAME);
/************* CACHE/COMPILE IDS *************/
DEFINE('CACHE_ID', 'CACHE_'.SERVER_NAME_HASH);
DEFINE('COMPILE_ID', 'COMPILE_'.SERVER_NAME_HASH);
/************* LANGUAGE / ENCODING *******/
DEFINE('DEFAULT_LANG', 'en_utf8');
// default web page encoding setting
DEFINE('DEFAULT_ENCODING', 'UTF-8');
// below two can be defined here, but they should be
// defined in either the header file or the file itself
/************* LOGGING *******************/
// DEFINE('LOG_FILE_ID', '');
/************* 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
// live_queue is a global queue system
// DEFINE('QUEUE', 'live_queue');
/************* DB PATHS (PostgreSQL) *****************/
// schema names, can also be defined per <DB INFO>
DEFINE('PUBLIC_SCHEMA', 'public');
DEFINE('DEV_SCHEMA', 'public');
DEFINE('TEST_SCHEMA', 'public');
DEFINE('LIVE_SCHEMA', 'public');
/************* DB ACCESS *****************/
if (file_exists(BASE.CONFIGS.'config.db.inc')) {
require BASE.CONFIGS.'config.db.inc';
}
/************* CORE HOST SETTINGS *****************/
if (file_exists(BASE.CONFIGS.'config.host.inc')) {
require BASE.CONFIGS.'config.host.inc';
}
/************* OTHER PATHS *****************/
if (file_exists(BASE.CONFIGS.'config.path.inc')) {
require BASE.CONFIGS.'config.path.inc';
}
// set the USE_DATABASE var, if there is nothing set, we assume TRUE
$USE_DATABASE = defined('USE_DATABASE') ? USE_DATABASE : true;
// live frontend pages
// ** missing live domains **
// get the name without the port
list($HOST_NAME) = array_pad(explode(':', $_SERVER['HTTP_HOST'], 2), 2, null);
if (!isset($DB_HOST[$HOST_NAME]) && $USE_DATABASE) {
echo 'No matching DB config found. Contact Admin<br>';
exit -1;
}
// set HOST name
DEFINE('HOST_NAME', $HOST_NAME);
// set SSL on
if ((array_key_exists('HTTPS', $_SERVER) && !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ||
$_SERVER['SERVER_PORT'] == 443) {
DEFINE('HOST_SSL', true);
DEFINE('HOST_PROTOCOL', 'https://');
} else {
DEFINE('HOST_SSL', false);
DEFINE('HOST_PROTOCOL', 'http://');
}
// define the static names
DEFINE('LOGIN_DB', $DB_HOST[$HOST_NAME]);
DEFINE('MAIN_DB', $DB_HOST[$HOST_NAME]);
DEFINE('DB_SCHEMA', $DB_PATH[$HOST_NAME]);
// DEFINE('TARGET_DB', $DB_TARGET_HOST[$HOST_NAME]);
// DEFINE('URL_REDIRECT_DB', $DB_URL_REDIRECT_HOST[$HOST_NAME]);
// next three if top is not set
// DEFINE('TEST_SCHEMA', $DB_CONFIG[MAIN_DB]['db_schema']);
// DEFINE('DEV_SCHEMA', $DB_CONFIG[MAIN_DB]['db_schema']);
// DEFINE('PUBLIC_SCHEMA', $DB_CONFIG[TARGET_DB]['db_schema']);
DEFINE('LOGIN_DB_SCHEMA', PUBLIC_SCHEMA); // where the edit* tables are
DEFINE('GLOBAL_DB_SCHEMA', PUBLIC_SCHEMA); // where global tables are that are used by all schemas (eg queue tables for online, etc)
DEFINE('TARGET', $LOCATION[$HOST_NAME]);
// DEFINE('CSV_PATH', $PATHS[TARGET]['csv_path']);
// DEFINE('EXPORT_SCRIPT', $PATHS[TARGET]['perl_bin']);
// DEFINE('REDIRECT_URL', $PATHS[TARGET]['redirect_url']);
DEFINE('DEBUG', $DEBUG_FLAG[$HOST_NAME]);
DEFINE('SITE_LANG', $SITE_LANG[$HOST_NAME]);
DEFINE('SHOW_ALL_ERRORS', true); // show all errors if debug_all & show_error_handling are enabled
/************* GENERAL PAGE TITLE ********/
DEFINE('G_TITLE', '<OVERALL FALLBACK PAGE TITLE>');
/************ STYLE SHEETS / JS **********/
DEFINE('ADMIN_STYLESHEET', 'edit.css');
DEFINE('ADMIN_JAVASCRIPT', 'edit.js');
DEFINE('STYLESHEET', 'frontend.css');
DEFINE('JAVASCRIPT', 'frontend.js');
// anything optional
/************* INTERNAL ******************/
// any other global definitons here
// DEFINE('SOME_ID', <SOME VALUE>);
/************* CONVERT *******************/
$paths = array (
'/bin',
'/usr/bin',
'/usr/local/bin'
);
// find convert
foreach ($paths as $path) {
if (file_exists($path.DS.'convert') && is_file($path.DS.'convert')) {
// image magick convert location
DEFINE('CONVERT', $path.DS.'convert');
}
}
// turn off debug if debug flag is OFF
if (defined('DEBUG') && DEBUG == false) {
$ECHO_ALL = 0;
$DEBUG_ALL = 0;
$PRINT_ALL = 0;
$DB_DEBUG = 0;
$ENABLE_ERROR_HANDLING = 0;
} else {
$ECHO_ALL = 0;
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
$ENABLE_ERROR_HANDLING = 0;
}
// read auto loader
require BASE.LIB.'autoloader.php';
// __END__

View File

@@ -0,0 +1,288 @@
<?php declare(strict_types=1);
/********************************************************************
* AUTHOR: Clemens Schwaighofer
* CREATED: 2003/06/10
* SHORT DESCRIPTION:
* configuration file
* HISTORY:
*********************************************************************/
/************* PATHS *********************/
// directory seperator
define('DS', DIRECTORY_SEPARATOR);
// ** NEW/BETTER DIR DECLARATIONS **
// path to original file (if symlink)
define('DIR', __DIR__.DS);
// base dir root folder level
define('BASE', str_replace('/configs', '', __DIR__).DS);
// ** OLD DIR DECLARATIONS **
// path to document root of file called
define('ROOT', getcwd().DS);
// libs path
define('LIB', 'lib'.DS);
define('LIBS', 'lib'.DS);
// configs folder
define('CONFIGS', 'configs'.DS);
// includes (strings, arrays for static, etc)
define('INCLUDES', 'includes'.DS);
// data folder (mostly in includes)
define('DATA', 'data'.DS);
// layout base path
define('LAYOUT', 'layout'.DS);
// pic-root (compatible to CMS)
define('PICTURES', 'images'.DS);
// images
define('IMAGES', 'images'.DS);
// icons (below the images/ folder)
define('ICONS', 'icons'.DS);
// media
define('MEDIA', 'media'.DS);
// flash-root (below media)
define('FLASH', 'flash'.DS);
// uploads (anything to keep)
define('UPLOADS', 'uploads'.DS);
// files (binaries) (below media)
define('BINARIES', 'binaries'.DS);
// files (videos) (below media)
define('VIDEOS', 'videos'.DS);
// files (documents) (below media)
define('DOCUMENTS', 'documents'.DS);
// files (pdfs) (below media)
define('PDFS', 'documents'.DS);
// CSV
define('CSV', 'csv'.DS);
// css
define('CSS', 'css'.DS);
// font (web)
define('FONT', 'font'.DS);
// js
define('JS', 'javascript'.DS);
// table arrays
define('TABLE_ARRAYS', 'table_arrays'.DS);
// smarty libs path
define('SMARTY', 'Smarty'.DS);
// po langs
define('LANG', 'lang'.DS);
// cache path
define('CACHE', 'cache'.DS);
// temp path
define('TMP', 'tmp'.DS);
// log files
define('LOG', 'log'.DS);
// compiled template folder
define('TEMPLATES_C', 'templates_c'.DS);
// template base
define('TEMPLATES', 'templates'.DS);
/************* HASH / ACL DEFAULT / ERROR SETTINGS / SMARTY *************/
// default hash type
define('DEFAULT_HASH', 'sha256');
// default acl level
define('DEFAULT_ACL_LEVEL', 80);
// SSL host name
// define('SSL_HOST', 'ssl.host.name');
// error page strictness, Default is 3
// 1: only show error page as the last mesure if really no mid & aid can be loaded and found at all
// 2: if template not found, do not search, show error template
// 3: if default template is not found, show error template, do not fall back to default tree
// 4: very strict, even on normal fixable errors through error
// define('ERROR_STRICT', 3);
// allow page caching in general, set to 'FALSE' if you do debugging or development!
// define('ALLOW_SMARTY_CACHE', false);
// cache life time, in second', default here is 2 days (172800s)
// -1 is never expire cache
// define('SMARTY_CACHE_LIFETIME', -1);
/************* LOGOUT ********************/
// logout target
define('LOGOUT_TARGET', '');
// password change allowed
define('PASSWORD_CHANGE', false);
define('PASSWORD_FORGOT', false);
// min/max password length
define('PASSWORD_MIN_LENGTH', 8);
define('PASSWORD_MAX_LENGTH', 255);
/************* AJAX / ACCESS *************/
// ajax request type
define('AJAX_REQUEST_TYPE', 'POST');
// what AJAX type to use
define('USE_PROTOTYPE', false);
define('USE_SCRIPTACULOUS', false);
define('USE_JQUERY', true);
/************* LAYOUT WIDTHS *************/
define('PAGE_WIDTH', 800);
define('CONTENT_WIDTH', 800);
// the default template name
define('MASTER_TEMPLATE_NAME', 'main_body.tpl');
/************* OVERALL CONTROL NAMES *************/
// BELOW has HAS to be changed
// base name for all session and log names
define('BASE_NAME', 'CoreLibs');
/************* SESSION NAMES *************/
// server name HASH
define('SERVER_NAME_HASH', hash('crc32b', $_SERVER['HTTP_HOST']));
define('SERVER_PATH_HASH', hash('crc32b', BASE));
// backend
define('EDIT_SESSION_NAME', BASE_NAME.'Admin'.SERVER_NAME_HASH.SERVER_PATH_HASH);
// frontend
define('SESSION_NAME', BASE_NAME.SERVER_NAME_HASH.SERVER_PATH_HASH);
// SET_SESSION_NAME should be set in the header if a special session name is needed
define('SET_SESSION_NAME', SESSION_NAME);
/************* CACHE/COMPILE IDS *************/
define('CACHE_ID', 'CACHE_'.BASE_NAME.'_'.SERVER_NAME_HASH);
define('COMPILE_ID', 'COMPILE_'.BASE_NAME.'_'.SERVER_NAME_HASH);
/************* LANGUAGE / ENCODING *******/
define('DEFAULT_LANG', 'en_utf8');
// default web page encoding setting
define('DEFAULT_ENCODING', 'UTF-8');
/************* LOGGING *******************/
// below two can be defined here, but they should be
// defined in either the header file or the file itself
// as $LOG_FILE_ID which takes presence over LOG_FILE_ID
// see Basic class constructor
define('LOG_FILE_ID', BASE_NAME);
/************* CLASS ERRORS *******************/
// 0 = default all OFF
// 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
// live_queue is a global queue system
// define('QUEUE', 'live_queue');
/************* DB PATHS (PostgreSQL) *****************/
// schema names, can also be defined per <DB INFO>
define('PUBLIC_SCHEMA', 'public');
define('DEV_SCHEMA', 'public');
define('TEST_SCHEMA', 'public');
define('LIVE_SCHEMA', 'public');
/************* CORE HOST SETTINGS *****************/
if (file_exists(BASE.CONFIGS.'config.host.php')) {
require BASE.CONFIGS.'config.host.php';
}
if (!isset($SITE_CONFIG)) {
$SITE_CONFIG = array();
}
/************* DB ACCESS *****************/
if (file_exists(BASE.CONFIGS.'config.db.php')) {
require BASE.CONFIGS.'config.db.php';
}
if (!isset($DB_CONFIG)) {
$DB_CONFIG = array();
}
/************* OTHER PATHS *****************/
if (file_exists(BASE.CONFIGS.'config.path.php')) {
require BASE.CONFIGS.'config.path.php';
}
/************* MASTER INIT *****************/
// live frontend pages
// ** missing live domains **
// get the name without the port
list($HOST_NAME) = array_pad(explode(':', $_SERVER['HTTP_HOST'], 2), 2, null);
// set HOST name
define('HOST_NAME', $HOST_NAME);
// BAIL ON MISSING MASTER SITE CONFIG
if (!isset($SITE_CONFIG[HOST_NAME]['location'])) {
echo 'Missing SITE_CONFIG entry for: "'.HOST_NAME.'". Contact Administrator';
exit;
}
// BAIL ON MISSING DB CONFIG:
// we have either no db selction for this host but have db config entries
// or we have a db selection but no db config as array or empty
// or we have a selection but no matching db config entry
if ((!isset($SITE_CONFIG[HOST_NAME]['db_host']) && count($DB_CONFIG)) ||
(isset($SITE_CONFIG[HOST_NAME]['db_host']) &&
// missing DB CONFIG
((is_array($DB_CONFIG) && !count($DB_CONFIG)) ||
!is_array($DB_CONFIG) ||
// has DB CONFIG but no match
(is_array($DB_CONFIG) && count($DB_CONFIG) && !isset($DB_CONFIG[$SITE_CONFIG[HOST_NAME]['db_host']])))
)
) {
echo 'No matching DB config found for: "'.HOST_NAME.'". Contact Administrator';
exit;
}
// set SSL on
if ((array_key_exists('HTTPS', $_SERVER) && !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ||
$_SERVER['SERVER_PORT'] == 443) {
define('HOST_SSL', true);
define('HOST_PROTOCOL', 'https://');
} else {
define('HOST_SSL', false);
define('HOST_PROTOCOL', 'http://');
}
// define the db config set name, the db config and the db schema
define('DB_CONFIG_NAME', $SITE_CONFIG[HOST_NAME]['db_host']);
define('DB_CONFIG', isset($DB_CONFIG[DB_CONFIG_NAME]) ? $DB_CONFIG[DB_CONFIG_NAME] : array());
// define('DB_CONFIG_TARGET', SITE_CONFIG[$HOST_NAME]['db_host_target']);
// define('DB_CONFIG_OTHER', SITE_CONFIG[$HOST_NAME]['db_host_other']);
// override for login and global schemas
// define('LOGIN_DB_SCHEMA', PUBLIC_SCHEMA); // where the edit* tables are
// define('GLOBAL_DB_SCHEMA', PUBLIC_SCHEMA); // where global tables are that are used by all schemas (eg queue tables for online, etc)
// debug settings, site lang, etc
define('TARGET', $SITE_CONFIG[HOST_NAME]['location']);
define('DEBUG', $SITE_CONFIG[HOST_NAME]['debug_flag']);
define('SITE_LANG', $SITE_CONFIG[HOST_NAME]['site_lang']);
define('LOGIN_ENABLED', $SITE_CONFIG[HOST_NAME]['login_enabled']);
// paths
// define('CSV_PATH', $PATHS[TARGET]['csv_path']);
// define('EXPORT_SCRIPT', $PATHS[TARGET]['perl_bin']);
// define('REDIRECT_URL', $PATHS[TARGET]['redirect_url']);
// show all errors if debug_all & show_error_handling are enabled
define('SHOW_ALL_ERRORS', true);
/************* GENERAL PAGE TITLE ********/
define('G_TITLE', '<OVERALL FALLBACK PAGE TITLE>');
/************ STYLE SHEETS / JS **********/
define('ADMIN_STYLESHEET', 'edit.css');
define('ADMIN_JAVASCRIPT', 'edit.js');
define('STYLESHEET', 'frontend.css');
define('JAVASCRIPT', 'frontend.js');
// anything optional
/************* INTERNAL ******************/
// any other global definitons in the config.other.php
if (file_exists(BASE.CONFIGS.'config.other.php')) {
require BASE.CONFIGS.'config.other.php';
}
/************* DEBUG *******************/
// turn off debug if debug flag is OFF
if (defined('DEBUG') && DEBUG == false) {
$ECHO_ALL = false;
$DEBUG_ALL = false;
$PRINT_ALL = false;
$DB_DEBUG = false;
$ENABLE_ERROR_HANDLING = false;
$DEBUG_ALL_OVERRIDE = false;
} else {
$ECHO_ALL = false;
$DEBUG_ALL = true;
$PRINT_ALL = true;
$DB_DEBUG = true;
$ENABLE_ERROR_HANDLING = false;
$DEBUG_ALL_OVERRIDE = false;
}
/************* AUTO LOADER *******************/
// read auto loader
require BASE.LIB.'autoloader.php';
// __END__

28
www/configs/config.other.php Executable file
View File

@@ -0,0 +1,28 @@
<?php declare(strict_types=1);
/********************************************************************
* AUTHOR: Clemens Schwaighofer
* CREATED: 2019/10/28
* SHORT DESCRIPTION:
* other global constant variables
* HISTORY:
*********************************************************************/
// DEFINE('SOME_ID', <SOME VALUE>);
/************* CONVERT *******************/
// this only needed if the external thumbnail create is used
$paths = array(
'/bin',
'/usr/bin',
'/usr/local/bin'
);
// find convert
foreach ($paths as $path) {
if (file_exists($path.DS.'convert') && is_file($path.DS.'convert')) {
// image magick convert location
DEFINE('CONVERT', $path.DS.'convert');
}
}
unset($paths);
// __END__

View File

@@ -1,4 +1,4 @@
<?php <?php declare(strict_types=1);
/******************************************************************** /********************************************************************
* AUTHOR: Clemens Schwaighofer * AUTHOR: Clemens Schwaighofer
* CREATED: 2018/10/11 * CREATED: 2018/10/11
@@ -10,8 +10,12 @@
// File and Folder paths // File and Folder paths
// ID is TARGET (first array element) // ID is TARGET (first array element)
// $PATHS['test']['csv_path'] = ''; /*$PATHS = array(
// $PATHS['test']['perl_bin'] = ''; 'test' => array(
// $PATHS['test']['redirect_url'] = ''; 'csv_path' => '',
'perl_bin' => '',
'other_url' => '',
)
)*/
// __END__ // __END__

View File

@@ -12,8 +12,8 @@ define('CONFIG_PATH', 'configs'.DIRECTORY_SEPARATOR);
$CONFIG_PATH_PREFIX = ''; $CONFIG_PATH_PREFIX = '';
for ($dir_pos = 0, $dir_max = count(explode(DIRECTORY_SEPARATOR, __DIR__)); $dir_pos <= $dir_max; $dir_pos ++) { for ($dir_pos = 0, $dir_max = count(explode(DIRECTORY_SEPARATOR, __DIR__)); $dir_pos <= $dir_max; $dir_pos ++) {
$CONFIG_PATH_PREFIX .= '..'.DIRECTORY_SEPARATOR; $CONFIG_PATH_PREFIX .= '..'.DIRECTORY_SEPARATOR;
if (file_exists($CONFIG_PATH_PREFIX.CONFIG_PATH.'config.inc')) { if (file_exists($CONFIG_PATH_PREFIX.CONFIG_PATH.'config.master.php')) {
require $CONFIG_PATH_PREFIX.CONFIG_PATH.'config.inc'; require $CONFIG_PATH_PREFIX.CONFIG_PATH.'config.master.php';
break; break;
} }
} }
@@ -22,7 +22,7 @@ if (!defined('DS')) {
exit('Base config unloadable'); exit('Base config unloadable');
} }
// find trigger name "admin/" or "frontend/" in the getcwd() folder // find trigger name "admin/" or "frontend/" in the getcwd() folder
foreach (array ('admin', 'frontend') as $folder) { foreach (array('admin', 'frontend') as $folder) {
if (strstr(getcwd(), DS.$folder)) { if (strstr(getcwd(), DS.$folder)) {
define('CONTENT_PATH', $folder.DS); define('CONTENT_PATH', $folder.DS);
break; break;

View File

@@ -7,7 +7,7 @@
* HISTORY: * HISTORY:
*********************************************************************/ *********************************************************************/
$day_short = array ( $day_short = array(
1 => 'Mon', 1 => 'Mon',
2 => 'Tue', 2 => 'Tue',
3 => 'Wed', 3 => 'Wed',
@@ -17,7 +17,7 @@ $day_short = array (
7 => 'Sun' 7 => 'Sun'
); );
$day_long = array ( $day_long = array(
1 => 'Monday', 1 => 'Monday',
2 => 'Tuesday', 2 => 'Tuesday',
3 => 'Wednesday', 3 => 'Wednesday',
@@ -28,7 +28,7 @@ $day_long = array (
); );
// months // months
$month_long = array ( $month_long = array(
1 => 'January', 1 => 'January',
2 => 'February', 2 => 'February',
3 => 'March', 3 => 'March',
@@ -43,7 +43,7 @@ $month_long = array (
12 => 'December' 12 => 'December'
); );
$month_short = array ( $month_short = array(
1 => 'Jan', 1 => 'Jan',
2 => 'Feb', 2 => 'Feb',
3 => 'Mar', 3 => 'Mar',

View File

@@ -10,59 +10,55 @@
//------------------------------ variable init start //------------------------------ variable init start
// for dev test we set full error reporting; writes everything, except E_ERROR into logs/php_error-<day>.log // for dev test we set full error reporting; writes everything, except E_ERROR into logs/php_error-<day>.log
if ($DEBUG_ALL && $ENABLE_ERROR_HANDLING) { if ($DEBUG_ALL && $ENABLE_ERROR_HANDLING) {
include BASE.LIBS."Error.Handling.inc"; include BASE.LIBS."Error.Handling.php";
} }
// predefine vars // predefine vars
$lang = ''; $messages = array();
$messages = array ();
// import all POST vars // import all POST vars
extract($_POST, EXTR_SKIP); // extract($_POST, EXTR_SKIP);
//------------------------------ variable init end //------------------------------ variable init end
//------------------------------ library include start //------------------------------ library include start
// set output to quiet for load of classes & session settings // set output to quiet for load of classes & session settings
ob_start(); ob_start();
// set the session name // set the session name
define('SET_SESSION_NAME', EDIT_SESSION_NAME); $SET_SESSION_NAME = EDIT_SESSION_NAME;
$LOG_FILE_ID = BASE_NAME.'Admin';
//------------------------------ library include end //------------------------------ library include end
//------------------------------ basic variable settings start //------------------------------ basic variable settings start
// set encoding if (!isset($AJAX_PAGE)) {
if (!isset($encoding)) { $AJAX_PAGE = false;
$encoding = DEFAULT_ENCODING;
} }
// set the default lang, if not given if (!isset($ZIP_STREAM)) {
if (session_id() && $_SESSION['DEFAULT_LANG']) { $ZIP_STREAM = false;
$lang = $_SESSION['DEFAULT_LANG']; }
} elseif (!$lang) { // set encoding
$lang = defined('SITE_LANG') ? SITE_LANG : DEFAULT_LANG; if (!isset($ENCODING) || !$ENCODING) {
$ENCODING = DEFAULT_ENCODING;
} }
// end the stop of the output flow, but only if we didn't request a csv file download // end the stop of the output flow, but only if we didn't request a csv file download
if (array_key_exists('action', $_POST) && $_POST['action'] != 'download_csv') { if (isset($_POST['action']) && $_POST['action'] != 'download_csv' && !$AJAX_PAGE) {
header("Content-type: text/html; charset=".$encoding); header("Content-type: text/html; charset=".$ENCODING);
} }
if (isset($AJAX_PAGE) && isset($ZIP_STREAM) && $AJAX_PAGE && !$ZIP_STREAM) { if ($AJAX_PAGE && !$ZIP_STREAM) {
header("Content-Type: application/json; charset=UTF-8"); header("Content-Type: application/json; charset=UTF-8");
} }
//------------------------------ basic variable settings start //------------------------------ basic variable settings start
//------------------------------ class init start //------------------------------ class init start
// login & page access check // login & page access check
$login = new CoreLibs\ACL\Login($DB_CONFIG[LOGIN_DB], $lang); $login = new CoreLibs\ACL\Login(DB_CONFIG);
// post login lang check
if ($_SESSION['DEFAULT_LANG']) {
$lang = $_SESSION['DEFAULT_LANG'];
}
// create smarty object // create smarty object
$smarty = new CoreLibs\Template\SmartyExtend($lang); $smarty = new CoreLibs\Template\SmartyExtend();
// create new DB class // create new DB class
$cms = new CoreLibs\Admin\Backend($DB_CONFIG[MAIN_DB], $lang); $cms = new CoreLibs\Admin\Backend(DB_CONFIG);
// the menu show flag (what menu to show) // the menu show flag (what menu to show)
$cms->menu_show_flag = 'main'; $cms->menu_show_flag = 'main';
// db nfo // db nfo
$cms->dbInfo(); $cms->dbInfo();
// set acl // set acl
$cms->acl = $login->acl; $cms->setACL($login->acl);
// flush // flush
ob_end_flush(); ob_end_flush();
//------------------------------ class init end //------------------------------ class init end
@@ -70,7 +66,7 @@ ob_end_flush();
//------------------------------ logging start //------------------------------ logging start
// log backend data // log backend data
// data part creation // data part creation
$data = array ( $data = array(
'_SESSION' => $_SESSION, '_SESSION' => $_SESSION,
'_GET' => $_GET, '_GET' => $_GET,
'_POST' => $_POST, '_POST' => $_POST,
@@ -83,22 +79,16 @@ if (!$login->login) {
} }
//------------------------------ logging end //------------------------------ logging end
//------------------------------ page rights start
// flag if to show the edit access id drop down list
// check if we have more than one EA ID
$cms->DATA['show_ea_extra'] = $login->acl['show_ea_extra'];
//------------------------------ page rights ned
// automatic hide for DEBUG messages on live server // 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) // 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) { if ((TARGET == 'live' || TARGET == 'remote') && !$DEBUG_ALL_OVERRIDE) {
$login->debug_output_all = 0; $login->debug_output_all = false;
$login->echo_output_all = 0; $login->echo_output_all = false;
$login->print_output_all = 0; $login->print_output_all = false;
$cms->debug_output_all = 0; $cms->debug_output_all = false;
$cms->echo_output_all = 0; $cms->echo_output_all = false;
$cms->print_output_all = 0; $cms->print_output_all = false;
} }
$cms->DATA['JS_DEBUG'] = DEBUG; $smarty->DATA['JS_DEBUG'] = DEBUG;
// __END__ // __END__

View File

@@ -1,166 +0,0 @@
<?php declare(strict_types=1);
/********************************************************************
* AUTHOR: Clemens Schwaighofer
* CREATED: 2007/09/03
* SHORT DESCRIPTION:
* set paths & language variables
* HISTORY:
*********************************************************************/
// master template
if (!isset($MASTER_TEMPLATE_NAME)) {
$MASTER_TEMPLATE_NAME = MASTER_TEMPLATE_NAME;
}
// just emergency fallback for language
// set encoding
if (isset($_SESSION['DEFAULT_CHARSET'])) {
$encoding = $_SESSION['DEFAULT_CHARSET'];
} elseif (!isset($encoding)) {
$encoding = DEFAULT_ENCODING;
}
// just emergency fallback for language
if (isset($_SESSION['DEFAULT_LANG'])) {
$lang = $_SESSION['DEFAULT_LANG'];
} elseif (!isset($lang)) {
$lang = defined('SITE_LANG') ? SITE_LANG : DEFAULT_LANG;
}
// create the char lang encoding
$lang_short = substr($lang, 0, 2);
// set include & template names
$PAGE_FILE_NAME = str_replace(".php", "", $cms->page_name);
// set include & template names
if (!isset($CONTENT_INCLUDE)) {
$CONTENT_INCLUDE = $PAGE_FILE_NAME.'.tpl';
}
$FORM_NAME = !isset($FORM_NAME) || !$FORM_NAME ? str_replace(".php", "", $cms->page_name) : $FORM_NAME;
// set local page title
$L_TITLE = ucfirst(str_replace('_', ' ', $cms->getPageName(1))).(defined(G_TITLE) ? ' - '.G_TITLE : '');
// strip tpl and replace it with inc
// php include file per page
$cms->INC_TEMPLATE_NAME = str_replace(".tpl", ".inc", $CONTENT_INCLUDE);
// javascript include per page
$cms->JS_TEMPLATE_NAME = str_replace(".tpl", ".js", $CONTENT_INCLUDE);
// css per page
$cms->CSS_TEMPLATE_NAME = str_replace(".tpl", ".css", $CONTENT_INCLUDE);
// special CSS file
$cms->CSS_SPECIAL_TEMPLATE_NAME = $CSS_NAME;
// special JS file
$cms->JS_SPECIAL_TEMPLATE_NAME = $JS_NAME;
// compile & cache id
$cms->CACHE_ID = isset($CACHE_ID) ? $CACHE_ID : CACHE_ID;
$cms->COMPILE_ID = isset($COMPILE_ID) ? $COMPILE_ID : CACHE_ID;
// set basic template path (tmp)
$cms->includes = BASE.INCLUDES; // no longer in templates, only global
$cms->template_path = BASE.INCLUDES.TEMPLATES.CONTENT_PATH;
if ($smarty) {
$smarty->setTemplateDir($cms->template_path);
}
if (isset($LANGUAGE_FOLDER)) {
$cms->lang_dir = $LANGUAGE_FOLDER;
} else {
$cms->lang_dir = BASE.INCLUDES.LANG.CONTENT_PATH; // no outside
}
$cms->javascript = LAYOUT.JS;
$cms->css = LAYOUT.CSS;
$cms->pictures = LAYOUT.IMAGES;
$cms->cache_pictures = LAYOUT.CACHE;
$cms->cache_pictures_root = ROOT.$cms->cache_pictures;
if (!is_dir($cms->cache_pictures_root)) {
mkdir($cms->cache_pictures_root);
}
// check if we have an external file with the template name
if (file_exists($cms->includes.$cms->INC_TEMPLATE_NAME) &&
is_file($cms->includes.$cms->INC_TEMPLATE_NAME)
) {
include($cms->includes.$cms->INC_TEMPLATE_NAME);
}
// only CSS/JS/etc include stuff if we have non AJAX page
if (isset($AJAX_PAGE) && !$AJAX_PAGE) {
// check for template include
if (isset($USE_INCLUDE_TEMPLATE) && $USE_INCLUDE_TEMPLATE === true && !isset($TEMPLATE_NAME)) {
$TEMPLATE_NAME = $CONTENT_INCLUDE;
// add to cache & compile id
$cms->COMPILE_ID .= '_'.$TEMPLATE_NAME;
$cms->CACHE_ID .= '_'.$TEMPLATE_NAME;
}
// additional per page Javascript include
$cms->JS_INCLUDE = '';
if (file_exists($cms->javascript.$cms->JS_TEMPLATE_NAME) && is_file($cms->javascript.$cms->JS_TEMPLATE_NAME)) {
$cms->JS_INCLUDE = $cms->javascript.$cms->JS_TEMPLATE_NAME;
}
// per page css file
$cms->CSS_INCLUDE = '';
if (file_exists($cms->css.$cms->CSS_TEMPLATE_NAME) && is_file($cms->css.$cms->CSS_TEMPLATE_NAME)) {
$cms->CSS_INCLUDE = $cms->css.$cms->CSS_TEMPLATE_NAME;
}
// optional CSS file
$cms->CSS_SPECIAL_INCLUDE = '';
if (file_exists($cms->css.$cms->CSS_SPECIAL_TEMPLATE_NAME) && is_file($cms->css.$cms->CSS_SPECIAL_TEMPLATE_NAME)) {
$cms->CSS_SPECIAL_INCLUDE = $cms->css.$cms->CSS_SPECIAL_TEMPLATE_NAME;
}
// optional JS file
$cms->JS_SPECIAL_INCLUDE = '';
if (file_exists($cms->javascript.$cms->JS_SPECIAL_TEMPLATE_NAME) && is_file($cms->javascript.$cms->JS_SPECIAL_TEMPLATE_NAME)) {
$cms->JS_SPECIAL_INCLUDE = $cms->javascript.$cms->JS_SPECIAL_TEMPLATE_NAME;
}
if ($smarty) {
// check if template names exist
if (!file_exists($smarty->getTemplateDir()[0].DS.$MASTER_TEMPLATE_NAME)) {
// abort if master template could not be found
exit('MASTER TEMPLATE: '.$MASTER_TEMPLATE_NAME.' could not be found');
}
if (isset($TEMPLATE_NAME) && !file_exists($smarty->getTemplateDir()[0].DS.$TEMPLATE_NAME)) {
exit('INCLUDE TEMPLATE: '.$TEMPLATE_NAME.' could not be found');
}
}
}
// if the lang folder is different to the default one
// if the default lang is not like the lang given, switch lang
if (false === strstr(BASE.INCLUDES.LANG.CONTENT_PATH, $cms->lang_dir) ||
strcasecmp(defined('SITE_LANG') ? SITE_LANG : DEFAULT_LANG, $lang)
) {
$cms->debug('LANG', 'Orig: '.BASE.INCLUDES.LANG.CONTENT_PATH.', New: '.$cms->lang_dir.' | Orig Lang: '.(defined('SITE_LANG') ? SITE_LANG : DEFAULT_LANG).', New Lang: '.$lang);
$cms->l->l10nReloadMOfile($lang, $cms->lang_dir);
// if we have login class
if ($login) {
$login->l->l10nReloadMOfile($lang, $cms->lang_dir);
}
// if we have smarty template class
if ($smarty) {
$smarty->l10n->l10nReloadMOfile($lang, $cms->lang_dir);
}
}
if (isset($AJAX_PAGE) && !$AJAX_PAGE) {
// javascript translate data as template for auto translate
if (empty($TEMPLATE_TRANSLATE)) {
$TEMPLATE_TRANSLATE = 'jsTranslate_'.$lang.'.tpl';
$cms->debug('LANG', 'Load lang: '.$lang.', for page file '.$TEMPLATE_TRANSLATE);
} else {
// we assume we have some fixed set
// we must add _<$lang>
// if .tpl, put before .tpl
// if not .tpl, add _<$lang>.tpl
if (strpos($TEMPLATE_TRANSLATE, '.tpl')) {
$TEMPLATE_TRANSLATE = str_replace('.tpl', '_'.$lang.'.tpl', $TEMPLATE_TRANSLATE);
} else {
$TEMPLATE_TRANSLATE .= '_'.$lang.'.tpl';
}
}
// if we can't find it, dump it
if ($smarty && !file_exists($smarty->getTemplateDir()[0].DS.$TEMPLATE_TRANSLATE)) {
unset($TEMPLATE_TRANSLATE);
}
}
// $cms->debug("LANGUAGE", "L: $lang | ".$cms->lang_dir." | MO File: ".$cms->l->mofile);
$cms->debug("LANGUAGE", "SL: ".$_SESSION['DEFAULT_CHARSET']." | ".$_SESSION['LANG']." | ".$_SESSION['DEFAULT_LANG']);
if ($smarty) {
$cms->debug("TEMPLATE", "P: ".$smarty->getTemplateDir()[0]);
}
// __END__

View File

@@ -0,0 +1,19 @@
<?php declare(strict_types=1);
/********************************************************************
* AUTHOR: Clemens Schwaighofer
* CREATED: 2007/09/03
* SHORT DESCRIPTION:
* set paths & language variables
* HISTORY:
*********************************************************************/
/******
NOTE THAT THIS INCLUDE IS OBSOLETE
USE THE BELOW FUNCTION CALL IN THE SCRIPT ITSELF
*******/
trigger_error('admin_set_paths.php is deprecated. Use SmartyExtended->setSmartyPaths();', E_USER_DEPRECATED);
if ($smarty) {
$smarty->setSmartyPaths();
}
// __END__

View File

@@ -1,108 +0,0 @@
<?php declare(strict_types=1);
/********************************************************************
* AUTHOR: Clemens Schwaighofer
* CREATED: 2005/07/12
* SHORT DESCRIPTION:
* default smarty vars, and create output template for smarty
* HISTORY:
*********************************************************************/
// trigger flags
$cms->HEADER['USE_PROTOTYPE'] = isset($USE_PROTOTYPE) ? $USE_PROTOTYPE : USE_PROTOTYPE;
// scriptacolous, can only be used with prototype
if ($cms->HEADER['USE_PROTOTYPE']) {
$cms->HEADER['USE_SCRIPTACULOUS'] = isset($USE_SCRIPTACULOUS) ? $USE_SCRIPTACULOUS : USE_SCRIPTACULOUS;
}
// jquery and prototype should not be used together
$cms->HEADER['USE_JQUERY'] = isset($USE_JQUERY) ? $USE_JQUERY : USE_JQUERY; // don't use either of those two together
// check if we have an external file with the template name
if (file_exists($cms->includes.$cms->INC_TEMPLATE_NAME) && is_file($cms->includes.$cms->INC_TEMPLATE_NAME)) {
include($cms->includes.$cms->INC_TEMPLATE_NAME);
}
// additional per page Javascript include
$cms->JS_INCLUDE = '';
if (file_exists($cms->javascript.$cms->JS_TEMPLATE_NAME) && is_file($cms->javascript.$cms->JS_TEMPLATE_NAME)) {
$cms->JS_INCLUDE = $cms->javascript.$cms->JS_TEMPLATE_NAME;
}
// per page css file
$cms->CSS_INCLUDE = '';
if (file_exists($cms->css.$cms->CSS_TEMPLATE_NAME) && is_file($cms->css.$cms->CSS_TEMPLATE_NAME)) {
$cms->CSS_INCLUDE = $cms->css.$cms->CSS_TEMPLATE_NAME;
}
// optional CSS file
$cms->CSS_SPECIAL_INCLUDE = '';
if (file_exists($cms->css.$cms->CSS_SPECIAL_TEMPLATE_NAME) && is_file($cms->css.$cms->CSS_SPECIAL_TEMPLATE_NAME)) {
$cms->CSS_SPECIAL_INCLUDE = $cms->css.$cms->CSS_SPECIAL_TEMPLATE_NAME;
}
// optional JS file
$cms->JS_SPECIAL_INCLUDE = '';
if (file_exists($cms->javascript.$cms->JS_SPECIAL_TEMPLATE_NAME) && is_file($cms->javascript.$cms->JS_SPECIAL_TEMPLATE_NAME)) {
$cms->JS_SPECIAL_INCLUDE = $cms->javascript.$cms->JS_SPECIAL_TEMPLATE_NAME;
}
// the actual include files for javascript (per page)
$cms->HEADER['JS_INCLUDE'] = $cms->JS_INCLUDE;
$cms->HEADER['CSS_INCLUDE'] = $cms->CSS_INCLUDE;
$cms->HEADER['CSS_SPECIAL_INCLUDE'] = $cms->CSS_SPECIAL_INCLUDE;
$cms->HEADER['JS_SPECIAL_INCLUDE'] = $cms->JS_SPECIAL_INCLUDE;
// paths to the files
$cms->DATA['includes'] = $cms->includes;
$cms->DATA['js'] = $cms->javascript;
$cms->DATA['css'] = $cms->css;
$cms->DATA['pictures'] = $cms->pictures;
// default CMS settings
// define all needed smarty stuff for the general HTML/page building
$cms->HEADER['CSS'] = CSS;
$cms->HEADER['JS'] = JS;
$cms->HEADER['ENCODING'] = $encoding;
$cms->HEADER['DEFAULT_ENCODING'] = DEFAULT_ENCODING;
$cms->HEADER['STYLESHEET'] = isset($ADMIN_STYLESHEET) ? $ADMIN_STYLESHEET : ADMIN_STYLESHEET;
$cms->HEADER['JAVASCRIPT'] = isset($ADMIN_JAVASCRIPT) ? $ADMIN_JAVASCRIPT : ADMIN_JAVASCRIPT;
// html title
$cms->HEADER['HTML_TITLE'] = isset($L_TITLE) ? $cms->l->__($L_TITLE) : $cms->l->__(G_TITLE);
$cms->DATA['table_width'] = isset($PAGE_WIDTH) ? $PAGE_WIDTH : PAGE_WIDTH;
// messages = array('msg' =>, 'class' => 'error/warning/...')
$cms->DATA['messages'] = $cms->messages;
// top menu
$cms->DATA['nav_menu'] = $cms->adbTopMenu();
// the page name
$cms->DATA['page_name'] = $cms->page_name;
// user name
$cms->DATA['USER_NAME'] = $_SESSION['USER_NAME'];
// the template part to include into the body
$cms->DATA['TEMPLATE_NAME'] = $TEMPLATE_NAME;
$cms->DATA['CONTENT_INCLUDE'] = $CONTENT_INCLUDE;
// LANG
$cms->DATA['LANG'] = $lang;
$cms->DATA['TINYMCE_LANG'] = $lang_short;
$cms->DATA['USE_TINY_MCE'] = isset($USE_TINY_MCE) ? $USE_TINY_MCE : false;
$cms->DATA['JS_DATEPICKR'] = isset($JS_DATEPICKR) ? $JS_DATEPICKR : false;
$cms->DATA['JS_FLATPICKR'] = isset($JS_FLATPICKR) ? $JS_FLATPICKR : false;
// debug data, if DEBUG flag is on, this data is print out
$cms->DEBUG_DATA['debug_error_msg'] = $cms->runningTime();
$cms->DEBUG_DATA['DEBUG'] = @$DEBUG_TMPL;
// create main data array
$cms->CONTENT_DATA = array_merge($cms->HEADER, $cms->DATA, $cms->DEBUG_DATA);
// data is 1:1 mapping (all vars, values, etc)
foreach ($cms->CONTENT_DATA as $key => $value) {
$smarty->assign($key, $value);
}
if (is_dir(BASE.TEMPLATES_C)) {
$smarty->setCompileDir(BASE.TEMPLATES_C);
}
if (is_dir(BASE.CACHE)) {
$smarty->setCacheDir(BASE.CACHE);
}
$smarty->display(
$MASTER_TEMPLATE_NAME,
$cms->CACHE_ID.($cms->CACHE_ID ? '_' : '').$lang,
$cms->COMPILE_ID.($cms->COMPILE_ID ? '_' : '').$lang
);
// __END__

View File

@@ -0,0 +1,17 @@
<?php declare(strict_types=1);
/********************************************************************
* AUTHOR: Clemens Schwaighofer
* CREATED: 2005/07/12
* SHORT DESCRIPTION:
* default smarty vars, and create output template for smarty
* HISTORY:
*********************************************************************/
/******
NOTE THAT THIS INCLUDE IS OBSOLETE
USE THE BELOW FUNCTION CALL IN THE SCRIPT ITSELF
*******/
trigger_error('admin_smarty.php is deprecated. Use SmartyExtended->setSmartyVarsAdmin(); or setSmartyVarsFrontend();', E_USER_DEPRECATED);
$smarty->setSmartyVarsAdmin();
// __END__

View File

@@ -24,14 +24,10 @@ $DB_DEBUG = 1;
// TODO: only extract _POST data that is needed // TODO: only extract _POST data that is needed
extract($_POST, EXTR_SKIP); extract($_POST, EXTR_SKIP);
$table_width = '100%';
// this is for certain CMS modules that set a relative path
define('REL_PATH', '');
ob_start(); ob_start();
require 'config.php'; require 'config.php';
// set session name here // set session name here
define('SET_SESSION_NAME', EDIT_SESSION_NAME); $SET_SESSION_NAME = EDIT_SESSION_NAME;
// overrride debug flags // overrride debug flags
if (!DEBUG) { if (!DEBUG) {
$DEBUG_ALL = 0; $DEBUG_ALL = 0;
@@ -40,23 +36,19 @@ if (!DEBUG) {
$ECHO_ALL = 0; $ECHO_ALL = 0;
} }
// set default lang if not set otherwise
if (!isset($lang)) {
$lang = DEFAULT_LANG;
}
// should be utf8 // should be utf8
header("Content-type: text/html; charset=".DEFAULT_ENCODING); header("Content-type: text/html; charset=".DEFAULT_ENCODING);
ob_end_flush(); ob_end_flush();
$login = new CoreLibs\ACL\Login($DB_CONFIG[LOGIN_DB], $lang); $login = new CoreLibs\ACL\Login(DB_CONFIG);
// create form class // create form class
$form = new CoreLibs\Output\Form\Generate($DB_CONFIG[MAIN_DB], $lang); $form = new CoreLibs\Output\Form\Generate(DB_CONFIG);
if ($form->mobile_phone) { if ($form->mobile_phone) {
echo "I am sorry, but this page cannot be viewed by a mobile phone"; echo "I am sorry, but this page cannot be viewed by a mobile phone";
exit; exit;
} }
// smarty template engine (extended Translation version) // smarty template engine (extended Translation version)
$smarty = new CoreLibs\Template\SmartyExtend($lang); $smarty = new CoreLibs\Template\SmartyExtend();
// $form->debug('POST', $form->printAr($_POST)); // $form->debug('POST', $form->printAr($_POST));
@@ -70,6 +62,12 @@ if (TARGET == 'live' || TARGET == 'remote') {
$form->echo_output_all = 0; $form->echo_output_all = 0;
$form->print_output_all = DEBUG ? 1 : 0; $form->print_output_all = DEBUG ? 1 : 0;
} }
// space for setting special debug flags
$login->debug_output_all = 1;
// set smarty arrays
$HEADER = array();
$DATA = array();
$DEBUG_DATA = array();
// set the template dir // set the template dir
// WARNING: this has a special check for the mailing tool layout (old layout) // WARNING: this has a special check for the mailing tool layout (old layout)
if (defined('LAYOUT')) { if (defined('LAYOUT')) {
@@ -81,32 +79,8 @@ if (defined('LAYOUT')) {
$DATA['css'] = CSS; $DATA['css'] = CSS;
$DATA['js'] = JS; $DATA['js'] = JS;
} }
// set table width
// space for setting special debug flags $table_width = '100%';
$login->debug_output_all = 1;
// define edit logging function. should be in a special edit interface class later
// METHOD: EditLog()
// PARAMS: event -> any kind of event description, data -> any kind of data related to that event
// RETURN: none
// DESC: writes all action vars plus other info into edit_log table
function EditLog($event = '', $data = '')
{
$q = "INSERT INTO edit_log ";
$q .= "(euid, event_date, ip, event, data, page) ";
$q .= "VALUES (".$_SESSION['EUID'].", NOW(), '".$_SERVER["REMOTE_ADDR"]."', '".$GLOBALS['form']->dbEscapeString($event)."', '".$GLOBALS['form']->dbEscapeString($data)."', '".$GLOBALS['form']->getPageName()."')";
}
// log backend data
// data part creation
$data = array (
'_SESSION' => $_SESSION,
'_GET' => $_GET,
'_POST' => $_POST,
'_FILES' => $_FILES
);
// log action
EditLog('Edit Submit', serialize($data));
// define all needed smarty stuff for the general HTML/page building // define all needed smarty stuff for the general HTML/page building
$HEADER['CSS'] = CSS; $HEADER['CSS'] = CSS;
@@ -120,20 +94,22 @@ if ($form->my_page_name == 'edit_order') {
// order name is _always_ order_number for the edit interface // order name is _always_ order_number for the edit interface
// follwing arrays do exist here: // follwing arrays do exist here:
// $position ... has the positions of the array (0..max), cause in a <select> // $position ... has the positions of the array(0..max), cause in a <select>
// I can't put an number into the array field, in this array, // 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) // there are the POSITION stored, that should CHANGE there order (up/down)
// $row_data_id ... has ALL ids from the sorting part // $row_data_id ... has ALL ids from the sorting part
// $row_data_order ... has ALL order positions from the soirting part // $row_data_order ... has ALL order positions from the soirting part
if (!isset($position)) { if (!isset($position)) {
$position = array (); $position = array();
} }
$row_data_id = $_POST['row_data_id'];
$original_id = $row_data_id;
if (count($position)) { if (count($position)) {
$original_id = $row_data_id; $row_data_order = $_POST['row_data_order'];
// FIRST u have to put right sort, then read again ... // FIRST u have to put right sort, then read again ...
// hast to be >0 or the first one is selected and then there is no move // hast to be >0 or the first one is selected and then there is no move
if (isset($up) && $position[0] > 0) { if (isset($up) && isset($position[0]) && $position[0] > 0) {
for ($i = 0; $i < count($position); $i++) { for ($i = 0; $i < count($position); $i++) {
// change position order // change position order
// this gets temp, id before that, gets actual (moves one "down") // this gets temp, id before that, gets actual (moves one "down")
@@ -141,8 +117,8 @@ if ($form->my_page_name == 'edit_order') {
// is done for every element in row // is done for every element in row
// echo "A: ".$row_data_id[$position[$i]]." (".$row_data_order[$position[$i]].") -- ".$row_data_id[$position[$i]-1]." (".$row_data_order[$position[$i]-1].")<br>"; // echo "A: ".$row_data_id[$position[$i]]." (".$row_data_order[$position[$i]].") -- ".$row_data_id[$position[$i]-1]." (".$row_data_order[$position[$i]-1].")<br>";
$temp_id = $row_data_id[$position[$i]]; $temp_id = $row_data_id[$position[$i]];
$row_data_id[$position[$i]] = $row_data_id[$position[$i]-1]; $row_data_id[$position[$i]] = $row_data_id[$position[$i] - 1];
$row_data_id[$position[$i]-1] = $temp_id; $row_data_id[$position[$i] - 1] = $temp_id;
// echo "A: ".$row_data_id[$position[$i]]." (".$row_data_order[$position[$i]].") -- ".$row_data_id[$position[$i]-1]." (".$row_data_order[$position[$i]-1].")<br>"; // echo "A: ".$row_data_id[$position[$i]]." (".$row_data_order[$position[$i]].") -- ".$row_data_id[$position[$i]-1]." (".$row_data_order[$position[$i]-1].")<br>";
} // for } // for
} // if up } // if up
@@ -177,8 +153,14 @@ if ($form->my_page_name == 'edit_order') {
} }
$q .= "ORDER BY order_number"; $q .= "ORDER BY order_number";
// init arrays
$row_data = array();
$options_id = array();
$options_name = array();
$options_selected = array();
// DB read data for menu
while ($res = $form->dbReturn($q)) { while ($res = $form->dbReturn($q)) {
$row_data[] = array ( $row_data[] = array(
"id" => $res[$table_name."_id"], "id" => $res[$table_name."_id"],
"name" => $res["name"], "name" => $res["name"],
"order" => $res["order_number"] "order" => $res["order_number"]
@@ -188,20 +170,17 @@ if ($form->my_page_name == 'edit_order') {
// html title // html title
$HEADER['HTML_TITLE'] = $form->l->__('Edit Order'); $HEADER['HTML_TITLE'] = $form->l->__('Edit Order');
$messages = array (); $messages = array();
// error msg // error msg
if (isset($error)) { if (isset($error)) {
$messages[] = array ('msg' => $msg, 'class' => 'error', 'width' => '100%'); if (!isset($msg)) {
$msg = array();
}
$messages[] = array('msg' => $msg, 'class' => 'error', 'width' => '100%');
} }
$DATA['form_error_msg'] = $messages; $DATA['form_error_msg'] = $messages;
// all the row data // all the row data
$options_id = array ();
$options_name = array ();
$options_selected = array ();
if (!is_array($row_data)) {
$row_data = array ();
}
for ($i = 0; $i < count($row_data); $i ++) { for ($i = 0; $i < count($row_data); $i ++) {
$options_id[] = $i; $options_id[] = $i;
$options_name[] = $row_data[$i]['name']; $options_name[] = $row_data[$i]['name'];
@@ -218,8 +197,8 @@ if ($form->my_page_name == 'edit_order') {
$DATA['options_selected'] = $options_selected; $DATA['options_selected'] = $options_selected;
// hidden list for the data (id, order number) // hidden list for the data (id, order number)
$row_data_id = array (); $row_data_id = array();
$row_data_order = array (); $row_data_order = array();
for ($i = 0; $i < count($row_data); $i++) { for ($i = 0; $i < count($row_data); $i++) {
$row_data_id[] = $row_data[$i]['id']; $row_data_id[] = $row_data[$i]['id'];
$row_data_order[] = $row_data[$i]['order']; $row_data_order[] = $row_data[$i]['order'];
@@ -247,6 +226,7 @@ if ($form->my_page_name == 'edit_order') {
$DATA['table_width'] = $table_width; $DATA['table_width'] = $table_width;
$messages = array();
// write out error / status messages // write out error / status messages
$messages[] = $form->formPrintMsg(); $messages[] = $form->formPrintMsg();
$DATA['form_error_msg'] = $messages; $DATA['form_error_msg'] = $messages;
@@ -268,8 +248,9 @@ if ($form->my_page_name == 'edit_order') {
// build nav from $PAGES ... // build nav from $PAGES ...
if (!isset($PAGES) || !is_array($PAGES)) { if (!isset($PAGES) || !is_array($PAGES)) {
$PAGES = array (); $PAGES = array();
} }
$menuarray = array();
foreach ($PAGES as $PAGE_CUID => $PAGE_DATA) { foreach ($PAGES as $PAGE_CUID => $PAGE_DATA) {
if ($PAGE_DATA['menu'] && $PAGE_DATA['online']) { if ($PAGE_DATA['menu'] && $PAGE_DATA['online']) {
$menuarray[] = $PAGE_DATA; $menuarray[] = $PAGE_DATA;
@@ -288,38 +269,59 @@ if ($form->my_page_name == 'edit_order') {
} }
$position = 0; $position = 0;
for ($i = 1; $i <= count($menuarray); $i ++) { $menu_data = array();
// for ($i = 1; $i <= count($menuarray); $i ++) {
foreach ($menuarray as $i => $data) {
// do that for new array // do that for new array
$j = $i - 1; $j = $i + 1;
$menu_data[$j]['pagename'] = htmlentities($menuarray[($i-1)]['page_name']); $menu_data[$i]['pagename'] = htmlentities($data['page_name']);
$menu_data[$j]['filename'] = $menuarray[($i-1)]['filename'].(isset($menuarray[$j]['query_string']) ? $menuarray[$j]['query_string'] : ''); $menu_data[$i]['filename'] =
if ($i == 1 || !($j % $SPLIT_FACTOR)) { // prefix folder or host name
$menu_data[$j]['splitfactor_in'] = 1; (isset($data['hostname']) && $data['hostname'] ?
$data['hostname'] :
''
).
// filename
(isset($data['filename']) ? $data['filename'] : '').
// query string
(isset($data['query_string']) && $data['query_string'] ?
$data['query_string'] :
''
);
if ($j == 1 || !($i % $SPLIT_FACTOR)) {
$menu_data[$i]['splitfactor_in'] = 1;
} else { } else {
$menu_data[$j]['splitfactor_in'] = 0; $menu_data[$i]['splitfactor_in'] = 0;
} }
if ($menuarray[$j]['filename'] == $form->getPageName()) { // on matching, we also need to check if we are in the same folder
if (isset($data['filename']) &&
$data['filename'] == $form->getPageName() &&
(!isset($data['hostname']) || (
isset($data['hostname']) &&
(!$data['hostname'] || strstr($data['hostname'], CONTENT_PATH) !== false)
))
) {
$position = $j; $position = $j;
$menu_data[$j]['position'] = 1; $menu_data[$i]['position'] = 1;
$menu_data[$j]['popup'] = 0; $menu_data[$i]['popup'] = 0;
} else { } else {
// add query stuff // add query stuff
// HAS TO DONE LATER ... set urlencode, etc ... // HAS TO DONE LATER ... set urlencode, etc ...
// check if popup needed // check if popup needed
if (isset($menuarray[$j]['popup']) && $menuarray[$j]['popup'] == 1) { if (isset($data['popup']) && $data['popup'] == 1) {
$menu_data[$j]['popup'] = 1; $menu_data[$i]['popup'] = 1;
$menu_data[$j]['rand'] = uniqid((string)rand()); $menu_data[$i]['rand'] = uniqid((string)rand());
$menu_data[$j]['width'] = $menuarray[$j]['popup_x']; $menu_data[$i]['width'] = $data['popup_x'];
$menu_data[$j]['height'] = $menuarray[$j]['popup_y']; $menu_data[$i]['height'] = $data['popup_y'];
} else { } else {
$menu_data[$j]['popup'] = 0; $menu_data[$i]['popup'] = 0;
} }
$menu_data[$j]['position'] = 0; $menu_data[$i]['position'] = 0;
} // highlight or not } // highlight or not
if (!($i % $SPLIT_FACTOR) || (($i + 1) > count($menuarray))) { if (!($j % $SPLIT_FACTOR) || (($j + 1) > count($menuarray))) {
$menu_data[$j]['splitfactor_out'] = 1; $menu_data[$i]['splitfactor_out'] = 1;
} else { } else {
$menu_data[$j]['splitfactor_out'] = 0; $menu_data[$i]['splitfactor_out'] = 0;
} }
} // for } // for
// $form->debug('MENU ARRAY', $form->printAr($menu_data)); // $form->debug('MENU ARRAY', $form->printAr($menu_data));
@@ -338,7 +340,7 @@ if ($form->my_page_name == 'edit_order') {
$DATA['form_my_page_name'] = $form->my_page_name; $DATA['form_my_page_name'] = $form->my_page_name;
$DATA['filename_exist'] = 0; $DATA['filename_exist'] = 0;
$DATA['drop_down_input'] = 0; $DATA['drop_down_input'] = 0;
$elements = array();
// depending on the "getPageName()" I show different stuff // depending on the "getPageName()" I show different stuff
switch ($form->my_page_name) { switch ($form->my_page_name) {
case 'edit_users': case 'edit_users':
@@ -375,14 +377,35 @@ if ($form->my_page_name == 'edit_order') {
if (!isset($form->table_array['edit_page_id']['value'])) { if (!isset($form->table_array['edit_page_id']['value'])) {
$q = "DELETE FROM temp_files"; $q = "DELETE FROM temp_files";
$form->dbExec($q); $form->dbExec($q);
// gets all files in the current dir ending with .php // gets all files in the current dir and dirs given ending with .php
$crap = exec('ls *.php', $output, $status); $folders = array('../admin/', '../frontend/');
// now get all that are NOT in de DB $files = array('*.php');
$q = "INSERT INTO temp_files VALUES "; $search_glob = array();
for ($i = 0; $i < count($output); $i ++) { foreach ($folders as $folder) {
$t_q = "('".$form->dbEscapeString($output[$i])."')"; // make sure this folder actually exists
$form->dbExec($q.$t_q, 'NULL'); if (is_dir(ROOT.$folder)) {
foreach ($files as $file) {
$search_glob[] = $folder.$file;
}
}
} }
$crap = exec('ls '.join(' ', $search_glob), $output, $status);
// now get all that are NOT in de DB
$q = "INSERT INTO temp_files (folder, filename) VALUES ";
$t_q = '';
foreach ($output as $output_file) {
// split the ouput into folder and file
// eg ../admin/test.php is ../admin/ and test.php
preg_match("/([\.\/\w]+\/)+(\w+\.\w{1,})$/", $output_file, $matches);
// if named config.php, skip
if ($matches[2] != 'config.php') {
if ($t_q) {
$t_q .= ', ';
}
$t_q .= "('".$form->dbEscapeString($matches[1])."', '".$form->dbEscapeString($matches[2])."')";
}
}
$form->dbExec($q.$t_q, 'NULL');
$elements[] = $form->formCreateElement('filename'); $elements[] = $form->formCreateElement('filename');
} else { } else {
// show file menu // show file menu
@@ -390,6 +413,7 @@ if ($form->my_page_name == 'edit_order') {
$DATA['filename_exist'] = 1; $DATA['filename_exist'] = 1;
$DATA['filename'] = $form->table_array['filename']['value']; $DATA['filename'] = $form->table_array['filename']['value'];
} // File Name View IF } // File Name View IF
$elements[] = $form->formCreateElement('hostname');
$elements[] = $form->formCreateElement('name'); $elements[] = $form->formCreateElement('name');
// $elements[] = $form->formCreateElement('tag'); // $elements[] = $form->formCreateElement('tag');
// $elements[] = $form->formCreateElement('min_acl'); // $elements[] = $form->formCreateElement('min_acl');
@@ -467,7 +491,7 @@ if (is_dir(BASE.TEMPLATES_C)) {
if (is_dir(BASE.CACHE)) { if (is_dir(BASE.CACHE)) {
$smarty->setCacheDir(BASE.CACHE); $smarty->setCacheDir(BASE.CACHE);
} }
$smarty->display($EDIT_TEMPLATE, 'editAdmin_'.$lang, 'editAdmin_'.$lang); $smarty->display($EDIT_TEMPLATE, 'editAdmin_'.$smarty->lang, 'editAdmin_'.$smarty->lang);
// debug output // debug output
echo $login->printErrorMsg(); echo $login->printErrorMsg();

Binary file not shown.

Binary file not shown.

View File

@@ -1,27 +1,27 @@
<?php declare(strict_types=1); <?php declare(strict_types=1);
$edit_access = array ( $edit_access = array(
'table_array' => array ( 'table_array' => array(
'edit_access_id' => array ( 'edit_access_id' => array(
'value' => isset($GLOBALS['edit_access_id']) ? $GLOBALS['edit_access_id'] : '', 'value' => isset($GLOBALS['edit_access_id']) ? $GLOBALS['edit_access_id'] : '',
'type' => 'hidden', 'type' => 'hidden',
'pk' => 1 'pk' => 1
), ),
'name' => array ( 'name' => array(
'value' => isset($GLOBALS['name']) ? $GLOBALS['name'] : '', 'value' => isset($GLOBALS['name']) ? $GLOBALS['name'] : '',
'output_name' => $this->l->__('Access Group Name'), 'output_name' => 'Access Group Name',
'mandatory' => 1, 'mandatory' => 1,
'type' => 'text', 'type' => 'text',
'error_check' => 'alphanumericspace|unique' 'error_check' => 'alphanumericspace|unique'
), ),
'description' => array ( 'description' => array(
'value' => isset($GLOBALS['description']) ? $GLOBALS['description'] : '', 'value' => isset($GLOBALS['description']) ? $GLOBALS['description'] : '',
'output_name' => $this->l->__('Description'), 'output_name' => 'Description',
'type' => 'textarea' 'type' => 'textarea'
), ),
'color' => array ( 'color' => array(
'value' => isset($GLOBALS['color']) ? $GLOBALS['color'] : '', 'value' => isset($GLOBALS['color']) ? $GLOBALS['color'] : '',
'output_name' => $this->l->__('Color'), 'output_name' => 'Color',
'mandatory' => 0, 'mandatory' => 0,
'type' => 'text', 'type' => 'text',
'size' => 6, 'size' => 6,
@@ -30,27 +30,27 @@ $edit_access = array (
'error_regex' => "/[\dA-Fa-f]{6}/", 'error_regex' => "/[\dA-Fa-f]{6}/",
'error_example' => 'F6A544' 'error_example' => 'F6A544'
), ),
'enabled' => array ( 'enabled' => array(
'value' => isset($GLOBALS['enabled']) ? $GLOBALS['enabled'] : 0, 'value' => isset($GLOBALS['enabled']) ? $GLOBALS['enabled'] : 0,
'output_name' => 'Enabled', 'output_name' => 'Enabled',
'type' => 'binary', 'type' => 'binary',
'int' => 1, // OR 'bool' => 1 'int' => 1, // OR 'bool' => 1
'element_list' => array ( 'element_list' => array(
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
) )
), ),
'protected' => array ( 'protected' => array(
'value' => isset($GLOBALS['protected']) ? $GLOBALS['protected'] : 0, 'value' => isset($GLOBALS['protected']) ? $GLOBALS['protected'] : 0,
'output_name' => 'Protected', 'output_name' => 'Protected',
'type' => 'binary', 'type' => 'binary',
'int' => 1, 'int' => 1,
'element_list' => array ( 'element_list' => array(
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
) )
), ),
'additional_acl' => array ( 'additional_acl' => array(
'value' => isset($GLOBALS['additional_acl']) ? $GLOBALS['additional_acl'] : '', 'value' => isset($GLOBALS['additional_acl']) ? $GLOBALS['additional_acl'] : '',
'output_name' => 'Additional ACL (as JSON)', 'output_name' => 'Additional ACL (as JSON)',
'type' => 'textarea', 'type' => 'textarea',
@@ -61,41 +61,41 @@ $edit_access = array (
), ),
'table_name' => 'edit_access', 'table_name' => 'edit_access',
"load_query" => "SELECT edit_access_id, name FROM edit_access ORDER BY name", "load_query" => "SELECT edit_access_id, name FROM edit_access ORDER BY name",
'show_fields' => array ( 'show_fields' => array(
array ( array(
'name' => 'name' 'name' => 'name'
) )
), ),
'element_list' => array ( 'element_list' => array(
'edit_access_data' => array ( 'edit_access_data' => array(
'output_name' => 'Edit Access Data', 'output_name' => 'Edit Access Data',
'delete_name' => 'remove_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 // '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 'max_empty' => 5, # maxium visible if no data is set, if filled add this number to visible
'prefix' => 'ead', 'prefix' => 'ead',
'elements' => array ( 'elements' => array(
'name' => array ( 'name' => array(
'type' => 'text', 'type' => 'text',
'error_check' => 'alphanumeric|unique', 'error_check' => 'alphanumeric|unique',
'output_name' => 'Name', 'output_name' => 'Name',
'mandatory' => 1 'mandatory' => 1
), ),
'value' => array ( 'value' => array(
'type' => 'text', 'type' => 'text',
'output_name' => 'Value' 'output_name' => 'Value'
), ),
'enabled' => array ( 'enabled' => array(
'type' => 'checkbox', 'type' => 'checkbox',
'output_name' => 'Activate', 'output_name' => 'Activate',
'int' => 1, 'int' => 1,
'element_list' => array(1) 'element_list' => array(1)
), ),
/*'edit_access_id' => array ( /*'edit_access_id' => array(
'int' => 1, 'int' => 1,
'type' => 'hidden', 'type' => 'hidden',
'fk_id' => 1 # reference main key from master table above 'fk_id' => 1 # reference main key from master table above
),*/ ),*/
'edit_access_data_id' => array ( 'edit_access_data_id' => array(
'type' => 'hidden', 'type' => 'hidden',
'int' => 1, 'int' => 1,
'pk_id' => 1 'pk_id' => 1

View File

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

View File

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

View File

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

View File

@@ -1,40 +1,45 @@
<?php declare(strict_types=1); <?php declare(strict_types=1);
$edit_pages = array ( $edit_pages = array(
'table_array' => array ( 'table_array' => array(
'edit_page_id' => array ( 'edit_page_id' => array(
'value' => isset($GLOBALS['edit_page_id']) ? $GLOBALS['edit_page_id'] : '', 'value' => isset($GLOBALS['edit_page_id']) ? $GLOBALS['edit_page_id'] : '',
'type' => 'hidden', 'type' => 'hidden',
'pk' => 1 'pk' => 1
), ),
'filename' => array ( 'filename' => array(
'value' => isset($GLOBALS['filename']) ? $GLOBALS['filename'] : '', 'value' => isset($GLOBALS['filename']) ? $GLOBALS['filename'] : '',
'output_name' => 'Add File ...', 'output_name' => 'Add File ...',
'mandatory' => 1, 'mandatory' => 1,
'type' => 'drop_down_db', 'type' => 'drop_down_db',
'query' => "SELECT DISTINCT temp_files.filename AS id, temp_files.filename AS name ". 'query' => "SELECT DISTINCT temp_files.filename AS id, temp_files.folder || temp_files.filename AS name ".
"FROM temp_files ". "FROM temp_files ".
"LEFT JOIN edit_page ep ON temp_files.filename = ep.filename ". "LEFT JOIN edit_page ep ON temp_files.filename = ep.filename ".
"WHERE ep.filename IS NULL" "WHERE ep.filename IS NULL"
), ),
'name' => array ( 'hostname' => array(
'value' => isset($GLOBALS['hostname']) ? $GLOBALS['hostname'] : '',
'output_name' => 'Hostname or folder',
'type' => 'text'
),
'name' => array(
'value' => isset($GLOBALS['name']) ? $GLOBALS['name'] : '', 'value' => isset($GLOBALS['name']) ? $GLOBALS['name'] : '',
'output_name' => 'Page name', 'output_name' => 'Page name',
'mandatory' => 1, 'mandatory' => 1,
'type' => 'text' 'type' => 'text'
), ),
'order_number' => array ( 'order_number' => array(
'value' => isset($GLOBALS['order_number']) ? $GLOBALS['order_number'] : '', 'value' => isset($GLOBALS['order_number']) ? $GLOBALS['order_number'] : '',
'output_name' => 'Page order', 'output_name' => 'Page order',
'type' => 'order', 'type' => 'order',
'int' => 1, 'int' => 1,
'order' => 1 'order' => 1
), ),
/* 'flag' => array ( /* 'flag' => array(
'value' => isset($GLOBALS['flag']) ? $GLOBALS['flag'] : '', 'value' => isset($GLOBALS['flag']) ? $GLOBALS['flag'] : '',
'output_name' => 'Page Flag', 'output_name' => 'Page Flag',
'type' => 'drop_down_array', 'type' => 'drop_down_array',
'query' => array ( 'query' => array(
'0' => '0', '0' => '0',
'1' => '1', '1' => '1',
'2' => '2', '2' => '2',
@@ -43,37 +48,37 @@ $edit_pages = array (
'5' => '5' '5' => '5'
) )
),*/ ),*/
'online' => array ( 'online' => array(
'value' => isset($GLOBALS['online']) ? $GLOBALS['online'] : '', 'value' => isset($GLOBALS['online']) ? $GLOBALS['online'] : '',
'output_name' => 'Online', 'output_name' => 'Online',
'int' => 1, 'int' => 1,
'type' => 'binary', 'type' => 'binary',
'element_list' => array ( 'element_list' => array(
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
) )
), ),
'menu' => array ( 'menu' => array(
'value' => isset($GLOBALS['menu']) ? $GLOBALS['menu'] : '', 'value' => isset($GLOBALS['menu']) ? $GLOBALS['menu'] : '',
'output_name' => 'Menu', 'output_name' => 'Menu',
'int' => 1, 'int' => 1,
'type' => 'binary', 'type' => 'binary',
'element_list' => array ( 'element_list' => array(
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
) )
), ),
'popup' => array ( 'popup' => array(
'value' => isset($GLOBALS['popup']) ? $GLOBALS['popup'] : '', 'value' => isset($GLOBALS['popup']) ? $GLOBALS['popup'] : '',
'output_name' => 'Popup', 'output_name' => 'Popup',
'int' => 1, 'int' => 1,
'type' => 'binary', 'type' => 'binary',
'element_list' => array ( 'element_list' => array(
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
) )
), ),
'popup_x' => array ( 'popup_x' => array(
'value' => isset($GLOBALS['popup_x']) ? $GLOBALS['popup_x'] : '', 'value' => isset($GLOBALS['popup_x']) ? $GLOBALS['popup_x'] : '',
'output_name' => 'Popup Width', 'output_name' => 'Popup Width',
'int_null' => 1, 'int_null' => 1,
@@ -81,7 +86,7 @@ $edit_pages = array (
'size' => 4, 'size' => 4,
'length' => 4 'length' => 4
), ),
'popup_y' => array ( 'popup_y' => array(
'value' => isset($GLOBALS['popup_y']) ? $GLOBALS['popup_y'] : '', 'value' => isset($GLOBALS['popup_y']) ? $GLOBALS['popup_y'] : '',
'output_name' => 'Popup Height', 'output_name' => 'Popup Height',
'int_null' => 1, 'int_null' => 1,
@@ -89,7 +94,7 @@ $edit_pages = array (
'size' => 4, 'size' => 4,
'length' => 4 'length' => 4
), ),
'content_alias_edit_page_id' => array ( 'content_alias_edit_page_id' => array(
'value' => isset($GLOBALS['content_alias_edit_page_id']) ? $GLOBALS['content_alias_edit_page_id'] : '', 'value' => isset($GLOBALS['content_alias_edit_page_id']) ? $GLOBALS['content_alias_edit_page_id'] : '',
'output_name' => 'Content Alias Source', 'output_name' => 'Content Alias Source',
'int_null' => 1, 'int_null' => 1,
@@ -107,34 +112,34 @@ $edit_pages = array (
// "ORDER BY order_number" // "ORDER BY order_number"
) )
), ),
'load_query' => "SELECT edit_page_id, filename, name, online, menu, popup FROM edit_page ORDER BY order_number", 'load_query' => "SELECT edit_page_id, CASE WHEN hostname IS NOT NULL THEN hostname ELSE ''::VARCHAR END || filename AS filename, name, online, menu, popup FROM edit_page ORDER BY order_number",
'table_name' => 'edit_page', 'table_name' => 'edit_page',
'show_fields' => array ( 'show_fields' => array(
array ( array(
'name' => 'name' 'name' => 'name'
), ),
array ( array(
'name' => 'filename', 'name' => 'filename',
'before_value' => 'Filename: ' 'before_value' => 'Filename: '
), ),
array ( array(
'name' => 'online', 'name' => 'online',
'binary' => array ('Yes','No'), 'binary' => array('Yes','No'),
'before_value' => 'Online: ' 'before_value' => 'Online: '
), ),
array ( array(
'name' => 'menu', 'name' => 'menu',
'binary' => array ('Yes','No'), 'binary' => array('Yes','No'),
'before_value' => 'Menu: ' 'before_value' => 'Menu: '
), ),
array ( array(
'name' => 'popup', 'name' => 'popup',
'binary' => array ('Yes','No'), 'binary' => array('Yes','No'),
'before_value' => 'Popup: ' 'before_value' => 'Popup: '
) )
), ),
'reference_arrays' => array ( 'reference_arrays' => array(
'edit_visible_group' => array ( 'edit_visible_group' => array(
'table_name' => 'edit_page_visible_group', 'table_name' => 'edit_page_visible_group',
'other_table_pk' => 'edit_visible_group_id', 'other_table_pk' => 'edit_visible_group_id',
'output_name' => 'Visible Groups (access)', 'output_name' => 'Visible Groups (access)',
@@ -143,7 +148,7 @@ $edit_pages = array (
'selected' => isset($GLOBALS['edit_visible_group_id']) ? $GLOBALS['edit_visible_group_id'] : '', 'selected' => isset($GLOBALS['edit_visible_group_id']) ? $GLOBALS['edit_visible_group_id'] : '',
'query' => "SELECT edit_visible_group_id, 'Name: ' || name || ', ' || 'Flag: ' || flag FROM edit_visible_group ORDER BY name" 'query' => "SELECT edit_visible_group_id, 'Name: ' || name || ', ' || 'Flag: ' || flag FROM edit_visible_group ORDER BY name"
), ),
'edit_menu_group' => array ( 'edit_menu_group' => array(
'table_name' => 'edit_page_menu_group', 'table_name' => 'edit_page_menu_group',
'other_table_pk' => 'edit_menu_group_id', 'other_table_pk' => 'edit_menu_group_id',
'output_name' => 'Menu Groups (grouping)', 'output_name' => 'Menu Groups (grouping)',
@@ -154,77 +159,77 @@ $edit_pages = array (
) )
), ),
'element_list' => array ( 'element_list' => array(
'edit_query_string' => array ( 'edit_query_string' => array(
'output_name' => 'Query Strings', 'output_name' => 'Query Strings',
'delete_name' => 'remove_query_string', 'delete_name' => 'remove_query_string',
'prefix' => 'eqs', 'prefix' => 'eqs',
'elements' => array ( 'elements' => array(
'name' => array ( 'name' => array(
'output_name' => 'Name', 'output_name' => 'Name',
'type' => 'text', 'type' => 'text',
'error_check' => 'unique|alphanumeric', 'error_check' => 'unique|alphanumeric',
'mandatory' => 1 'mandatory' => 1
), ),
'value' => array ( 'value' => array(
'output_name' => 'Value', 'output_name' => 'Value',
'type' => 'text' 'type' => 'text'
), ),
'enabled' => array ( 'enabled' => array(
'output_name' => 'Enabled', 'output_name' => 'Enabled',
'int' => 1, 'int' => 1,
'type' => 'checkbox', 'type' => 'checkbox',
'element_list' => array (1) 'element_list' => array(1)
), ),
'dynamic' => array ( 'dynamic' => array(
'output_name' => 'Dynamic', 'output_name' => 'Dynamic',
'int' => 1, 'int' => 1,
'type' => 'checkbox', 'type' => 'checkbox',
'element_list' => array (1) 'element_list' => array(1)
), ),
'edit_query_string_id' => array ( 'edit_query_string_id' => array(
'type' => 'hidden', 'type' => 'hidden',
'pk_id' => 1 'pk_id' => 1
) )
) // elements ) // elements
), // query_string element list ), // query_string element list
'edit_page_content' => array ( 'edit_page_content' => array(
'output_name' => 'Page Content', 'output_name' => 'Page Content',
'delete_name' => 'remove_page_content', 'delete_name' => 'remove_page_content',
'prefix' => 'epc', 'prefix' => 'epc',
'elements' => array ( 'elements' => array(
'name' => array ( 'name' => array(
'output_name' => 'Content', 'output_name' => 'Content',
'type' => 'text', 'type' => 'text',
'error_check' => 'alphanumeric', 'error_check' => 'alphanumeric',
'mandatory' => 1 'mandatory' => 1
), ),
'uid' => array ( 'uid' => array(
'output_name' => 'UID', 'output_name' => 'UID',
'type' => 'text', 'type' => 'text',
'error_check' => 'unique|alphanumeric', 'error_check' => 'unique|alphanumeric',
'mandatory' => 1 'mandatory' => 1
), ),
'order_number' => array ( 'order_number' => array(
'output_name' => 'Order', 'output_name' => 'Order',
'type' => 'text', 'type' => 'text',
'error_check' => 'int', 'error_check' => 'int',
'mandatory' => 1 'mandatory' => 1
), ),
'online' => array ( 'online' => array(
'output_name' => 'Online', 'output_name' => 'Online',
'int' => 1, 'int' => 1,
'type' => 'checkbox', 'type' => 'checkbox',
'element_list' => array (1) 'element_list' => array(1)
), ),
'edit_access_right_id' => array ( 'edit_access_right_id' => array(
'type' => 'drop_down_db', 'type' => 'drop_down_db',
'output_name' => 'Access Level', 'output_name' => 'Access Level',
'int' => 1, 'int' => 1,
'preset' => 1, // first of the select 'preset' => 1, // first of the select
'query' => "SELECT edit_access_right_id, name FROM edit_access_right ORDER BY level" 'query' => "SELECT edit_access_right_id, name FROM edit_access_right ORDER BY level"
), ),
'edit_page_content_id' => array ( 'edit_page_content_id' => array(
'type' => 'hidden', 'type' => 'hidden',
'pk_id' => 1 'pk_id' => 1
) )

View File

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

View File

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

View File

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

View File

@@ -1,113 +0,0 @@
{*
********************************************************************
* AUTHOR: Clemens Schwaighofer
* DATE: 2007/10/18
* DESCRIPTION:
* content main part (buttons, load, etc)
* HISTORY:
********************************************************************
*}
<script language="JavaScript">
<!--
var form_name = '{$form_name}';
var load_id = '{if $primary_key}{$primary_key}{else}0{/if}';
var show_sort = {$show_sort};
//-->
</script>
<div style="position:relative; width: {$table_width}px; margin-top: 5px; margin-bottom: 5px; top: 0px; left: 0px;">
<div id="main_menu" style="position: absolute; top: 0px; left: 0px; width: 750px; height: 550px; z-index: 5; overflow: auto; padding: 2px; visibility: hidden;" class="sidemenu">
<div style="position: absolute; top: 2px; left: 2px;">
<input type="button" id="show_menu" name="show_menu" value="{t}Close Menu{/t}" OnClick="ShowHideMenu('hide', 'main_menu');"> {if $primary_key}<a href="#{$primary_key}">&darr;</a>{/if}&nbsp;<input type="text" id="search" name="search" value="{$search}" OnKeyup="QuickSearch(); return false;" {popup text="Search" width="150"}> <span id="search_status">{t}Enter Value{/t}</span>
<div id="search_found">{t 1=$menu_elements}Found: %1{/t}</div>
</div>
<div id="search_results" style="position: relative; top: 32px; left: 2px; padding: 2px; margin: 2px; width: 95%; height: 90%; overflow: auto; visibility: hidden; display: none; z-index: 3;">
</div>
<div id="element_list" style="position: relative; top: 32px; left: 2px; padding: 2px; margin: 2px; width: 95%; height: 90%; overflow: auto; z-index: 3;">
{foreach from=$table_menu key=key item=item}
{if $s_title != $item.title && $item.title}
{assign var='s_title' value=$item.title}
<div style="font-weight: bold;">{$item.title}</div>
{/if}
{if $show_sort}
{strip}
<span style="font-family: monospace;">[
{if $item.order_move == '-' || !$item.order_move}
&nbsp;
{/if}
{if $item.order_move == '+' || $item.order_move == '*'}
<a href="javascript:me({$item.id}, '+');" {popup text="Up" width="20"}>&uarr;</a>
{/if}
{if $item.order_move == '-' || $item.order_move == '*'}
<a href="javascript:me({$item.id}, '-');" {popup text="Down" width="20"}>&darr;</a>
{/if}
{if $item.order_move == '+' || !$item.order_move}
&nbsp;
{/if}
]</span>
{/strip}
{/if}
<a name="{$item.id}"></a>
{if $item.key}[{$item.key}] {/if}{if $item.status}[{$item.status}] {/if}<a href="javascript:le('{$item.id}');" class="{if $item.deleted == 't' && $primary_key == $item.id}item_loaded_deleted{elseif $item.deleted == 't'}item_deleted{elseif $primary_key == $item.id}item_loaded{/if}" {popup text="`$item.desc`" caption="Info" width="350"}>{$item.name}</a><br>
{/foreach}
</div>
<div style="position: absolute; bottom: 2px; left: 2px; z-index: 5;">
<input type="button" id="show_menu" name="show_menu" value="{t}Close Menu{/t}" OnClick="ShowHideMenu('hide', 'main_menu');">
</div>
</div>
<div style="position: relative; top: 0px; left: 0px; width: 790px; z-index: 0; margin: 2px; padding: 2px;">
<form method="post" name="{$form_name}" enctype="multipart/form-data">
{* menu button *}
{if !$hide_menu}
<div style="margin-bottom: 2px; padding: 2px; position: relative;">
<input type="button" id="show_menu" name="show_menu" value="{t}Show Menu{/t}" OnClick="ShowHideMenu('show', 'main_menu');" {if $page_acl < 20}disabled{/if}>
</div>
{/if}
{* save, delete commands *}
<div style="margin-bottom: 2px; padding: 2px; position: relative;" class="buttongroup">
<div style="margin-bottom: 2px; padding: 2px; position: relative; height: 20px;">
<input type="button" name="new" value="{t}New{/t}" OnClick="document.{$form_name}.action.value='new';document.{$form_name}.action_yes.value=confirm('{t}Do you want to create a new entry entry?{/t}');if (document.{$form_name}.action_yes.value == 'true') document.{$form_name}.submit();" {if $page_acl < 60}disabled{/if}>
<input type="button" name="save" value="{t}Save{/t}" OnClick="document.{$form_name}.action.value='save';document.{$form_name}.submit();" {if $page_acl < 60}disabled{/if}>
{if $show_delete_button && !$show_undelete_button}
<input type="button" name="delete" value="{t}Delete{/t}" OnClick="document.{$form_name}.action.value='delete';document.{$form_name}.action_yes.value=confirm('{t}Do you want to delete this entry?{/t}');document.{$form_name}.action_id.value='{$primary_key}';if (document.{$form_name}.action_yes.value == 'true') document.{$form_name}.submit();" {if $page_acl < 80}disabled{/if}>
{/if}
{if $show_delete_button && $show_undelete_button}
<input type="button" name="un_delete" value="{t}Un-Delete{/t}" OnClick="document.{$form_name}.action.value='undelete';document.{$form_name}.action_yes.value=confirm('{t}Do you want to undelete this entry?{/t}');document.{$form_name}.action_id.value='{$primary_key}';if (document.{$form_name}.action_yes.value == 'true') document.{$form_name}.submit();" {if $page_acl < 80}disabled{/if}>
{/if}
</div>
</div>
{* status messages *}
<div id="status_message" style="margin-bottom: 2px; padding: 2px; text-align: center; position: relative; visibility: hidden;">
</div>
{* main grouping *}
<div style="margin-bottom: 5px; padding: 2px; position: relative; min-height: 400px;" class="{$status_color}">
{include file=$CONTENT_INCLUDE}
</div>
{* save, delete commands *}
<div style="margin-bottom: 2px; padding: 2px; position: relative;" class="buttongroup">
<div style="margin-bottom: 2px; padding: 2px; position: relative; height: 20px;">
<input type="button" name="new" value="{t}New{/t}" OnClick="document.{$form_name}.action.value='new';document.{$form_name}.action_yes.value=confirm('{t}Do you want to create a new entry entry?{/t}');if (document.{$form_name}.action_yes.value == 'true') document.{$form_name}.submit();" {if $page_acl < 60}disabled{/if}>
<input type="button" name="save" value="{t}Save{/t}" OnClick="document.{$form_name}.action.value='save';document.{$form_name}.submit();" {if $page_acl < 60}disabled{/if}>
{if $show_delete_button && !$show_undelete_button}
<input type="button" name="delete" value="{t}Delete{/t}" OnClick="document.{$form_name}.action.value='delete';document.{$form_name}.action_yes.value=confirm('{t}Do you want to delete this entry?{/t}');document.{$form_name}.action_id.value='{$primary_key}';if (document.{$form_name}.action_yes.value == 'true') document.{$form_name}.submit();" {if $page_acl < 80}disabled{/if}>
{/if}
{if $show_delete_button && $show_undelete_button}
<input type="button" name="un_delete" value="{t}Un-Delete{/t}" OnClick="document.{$form_name}.action.value='undelete';document.{$form_name}.action_yes.value=confirm('{t}Do you want to undelete this entry?{/t}');document.{$form_name}.action_id.value='{$primary_key}';if (document.{$form_name}.action_yes.value == 'true') document.{$form_name}.submit();" {if $page_acl < 80}disabled{/if}>
{/if}
</div>
</div>
{* hidden group *}
<input type="hidden" id="primary_key" name="primary_key" value="{$primary_key}">
{* action var set *}
<input type="hidden" id="action" name="action" value="">
<input type="hidden" id="action_flag" name="action_flag" value="">
<input type="hidden" id="action_yes" name="action_yes" value="">
<input type="hidden" id="action_id" name="action_id" value="">
<input type="hidden" id="action_value" name="action_value" value="">
<input type="hidden" id="action_menu" name="action_menu" value="">
<input type="hidden" id="action_error" name="action_error" value="">
<input type="hidden" name="action_loaded" value="true">
</form>
</div>
</div>

View File

@@ -1,42 +0,0 @@
{*
********************************************************************
* AUTHOR: Clemens Schwaighofer
* DATE: 2007/10/18
* DESCRIPTION:
* content main part (buttons, load, etc)
* HISTORY:
********************************************************************
*}
<script language="JavaScript">
<!--
var form_name = '{$form_name}';
var load_id = '{if $primary_key}{$primary_key}{/if}';
var show_sort = {if $show_sort}{$show_sort}{else}0{/if};
//-->
</script>
<div style="width: {$table_width}px; margin-top: 5px; margin-bottom: 5px;">
<form method="post" name="{$form_name}" enctype="multipart/form-data">
{* save, delete commands *}
<div style="margin-bottom: 2px; padding: 2px;" class="buttongroup">
{include file=cms_buttons.tpl}
</div>
{include file=$CONTENT_INCLUDE}
{* save, delete commands *}
<div style="margin-bottom: 2px; padding: 2px;" class="buttongroup">
{include file=cms_buttons.tpl}
</div> <!-- button close //-->
{* hidden group *}
<input type="hidden" id="primary_key" name="primary_key" value="{$primary_key}">
{* action var set *}
<input type="hidden" id="action" name="action" value="">
<input type="hidden" id="action_flag" name="action_flag" value="">
<input type="hidden" id="action_yes" name="action_yes" value="">
<input type="hidden" id="action_id" name="action_id" value="">
<input type="hidden" id="action_value" name="action_value" value="">
<input type="hidden" id="action_menu" name="action_menu" value="">
<input type="hidden" id="action_error" name="action_error" value="">
<input type="hidden" name="action_loaded" value="true">
</form>
</div>

View File

@@ -1,19 +0,0 @@
{*
********************************************************************
* AUTHOR: Clemens Schwaighofer
* DATE: 2007/10/18
* DESCRIPTION:
* content main part (buttons, load, etc)
* HISTORY:
********************************************************************
*}
<script language="JavaScript">
<!--
var form_name = '{$form_name}';
var load_id = {if $primary_key}{$primary_key}{else}0{/if};
var show_sort = {if $show_sort}{$show_sort}{else}0{/if};
//-->
</script>
{include file=$CONTENT_INCLUDE}

View File

@@ -1,91 +0,0 @@
{*
********************************************************************
* AUTHOR: Clemens Schwaighofer
* DATE: 2008/04/11
* DESCRIPTION:
* special content main part (buttons, load, etc)
* HISTORY:
********************************************************************
*}
<script language="JavaScript">
<!--
var form_name = '{$form_name}';
var load_id = {if $primary_key}{$primary_key}{else}0{/if};
//-->
</script>
<div style="position:relative; width: {$table_width}px; margin-top: 5px; margin-bottom: 5px; top: 0px; left: 0px;">
<div style="position: relative; top: 0px; left: 0px; width: 790px; z-index: 0; margin: 2px; padding: 2px;">
<form method="post" name="{$form_name}">
{* save, delete commands *}
<div style="margin: 2px; padding: 2px; position: relative;" class="buttongroup">
<div style="padding: 2px; position: relative; height: 20px;">
<input type="button" name="new" value="{t}New{/t}" OnClick="document.{$form_name}.action.value='new';document.{$form_name}.action_yes.value=confirm('{t}Do you want to create a new entry entry?{/t}');if (document.{$form_name}.action_yes.value == 'true') document.{$form_name}.submit();" {if $page_acl < 60}disabled{/if}>
<input type="button" name="save" value="{t}Save{/t}" OnClick="document.{$form_name}.action.value='save';document.{$form_name}.submit();" {if $page_acl < 60}disabled{/if}>
{if $show_delete_button && !$show_undelete_button}
<input type="button" name="delete" value="{t}Delete{/t}" OnClick="document.{$form_name}.action.value='delete';document.{$form_name}.action_yes.value=confirm('{t}Do you want to delete this entry?{/t}');document.{$form_name}.action_id.value={$primary_key};if (document.{$form_name}.action_yes.value == 'true') document.{$form_name}.submit();" {if $page_acl < 80}disabled{/if}>
{/if}
{if $show_delete_button && $show_undelete_button}
<input type="button" name="un_delete" value="{t}Un-Delete{/t}" OnClick="document.{$form_name}.action.value='undelete';document.{$form_name}.action_yes.value=confirm('{t}Do you want to undelete this entry?{/t}');document.{$form_name}.action_id.value={$primary_key};if (document.{$form_name}.action_yes.value == 'true') document.{$form_name}.submit();" {if $page_acl < 80}disabled{/if}>
{/if}
</div>
</div>
{* status messages *}
<div id="status_message" style="margin-bottom: 2px; padding: 2px; text-align: center; position: relative; visibility: hidden; display: none;">
</div>
{* main grouping *}
<div>
<div class="spacer"></div>
<div id="main_menu" style="float: left; position: relative; width: 200px; height: 450px; z-index: 5; overflow: auto; padding: 2px; margin: 2px;" class="sidemenu">
<div style="position: absolute; top: 2px; left: 2px;">
{if $primary_key}<a href="#{$primary_key}">&darr;</a>{/if}&nbsp;<input type="text" id="search" name="search" size="15" value="{$search}" OnKeyup="QuickSearch(); return false;" {popup text="Search" width="150"}> <span id="search_status">{t}Search{/t}</span>
<div id="search_found">{t}Found:{/t} {$menu_elements}</div>
</div>
<div id="search_results" style="position: relative; top: 32px; left: 2px; padding: 2px; margin: 2px; width: 95%; height: 90%; overflow: auto; visibility: hidden; display: none;">
</div>
<div id="element_list" style="position: relative; top: 32px; left: 2px; padding: 2px; margin: 2px; width: 95%; height: 90%; overflow: auto;">
{foreach from=$table_menu key=key item=item}
<a name="{$item.id}"></a>
{if $item.key}[{$item.key}] {/if}{if $item.status}[{$item.status}] {/if}<a href="javascript:le({$item.id});" class="{if $item.deleted == 't' && $primary_key == $item.id}item_loaded_deleted{elseif $item.deleted == 't'}item_deleted{elseif $primary_key == $item.id}item_loaded{/if}">{$item.name}</a><br>
{/foreach}
</div>
</div>
<div style="float: left; margin: 2px; padding: 2px; position: relative; width: 570px; min-height: 450px;" class="{$status_color}">
{* START CONTENT *}
{include file="$CONTENT_INCLUDE"}
{* END CONTENT *}
</div>
<div class="spacer"></div>
{* END MENU / CONTENT BLOCK *}
</div>
{* save, delete commands *}
<div style="margin: 2px; padding: 2px; position: relative;" class="buttongroup">
<div style="padding: 2px; position: relative; height: 20px;">
<input type="button" name="new" value="{t}New{/t}" OnClick="document.{$form_name}.action.value='new';document.{$form_name}.action_yes.value=confirm('{t}Do you want to create a new entry entry?{/t}');if (document.{$form_name}.action_yes.value == 'true') document.{$form_name}.submit();" {if $page_acl < 60}disabled{/if}>
<input type="button" name="save" value="{t}Save{/t}" OnClick="document.{$form_name}.action.value='save';document.{$form_name}.submit();" {if $page_acl < 60}disabled{/if}>
{if $show_delete_button && !$show_undelete_button}
<input type="button" name="delete" value="{t}Delete{/t}" OnClick="document.{$form_name}.action.value='delete';document.{$form_name}.action_yes.value=confirm('{t}Do you want to delete this entry?{/t}');document.{$form_name}.action_id.value={$primary_key};if (document.{$form_name}.action_yes.value == 'true') document.{$form_name}.submit();" {if $page_acl < 80}disabled{/if}>
{/if}
{if $show_delete_button && $show_undelete_button}
<input type="button" name="un_delete" value="{t}Un-Delete{/t}" OnClick="document.{$form_name}.action.value='undelete';document.{$form_name}.action_yes.value=confirm('{t}Do you want to undelete this entry?{/t}');document.{$form_name}.action_id.value={$primary_key};if (document.{$form_name}.action_yes.value == 'true') document.{$form_name}.submit();" {if $page_acl < 80}disabled{/if}>
{/if}
</div>
</div>
{* hidden group *}
<input type="hidden" id="primary_key" name="primary_key" value="{$primary_key}">
{* action var set *}
<input type="hidden" id="action" name="action" value="">
<input type="hidden" id="action_flag" name="action_flag" value="">
<input type="hidden" id="action_yes" name="action_yes" value="">
<input type="hidden" id="action_id" name="action_id" value="">
<input type="hidden" id="action_value" name="action_value" value="">
<input type="hidden" id="action_menu" name="action_menu" value="">
<input type="hidden" id="action_error" name="action_error" value="">
<input type="hidden" name="action_loaded" value="true">
</form>
</div>
</div>

View File

@@ -1,6 +1,9 @@
<div> <div>
{$SMARTY_TEST} {$SMARTY_TEST}
</div> </div>
<div>
TRANSLATION CLASS: {$TRANSLATE_TEST}
</div>
<div> <div>
<select id="drop_down_test" name="drop_down_test"> <select id="drop_down_test" name="drop_down_test">
{html_options options=$drop_down_test selected=$drop_down_test_selected} {html_options options=$drop_down_test selected=$drop_down_test_selected}
@@ -11,6 +14,9 @@
<div id="test-div" class="test-div"> <div id="test-div" class="test-div">
Some content ehre or asdfasdfasf Some content ehre or asdfasdfasf
</div> </div>
<div id="translate-div">
TRANSLATION SMARTY: {t}I should be translated{/t}
</div>
</div> </div>
</div> </div>
{* progresss indicator *} {* progresss indicator *}

2
www/layout/admin/cache/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
*
!.gitignore

View File

@@ -0,0 +1,2 @@
*
!.gitignore

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 489 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 807 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,4 +1,5 @@
/* general edit javascript */ /* general edit javascript */
/* jquery version */
/* jshint esversion: 6 */ /* jshint esversion: 6 */
@@ -11,19 +12,21 @@ if (!DEBUG) {
}); });
}*/ }*/
// METHOD: pop /**
// PARAMS: url, window name, features * opens a popup window with winName and given features (string)
// RETURN: none * @param {String} theURL the url
// DESC : opens a popup window with winNAme and given features (string) * @param {String} winName window name
* @param {Object} features popup features
*/
function pop(theURL, winName, features) { function pop(theURL, winName, features) {
winName = window.open(theURL, winName, features); winName = window.open(theURL, winName, features);
winName.focus(); winName.focus();
} }
// METHOD: expandTA /**
// PARAMS: id * automatically resize a text area based on the amount of lines in it
// RETURN: none * @param {[string} ta_id element id
// DESC : automatically resize a text area based on the amount of lines in it */
function expandTA(ta_id) { function expandTA(ta_id) {
var ta; var ta;
// if a string comes, its a get by id, else use it as an element pass on // if a string comes, its a get by id, else use it as an element pass on
@@ -44,10 +47,10 @@ function expandTA(ta_id) {
ta.rows = numNewRows + theRows.length; ta.rows = numNewRows + theRows.length;
} }
// METHOD: getWindowSize /**
// PARAMS: none * wrapper to get the real window size for the current browser window
// RETURN: array with width/height * @return {Object} object with width/height
// DESC : wrapper to get the real window size for the current browser window */
function getWindowSize() function getWindowSize()
{ {
var width, height; var width, height;
@@ -59,10 +62,10 @@ function getWindowSize()
}; };
} }
// METHOD: getScrollOffset /**
// PARAMS: none * wrapper to get the correct scroll offset
// RETURN: array with x/y px * @return {Object} object with x/y px
// DESC : wrapper to get the correct scroll offset */
function getScrollOffset() function getScrollOffset()
{ {
var left, top; var left, top;
@@ -74,16 +77,19 @@ function getScrollOffset()
}; };
} }
// METHOD: setCenter /**
// PARAMS: id to set center * centers div to current window size middle
// RETURN: none * @param {String} id element to center
// DESC : centers div to current window size middle * @param {Boolean} left if true centers to the middle from the left
* @param {Boolean} top if true centers to the middle from the top
*/
function setCenter(id, left, top) function setCenter(id, left, top)
{ {
// get size of id // get size of id
var dimensions = {}; var dimensions = {
dimensions.height = $('#' + id).height(); height: $('#' + id).height(),
dimensions.width = $('#' + id).width(); width: $('#' + id).width()
};
var type = $('#' + id).css('position'); var type = $('#' + id).css('position');
var viewport = getWindowSize(); var viewport = getWindowSize();
var offset = getScrollOffset(); var offset = getScrollOffset();
@@ -107,10 +113,11 @@ function setCenter(id, left, top)
} }
} }
// METHOD: goToPos() /**
// PARAMS: element, offset (default 0) * goes to an element id position
// RETURN: none * @param {String} element element id to move to
// DESC: goes to an element id position * @param {Number} offset offset from top, default is 0 (px)
*/
function goToPos(element, offset = 0) function goToPos(element, offset = 0)
{ {
try { try {
@@ -125,10 +132,12 @@ function goToPos(element, offset = 0)
} }
} }
// METHOD: __ /**
// PARAMS: text * uses the i18n object created in the translation template
// RETURN: translated text (based on PHP selected language) * that is filled from gettext in PHP
// DESC : uses the i18n array created in the translation template, that is filled from gettext in PHP (Smarty) * @param {String} string text to translate
* @return {String} translated text (based on PHP selected language)
*/
function __(string) function __(string)
{ {
if (typeof i18n !== 'undefined' && isObject(i18n) && i18n[string]) { if (typeof i18n !== 'undefined' && isObject(i18n) && i18n[string]) {
@@ -138,12 +147,13 @@ function __(string)
} }
} }
// METHOD: string.format /**
// PARAMS: any, for string format * simple sprintf formater for replace
// RETURN: formatted string * usage: "{0} is cool, {1} is not".format("Alpha", "Beta");
// DESC : simple sprintf formater for replace * First, checks if it isn't implemented yet.
// "{0} is cool, {1} is not".format("Alpha", "Beta"); * @param {String} !String.prototype.format string with elements to be replaced
// First, checks if it isn't implemented yet. * @return {String} Formated string
*/
if (!String.prototype.format) { if (!String.prototype.format) {
String.prototype.format = function() String.prototype.format = function()
{ {
@@ -158,25 +168,33 @@ if (!String.prototype.format) {
}; };
} }
// METHOD: numberWithCommas /**
// PARAMS: number * formats flat number 123456 to 123,456
// RETURN: formatted with , in thousands * @param {Number} x number to be formated
// DESC : formats flat number 123456 to 123,456 * @return {String} formatted with , in thousands
const numberWithCommas = (x) => { */
function numberWithCommas(x)
{
var parts = x.toString().split("."); var parts = x.toString().split(".");
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ","); parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",");
return parts.join("."); return parts.join(".");
}; }
// METHOD: /**
// PARAMS: string * converts line breaks to br
// RETURN: string with <br> * @param {String} string any string
// DESC : converts line breaks to br * @return {String} string with <br>
*/
function convertLBtoBR(string) function convertLBtoBR(string)
{ {
return string.replace(/(?:\r\n|\r|\n)/g, '<br>'); return string.replace(/(?:\r\n|\r|\n)/g, '<br>');
} }
/**
* escape HTML string
* @param {String} !String.prototype.escapeHTML HTML data string to be escaped
* @return {String} escaped string
*/
if (!String.prototype.escapeHTML) { if (!String.prototype.escapeHTML) {
String.prototype.escapeHTML = function() { String.prototype.escapeHTML = function() {
return this.replace(/[&<>"'\/]/g, function (s) { return this.replace(/[&<>"'\/]/g, function (s) {
@@ -194,6 +212,11 @@ if (!String.prototype.escapeHTML) {
}; };
} }
/**
* unescape a HTML encoded string
* @param {String} !String.prototype.unescapeHTML data with escaped entries
* @return {String} HTML formated string
*/
if (!String.prototype.unescapeHTML) { if (!String.prototype.unescapeHTML) {
String.prototype.unescapeHTML = function() { String.prototype.unescapeHTML = function() {
return this.replace(/&[#\w]+;/g, function (s) { return this.replace(/&[#\w]+;/g, function (s) {
@@ -211,31 +234,33 @@ if (!String.prototype.unescapeHTML) {
}; };
} }
// METHOD: getTimestamp /**
// PARAMS: none * returns current timestamp (unix timestamp)
// RETURN: timestamp (in milliseconds) * @return {Number} timestamp (in milliseconds)
// DESC : returns current timestamp (unix timestamp) */
function getTimestamp() function getTimestamp()
{ {
var date = new Date(); var date = new Date();
return date.getTime(); return date.getTime();
} }
// METHOD: dec2hex /**
// PARAMS: decimal string * dec2hex :: Integer -> String
// RETURN: string * i.e. 0-255 -> '00'-'ff'
// DESC : dec2hex :: Integer -> String * @param {Number} dec decimal string
// i.e. 0-255 -> '00'-'ff' * @return {String} hex encdoded number
*/
function dec2hex(dec) function dec2hex(dec)
{ {
return ('0' + dec.toString(16)).substr(-2); return ('0' + dec.toString(16)).substr(-2);
} }
// METHOD: generateId /**
// PARAMS: lenght in int * generateId :: Integer -> String
// RETURN: random string * only works on mondern browsers
// DESC : generateId :: Integer -> String * @param {Number} len length of unique id string
// only works on mondern browsers * @return {String} random string in length of len
*/
function generateId(len) function generateId(len)
{ {
var arr = new Uint8Array((len || 40) / 2); var arr = new Uint8Array((len || 40) / 2);
@@ -243,20 +268,22 @@ function generateId(len)
return Array.from(arr, dec2hex).join(''); return Array.from(arr, dec2hex).join('');
} }
// METHOD: randomIdF() /**
// PARAMS: none * creates a pseudo random string of 10 characters
// RETURN: not true random string * works on all browsers
// DESC : creates a pseudo random string of 10 characters * after many runs it will create duplicates
// after many runs it will create duplicates * @return {String} not true random string
*/
function randomIdF() function randomIdF()
{ {
return Math.random().toString(36).substring(2); return Math.random().toString(36).substring(2);
} }
// METHOD: isObject /**
// PARAMS: possible object * checks if a variable is an object
// RETURN: true/false if it is an object or not * @param {Mixed} val possible object
// DESC : checks if a variable is an object * @return {Boolean} true/false if it is an object or not
*/
function isObject(val) { function isObject(val) {
if (val === null) { if (val === null) {
return false; return false;
@@ -264,47 +291,70 @@ function isObject(val) {
return ((typeof val === 'function') || (typeof val === 'object')); return ((typeof val === 'function') || (typeof val === 'object'));
} }
// METHOD: keyInObject /**
// PARAMS: key name, object * get the length of an object (entries)
// RETURN: true/false if key exists in object * @param {Object} object object to check
// DESC : checks if a key exists in a given object * @return {Number} number of entry
const keyInObject = (key, object) => (key in object) ? true : false; */
/*function keyInObject(key, object) function getObjectCount(object) {
return Object.keys(object).length;
}
/**
* checks if a key exists in a given object
* @param {String} key key name
* @param {Object} object object to search key in
* @return {Boolean} true/false if key exists in object
*/
function keyInObject(key, object)
{ {
return (key in object) ? true : false; return (Object.prototype.hasOwnProperty.call(object, key)) ? true : false;
}*/ }
// METHOD: getKeyByValue /**
// PARAMS: object, value * returns matching key of value
// RETURN: key found * @param {Object} obj object to search value in
// DESC : returns matching key of value * @param {Mixed} value any value (String, Number, etc)
const getKeyByValue = (obj, value) => Object.keys(obj).find(key => obj[key] === value); * @return {String} the key found for the first matching value
// function getKeyByValue(object, value) */
// { function getKeyByValue(object, value)
// return Object.keys(object).find(key => object[key] === value); {
// } return Object.keys(object).find(key => object[key] === value);
// return Object.keys(object).find(function (key) {
// return object[key] === value;
// });
}
// METHOD: valueInObject /**
// PARAMS: obj, value * returns true if value is found in object with a key
// RETURN: true/false * @param {Object} obj object to search value in
// DESC : returns true if value is found in object with a key * @param {Mixed} value any value (String, Number, etc)
const valueInObject = (obj, value) => (Object.keys(obj).find(key => obj[key] === value)) ? true : false; * @return {Boolean} true on value found, false on not found
*/
function valueInObject(object, value)
{
return (Object.keys(object).find(key => object[key] === value)) ? true : false;
// return Object.keys(object).find(function (key) {
// return object[key] === value;
// }) ? true : false;
}
// METHOD: exists /**
// PARAMS: uid * checks if a DOM element actually exists
// RETURN: true/false * @param {String} id Element id to check for
// DESC : checks if a DOM element actually exists * @return {Boolean} true if element exists, false on failure
const exists = (id) => $('#' + id).length > 0 ? true : false; */
/*function exists(id) function exists(id)
{ {
return $('#' + id).length > 0 ? true : false; return $('#' + id).length > 0 ? true : false;
}*/ }
// METHOD: formatBytes /**
// PARAMS: bytes in int * converts a int number into bytes with prefix in two decimals precision
// RETURN: string in GB/MB/KB * currently precision is fixed, if dynamic needs check for max/min precision
// DESC : converts a int number into bytes with prefix in two decimals precision * @param {Number} bytes bytes in int
// currently precision is fixed, if dynamic needs check for max/min precision * @return {String} string in GB/MB/KB
*/
function formatBytes(bytes) function formatBytes(bytes)
{ {
var i = -1; var i = -1;
@@ -312,14 +362,13 @@ function formatBytes(bytes)
bytes = bytes / 1024; bytes = bytes / 1024;
i++; i++;
} while (bytes > 99); } while (bytes > 99);
return parseFloat(Math.round(bytes * Math.pow(10, 2)) / Math.pow(10, 2)) + ['kB', 'MB', 'GB', 'TB', 'PB', 'EB'][i]; return parseFloat(Math.round(bytes * Math.pow(10, 2)) / Math.pow(10, 2)) + ['kB', 'MB', 'GB', 'TB', 'PB', 'EB'][i];
} }
// METHOD: errorCatch /**
// PARAMS: err (error from try/catch * prints out error messages based on data available from the browser
// RETURN: none * @param {Object} err error from try/catch block
// DESC : prints out error messages based on data available from the browser */
function errorCatch(err) function errorCatch(err)
{ {
// for FF & Chrome // for FF & Chrome
@@ -345,45 +394,59 @@ function errorCatch(err)
} }
} }
// METHOD: actionIndicator /**
// PARAMS: none * show or hide the "do" overlay
// RETURN: none * @param {String} loc location name for action indicator
// DESC : show or hide the "do" overlay * default empty. for console.log
function actionIndicator(loc = '') * @param {Boolean} [overlay=true] override the auto hide/show over the overlay div block
*/
function actionIndicator(loc, overlay = true)
{ {
if ($('#overlayBox').is(':visible')) { if ($('#overlayBox').is(':visible')) {
actionIndicatorHide(loc); actionIndicatorHide(loc, overlay);
} else { } else {
actionIndicatorShow(loc); actionIndicatorShow(loc, overlay);
} }
} }
// METHOD: actionIndicatorShow/actionIndicatorHide /**
// PARAMS: loc for console log info * explicit show for action Indicator
// RETURN: none * instead of automatically show or hide, do on command show
// DESC : explicit show/hide for action Indicator * @param {String} loc location name for action indicator
// instead of automatically show or hide, do * default empty. for console.log
// on command * @param {Boolean} [overlay=true] override the auto hide/show over the overlay div block
function actionIndicatorShow(loc = '') */
function actionIndicatorShow(loc, overlay = true)
{ {
console.log('Indicator: SHOW [%s]', loc); console.log('Indicator: SHOW [%s]', loc);
$('#indicator').addClass('progress'); $('#indicator').addClass('progress');
setCenter('indicator', true, true); setCenter('indicator', true, true);
$('#indicator').show(); $('#indicator').show();
overlayBoxShow(); if (overlay === true) {
overlayBoxShow();
}
} }
function actionIndicatorHide(loc = '')
/**
* explicit hide for action Indicator
* instead of automatically show or hide, do on command hide
* @param {String} loc location name for action indicator
* default empty. for console.log
* @param {Boolean} [overlay=true] override the auto hide/show over the overlay div block
*/
function actionIndicatorHide(loc, overlay = true)
{ {
console.log('Indicator: HIDE [%s]', loc); console.log('Indicator: HIDE [%s]', loc);
$('#indicator').hide(); $('#indicator').hide();
$('#indicator').removeClass('progress'); $('#indicator').removeClass('progress');
overlayBoxHide(); if (overlay === true) {
overlayBoxHide();
}
} }
// METHOD: overlayBoxView /**
// PARAMS: none * shows the overlay box
// RETURN: none */
// DESC : shows or hides the overlay box
function overlayBoxShow() function overlayBoxShow()
{ {
// check if overlay box exists and if yes set the z-index to 100 // check if overlay box exists and if yes set the z-index to 100
@@ -393,6 +456,10 @@ function overlayBoxShow()
$('#overlayBox').show(); $('#overlayBox').show();
} }
} }
/**
* hides the overlay box
*/
function overlayBoxHide() function overlayBoxHide()
{ {
// if the overlay box z-index is 100, do no hide, but set to 98 // if the overlay box z-index is 100, do no hide, but set to 98
@@ -403,24 +470,22 @@ function overlayBoxHide()
} }
} }
// METHOD: setOverlayBox /**
// PARAMS: none * position the overlay block box and shows it
// RETURN: none */
// DESC : position the overlay block box and shows it
function setOverlayBox() function setOverlayBox()
{ {
var viewport = document.viewport.getDimensions(); /* var viewport = document.viewport.getDimensions();
$('#overlayBox').setStyle ({ $('#overlayBox').css ({
width: '100%', width: '100%',
height: '100%' height: '100%'
}); });*/
$('#overlayBox').show(); $('#overlayBox').show();
} }
// METHOD: ClearCall /**
// PARAMS: none * the abort call, clears the action box and hides it and the overlay box
// RETURN: none */
// DESC : the abort call, clears the action box and hides it and the overlay box
function ClearCall() function ClearCall()
{ {
$('#actionBox').innerHTML = ''; $('#actionBox').innerHTML = '';
@@ -429,16 +494,18 @@ function ClearCall()
} }
// *** DOM MANAGEMENT FUNCTIONS // *** DOM MANAGEMENT FUNCTIONS
// METHOD: cel [create element] /**
// PARAMS: tag: must set tag (div, span, etc) * reates object for DOM element creation flow
// id: optional set for id, if input, select will be used for name * @param {String} tag must set tag (div, span, etc)
// content: text content inside, is skipped if sub elements exist * @param {String} [id=''] optional set for id, if input, select will be used for name
// css: array for css tags * @param {String} [content=''] text content inside, is skipped if sub elements exist
// options: anything else (value, placeholder, OnClick, style) * @param {Array} [css=[]] array for css tags
// RETURN: object * @param {Object} [options={}] anything else (value, placeholder, OnClick, style)
// DESC : creates object for DOM element creation flow * @return {Object} created element as an object
const cel = (tag, id = '', content = '', css = [], options = {}) => */
_element = { function cel(tag, id = '', content = '', css = [], options = {})
{
return {
tag: tag, tag: tag,
id: id, id: id,
name: options.name, // override name if set [name gets ignored in tree build anyway] name: options.name, // override name if set [name gets ignored in tree build anyway]
@@ -447,13 +514,15 @@ const cel = (tag, id = '', content = '', css = [], options = {}) =>
options: options, options: options,
sub: [] sub: []
}; };
}
// METHOD: ael [attach element] /**
// PARAMS: base: object where to attach/search * attach a cel created object to another to create a basic DOM tree
// attach: the object to be attached * @param {Object} base object where to attach/search
// id: optional id, if given search in base for this id and attach there * @param {Object} attach the object to be attached
// RETURN: "none", technically there is no return needed * @param {String} [id=''] optional id, if given search in base for this id and attach there
// DESC : attach a cel created object to another to create a basic DOM tree * @return {Object} "none", technically there is no return needed as it is global attach
*/
function ael(base, attach, id = '') function ael(base, attach, id = '')
{ {
if (id) { if (id) {
@@ -475,12 +544,13 @@ function ael(base, attach, id = '')
return base; return base;
} }
// METHOD: aelx [attach n elements] /**
// PARAMS: base: object to where we attach the elements * directly attach n elements to one master base element
// attach 1..n: attach directly to the base element those attachments * this type does not support attach with optional id
// RETURN: "none", technically there is no return needed * @param {Object} base object to where we attach the elements
// DESC : directly attach n elements to one master base element * @param {...Object} attach attach 1..n: attach directly to the base element those attachments
// this type does not support attach with optional id * @return {Object} "none", technically there is no return needed, global attach
*/
function aelx(base, ...attach) function aelx(base, ...attach)
{ {
for (var i = 0; i < attach.length; i ++) { for (var i = 0; i < attach.length; i ++) {
@@ -489,19 +559,23 @@ function aelx(base, ...attach)
return base; return base;
} }
// METHOD: rel [reset element] /**
// PARAMS: cel created element * resets the sub elements of the base element given
// RETURN: returns sub reset base element * @param {Object} base cel created element
// DESC : resets the sub elements of the base element given * @return {Object} returns reset base element
const rel = (base) => { */
function rel(base)
{
base.sub = []; base.sub = [];
return base; return base;
}; }
// METHOD: rcssel [remove a css from the element] /**
// PARAMS: element, style sheet to remove * searches and removes style from css array
// RETURN: "none", in place because of reference * @param {Object} _element element to work one
// DESC : searches and removes style from css array * @param {String css style sheet to remove (name)
* @return {Object} returns full element
*/
function rcssel(_element, css) function rcssel(_element, css)
{ {
var css_index = _element.css.indexOf(css); var css_index = _element.css.indexOf(css);
@@ -511,10 +585,12 @@ function rcssel(_element, css)
return _element; return _element;
} }
// METHOD: acssel [add css element] /**
// PARAMS: element, style sheet to add * adds a new style sheet to the element given
// RETURN: "none", in place add because of reference * @param {Object} _element element to work on
// DESC : adds a new style sheet to the element given * @param {String} css style sheet to add (name)
* @return {Object} returns full element
*/
function acssel(_element, css) function acssel(_element, css)
{ {
var css_index = _element.css.indexOf(css); var css_index = _element.css.indexOf(css);
@@ -524,23 +600,26 @@ function acssel(_element, css)
return _element; return _element;
} }
// METHOD: scssel /**
// PARAMS: element, style to remove, style to add * removes one css and adds another
// RETURN: "none", in place add because of reference * is a wrapper around rcssel/acssel
// DESC : removes one css and adds another * @param {Object} _element element to work on
// is a wrapper around rcssel/acssel * @param {String} rcss style to remove (name)
* @param {String} acss style to add (name)
* @return {Object} returns full element
*/
function scssel(_element, rcss, acss) function scssel(_element, rcss, acss)
{ {
rcssel(_element, rcss); rcssel(_element, rcss);
acssel(_element, acss); acssel(_element, acss);
} }
// METHOD: phfo [produce html from object] /**
// PARAMS: object tree with dom element declarations * parses the object tree created with cel/ael and converts it into an HTML string
// RETURN: HTML string that can be used as innerHTML * that can be inserted into the page
// DESC : parses the object tree created with cel/ael * @param {Object} tree object tree with dom element declarations
// and converts it into an HTML string that can * @return {String} HTML string that can be used as innerHTML
// be inserted into the page */
function phfo(tree) function phfo(tree)
{ {
// holds the elements // holds the elements
@@ -603,33 +682,44 @@ function phfo(tree)
// BLOCK: html wrappers for quickly creating html data blocks // BLOCK: html wrappers for quickly creating html data blocks
// NOTE : OLD FORMAT which misses multiple block set /**
// METHOD: html_options * NOTE: OLD FORMAT which misses multiple block set
// PARAMS: name/id, array for the options, selected item uid * creates an select/options drop down block.
// options_only [def false] if this is true, it will not print the select part * the array needs to be key -> value format.
// return_string [def false]: return as string and not as element * key is for the option id and value is for the data output
// sort [def '']: if empty as is, else allowed 'keys', 'values' all others are ignored * @param {String} name name/id
// RETURN: html with build options block * @param {Object} data array for the options
// DESC : creates an select/options drop down block. * @param {String} [selected=''] selected item uid
// the array needs to be key -> value format. key is for the option id and value is for the data output * @param {Boolean} [options_only=false] if this is true, it will not print the select part
* @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
* @return {String} html with build options block
*/
function html_options(name, data, selected = '', options_only = false, return_string = false, sort = '') function html_options(name, data, selected = '', options_only = false, return_string = false, sort = '')
{ {
// wrapper to new call // wrapper to new call
return html_options_block(name, data, selected, false, options_only, return_string, sort); return html_options_block(name, data, selected, false, options_only, return_string, sort);
} }
// NOTE : USE THIS CALL, the above one is deprecated /**
// METHOD: html_options * NOTE: USE THIS CALL, the above one is deprecated
// PARAMS: name/id, array for the options, * creates an select/options drop down block.
// selected item uid [drop down string, multi select array] * the array needs to be key -> value format.
// multiple [def 0] if this is 1 or larger, the drop down will be turned into multiple select * key is for the option id and value is for the data output
// the number sets the size value unless it is 1, then it is default * @param {String} name name/id
// options_only [def false] if this is true, it will not print the select part * @param {Object} data array for the options
// return_string [def false]: return as string and not as element * @param {String} [selected=''] selected item uid
// sort [def '']: if empty as is, else allowed 'keys', 'values' all others are ignored * @param {Number} [multiple=0] if this is 1 or larger, the drop down
// RETURN: html with build options block * will be turned into multiple select
// DESC : creates an select/options drop down block. * the number sets the size value unless it is 1,
// the array needs to be key -> value format. key is for the option id and value is for the data output * then it is default
* @param {Boolean} [options_only=false] if this is true, it will not print the select part
* @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
* @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 = '')
{ {
var content = []; var content = [];
@@ -700,11 +790,13 @@ function html_options_block(name, data, selected = '', multiple = 0, options_onl
} }
} }
// METHOD: html_options_refill /**
// PARAMS: name/id, array of options, sort = '' * refills a select box with options and keeps the selected
// sort [def '']: if empty as is, else allowed 'keys', 'values' all others are ignored * @param {String} name name/id
// RETURN: none * @param {Object} data array of options
// DESC : refills a select box with options and keeps the selected * @param {String} [sort=''] if empty as is, else allowed 'keys', 'values'
* all others are ignored
*/
function html_options_refill(name, data, sort = '') function html_options_refill(name, data, sort = '')
{ {
var element_option; var element_option;
@@ -738,11 +830,70 @@ function html_options_refill(name, data, sort = '')
} }
} }
/**
* parses a query string from window.location.search.substring(1)
* ALTERNATIVE CODE
* var url = new URL(window.location.href);
* param_uid = url.searchParams.get('uid');
* @param {String} [query=''] the query string to parse
* if not set will auto fill
* @param {String} [return_key=''] if set only returns this key entry
* or empty for none
* @return {Object|String} parameter entry list
*/
function parseQueryString(query = '', return_key = '') {
if (!query) {
query = window.location.search.substring(1);
}
var vars = query.split("&");
var query_string = {};
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split("=");
var key = decodeURIComponent(pair[0]);
var value = decodeURIComponent(pair[1]);
// If first entry with this name
if (typeof query_string[key] === "undefined") {
query_string[key] = decodeURIComponent(value);
// If second entry with this name
} else if (typeof query_string[key] === "string") {
var arr = [query_string[key], decodeURIComponent(value)];
query_string[key] = arr;
// If third or later entry with this name
} else {
query_string[key].push(decodeURIComponent(value));
}
}
if (return_key) {
if (keyInObject(return_key, query_string)) {
return query_string[return_key];
} else {
return '';
}
} else {
return query_string;
}
}
/**
* searchs the current url for a parameter
* @param {String} key uid key to get data for
* @return {String} value for the key or '' for not found
*/
function getQueryStringParam(key)
{
var url = new URL(window.location.href);
var param = url.searchParams.get(key);
if (param) {
return param;
} else {
return '';
}
}
// *** MASTER logout call // *** MASTER logout call
// METHOD: loginLogout /**
// PARAMS: none * submits basic data for form logout
// RETURN: none */
// DESC : submits basic data for form logout
function loginLogout() function loginLogout()
{ {
const form = document.createElement('form'); const form = document.createElement('form');
@@ -756,4 +907,80 @@ function loginLogout()
form.submit(); form.submit();
} }
/**
* create login string and logout button elements
* @param {String} login_string the login string to show on the left
* @param {String} [header_id='mainHeader'] the target for the main element block
* if not set mainHeader is assumed
* this is the target div for the "loginRow"
*/
function createLoginRow(login_string, header_id = 'mainHeader')
{
// if header does not exist, we do nothing
if (exists(header_id)) {
// that row must exist already, if not it must be the first in the "mainHeader"
if (!exists('loginRow')) {
$('#' + header_id).html(phfo(cel('div', 'loginRow', '', ['loginRow', 'flx-spbt'])));
}
// clear out just in case for first entry
// fill with div name & login/logout button
$('#loginRow').html(phfo(cel('div', '', login_string)));
$('#loginRow').append(phfo(
aelx(
// outer div
cel('div'),
// inner element
cel('input', 'logout', '', [], {
value: __('Logout'),
type: 'button',
onClick: 'loginLogout()'
})
)
));
}
}
/**
* create the top nav menu that switches physical between pages
* (edit access data based)
* @param {Object} nav_menu the built nav menu with highlight info
* @param {String} [header_id='mainHeader'] the target for the main element block
* if not set mainHeader is assumed
* this is the target div for the "menuRow"
*/
function createNavMenu(nav_menu, header_id = 'mainHeader') {
// must be an object
if (isObject(nav_menu) && getObjectCount(nav_menu) > 1) {
// do we have more than one entry, if not, do not show (single page)
if (!exists('menuRow')) {
$('#' + header_id).html(phfo(cel('div', 'menuRow', '', ['menuRow', 'flx-s'])));
}
var content = [];
$.each(nav_menu, function(key, item) {
// key is number
// item is object with entries
if (key != 0) {
content.push(phfo(cel('div', '', '&middot;', ['pd-2'])));
}
// ignore item.popup for now
if (item.enabled) {
// set selected based on window.location.href as the php set will not work
if (window.location.href.indexOf(item.url) != -1) {
item.selected = 1;
}
// create the entry
content.push(phfo(
aelx(
cel('div'),
cel('a', '', item.name, ['pd-2'].concat(item.selected ? 'highlight': ''), {
href: item.url
})
)
));
}
});
$('#menuRow').html(content.join(''));
}
}
/* END */ /* END */

View File

@@ -1,4 +1,5 @@
/* general edit javascript */ /* general edit javascript */
/* prototype version */
/* jshint esversion: 6 */ /* jshint esversion: 6 */
@@ -11,19 +12,21 @@ if (!DEBUG) {
}); });
}*/ }*/
// METHOD: pop /**
// PARAMS: url, window name, features * opens a popup window with winName and given features (string)
// RETURN: none * @param {String} theURL the url
// DESC : opens a popup window with winName and given features (string) * @param {String} winName window name
* @param {Object} features popup features
*/
function pop(theURL, winName, features) { function pop(theURL, winName, features) {
winName = window.open(theURL, winName, features); winName = window.open(theURL, winName, features);
winName.focus(); winName.focus();
} }
// METHOD: expandTA /**
// PARAMS: id * automatically resize a text area based on the amount of lines in it
// RETURN: none * @param {[string} ta_id element id
// DESC : automatically resize a text area based on the amount of lines in it */
function expandTA(ta_id) { function expandTA(ta_id) {
var ta; var ta;
// if a string comes, its a get by id, else use it as an element pass on // if a string comes, its a get by id, else use it as an element pass on
@@ -44,12 +47,12 @@ function expandTA(ta_id) {
ta.rows = numNewRows + theRows.length; ta.rows = numNewRows + theRows.length;
} }
// METHOD: ShowHideMenu /**
// PARAMS: status -> show or hide * shows or hides the menu
// id -> id to work on * this is used in some old menu templates
// RETURN: none * @param {String} status show or hide
// DESC: shows or hides the menu * @param {String} id element id to work on
// this is used in some old menu templates */
function ShowHideMenu(status, id) function ShowHideMenu(status, id)
{ {
if (status == 'show') { if (status == 'show') {
@@ -65,8 +68,12 @@ function ShowHideMenu(status, id)
} }
} }
// used in old templates /**
// move element action * used in old templates
* move element action
* @param {String} id element id to move
* @param {String} direction move direction
*/
function mv(id, direction) function mv(id, direction)
{ {
document.forms[form_name].action.value = 'move'; document.forms[form_name].action.value = 'move';
@@ -75,7 +82,11 @@ function mv(id, direction)
document.forms[form_name].submit(); document.forms[form_name].submit();
} }
// load element action /**
* used in old templates
* load element action
* @param {String} id the element id to load
*/
function le(id) function le(id)
{ {
document.forms[form_name].action.value = 'load'; document.forms[form_name].action.value = 'load';
@@ -91,13 +102,14 @@ function le(id)
} }
} }
// METHOD: sh /**
// PARAMS: id -> element to hide * hides an element, additional writes 1 (show) or 0 (hide) into <id>Flag field
// showText -> text for the element if shown * this needs scriptacolous installed for BlindUp/BlindDown
// hideText -> text for the element if hidden * @param {String} id element id to hide
// RETURN: returns true if hidden, or false if not * @param {String} showText text for the element if shown
// DESC : hides an element, additional writes 1 (show) or 0 (hide) into <id>Flag field * @param {String} hideText text for the element if hidden
// this needs scriptacolous installed for BlindUp/BlindDown * @return {Boolean} returns true if hidden, or false if not
*/
function sh(id, showText, hideText) function sh(id, showText, hideText)
{ {
flag = id + 'Flag'; flag = id + 'Flag';
@@ -120,10 +132,10 @@ function sh(id, showText, hideText)
return divStatus; return divStatus;
} }
// METHOD: getWindowSize /**
// PARAMS: none * wrapper to get the real window size for the current browser window
// RETURN: array with width/height * @return {Object} object with width/height
// DESC : wrapper to get the real window size for the current browser window */
function getWindowSize() function getWindowSize()
{ {
var width, height; var width, height;
@@ -135,10 +147,10 @@ function getWindowSize()
}; };
} }
// METHOD: getScrollOffset /**
// PARAMS: none * wrapper to get the correct scroll offset
// RETURN: array with x/y px * @return {Object} object with x/y px
// DESC : wrapper to get the correct scroll offset */
function getScrollOffset() function getScrollOffset()
{ {
var left, top; var left, top;
@@ -150,10 +162,12 @@ function getScrollOffset()
}; };
} }
// METHOD: setCenter /**
// PARAMS: id to set center * centers div to current window size middle
// RETURN: none * @param {String} id element to center
// DESC : centers div to current window size middle * @param {Boolean} left if true centers to the middle from the left
* @param {Boolean} top if true centers to the middle from the top
*/
function setCenter(id, left, top) function setCenter(id, left, top)
{ {
// get size of id // get size of id
@@ -179,10 +193,11 @@ function setCenter(id, left, top)
} }
} }
// METHOD: goToPos() /**
// PARAMS: element, offset (default 0) * goes to an element id position
// RETURN: none * @param {String} element element id to move to
// DESC: goes to an element id position * @param {Number} [offset=0] offset from top, default is 0 (px)
*/
function goToPos(element, offset = 0) function goToPos(element, offset = 0)
{ {
try { try {
@@ -203,10 +218,12 @@ function goToPos(element, offset = 0)
} }
} }
// METHOD: __ /**
// PARAMS: text * uses the i18n object created in the translation template
// RETURN: translated text (based on PHP selected language) * that is filled from gettext in PHP
// DESC : uses the i18n array created in the translation template, that is filled from gettext in PHP (Smarty) * @param {String} string text to translate
* @return {String} translated text (based on PHP selected language)
*/
function __(string) function __(string)
{ {
if (typeof i18n !== 'undefined' && isObject(i18n) && i18n[string]) { if (typeof i18n !== 'undefined' && isObject(i18n) && i18n[string]) {
@@ -216,12 +233,13 @@ function __(string)
} }
} }
// METHOD: string.format /**
// PARAMS: any, for string format * simple sprintf formater for replace
// RETURN: formatted string * usage: "{0} is cool, {1} is not".format("Alpha", "Beta");
// DESC : simple sprintf formater for replace * First, checks if it isn't implemented yet.
// "{0} is cool, {1} is not".format("Alpha", "Beta"); * @param {String} !String.prototype.format string with elements to be replaced
// First, checks if it isn't implemented yet. * @return {String} Formated string
*/
if (!String.prototype.format) { if (!String.prototype.format) {
String.prototype.format = function() String.prototype.format = function()
{ {
@@ -236,25 +254,32 @@ if (!String.prototype.format) {
}; };
} }
// METHOD: numberWithCommas /**
// PARAMS: number * formats flat number 123456 to 123,456
// RETURN: formatted with , in thousands * @param {Number} x number to be formated
// DESC : formats flat number 123456 to 123,456 * @return {String} formatted with , in thousands
*/
const numberWithCommas = (x) => { const numberWithCommas = (x) => {
var parts = x.toString().split("."); var parts = x.toString().split(".");
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ","); parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",");
return parts.join("."); return parts.join(".");
}; };
// METHOD: /**
// PARAMS: string * converts line breaks to br
// RETURN: string with <br> * @param {String} string any string
// DESC : converts line breaks to br * @return {String} string with <br>
*/
function convertLBtoBR(string) function convertLBtoBR(string)
{ {
return string.replace(/(?:\r\n|\r|\n)/g, '<br>'); return string.replace(/(?:\r\n|\r|\n)/g, '<br>');
} }
/**
* escape HTML string
* @param {String} !String.prototype.escapeHTML HTML data string to be escaped
* @return {String} escaped string
*/
if (!String.prototype.escapeHTML) { if (!String.prototype.escapeHTML) {
String.prototype.escapeHTML = function() { String.prototype.escapeHTML = function() {
return this.replace(/[&<>"'\/]/g, function (s) { return this.replace(/[&<>"'\/]/g, function (s) {
@@ -272,6 +297,11 @@ if (!String.prototype.escapeHTML) {
}; };
} }
/**
* unescape a HTML encoded string
* @param {String} !String.prototype.unescapeHTML data with escaped entries
* @return {String} HTML formated string
*/
if (!String.prototype.unescapeHTML) { if (!String.prototype.unescapeHTML) {
String.prototype.unescapeHTML = function() { String.prototype.unescapeHTML = function() {
return this.replace(/&[#\w]+;/g, function (s) { return this.replace(/&[#\w]+;/g, function (s) {
@@ -289,31 +319,33 @@ if (!String.prototype.unescapeHTML) {
}; };
} }
// METHOD: getTimestamp /**
// PARAMS: none * returns current timestamp (unix timestamp)
// RETURN: timestamp (in milliseconds) * @return {Number} timestamp (in milliseconds)
// DESC : returns current timestamp (unix timestamp) */
function getTimestamp() function getTimestamp()
{ {
var date = new Date(); var date = new Date();
return date.getTime(); return date.getTime();
} }
// METHOD: dec2hex /**
// PARAMS: decimal string * dec2hex :: Integer -> String
// RETURN: string * i.e. 0-255 -> '00'-'ff'
// DESC : dec2hex :: Integer -> String * @param {Number} dec decimal string
// i.e. 0-255 -> '00'-'ff' * @return {String} hex encdoded number
*/
function dec2hex(dec) function dec2hex(dec)
{ {
return ('0' + dec.toString(16)).substr(-2); return ('0' + dec.toString(16)).substr(-2);
} }
// METHOD: generateId /**
// PARAMS: lenght in int * generateId :: Integer -> String
// RETURN: random string * only works on mondern browsers
// DESC : generateId :: Integer -> String * @param {Number} len length of unique id string
// only works on mondern browsers * @return {String} random string in length of len
*/
function generateId(len) function generateId(len)
{ {
var arr = new Uint8Array((len || 40) / 2); var arr = new Uint8Array((len || 40) / 2);
@@ -321,20 +353,22 @@ function generateId(len)
return Array.from(arr, dec2hex).join(''); return Array.from(arr, dec2hex).join('');
} }
// METHOD: randomIdF() /**
// PARAMS: none * creates a pseudo random string of 10 characters
// RETURN: not true random string * works on all browsers
// DESC : creates a pseudo random string of 10 characters * after many runs it will create duplicates
// after many runs it will create duplicates * @return {String} not true random string
*/
function randomIdF() function randomIdF()
{ {
return Math.random().toString(36).substring(2); return Math.random().toString(36).substring(2);
} }
// METHOD: isObject /**
// PARAMS: possible object * checks if a variable is an object
// RETURN: true/false if it is an object or not * @param {Mixed} val possible object
// DESC : checks if a variable is an object * @return {Boolean} true/false if it is an object or not
*/
function isObject(val) { function isObject(val) {
if (val === null) { if (val === null) {
return false; return false;
@@ -342,47 +376,55 @@ function isObject(val) {
return ((typeof val === 'function') || (typeof val === 'object')); return ((typeof val === 'function') || (typeof val === 'object'));
} }
// METHOD: keyInObject /**
// PARAMS: key name, object * checks if a key exists in a given object
// RETURN: true/false if key exists in object * @param {String} key key name
// DESC : checks if a key exists in a given object * @param {Object} object object to search key in
const keyInObject = (key, object) => (key in object) ? true : false; * @return {Boolean} true/false if key exists in object
*/
const keyInObject = (key, object) => (Object.prototype.hasOwnProperty.call(object, key)) ? true : false;
/*function keyInObject(key, object) /*function keyInObject(key, object)
{ {
return (key in object) ? true : false; return (Object.prototype.hasOwnProperty.call(object, key)) ? true : false;
}*/ }*/
// METHOD: getKeyByValue /**
// PARAMS: object, value * returns matching key of value
// RETURN: key found * @param {Object} obj object to search value in
// DESC : returns matching key of value * @param {Mixed} value any value (String, Number, etc)
* @return {String} the key found for the first matching value
*/
const getKeyByValue = (obj, value) => Object.keys(obj).find(key => obj[key] === value); const getKeyByValue = (obj, value) => Object.keys(obj).find(key => obj[key] === value);
// function getKeyByValue(object, value) // function getKeyByValue(object, value)
// { // {
// return Object.keys(object).find(key => object[key] === value); // return Object.keys(object).find(key => object[key] === value);
// } // }
// METHOD: valueInObject /**
// PARAMS: obj, value * returns true if value is found in object with a key
// RETURN: true/false * @param {Object} obj object to search value in
// DESC : returns true if value is found in object with a key * @param {Mixed} value any value (String, Number, etc)
* @return {Boolean} true on value found, false on not found
*/
const valueInObject = (obj, value) => (Object.keys(obj).find(key => obj[key] === value)) ? true : false; const valueInObject = (obj, value) => (Object.keys(obj).find(key => obj[key] === value)) ? true : false;
// METHOD: exists /**
// PARAMS: uid * checks if a DOM element actually exists
// RETURN: true/false * @param {String} id Element id to check for
// DESC : checks if a DOM element actually exists * @return {Boolean} true if element exists, false on failure
const exists = (id) => $('#' + id).length > 0 ? true : false; */
const exists = (id) => $(id).length > 0 ? true : false;
/*function exists(id) /*function exists(id)
{ {
return $('#' + id).length > 0 ? true : false; return $(id).length > 0 ? true : false;
}*/ }*/
// METHOD: formatBytes /**
// PARAMS: bytes in int * converts a int number into bytes with prefix in two decimals precision
// RETURN: string in GB/MB/KB * currently precision is fixed, if dynamic needs check for max/min precision
// DESC : converts a int number into bytes with prefix in two decimals precision * @param {Number} bytes bytes in int
// currently precision is fixed, if dynamic needs check for max/min precision * @return {String} string in GB/MB/KB
*/
function formatBytes(bytes) function formatBytes(bytes)
{ {
var i = -1; var i = -1;
@@ -394,10 +436,10 @@ function formatBytes(bytes)
return parseFloat(Math.round(bytes * Math.pow(10, 2)) / Math.pow(10, 2)) + ['kB', 'MB', 'GB', 'TB', 'PB', 'EB'][i]; return parseFloat(Math.round(bytes * Math.pow(10, 2)) / Math.pow(10, 2)) + ['kB', 'MB', 'GB', 'TB', 'PB', 'EB'][i];
} }
// METHOD: errorCatch /**
// PARAMS: err (error from try/catch * prints out error messages based on data available from the browser
// RETURN: none * @param {Object} err error from try/catch block
// DESC : prints out error messages based on data available from the browser */
function errorCatch(err) function errorCatch(err)
{ {
// for FF & Chrome // for FF & Chrome
@@ -423,10 +465,10 @@ function errorCatch(err)
} }
} }
// METHOD: actionIndicator /**
// PARAMS: none * show or hide the "do" overlay
// RETURN: none * @param {String} [loc=''] location name for action indicator, default empty. for console.log
// DESC : show or hide the "do" overlay */
function actionIndicator(loc = '') function actionIndicator(loc = '')
{ {
if ($('overlayBox').visible()) { if ($('overlayBox').visible()) {
@@ -436,12 +478,11 @@ function actionIndicator(loc = '')
} }
} }
// METHOD: actionIndicatorShow/actionIndicatorHide /**
// PARAMS: loc for console log info * explicit show for action Indicator
// RETURN: none * instead of automatically show or hide, do on command show
// DESC : explicit show/hide for action Indicator * @param {String} [loc=''] optional location name, empty if not set. for console.log
// instead of automatically show or hide, do */
// on command
function actionIndicatorShow(loc = '') function actionIndicatorShow(loc = '')
{ {
console.log('Indicator: SHOW [%s]', loc); console.log('Indicator: SHOW [%s]', loc);
@@ -450,6 +491,12 @@ function actionIndicatorShow(loc = '')
$('indicator').show(); $('indicator').show();
overlayBoxShow(); overlayBoxShow();
} }
/**
* explicit hide for action Indicator
* instead of automatically show or hide, do on command hide
* @param {String} [loc=''] optional location name, empty if not set. for console.log
*/
function actionIndicatorHide(loc = '') function actionIndicatorHide(loc = '')
{ {
console.log('Indicator: HIDE [%s]', loc); console.log('Indicator: HIDE [%s]', loc);
@@ -458,10 +505,9 @@ function actionIndicatorHide(loc = '')
overlayBoxHide(); overlayBoxHide();
} }
// METHOD: overlayBoxView /**
// PARAMS: none * shows the overlay box
// RETURN: none */
// DESC : shows or hides the overlay box
function overlayBoxShow() function overlayBoxShow()
{ {
// check if overlay box exists and if yes set the z-index to 100 // check if overlay box exists and if yes set the z-index to 100
@@ -471,6 +517,10 @@ function overlayBoxShow()
$('overlayBox').show(); $('overlayBox').show();
} }
} }
/**
* hides the overlay box
*/
function overlayBoxHide() function overlayBoxHide()
{ {
// if the overlay box z-index is 100, do no hide, but set to 98 // if the overlay box z-index is 100, do no hide, but set to 98
@@ -481,10 +531,9 @@ function overlayBoxHide()
} }
} }
// METHOD: setOverlayBox /**
// PARAMS: none * position the overlay block box and shows it
// RETURN: none */
// DESC : position the overlay block box and shows it
function setOverlayBox() function setOverlayBox()
{ {
var viewport = document.viewport.getDimensions(); var viewport = document.viewport.getDimensions();
@@ -495,10 +544,9 @@ function setOverlayBox()
$('overlayBox').show(); $('overlayBox').show();
} }
// METHOD: ClearCall /**
// PARAMS: none * the abort call, clears the action box and hides it and the overlay box
// RETURN: none */
// DESC : the abort call, clears the action box and hides it and the overlay box
function ClearCall() function ClearCall()
{ {
$('actionBox').innerHTML = ''; $('actionBox').innerHTML = '';
@@ -507,14 +555,15 @@ function ClearCall()
} }
// *** DOM MANAGEMENT FUNCTIONS // *** DOM MANAGEMENT FUNCTIONS
// METHOD: cel [create element] /**
// PARAMS: tag: must set tag (div, span, etc) * reates object for DOM element creation flow
// id: optional set for id, if input, select will be used for name * @param {String} tag must set tag (div, span, etc)
// content: text content inside, is skipped if sub elements exist * @param {String} [id=''] optional set for id, if input, select will be used for name
// css: array for css tags * @param {String} [content=''] text content inside, is skipped if sub elements exist
// options: anything else (value, placeholder, OnClick, style) * @param {Array} [css=[]] array for css tags
// RETURN: object * @param {Object} [options={}] anything else (value, placeholder, OnClick, style)
// DESC : creates object for DOM element creation flow * @return {Object} created element as an object
*/
const cel = (tag, id = '', content = '', css = [], options = {}) => const cel = (tag, id = '', content = '', css = [], options = {}) =>
_element = { _element = {
tag: tag, tag: tag,
@@ -526,12 +575,13 @@ const cel = (tag, id = '', content = '', css = [], options = {}) =>
sub: [] sub: []
}; };
// METHOD: ael [attach element] /**
// PARAMS: base: object where to attach/search * attach a cel created object to another to create a basic DOM tree
// attach: the object to be attached * @param {Object} base object where to attach/search
// id: optional id, if given search in base for this id and attach there * @param {Object} attach the object to be attached
// RETURN: "none", technically there is no return needed * @param {String} [id=''] optional id, if given search in base for this id and attach there
// DESC : attach a cel created object to another to create a basic DOM tree * @return {Object} "none", technically there is no return needed as it is global attach
*/
function ael(base, attach, id = '') function ael(base, attach, id = '')
{ {
if (id) { if (id) {
@@ -553,12 +603,13 @@ function ael(base, attach, id = '')
return base; return base;
} }
// METHOD: aelx [attach n elements] /**
// PARAMS: base: object to where we attach the elements * directly attach n elements to one master base element
// attach 1..n: attach directly to the base element those attachments * this type does not support attach with optional id
// RETURN: "none", technically there is no return needed * @param {Object} base object to where we attach the elements
// DESC : directly attach n elements to one master base element * @param {...Object} attach attach 1..n: attach directly to the base element those attachments
// this type does not support attach with optional id * @return {Object} "none", technically there is no return needed, global attach
*/
function aelx(base, ...attach) function aelx(base, ...attach)
{ {
attach.each(function(t) { attach.each(function(t) {
@@ -567,19 +618,22 @@ function aelx(base, ...attach)
return base; return base;
} }
// METHOD: rel [reset element] /**
// PARAMS: cel created element * resets the sub elements of the base element given
// RETURN: returns reset base element * @param {Object} base cel created element
// DESC : resets the sub elements of the base element given * @return {Object} returns reset base element
*/
const rel = (base) => { const rel = (base) => {
base.sub = []; base.sub = [];
return base; return base;
}; };
// METHOD: rcssel [remove a css from the element] /**
// PARAMS: element, style sheet to remove * searches and removes style from css array
// RETURN: returns full element * @param {Object} _element element to work one
// DESC : searches and removes style from css array * @param {String css style sheet to remove (name)
* @return {Object} returns full element
*/
function rcssel(_element, css) function rcssel(_element, css)
{ {
var css_index = _element.css.indexOf(css); var css_index = _element.css.indexOf(css);
@@ -589,10 +643,12 @@ function rcssel(_element, css)
return _element; return _element;
} }
// METHOD: acssel [add css element] /**
// PARAMS: element, style sheet to add * adds a new style sheet to the element given
// RETURN: returns full element * @param {Object} _element element to work on
// DESC : adds a new style sheet to the element given * @param {String} css style sheet to add (name)
* @return {Object} returns full element
*/
function acssel(_element, css) function acssel(_element, css)
{ {
var css_index = _element.css.indexOf(css); var css_index = _element.css.indexOf(css);
@@ -602,11 +658,14 @@ function acssel(_element, css)
return _element; return _element;
} }
// METHOD: scssel /**
// PARAMS: element, style to remove, style to add * removes one css and adds another
// RETURN: returns full element * is a wrapper around rcssel/acssel
// DESC : removes one css and adds another * @param {Object} _element element to work on
// is a wrapper around rcssel/acssel * @param {String} rcss style to remove (name)
* @param {String} acss style to add (name)
* @return {Object} returns full element
*/
function scssel(_element, rcss, acss) function scssel(_element, rcss, acss)
{ {
rcssel(_element, rcss); rcssel(_element, rcss);
@@ -614,12 +673,12 @@ function scssel(_element, rcss, acss)
return _element; return _element;
} }
// METHOD: phfo [produce html from object] /**
// PARAMS: object tree with dom element declarations * parses the object tree created with cel/ael and converts it into an HTML string
// RETURN: HTML string that can be used as innerHTML * that can be inserted into the page
// DESC : parses the object tree created with cel/ael * @param {Object} tree object tree with dom element declarations
// and converts it into an HTML string that can * @return {String} HTML string that can be used as innerHTML
// be inserted into the page */
function phfo(tree) function phfo(tree)
{ {
// holds the elements // holds the elements
@@ -681,33 +740,44 @@ function phfo(tree)
// BLOCK: html wrappers for quickly creating html data blocks // BLOCK: html wrappers for quickly creating html data blocks
// NOTE : OLD FORMAT which misses multiple block set /**
// METHOD: html_options * NOTE: OLD FORMAT which misses multiple block set
// PARAMS: name/id, array for the options, selected item uid * creates an select/options drop down block.
// options_only [def false] if this is true, it will not print the select part * the array needs to be key -> value format.
// return_string [def false]: return as string and not as element * key is for the option id and value is for the data output
// sort [def '']: if empty as is, else allowed 'keys', 'values' all others are ignored * @param {String} name name/id
// RETURN: html with build options block * @param {Object} data array for the options
// DESC : creates an select/options drop down block. * @param {String} [selected=''] selected item uid
// the array needs to be key -> value format. key is for the option id and value is for the data output * @param {Boolean} [options_only=false] if this is true, it will not print the select part
* @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
* @return {String} html with build options block
*/
function html_options(name, data, selected = '', options_only = false, return_string = false, sort = '') function html_options(name, data, selected = '', options_only = false, return_string = false, sort = '')
{ {
// wrapper to new call // wrapper to new call
return html_options_block(name, data, selected, false, options_only, return_string, sort); return html_options_block(name, data, selected, false, options_only, return_string, sort);
} }
// NOTE : USE THIS CALL, the above one is deprecated /**
// METHOD: html_options * NOTE: USE THIS CALL, the above one is deprecated
// PARAMS: name/id, array for the options, * creates an select/options drop down block.
// selected item uid [drop down string, multi select array] * the array needs to be key -> value format.
// multiple [def 0] if this is 1 or larger, the drop down will be turned into multiple select * key is for the option id and value is for the data output
// the number sets the size value unless it is 1, then it is default * @param {String} name name/id
// options_only [def false] if this is true, it will not print the select part * @param {Object} data array for the options
// return_string [def false]: return as string and not as element * @param {String} [selected=''] selected item uid
// sort [def '']: if empty as is, else allowed 'keys', 'values' all others are ignored * @param {Number} [multiple=0] if this is 1 or larger, the drop down
// RETURN: html with build options block * will be turned into multiple select
// DESC : creates an select/options drop down block. * the number sets the size value unless it is 1,
// the array needs to be key -> value format. key is for the option id and value is for the data output * then it is default
* @param {Boolean} [options_only=false] if this is true, it will not print the select part
* @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
* @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 = '')
{ {
var content = []; var content = [];
@@ -778,11 +848,13 @@ function html_options_block(name, data, selected = '', multiple = 0, options_onl
} }
} }
// METHOD: html_options_refill /**
// PARAMS: name/id, array of options, sort = '' * refills a select box with options and keeps the selected
// sort [def '']: if empty as is, else allowed 'keys', 'values' all others are ignored * @param {String} name name/id
// RETURN: none * @param {Object} data array of options
// DESC : refills a select box with options and keeps the selected * @param {String} [sort=''] if empty as is, else allowed 'keys', 'values'
* all others are ignored
*/
function html_options_refill(name, data, sort = '') function html_options_refill(name, data, sort = '')
{ {
var element_option; var element_option;
@@ -816,11 +888,70 @@ function html_options_refill(name, data, sort = '')
} }
} }
/**
* parses a query string from window.location.search.substring(1)
* ALTERNATIVE CODE
* var url = new URL(window.location.href);
* param_uid = url.searchParams.get('uid');
* @param {String} [query=''] the query string to parse
* if not set will auto fill
* @param {String} [return_key=''] if set only returns this key entry
* or empty for none
* @return {Object|String} parameter entry list
*/
function parseQueryString(query = '', return_key = '') {
if (!query) {
query = window.location.search.substring(1);
}
var vars = query.split("&");
var query_string = {};
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split("=");
var key = decodeURIComponent(pair[0]);
var value = decodeURIComponent(pair[1]);
// If first entry with this name
if (typeof query_string[key] === "undefined") {
query_string[key] = decodeURIComponent(value);
// If second entry with this name
} else if (typeof query_string[key] === "string") {
var arr = [query_string[key], decodeURIComponent(value)];
query_string[key] = arr;
// If third or later entry with this name
} else {
query_string[key].push(decodeURIComponent(value));
}
}
if (return_key) {
if (keyInObject(return_key, query_string)) {
return query_string[return_key];
} else {
return '';
}
} else {
return query_string;
}
}
/**
* searchs the current url for a parameter
* @param {String} key uid key to get data for
* @return {String} value for the key or '' for not found
*/
function getQueryStringParam(key)
{
var url = new URL(window.location.href);
var param = url.searchParams.get(key);
if (param) {
return param;
} else {
return '';
}
}
// *** MASTER logout call // *** MASTER logout call
// METHOD: loginLogout /**
// PARAMS: none * submits basic data for form logout
// RETURN: none */
// DESC : submits basic data for form logout
function loginLogout() function loginLogout()
{ {
const form = document.createElement('form'); const form = document.createElement('form');

View File

@@ -3,8 +3,9 @@
* firebug 1.2+ and the webkit console */ * firebug 1.2+ and the webkit console */
var ConsoleSetup = function() { var ConsoleSetup = function() {
if (!window.console) if (!window.console) {
window.console = {}; window.console = {};
}
var names = ['log', 'debug', 'info', 'warn', 'error', 'assert', 'dir', 'dirxml', 'group', 'groupEnd', 'time', 'timeEnd', 'count', 'trace', 'profile', 'profileEnd']; var names = ['log', 'debug', 'info', 'warn', 'error', 'assert', 'dir', 'dirxml', 'group', 'groupEnd', 'time', 'timeEnd', 'count', 'trace', 'profile', 'profileEnd'];

2
www/layout/frontend/cache/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
*
!.gitignore

View File

@@ -0,0 +1,2 @@
*
!.gitignore

View File

@@ -1 +1 @@
../../../admin/default/javascript/debug.js ../../admin/javascript/debug.js

View File

@@ -1 +1 @@
../../../admin/default/javascript/fineuploader/ ../../admin/javascript/fineuploader/

View File

@@ -1 +1 @@
../../../admin/default/javascript/firebug.js ../../admin/javascript/firebug.js

View File

@@ -62,8 +62,9 @@ namespace CoreLibs\ACL;
class Login extends \CoreLibs\DB\IO class Login extends \CoreLibs\DB\IO
{ {
private $euid; // the user id var private $euid; // the user id var
private $permission_okay = 0; // is set to one if login okay, or EUID is set and user is okay to access this page private $permission_okay = false; // is set to one if login okay, or EUID is set and user is okay to access this page
public $login; // pressed login public $login; // pressed login
private $action; // master action command
private $username; // login name private $username; // login name
private $password; // login password private $password; // login password
private $logout; // logout button private $logout; // logout button
@@ -77,49 +78,53 @@ class Login extends \CoreLibs\DB\IO
private $pw_old_password; private $pw_old_password;
private $pw_new_password; private $pw_new_password;
private $pw_new_password_confirm; 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(); // array of users for which the password change is forbidden
private $logout_target; private $logout_target;
private $max_login_error_count = -1; private $max_login_error_count = -1;
private $lock_deny_users = array (); private $lock_deny_users = array();
// if we have password change we need to define some rules // if we have password change we need to define some rules
private $password_min_length = PASSWORD_MIN_LENGTH; 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 // 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; private $password_max_length = PASSWORD_MAX_LENGTH;
// can have several regexes, if nothing set, all is ok // can have several regexes, if nothing set, all is ok
private $password_valid_chars = array ( private $password_valid_chars = array(
// '^(?=.*\d)(?=.*[A-Za-z])[0-9A-Za-z!@#$%]{8,}$', // '^(?=.*\d)(?=.*[A-Za-z])[0-9A-Za-z!@#$%]{8,}$',
// '^(?.*(\pL)u)(?=.*(\pN)u)(?=.*([^\pL\pN])u).{8,}', // '^(?.*(\pL)u)(?=.*(\pN)u)(?=.*([^\pL\pN])u).{8,}',
); );
// all possible login error conditions // all possible login error conditions
private $login_error_msg = array (); private $login_error_msg = array();
// this is an array holding all strings & templates passed from the outside (translation) // this is an array holding all strings & templates passed from the outside (translation)
private $login_template = array ( private $login_template = array(
'strings' => array (), 'strings' => array(),
'password_change' => '', 'password_change' => '',
'template' => '' 'template' => ''
); );
// acl vars // acl vars
public $acl = array (); public $acl = array();
public $default_acl_list = array (); public $default_acl_list = array();
// login html, if we are on an ajax page
private $login_html = '';
private $login_is_ajax_page = false;
// language // language
public $l; public $l;
// METHOD: login /**
// PARAMS: db_config -> array for logging in to DB where edit_users tables are * constructor, does ALL, opens db, works through connection checks, closes itself
// db_debug -> sets debug output for db_io (can be overruled with DB_DEBUG) * @param array $db_config db config array
// RETURN: none * @param int $set_control_flag class variable check flags
// DESC : cunstroctuor, does ALL, opens db, works through connection checks, closes itself */
public function __construct(array $db_config, string $lang = 'en_utf8', int $set_control_flag = 0) public function __construct(array $db_config, int $set_control_flag = 0)
{ {
// log login data for this class only // log login data for this class only
$this->log_per_class = 1; $this->log_per_class = 1;
// create db connection and init base class // create db connection and init base class
if (!parent::__construct($db_config, $set_control_flag)) { parent::__construct($db_config, $set_control_flag);
if ($this->db_init_error === true) {
echo 'Could not connect to DB<br>'; echo 'Could not connect to DB<br>';
// if I can't connect to the DB to auth exit hard. No access allowed // if I can't connect to the DB to auth exit hard. No access allowed
exit; exit;
@@ -142,16 +147,27 @@ class Login extends \CoreLibs\DB\IO
exit; exit;
} }
// set global is ajax page for if we show the data directly, or need to pass it back
// to the continue AJAX class for output back to the user
$this->login_is_ajax_page = isset($GLOBALS['AJAX_PAGE']) && $GLOBALS['AJAX_PAGE'] ? true : false;
// set the default lang
$lang = 'en_utf8';
if (session_id() && isset($_SESSION['DEFAULT_LANG']) && $_SESSION['DEFAULT_LANG']) {
$lang = $_SESSION['DEFAULT_LANG'];
} else {
$lang = defined('SITE_LANG') ? SITE_LANG : DEFAULT_LANG;
}
$this->l = new \CoreLibs\Language\L10n($lang); $this->l = new \CoreLibs\Language\L10n($lang);
// if we have a search path we need to set it, to use the correct DB to login // if we have a search path we need to set it, to use the correct DB to login
// check what schema to use. if there is a login schema use this, else check if there is a schema set in the config, or fall back to DB_SCHEMA if this exists, if this also does not exists use public schema // check what schema to use. if there is a login schema use this, else check if there is a schema set in the config, or fall back to DB_SCHEMA if this exists, if this also does not exists use public schema
if (defined('LOGIN_DB_SCHEMA')) { if (defined('LOGIN_DB_SCHEMA')) {
/** @phan-suppress-next-line PhanUndeclaredConstant */
$SCHEMA = LOGIN_DB_SCHEMA; $SCHEMA = LOGIN_DB_SCHEMA;
} elseif ($db_config['db_schema']) { } elseif (isset($db_config['db_schema']) && $db_config['db_schema']) {
$SCHEMA = $db_config['db_schema']; $SCHEMA = $db_config['db_schema'];
} elseif (defined('DB_SCHEMA')) { } elseif (defined('PUBLIC_SCHEMA')) {
$SCHEMA = DB_SCHEMA; $SCHEMA = PUBLIC_SCHEMA;
} else { } else {
$SCHEMA = 'public'; $SCHEMA = 'public';
} }
@@ -162,48 +178,21 @@ class Login extends \CoreLibs\DB\IO
$this->euid = array_key_exists('EUID', $_SESSION) ? $_SESSION['EUID'] : 0; // if there is none, there is none, saves me POST/GET check $this->euid = array_key_exists('EUID', $_SESSION) ? $_SESSION['EUID'] : 0; // if there is none, there is none, saves me POST/GET check
// get login vars, are so, can't be changed // get login vars, are so, can't be changed
// prepare // prepare
if (!isset($_POST['login_login'])) {
$_POST['login_login'] = '';
}
if (!isset($_POST['login_username'])) {
$_POST['login_username'] = '';
}
if (!isset($_POST['login_password'])) {
$_POST['login_password'] = '';
}
if (!isset($_POST['login_logout'])) {
$_POST['login_logout'] = '';
}
if (!isset($_POST['change_password'])) {
$_POST['change_password'] = '';
}
if (!isset($_POST['pw_username'])) {
$_POST['pw_username'] = '';
}
if (!isset($_POST['pw_old_password'])) {
$_POST['pw_old_password'] = '';
}
if (!isset($_POST['pw_new_password'])) {
$_POST['pw_new_password'] = '';
}
if (!isset($_POST['pw_new_password_confirm'])) {
$_POST['pw_new_password_confirm'] = '';
}
// pass on vars to Object vars // pass on vars to Object vars
$this->login = $_POST['login_login']; $this->login = isset($_POST['login_login']) ? $_POST['login_login'] : '';
$this->username = $_POST['login_username']; $this->username = isset($_POST['login_username']) ? $_POST['login_username'] : '';
$this->password = $_POST['login_password']; $this->password = isset($_POST['login_password']) ? $_POST['login_password'] : '';
$this->logout = $_POST['login_logout']; $this->logout = isset($_POST['login_logout']) ? $_POST['login_logout'] : '';
// password change vars // password change vars
$this->change_password = $_POST['change_password']; $this->change_password = isset($_POST['change_password']) ? $_POST['change_password'] : '';
$this->pw_username = $_POST['pw_username']; $this->pw_username = isset($_POST['pw_username']) ? $_POST['pw_username'] : '';
$this->pw_old_password = $_POST['pw_old_password']; $this->pw_old_password = isset($_POST['pw_old_password']) ? $_POST['pw_old_password'] : '';
$this->pw_new_password = $_POST['pw_new_password']; $this->pw_new_password = isset($_POST['pw_new_password']) ? $_POST['pw_new_password'] : '';
$this->pw_new_password_confirm = $_POST['pw_new_password_confirm']; $this->pw_new_password_confirm = isset($_POST['pw_new_password_confirm']) ? $_POST['pw_new_password_confirm'] : '';
// logout target (from config) // logout target (from config)
$this->logout_target = LOGOUT_TARGET; $this->logout_target = LOGOUT_TARGET;
// disallow user list for password change // disallow user list for password change
$this->pw_change_deny_users = array ('admin'); $this->pw_change_deny_users = array('admin');
// set flag if password change is okay // set flag if password change is okay
if (defined('PASSWORD_CHANGE')) { if (defined('PASSWORD_CHANGE')) {
$this->password_change = PASSWORD_CHANGE; $this->password_change = PASSWORD_CHANGE;
@@ -215,23 +204,15 @@ class Login extends \CoreLibs\DB\IO
// max login counts before error reporting // max login counts before error reporting
$this->max_login_error_count = 10; $this->max_login_error_count = 10;
// users that never get locked, even if they are set strict // users that never get locked, even if they are set strict
$this->lock_deny_users = array ('admin'); $this->lock_deny_users = array('admin');
// internal
$this->class_info['login'] = array(
'class_name' => 'Login',
'class_version' => '5.0.0',
'class_created' => '2000-06-01',
'class_author' => 'Clemens Schwaighofer'
);
// init default ACL list array // init default ACL list array
$_SESSION['DEFAULT_ACL_LIST'] = array (); $_SESSION['DEFAULT_ACL_LIST'] = array();
// read the current edit_access_right list into an array // 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"; $q = "SELECT level, type, name FROM edit_access_right WHERE level >= 0 ORDER BY level";
while ($res = $this->dbReturn($q)) { while ($res = $this->dbReturn($q)) {
// level to description format (numeric) // level to description format (numeric)
$this->default_acl_list[$res['level']] = array ( $this->default_acl_list[$res['level']] = array(
'type' => $res['type'], 'type' => $res['type'],
'name' => $res['name'] 'name' => $res['name']
); );
@@ -254,40 +235,60 @@ class Login extends \CoreLibs\DB\IO
$this->loginPasswordForgot(); $this->loginPasswordForgot();
} }
// if !$euid || permission not okay, print login screan // if !$euid || permission not okay, print login screan
echo $this->loginPrintLogin(); $this->login_html = $this->loginPrintLogin();
// closing all connections, depending on error status, exit // closing all connections, depending on error status, exit
if (!$this->loginCloseClass()) { if (!$this->loginCloseClass()) {
// do not go anywhere, quit processing here // if variable AJAX flag is not set, show output, else pass through for ajax work
// do something with possible debug data? if ($this->login_is_ajax_page !== true) {
if (TARGET == 'live' || TARGET == 'remote') { // the login screen if we hav no login permission & login screen html data
// login if ($this->login_html !== null) {
$this->debug_output_all = DEBUG ? 1 : 0; echo $this->login_html;
$this->echo_output_all = 0; }
$this->print_output_all = DEBUG ? 1 : 0; // do not go anywhere, quit processing here
// 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;
}
$status_msg = $this->printErrorMsg();
if ($this->echo_output_all) {
echo $status_msg;
}
// exit so we don't process anything further, at all
exit;
} 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();
// set the action to login so we can trigger special login html return
$_POST['action'] = 'login';
$_POST['login_html'] = $this->login_html;
// NOTE: this part needs to be catched by the frontend AJAX
// and some function needs to then set something like this
// document.getElementsByTagName('html')[0].innerHTML = data.content.login_html;
} }
$status_msg = $this->printErrorMsg();
if ($this->echo_output_all) {
echo $status_msg;
}
exit;
} }
// set acls for this user/group and this page // set acls for this user/group and this page
$this->loginSetAcl(); $this->loginSetAcl();
} }
// METHOD: _login /**
// PARAMS: none * deconstructory, called with the last function to close DB connection
// RETURN: none */
// DESC : deconstructory, called with the last function to close DB connection
public function __destruct() public function __destruct()
{ {
parent::__destruct(); parent::__destruct();
} }
// METHOD: loginPasswordCheck /**
// PARAMS: hash, optional password, to override * checks if password is valid, sets internal error login variable
// RETURN: true or false * @param string $hash password hash
// DESC : checks if password is valid, sets internal error login variable * @param string $password submitted password
* @return bool true or false on password ok or not
*/
private function loginPasswordCheck(string $hash, string $password = ''): bool private function loginPasswordCheck(string $hash, string $password = ''): bool
{ {
// check with what kind of prefix the password begins: // check with what kind of prefix the password begins:
@@ -312,6 +313,7 @@ class Login extends \CoreLibs\DB\IO
(preg_match("/^\\$2(y)\\$/", $hash) && preg_match("/\\$07\\$/", $hash)) || (preg_match("/^\\$2(y)\\$/", $hash) && preg_match("/\\$07\\$/", $hash)) ||
preg_match("/^\\$1\\$/", $hash) || preg_match("/^\\$1\\$/", $hash) ||
preg_match("/^\\$[0-9A-Za-z.]{12}$/", $hash)) && preg_match("/^\\$[0-9A-Za-z.]{12}$/", $hash)) &&
/** @phan-suppress-next-line PhanDeprecatedFunction */
!$this->verifyCryptString($password, $hash) !$this->verifyCryptString($password, $hash)
) { ) {
// check passwword as crypted, $2a$ or $2y$ is blowfish start, $1$ is MD5 start, $\w{12} is standard DES // check passwword as crypted, $2a$ or $2y$ is blowfish start, $1$ is MD5 start, $\w{12} is standard DES
@@ -339,12 +341,11 @@ class Login extends \CoreLibs\DB\IO
return $password_ok; return $password_ok;
} }
// METHOD: loginLoginUser /**
// WAS : login_login_user * if user pressed login button this script is called, but only if there is no preview euid set]
// PARAMS: none * @return void has not return
// RETURN: none */
// DESC : if user pressed login button this script is called, but only if there is no preview euid set private function loginLoginUser(): void
private function loginLoginUser()
{ {
// have to get the global stuff here for setting it later // have to get the global stuff here for setting it later
if (!$this->euid && $this->login) { if (!$this->euid && $this->login) {
@@ -372,7 +373,7 @@ class Login extends \CoreLibs\DB\IO
$q .= "(LOWER(username) = '".$this->dbEscapeString(strtolower($this->username))."') "; $q .= "(LOWER(username) = '".$this->dbEscapeString(strtolower($this->username))."') ";
$res = $this->dbReturn($q); $res = $this->dbReturn($q);
// username is wrong, but we throw for wrong username and wrong password the same error // username is wrong, but we throw for wrong username and wrong password the same error
if (!$this->cursor_ext[md5($q)]["num_rows"]) { if (!$this->cursor_ext[md5($q)]['num_rows']) {
$this->login_error = 1010; $this->login_error = 1010;
} else { } else {
// if login errors is half of max errors and the last login error was less than 10s ago, forbid any new login try // if login errors is half of max errors and the last login error was less than 10s ago, forbid any new login try
@@ -429,10 +430,13 @@ class Login extends \CoreLibs\DB\IO
$q .= "WHERE edit_user_id = ".$res['edit_user_id']; $q .= "WHERE edit_user_id = ".$res['edit_user_id'];
$this->dbExec($q); $this->dbExec($q);
} }
$pages = array();
$edit_page_ids = array(); $edit_page_ids = array();
$pages = array();
$pages_acl = array();
// set pages access // set pages access
$q = "SELECT ep.edit_page_id, ep.cuid, epca.cuid AS content_alias_uid, ep.filename, ep.name AS edit_page_name, ep.order_number AS edit_page_order, ep.menu, "; $q = "SELECT ep.edit_page_id, ep.cuid, epca.cuid AS content_alias_uid, ";
$q .= "ep.hostname, ep.filename, ep.name AS edit_page_name, ";
$q .= "ep.order_number AS edit_page_order, ep.menu, ";
$q .= "ep.popup, ep.popup_x, ep.popup_y, ep.online, ear.level, ear.type "; $q .= "ep.popup, ep.popup_x, ep.popup_y, ep.online, ear.level, ear.type ";
$q .= "FROM edit_page ep "; $q .= "FROM edit_page ep ";
$q .= "LEFT JOIN edit_page epca ON (epca.edit_page_id = ep.content_alias_edit_page_id)"; $q .= "LEFT JOIN edit_page epca ON (epca.edit_page_id = ep.content_alias_edit_page_id)";
@@ -444,10 +448,11 @@ class Login extends \CoreLibs\DB\IO
// page id array for sub data readout // page id array for sub data readout
$edit_page_ids[$res['edit_page_id']] = $res['cuid']; $edit_page_ids[$res['edit_page_id']] = $res['cuid'];
// create the array for pages // create the array for pages
$pages[$res['cuid']] = array ( $pages[$res['cuid']] = array(
'edit_page_id' => $res['edit_page_id'], 'edit_page_id' => $res['edit_page_id'],
'cuid' => $res['cuid'], 'cuid' => $res['cuid'],
'content_alias_uid' => $res['content_alias_uid'], // for reference of content data on a differen page 'content_alias_uid' => $res['content_alias_uid'], // for reference of content data on a differen page
'hostname' => $res['hostname'],
'filename' => $res['filename'], 'filename' => $res['filename'],
'page_name' => $res['edit_page_name'], 'page_name' => $res['edit_page_name'],
'order' => $res['edit_page_order'], 'order' => $res['edit_page_order'],
@@ -458,8 +463,8 @@ class Login extends \CoreLibs\DB\IO
'online' => $res['online'], 'online' => $res['online'],
'acl_level' => $res['level'], 'acl_level' => $res['level'],
'acl_type' => $res['type'], 'acl_type' => $res['type'],
'query' => array (), 'query' => array(),
'visible' => array () 'visible' => array()
); );
// make reference filename -> level // make reference filename -> level
$pages_acl[$res['filename']] = $res['level']; $pages_acl[$res['filename']] = $res['level'];
@@ -479,7 +484,7 @@ class Login extends \CoreLibs\DB\IO
$q .= "WHERE enabled = 1 AND edit_page_id IN (".join(', ', array_keys($edit_page_ids)).") "; $q .= "WHERE enabled = 1 AND edit_page_id IN (".join(', ', array_keys($edit_page_ids)).") ";
$q .= "ORDER BY eqs.edit_page_id"; $q .= "ORDER BY eqs.edit_page_id";
while ($res = $this->dbReturn($q)) { while ($res = $this->dbReturn($q)) {
$pages[$edit_page_ids[$res['edit_page_id']]]['query'][] = array ( $pages[$edit_page_ids[$res['edit_page_id']]]['query'][] = array(
'name' => $res['name'], 'name' => $res['name'],
'value' => $res['value'], 'value' => $res['value'],
'dynamic' => $res['dynamic'] 'dynamic' => $res['dynamic']
@@ -493,7 +498,7 @@ class Login extends \CoreLibs\DB\IO
$q .= "epc.edit_page_id IN (".join(', ', array_keys($edit_page_ids)).") "; $q .= "epc.edit_page_id IN (".join(', ', array_keys($edit_page_ids)).") ";
$q .= "ORDER BY epc.order_number"; $q .= "ORDER BY epc.order_number";
while ($res = $this->dbReturn($q)) { 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']] = array(
'name' => $res['name'], 'name' => $res['name'],
'uid' => $res['uid'], 'uid' => $res['uid'],
'online' => $res['online'], 'online' => $res['online'],
@@ -518,12 +523,12 @@ class Login extends \CoreLibs\DB\IO
while ($res = $this->dbReturn($q)) { while ($res = $this->dbReturn($q)) {
// read edit access data fields and drop them into the unit access array // 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']; $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 = array();
while ($res_sub = $this->dbReturn($q_sub)) { while ($res_sub = $this->dbReturn($q_sub)) {
$ea_data[$res_sub['name']] = $res_sub['value']; $ea_data[$res_sub['name']] = $res_sub['value'];
} }
// build master unit array // build master unit array
$unit_access[$res['edit_access_id']] = array ( $unit_access[$res['edit_access_id']] = array(
'id' => $res['edit_access_id'], 'id' => $res['edit_access_id'],
'acl_level' => $res['level'], 'acl_level' => $res['level'],
'acl_type' => $res['type'], 'acl_type' => $res['type'],
@@ -573,17 +578,16 @@ class Login extends \CoreLibs\DB\IO
// if there was an login error, show login screen // if there was an login error, show login screen
if ($this->login_error) { if ($this->login_error) {
// reset the perm var, to confirm logout // reset the perm var, to confirm logout
$this->permission_okay = 0; $this->permission_okay = false;
} }
} // if he pressed login at least and is not yet loggined in } // if he pressed login at least and is not yet loggined in
} }
// METHOD: loginCheckPermissions /**
// WAS : login_check_permission * for every page the user access this script checks if he is allowed to do so
// PARAMS: none * @return bool permission okay as true/false
// RETUNR none */
// DESC : for every page the user access this script checks if he is allowed to do so public function loginCheckPermissions(): bool
public function loginCheckPermissions()
{ {
if ($this->euid && $this->login_error != 103) { if ($this->euid && $this->login_error != 103) {
$q = "SELECT filename "; $q = "SELECT filename ";
@@ -595,22 +599,21 @@ class Login extends \CoreLibs\DB\IO
// if (($GLOBALS["DEBUG_ALL"] || $GLOBALS["DB_DEBUG"] || $_SESSION["DEBUG_ALL"] || $_SESSION["DB_DEBUG"]) && ini_get('memory_limit') != -1) // if (($GLOBALS["DEBUG_ALL"] || $GLOBALS["DB_DEBUG"] || $_SESSION["DEBUG_ALL"] || $_SESSION["DB_DEBUG"]) && ini_get('memory_limit') != -1)
// ini_set('memory_limit', -1); // ini_set('memory_limit', -1);
if ($res['filename'] == $this->page_name) { if ($res['filename'] == $this->page_name) {
$this->permission_okay = 1; $this->permission_okay = true;
} else { } else {
$this->login_error = 103; $this->login_error = 103;
$this->permission_okay = 0; $this->permission_okay = false;
} }
} }
// if called from public, so we can check if the permissions are ok // if called from public, so we can check if the permissions are ok
return $this->permission_okay; return $this->permission_okay;
} }
// METHOD: loginLogoutUser /**
// WAS : login_logout_user * if a user pressed on logout, destroyes session and unsets all global vars
// PARAMS: none * @return void has no return
// RETURN: none */
// DESC : if a user pressed on logout, destroyes session and unsets all global vars public function loginLogoutUser(): void
public function loginLogoutUser()
{ {
if ($this->logout || $this->login_error) { if ($this->logout || $this->login_error) {
// unregister and destroy session vars // unregister and destroy session vars
@@ -631,7 +634,7 @@ class Login extends \CoreLibs\DB\IO
unset($_SESSION['HEADER_COLOR']); unset($_SESSION['HEADER_COLOR']);
session_destroy(); session_destroy();
// then prints the login screen again // then prints the login screen again
$this->permission_okay = 0; $this->permission_okay = false;
} }
} }
@@ -653,10 +656,30 @@ class Login extends \CoreLibs\DB\IO
// * if an account ACL is set, set this parallel, account ACL overrides user ACL if it applies // * 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 // * if edit access ACL level is set, use this, else use page
// set all base ACL levels as a list keyword -> ACL number // set all base ACL levels as a list keyword -> ACL number
private function loginSetAcl() /**
* 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
* @return void has no return
*/
private function loginSetAcl(): void
{ {
// only set acl if we have permission okay // only set acl if we have permission okay
if ($this->permission_okay) { if ($this->permission_okay) {
// username (login), group name
$this->acl['user_name'] = $_SESSION['USER_NAME'];
$this->acl['group_name'] = $_SESSION['GROUP_NAME'];
// we start with the default acl // we start with the default acl
$this->acl['base'] = DEFAULT_ACL_LEVEL; $this->acl['base'] = DEFAULT_ACL_LEVEL;
@@ -708,7 +731,7 @@ class Login extends \CoreLibs\DB\IO
} }
} }
// detail name/level set // detail name/level set
$this->acl['unit_detail'][$ea_id] = array ( $this->acl['unit_detail'][$ea_id] = array(
'name' => $unit['name'], 'name' => $unit['name'],
'uid' => $unit['uid'], 'uid' => $unit['uid'],
'level' => $this->default_acl_list[$this->acl['unit'][$ea_id]]['name'], 'level' => $this->default_acl_list[$this->acl['unit'][$ea_id]]['name'],
@@ -724,9 +747,9 @@ class Login extends \CoreLibs\DB\IO
} }
// flag if to show extra edit access drop downs (because user has multiple groups assigned) // flag if to show extra edit access drop downs (because user has multiple groups assigned)
if (count($_SESSION['UNIT']) > 1) { if (count($_SESSION['UNIT']) > 1) {
$this->acl['show_ea_extra'] = 1; $this->acl['show_ea_extra'] = true;
} else { } else {
$this->acl['show_ea_extra'] = 0; $this->acl['show_ea_extra'] = false;
} }
// set the default edit access // set the default edit access
$this->acl['default_edit_access'] = $_SESSION['UNIT_DEFAULT']; $this->acl['default_edit_access'] = $_SESSION['UNIT_DEFAULT'];
@@ -741,11 +764,11 @@ class Login extends \CoreLibs\DB\IO
} }
} }
// METHOD: loginCheckEditAccess /**
// WAS : login_check_edit_access * checks if this edit access id is valid
// PARAMS: edit_access_id to check * @param int|null $edit_access_id access id pk to check
// RETURN: true/false: if the edit access is not in the valid list: false * @return bool true/false: if the edit access is not in the valid list: false
// DESC : checks if this edit access id is valid */
public function loginCheckEditAccess($edit_access_id): bool public function loginCheckEditAccess($edit_access_id): bool
{ {
if (array_key_exists($edit_access_id, $this->acl['unit'])) { if (array_key_exists($edit_access_id, $this->acl['unit'])) {
@@ -755,11 +778,12 @@ class Login extends \CoreLibs\DB\IO
} }
} }
// METHOD: loginPasswordChangeValidPassword /**
// PARAMS: the new password * checks if the password is in a valid format
// RETURN: true or false * @param string $password the new password
// DESC : checks if the password is in a valid format * @return bool true or false if valid password or not
private function loginPasswordChangeValidPassword($password) */
private function loginPasswordChangeValidPassword($password): bool
{ {
$is_valid_password = true; $is_valid_password = true;
// check for valid in regex arrays in list // check for valid in regex arrays in list
@@ -777,10 +801,20 @@ class Login extends \CoreLibs\DB\IO
return $is_valid_password; return $is_valid_password;
} }
// METHOD: loginSetPasswordMinLength /**
// PARAMS: set the minimum length * dummy declare for password forget
// RETURN: true/false on success * @return void has no return
// DESC : sets the minium length and checks on valid */
private function loginPasswordForgot(): void
{
// will do some password recovert, eg send email
}
/**
* sets the minium length and checks on valid
* @param int $length set the minimum length
* @return bool true/false on success
*/
public function loginSetPasswordMinLength(int $length): bool public function loginSetPasswordMinLength(int $length): bool
{ {
// check that numeric, positive numeric, not longer than max input string lenght // check that numeric, positive numeric, not longer than max input string lenght
@@ -793,17 +827,20 @@ class Login extends \CoreLibs\DB\IO
} }
} }
// METHOD: loginPasswordChange /**
// WAS : login_password_change * changes a user password
// PARAMS: none * @return void has no return
// RETURN: none */
// DESC : changes a user password private function loginPasswordChange(): void
private function loginPasswordChange()
{ {
if ($this->change_password) { if ($this->change_password) {
$event = 'Password Change'; $event = 'Password Change';
$data = '';
// check that given username is NOT in the deny list, else silent skip (with error log) // check that given username is NOT in the deny list, else silent skip (with error log)
if (!in_array($this->pw_username, $this->pw_change_deny_users)) { if (!in_array($this->pw_username, $this->pw_change_deny_users)) {
// init the edit user id variable
$edit_user_id = '';
// cehck if either username or old password is not set
if (!$this->pw_username || !$this->pw_old_password) { if (!$this->pw_username || !$this->pw_old_password) {
$this->login_error = 200; $this->login_error = 200;
$data = 'Missing username or old password.'; $data = 'Missing username or old password.';
@@ -850,7 +887,7 @@ class Login extends \CoreLibs\DB\IO
} }
} }
// no error change this users password // no error change this users password
if (!$this->login_error) { if (!$this->login_error && $edit_user_id) {
// update the user (edit_user_id) with the new password // 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($this->passwordSet($this->pw_new_password))."' WHERE edit_user_id = ".$edit_user_id;
$this->dbExec($q); $this->dbExec($q);
@@ -859,7 +896,7 @@ class Login extends \CoreLibs\DB\IO
} }
} else { } else {
// illegal user error // illegal user error
$this->login_error = '220'; $this->login_error = 220;
$data = 'Illegal user for password change: '.$this->pw_username; $data = 'Illegal user for password change: '.$this->pw_username;
} }
// log this password change attempt // log this password change attempt
@@ -867,96 +904,81 @@ class Login extends \CoreLibs\DB\IO
} // button pressed } // button pressed
} }
// METHOD: loginPrintLogin /**
// WAS : login_print_login * prints out login html part if no permission (error) is set
// PARAMS: none * @return ?string html data for login page, or null for nothing
// RETURN: html data for login page */
// DESC : prints out login html part if no permission (error) is set
private function loginPrintLogin() private function loginPrintLogin()
{ {
$html_string = null;
if (!$this->permission_okay) { if (!$this->permission_okay) {
// get global AJAX page trigger // set the templates now
// if true, return error ajax $this->loginSetTemplates();
global $AJAX_PAGE; // if there is a global logout target ...
if ($AJAX_PAGE === true) { if (file_exists($this->logout_target) && $this->logout_target) {
$data = array ( $LOGOUT_TARGET = $this->logout_target;
'status' => 'error',
'error_code' => $this->loging_error,
'msg' => array (
'level' => 'error',
'str' => $this->l->__('Login necessary')
)
);
$html_string = json_encode($data);
} else { } else {
// set the templates now $LOGOUT_TARGET = "";
$this->loginSetTemplates(); }
// if there is a global logout target ...
if (file_exists($this->logout_target) && $this->logout_target) {
$LOGOUT_TARGET = $this->logout_target;
} else {
$LOGOUT_TARGET = "";
}
$html_string = $this->login_template['template']; $html_string = $this->login_template['template'];
// if password change is okay // if password change is okay
if ($this->password_change) { if ($this->password_change) {
$html_string_password_change = $this->login_template['password_change']; $html_string_password_change = $this->login_template['password_change'];
// pre change the data in the PASSWORD_CHANGE_DIV first // pre change the data in the PASSWORD_CHANGE_DIV first
foreach ($this->login_template['strings'] as $string => $data) { foreach ($this->login_template['strings'] as $string => $data) {
if ($data) { if ($data) {
$html_string_password_change = str_replace('{'.$string.'}', $data, $html_string_password_change); $html_string_password_change = str_replace('{'.$string.'}', $data, $html_string_password_change);
}
} }
// print error messagae
if ($this->login_error) {
$html_string_password_change = str_replace('{ERROR_MSG}', $this->login_error_msg[$this->login_error].'<br>', $html_string_password_change);
} else {
$html_string_password_change = str_replace('{ERROR_MSG}', '<br>', $html_string_password_change);
}
// if pw change action, show the float again
if ($this->change_password && !$this->password_change_ok) {
$html_string_password_change = str_replace('{PASSWORD_CHANGE_SHOW}', '<script language="JavaScript">ShowHideDiv(\'pw_change_div\');</script>', $html_string_password_change);
} else {
$html_string_password_change = str_replace('{PASSWORD_CHANGE_SHOW}', '', $html_string_password_change);
}
$this->login_template['strings']['PASSWORD_CHANGE_DIV'] = $html_string_password_change;
} }
// put in the logout redirect string
if ($this->logout && $LOGOUT_TARGET) {
$html_string = str_replace('{LOGOUT_TARGET}', '<meta http-equiv="refresh" content="0; URL='.$LOGOUT_TARGET.'">', $html_string);
} else {
$html_string = str_replace('{LOGOUT_TARGET}', '', $html_string);
}
// print error messagae // print error messagae
if ($this->login_error) { if ($this->login_error) {
$html_string = str_replace('{ERROR_MSG}', $this->login_error_msg[$this->login_error].'<br>', $html_string); $html_string_password_change = str_replace('{ERROR_MSG}', $this->login_error_msg[$this->login_error].'<br>', $html_string_password_change);
} elseif ($this->password_change_ok && $this->password_change) {
$html_string = str_replace('{ERROR_MSG}', $this->login_error_msg[300].'<br>', $html_string);
} else { } else {
$html_string = str_replace('{ERROR_MSG}', '<br>', $html_string); $html_string_password_change = str_replace('{ERROR_MSG}', '<br>', $html_string_password_change);
} }
// if pw change action, show the float again
// create the replace array context if ($this->change_password && !$this->password_change_ok) {
foreach ($this->login_template['strings'] as $string => $data) { $html_string_password_change = str_replace('{PASSWORD_CHANGE_SHOW}', '<script language="JavaScript">ShowHideDiv(\'pw_change_div\');</script>', $html_string_password_change);
$html_string = str_replace('{'.$string.'}', $data, $html_string); } else {
$html_string_password_change = str_replace('{PASSWORD_CHANGE_SHOW}', '', $html_string_password_change);
} }
$this->login_template['strings']['PASSWORD_CHANGE_DIV'] = $html_string_password_change;
}
// put in the logout redirect string
if ($this->logout && $LOGOUT_TARGET) {
$html_string = str_replace('{LOGOUT_TARGET}', '<meta http-equiv="refresh" content="0; URL='.$LOGOUT_TARGET.'">', $html_string);
} else {
$html_string = str_replace('{LOGOUT_TARGET}', '', $html_string);
}
// print error messagae
if ($this->login_error) {
$html_string = str_replace('{ERROR_MSG}', $this->login_error_msg[$this->login_error].'<br>', $html_string);
} elseif ($this->password_change_ok && $this->password_change) {
$html_string = str_replace('{ERROR_MSG}', $this->login_error_msg[300].'<br>', $html_string);
} else {
$html_string = str_replace('{ERROR_MSG}', '<br>', $html_string);
}
// create the replace array context
foreach ($this->login_template['strings'] as $string => $data) {
$html_string = str_replace('{'.$string.'}', $data, $html_string);
} }
// return the created HTML here
return $html_string;
} // if permission is 0 then print out login } // if permission is 0 then print out login
// return the created HTML here or null for nothing
return $html_string;
} }
// METHOD: loginCloseClass /**
// WAS : login_close_class * last function called, writes log and prints out error msg and
// PARAMS: none * exists script if permission 0
// RETURN: true on permission ok, false on permission wrong * @return bool true on permission ok, false on permission wrong
// DESC : last function called, writes log and prints out error msg and exists script if permission 0 */
private function loginCloseClass() private function loginCloseClass(): bool
{ {
// write to LOG table ... // write to LOG table ...
if ($this->login_error || $this->login || $this->logout) { if ($this->login_error || $this->login || $this->logout) {
@@ -987,14 +1009,13 @@ class Login extends \CoreLibs\DB\IO
} }
} }
// METHOD: loginSetTemplates /**
// WAS : login_set_templates * checks if there are external templates, if not uses internal fallback ones
// PARAMS: none * @return void has no return
// RETURN: none */
// DESC : checks if there are external templates, if not uses internal fallback ones private function loginSetTemplates(): void
private function loginSetTemplates()
{ {
$strings = array ( $strings = array(
'HTML_TITLE' => $this->l->__('LOGIN'), 'HTML_TITLE' => $this->l->__('LOGIN'),
'TITLE' => $this->l->__('LOGIN'), 'TITLE' => $this->l->__('LOGIN'),
'USERNAME' => $this->l->__('Username'), 'USERNAME' => $this->l->__('Username'),
@@ -1005,7 +1026,7 @@ class Login extends \CoreLibs\DB\IO
'PASSWORD_CHANGE_BUTTON_VALUE' => $this->l->__('Change Password') 'PASSWORD_CHANGE_BUTTON_VALUE' => $this->l->__('Change Password')
); );
$error_msgs = array ( $error_msgs = array(
'100' => $this->l->__('Fatal Error: <b>[EUID] came in as GET/POST!</b>'), // actually obsolete '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 '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 '1011' => $this->l->__('Fatal Error: <b>Login Failed - Wrong Username or Password</b>'), // blowfish password wrong
@@ -1028,7 +1049,7 @@ class Login extends \CoreLibs\DB\IO
// if password change is okay // if password change is okay
if ($this->password_change) { if ($this->password_change) {
$strings = array_merge($strings, array ( $strings = array_merge($strings, array(
'TITLE_PASSWORD_CHANGE' => 'Change Password for User', 'TITLE_PASSWORD_CHANGE' => 'Change Password for User',
'OLD_PASSWORD' => $this->l->__('Old Password'), 'OLD_PASSWORD' => $this->l->__('Old Password'),
'NEW_PASSWORD' => $this->l->__('New Password'), 'NEW_PASSWORD' => $this->l->__('New Password'),
@@ -1055,7 +1076,7 @@ EOM;
if ($this->password_forgot) { if ($this->password_forgot) {
} }
if (!$this->password_change && !$this->password_forgot) { if (!$this->password_change && !$this->password_forgot) {
$strings = array_merge($strings, array ( $strings = array_merge($strings, array(
'JS_SHOW_HIDE' => '', 'JS_SHOW_HIDE' => '',
'PASSWORD_CHANGE_BUTTON' => '', 'PASSWORD_CHANGE_BUTTON' => '',
'PASSWORD_CHANGE_DIV' => '' 'PASSWORD_CHANGE_DIV' => ''
@@ -1143,14 +1164,15 @@ EOM;
} }
} }
// METHOD: writeLog /**
// WAS : write_log * writes detailed data into the edit user log table (keep log what user does)
// PARAMS: event -> string of what has been done * @param string $event string of what has been done
// data -> data information (id, etc) * @param string $data data information (id, etc)
// error -> if error, write error string (not enougth data, etc) * @param string|int $error error id (mostly an int)
// RETURN: none * @param string $username login user username
// DESC : writes detailed data into the edit user log table (keep log what user does) * @return void has no return
private function writeLog($event, $data, $error = '', $username = '') */
private function writeLog(string $event, string $data, $error = '', string $username = ''): void
{ {
if ($this->login) { if ($this->login) {
$this->action = 'Login'; $this->action = 'Login';
@@ -1159,7 +1181,7 @@ EOM;
} else { } else {
$this->action = ''; $this->action = '';
} }
$_data_binary = array ( $_data_binary = array(
'_SESSION' => $_SESSION, '_SESSION' => $_SESSION,
'_GET' => $_GET, '_GET' => $_GET,
'_POST' => $_POST, '_POST' => $_POST,
@@ -1194,28 +1216,34 @@ EOM;
$this->dbExec($q, 'NULL'); $this->dbExec($q, 'NULL');
} }
// METHOD: loginCheckEditAccessId /**
// WAS : login_check_edit_access_id * checks that the given edit access id is valid for this user
// PARAMS: edit access id to check * @param int|null $edit_access_id edit access id to check
// RETURN: same edit access id if ok, or the default edit access id if given one is not valud * @return int|null same edit access id if ok
// DESC : checks that the given edit access id is valid for this user * or the default edit access id if given one is not valid
public function loginCheckEditAccessId($edit_access_id) */
public function loginCheckEditAccessId(?int $edit_access_id): ?int
{ {
if (!array_key_exists($edit_access_id, $_SESSION["UNIT"])) { if (isset($_SESSION['UNIT']) &&
return $_SESSION["UNIT_DEFAULT"]; is_array($_SESSION['UNIT']) &&
!array_key_exists($edit_access_id, $_SESSION['UNIT'])
) {
return $_SESSION['UNIT_DEFAULT'];
} else { } else {
return $edit_access_id; return $edit_access_id;
} }
} }
// METHOD: loginSetEditAccessData /**
// WAS : login_set_edit_access_data * retunrn a set entry from the UNIT session for an edit access_id
// PARAMS: edit access id, key value to search for * if not found return false
// RETURN: false for not found or string for found data * @param int $edit_access_id edit access id
// DESC : searchs in the data set for the unit for the data key and returns the value asociated with it * @param string|int $data_key key value to search for
public function loginSetEditAccessData($edit_access_id, $data_key) * @return bool|string false for not found or string for found data
*/
public function loginSetEditAccessData(int $edit_access_id, $data_key)
{ {
if (!$_SESSION['UNIT'][$edit_access_id]['data'][$data_key]) { if (!isset($_SESSION['UNIT'][$edit_access_id]['data'][$data_key])) {
return false; return false;
} else { } else {
return $_SESSION['UNIT'][$edit_access_id]['data'][$data_key]; return $_SESSION['UNIT'][$edit_access_id]['data'][$data_key];

View File

@@ -1,414 +0,0 @@
<?php declare(strict_types=1);
/*********************************************************************
* AUTHOR: Clemens Schwaighofer
* CREATED: 2006/08/15
* VERSION: 1.0.0
* RELEASED LICENSE: GNU GPL 3
* DESCRIPTION
* Basic Admin interface backend
* - sets action flags
* - menu creation
* - array vars for smarty
*
* PUBLIC VARIABLES
*
* PRIVATE VARIABLES
*
* PUBLIC METHODS
*
* PRIVATE METHODS
*
* HISTORY:
*
*********************************************************************/
namespace CoreLibs\Admin;
class Backend extends \CoreLibs\DB\IO
{
// page name
public $menu = array();
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;
public $action_id;
public $action_sub_id;
public $action_yes;
public $action_flag;
public $action_menu;
public $action_loaded;
public $action_value;
public $action_error;
// ACL array variable if we want to set acl data from outisde
public $acl = array ();
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 $error = 0;
public $warning = 0;
public $info = 0;
// smarty publics
public $DATA;
public $HEADER;
public $DEBUG_DATA;
public $CONTENT_DATA;
// smarty include/set var
public $INC_TEMPLATE_NAME;
public $JS_TEMPLATE_NAME;
public $CSS_TEMPLATE_NAME;
public $CSS_SPECIAL_TEMPLATE_NAME;
public $JS_SPECIAL_TEMPLATE_NAME;
public $CACHE_ID;
public $COMPILE_ID;
public $includes;
public $template_path;
public $lang_dir;
public $javascript;
public $css;
public $pictures;
public $cache_pictures;
public $cache_pictures_root;
public $JS_INCLUDE;
public $JS_SPECIAL_INCLUDE;
public $CSS_INCLUDE;
public $CSS_SPECIAL_INCLUDE;
// language
public $l;
// CONSTRUCTOR / DECONSTRUCTOR |====================================>
// METHOD: __construct
// PARAMS: array db config
// string for language set
// int set control flag (for core basic set/get var error control)
public function __construct(array $db_config, string $lang, int $set_control_flag = 0)
{
// get the language sub class & init it
$this->l = new \CoreLibs\Language\L10n($lang);
// init the database class
parent::__construct($db_config, $set_control_flag);
// internal
$this->class_info["adbBackend"] = array(
"class_name" => "Admin Interface Backend",
"class_version" => "1.0.0",
"class_created" => "2006/08/15",
"class_author" => "Clemens Schwaighofer"
);
// set the action ids
foreach ($this->action_list as $_action) {
$this->$_action = (isset($_POST[$_action])) ? $_POST[$_action] : '';
}
$this->default_acl = DEFAULT_ACL_LEVEL;
// queue key
if (preg_match("/^(add|save|delete|remove|move|up|down|push_live)$/", $this->action)) {
$this->queue_key = $this->randomKeyGen(3);
}
}
// deconstructor
public function __destruct()
{
parent::__destruct();
}
// INTERNAL METHODS |===============================================>
// PUBLIC METHODS |=================================================>
// METHOD: adbEditLog()
// PARAMS: event -> any kind of event description,
// data -> any kind of data related to that event
// RETURN: none
// DESC : writes all action vars plus other info into edit_log table
public function adbEditLog(string $event = '', $data = '', string $write_type = 'STRING')
{
if ($write_type == 'BINARY') {
$data_binary = $this->dbEscapeBytea(bzcompress(serialize($data)));
$data = 'see bzip compressed data_binary field';
}
if ($write_type == 'STRING') {
$data_binary = '';
$data = $this->dbEscapeString(serialize($data));
}
$q = "INSERT INTO ".LOGIN_DB_SCHEMA.".edit_log ";
$q .= "(euid, event_date, event, data, data_binary, page, ";
$q .= "ip, user_agent, referer, script_name, query_string, server_name, http_host, http_accept, http_accept_charset, http_accept_encoding, session_id, ";
$q .= "action, action_id, action_yes, action_flag, action_menu, action_loaded, action_value, action_error) ";
$q .= "VALUES ";
$q .= "(".$this->dbEscapeString(isset($_SESSION['EUID']) ? $_SESSION['EUID'] : '').", ";
$q .= "NOW(), ";
$q .= "'".$this->dbEscapeString($event)."', '".$data."', '".$data_binary."', '".$this->dbEscapeString($this->page_name)."', ";
$q .= "'".@$_SERVER["REMOTE_ADDR"]."', '".$this->dbEscapeString(@$_SERVER['HTTP_USER_AGENT'])."', ";
$q .= "'".$this->dbEscapeString(isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '')."', ";
$q .= "'".$this->dbEscapeString(isset($_SERVER['SCRIPT_FILENAME']) ? $_SERVER['SCRIPT_FILENAME'] : '')."', ";
$q .= "'".$this->dbEscapeString(isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : '')."', ";
$q .= "'".$this->dbEscapeString(isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : '')."', ";
$q .= "'".$this->dbEscapeString(isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '')."', ";
$q .= "'".$this->dbEscapeString(isset($_SERVER['HTTP_ACCEPT']) ? $_SERVER['HTTP_ACCEPT'] : '')."', ";
$q .= "'".$this->dbEscapeString(isset($_SERVER['HTTP_ACCEPT_CHARSET']) ? $_SERVER['HTTP_ACCEPT_CHARSET'] : '')."', ";
$q .= "'".$this->dbEscapeString(isset($_SERVER['HTTP_ACCEPT_ENCODING']) ? $_SERVER['HTTP_ACCEPT_ENCODING'] : '')."', ";
$q .= "'".session_id()."', ";
$q .= "'".$this->dbEscapeString($this->action)."', ";
$q .= "'".$this->dbEscapeString($this->action_id)."', ";
$q .= "'".$this->dbEscapeString($this->action_yes)."', ";
$q .= "'".$this->dbEscapeString($this->action_flag)."', ";
$q .= "'".$this->dbEscapeString($this->action_menu)."', ";
$q .= "'".$this->dbEscapeString($this->action_loaded)."', ";
$q .= "'".$this->dbEscapeString($this->action_value)."', ";
$q .= "'".$this->dbEscapeString($this->action_error)."')";
$this->dbExec($q, 'NULL');
}
// METHOD: adbTopMenu
// PARAMS: level
// RETURN: returns an array for the top menu with all correct settings
// DESC : menu creater
public function adbTopMenu(int $flag = 0): array
{
if ($this->menu_show_flag) {
$flag = $this->menu_show_flag;
}
// get the session pages array
$PAGES = $_SESSION['PAGES'];
if (!isset($PAGES) || !is_array($PAGES)) {
$PAGES = array ();
}
foreach ($PAGES as $PAGE_CUID => $PAGE_DATA) {
$pages[] = $PAGE_DATA;
}
// $this->debug('pages', $this->print_ar($pages));
// if flag is 0, then we show all, else, we show only the matching flagges array points
// array is already sorted after correct order
reset($pages);
for ($i = 0, $iMax = count($pages); $i < $iMax; $i ++) {
$show = 0;
// is it visible in the menu & is it online
if ($pages[$i]['menu'] && $pages[$i]['online']) {
// check if it falls into our flag if we have a flag
if ($flag) {
foreach ($pages[$i]['visible'] as $name => $key) {
if ($key == $flag) {
$show = 1;
}
}
} else {
// if no flag given, show all menu points
$show = 1;
}
if ($show) {
// if it is popup, write popup arrayound
if (isset($pages[$i]['popup']) && $pages[$i]['popup']) {
$type = 'popup';
} else {
$type = 'normal';
$pages[$i]['popup'] = 0;
}
$query_string = '';
if (count($pages[$i]['query'])) {
for ($j = 0, $jMax = count($pages[$i]['query']); $j < $jMax; $j ++) {
if (strlen($query_string)) {
$query_string .= '&';
}
$query_string .= $pages[$i]['query'][$j]['name'].'=';
if (!$pages[$i]['query'][$j]['dynamic']) {
$query_string .= urlencode($pages[$i]['query'][$j]['value']);
} else {
$query_string .= $_GET[$pages[$i]['query'][$j]['value']] ? urlencode($_GET[$pages[$i]['query'][$j]['value']]) : urlencode($_POST[$pages[$i]['query'][$j]['value']]);
}
}
}
$url = $pages[$i]['filename'];
if (strlen($query_string)) {
$url .= '?'.$query_string;
}
$name = $pages[$i]['page_name'];
// if page name matchs -> set selected flag
$selected = 0;
if ($this->getPageName() == $pages[$i]['filename']) {
$selected = 1;
$this->page_name = $name;
}
// last check, is this menu point okay to show
$enabled = 0;
if ($this->adbShowMenuPoint($pages[$i]['filename'])) {
$enabled = 1;
}
// write in to view menu array
array_push($this->menu, array(
'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
return $this->menu;
}
// METHOD: adbShowMenuPoint
// PARAMS: filename
// RETURN: returns boolean true/false
// DESC : checks if this filename is in the current situation (user id, etc) available
public function adbShowMenuPoint(string $filename): bool
{
$enabled = false;
switch ($filename) {
default:
$enabled = true;
break;
};
return $enabled;
}
// REMARK: below function has moved to "Class.Basic"
// METHOD: adbAssocArray
// PARAMS: db array, key, value part
// RETURN: returns and associative array
// DESC : creates out of a normal db_return array an assoc array
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);
}
// REMARK: below function has moved to "Class.Basic"
// METHOD: adbByteStringFormat
// PARAMS: int
// RETURN: string
// DESC : converts bytes into formated string with KB, MB, etc
public function adbByteStringFormat($number): string
{
trigger_error('Method '.__METHOD__.' is deprecated', E_USER_DEPRECATED);
return $this->byteStringFormat($number);
}
// REMARK: below function has moved to "Class.Basic"
// METHOD: adbCreateThumbnail
// PARAMS: id from picture where from we create a thumbnail
// x -> max x size of thumbnail
// y -> max y size of thumbnail
// dummy -> if set to true, then if no images was found we show a dummy image
// path -> if source start is not ROOT path, if empty ROOT is choosen
// cache -> cache path, if not given TMP is used
// RETURN: thumbnail name
// DESC : converts picture to a thumbnail with max x and max y size
public function adbCreateThumbnail($pic, $size_x, $size_y, $dummy = false, $path = "", $cache = "")
{
trigger_error('Method '.__METHOD__.' is deprecated', E_USER_DEPRECATED);
return $this->createThumbnail($pic, $size_x, $size_y, $dummy, $path, $cache);
}
// METHOD: adbMsg
// PARAMS: level -> info/warning/error
// msg -> string, can be printf formated
// var array -> optional data for a possible printf formated msg
// RETURN: none
// DESC : wrapper function to fill up the mssages array
public function adbMsg(string $level, string $msg, array $vars = array ()): void
{
if (!preg_match("/^info|warning|error$/", $level)) {
$level = "info";
}
$this->messages[] = array (
'msg' => sprintf($this->l->__($msg), $vars),
'class' => $level
);
switch ($level) {
case 'info':
$this->info = 1;
break;
case 'warning':
$this->warning = 1;
break;
case 'error':
$this->error = 1;
break;
}
}
// METHOD: adbLiveQueue
// PARAMS: queue_key -> string to identfy the queue
// type -> INSERT/UPDATE/DELETE
// target -> target table to write to
// data -> SQL part to write, this can include #KEY_VALUE#, #KEY_NAME# for delete sub queries
// key_name -> key name, mostly used for update search
// key_value -> data for the key
// associate -> NULL for free, LOCK for first insert, group key for reference to first entry
// file -> string for special file copy actions; mostyle "test#live;..."
// RETURN: none
// DESC : writes live queue
public function adbLiveQueue(
$queue_key,
$type,
$target,
$data,
$key_name,
$key_value,
$associate = null,
$file = null
) {
$q = "INSERT INTO ".GLOBAL_DB_SCHEMA.".live_queue (";
$q .= "queue_key, key_value, key_name, type, target, data, group_key, action, associate, file";
$q .= ") VALUES (";
$q .= "'".$this->dbEscapeString($queue_key)."', '".$this->dbEscapeString($key_value)."', ";
$q .= "'".$this->dbEscapeString($key_name)."', '".$this->dbEscapeString($type)."', ";
$q .= "'".$this->dbEscapeString($target)."', '".$this->dbEscapeString($data)."', ";
$q .= "'".$this->queue_key."', '".$this->action."', '".$this->dbEscapeString($associate)."', ";
$q .= "'".$this->dbEscapeString($file)."')";
$this->db_exec($q);
}
// METHOD: adbPrintDateTime
// PARAMS: year, month, day, hour, min: the date and time values
// suffix: additional info printed after the date time variable in the drop down,
// also used for ID in the on change JS call
// minute steps: can be 1 (default), 5, 10, etc, if invalid (outside 1h range,
// it falls back to 1min)
// 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: HTML formated strings for drop down lists of date and time
// DESC : print the date/time drop downs, used in any queue/send/insert at date/time place
// NOTE : Basic class holds exact the same, except the Year/Month/Day/etc strings
// are translated in this call
public function adbPrintDateTime(
$year,
$month,
$day,
$hour,
$min,
string $suffix = '',
int $min_steps = 1,
bool $name_pos_back = false
) {
// get the build layout
$html_time = $this->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) {
$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) {
$html_time = str_replace('('.$_date.')', '('.$this->l->__($_date).')', $html_time);
}
// return the datetime select string with strings translated
return $html_time;
}
}
// __END__

View File

@@ -0,0 +1,507 @@
<?php declare(strict_types=1);
/*********************************************************************
* AUTHOR: Clemens Schwaighofer
* CREATED: 2006/08/15
* VERSION: 1.0.0
* RELEASED LICENSE: GNU GPL 3
* DESCRIPTION
* Basic Admin interface backend
* - sets action flags
* - menu creation
* - array vars for smarty
*
* PUBLIC VARIABLES
*
* PRIVATE VARIABLES
*
* PUBLIC METHODS
*
* PRIVATE METHODS
*
* HISTORY:
*
*********************************************************************/
namespace CoreLibs\Admin;
class Backend extends \CoreLibs\DB\IO
{
// page name
public $menu = array();
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;
public $action_id;
public $action_sub_id;
public $action_yes;
public $action_flag;
public $action_menu;
public $action_loaded;
public $action_value;
public $action_error;
// ACL array variable if we want to set acl data from outisde
public $acl = array();
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 $error = 0;
public $warning = 0;
public $info = 0;
// internal lang & encoding vars
public $lang_dir = '';
public $lang;
public $lang_short;
public $encoding;
// language
public $l;
// smarty publics [end processing in smarty class]
public $DATA;
public $HEADER;
public $DEBUG_DATA;
public $CONTENT_DATA;
// CONSTRUCTOR / DECONSTRUCTOR |====================================>
/**
* main class constructor
* @param array $db_config db config array
* @param int|integer $set_control_flag class variable check flag
*/
public function __construct(array $db_config, int $set_control_flag = 0)
{
$this->setLangEncoding();
// get the language sub class & init it
$this->l = new \CoreLibs\Language\L10n($this->lang);
// init the database class
parent::__construct($db_config, $set_control_flag);
// set the action ids
foreach ($this->action_list as $_action) {
$this->$_action = (isset($_POST[$_action])) ? $_POST[$_action] : '';
}
$this->default_acl = DEFAULT_ACL_LEVEL;
// queue key
if (preg_match("/^(add|save|delete|remove|move|up|down|push_live)$/", $this->action)) {
$this->queue_key = $this->randomKeyGen(3);
}
}
/**
* class deconstructor
*/
public function __destruct()
{
parent::__destruct();
}
// INTERNAL METHODS |===============================================>
/**
* set the language encoding and language settings
* use $OVERRIDE_LANG to override all language settings
* the default charset from _SESSION login or from
* config DEFAULT ENCODING
* the lang full name for mo loading from _SESSION login
* or SITE LANG or DEFAULT LANG from config
* creates short lang (only first two chars) from the lang
* @return void
*/
private function setLangEncoding(): void
{
// just emergency fallback for language
// set encoding
if (isset($_SESSION['DEFAULT_CHARSET'])) {
$this->encoding = $_SESSION['DEFAULT_CHARSET'];
} else {
$this->encoding = DEFAULT_ENCODING;
}
// gobal override
if (isset($GLOBALS['OVERRIDE_LANG'])) {
$this->lang = $GLOBALS['OVERRIDE_LANG'];
} elseif (isset($_SESSION['DEFAULT_LANG'])) {
// session (login)
$this->lang = $_SESSION['DEFAULT_LANG'];
} else {
// mostly default SITE LANG or DEFAULT LANG
$this->lang = defined('SITE_LANG') ? SITE_LANG : DEFAULT_LANG;
}
// create the char lang encoding
$this->lang_short = substr($this->lang, 0, 2);
// set the language folder
$this->lang_dir = BASE.INCLUDES.LANG.CONTENT_PATH;
}
// PUBLIC METHODS |=================================================>
/**
* set internal ACL from login ACL
* @param array $acl login acl array
*/
public function setACL(array $acl): void
{
$this->acl = $acl;
}
/**
* writes all action vars plus other info into edit_log tabl
* @param string $event any kind of event description,
* @param string|array $data any kind of data related to that event
* @param string $write_type write type can bei STRING or BINARY
* @return void has no return
*/
public function adbEditLog(string $event = '', $data = '', string $write_type = 'STRING'): void
{
$data_binary = '';
if ($write_type == 'BINARY') {
$data_binary = $this->dbEscapeBytea(bzcompress(serialize($data)));
$data = 'see bzip compressed data_binary field';
}
if ($write_type == 'STRING') {
$data_binary = '';
$data = $this->dbEscapeString(serialize($data));
}
// check schema
if (defined('LOGIN_DB_SCHEMA')) {
/** @phan-suppress-next-line PhanUndeclaredConstant */
$SCHEMA = LOGIN_DB_SCHEMA;
} elseif ($this->dbGetSchema()) {
$SCHEMA = $this->dbGetSchema();
} elseif (defined('PUBLIC_SCHEMA')) {
$SCHEMA = PUBLIC_SCHEMA;
} else {
$SCHEMA = 'public';
}
$q = "INSERT INTO ".$SCHEMA.".edit_log ";
$q .= "(euid, event_date, event, data, data_binary, page, ";
$q .= "ip, user_agent, referer, script_name, query_string, server_name, http_host, http_accept, http_accept_charset, http_accept_encoding, session_id, ";
$q .= "action, action_id, action_yes, action_flag, action_menu, action_loaded, action_value, action_error) ";
$q .= "VALUES ";
$q .= "(".$this->dbEscapeString(isset($_SESSION['EUID']) && is_numeric($_SESSION['EUID']) ? $_SESSION['EUID'] : 'NULL').", ";
$q .= "NOW(), ";
$q .= "'".$this->dbEscapeString((string)$event)."', '".$data."', '".$data_binary."', '".$this->dbEscapeString((string)$this->page_name)."', ";
$q .= "'".@$_SERVER["REMOTE_ADDR"]."', '".$this->dbEscapeString(@$_SERVER['HTTP_USER_AGENT'])."', ";
$q .= "'".$this->dbEscapeString(isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '')."', ";
$q .= "'".$this->dbEscapeString(isset($_SERVER['SCRIPT_FILENAME']) ? $_SERVER['SCRIPT_FILENAME'] : '')."', ";
$q .= "'".$this->dbEscapeString(isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : '')."', ";
$q .= "'".$this->dbEscapeString(isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : '')."', ";
$q .= "'".$this->dbEscapeString(isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '')."', ";
$q .= "'".$this->dbEscapeString(isset($_SERVER['HTTP_ACCEPT']) ? $_SERVER['HTTP_ACCEPT'] : '')."', ";
$q .= "'".$this->dbEscapeString(isset($_SERVER['HTTP_ACCEPT_CHARSET']) ? $_SERVER['HTTP_ACCEPT_CHARSET'] : '')."', ";
$q .= "'".$this->dbEscapeString(isset($_SERVER['HTTP_ACCEPT_ENCODING']) ? $_SERVER['HTTP_ACCEPT_ENCODING'] : '')."', ";
$q .= "'".session_id()."', ";
$q .= "'".$this->dbEscapeString($this->action)."', ";
$q .= "'".$this->dbEscapeString($this->action_id)."', ";
$q .= "'".$this->dbEscapeString($this->action_yes)."', ";
$q .= "'".$this->dbEscapeString($this->action_flag)."', ";
$q .= "'".$this->dbEscapeString($this->action_menu)."', ";
$q .= "'".$this->dbEscapeString($this->action_loaded)."', ";
$q .= "'".$this->dbEscapeString($this->action_value)."', ";
$q .= "'".$this->dbEscapeString($this->action_error)."')";
$this->dbExec($q, 'NULL');
}
/**
* menu creater (from login menu session pages)
* @param int $flag visible flag trigger
* @return array menu array for output on page (smarty)
*/
public function adbTopMenu(int $flag = 0): array
{
if ($this->menu_show_flag) {
$flag = $this->menu_show_flag;
}
// get the session pages array
$PAGES = isset($_SESSION['PAGES']) ? $_SESSION['PAGES'] : null;
if (!isset($PAGES) || !is_array($PAGES)) {
$PAGES = array();
}
$pages = array();
foreach ($PAGES as $PAGE_CUID => $PAGE_DATA) {
$pages[] = $PAGE_DATA;
}
// $this->debug('pages', $this->print_ar($pages));
// if flag is 0, then we show all, else, we show only the matching flagges array points
// array is already sorted after correct order
reset($pages);
foreach ($pages as $i => $data) {
// for ($i = 0, $iMax = count($pages); $i < $iMax; $i ++) {
$show = 0;
// is it visible in the menu & is it online
if ($data['menu'] && $data['online']) {
// check if it falls into our flag if we have a flag
if ($flag) {
foreach ($data['visible'] as $name => $key) {
if ($key == $flag) {
$show = 1;
}
}
} else {
// if no flag given, show all menu points
$show = 1;
}
if ($show) {
// if it is popup, write popup arrayound
if (isset($data['popup']) && $data['popup']) {
$type = 'popup';
} else {
$type = 'normal';
/** @phan-suppress-next-line PhanTypeArraySuspicious */
$data['popup'] = 0;
}
$query_string = '';
if (isset($data['query']) &&
is_array($data['query']) &&
count($data['query'])
) {
// for ($j = 0, $jMax = count($pages[$i]['query']); $j < $jMax; $j ++) {
foreach ($data['query'] as $j => $query) {
if (!empty($query['name']) &&
!empty($query['value'])
) {
if (strlen($query_string)) {
$query_string .= '&';
}
$query_string .= $query['name'].'=';
if (isset($query['dynamic']) &&
$query['dynamic']
) {
if (isset($_GET[$query['value']])) {
$query_string .= urlencode($_GET[$query['value']]);
} elseif (isset($_POST[$query['value']])) {
$query_string .= urlencode($_POST[$query['value']]);
}
} else {
$query_string .= urlencode($query['value']);
}
}
}
}
$url = '';
if (isset($data['hostname']) && $data['hostname']) {
$url .= $data['hostname'];
}
$url .= isset($data['filename']) ? $data['filename'] : '';
if (strlen($query_string)) {
$url .= '?'.$query_string;
}
$name = isset($data['page_name']) ? $data['page_name'] : '';
// if page name matchs -> set selected flag
$selected = 0;
if (isset($data['filename']) &&
$this->getPageName() == $data['filename'] &&
(!isset($data['hostname']) || (
isset($data['hostname']) &&
(!$data['hostname'] || strstr($data['hostname'], CONTENT_PATH) !== false)
))
) {
$selected = 1;
$this->page_name = $name;
}
// last check, is this menu point okay to show
$enabled = 0;
if (isset($data['filename']) &&
$this->adbShowMenuPoint($data['filename'])
) {
$enabled = 1;
}
// write in to view menu array
array_push($this->menu, array(
'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
return $this->menu;
}
/**
* checks if this filename is in the current situation (user id, etc) available
* @param string|null $filename filename
* @return bool true for visible/accessable menu point, false for not
*/
public function adbShowMenuPoint(?string $filename): bool
{
$enabled = false;
if ($filename === null) {
return $enabled;
}
switch ($filename) {
default:
$enabled = true;
break;
};
return $enabled;
}
/**
* @deprecated
* creates out of a normal db_return array an assoc array
* @param array $db_array input array
* @param string|int|bool $key key
* @param string|int|bool $value value
* @return array associative array
*/
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);
}
/**
* @deprecated
* converts bytes into formated string with KB, MB, etc
* @param string|int|float $number string or int or number
* @return string formatted string
*/
public function adbByteStringFormat($number): string
{
trigger_error('Method '.__METHOD__.' is deprecated', E_USER_DEPRECATED);
return $this->humanReadableByteFormat($number);
}
/**
* @deprecated
* 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
* @return string|bool thumbnail name, or false for error
*/
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);
}
/**
* wrapper function to fill up the mssages array
* @param string $level info/warning/error
* @param string $msg string, can be printf formated
* @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
{
if (!preg_match("/^info|warning|error$/", $level)) {
$level = "info";
}
$this->messages[] = array(
'msg' => vsprintf($this->l->__($msg), $vars),
'class' => $level
);
switch ($level) {
case 'info':
$this->info = 1;
break;
case 'warning':
$this->warning = 1;
break;
case 'error':
$this->error = 1;
break;
}
}
/**
* writes live queue
* @param string $queue_key string to identfy the queue
* @param string $type [description]
* @param string $target [description]
* @param string $data [description]
* @param string $key_name [description]
* @param string $key_value [description]
* @param ?string $associate [description]
* @param ?string $file [description]
* @return void has no return
*/
public function adbLiveQueue(
string $queue_key,
string $type,
string $target,
string $data,
string $key_name,
string $key_value,
string $associate = null,
string $file = null
): void {
if (defined('GLOBAL_DB_SCHEMA')) {
/** @phan-suppress-next-line PhanUndeclaredConstant */
$SCHEMA = GLOBAL_DB_SCHEMA;
} elseif ($this->dbGetSchema()) {
$SCHEMA = $this->dbGetSchema();
} elseif (defined('PUBLIC_SCHEMA')) {
$SCHEMA = PUBLIC_SCHEMA;
} else {
$SCHEMA = 'public';
}
$q = "INSERT INTO ".$SCHEMA.".live_queue (";
$q .= "queue_key, key_value, key_name, type, target, data, group_key, action, associate, file";
$q .= ") VALUES (";
$q .= "'".$this->dbEscapeString($queue_key)."', '".$this->dbEscapeString($key_value)."', ";
$q .= "'".$this->dbEscapeString($key_name)."', '".$this->dbEscapeString($type)."', ";
$q .= "'".$this->dbEscapeString($target)."', '".$this->dbEscapeString($data)."', ";
$q .= "'".$this->queue_key."', '".$this->action."', '".$this->dbEscapeString((string)$associate)."', ";
$q .= "'".$this->dbEscapeString((string)$file)."')";
$this->dbExec($q);
}
/**
* Basic class holds exact the same, except the Year/Month/Day/etc strings
* are translated in this call
* @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 function adbPrintDateTime(
$year,
$month,
$day,
$hour,
$min,
string $suffix = '',
int $min_steps = 1,
bool $name_pos_back = false
) {
// get the build layout
$html_time = $this->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) {
$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) {
$html_time = str_replace('('.$_date.')', '('.$this->l->__($_date).')', $html_time);
}
// return the datetime select string with strings translated
return $html_time;
}
}
// __END__

File diff suppressed because it is too large Load Diff

View File

@@ -6,7 +6,7 @@
* RELEASED LICENSE: GNU GPL 3 * RELEASED LICENSE: GNU GPL 3
* SHORT DESC :RIPTION: * SHORT DESC :RIPTION:
* DB Array IO Class: * DB Array IO Class:
* writes, reads or deletes a complete array (one data set) in/out a * writes, reads or deletes a complete array(one data set) in/out a
* table from the connected DB. * table from the connected DB.
* you don't have to write any SQL queries, worry over update/insert * you don't have to write any SQL queries, worry over update/insert
* *
@@ -48,14 +48,14 @@ class ArrayIO extends \CoreLibs\DB\IO
public $pk_name; // the primary key from this table public $pk_name; // the primary key from this table
public $pk_id; // the PK id public $pk_id; // the PK id
// METHOD: db_array_io /**
// PARAMS: db_config -> db_io class init vars * constructor for the array io class, set the
// table_array -> the array from the table * primary key name automatically (from array)
// table_name -> name of the table (for the array) * @param array $db_config db connection config
// set_control_flag -> set basic class set/get variable error flags * @param array $table_array table array config
// RETURN: none * @param string $table_name table name string
// DESC : constructor for the array io class, set the * @param int|integer $set_control_flag set basic class set/get variable error flags
// primary key name automatically (from array) */
public function __construct(array $db_config, array $table_array, string $table_name, int $set_control_flag = 0) public function __construct(array $db_config, array $table_array, string $table_name, int $set_control_flag = 0)
{ {
// instance db_io class // instance db_io class
@@ -75,31 +75,25 @@ class ArrayIO extends \CoreLibs\DB\IO
} }
} }
} // set pk_name IF table_array was given } // set pk_name IF table_array was given
// internal
$this->class_info['db_array_io'] = array (
'class_name' => 'DB Array IO',
'class_version' => '1.0.0',
'class_created' => '2002/12/17',
'class_author' => 'Clemens Schwaighofer'
);
// echo "CALSS INFO POST [A]: <pre>".print_r($this->class_info, true)."</pre><br>";
} }
// deconstruktor /**
* class deconstructor
*/
public function __destruct() public function __destruct()
{ {
parent::__destruct(); parent::__destruct();
} }
// METHOD: convertData /**
// WAS : convert_data * changes all previously alterd HTML code into visible one,
// PARAMS: string -> the string that should be changed * works for <b>,<i>, and <a> (thought <a> can be / or should
// RETURN: string -> the altered string * be handled with the magic links functions
// DESC : changes all previously alterd HTML code into visible one, * used with the read function
// works for <b>,<i>, and <a> (thought <a> can be / or should * @param string $text any html encoded string
// be handled with the magic links functions * @return string decoded html string
// used with the read function */
public function convertData($text) public function convertData($text): string
{ {
$text = str_replace('&lt;b&gt;', '<b>', $text); $text = str_replace('&lt;b&gt;', '<b>', $text);
$text = str_replace('&lt;/b&gt;', '</b>', $text); $text = str_replace('&lt;/b&gt;', '</b>', $text);
@@ -117,7 +111,12 @@ class ArrayIO extends \CoreLibs\DB\IO
// PARAMS: string -> string to be changed // PARAMS: string -> string to be changed
// RETURN: string -> altered string // RETURN: string -> altered string
// DESC : changeds all HTML entities into non HTML ones // DESC : changeds all HTML entities into non HTML ones
public function convertEntities($text) /**
* changeds all HTML entities into non HTML ones
* @param string $text encoded html string
* @return string decoded html string
*/
public function convertEntities($text): string
{ {
$text = str_replace('&lt;', '<', $text); $text = str_replace('&lt;', '<', $text);
$text = str_replace('&gt;', '>', $text); $text = str_replace('&gt;', '>', $text);
@@ -127,12 +126,12 @@ class ArrayIO extends \CoreLibs\DB\IO
return $text; return $text;
} }
// METHOD: dbDumpArray /**
// WAS : db_dump_array * dumps the current data
// PARAMS: none * @param bool $write write to error message, default false
// RETURN: returns the current array * @return string the array data as html string entry
// DESC : dumps the current data */
public function dbDumpArray($write = 0) public function dbDumpArray($write = false): string
{ {
reset($this->table_array); reset($this->table_array);
$string = ''; $string = '';
@@ -140,17 +139,16 @@ class ArrayIO extends \CoreLibs\DB\IO
$string .= '<b>'.$column.'</b> -> '.$data_array['value'].'<br>'; $string .= '<b>'.$column.'</b> -> '.$data_array['value'].'<br>';
} }
// add output to internal error_msg // add output to internal error_msg
if ($write) { if ($write === true) {
$this->error_msg['db'] .= $string; $this->error_msg['db'] .= $string;
} }
return $string; return $string;
} }
// METHOD: dbCheckPkSet /**
// WAS : db_check_pk_set * checks if pk is set and if not, set from pk_id and if this also not set return 0
// PARAMS: none * @return bool true if pk value is set, else false
// RETURN: none */
// DESC : checks if pk is set and if not, set from pk_id and if this also not set return 0
public function dbCheckPkSet() public function dbCheckPkSet()
{ {
// if pk_id is set, overrule ... // if pk_id is set, overrule ...
@@ -162,18 +160,18 @@ class ArrayIO extends \CoreLibs\DB\IO
// if no PK found, error ... // if no PK found, error ...
$this->error_id = 91; $this->error_id = 91;
$this->__dbError(); $this->__dbError();
return 0; return false;
} else { } else {
return 1; return true;
} }
} }
// METHOD: dbResetArray /**
// WAS : db_reset_array * resets the whole array values
// PARAMS: reset_pk -> if set reset the pk too * @param boolean $reset_pk true if we want to reset the pk too
// RETURN: none * @return void has no return
// DESC : resets the whole array */
public function dbResetArray($reset_pk = 0) public function dbResetArray($reset_pk = false): void
{ {
reset($this->table_array); reset($this->table_array);
foreach ($this->table_array as $column => $data_array) { foreach ($this->table_array as $column => $data_array) {
@@ -185,14 +183,16 @@ class ArrayIO extends \CoreLibs\DB\IO
} }
} }
// METHOD: dbDelete /**
// WAS : db_delete * deletes one dataset
// PARAMS: optional the table_array, if not given uses class var * @param array $table_array optional override for table array set
// RETURN: 1 for successfull delete or 0 for error * set this as new table array too
// DESC : deletes one dataset * @return array returns the table array that was deleted
public function dbDelete($table_array = 0) */
public function dbDelete($table_array = array())
{ {
if (is_array($table_array)) { // is array and has values, override set and set new
if (is_array($table_array) && count($table_array)) {
$this->table_array = $table_array; $this->table_array = $table_array;
} }
if (!$this->dbCheckPkSet()) { if (!$this->dbCheckPkSet()) {
@@ -234,7 +234,7 @@ class ArrayIO extends \CoreLibs\DB\IO
$q .= ' AND '.$q_where; $q .= ' AND '.$q_where;
} }
// if 0, error // if 0, error
unset($this->pk_id); $this->pk_id = null;
if (!$this->dbExec($q)) { if (!$this->dbExec($q)) {
$this->error_id = 92; $this->error_id = 92;
$this->__dbError(); $this->__dbError();
@@ -242,15 +242,16 @@ class ArrayIO extends \CoreLibs\DB\IO
return $this->table_array; return $this->table_array;
} }
// METHOD: dbRead /**
// WAS : db_read * reads one row into the array
// PARAMS: edit -> if 1 data will not be altered for output, optional the table_array, if not given uses class var * @param boolean $edit on true convert data, else as is
// RETURN: true or false for reading * @param array $table_array optional table array, overwrites internal set array
// DESC : reads one row into the array * @return array set table array with values
public function dbRead($edit = 0, $table_array = 0) */
public function dbRead($edit = false, $table_array = array())
{ {
// if array give, overrules internal array // if array give, overrules internal array
if (is_array($table_array)) { if (is_array($table_array) && count($table_array)) {
$this->table_array = $table_array; $this->table_array = $table_array;
} }
if (!$this->dbCheckPkSet()) { if (!$this->dbCheckPkSet()) {
@@ -288,7 +289,7 @@ class ArrayIO extends \CoreLibs\DB\IO
if ($res = $this->dbFetchArray()) { if ($res = $this->dbFetchArray()) {
reset($this->table_array); reset($this->table_array);
foreach ($this->table_array as $column => $data_array) { foreach ($this->table_array as $column => $data_array) {
// wenn "edit" dann gib daten wie in DB zurck, ansonten aufbereiten fr ausgabe // wenn "edit" dann gib daten wie in DB zurück, ansonten aufbereiten fr ausgabe
// ?? sollte das nicht drauen ??? man weis ja net was da drin steht --> is noch zu berlegen // ?? sollte das nicht drauen ??? man weis ja net was da drin steht --> is noch zu berlegen
// echo 'EDIT: $edit | Spalte: $column | type: '.$this->table_array[$column]['type'].' | Res: '.$res[$column].'<br>'; // echo 'EDIT: $edit | Spalte: $column | type: '.$this->table_array[$column]['type'].' | Res: '.$res[$column].'<br>';
if ($edit) { if ($edit) {
@@ -314,14 +315,15 @@ class ArrayIO extends \CoreLibs\DB\IO
return $this->table_array; return $this->table_array;
} }
// METHOD: dbWrite /**
// WAS : db_write * writes one set into DB or updates one set (if PK exists)
// PARAMS: addslashes -> if 1 will make an addslashes for each array field, optional the table_array, if not given uses class var * @param boolean $addslashes old convert entities and set set escape
// RETURN: true or false on write * @param array $table_array optional table array, overwrites internal one
// DESC : writes on set into DB or updates one set (if PK exists) * @return array table array or null
public function dbWrite($addslashes = 0, $table_array = 0) */
public function dbWrite($addslashes = false, $table_array = array())
{ {
if (is_array($table_array)) { if (is_array($table_array) && count($table_array)) {
$this->table_array = $table_array; $this->table_array = $table_array;
} }
// PK ID check // PK ID check
@@ -419,7 +421,9 @@ class ArrayIO extends \CoreLibs\DB\IO
} }
// integer is different // integer is different
if (isset($this->table_array[$column]['int']) || isset($this->table_array[$column]['int_null'])) { 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'].'] VALUE SET: '.isset($this->table_array[$column]['value']).' | INT NULL: '.isset($this->table_array[$column]['int_null'])); $this->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']) && if (isset($this->table_array[$column]['value']) &&
!$this->table_array[$column]['value'] && !$this->table_array[$column]['value'] &&
isset($this->table_array[$column]['int_null']) isset($this->table_array[$column]['int_null'])
@@ -444,6 +448,9 @@ class ArrayIO extends \CoreLibs\DB\IO
$_value = 'NULL'; $_value = 'NULL';
} elseif (isset($this->table_array[$column]['value'])) { } elseif (isset($this->table_array[$column]['value'])) {
$_value = $this->table_array[$column]['value']; $_value = $this->table_array[$column]['value'];
} else {
// fallback
$_value = 'NULL';
} }
$q_data .= $_value; $q_data .= $_value;
} else { } else {
@@ -522,73 +529,11 @@ class ArrayIO extends \CoreLibs\DB\IO
// set primary key // set primary key
if ($insert) { if ($insert) {
$this->table_array[$this->pk_name]['value'] = $this->insert_id; $this->table_array[$this->pk_name]['value'] = $this->insert_id;
$this->ok = $this->insert_id; $this->pk_id = $this->insert_id;
} }
// return the table if needed // return the table if needed
return $this->table_array; return $this->table_array;
} }
// *************************************************************
// COMPATIBILITY METHODS
// those methods are deprecated function call names
// they exist for backwards compatibility only
// *************************************************************
public function convert_data($text)
{
error_log('DEPRECATED CALL: '.__METHOD__.', '.__FILE__.':'.__LINE__.', '.debug_backtrace()[0]['file'].':'.debug_backtrace()[0]['line']);
trigger_error('Method '.__METHOD__.' is deprecated', E_USER_DEPRECATED);
return $this->convertData($text);
}
public function convert_entities($text)
{
error_log('DEPRECATED CALL: '.__METHOD__.', '.__FILE__.':'.__LINE__.', '.debug_backtrace()[0]['file'].':'.debug_backtrace()[0]['line']);
trigger_error('Method '.__METHOD__.' is deprecated', E_USER_DEPRECATED);
return $this->convertEntities($text);
}
public function db_dump_array($write = 0)
{
error_log('DEPRECATED CALL: '.__METHOD__.', '.__FILE__.':'.__LINE__.', '.debug_backtrace()[0]['file'].':'.debug_backtrace()[0]['line']);
trigger_error('Method '.__METHOD__.' is deprecated', E_USER_DEPRECATED);
return $this->dbDumpArray($write);
}
public function db_check_pk_set()
{
error_log('DEPRECATED CALL: '.__METHOD__.', '.__FILE__.':'.__LINE__.', '.debug_backtrace()[0]['file'].':'.debug_backtrace()[0]['line']);
trigger_error('Method '.__METHOD__.' is deprecated', E_USER_DEPRECATED);
return $this->dbCheckPkSet();
}
public function db_reset_array($reset_pk = 0)
{
error_log('DEPRECATED CALL: '.__METHOD__.', '.__FILE__.':'.__LINE__.', '.debug_backtrace()[0]['file'].':'.debug_backtrace()[0]['line']);
trigger_error('Method '.__METHOD__.' is deprecated', E_USER_DEPRECATED);
return $this->dbResetArray($reset_pk);
}
public function db_delete($table_array = 0)
{
error_log('DEPRECATED CALL: '.__METHOD__.', '.__FILE__.':'.__LINE__.', '.debug_backtrace()[0]['file'].':'.debug_backtrace()[0]['line']);
trigger_error('Method '.__METHOD__.' is deprecated', E_USER_DEPRECATED);
return $this->dbDelete($table_array);
}
public function db_read($edit = 0, $table_array = 0)
{
error_log('DEPRECATED CALL: '.__METHOD__.', '.__FILE__.':'.__LINE__.', '.debug_backtrace()[0]['file'].':'.debug_backtrace()[0]['line']);
trigger_error('Method '.__METHOD__.' is deprecated', E_USER_DEPRECATED);
return $this->dbRead($edit, $table_array);
}
public function db_write($addslashes = 0, $table_array = 0)
{
error_log('DEPRECATED CALL: '.__METHOD__.', '.__FILE__.':'.__LINE__.', '.debug_backtrace()[0]['file'].':'.debug_backtrace()[0]['line']);
trigger_error('Method '.__METHOD__.' is deprecated', E_USER_DEPRECATED);
return $this->dbWrite($addslashes, $table_array);
}
} // end of class } // end of class
// __END__ // __END__

File diff suppressed because it is too large Load Diff

View File

@@ -1,446 +0,0 @@
<?php declare(strict_types=1);
/*********************************************************************
* AUTHOR: Clemens Schwaighofer
* CREATED: 2003/04/09
* SHORT DESCRIPTION:
* 2018/3/23, the whole class system is transformed to namespaces
* also all internal class calls are converted to camel case
*
* pgsql wrapper calls
*
* HISTORY:
* 2008/04/16 (cs) wrapper for pg escape string
* 2007/01/11 (cs) add prepare/execute for postgres
* 2006/09/12 (cs) in case db_query retuns false, save the query and run the query through the send/get procedure to get correct error data from the db
* 2006/06/26 (cs) added port for db connection
* 2006/04/03 (cs) added meta data for table
* 2005/07/25 (cs) removed the plural s remove, not needed and not 100% working
* 2005/07/07 (cs) the default it is table_name _ id
* 2005/01/19 (cs) changed the pgsql connect, so it dies if it can't connect to the DB
* 2004/09/30 (cs) layout cleanup
* /
* collection of PostgreSQL wrappers
* REQUIRES 5.x PHP!!!
*
* pg_prepare
* pg_execute
* pg_num_rows
* pg_num_fields
* pg_field_name
* pg_affected_rows (*)
* pg_fetch_array
* pg_query
* pg_send_query
* pg_get_result
* pg_connection_busy
* pg_close
* pg_connect (*)
* pg_meta_data
* pg_escape_string
*
*/
namespace CoreLibs\DB\SQL;
class PgSQL
{
private $last_error_query;
private $dbh;
// METHOD: __construct
// PARAMS: none
// RETURN: none
// DESC : class constructor
public function __construct()
{
}
// METHOD: __dbLastErrorQuery
// WAS : _db_last_error_query
// PARAMS: none
// RETURN: true/false if last error is set
// DESC : queries last error query and returns true or false if error was set
public function __dbLastErrorQuery()
{
if ($this->last_error_query) {
return true;
} else {
return false;
}
}
// METHOD: __dbQuery
// WAS : _db_query
// PARAMS: query
// RETURN: query result
// DESC : wrapper for gp_query, catches error and stores it in class var
public function __dbQuery($query)
{
$this->last_error_query = '';
// read out the query status and save the query if needed
$result = pg_query($this->dbh, $query);
if (!$result) {
$this->last_error_query = $query;
}
return $result;
}
// METHOD: __dbSendQuery
// WAS : _db_send_query
// PARAMS: query
// RETURN: true/false if query was sent successful
// DESC : sends an async query to the server
public function __dbSendQuery($query)
{
return pg_send_query($this->dbh, $query);
}
// METHOD: __dbGetResult
// WAS : _db_get_result
// PARAMS: none
// RETURN: resource handler
// DESC : wrapper for pg_get_result
public function __dbGetResult()
{
$this->last_error_query = '';
$result = pg_get_result($this->dbh);
if ($error = pg_result_error($result)) {
$this->last_error_query = $error;
}
return $result;
}
// METHOD: __dbClose
// WAS : _db_close
// PARAMS: none
// RETURN: none
// DESC : wrapper for pg_close
public function __dbClose()
{
if (is_resource($this->dbh)) {
if (pg_connection_status($this->dbh) === PGSQL_CONNECTION_OK) {
pg_close($this->dbh);
}
}
}
// METHOD: __dbPrepare
// WAS : _db_prepare
// PARAMS: prepare name, query
// RETURN: prepared statement handler
// DESC : wrapper for pg_prepare
public function __dbPrepare($name, $query)
{
$result = pg_prepare($this->dbh, $name, $query);
if (!$result) {
$this->last_error_query = $query;
}
return $result;
}
// METHOD: __dbExecute
// WAS : _db_execute
// PARAMS: prepare name, data for query
// RETURN: returns status
// DESC : wrapper for pg_execute for running a prepared statement
public function __dbExecute($name, $data)
{
$result = pg_execute($this->dbh, $name, $data);
if (!$result) {
$this->last_error_query = $name;
}
return $result;
}
// METHOD: __dbNumRows
// WAS : _db_num_rows
// PARAMS: cursor
// RETURN: rows
// DESC : wrapper for pg_num_rows
public function __dbNumRows($cursor)
{
return pg_num_rows($cursor);
}
// METHOD: __dbNumFields
// WAS : _db_num_fields
// PARAMS: cursor
// RETURN: number for fields in query
// DESC : wrapper for pg_num_fields
public function __dbNumFields($cursor)
{
return pg_num_fields($cursor);
}
// METHOD: __dbFieldName
// WAS : _db_field_name
// PARAMS: cursor, field position
// RETURN: name of field
// DESC : wrapper for pg_field_name
public function __dbFieldName($cursor, $i)
{
return pg_field_name($cursor, $i);
}
// METHOD: __dbFetchArray
// WAS : _db_fetch_array
// PARAMS: cursor, opt result type
// RETURN: row
// DESC : wrapper for pg_fetch_array
public function __dbFetchArray($cursor, $result_type = '')
{
if ($result_type == true) {
$result_type = PGSQL_ASSOC;
}
// result type is passed on as is [should be checked]
if ($result_type) {
return pg_fetch_array($cursor, null, $result_type);
} else {
return pg_fetch_array($cursor);
}
}
// METHOD: __dbResultType
// PARAMS: true/false for ASSOC only or BOTH
// RETURN: PGSQL assoc type
// DESC : simple match up between assoc true/false
public function __dbResultType($assoc_type)
{
if ($assoc_type == true) {
return PGSQL_ASSOC;
}
return ''; // fallback to default
}
// METHOD: __dbFetchAll
// WAS : _db_fetch_all
// PARAMS: cursor
// RETURN: all rows as array
// DESC : wrapper for pg_fetch_array
public function __dbFetchAll($cursor)
{
return pg_fetch_all($cursor);
}
// METHOD: __dbAffectedRows
// WAS : _db_affected_rows
// PARAMS: cursor
// RETURN: number for rows
// DESC : wrapper for pg_affected_rows
public function __dbAffectedRows($cursor)
{
return pg_affected_rows($cursor);
}
// METHOD: __dbInsertId
// WAS : _db_insert_id
// PARAMS: query, primary key name
// RETURN: last insert primary key
// DESC : reads the last inserted primary key for the query
// if ther is no pk_name tries to auto built it from the table name
// this only works if db schema is after "no plural names. and pk name is table name + _id
// detects schema prefix in table name
public function __dbInsertId($query, $pk_name)
{
// only if an insert has been done
if (preg_match("/^insert /i", $query)) {
$schema = '';
// get table name from insert
$array = explode(' ', $query);
$_table = $array[2];
// if there is a dot inside, we need to split
if (strstr($_table, '.')) {
list($schema, $table) = explode('.', $_table);
} else {
$table = $_table;
}
// no PK name given at all
if (!$pk_name) {
// if name is plurar, make it singular
// if (preg_match("/.*s$/i", $table))
// $table = substr($table, 0, -1);
// set pk_name to "id"
$pk_name = $table."_id";
}
$seq = (($schema) ? $schema.'.' : '').$table."_".$pk_name."_seq";
$q = "SELECT CURRVAL('$seq') AS insert_id";
// I have to do manually or I overwrite the original insert internal vars ...
if ($q = $this->__dbQuery($q)) {
list($id) = $this->__dbFetchArray($q);
} else {
$id = array(-1, $q);
}
return $id;
}
}
// METHOD: __dbPrimaryKey
// WAS : _db_primary_key
// PARAMS: table and optional schema
// RETURN: primary key name OR false if not possible
// DESC : queries database for the primary key name to this table in the selected schema
public function __dbPrimaryKey($table, $schema = '')
{
if ($table) {
// check if schema set is different from schema given, only needed if schema is not empty
$table_prefix = '';
if ($schema) {
$q = "SHOW search_path";
$cursor = $this->__dbQuery($q);
$search_path = $this->__dbFetchArray($cursor)['search_path'];
if ($search_path != $schema) {
$table_prefix = $schema.'.';
}
}
// read from table the PK name
// faster primary key get
$q = "SELECT pg_attribute.attname AS column_name, format_type(pg_attribute.atttypid, pg_attribute.atttypmod) AS type ";
$q .= "FROM pg_index, pg_class, pg_attribute ";
if ($schema) {
$q .= ", pg_namespace ";
}
$q .= "WHERE ";
// regclass translates the OID to the name
$q .= "pg_class.oid = '".$table_prefix.$table."'::regclass AND ";
$q .= "indrelid = pg_class.oid AND ";
if ($schema) {
$q .= "nspname = '".$schema."' AND ";
$q .= "pg_class.relnamespace = pg_namespace.oid AND ";
}
$q .= "pg_attribute.attrelid = pg_class.oid AND ";
$q .= "pg_attribute.attnum = any(pg_index.indkey) ";
$q .= "AND indisprimary";
$cursor = $this->__dbQuery($q);
if ($cursor) {
return $this->__dbFetchArray($cursor)['column_name'];
} else {
return false;
}
} else {
return false;
}
}
// METHOD: __dbConnect
// WAS : _db_connect
// PARAMS: host name, user name, password, database name, optional port (defaults to default postgres port), optional ssl (default allow)
// RETURN: database handler
// DESC : wrapper for pg_connect, writes out failure to screen if error occurs (hidden var)
public function __dbConnect($db_host, $db_user, $db_pass, $db_name, $db_port = 5432, $db_ssl = 'allow')
{
// to avoid empty db_port
if (!$db_port) {
$db_port = 5432;
}
$this->dbh = pg_connect("host=".$db_host." port=".$db_port." user=".$db_user." password=".$db_pass." dbname=".$db_name." sslmode=".$db_ssl);
if (!$this->dbh) {
die("<!-- Can't connect [host=".$db_host." port=".$db_port." user=".$db_user." password=XXXX dbname=".$db_name." sslmode=".$db_ssl."] //-->");
}
return $this->dbh;
}
// METHOD: __dbPrintError
// WAS : _db_print_error
// PARAMS: database handler, cursor
// RETURN: error string (HTML)
// DESC : reads the last error for this cursor
public function __dbPrintError($cursor = '')
{
// run the query again for the error result here
if (!$cursor && $this->last_error_query) {
pg_send_query($this->dbh, $this->last_error_query);
$this->last_error_query = '';
$cursor = pg_get_result($this->dbh);
}
if (pg_result_error($cursor)) {
return "<span style=\"color: red;\"><b>-PostgreSQL-Error-></b> ".pg_result_error($cursor)."</span><br>";
}
}
// METHOD: __dbMetaData
// WAS : _db_meta_data
// PARAMS: table name
// RETURN: array with table data
// DESC : wrapper for pg_emta_data
public function __dbMetaData($table)
{
// needs to prefixed with @ or it throws a warning on not existing table
return @pg_meta_data($this->dbh, $table);
}
// METHOD: __dbEscapeString
// WAS : _db_escape_string
// PARAMS: string
// RETURN: escaped string for postgres
// DESC : wrapper for pg_escape_string
public function __dbEscapeString($string)
{
return pg_escape_string($this->dbh, (string)$string);
}
// METHOD: __dbEscapeBytea
// WAS : _db_escape_bytea
// PARAMS: string
// RETURN: escape bytes for postgres
// DESC : wrapper for pg_escape_bytea
public function __dbEscapeBytea($bytea)
{
return pg_escape_bytea($this->dbh, $bytea);
}
// METHOD: __dbConnectionBusy
// WAS : _db_connection_busy
// PARAMS: none
// RETURN: true/false for busy connection
// DESC : wrapper for pg_connection_busy
public function __dbConnectionBusy()
{
return pg_connection_busy($this->dbh);
}
// METHOD: __dbVersion
// WAS : _db_version
// PARAMS: none
// RETURN: databse version
// DESC : wrapper for pg_version
public function __dbVersion()
{
// array has client, protocol, server
// we just need the server
$v = pg_version($this->dbh);
return $v['server'];
}
// METHOD: __dbArrayParse
// WAS : _db_array_parse
// PARAMS: input text, output array [needed]
// [internal] limit: are we at the end of the parse
// [internal] offset: shift for {}
// RETURN: array with the elements
// DESC : postgresql array to php array
public function __dbArrayParse($text, &$output, $limit = false, $offset = 1)
{
if (false === $limit) {
$limit = strlen($text) - 1;
$output = array();
}
if ('{}' != $text) {
do {
if ('{' != $text{$offset}) {
preg_match("/(\\{?\"([^\"\\\\]|\\\\.)*\"|[^,{}]+)+([,}]+)/", $text, $match, 0, $offset);
$offset += strlen($match[0]);
$output[] = ('"' != $match[1]{0} ? $match[1] : stripcslashes(substr($match[1], 1, -1)));
if ('},' == $match[3]) {
return $offset;
}
} else {
$offset = pg_array_parse($text, $output[], $limit, $offset + 1);
}
} while ($limit > $offset);
}
return $output;
}
}
// __END__

View File

@@ -0,0 +1,467 @@
<?php declare(strict_types=1);
/*********************************************************************
* AUTHOR: Clemens Schwaighofer
* CREATED: 2003/04/09
* SHORT DESCRIPTION:
* 2018/3/23, the whole class system is transformed to namespaces
* also all internal class calls are converted to camel case
*
* pgsql wrapper calls
*
* HISTORY:
* 2008/04/16 (cs) wrapper for pg escape string
* 2007/01/11 (cs) add prepare/execute for postgres
* 2006/09/12 (cs) in case db_query retuns false, save the query and run the query through the send/get procedure to get correct error data from the db
* 2006/06/26 (cs) added port for db connection
* 2006/04/03 (cs) added meta data for table
* 2005/07/25 (cs) removed the plural s remove, not needed and not 100% working
* 2005/07/07 (cs) the default it is table_name _ id
* 2005/01/19 (cs) changed the pgsql connect, so it dies if it can't connect to the DB
* 2004/09/30 (cs) layout cleanup
* /
* collection of PostgreSQL wrappers
* REQUIRES 5.x PHP!!!
*
* pg_prepare
* pg_execute
* pg_num_rows
* pg_num_fields
* pg_field_name
* pg_affected_rows (*)
* pg_fetch_array
* pg_query
* pg_send_query
* pg_get_result
* pg_connection_busy
* pg_close
* pg_connect (*)
* pg_meta_data
* pg_escape_string
*
*/
namespace CoreLibs\DB\SQL;
class PgSQL
{
private $last_error_query;
private $dbh;
/**
* class constructor, empty does nothing
*/
public function __construct()
{
}
/**
* queries last error query and returns true or false if error was set
* @return bool true/false if last error is set
*/
public function __dbLastErrorQuery()
{
if ($this->last_error_query) {
return true;
} else {
return false;
}
}
/**
* wrapper for gp_query, catches error and stores it in class var
* @param string $query query string
* @return resource|bool query result
*/
public function __dbQuery(string $query)
{
$this->last_error_query = '';
// read out the query status and save the query if needed
$result = pg_query($this->dbh, $query);
if (!$result) {
$this->last_error_query = $query;
}
return $result;
}
/**
* sends an async query to the server
* @param string $query query string
* @return bool true/false if query was sent successful
*/
public function __dbSendQuery(string $query): bool
{
return pg_send_query($this->dbh, $query);
}
/**
* wrapper for pg_get_result
* @return resource|bool resource handler or false for error
*/
public function __dbGetResult()
{
$this->last_error_query = '';
$result = pg_get_result($this->dbh);
if ($error = pg_result_error($result)) {
$this->last_error_query = $error;
}
return $result;
}
/**
* wrapper for pg_close
* @return void has no return
*/
public function __dbClose(): void
{
if (is_resource($this->dbh)) {
if (pg_connection_status($this->dbh) === PGSQL_CONNECTION_OK) {
pg_close($this->dbh);
}
}
}
/**
* wrapper for pg_prepare
* @param string $name statement name
* @param string $query query string
* @return resource|bool prepare statement handler or false for error
*/
public function __dbPrepare(string $name, string $query)
{
$result = pg_prepare($this->dbh, $name, $query);
if (!$result) {
$this->last_error_query = $query;
}
return $result;
}
/**
* wrapper for pg_execute for running a prepared statement
* @param string $name statement name
* @param array $data data array
* @return resource|bool returns status or false for error
*/
public function __dbExecute(string $name, array $data)
{
$result = pg_execute($this->dbh, $name, $data);
if (!$result) {
$this->last_error_query = $name;
}
return $result;
}
/**
* wrapper for pg_num_rows
* @param resource $cursor cursor resource
* @return int number of rows, -1 on error
*/
public function __dbNumRows($cursor): int
{
return pg_num_rows($cursor);
}
/**
* wrapper for pg_num_fields
* @param resource $cursor cursor resource
* @return int number for fields in result, -1 on error
*/
public function __dbNumFields($cursor): int
{
return pg_num_fields($cursor);
}
/**
* wrapper for pg_field_name
* @param resource $cursor cursor resource
* @param int $i field position
* @return string|bool name or false on error
*/
public function __dbFieldName($cursor, $i)
{
return pg_field_name($cursor, $i);
}
/**
* wrapper for pg_fetch_array
* if through/true false, use __dbResultType(true)
* @param resource $cursor cursor resource
* @param int $result_type result type as int number
* @return array|bool array result data or false on end/error
*/
public function __dbFetchArray($cursor, int $result_type = PGSQL_BOTH)
{
// result type is passed on as is [should be checked]
return pg_fetch_array($cursor, null, $result_type);
}
/**
* simple match up between assoc true/false
* @param bool $assoc_type true (default) for PGSQL_ASSOC, false for PGSQL_BOTH
* @return int valid result type for fetch array
*/
public function __dbResultType(bool $assoc_type = true): int
{
if ($assoc_type == true) {
return PGSQL_ASSOC;
}
// fallback to default
return PGSQL_BOTH;
}
/**
* wrapper for pg_fetch_all
* @param resource $cursor cursor resource
* @return array|bool data array or false for end/error
*/
public function __dbFetchAll($cursor)
{
return pg_fetch_all($cursor);
}
/**
* wrapper for pg_affected_rows
* @param resource $cursor cursor resource
* @return int affected rows, 0 for none
*/
public function __dbAffectedRows($cursor): int
{
return pg_affected_rows($cursor);
}
/**
* reads the last inserted primary key for the query
* if there is no pk_name tries to auto built it from the table name
* this only works if db schema is after "no plural names. and pk name is table name + _id
* detects schema prefix in table name
* @param string $query query string
* @param string $pk_name primary key name, if '' then auto detect
* @return string|int primary key value
*/
public function __dbInsertId(string $query, string $pk_name)
{
// only if an insert has been done
if (preg_match("/^insert /i", $query)) {
$schema = '';
// get table name from insert
$array = explode(' ', $query);
$_table = $array[2];
// if there is a dot inside, we need to split
if (strstr($_table, '.')) {
list($schema, $table) = explode('.', $_table);
} else {
$table = $_table;
}
// no PK name given at all
if (!$pk_name) {
// if name is plurar, make it singular
// if (preg_match("/.*s$/i", $table))
// $table = substr($table, 0, -1);
// set pk_name to "id"
$pk_name = $table."_id";
}
$seq = (($schema) ? $schema.'.' : '').$table."_".$pk_name."_seq";
$q = "SELECT CURRVAL('$seq') AS insert_id";
// I have to do manually or I overwrite the original insert internal vars ...
if ($q = $this->__dbQuery($q)) {
list($id) = $this->__dbFetchArray($q);
} else {
$id = array(-1, $q);
}
return $id;
}
}
/**
* queries database for the primary key name to this table in the selected schema
* @param string $table table name
* @param string $schema optional schema name, '' for default
* @return string|bool primary key name or false if not found
*/
public function __dbPrimaryKey(string $table, string $schema = '')
{
if ($table) {
// check if schema set is different from schema given, only needed if schema is not empty
$table_prefix = '';
if ($schema) {
$q = "SHOW search_path";
$cursor = $this->__dbQuery($q);
$search_path = $this->__dbFetchArray($cursor)['search_path'];
if ($search_path != $schema) {
$table_prefix = $schema.'.';
}
}
// read from table the PK name
// faster primary key get
$q = "SELECT pg_attribute.attname AS column_name, format_type(pg_attribute.atttypid, pg_attribute.atttypmod) AS type ";
$q .= "FROM pg_index, pg_class, pg_attribute ";
if ($schema) {
$q .= ", pg_namespace ";
}
$q .= "WHERE ";
// regclass translates the OID to the name
$q .= "pg_class.oid = '".$table_prefix.$table."'::regclass AND ";
$q .= "indrelid = pg_class.oid AND ";
if ($schema) {
$q .= "nspname = '".$schema."' AND ";
$q .= "pg_class.relnamespace = pg_namespace.oid AND ";
}
$q .= "pg_attribute.attrelid = pg_class.oid AND ";
$q .= "pg_attribute.attnum = any(pg_index.indkey) ";
$q .= "AND indisprimary";
$cursor = $this->__dbQuery($q);
if ($cursor) {
return $this->__dbFetchArray($cursor)['column_name'];
} else {
return false;
}
} else {
return false;
}
}
/**
* wrapper for pg_connect, writes out failure to screen if error occurs (hidden var)
* @param string $db_host host name
* @param string $db_user user name
* @param string $db_pass password
* @param string $db_name databse name
* @param integer $db_port port (int, 5432 is default)
* @param string $db_ssl SSL (allow is default)
* @return ?resource db handler resource or null on error
*/
public function __dbConnect(string $db_host, string $db_user, string $db_pass, string $db_name, int $db_port = 5432, string $db_ssl = 'allow')
{
// to avoid empty db_port
if (!$db_port) {
$db_port = 5432;
}
$this->dbh = pg_connect("host=".$db_host." port=".$db_port." user=".$db_user." password=".$db_pass." dbname=".$db_name." sslmode=".$db_ssl);
if (!$this->dbh) {
die("<!-- Can't connect [host=".$db_host." port=".$db_port." user=".$db_user." password=XXXX dbname=".$db_name." sslmode=".$db_ssl."] //-->");
return null;
}
return $this->dbh;
}
/**
* reads the last error for this cursor and returns
* html formatted string with error name
* @param ?resource $cursor cursor resource or null
* @return string error string
*/
public function __dbPrintError($cursor = null): string
{
// run the query again for the error result here
if (!$cursor && $this->last_error_query) {
pg_send_query($this->dbh, $this->last_error_query);
$this->last_error_query = '';
$cursor = pg_get_result($this->dbh);
}
if ($cursor && pg_result_error($cursor)) {
return "<span style=\"color: red;\"><b>-PostgreSQL-Error-></b> ".pg_result_error($cursor)."</span><br>";
} else {
return '';
}
}
/**
* wrapper for pg_meta_data
* @param string $table table name
* @param bool $extended show extended info (default false)
* @return array|bool array data for the table info or false on error
*/
public function __dbMetaData(string $table, $extended = false)
{
// needs to prefixed with @ or it throws a warning on not existing table
return @pg_meta_data($this->dbh, $table, $extended);
}
/**
* wrapper for pg_escape_string
* @param string|int|float|bool $string any string/int/float/bool
* @return string excaped string
*/
public function __dbEscapeString($string): string
{
return pg_escape_string($this->dbh, (string)$string);
}
/**
* wrapper for pg_escape_literal
* difference to escape string is that this one adds quotes ('') around
* the string too
* @param string|int|float|bool $string any string/int/float/bool
* @return string excaped string including quites
*/
public function __dbEscapeLiteral($string): string
{
return pg_escape_string($this->dbh, (string)$string);
}
/**
* wrapper for pg_escape_byte
* @param string $bytea bytea data stream
* @return string escaped bytea string
*/
public function __dbEscapeBytea($bytea): string
{
return pg_escape_bytea($this->dbh, $bytea);
}
/**
* wrapper for pg_connection_busy
* @return bool true/false for busy connection
*/
public function __dbConnectionBusy(): bool
{
return pg_connection_busy($this->dbh);
}
/**
* wrapper for pg_version
* Note: this only returns server version
* not connection version OR client version
* @return string version string
*/
public function __dbVersion(): string
{
// array has client, protocol, server
// we just need the server
$v = pg_version($this->dbh);
return $v['server'];
}
/**
* postgresql array to php array
* @param string $text array text from PostgreSQL
* @param array $output (internal) recursive pass on for nested arrays
* @param bool|int $limit (internal) max limit to not overshoot the end, start with false
* @param integer $offset (internal) shift offset for {}
* @return array|int converted PHP array, interal recusrive int position
*/
public function __dbArrayParse($text, &$output, $limit = false, $offset = 1)
{
if (false === $limit) {
$limit = strlen($text) - 1;
$output = array();
}
if ('{}' != $text) {
do {
if ('{' != $text[$offset]) {
preg_match("/(\\{?\"([^\"\\\\]|\\\\.)*\"|[^,{}]+)+([,}]+)/", $text, $match, 0, $offset);
$offset += strlen($match[0]);
$output[] = ('"' != $match[1][0] ? $match[1] : stripcslashes(substr($match[1], 1, -1)));
if ('},' == $match[3]) {
return $offset;
}
} else {
$offset = $this->__dbArrayParse($text, $output, $limit, $offset + 1);
}
} while ($limit > $offset);
}
return $output;
}
}
// __END__

View File

@@ -24,23 +24,25 @@ namespace CoreLibs\Language\Core;
// Preloads entire file in memory first, then creates a StringReader // Preloads entire file in memory first, then creates a StringReader
// over it (it assumes knowledge of StringReader internals) // over it (it assumes knowledge of StringReader internals)
class CachedFileReader extends CoreLibs\Language\Core\StringReader class CachedFileReader extends \CoreLibs\Language\Core\StringReader
{ {
public $error = 0;
public $_str = '';
public function __construct($filename) public function __construct($filename)
{ {
parent::__construct();
if (file_exists($filename)) { if (file_exists($filename)) {
$length = filesize($filename); $length = filesize($filename);
$fd = fopen($filename, 'rb'); $fd = fopen($filename, 'rb');
if (!$fd) { if (!$fd) {
$this->error = 3; // Cannot read file, probably permissions $this->error = 3; // Cannot read file, probably permissions
return false;
} }
$this->_str = fread($fd, $length); $this->_str = fread($fd, $length);
fclose($fd); fclose($fd);
} else { } else {
$this->error = 2; // File doesn't exist $this->error = 2; // File doesn't exist
return false;
} }
} }
} }

View File

@@ -27,7 +27,12 @@ class FileReader
public $fr_pos; public $fr_pos;
public $fr_fd; public $fr_fd;
public $fr_length; public $fr_length;
public $error = 0;
/**
* file read constructor
* @param string $filename file name to load
*/
public function __construct($filename) public function __construct($filename)
{ {
if (file_exists($filename)) { if (file_exists($filename)) {
@@ -36,14 +41,17 @@ class FileReader
$this->fr_fd = fopen($filename, 'rb'); $this->fr_fd = fopen($filename, 'rb');
if (!$this->fr_fd) { if (!$this->fr_fd) {
$this->error = 3; // Cannot read file, probably permissions $this->error = 3; // Cannot read file, probably permissions
return false;
} }
} else { } else {
$this->error = 2; // File doesn't exist $this->error = 2; // File doesn't exist
return false;
} }
} }
/**
* read byte data length
* @param int $bytes how many bytes to read
* @return string read data as string
*/
public function read($bytes) public function read($bytes)
{ {
if ($bytes) { if ($bytes) {
@@ -65,6 +73,11 @@ class FileReader
} }
} }
/**
* seek to a position in the file
* @param int $pos position where to go to
* @return int file position after seek done
*/
public function seekto($pos) public function seekto($pos)
{ {
fseek($this->fr_fd, $pos); fseek($this->fr_fd, $pos);
@@ -72,17 +85,29 @@ class FileReader
return $this->fr_pos; return $this->fr_pos;
} }
/**
* get current position in file
* @return int current position in bytes
*/
public function currentpos() public function currentpos()
{ {
return $this->fr_pos; return $this->fr_pos;
} }
/**
* file length/size
* @return int file size in bytes
*/
public function length() public function length()
{ {
return $this->fr_length; return $this->fr_length;
} }
public function close() /**
* close open file handler
* @return void has no return
*/
public function close(): void
{ {
fclose($this->fr_fd); fclose($this->fr_fd);
} }

View File

@@ -39,7 +39,7 @@ class GetTextReader
// public: // public:
public $error = 0; // public variable that holds error code (0 if no error) public $error = 0; // public variable that holds error code (0 if no error)
//private: // private:
private $BYTEORDER = 0; // 0: low endian, 1: big endian private $BYTEORDER = 0; // 0: low endian, 1: big endian
private $STREAM = null; private $STREAM = null;
private $short_circuit = false; private $short_circuit = false;
@@ -50,7 +50,7 @@ class GetTextReader
private $total = 0; // total string count private $total = 0; // total string count
private $table_originals = null; // table for original strings (offsets) private $table_originals = null; // table for original strings (offsets)
private $table_translations = null; // table for translated strings (offsets) private $table_translations = null; // table for translated strings (offsets)
private $cache_translations = array (); // original -> translation mapping private $cache_translations = array(); // original -> translation mapping
/* Methods */ /* Methods */
@@ -60,7 +60,7 @@ class GetTextReader
* Reads a 32bit Integer from the Stream * Reads a 32bit Integer from the Stream
* *
* @access private * @access private
* @return Integer from the Stream * @return int Integer from the Stream
*/ */
private function readint() private function readint()
{ {
@@ -75,6 +75,11 @@ class GetTextReader
} }
} }
/**
* read bytes
* @param int $bytes byte length to read
* @return string return data, possible string
*/
public function read($bytes) public function read($bytes)
{ {
return $this->STREAM->read($bytes); return $this->STREAM->read($bytes);
@@ -83,8 +88,8 @@ class GetTextReader
/** /**
* Reads an array of Integers from the Stream * Reads an array of Integers from the Stream
* *
* @param int count How many elements should be read * @param int $count How many elements should be read
* @return Array of Integers * @return array Array of Integers
*/ */
public function readintarray($count) public function readintarray($count)
{ {
@@ -100,13 +105,13 @@ class GetTextReader
/** /**
* Constructor * Constructor
* *
* @param object Reader the StreamReader object * @param object $Reader the StreamReader object
* @param boolean enable_cache Enable or disable caching of strings (default on) * @param bool $enable_cache Enable or disable caching of strings (default on)
*/ */
public function __construct($Reader, $enable_cache = true) public function __construct($Reader, $enable_cache = true)
{ {
// If there isn't a StreamReader, turn on short circuit mode. // If there isn't a StreamReader, turn on short circuit mode.
if (!$Reader || isset($Reader->error)) { if (!$Reader || $Reader->error) {
$this->short_circuit = true; $this->short_circuit = true;
return; return;
} }
@@ -125,7 +130,6 @@ class GetTextReader
$this->BYTEORDER = 0; $this->BYTEORDER = 0;
} else { } else {
$this->error = 1; // not MO file $this->error = 1; // not MO file
return false;
} }
// FIXME: Do we care about revision? We should. // FIXME: Do we care about revision? We should.
@@ -162,7 +166,7 @@ class GetTextReader
} }
if ($this->enable_cache) { if ($this->enable_cache) {
$this->cache_translations = array (); $this->cache_translations = array();
/* read all strings in the cache */ /* read all strings in the cache */
for ($i = 0; $i < $this->total; $i++) { for ($i = 0; $i < $this->total; $i++) {
$this->STREAM->seekto($this->table_originals[$i * 2 + 2]); $this->STREAM->seekto($this->table_originals[$i * 2 + 2]);
@@ -178,8 +182,8 @@ class GetTextReader
* Returns a string from the "originals" table * Returns a string from the "originals" table
* *
* @access private * @access private
* @param int num Offset number of original string * @param int $num Offset number of original string
* @return string Requested string if found, otherwise '' * @return string Requested string if found, otherwise ''
*/ */
private function get_original_string($num) private function get_original_string($num)
{ {
@@ -197,8 +201,8 @@ class GetTextReader
* Returns a string from the "translations" table * Returns a string from the "translations" table
* *
* @access private * @access private
* @param int num Offset number of original string * @param int $num Offset number of original string
* @return string Requested string if found, otherwise '' * @return string Requested string if found, otherwise ''
*/ */
private function get_translation_string($num) private function get_translation_string($num)
{ {
@@ -216,10 +220,10 @@ class GetTextReader
* Binary search for string * Binary search for string
* *
* @access private * @access private
* @param string string * @param string $string string to find
* @param int start (internally used in recursive function) * @param int $start (internally used in recursive function)
* @param int end (internally used in recursive function) * @param int $end (internally used in recursive function)
* @return int string number (offset in originals table) * @return int|string|float (offset in originals table)
*/ */
private function find_string($string, $start = -1, $end = -1) private function find_string($string, $start = -1, $end = -1)
{ {
@@ -260,8 +264,8 @@ class GetTextReader
* Translates a string * Translates a string
* *
* @access public * @access public
* @param string string to be translated * @param string $string to be translated
* @return string translated string (or original, if not found) * @return string translated string (or original, if not found)
*/ */
public function translate($string) public function translate($string)
{ {
@@ -292,7 +296,8 @@ class GetTextReader
* Sanitize plural form expression for use in PHP eval call. * Sanitize plural form expression for use in PHP eval call.
* *
* @access private * @access private
* @return string sanitized plural form expression * @param string $expr an expression to match
* @return string sanitized plural form expression
*/ */
private function sanitize_plural_expression($expr) private function sanitize_plural_expression($expr)
{ {
@@ -328,7 +333,8 @@ class GetTextReader
* Parse full PO header and extract only plural forms line. * Parse full PO header and extract only plural forms line.
* *
* @access private * @access private
* @return string verbatim plural form header field * @param string $header header search in plurals
* @return string verbatim plural form header field
*/ */
private function extract_plural_forms_header_from_po_header($header) private function extract_plural_forms_header_from_po_header($header)
{ {
@@ -369,8 +375,8 @@ class GetTextReader
* Detects which plural form to take * Detects which plural form to take
* *
* @access private * @access private
* @param n count * @param string $n count
* @return int array index of the right plural form * @return int array index of the right plural form
*/ */
private function select_string($n) private function select_string($n)
{ {
@@ -393,10 +399,10 @@ class GetTextReader
* Plural version of gettext * Plural version of gettext
* *
* @access public * @access public
* @param string single * @param string $single
* @param string plural * @param string $plural
* @param string number * @param string $number
* @return translated plural form * @return string plural form
*/ */
public function ngettext($single, $plural, $number) public function ngettext($single, $plural, $number)
{ {
@@ -434,6 +440,12 @@ class GetTextReader
} }
} }
/**
* p get text
* @param string $context [description]
* @param string $msgid [description]
* @return string [description]
*/
public function pgettext($context, $msgid) public function pgettext($context, $msgid)
{ {
$key = $context.chr(4).$msgid; $key = $context.chr(4).$msgid;
@@ -445,6 +457,14 @@ class GetTextReader
} }
} }
/**
* np get text
* @param string $context [description]
* @param string $singular [description]
* @param string $plural [description]
* @param string $number [description]
* @return string [description]
*/
public function npgettext($context, $singular, $plural, $number) public function npgettext($context, $singular, $plural, $number)
{ {
$key = $context.chr(4).$singular; $key = $context.chr(4).$singular;

View File

@@ -26,25 +26,47 @@ namespace CoreLibs\Language\Core;
// seek is essential, and it should be byte stream // seek is essential, and it should be byte stream
class StreamReader class StreamReader
{ {
// should return a string [FIXME: perhaps return array of bytes?] /**
* constructor, empty
*/
public function __construct()
{
// empty
}
/**
* should return a string [FIXME: perhaps return array of bytes?]
* @param int $bytes bytes to read
* @return bool dummy false
*/
public function read($bytes) public function read($bytes)
{ {
return false; return false;
} }
// should return new position /**
* should return new position
* @param int $position seek to position
* @return bool dummy false
*/
public function seekto($position) public function seekto($position)
{ {
return false; return false;
} }
// returns current position /**
* returns current position
* @return bool dummy false
*/
public function currentpos() public function currentpos()
{ {
return false; return false;
} }
// returns length of entire stream (limit for seekto()s) /**
* returns length of entire stream (limit for seekto()s)
* @return bool dummy false
*/
public function length() public function length()
{ {
return false; return false;

View File

@@ -27,12 +27,21 @@ class StringReader
public $sr_pos; public $sr_pos;
public $sr_str; public $sr_str;
/**
* constructor for string reader
* @param string $str basic string
*/
public function __construct($str = '') public function __construct($str = '')
{ {
$this->sr_str = $str; $this->sr_str = $str;
$this->sr_pos = 0; $this->sr_pos = 0;
} }
/**
* read bytes in string
* @param int $bytes bytes to read in string
* @return string data read in length of bytes as string
*/
public function read($bytes) public function read($bytes)
{ {
$data = substr($this->sr_str, $this->sr_pos, $bytes); $data = substr($this->sr_str, $this->sr_pos, $bytes);
@@ -44,6 +53,11 @@ class StringReader
return $data; return $data;
} }
/**
* go to position in string
* @param int $pos position in string
* @return int new position in string after seek
*/
public function seekto($pos) public function seekto($pos)
{ {
$this->sr_pos = $pos; $this->sr_pos = $pos;
@@ -53,11 +67,19 @@ class StringReader
return $this->sr_pos; return $this->sr_pos;
} }
/**
* get current position in string
* @return int position in string
*/
public function currentpos() public function currentpos()
{ {
return $this->sr_pos; return $this->sr_pos;
} }
/**
* get length of string
* @return int return length of assigned string
*/
public function length() public function length()
{ {
return strlen($this->sr_str); return strlen($this->sr_str);

View File

@@ -35,8 +35,15 @@ class L10n extends \CoreLibs\Basic
private $input; private $input;
private $l10n; private $l10n;
public function __construct(string $lang = '', string $path = '') /**
* class constructor call for language getstring
* @param string $lang language name (optional), fallback is en
* @param string $path path, if empty fallback on default internal path
* @param int|integer $set_control_flag control flags for Basic class set/get checks
*/
public function __construct(string $lang = '', string $path = '', int $set_control_flag = 0)
{ {
parent::__construct($set_control_flag);
if (!$lang) { if (!$lang) {
$this->lang = 'en'; $this->lang = 'en';
} else { } else {
@@ -59,7 +66,12 @@ class L10n extends \CoreLibs\Basic
$this->l10n = new GetTextReader($this->input); $this->l10n = new GetTextReader($this->input);
} }
// reloads the mofile, if the location of the lang file changes /**
* reloads the mofile, if the location of the lang file changes
* @param string $lang language to reload data
* @param string $path optional path, if not set fallback on internal
* @return bool successfull reload true/false
*/
public function l10nReloadMOfile(string $lang, string $path = ''): bool public function l10nReloadMOfile(string $lang, string $path = ''): bool
{ {
$success = false; $success = false;
@@ -89,27 +101,52 @@ class L10n extends \CoreLibs\Basic
return $success; return $success;
} }
public function __($text) /**
* translates a string and returns translated text
* @param string $text text to translate
* @return string translated text
*/
public function __($text): string
{ {
return $this->l10n->translate($text); return $this->l10n->translate($text);
} }
public function __e($text) /**
* prints translated string out to the screen
* @param string $text text to translate
* @return void has no return
*/
public function __e($text): void
{ {
echo $this->l10n->translate($text); echo $this->l10n->translate($text);
} }
// Return the plural form. // Return the plural form.
/**
* Return the plural form.
* @param string $single string for single word
* @param string $plural string for plural word
* @param string $number number value
* @return string translated plural string
*/
public function __ngettext($single, $plural, $number) public function __ngettext($single, $plural, $number)
{ {
return $this->l10n->ngettext($single, $plural, $number); return $this->l10n->ngettext($single, $plural, $number);
} }
/**
* get current set language
* @return string current set language string
*/
public function __getLang() public function __getLang()
{ {
return $this->lang; return $this->lang;
} }
/**
* get current set mo file
* @return string current set mo language file
*/
public function __getMoFile() public function __getMoFile()
{ {
return $this->mofile; return $this->mofile;

Some files were not shown because too many files have changed in this diff Show More