Compare commits

...

12 Commits

Author SHA1 Message Date
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
32 changed files with 1130 additions and 800 deletions

View File

@@ -64,3 +64,14 @@ msgstr "日"
msgid "INPUT TEST"
msgstr "OUTPUT TEST JA"
# login string
msgid "Hello %s"
msgstr "こにちは %s"
msgid "I should be translated"
msgstr "「スマーティー」これは正しいです"
msgid "Are we translated?"
msgstr "「クラス」これは翻訳です?"

View File

@@ -24,12 +24,10 @@ if (!defined('SET_SESSION_NAME')) {
}
// define log file id
$LOG_FILE_ID = 'classTest';
// set language for l10n
$lang = 'en_utf8';
// init login & backend class
$login = new CoreLibs\ACL\Login(DB_CONFIG, $lang);
$basic = new CoreLibs\Admin\Backend(DB_CONFIG, $lang);
$login = new CoreLibs\ACL\Login(DB_CONFIG);
$basic = new CoreLibs\Admin\Backend(DB_CONFIG);
$basic->dbInfo(true);
ob_end_flush();
@@ -259,27 +257,38 @@ echo "FOUND ELEMENTS [input]: ".$basic->printAr($basic->arraySearchRecursive('em
// image thumbnail
$images = array(
// height bigger
// BASE.LAYOUT.CONTENT_PATH.IMAGES.'no_picture.jpg',
// BASE.LAYOUT.CONTENT_PATH.IMAGES.'no_picture.png',
// 'no_picture.jpg',
// 'no_picture.png',
// width bigger
// BASE.LAYOUT.CONTENT_PATH.IMAGES.'no_picture_width_bigger.jpg',
// BASE.LAYOUT.CONTENT_PATH.IMAGES.'no_picture_width_bigger.png',
// 'no_picture_width_bigger.jpg',
// 'no_picture_width_bigger.png',
// square
// BASE.LAYOUT.CONTENT_PATH.IMAGES.'no_picture_square.jpg',
// BASE.LAYOUT.CONTENT_PATH.IMAGES.'no_picture_square.png',
// 'no_picture_square.jpg',
// 'no_picture_square.png',
// other sample images
BASE.LAYOUT.CONTENT_PATH.IMAGES.'5c501af48da6c.jpg'
// '5c501af48da6c.jpg',
// Apple HEIC files
// 'img_2145.heic',
// Photoshop
'photoshop_test.psd',
);
echo "<hr>";
$thumb_width = 250;
$thumb_height = 250;
$thumb_height = 300;
// return mime type ala mimetype
$finfo = new finfo(FILEINFO_MIME_TYPE);
foreach ($images as $image) {
$image = BASE.LAYOUT.CONTENT_PATH.IMAGES.$image;
list ($height, $width, $img_type) = getimagesize($image);
echo "<div>IMAGE INFO: ".$height."x".$width.", TYPE: ".$img_type." [".$finfo->file($image)."]</div>";
// rotate image first
$basic->correctImageOrientation($image);
// thumbnail tests
echo "<div>".basename($image).": WIDTH: $thumb_width<br><img src=".$basic->createThumbnailSimple($image, $thumb_width)."></div>";
echo "<div>".basename($image).": HEIGHT: $thumb_height<br><img src=".$basic->createThumbnailSimple($image, 0, $thumb_height)."></div>";
echo "<div>".basename($image).": WIDTH/HEIGHT: $thumb_width x $thumb_height<br><img src=".$basic->createThumbnailSimple($image, $thumb_width, $thumb_height)."></div>";
// test with dummy
echo "<div>".basename($image).": WIDTH/HEIGHT: $thumb_width x $thumb_height (+DUMMY)<br><img src=".$basic->createThumbnailSimple($image, $thumb_width, $thumb_height, null, true, false)."></div>";
echo "<hr>";
}

View File

@@ -14,8 +14,7 @@ $SET_SESSION_NAME = EDIT_SESSION_NAME;
echo "DIR: ".DIR."<br>ROOT: ".ROOT."<br>BASE: ".BASE."<br>";
$lang = 'ja_utf8';
$base = new CoreLibs\Admin\Backend(DB_CONFIG, $lang);
$base = new CoreLibs\Admin\Backend(DB_CONFIG);
ob_end_flush();
if ($base->getConnectionStatus()) {
die("Cannot connect to database");

View File

@@ -10,24 +10,26 @@ define('USE_DATABASE', true);
define('USE_HEADER', true);
require 'config.php';
require BASE.INCLUDES.'admin_header.php';
$MASTER_TEMPLATE_NAME = 'main_body.tpl';
$TEMPLATE_NAME = 'smarty_test.tpl';
$CSS_NAME = 'smart_test.css';
$USE_PROTOTYPE = false;
$USE_JQUERY = true;
$JS_DATEPICKR = false;
if ($USE_PROTOTYPE) {
$ADMIN_JAVASCRIPT = 'edit.pt.js';
$JS_NAME = 'prototype.test.js';
} elseif ($USE_JQUERY) {
$ADMIN_JAVASCRIPT = 'edit.jq.js';
$JS_NAME = 'jquery.test.js';
$smarty->MASTER_TEMPLATE_NAME = 'main_body.tpl';
$smarty->TEMPLATE_NAME = 'smarty_test.tpl';
$smarty->CSS_SPECIAL_TEMPLATE_NAME = 'smart_test.css';
$smarty->USE_PROTOTYPE = false;
$smarty->USE_JQUERY = true;
$smarty->JS_DATEPICKR = false;
if ($smarty->USE_PROTOTYPE) {
$smarty->ADMIN_JAVASCRIPT = 'edit.pt.js';
$smarty->JS_SPECIAL_TEMPLATE_NAME = 'prototype.test.js';
} elseif ($smarty->USE_JQUERY) {
$smarty->ADMIN_JAVASCRIPT = 'edit.jq.js';
$smarty->JS_SPECIAL_TEMPLATE_NAME = 'jquery.test.js';
}
$PAGE_WIDTH = "100%";
require BASE.INCLUDES.'admin_set_paths.php';
$smarty->PAGE_WIDTH = "100%";
// require BASE.INCLUDES.'admin_set_paths.php';
$smarty->setSmartyPaths();
// 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
$options = array (
@@ -46,7 +48,8 @@ $options = array (
)
);
$cms->DATA['drop_down_test'] = $options;
$smarty->DATA['drop_down_test'] = $options;
require BASE.INCLUDES.'admin_smarty.php';
// require BASE.INCLUDES.'admin_smarty.php';
$smarty->setSmartyVarsAdmin();
require BASE.INCLUDES.'admin_footer.php';

View File

@@ -78,27 +78,19 @@ DEFINE('TEMPLATES', 'templates'.DS);
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');
// DEFINE('SSL_HOST', 'ssl.host.name');
// error page strictness, Default is 3
// 1: only show error page as the last mesure if really no mid & aid can be loaded and found at all
// 2: if template not found, do not search, show error template
// 3: if default template is not found, show error template, do not fall back to default tree
// 4: very strict, even on normal fixable errors through error
// DEFINE('ERROR_STRICT', 3);
// DEFINE('ERROR_STRICT', 3);
// allow page caching in general, set to 'FALSE' if you do debugging or development!
// DEFINE('ALLOW_SMARTY_CACHE', FALSE);
// DEFINE('ALLOW_SMARTY_CACHE', FALSE);
// cache life time, in second', default here is 2 days (172800s)
// -1 is never expire cache
// DEFINE('SMARTY_CACHE_LIFETIME', -1);
// DEFINE('SMARTY_CACHE_LIFETIME', -1);
/************* LOGOUT ********************/
// logout target
@@ -123,9 +115,12 @@ DEFINE('PAGE_WIDTH', 800);
// the default template name
DEFINE('MASTER_TEMPLATE_NAME', 'main_body.tpl');
/************* SESSION NAMES *************/
// base name
/************* 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));
@@ -145,10 +140,12 @@ 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
/************* LOGGING *******************/
DEFINE('LOG_FILE_ID', '');
// as $LOG_FILE_ID which takes presence over LOG_FILE_ID
// see Basic class constructor
DEFINE('LOG_FILE_ID', BASE_NAME);
/************* CLASS ERRORS *******************/
// 0 = default all OFF
@@ -161,7 +158,7 @@ define('CLASS_VARIABLE_ERROR_MODE', 3);
// if we have a dev/live system
// set_live is a per page/per item
// live_queue is a global queue system
// DEFINE('QUEUE', 'live_queue');
// DEFINE('QUEUE', 'live_queue');
/************* DB PATHS (PostgreSQL) *****************/
// schema names, can also be defined per <DB INFO>
@@ -189,6 +186,7 @@ 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
@@ -257,10 +255,13 @@ DEFINE('JAVASCRIPT', 'frontend.js');
// anything optional
/************* INTERNAL ******************/
// any other global definitons here
// DEFINE('SOME_ID', <SOME VALUE>);
// any other global definitons in the config.other.php
if (file_exists(BASE.CONFIGS.'config.other.php')) {
require BASE.CONFIGS.'config.other.php';
}
/************* CONVERT *******************/
// this only needed if the external thumbnail create is used
$paths = array(
'/bin',
'/usr/bin',
@@ -273,7 +274,9 @@ foreach ($paths as $path) {
DEFINE('CONVERT', $path.DS.'convert');
}
}
unset($paths);
/************* DEBUG *******************/
// turn off debug if debug flag is OFF
if (defined('DEBUG') && DEBUG == false) {
$ECHO_ALL = false;
@@ -291,6 +294,7 @@ if (defined('DEBUG') && DEBUG == false) {
$DEBUG_ALL_OVERRIDE = false;
}
/************* AUTO LOADER *******************/
// read auto loader
require BASE.LIB.'autoloader.php';

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

@@ -0,0 +1,12 @@
<?php declare(strict_types=1);
/********************************************************************
* AUTHOR: Clemens Schwaighofer
* CREATED: 2019/10/28
* SHORT DESCRIPTION:
* other global constant variables
* HISTORY:
*********************************************************************/
// DEFINE('SOME_ID', <SOME VALUE>);
// __END__

View File

@@ -13,10 +13,9 @@ if ($DEBUG_ALL && $ENABLE_ERROR_HANDLING) {
include BASE.LIBS."Error.Handling.php";
}
// predefine vars
$lang = '';
$messages = array();
// import all POST vars
extract($_POST, EXTR_SKIP);
// extract($_POST, EXTR_SKIP);
//------------------------------ variable init end
//------------------------------ library include start
@@ -24,6 +23,7 @@ extract($_POST, EXTR_SKIP);
ob_start();
// set the session name
$SET_SESSION_NAME = EDIT_SESSION_NAME;
$LOG_FILE_ID = BASE_NAME.'Admin';
//------------------------------ library include end
//------------------------------ basic variable settings start
@@ -34,18 +34,12 @@ if (!isset($ZIP_STREAM)) {
$ZIP_STREAM = false;
}
// set encoding
if (!isset($encoding)) {
$encoding = DEFAULT_ENCODING;
}
// set the default lang, if not given
if (session_id() && $_SESSION['DEFAULT_LANG']) {
$lang = $_SESSION['DEFAULT_LANG'];
} elseif (!$lang) {
$lang = defined('SITE_LANG') ? SITE_LANG : DEFAULT_LANG;
if (!isset($ENCODING) || !$ENCODING) {
$ENCODING = DEFAULT_ENCODING;
}
// end the stop of the output flow, but only if we didn't request a csv file download
if (isset($_POST['action']) && $_POST['action'] != 'download_csv' && !$AJAX_PAGE) {
header("Content-type: text/html; charset=".$encoding);
header("Content-type: text/html; charset=".$ENCODING);
}
if ($AJAX_PAGE && !$ZIP_STREAM) {
header("Content-Type: application/json; charset=UTF-8");
@@ -54,21 +48,17 @@ if ($AJAX_PAGE && !$ZIP_STREAM) {
//------------------------------ class init start
// login & page access check
$login = new CoreLibs\ACL\Login(DB_CONFIG, $lang);
// post login lang check
if ($_SESSION['DEFAULT_LANG']) {
$lang = $_SESSION['DEFAULT_LANG'];
}
$login = new CoreLibs\ACL\Login(DB_CONFIG);
// create smarty object
$smarty = new CoreLibs\Template\SmartyExtend($lang);
$smarty = new CoreLibs\Template\SmartyExtend();
// create new DB class
$cms = new CoreLibs\Admin\Backend(DB_CONFIG, $lang);
$cms = new CoreLibs\Admin\Backend(DB_CONFIG);
// the menu show flag (what menu to show)
$cms->menu_show_flag = 'main';
// db nfo
$cms->dbInfo();
// set acl
$cms->acl = $login->acl;
$cms->setACL($login->acl);
// flush
ob_end_flush();
//------------------------------ class init end
@@ -89,12 +79,6 @@ if (!$login->login) {
}
//------------------------------ logging end
//------------------------------ page rights start
// flag if to show the edit access id drop down list
// check if we have more than one EA ID
$cms->DATA['show_ea_extra'] = isset($login->acl['show_ea_extra']) ? $login->acl['show_ea_extra'] : false;
//------------------------------ page rights ned
// automatic hide for DEBUG messages on live server
// can be overridden when setting DEBUG_ALL_OVERRIDE on top of the script (for emergency debugging of one page only)
if ((TARGET == 'live' || TARGET == 'remote') && !$DEBUG_ALL_OVERRIDE) {
@@ -105,6 +89,6 @@ if ((TARGET == 'live' || TARGET == 'remote') && !$DEBUG_ALL_OVERRIDE) {
$cms->echo_output_all = false;
$cms->print_output_all = false;
}
$cms->DATA['JS_DEBUG'] = DEBUG;
$smarty->DATA['JS_DEBUG'] = DEBUG;
// __END__

View File

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

View File

@@ -7,109 +7,11 @@
* HISTORY:
*********************************************************************/
// trigger flags
$cms->HEADER['USE_PROTOTYPE'] = isset($USE_PROTOTYPE) ? $USE_PROTOTYPE : USE_PROTOTYPE;
// scriptacolous, can only be used with prototype
if ($cms->HEADER['USE_PROTOTYPE']) {
$cms->HEADER['USE_SCRIPTACULOUS'] = isset($USE_SCRIPTACULOUS) ? $USE_SCRIPTACULOUS : USE_SCRIPTACULOUS;
}
// jquery and prototype should not be used together
$cms->HEADER['USE_JQUERY'] = isset($USE_JQUERY) ? $USE_JQUERY : USE_JQUERY; // don't use either of those two together
// check if we have an external file with the template name
if (file_exists($cms->includes.$cms->INC_TEMPLATE_NAME) && is_file($cms->includes.$cms->INC_TEMPLATE_NAME)) {
include($cms->includes.$cms->INC_TEMPLATE_NAME);
}
// additional per page Javascript include
$cms->JS_INCLUDE = '';
if (file_exists($cms->javascript.$cms->JS_TEMPLATE_NAME) && is_file($cms->javascript.$cms->JS_TEMPLATE_NAME)) {
$cms->JS_INCLUDE = $cms->javascript.$cms->JS_TEMPLATE_NAME;
}
// per page css file
$cms->CSS_INCLUDE = '';
if (file_exists($cms->css.$cms->CSS_TEMPLATE_NAME) && is_file($cms->css.$cms->CSS_TEMPLATE_NAME)) {
$cms->CSS_INCLUDE = $cms->css.$cms->CSS_TEMPLATE_NAME;
}
// optional CSS file
$cms->CSS_SPECIAL_INCLUDE = '';
if (file_exists($cms->css.$cms->CSS_SPECIAL_TEMPLATE_NAME) && is_file($cms->css.$cms->CSS_SPECIAL_TEMPLATE_NAME)) {
$cms->CSS_SPECIAL_INCLUDE = $cms->css.$cms->CSS_SPECIAL_TEMPLATE_NAME;
}
// optional JS file
$cms->JS_SPECIAL_INCLUDE = '';
if (file_exists($cms->javascript.$cms->JS_SPECIAL_TEMPLATE_NAME) && is_file($cms->javascript.$cms->JS_SPECIAL_TEMPLATE_NAME)) {
$cms->JS_SPECIAL_INCLUDE = $cms->javascript.$cms->JS_SPECIAL_TEMPLATE_NAME;
}
// the actual include files for javascript (per page)
$cms->HEADER['JS_INCLUDE'] = $cms->JS_INCLUDE;
$cms->HEADER['CSS_INCLUDE'] = $cms->CSS_INCLUDE;
$cms->HEADER['CSS_SPECIAL_INCLUDE'] = $cms->CSS_SPECIAL_INCLUDE;
$cms->HEADER['JS_SPECIAL_INCLUDE'] = $cms->JS_SPECIAL_INCLUDE;
// paths to the files
$cms->DATA['includes'] = $cms->includes;
$cms->DATA['js'] = $cms->javascript;
$cms->DATA['css'] = $cms->css;
$cms->DATA['pictures'] = $cms->pictures;
// default CMS settings
// define all needed smarty stuff for the general HTML/page building
$cms->HEADER['CSS'] = CSS;
$cms->HEADER['JS'] = JS;
$cms->HEADER['ENCODING'] = $encoding;
$cms->HEADER['DEFAULT_ENCODING'] = DEFAULT_ENCODING;
$cms->HEADER['STYLESHEET'] = isset($ADMIN_STYLESHEET) ? $ADMIN_STYLESHEET : ADMIN_STYLESHEET;
$cms->HEADER['JAVASCRIPT'] = isset($ADMIN_JAVASCRIPT) ? $ADMIN_JAVASCRIPT : ADMIN_JAVASCRIPT;
// html title
$cms->HEADER['HTML_TITLE'] = isset($L_TITLE) ? $cms->l->__($L_TITLE) : $cms->l->__(G_TITLE);
$cms->DATA['table_width'] = isset($PAGE_WIDTH) ? $PAGE_WIDTH : PAGE_WIDTH;
// messages = array('msg' =>, 'class' => 'error/warning/...')
$cms->DATA['messages'] = $cms->messages;
// top menu
$cms->DATA['nav_menu'] = $cms->adbTopMenu();
$cms->DATA['nav_menu_count'] = is_array($cms->DATA['nav_menu']) ? count($cms->DATA['nav_menu']) : 0;
// the page name
$cms->DATA['page_name'] = $cms->page_name;
// user name
$cms->DATA['USER_NAME'] = $_SESSION['USER_NAME'];
$cms->DATA['ADMIN'] = $login->acl['admin'];
// the template part to include into the body
$cms->DATA['TEMPLATE_NAME'] = $TEMPLATE_NAME;
$cms->DATA['CONTENT_INCLUDE'] = $CONTENT_INCLUDE;
$cms->DATA['TEMPLATE_TRANSLATE'] = isset($TEMPLATE_TRANSLATE) ? $TEMPLATE_TRANSLATE : null;
$cms->DATA['PAGE_FILE_NAME'] = $PAGE_FILE_NAME;
// LANG
$cms->DATA['LANG'] = $lang;
$cms->DATA['TINYMCE_LANG'] = $lang_short;
// form name
$cms->DATA['FORM_NAME'] = $FORM_NAME;
// include flags
$cms->DATA['USE_TINY_MCE'] = isset($USE_TINY_MCE) ? $USE_TINY_MCE : false;
$cms->DATA['JS_DATEPICKR'] = isset($JS_DATEPICKR) ? $JS_DATEPICKR : false;
$cms->DATA['JS_FLATPICKR'] = isset($JS_FLATPICKR) ? $JS_FLATPICKR : false;
// debug data, if DEBUG flag is on, this data is print out
$cms->DEBUG_DATA['debug_error_msg'] = $cms->runningTime();
$cms->DEBUG_DATA['DEBUG'] = @$DEBUG_TMPL;
// create main data array
$cms->CONTENT_DATA = array_merge($cms->HEADER, $cms->DATA, $cms->DEBUG_DATA);
// data is 1:1 mapping (all vars, values, etc)
foreach ($cms->CONTENT_DATA as $key => $value) {
$smarty->assign($key, $value);
}
if (is_dir(BASE.TEMPLATES_C)) {
$smarty->setCompileDir(BASE.TEMPLATES_C);
}
if (is_dir(BASE.CACHE)) {
$smarty->setCacheDir(BASE.CACHE);
}
$smarty->display(
$MASTER_TEMPLATE_NAME,
$cms->CACHE_ID.($cms->CACHE_ID ? '_' : '').$lang,
$cms->COMPILE_ID.($cms->COMPILE_ID ? '_' : '').$lang
);
/******
NOTE THAT THIS INCLUDE IS OBSOLETE
USE THE BELOW FUNCTION CALL IN THE SCRIPT ITSELF
*******/
trigger_error('admin_smarty.php is deprecated. Use SmartyExtended->setSmartyVarsAdmin(); or setSmartyVarsFrontend();', E_USER_DEPRECATED);
$smarty->setSmartyVarsAdmin();
// __END__

View File

@@ -36,23 +36,19 @@ if (!DEBUG) {
$ECHO_ALL = 0;
}
// set default lang if not set otherwise
if (!isset($lang)) {
$lang = DEFAULT_LANG;
}
// should be utf8
header("Content-type: text/html; charset=".DEFAULT_ENCODING);
ob_end_flush();
$login = new CoreLibs\ACL\Login(DB_CONFIG, $lang);
$login = new CoreLibs\ACL\Login(DB_CONFIG);
// create form class
$form = new CoreLibs\Output\Form\Generate(DB_CONFIG, $lang);
$form = new CoreLibs\Output\Form\Generate(DB_CONFIG);
if ($form->mobile_phone) {
echo "I am sorry, but this page cannot be viewed by a mobile phone";
exit;
}
// smarty template engine (extended Translation version)
$smarty = new CoreLibs\Template\SmartyExtend($lang);
$smarty = new CoreLibs\Template\SmartyExtend();
// $form->debug('POST', $form->printAr($_POST));
@@ -453,7 +449,7 @@ if (is_dir(BASE.TEMPLATES_C)) {
if (is_dir(BASE.CACHE)) {
$smarty->setCacheDir(BASE.CACHE);
}
$smarty->display($EDIT_TEMPLATE, 'editAdmin_'.$lang, 'editAdmin_'.$lang);
$smarty->display($EDIT_TEMPLATE, 'editAdmin_'.$smarty->lang, 'editAdmin_'.$smarty->lang);
// debug output
echo $login->printErrorMsg();

Binary file not shown.

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

Binary file not shown.

View File

Before

Width:  |  Height:  |  Size: 1.5 MiB

After

Width:  |  Height:  |  Size: 1.5 MiB

View File

Before

Width:  |  Height:  |  Size: 489 KiB

After

Width:  |  Height:  |  Size: 489 KiB

View File

Before

Width:  |  Height:  |  Size: 807 KiB

After

Width:  |  Height:  |  Size: 807 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -114,8 +114,8 @@ function setCenter(id, left, top)
/**
* goes to an element id position
* @param {String} element element id to move to
* @param {Number} [offset=0] offset from top, default is 0 (px)
* @param {String} element element id to move to
* @param {Number} offset offset from top, default is 0 (px)
*/
function goToPos(element, offset = 0)
{
@@ -172,11 +172,12 @@ if (!String.prototype.format) {
* @param {Number} x number to be formated
* @return {String} formatted with , in thousands
*/
const numberWithCommas = (x) => {
function numberWithCommas(x)
{
var parts = x.toString().split(".");
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",");
return parts.join(".");
};
}
/**
* converts line breaks to br
@@ -289,17 +290,25 @@ function isObject(val) {
return ((typeof val === 'function') || (typeof val === 'object'));
}
/**
* get the length of an object (entries)
* @param {Object} object object to check
* @return {Number} number of entry
*/
function getObjectCount(object) {
return Object.keys(object).length;
}
/**
* checks if a key exists in a given object
* @param {String} key key name
* @param {Object} object object to search key in
* @return {Boolean} true/false if key exists in object
*/
const keyInObject = (key, object) => (Object.prototype.hasOwnProperty.call(object, key)) ? true : false;
/*function keyInObject(key, object)
function keyInObject(key, object)
{
return (Object.prototype.hasOwnProperty.call(object, key)) ? true : false;
}*/
}
/**
* returns matching key of value
@@ -307,11 +316,13 @@ const keyInObject = (key, object) => (Object.prototype.hasOwnProperty.call(objec
* @param {Mixed} value any value (String, Number, etc)
* @return {String} the key found for the first matching value
*/
const getKeyByValue = (obj, value) => Object.keys(obj).find(key => obj[key] === value);
// function getKeyByValue(object, value)
// {
// return Object.keys(object).find(key => object[key] === value);
// }
function getKeyByValue(object, value)
{
return Object.keys(object).find(key => object[key] === value);
// return Object.keys(object).find(function (key) {
// return object[key] === value;
// });
}
/**
* returns true if value is found in object with a key
@@ -319,18 +330,23 @@ const getKeyByValue = (obj, value) => Object.keys(obj).find(key => obj[key] ===
* @param {Mixed} value any value (String, Number, etc)
* @return {Boolean} true on value found, false on not found
*/
const valueInObject = (obj, value) => (Object.keys(obj).find(key => obj[key] === value)) ? true : false;
function valueInObject(object, value)
{
return (Object.keys(object).find(key => object[key] === value)) ? true : false;
// return Object.keys(object).find(function (key) {
// return object[key] === value;
// }) ? true : false;
}
/**
* checks if a DOM element actually exists
* @param {String} id Element id to check for
* @return {Boolean} true if element exists, false on failure
*/
const exists = (id) => $('#' + id).length > 0 ? true : false;
/*function exists(id)
function exists(id)
{
return $('#' + id).length > 0 ? true : false;
}*/
}
/**
* converts a int number into bytes with prefix in two decimals precision
@@ -345,7 +361,6 @@ function formatBytes(bytes)
bytes = bytes / 1024;
i++;
} while (bytes > 99);
return parseFloat(Math.round(bytes * Math.pow(10, 2)) / Math.pow(10, 2)) + ['kB', 'MB', 'GB', 'TB', 'PB', 'EB'][i];
}
@@ -380,42 +395,52 @@ function errorCatch(err)
/**
* show or hide the "do" overlay
* @param {String} [loc=''] location name for action indicator, default empty. for console.log
* @param {String} loc location name for action indicator
* default empty. for console.log
* @param {Boolean} [overlay=true] override the auto hide/show over the overlay div block
*/
function actionIndicator(loc = '')
function actionIndicator(loc, overlay = true)
{
if ($('#overlayBox').is(':visible')) {
actionIndicatorHide(loc);
actionIndicatorHide(loc, overlay);
} else {
actionIndicatorShow(loc);
actionIndicatorShow(loc, overlay);
}
}
/**
* explicit show for action Indicator
* instead of automatically show or hide, do on command show
* @param {String} [loc=''] optional location name, empty if not set. for console.log
* @param {String} loc location name for action indicator
* default empty. for console.log
* @param {Boolean} [overlay=true] override the auto hide/show over the overlay div block
*/
function actionIndicatorShow(loc = '')
function actionIndicatorShow(loc, overlay = true)
{
console.log('Indicator: SHOW [%s]', loc);
$('#indicator').addClass('progress');
setCenter('indicator', true, true);
$('#indicator').show();
overlayBoxShow();
if (overlay === true) {
overlayBoxShow();
}
}
/**
* explicit hide for action Indicator
* instead of automatically show or hide, do on command hide
* @param {String} [loc=''] optional location name, empty if not set. for console.log
* @param {String} loc location name for action indicator
* default empty. for console.log
* @param {Boolean} [overlay=true] override the auto hide/show over the overlay div block
*/
function actionIndicatorHide(loc = '')
function actionIndicatorHide(loc, overlay = true)
{
console.log('Indicator: HIDE [%s]', loc);
$('#indicator').hide();
$('#indicator').removeClass('progress');
overlayBoxHide();
if (overlay === true) {
overlayBoxHide();
}
}
/**
@@ -477,8 +502,9 @@ function ClearCall()
* @param {Object} [options={}] anything else (value, placeholder, OnClick, style)
* @return {Object} created element as an object
*/
const cel = (tag, id = '', content = '', css = [], options = {}) =>
_element = {
function cel(tag, id = '', content = '', css = [], options = {})
{
return {
tag: tag,
id: id,
name: options.name, // override name if set [name gets ignored in tree build anyway]
@@ -487,6 +513,7 @@ const cel = (tag, id = '', content = '', css = [], options = {}) =>
options: options,
sub: []
};
}
/**
* attach a cel created object to another to create a basic DOM tree
@@ -536,10 +563,11 @@ function aelx(base, ...attach)
* @param {Object} base cel created element
* @return {Object} returns reset base element
*/
const rel = (base) => {
function rel(base)
{
base.sub = [];
return base;
};
}
/**
* searches and removes style from css array
@@ -853,12 +881,12 @@ function parseQueryString(query = '', return_key = '') {
function getQueryStringParam(key)
{
var url = new URL(window.location.href);
var param = url.searchParams.get(key);
if (param) {
return param;
} else {
return '';
}
var param = url.searchParams.get(key);
if (param) {
return param;
} else {
return '';
}
}
// *** MASTER logout call
@@ -878,4 +906,80 @@ function loginLogout()
form.submit();
}
/**
* create login string and logout button elements
* @param {String} login_string the login string to show on the left
* @param {String} [header_id='mainHeader'] the target for the main element block
* if not set mainHeader is assumed
* this is the target div for the "loginRow"
*/
function createLoginRow(login_string, header_id = 'mainHeader')
{
// if header does not exist, we do nothing
if (exists(header_id)) {
// that row must exist already, if not it must be the first in the "mainHeader"
if (!exists('loginRow')) {
$('#' + header_id).html(phfo(cel('div', 'loginRow', '', ['loginRow', 'flx-spbt'])));
}
// clear out just in case for first entry
// fill with div name & login/logout button
$('#loginRow').html(phfo(cel('div', '', login_string)));
$('#loginRow').append(phfo(
aelx(
// outer div
cel('div'),
// inner element
cel('input', 'logout', '', [], {
value: __('Logout'),
type: 'button',
onClick: 'loginLogout()'
})
)
));
}
}
/**
* create the top nav menu that switches physical between pages
* (edit access data based)
* @param {Object} nav_menu the built nav menu with highlight info
* @param {String} [header_id='mainHeader'] the target for the main element block
* if not set mainHeader is assumed
* this is the target div for the "menuRow"
*/
function createNavMenu(nav_menu, header_id = 'mainHeader') {
// must be an object
if (isObject(nav_menu) && getObjectCount(nav_menu) > 1) {
// do we have more than one entry, if not, do not show (single page)
if (!exists('menuRow')) {
$('#' + header_id).html(phfo(cel('div', 'menuRow', '', ['menuRow', 'flx-s'])));
}
var content = [];
$.each(nav_menu, function(key, item) {
// key is number
// item is object with entries
if (key != 0) {
content.push(phfo(cel('div', '', '&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 */

View File

@@ -115,10 +115,9 @@ class Login extends \CoreLibs\DB\IO
/**
* constructor, does ALL, opens db, works through connection checks, closes itself
* @param array $db_config db config array
* @param string $lang language string (default en_utf8)
* @param int $set_control_flag class variable check flags
*/
public function __construct(array $db_config, string $lang = 'en_utf8', int $set_control_flag = 0)
public function __construct(array $db_config, int $set_control_flag = 0)
{
// log login data for this class only
$this->log_per_class = 1;
@@ -150,8 +149,14 @@ class Login extends \CoreLibs\DB\IO
// set global is ajax page for if we show the data directly, or need to pass it back
// to the continue AJAX class for output back to the user
$this->login_is_ajax_page = $this->ajax_page_flag;
$this->login_is_ajax_page = isset($GLOBALS['AJAX_PAGE']) && $GLOBALS['AJAX_PAGE'] ? true : false;
// set the default lang
$lang = 'en_utf8';
if (session_id() && isset($_SESSION['DEFAULT_LANG']) && $_SESSION['DEFAULT_LANG']) {
$lang = $_SESSION['DEFAULT_LANG'];
} else {
$lang = defined('SITE_LANG') ? SITE_LANG : DEFAULT_LANG;
}
$this->l = new \CoreLibs\Language\L10n($lang);
// if we have a search path we need to set it, to use the correct DB to login
@@ -173,44 +178,17 @@ class Login extends \CoreLibs\DB\IO
$this->euid = array_key_exists('EUID', $_SESSION) ? $_SESSION['EUID'] : 0; // if there is none, there is none, saves me POST/GET check
// get login vars, are so, can't be changed
// prepare
if (!isset($_POST['login_login'])) {
$_POST['login_login'] = '';
}
if (!isset($_POST['login_username'])) {
$_POST['login_username'] = '';
}
if (!isset($_POST['login_password'])) {
$_POST['login_password'] = '';
}
if (!isset($_POST['login_logout'])) {
$_POST['login_logout'] = '';
}
if (!isset($_POST['change_password'])) {
$_POST['change_password'] = '';
}
if (!isset($_POST['pw_username'])) {
$_POST['pw_username'] = '';
}
if (!isset($_POST['pw_old_password'])) {
$_POST['pw_old_password'] = '';
}
if (!isset($_POST['pw_new_password'])) {
$_POST['pw_new_password'] = '';
}
if (!isset($_POST['pw_new_password_confirm'])) {
$_POST['pw_new_password_confirm'] = '';
}
// pass on vars to Object vars
$this->login = $_POST['login_login'];
$this->username = $_POST['login_username'];
$this->password = $_POST['login_password'];
$this->logout = $_POST['login_logout'];
$this->login = isset($_POST['login_login']) ? $_POST['login_login'] : '';
$this->username = isset($_POST['login_username']) ? $_POST['login_username'] : '';
$this->password = isset($_POST['login_password']) ? $_POST['login_password'] : '';
$this->logout = isset($_POST['login_logout']) ? $_POST['login_logout'] : '';
// password change vars
$this->change_password = $_POST['change_password'];
$this->pw_username = $_POST['pw_username'];
$this->pw_old_password = $_POST['pw_old_password'];
$this->pw_new_password = $_POST['pw_new_password'];
$this->pw_new_password_confirm = $_POST['pw_new_password_confirm'];
$this->change_password = isset($_POST['change_password']) ? $_POST['change_password'] : '';
$this->pw_username = isset($_POST['pw_username']) ? $_POST['pw_username'] : '';
$this->pw_old_password = isset($_POST['pw_old_password']) ? $_POST['pw_old_password'] : '';
$this->pw_new_password = isset($_POST['pw_new_password']) ? $_POST['pw_new_password'] : '';
$this->pw_new_password_confirm = isset($_POST['pw_new_password_confirm']) ? $_POST['pw_new_password_confirm'] : '';
// logout target (from config)
$this->logout_target = LOGOUT_TARGET;
// disallow user list for password change
@@ -696,6 +674,9 @@ class Login extends \CoreLibs\DB\IO
{
// only set acl if we have permission okay
if ($this->permission_okay) {
// username (login), group name
$this->acl['user_name'] = $_SESSION['USER_NAME'];
$this->acl['group_name'] = $_SESSION['GROUP_NAME'];
// we start with the default acl
$this->acl['base'] = DEFAULT_ACL_LEVEL;

View File

@@ -52,45 +52,30 @@ class Backend extends \CoreLibs\DB\IO
public $error = 0;
public $warning = 0;
public $info = 0;
// smarty publics
// internal lang & encoding vars
public $lang_dir = '';
public $lang;
public $lang_short;
public $encoding;
// language
public $l;
// smarty publics [end processing in smarty class]
public $DATA;
public $HEADER;
public $DEBUG_DATA;
public $CONTENT_DATA;
// smarty include/set var
public $INC_TEMPLATE_NAME;
public $JS_TEMPLATE_NAME;
public $CSS_TEMPLATE_NAME;
public $CSS_SPECIAL_TEMPLATE_NAME;
public $JS_SPECIAL_TEMPLATE_NAME;
public $CACHE_ID;
public $COMPILE_ID;
public $includes;
public $template_path;
public $lang_dir = '';
public $javascript;
public $css;
public $pictures;
public $cache_pictures;
public $cache_pictures_root;
public $JS_INCLUDE;
public $JS_SPECIAL_INCLUDE;
public $CSS_INCLUDE;
public $CSS_SPECIAL_INCLUDE;
// language
public $l;
// CONSTRUCTOR / DECONSTRUCTOR |====================================>
/**
* main class constructor
* @param array $db_config db config array
* @param string $lang language string
* @param int|integer $set_control_flag class variable check flag
*/
public function __construct(array $db_config, string $lang, int $set_control_flag = 0)
public function __construct(array $db_config, int $set_control_flag = 0)
{
$this->setLangEncoding();
// get the language sub class & init it
$this->l = new \CoreLibs\Language\L10n($lang);
$this->l = new \CoreLibs\Language\L10n($this->lang);
// init the database class
parent::__construct($db_config, $set_control_flag);
@@ -118,9 +103,52 @@ class Backend extends \CoreLibs\DB\IO
// INTERNAL METHODS |===============================================>
/**
* set the language encoding and language settings
* use $OVERRIDE_LANG to override all language settings
* the default charset from _SESSION login or from
* config DEFAULT ENCODING
* the lang full name for mo loading from _SESSION login
* or SITE LANG or DEFAULT LANG from config
* creates short lang (only first two chars) from the lang
* @return void
*/
private function setLangEncoding(): void
{
// just emergency fallback for language
// set encoding
if (isset($_SESSION['DEFAULT_CHARSET'])) {
$this->encoding = $_SESSION['DEFAULT_CHARSET'];
} else {
$this->encoding = DEFAULT_ENCODING;
}
// gobal override
if (isset($GLOBALS['OVERRIDE_LANG'])) {
$this->lang = $GLOBALS['OVERRIDE_LANG'];
} elseif (isset($_SESSION['DEFAULT_LANG'])) {
// session (login)
$this->lang = $_SESSION['DEFAULT_LANG'];
} else {
// mostly default SITE LANG or DEFAULT LANG
$this->lang = defined('SITE_LANG') ? SITE_LANG : DEFAULT_LANG;
}
// create the char lang encoding
$this->lang_short = substr($this->lang, 0, 2);
// set the language folder
$this->lang_dir = BASE.INCLUDES.LANG.CONTENT_PATH;
}
// PUBLIC METHODS |=================================================>
/**
* set internal ACL from login ACL
* @param array $acl login acl array
*/
public function setACL(array $acl): void
{
$this->acl = $acl;
}
/**
* writes all action vars plus other info into edit_log tabl
* @param string $event any kind of event description,
@@ -157,9 +185,9 @@ class Backend extends \CoreLibs\DB\IO
$q .= "ip, user_agent, referer, script_name, query_string, server_name, http_host, http_accept, http_accept_charset, http_accept_encoding, session_id, ";
$q .= "action, action_id, action_yes, action_flag, action_menu, action_loaded, action_value, action_error) ";
$q .= "VALUES ";
$q .= "(".$this->dbEscapeString(isset($_SESSION['EUID']) ? $_SESSION['EUID'] : '').", ";
$q .= "(".$this->dbEscapeString(isset($_SESSION['EUID']) && is_numeric($_SESSION['EUID']) ? $_SESSION['EUID'] : 'NULL').", ";
$q .= "NOW(), ";
$q .= "'".$this->dbEscapeString((string)$event)."', '".$data."', '".$data_binary."', '".$this->dbEscapeString($this->page_name)."', ";
$q .= "'".$this->dbEscapeString((string)$event)."', '".$data."', '".$data_binary."', '".$this->dbEscapeString((string)$this->page_name)."', ";
$q .= "'".@$_SERVER["REMOTE_ADDR"]."', '".$this->dbEscapeString(@$_SERVER['HTTP_USER_AGENT'])."', ";
$q .= "'".$this->dbEscapeString(isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '')."', ";
$q .= "'".$this->dbEscapeString(isset($_SERVER['SCRIPT_FILENAME']) ? $_SERVER['SCRIPT_FILENAME'] : '')."', ";
@@ -205,13 +233,14 @@ class Backend extends \CoreLibs\DB\IO
// if flag is 0, then we show all, else, we show only the matching flagges array points
// array is already sorted after correct order
reset($pages);
for ($i = 0, $iMax = count($pages); $i < $iMax; $i ++) {
foreach ($pages as $i => $data) {
// for ($i = 0, $iMax = count($pages); $i < $iMax; $i ++) {
$show = 0;
// is it visible in the menu & is it online
if ($pages[$i]['menu'] && $pages[$i]['online']) {
if ($data['menu'] && $data['online']) {
// check if it falls into our flag if we have a flag
if ($flag) {
foreach ($pages[$i]['visible'] as $name => $key) {
foreach ($data['visible'] as $name => $key) {
if ($key == $flag) {
$show = 1;
}
@@ -223,40 +252,59 @@ class Backend extends \CoreLibs\DB\IO
if ($show) {
// if it is popup, write popup arrayound
if (isset($pages[$i]['popup']) && $pages[$i]['popup']) {
if (isset($data['popup']) && $data['popup']) {
$type = 'popup';
} else {
$type = 'normal';
$pages[$i]['popup'] = 0;
$data['popup'] = 0;
}
$query_string = '';
if (isset($pages[$i]['query']) && count($pages[$i]['query'])) {
for ($j = 0, $jMax = count($pages[$i]['query']); $j < $jMax; $j ++) {
if (strlen($query_string)) {
$query_string .= '&';
}
$query_string .= $pages[$i]['query'][$j]['name'].'=';
if (!$pages[$i]['query'][$j]['dynamic']) {
$query_string .= urlencode($pages[$i]['query'][$j]['value']);
} else {
$query_string .= $_GET[$pages[$i]['query'][$j]['value']] ? urlencode($_GET[$pages[$i]['query'][$j]['value']]) : urlencode($_POST[$pages[$i]['query'][$j]['value']]);
if (isset($data['query']) &&
is_array($data['query']) &&
count($data['query'])
) {
// for ($j = 0, $jMax = count($pages[$i]['query']); $j < $jMax; $j ++) {
foreach ($data['query'] as $j => $query) {
if (!empty($query['name']) &&
!empty($query['value'])
) {
if (strlen($query_string)) {
$query_string .= '&';
}
$query_string .= $query['name'].'=';
if (isset($query['dynamic']) &&
$query['dynamic']
) {
if (isset($_GET[$query['value']])) {
$query_string .= urlencode($_GET[$query['value']]);
} elseif (isset($_POST[$query['value']])) {
$query_string .= urlencode($_POST[$query['value']]);
}
} else {
$query_string .= urlencode($query['value']);
}
}
}
}
$url = $pages[$i]['filename'];
$url = isset($data['filename']) ? $data['filename'] : '';
if (strlen($query_string)) {
$url .= '?'.$query_string;
}
$name = $pages[$i]['page_name'];
$name = isset($data['page_name']) ? $data['page_name'] : '';
// if page name matchs -> set selected flag
$selected = 0;
if ($this->getPageName() == $pages[$i]['filename']) {
if (isset($data['filename']) &&
$this->getPageName() == $data['filename']
) {
$selected = 1;
$this->page_name = $name;
}
// last check, is this menu point okay to show
$enabled = 0;
if ($this->adbShowMenuPoint($pages[$i]['filename'])) {
if (isset($data['filename']) &&
$this->adbShowMenuPoint($data['filename'])
) {
$enabled = 1;
}
// write in to view menu array
@@ -276,12 +324,15 @@ class Backend extends \CoreLibs\DB\IO
/**
* checks if this filename is in the current situation (user id, etc) available
* @param string $filename filename
* @return bool true for visible/accessable menu point, false for not
* @param string|null $filename filename
* @return bool true for visible/accessable menu point, false for not
*/
public function adbShowMenuPoint(string $filename): bool
public function adbShowMenuPoint(?string $filename): bool
{
$enabled = false;
if ($filename === null) {
return $enabled;
}
switch ($filename) {
default:
$enabled = true;

View File

@@ -891,6 +891,42 @@ class Basic
return "<pre>".print_r($array, true)."</pre>";
}
/**
* helper function for PHP file upload error messgaes to messge string
* @param int $error_code integer _FILE upload error code
* @return string message string, translated
*/
public function fileUploadErrorMessage(int $error_code): string
{
switch ($error_code) {
case UPLOAD_ERR_INI_SIZE:
$message = 'The uploaded file exceeds the upload_max_filesize directive in php.ini';
break;
case UPLOAD_ERR_FORM_SIZE:
$message = 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form';
break;
case UPLOAD_ERR_PARTIAL:
$message = 'The uploaded file was only partially uploaded';
break;
case UPLOAD_ERR_NO_FILE:
$message = 'No file was uploaded';
break;
case UPLOAD_ERR_NO_TMP_DIR:
$message = 'Missing a temporary folder';
break;
case UPLOAD_ERR_CANT_WRITE:
$message = 'Failed to write file to disk';
break;
case UPLOAD_ERR_EXTENSION:
$message = 'File upload stopped by extension';
break;
default:
$message = 'Unknown upload error';
break;
}
return $message;
}
// ****** DEBUG/ERROR FUNCTIONS ******
// ****** RANDOM KEY GEN ******
@@ -1174,7 +1210,7 @@ class Basic
public static function getFilenameEnding(string $filename): string
{
$page_temp = pathinfo($filename);
return $page_temp['extension'];
return isset($page_temp['extension']) ? $page_temp['extension'] : '';
}
/**
@@ -1200,12 +1236,22 @@ class Basic
$path[] = $key_lookin;
} else {
foreach ($haystack as $key => $val) {
if (is_scalar($val) && $val === $needle && empty($key_lookin)) {
break;
} elseif (is_scalar($val) && !empty($key_lookin) && $key === $key_lookin && $val == $needle) {
if (is_scalar($val) &&
$val === $needle &&
empty($key_lookin)
) {
$path[] = $key;
break;
} elseif (is_array($val) && $path = Basic::arraySearchRecursive($needle, $val, $key_lookin)) {
} elseif (is_scalar($val) &&
!empty($key_lookin) &&
$key === $key_lookin &&
$val == $needle
) {
$path[] = $key;
break;
} elseif (is_array($val) &&
$path = Basic::arraySearchRecursive($needle, $val, $key_lookin)
) {
array_unshift($path, $key);
break;
}
@@ -1224,16 +1270,27 @@ class Basic
*/
public static function arraySearchRecursiveAll($needle, array $haystack, $key, $path = null): ?array
{
// init if not set on null
if ($path === null) {
$path = array(
'level' => 0,
'work' => array()
);
}
// init sub sets if not set
if (!isset($path['level'])) {
$path['level'] = 0;
}
if (!isset($path['work'])) {
$path['work'] = array();
}
// should not be needed because it would trigger a php mehtod error
if (!is_array($haystack)) {
$haystack = array();
}
// @phan HACK
$path['level'] = $path['level'] ?? 0;
// go through the array,
foreach ($haystack as $_key => $_value) {
if (is_scalar($_value) && $_value == $needle && !$key) {
@@ -1253,6 +1310,9 @@ class Basic
$path = Basic::arraySearchRecursiveAll($needle, $_value, $key, $path);
}
}
// @phan HACK
$path['level'] = $path['level'] ?? 0;
$path['work'] = $path['work'] ?? array();
// cut all that is >= level
array_splice($path['work'], $path['level']);
// step back a level
@@ -1344,6 +1404,21 @@ class Basic
return $merged;
}
/**
* correct array_diff that does an actualy difference between two arrays.
* array_diff only checks elements from A that are not in B, but not the
* other way around.
* Note that like array_diff this only checks first level values not keys
* @param array $a array to compare a
* @param array $b array to compare b
* @return array array with missing elements from a & b
*/
public static function arrayDiff(array $a, array $b): array
{
$intersect = array_intersect($a, $b);
return array_merge(array_diff($a, $intersect), array_diff($b, $intersect));
}
/**
* search for the needle array elements in haystack and return the ones found as an array,
* is there nothing found, it returns FALSE (boolean)
@@ -1850,8 +1925,15 @@ class Basic
* @param bool $clear_cache if set to true, will create thumb all the tame
* @return string|bool thumbnail name, or false for error
*/
public static function createThumbnail(string $pic, int $size_x, int $size_y, string $dummy = '', string $path = '', string $cache_source = '', bool $clear_cache = false)
{
public static function createThumbnail(
string $pic,
int $size_x,
int $size_y,
string $dummy = '',
string $path = '',
string $cache_source = '',
bool $clear_cache = false
) {
// get image type flags
$image_types = array(
1 => 'gif',
@@ -1859,6 +1941,15 @@ class Basic
3 => 'png'
);
$return_data = false;
$CONVERT = '';
// if CONVERT is not defined, abort
/** @phan-suppress-next-line PhanUndeclaredConstant */
if (defined('CONVERT') && is_executable(CONVERT)) {
/** @phan-suppress-next-line PhanUndeclaredConstant */
$CONVERT = CONVERT;
} else {
return $return_data;
}
if (!empty($cache_source)) {
$tmp_src = $cache_source;
} else {
@@ -1896,7 +1987,7 @@ class Basic
// is this a PDF, if no, return from here with nothing
$convert_prefix = 'png:';
# TEMP convert to PNG, we then override the file name
$convert_string = CONVERT.' '.$filename.' '.$convert_prefix.$filename.'_TEMP';
$convert_string = $CONVERT.' '.$filename.' '.$convert_prefix.$filename.'_TEMP';
$status = exec($convert_string, $output, $return);
$filename .= '_TEMP';
// for delete, in case we need to glob
@@ -1920,7 +2011,7 @@ class Basic
if (!is_file($thumbnail) || $clear_cache == true) {
// convert the picture
if ($width > $size_x) {
$convert_string = CONVERT.' -geometry '.$size_x.'x '.$filename.' '.$thumbnail;
$convert_string = $CONVERT.' -geometry '.$size_x.'x '.$filename.' '.$thumbnail;
$status = exec($convert_string, $output, $return);
// get the size of the converted data, if converted
if (is_file($thumbnail)) {
@@ -1928,7 +2019,7 @@ class Basic
}
}
if ($height > $size_y) {
$convert_string = CONVERT.' -geometry x'.$size_y.' '.$filename.' '.$thumbnail;
$convert_string = $CONVERT.' -geometry x'.$size_y.' '.$filename.' '.$thumbnail;
$status = exec($convert_string, $output, $return);
}
}
@@ -1968,6 +2059,8 @@ class Basic
* @param int $thumb_width thumbnail width
* @param int $thumb_height thumbnail height
* @param string|null $thumbnail_path altnerative path for thumbnails
* @param bool $create_dummy if we encounter an invalid file
* create a dummy image file and return it
* @param bool $use_cache default to true, set to false to skip
* creating new image if exists
* @param bool $high_quality default to true, uses sample version, set to false
@@ -1980,6 +2073,7 @@ class Basic
int $thumb_width = 0,
int $thumb_height = 0,
?string $thumbnail_path = null,
bool $create_dummy = true,
bool $use_cache = true,
bool $high_quality = true,
int $jpeg_quality = 80
@@ -1994,8 +2088,12 @@ class Basic
) {
// $this->debug('IMAGE PREPARE', "FILENAME OK, THUMB WIDTH/HEIGHT OK");
list($inc_width, $inc_height, $img_type) = getimagesize($filename);
$thumbnail_write_path = null;
$thumbnail_web_path = null;
// path set first
if ($img_type == IMG_JPG ||
$img_type == IMG_PNG
$img_type == IMG_PNG ||
$create_dummy === true
) {
// $this->debug('IMAGE PREPARE', "IMAGE TYPE OK: ".$inc_width.'x'.$inc_height);
// set thumbnail paths
@@ -2008,6 +2106,11 @@ class Basic
$thumbnail_web_path = LAYOUT.CACHE;
}
}
}
// do resize or fall back on dummy run
if ($img_type == IMG_JPG ||
$img_type == IMG_PNG
) {
// if missing width or height in thumb, use the set one
if ($thumb_width == 0) {
$thumb_width = $inc_width;
@@ -2102,6 +2205,57 @@ class Basic
if ($thumbnail !== false) {
$thumbnail = $thumbnail_web_path.$thumbnail;
}
} elseif ($create_dummy === true) {
// create dummy image in the thumbnail size
// if one side is missing, use the other side to create a square
if (!$thumb_width) {
$thumb_width = $thumb_height;
}
if (!$thumb_height) {
$thumb_height = $thumb_width;
}
// do we have an image already?
$thumbnail = 'thumb-'.pathinfo($filename)['filename'].'-'.$thumb_width.'x'.$thumb_height;
if ($use_cache === false ||
!file_exists($thumbnail_write_path.$thumbnail)
) {
// if both are unset, set to 250
if ($thumb_height == 0) {
$thumb_height = 250;
}
if ($thumb_width == 0) {
$thumb_width = 250;
}
$thumb = imagecreatetruecolor($thumb_width, $thumb_height);
// add outside border px = 5% (rounded up)
// eg 50px -> 2.5px
$gray = imagecolorallocate($thumb, 200, 200, 200);
$white = imagecolorallocate($thumb, 255, 255, 255);
// fill gray background
imagefill($thumb, 0, 0, $gray);
// now create rectangle
if (imagesx($thumb) < imagesy($thumb)) {
$width = (int)round(imagesx($thumb) / 100 * 5);
} else {
$width = (int)round(imagesy($thumb) / 100 * 5);
}
imagefilledrectangle($thumb, 0 + $width, 0 + $width, imagesx($thumb) - $width, imagesy($thumb) - $width, $white);
// add "No valid images source"
// OR add circle
// * find center
// * width/height is 75% of size - border
// smaller size is taken
$base_width = imagesx($thumb) > imagesy($thumb) ? imagesy($thumb) : imagesx($thumb);
// get 75% width
$cross_width = (int)round((($base_width - ($width * 2)) / 100 * 75) / 2);
$center_x = (int)round(imagesx($thumb) / 2);
$center_y = (int)round(imagesy($thumb) / 2);
imagefilledellipse($thumb, $center_x, $center_y, $cross_width, $cross_width, $gray);
// find top left and bottom left for first line
imagepng($thumb, $thumbnail_write_path.$thumbnail);
}
// add web path
$thumbnail = $thumbnail_web_path.$thumbnail;
}
}
// either return false or the thumbnail name + output path web
@@ -2119,7 +2273,8 @@ class Basic
{
if (function_exists('exif_read_data') && is_writeable($filename)) {
list($inc_width, $inc_height, $img_type) = getimagesize($filename);
$exif = exif_read_data($filename);
// add @ to avoid "file not supported error"
$exif = @exif_read_data($filename);
$orientation = null;
$img = null;
if ($exif && isset($exif['Orientation'])) {

View File

@@ -1779,16 +1779,30 @@ class IO extends \CoreLibs\Basic
'row' => $table.'_id',
'value' => $primary_key
);
} elseif (!isset($primary_key['value'])) {
$primary_key['value'] = '';
} else {
if (!isset($primary_key['row'])) {
$primary_key['row'] = '';
}
if (!isset($primary_key['value'])) {
$primary_key['value'] = '';
}
}
// var set for strings
$q_sub_value = '';
$q_sub_data = '';
// get the table layout and row types
$table_data = $this->dbShowTableMetaData(($this->db_schema ? $this->db_schema.'.' : '').$table);
// @phan HACK
$primary_key['value'] = $primary_key['value'] ?? '';
$primary_key['row'] = $primary_key['row'] ?? '';
// loop through the write array and each field to build the query
foreach ($write_array as $field) {
if ((!$primary_key['value'] || ($primary_key['value'] && !in_array($field, $not_write_update_array))) && !in_array($field, $not_write_array)) {
if ((!$primary_key['value'] ||
($primary_key['value'] &&
!in_array($field, $not_write_update_array))
) &&
!in_array($field, $not_write_array)
) {
// data from external or data field
$_data = null;
if (count($data) >= 1 && array_key_exists($field, $data)) {
@@ -1842,7 +1856,7 @@ class IO extends \CoreLibs\Basic
}
// first work contact itself (we need contact id for everything else)
if ($primary_key['value']) {
if ($primary_key['value'] && $primary_key['row']) {
$q = 'UPDATE '.$table.' SET ';
$q .= $q_sub_data.' ';
$q .= 'WHERE '.$primary_key['row'].' = '.$primary_key['value'];
@@ -1861,8 +1875,8 @@ class IO extends \CoreLibs\Basic
if (!$primary_key['value']) {
$primary_key['value'] = $this->insert_id;
}
return $primary_key['value'];
// if there is not priamry key value field return false
return isset($primary_key['value']) ? $primary_key['value'] : false;
}
/**

View File

@@ -448,10 +448,10 @@ class PgSQL
}
if ('{}' != $text) {
do {
if ('{' != $text{$offset}) {
if ('{' != $text[$offset]) {
preg_match("/(\\{?\"([^\"\\\\]|\\\\.)*\"|[^,{}]+)+([,}]+)/", $text, $match, 0, $offset);
$offset += strlen($match[0]);
$output[] = ('"' != $match[1]{0} ? $match[1] : stripcslashes(substr($match[1], 1, -1)));
$output[] = ('"' != $match[1][0] ? $match[1] : stripcslashes(substr($match[1], 1, -1)));
if ('},' == $match[3]) {
return $offset;
}

View File

@@ -242,6 +242,11 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
public $security_level;
// layout publics
public $table_width;
// internal lang & encoding vars
public $lang_dir = '';
public $lang;
public $lang_short;
public $encoding;
// language
public $l;
@@ -251,15 +256,15 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
/**
* construct form generator
* @param array $db_config db config array
* @param string $lang interface language
* @param int|integer $table_width table/div width (default 750)
* @param int|integer $set_control_flag basic class set/get variable error flags
*/
public function __construct(array $db_config, string $lang, int $table_width = 750, int $set_control_flag = 0)
public function __construct(array $db_config, int $table_width = 750, int $set_control_flag = 0)
{
$this->my_page_name = $this->getPageName(1);
$this->setLangEncoding();
// init the language class
$this->l = new \CoreLibs\Language\L10n($lang);
$this->l = new \CoreLibs\Language\L10n($this->lang);
// load config array
// get table array definitions for current page name
// WARNING: auto spl load does not work with this as it is an array and not a function/object
@@ -323,18 +328,28 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$this->base_acl_level = isset($_SESSION['BASE_ACL_LEVEL']) ? $_SESSION['BASE_ACL_LEVEL'] : 0;
// security levels for buttons/actions
// if array does not exists create basic
if (!isset($config_array['security_level']) || !is_array($config_array['security_level']) ||
(is_array($config_array['security_level']) && count($config_array['security_level']) < 4)
if (!isset($config_array['security_level']) ||
(isset($config_array['security_level']) &&
(!is_array($config_array['security_level']) ||
(is_array($config_array['security_level']) && count($config_array['security_level']) < 4))
)
) {
$config_array['security_level'] = array(
$this->security_level = array(
'load' => 100,
'new' => 100,
'save' => 100,
'delete' => 100
);
} else {
// write array to class var
$this->security_level = isset($config_array['security_level']) ?
$config_array['security_level'] :
array('load' => 100,
'new' => 100,
'save' => 100,
'delete' => 100
);
}
// write array to class var
$this->security_level = $config_array['security_level'];
}
/**
@@ -348,6 +363,45 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
parent::__destruct();
}
// INTERNAL METHODS |===============================================>
/**
* ORIGINAL in \CoreLibs\Admin\Backend
* set the language encoding and language settings
* the default charset from _SESSION login or from
* config DEFAULT ENCODING
* the lang full name for mo loading from _SESSION login
* or SITE LANG or DEFAULT LANG from config
* creates short lang (only first two chars) from the lang
* @return void
*/
private function setLangEncoding(): void
{
// just emergency fallback for language
// set encoding
if (isset($_SESSION['DEFAULT_CHARSET'])) {
$this->encoding = $_SESSION['DEFAULT_CHARSET'];
} else {
$this->encoding = DEFAULT_ENCODING;
}
// gobal override
if (isset($GLOBALS['OVERRIDE_LANG'])) {
$this->lang = $GLOBALS['OVERRIDE_LANG'];
} elseif (isset($_SESSION['DEFAULT_LANG'])) {
// session (login)
$this->lang = $_SESSION['DEFAULT_LANG'];
} else {
// mostly default SITE LANG or DEFAULT LANG
$this->lang = defined('SITE_LANG') ? SITE_LANG : DEFAULT_LANG;
}
// create the char lang encoding
$this->lang_short = substr($this->lang, 0, 2);
// set the language folder
$this->lang_dir = BASE.INCLUDES.LANG.CONTENT_PATH;
}
// PUBLIC METHODS |=================================================>
/**
* dumps all values into output (for error msg)
* @return string full table array data output as string html formatted
@@ -442,7 +496,11 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
*/
public function formProcedureLoad(string $archive_id): void
{
if ($this->archive && $archive_id && $this->base_acl_level >= $this->security_level['load']) {
if (isset($this->security_level['load']) &&
$this->archive &&
$archive_id &&
$this->base_acl_level >= $this->security_level['load']
) {
$this->formLoadTableArray($archive_id);
$this->yes = 1;
}
@@ -454,7 +512,10 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
*/
public function formProcedureNew(): void
{
if ($this->new && $this->base_acl_level >= $this->security_level['new']) {
if (isset($this->security_level['new']) &&
$this->new &&
$this->base_acl_level >= $this->security_level['new']
) {
if ($this->really_new == 'yes') {
$this->formUnsetTablearray();
} else {
@@ -471,7 +532,10 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
*/
public function formProcedureSave(): void
{
if ($this->save && $this->base_acl_level >= $this->security_level['save']) {
if (isset($this->security_level['save']) &&
$this->save &&
$this->base_acl_level >= $this->security_level['save']
) {
$this->formErrorCheck();
if (!$this->error) {
$this->formSaveTableArray();
@@ -487,7 +551,10 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
public function formProcedureDelete(): void
{
// delete is also by 'protected'
if ($this->delete && $this->base_acl_level >= $this->security_level['delete']) {
if (isset($this->security_level['delete']) &&
$this->delete &&
$this->base_acl_level >= $this->security_level['delete']
) {
if (isset($this->table_array['protected']['value']) && $this->table_array['protected']['value']) {
$this->msg .= $this->l->__('Cannot delete this Dataset, because it is internaly protected!');
$this->error = 2;
@@ -510,11 +577,13 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
*/
public function formProcedureDeleteFromElementList(array $element_list, array $remove_name): void
{
/** @phan-suppress-next-line PhanTypeArraySuspiciousNullable */
$this->debug('REMOVE ELEMENT', 'Remove REF ELEMENT: '.$this->base_acl_level.' >= '.$this->security_level['delete']);
$this->debug('REMOVE ELEMENT', 'Protected Value set: '.(string)isset($this->table_array['protected']['value']));
$this->debug('REMOVE ELEMENT', 'Error: '.$this->error);
// only do if the user is allowed to delete
if ($this->base_acl_level >= $this->security_level['delete'] &&
if (isset($this->security_level['delete']) &&
$this->base_acl_level >= $this->security_level['delete'] &&
(!isset($this->table_array['protected']['value']) ||
(isset($this->table_array['protected']['value']) && !$this->table_array['protected']['value'])) &&
!$this->error
@@ -597,7 +666,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$pk_names = array();
$pk_ids = array();
// when security level is okay ...
if ($this->base_acl_level >= $this->security_level['load']) {
if (isset($this->security_level['load']) &&
$this->base_acl_level >= $this->security_level['load']
) {
$t_pk_name = $this->archive_pk_name;
// load list data
@@ -610,17 +681,24 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$pk_selected = $res[$this->int_pk_name];
}
$t_string = '';
for ($i = 0, $i_max = count($this->field_array); $i < $i_max; $i ++) {
foreach ($this->field_array as $i => $field_array) {
if ($t_string) {
$t_string .= ', ';
}
if (isset($this->field_array[$i]['before_value'])) {
$t_string .= $this->field_array[$i]['before_value'];
if (isset($field_array['before_value'])) {
$t_string .= $field_array['before_value'];
}
if (isset($this->field_array[$i]['binary'])) {
$t_string .= ($res[$this->field_array[$i]['name']]) ? $this->field_array[$i]['binary'][0] : $this->field_array[$i]['binary'][1];
} else {
$t_string .= $res[$this->field_array[$i]['name']];
// must have res element set
if (isset($res[$field_array['name']])) {
if (isset($field_array['binary'])) {
if (isset($field_array['binary'][0])) {
$t_string .= $field_array['binary'][0];
} elseif (isset($field_array['binary'][1])) {
$t_string .= $field_array['binary'][1];
}
} else {
$t_string .= $res[$field_array['name']];
}
}
}
$pk_names[] = $t_string;
@@ -644,7 +722,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$show_checkbox = 0;
$new_name = '';
// when security level is okay
if ($this->base_acl_level >= $this->security_level['new']) {
if (isset($this->security_level['new']) &&
$this->base_acl_level >= $this->security_level['new']
) {
if ($this->yes && !$hide_new_checkbox) {
$show_checkbox = 1;
}
@@ -675,7 +755,11 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$pk_value = '';
$show_delete = 0;
$old_school_hidden = 0;
if ($this->base_acl_level >= $this->security_level['save'] || $this->base_acl_level >= $this->security_level['delete']) {
if ((isset($this->security_level['save']) &&
$this->base_acl_level >= $this->security_level['save']) ||
(isset($this->security_level['delete']) &&
$this->base_acl_level >= $this->security_level['delete'])
) {
$old_school_hidden = 0;
if ($this->base_acl_level >= $this->security_level['save']) {
$seclevel_okay = 1;
@@ -899,7 +983,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$data['value'] = isset($this->table_array[$element_name]['value']) ? $this->table_array[$element_name]['value'] : 0;
$data['col_name'] = $this->col_name;
$data['table_name'] = $this->table_name;
$data['query'] = urlencode($query);
$data['query'] = $query !== null ? urlencode($query) : '';
}
// file upload
if ($this->table_array[$element_name]['type'] == 'file') {
@@ -1590,13 +1674,28 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$q = '';
// skip empty or not fully filled rows
if (isset($no_write[$i]) && !$no_write[$i]) {
if (!isset($q_begin[$i])) {
$q_begin[$i] = '';
}
if (!isset($q_end[$i])) {
$q_end[$i] = '';
}
// if tpye is update
if ($type[$i] == 'update') {
$q = $q_begin[$i].$q_data[$i].$q_end[$i];
if (isset($type[$i]) && $type[$i] == 'update') {
$q = $q_begin[$i].
(isset($q_data[$i]) ? $q_data[$i] : '').
$q_end[$i];
// or if we have block write, then it is insert (new)
} elseif (isset($block_write[$i]) && $block_write[$i]) {
$q = $q_begin[$i].$q_names[$i].', '.$this->int_pk_name.$q_middle[$i].$q_values[$i].', '.$this->table_array[$this->int_pk_name]['value'].$q_end[$i];
$q = $q_begin[$i].
(isset($q_names[$i]) ? $q_names[$i] : '').', '.
$this->int_pk_name.
(isset($q_middle[$i]) ? $q_middle[$i] : '').
(isset($q_values[$i]) ? $q_values[$i] : '').', '.
$this->table_array[$this->int_pk_name]['value'].
$q_end[$i];
}
/** @phan-suppress-next-line PhanTypePossiblyInvalidDimOffset */
$this->debug('edit', 'Pos['.$i.'] => '.$type[$i].' Q: '.$q.'<br>');
// write the dataset
if ($q) {
@@ -1724,7 +1823,23 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
*/
public function formCreateElementListTable(string $table_name): array
{
$data = array();
// init data rray
$data = array(
'delete_name' => '',
'delete' => 0,
'enable_name' => '',
'prefix' => '',
'pk_name' => '',
'fk_name' => '',
'type' => array(),
'output_name' => array(),
'preset' => array(),
'element_list' => array(),
'output_data' => array(),
'content' => array(),
'pos' => array(),
'table_name' => $table_name // sub table name
);
// output name for the viewable left table td box, prefixed with * if mandatory
$output_name = $this->element_list[$table_name]['output_name'];
if (isset($this->element_list[$table_name]['mandatory']) &&
@@ -1735,8 +1850,6 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
// delete button name, if there is one set
if (isset($this->element_list[$table_name]['delete_name'])) {
$data['delete_name'] = $this->element_list[$table_name]['delete_name'];
} else {
$data['delete_name'] = '';
}
// set the enable checkbox for delete, if the delete flag is given if there is one
if (isset($this->element_list[$table_name]['enable_name'])) {
@@ -1744,17 +1857,11 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
if (isset($this->element_list[$table_name]['delete'])) {
$data['delete'] = 1;
}
} else {
$data['enable_name'] = '';
}
// prefix for the elements, to not collide with names in the master set
if (isset($this->element_list[$table_name]['prefix'])) {
$data['prefix'] = $this->element_list[$table_name]['prefix'].'_';
} else {
$data['prefix'] = '';
}
// the sub data table name
$data['table_name'] = $table_name;
// build the select part
if (!isset($this->element_list[$table_name]['elements']) || !is_array($this->element_list[$table_name]['elements'])) {
@@ -1788,10 +1895,11 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
if (isset($data_array['type']) && $data_array['type'] == 'drop_down_db') {
$md_q = md5($data_array['query']);
while ($res = $this->dbReturn($data_array['query'])) {
/** @phan-suppress-next-line PhanTypeInvalidDimOffset */
$this->debug('edit', 'Q['.$md_q.'] pos: '.$this->cursor_ext[$md_q]['pos'].' | want: '.(isset($data_array['preset']) ? $data_array['preset'] : '-').' | set: '.(isset($data['preset'][$el_name]) ? $data['preset'][$el_name] : '-'));
// first is default for this element
if (isset($data_array['preset']) &&
(!isset($data['preset'][$el_name]) || (isset($data['preset'][$el_name]) && !$data['preset'][$el_name])) &&
(!isset($data['preset'][$el_name]) || empty($data['preset'][$el_name])) &&
($this->cursor_ext[$md_q]['pos'] == $data_array['preset'])
) {
$data['preset'][$el_name] = $res[0];
@@ -1840,6 +1948,8 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
array_unshift($q_select, $read_name);
}
}
// @phan HACK
$data['prefix'] = $data['prefix'] ?? '';
// set the rest of the data so we can print something out
$data['type'][$data['prefix'].$this->element_list[$table_name]['read_data']['name']] = 'string';
// build the read query
@@ -1875,7 +1985,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
// read out the list and add the selected data if needed
while ($res = $this->dbReturn($q)) {
$_data = array();
$prfx = $data['prefix']; // short
$prfx = $data['prefix'] ?? ''; // short
// go through each res
for ($i = 0, $i_max = count($q_select); $i < $i_max; $i ++) {
// query select part, set to the element name
@@ -1923,15 +2033,23 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$missing_empty_count = $this->element_list[$table_name]['max_empty'] - $element_count;
$this->debug('CFG MAX', 'Max empty: '.$this->element_list[$table_name]['max_empty'].', Missing: '.$missing_empty_count.', Has: '.$element_count);
// set if we need more open entries or if we do not have any entries yet
if (($missing_empty_count < $this->element_list[$table_name]['max_empty']) || $element_count == 0) {
if (($missing_empty_count < $this->element_list[$table_name]['max_empty']) ||
$element_count == 0
) {
for ($pos = $element_count, $pos_max = $this->element_list[$table_name]['max_empty'] + $element_count; $pos <= $pos_max; $pos ++) {
$_data = array();
// just in case
if (!isset($data['type'])) {
$data['type'] = array();
}
// the fields that need to be filled are in data->type array:
// pk fields are unfilled
// fk fields are filled with the fk_id 'int_pk_name' value
foreach ($data['type'] as $el_name => $type) {
$_data[$el_name] = '';
if ($el_name == $data['pk_name']) {
if (isset($data['pk_name']) &&
$el_name == $data['pk_name']
) {
// do nothing for pk name
} elseif (isset($data['fk_name']) &&
$el_name == $data['fk_name'] &&
@@ -1941,8 +2059,11 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
}
}
$data['content'][] = $_data;
$data['pos'][] = array(0 => $pos); // this is for the checkboxes
// $this->debug('CFG ELEMENT LIST FILL', 'Pos: '.$pos.'/'.$pos_max.', Content: '.count($data['content']).', Pos: '.count($data['pos']));
// this is for the checkboxes
$data['pos'][] = array(
0 => $pos
);
$this->debug('CFG ELEMENT LIST FILL', 'Pos: '.$pos.'/'.$pos_max.', Content: '.count($data['content']).', Pos: '.count($data['pos']));
}
}
}

View File

@@ -22,22 +22,413 @@ use SmartyBC;
class SmartyExtend extends SmartyBC
{
// internal translation engine
public $l10n;
// lang & encoding
public $lang_dir = '';
public $lang;
public $lang_short;
public $encoding;
// page name
public $page_name;
// array for data parsing
public $HEADER = array();
public $DATA = array();
public $DEBUG_DATA = array();
private $CONTENT_DATA = array();
// control vars
public $USE_PROTOTYPE = USE_PROTOTYPE;
public $USE_JQUERY = USE_JQUERY;
public $USE_SCRIPTACULOUS = USE_SCRIPTACULOUS;
// sub content input vars
public $USE_TINY_MCE = false;
public $JS_DATEPICKR = false;
public $JS_FLATPICKR = false;
public $DEBUG_TMPL = false;
public $USE_INCLUDE_TEMPLATE = false;
// cache & compile
public $CACHE_ID = '';
public $COMPILE_ID = '';
// template vars
public $MASTER_TEMPLATE_NAME;
public $PAGE_FILE_NAME;
public $CONTENT_INCLUDE;
public $FORM_NAME;
public $FORM_ACTION;
public $L_TITLE;
public $PAGE_WIDTH;
// smarty include/set var
public $TEMPLATE_PATH;
public $TEMPLATE_NAME;
public $INC_TEMPLATE_NAME;
public $JS_TEMPLATE_NAME;
public $CSS_TEMPLATE_NAME;
public $TEMPLATE_TRANSLATE;
// local names
public $JS_SPECIAL_TEMPLATE_NAME = '';
public $CSS_SPECIAL_TEMPLATE_NAME = '';
public $JS_INCLUDE;
public $CSS_INCLUDE;
public $JS_SPECIAL_INCLUDE;
public $CSS_SPECIAL_INCLUDE;
public $ADMIN_JAVASCRIPT;
public $ADMIN_STYLESHEET;
public $FRONTEND_JAVASCRIPT;
public $FRONTEND_STYLESHEET;
// other smarty folder vars
public $INCLUDES;
public $JAVASCRIPT;
public $CSS;
public $PICTURES;
public $CACHE_PICTURES;
public $CACHE_PICTURES_ROOT;
// constructor class, just sets the language stuff
/**
* constructor class, just sets the language stuff
* calls L10 for pass on internaly in smarty
* also registers the getvar caller pliugin
* @param string $lang language string to set
* also registers the getvar caller plugin
*/
public function __construct(string $lang)
public function __construct()
{
// call basic smarty
parent::__construct();
$this->l10n = new \CoreLibs\Language\L10n($lang);
// set lang vars
$this->setLangEncoding();
// iinit lang
$this->l10n = new \CoreLibs\Language\L10n($this->lang);
// variable variable register
// $this->register_modifier('getvar', array(&$this, 'get_template_vars'));
$this->registerPlugin('modifier', 'getvar', array(&$this, 'get_template_vars'));
$this->page_name = pathinfo($_SERVER["PHP_SELF"])['basename'];
// set internal settings
$this->CACHE_ID = defined('CACHE_ID') ? CACHE_ID : '';
$this->COMPILE_ID = defined('COMPILE_ID') ? COMPILE_ID : '';
}
/**
* ORIGINAL in \CoreLibs\Admin\Backend
* set the language encoding and language settings
* the default charset from _SESSION login or from
* config DEFAULT ENCODING
* the lang full name for mo loading from _SESSION login
* or SITE LANG or DEFAULT LANG from config
* creates short lang (only first two chars) from the lang
* @return void
*/
private function setLangEncoding(): void
{
// just emergency fallback for language
// set encoding
if (isset($_SESSION['DEFAULT_CHARSET'])) {
$this->encoding = $_SESSION['DEFAULT_CHARSET'];
} else {
$this->encoding = DEFAULT_ENCODING;
}
// gobal override
if (isset($GLOBALS['OVERRIDE_LANG'])) {
$this->lang = $GLOBALS['OVERRIDE_LANG'];
} elseif (isset($_SESSION['DEFAULT_LANG'])) {
// session (login)
$this->lang = $_SESSION['DEFAULT_LANG'];
} else {
// mostly default SITE LANG or DEFAULT LANG
$this->lang = defined('SITE_LANG') ? SITE_LANG : DEFAULT_LANG;
}
// create the char lang encoding
$this->lang_short = substr($this->lang, 0, 2);
// set the language folder
$this->lang_dir = BASE.INCLUDES.LANG.CONTENT_PATH;
}
/**
* sets all internal paths and names that need to be passed on to the smarty template
* @return void
*/
public function setSmartyPaths(): void
{
// master template
if (!isset($this->MASTER_TEMPLATE_NAME)) {
$this->MASTER_TEMPLATE_NAME = MASTER_TEMPLATE_NAME;
}
// set include & template names
if (!isset($this->CONTENT_INCLUDE)) {
$this->CONTENT_INCLUDE = str_replace('.php', '', $this->page_name).'.tpl';
}
// strip tpl and replace it with php
// php include file per page
$this->INC_TEMPLATE_NAME = str_replace('.tpl', '.php', $this->CONTENT_INCLUDE);
// javascript include per page
$this->JS_TEMPLATE_NAME = str_replace('.tpl', '.js', $this->CONTENT_INCLUDE);
// css per page
$this->CSS_TEMPLATE_NAME = str_replace('.tpl', '.css', $this->CONTENT_INCLUDE);
// set basic template path (tmp)
$this->INCLUDES = BASE.INCLUDES; // no longer in templates, only global
$this->TEMPLATE_PATH = BASE.INCLUDES.TEMPLATES.CONTENT_PATH;
$this->setTemplateDir($this->TEMPLATE_PATH);
$this->JAVASCRIPT = LAYOUT.JS;
$this->CSS = LAYOUT.CSS;
$this->PICTURES = LAYOUT.IMAGES;
$this->CACHE_PICTURES = LAYOUT.CACHE;
$this->CACHE_PICTURES_ROOT = ROOT.$this->CACHE_PICTURES;
// check if we have an external file with the template name
if (file_exists($this->INCLUDES.$this->INC_TEMPLATE_NAME) &&
is_file($this->INCLUDES.$this->INC_TEMPLATE_NAME)
) {
include($this->INCLUDES.$this->INC_TEMPLATE_NAME);
}
// check for template include
if ($this->USE_INCLUDE_TEMPLATE === true &&
!$this->TEMPLATE_NAME
) {
$this->TEMPLATE_NAME = $this->CONTENT_INCLUDE;
// add to cache & compile id
$this->COMPILE_ID .= '_'.$this->TEMPLATE_NAME;
$this->CACHE_ID .= '_'.$this->TEMPLATE_NAME;
}
// additional per page Javascript include
$this->JS_INCLUDE = '';
if (file_exists($this->JAVASCRIPT.$this->JS_TEMPLATE_NAME) &&
is_file($this->JAVASCRIPT.$this->JS_TEMPLATE_NAME)
) {
$this->JS_INCLUDE = $this->JAVASCRIPT.$this->JS_TEMPLATE_NAME;
}
// per page css file
$this->CSS_INCLUDE = '';
if (file_exists($this->CSS.$this->CSS_TEMPLATE_NAME) &&
is_file($this->CSS.$this->CSS_TEMPLATE_NAME)
) {
$this->CSS_INCLUDE = $this->CSS.$this->CSS_TEMPLATE_NAME;
}
// optional CSS file
$this->CSS_SPECIAL_INCLUDE = '';
if (file_exists($this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME) &&
is_file($this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME)
) {
$this->CSS_SPECIAL_INCLUDE = $this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME;
}
// optional JS file
$this->JS_SPECIAL_INCLUDE = '';
if (file_exists($this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME) &&
is_file($this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME)
) {
$this->JS_SPECIAL_INCLUDE = $this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME;
}
// check if template names exist
if (!$this->MASTER_TEMPLATE_NAME) {
exit('MASTER TEMPLATE is not set');
} elseif (!file_exists($this->getTemplateDir()[0].DS.$this->MASTER_TEMPLATE_NAME)) {
// abort if master template could not be found
exit('MASTER TEMPLATE: '.$this->MASTER_TEMPLATE_NAME.' could not be found');
}
if ($this->TEMPLATE_NAME &&
!file_exists($this->getTemplateDir()[0].DS.$this->TEMPLATE_NAME)
) {
exit('INCLUDE TEMPLATE: '.$this->TEMPLATE_NAME.' could not be found');
}
// javascript translate data as template for auto translate
if (empty($this->TEMPLATE_TRANSLATE)) {
$this->TEMPLATE_TRANSLATE = 'jsTranslate_'.$this->lang.'.tpl';
} else {
// we assume we have some fixed set
// we must add _<$this->lang>
// if .tpl, put before .tpl
// if not .tpl, add _<$this->lang>.tpl
if (strpos($this->TEMPLATE_TRANSLATE, '.tpl')) {
$this->TEMPLATE_TRANSLATE = str_replace('.tpl', '_'.$this->lang.'.tpl', $this->TEMPLATE_TRANSLATE);
} else {
$this->TEMPLATE_TRANSLATE .= '_'.$this->lang.'.tpl';
}
}
// if we can't find it, dump it
if (!file_exists($this->getTemplateDir()[0].DS.$this->TEMPLATE_TRANSLATE)) {
$this->TEMPLATE_TRANSLATE = null;
}
}
/**
* wrapper call for setSmartyVars
* this is for frontend type and will not set any only admin needed variables
* @return void
*/
public function setSmartyVarsFrontend(): void
{
$this->setSmartyVars();
}
/**
* wrapper call for setSmartyVars
* this is only for admin interface and will set additional variables
*/
public function setSmartyVarsAdmin(): void
{
$this->setSmartyVars(true);
}
/**
* set smarty pass on variables, sub template names and finally calls the smarty parser
* @param boolean $admin_call default false, will set admin only variables
* @return void
*/
private function setSmartyVars($admin_call = false): void
{
global $cms;
$this->mergeCmsSmartyVars($cms);
// trigger flags
$this->HEADER['USE_PROTOTYPE'] = $this->USE_PROTOTYPE;
// scriptacolous, can only be used with prototype
if ($this->HEADER['USE_PROTOTYPE']) {
$this->HEADER['USE_SCRIPTACULOUS'] = $this->USE_SCRIPTACULOUS;
}
// jquery and prototype should not be used together
$this->HEADER['USE_JQUERY'] = $this->USE_JQUERY;
// additional per page Javascript include
$this->JS_INCLUDE = '';
if (file_exists($this->JAVASCRIPT.$this->JS_TEMPLATE_NAME) &&
is_file($this->JAVASCRIPT.$this->JS_TEMPLATE_NAME)
) {
$this->JS_INCLUDE = $this->JAVASCRIPT.$this->JS_TEMPLATE_NAME;
}
// per page css file
$this->CSS_INCLUDE = '';
if (file_exists($this->CSS.$this->CSS_TEMPLATE_NAME) &&
is_file($this->CSS.$this->CSS_TEMPLATE_NAME)
) {
$this->CSS_INCLUDE = $this->CSS.$this->CSS_TEMPLATE_NAME;
}
// optional CSS file
$this->CSS_SPECIAL_INCLUDE = '';
if (file_exists($this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME) &&
is_file($this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME)
) {
$this->CSS_SPECIAL_INCLUDE = $this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME;
}
// optional JS file
$this->JS_SPECIAL_INCLUDE = '';
if (file_exists($this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME) &&
is_file($this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME)
) {
$this->JS_SPECIAL_INCLUDE = $this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME;
}
// the actual include files for javascript (per page)
$this->HEADER['JS_INCLUDE'] = $this->JS_INCLUDE;
$this->HEADER['CSS_INCLUDE'] = $this->CSS_INCLUDE;
$this->HEADER['CSS_SPECIAL_INCLUDE'] = $this->CSS_SPECIAL_INCLUDE;
$this->HEADER['JS_SPECIAL_INCLUDE'] = $this->JS_SPECIAL_INCLUDE;
// paths to the files
$this->DATA['includes'] = $this->INCLUDES;
$this->DATA['js'] = $this->JAVASCRIPT;
$this->DATA['css'] = $this->CSS;
$this->DATA['pictures'] = $this->PICTURES;
// default CMS settings
// define all needed smarty stuff for the general HTML/page building
$this->HEADER['CSS'] = CSS;
$this->HEADER['JS'] = JS;
$this->HEADER['ENCODING'] = $this->encoding;
$this->HEADER['DEFAULT_ENCODING'] = DEFAULT_ENCODING;
// special for admin
if ($admin_call === true) {
// set ACL extra show
$this->DATA['show_ea_extra'] = isset($cms->acl['show_ea_extra']) ? $cms->acl['show_ea_extra'] : false;
$this->DATA['ADMIN'] = !empty($cms->acl['admin']) ? $cms->acl['admin'] : 0;
// set style sheets
$this->HEADER['STYLESHEET'] = $this->ADMIN_STYLESHEET ? $this->ADMIN_STYLESHEET : ADMIN_STYLESHEET;
$this->HEADER['JAVASCRIPT'] = $this->ADMIN_JAVASCRIPT ? $this->ADMIN_JAVASCRIPT : ADMIN_JAVASCRIPT;
// top menu
$this->DATA['nav_menu'] = $cms->adbTopMenu();
$this->DATA['nav_menu_count'] = is_array($this->DATA['nav_menu']) ? count($this->DATA['nav_menu']) : 0;
// messages = array('msg' =>, 'class' => 'error/warning/...')
$this->DATA['messages'] = isset($cms->messages) ? $cms->messages : $cms->messages;
// the page name
$this->DATA['page_name'] = $this->page_name;
$this->DATA['table_width'] = isset($this->PAGE_WIDTH) ? $this->PAGE_WIDTH : PAGE_WIDTH;
// for tinymce special
$this->DATA['TINYMCE_LANG'] = $this->lang_short;
// include flags
$this->DATA['USE_TINY_MCE'] = $this->USE_TINY_MCE;
// debug data, if DEBUG flag is on, this data is print out
$this->DEBUG_DATA['DEBUG'] = $this->DEBUG_TMPL;
} else {
$this->HEADER['STYLESHEET'] = $this->FRONTEND_STYLESHEET ? $this->FRONTEND_STYLESHEET : STYLESHEET;
$this->HEADER['JAVASCRIPT'] = $this->FRONTEND_JAVASCRIPT ? $this->FRONTEND_JAVASCRIPT : JAVASCRIPT;
}
// html title
// set local page title
$this->HEADER['HTML_TITLE'] = !$this->L_TITLE ?
ucfirst(str_replace('_', ' ', $cms->getPageName(1))).(defined(G_TITLE) ? ' - '.$this->l10n->__(G_TITLE) : '') :
$this->l10n->__($this->L_TITLE);
// LANG
$this->DATA['LANG'] = $this->lang;
// form name
$this->DATA['FORM_NAME'] = !$this->FORM_NAME ?
str_replace('.php', '', $this->page_name) :
$this->FORM_NAME;
$this->DATA['FORM_ACTION'] = $this->FORM_ACTION;
// include flags
$this->DATA['JS_DATEPICKR'] = $this->JS_DATEPICKR;
$this->DATA['JS_FLATPICKR'] = $this->JS_FLATPICKR;
// user name
$this->DATA['USER_NAME'] = !empty($_SESSION['USER_NAME']) ? $_SESSION['USER_NAME'] : '';
// the template part to include into the body
$this->DATA['TEMPLATE_NAME'] = $this->TEMPLATE_NAME;
$this->DATA['CONTENT_INCLUDE'] = $this->CONTENT_INCLUDE;
$this->DATA['TEMPLATE_TRANSLATE'] = isset($this->TEMPLATE_TRANSLATE) ? $this->TEMPLATE_TRANSLATE : null;
$this->DATA['PAGE_FILE_NAME'] = str_replace('.php', '', $this->page_name).'.tpl';
// render page
$this->renderSmarty();
}
/**
* merge outside object HEADER/DATA/DEBUG_DATA vars into the smarty class
* @param object $cms object that has header/data/debug_data
* @return void
*/
public function mergeCmsSmartyVars(object $cms): void
{
// array merge HEADER, DATA, DEBUG DATA
foreach (array('HEADER', 'DATA', 'DEBUG_DATA') as $ext_smarty) {
if (is_array($cms->{$ext_smarty})) {
$this->{$ext_smarty} = array_merge($this->{$ext_smarty}, $cms->{$ext_smarty});
}
}
}
/**
* render smarty data (can be called sepparate)
* @return void
*/
public function renderSmarty(): void
{
// create main data array
$this->CONTENT_DATA = array_merge($this->HEADER, $this->DATA, $this->DEBUG_DATA);
// data is 1:1 mapping (all vars, values, etc)
foreach ($this->CONTENT_DATA as $key => $value) {
$this->assign($key, $value);
}
if (is_dir(BASE.TEMPLATES_C)) {
$this->setCompileDir(BASE.TEMPLATES_C);
}
if (is_dir(BASE.CACHE)) {
$this->setCacheDir(BASE.CACHE);
}
$this->display(
$this->MASTER_TEMPLATE_NAME,
$this->CACHE_ID.($this->CACHE_ID ? '_' : '').$this->lang,
$this->COMPILE_ID.($this->COMPILE_ID ? '_' : '').$this->lang
);
}
}