Compare commits
39 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
330582f273 | ||
|
|
b0293b52bd | ||
|
|
00591deb00 | ||
|
|
737f70fac5 | ||
|
|
0328ccd2fe | ||
|
|
eba1e2885f | ||
|
|
53813261fb | ||
|
|
df2ae66942 | ||
|
|
78e1d73cd9 | ||
|
|
620a5878c1 | ||
|
|
5a0b09a916 | ||
|
|
98c6033c75 | ||
|
|
6dcebc9b67 | ||
|
|
c97520e186 | ||
|
|
764ca1f098 | ||
|
|
3d23e5b066 | ||
|
|
90e418ba24 | ||
|
|
b6a0937e0c | ||
|
|
b3f6f8ef18 | ||
|
|
d9d5400498 | ||
|
|
b1be681afb | ||
|
|
8ef309d479 | ||
|
|
6e59b63791 | ||
|
|
9c7b3cea83 | ||
|
|
26af6a07f4 | ||
|
|
b7c6d4b478 | ||
|
|
9936fc04da | ||
|
|
1e0dfa2106 | ||
|
|
3af6f6a8f0 | ||
|
|
1e793c0d16 | ||
|
|
5be34453ce | ||
|
|
7773b78e17 | ||
|
|
2a3798c8c2 | ||
|
|
bc8303fe5f | ||
|
|
ba89b188d9 | ||
|
|
d15618cde4 | ||
|
|
0fd89727e9 | ||
|
|
a8e75d158b | ||
|
|
4b3fbaa309 |
@@ -26,6 +26,7 @@
|
|||||||
use Phan\Config;
|
use Phan\Config;
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
// "target_php_version" => "8.2",
|
||||||
// turn color on (-C)
|
// turn color on (-C)
|
||||||
"color_issue_messages_if_supported" => true,
|
"color_issue_messages_if_supported" => true,
|
||||||
// If true, missing properties will be created when
|
// If true, missing properties will be created when
|
||||||
@@ -95,7 +96,7 @@ return [
|
|||||||
'www/vendor',
|
'www/vendor',
|
||||||
'www/tests',
|
'www/tests',
|
||||||
'www/lib/Smarty',
|
'www/lib/Smarty',
|
||||||
'www/lib/smarty-4.1.0',
|
'www/lib/smarty-4.3.0',
|
||||||
'www/templates_c',
|
'www/templates_c',
|
||||||
'www/log',
|
'www/log',
|
||||||
'www/tmp',
|
'www/tmp',
|
||||||
@@ -117,7 +118,9 @@ return [
|
|||||||
'www/admin/qq_file_upload_front.php',
|
'www/admin/qq_file_upload_front.php',
|
||||||
'www/admin/qq_file_upload_ajax.php',
|
'www/admin/qq_file_upload_ajax.php',
|
||||||
// symlink ignore
|
// symlink ignore
|
||||||
'www/lib/smarty-4.1.0/libs/Smarty.class.php'
|
'www/lib/smarty-4.3.0/libs/Smarty.class.php',
|
||||||
|
// legacy edit base (until removal)
|
||||||
|
'www/includes/edit_base.LEGACY.php'
|
||||||
],
|
],
|
||||||
|
|
||||||
// what not to show as problem
|
// what not to show as problem
|
||||||
|
|||||||
@@ -1,13 +1,15 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
base_folder='/var/www/html/developers/clemens/core_data/php_libraries/trunk/www/';
|
BASE_FOLDER=$(dirname $(readlink -f $0))"/";
|
||||||
|
# Assume script is in 4dev/bin
|
||||||
|
base_folder="${BASE_FOLDER}../../www/";
|
||||||
|
|
||||||
# locale gettext po to mo translator master
|
# locale gettext po to mo translator master
|
||||||
for file in $(ls -1 ${base_folder}../4dev/locale/*.po); do
|
for file in $(ls -1 ${base_folder}../4dev/locale/*.po); do
|
||||||
file=$(basename $file .po);
|
file=$(basename $file .po);
|
||||||
echo "Translate language ${file}";
|
|
||||||
locale=$(echo "${file}" | cut -d "-" -f 1);
|
locale=$(echo "${file}" | cut -d "-" -f 1);
|
||||||
domain=$(echo "${file}" | cut -d "-" -f 2);
|
domain=$(echo "${file}" | cut -d "-" -f 2);
|
||||||
|
echo "- Translate language file '${file}' for locale '${locale}' and domain '${domain}':";
|
||||||
if [ ! -d "${base_folder}/includes/locale/${locale}/LC_MESSAGES/" ]; then
|
if [ ! -d "${base_folder}/includes/locale/${locale}/LC_MESSAGES/" ]; then
|
||||||
mkdir -p "${base_folder}/includes/locale/${locale}/LC_MESSAGES/";
|
mkdir -p "${base_folder}/includes/locale/${locale}/LC_MESSAGES/";
|
||||||
fi;
|
fi;
|
||||||
|
|||||||
169
4dev/bin/mo_to_js.sh
Executable file
169
4dev/bin/mo_to_js.sh
Executable file
@@ -0,0 +1,169 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# read source mo files and writes target js files in object form
|
||||||
|
|
||||||
|
# check for ARG 1 is "mv"
|
||||||
|
# then move the files directly and don't do manual check (don't create temp files)
|
||||||
|
FILE_MOVE=0;
|
||||||
|
if [ "${1}" = "mv" ]; then
|
||||||
|
echo "*** Direct write ***";
|
||||||
|
FILE_MOVE=1;
|
||||||
|
fi;
|
||||||
|
|
||||||
|
target='';
|
||||||
|
BASE_FOLDER=$(dirname $(readlink -f $0))"/";
|
||||||
|
# Assume script is in 4dev/bin
|
||||||
|
base_folder="${BASE_FOLDER}../../www/";
|
||||||
|
po_folder='../4dev/locale/'
|
||||||
|
mo_folder='includes/locale/';
|
||||||
|
target_folder='';
|
||||||
|
template_file_stump='##SUFFIX##translate-##LANGUAGE##.TMP.js';
|
||||||
|
# for output file names
|
||||||
|
source_list=(iw);
|
||||||
|
language_list=(en ja);
|
||||||
|
# set target names
|
||||||
|
if [ "${target}" == '' ]; then
|
||||||
|
echo "*** Non smarty ***";
|
||||||
|
TEXTDOMAINDIR=${base_folder}${mo_folder}.
|
||||||
|
# default is admin
|
||||||
|
TEXTDOMAIN=admin;
|
||||||
|
fi;
|
||||||
|
js_folder="layout/${TEXTDOMAIN}/javascript/";
|
||||||
|
|
||||||
|
error=0;
|
||||||
|
# this checks if the TEXTDOMAIN target actually exists
|
||||||
|
if [ ! -d "${base_folder}${js_folder}" ]; then
|
||||||
|
echo "Cannot find target javascript folder ${base_folder}${js_folder}";
|
||||||
|
error=1;
|
||||||
|
else
|
||||||
|
target_folder="${base_folder}${js_folder}";
|
||||||
|
fi;
|
||||||
|
|
||||||
|
if [ ${error} -eq 1 ]; then
|
||||||
|
exit;
|
||||||
|
fi;
|
||||||
|
|
||||||
|
# locale gettext po to mo translator master
|
||||||
|
for file in $(ls -1 ${base_folder}../4dev/locale/*.po); do
|
||||||
|
file=$(basename $file .po);
|
||||||
|
echo "Translate language ${file}";
|
||||||
|
locale=$(echo "${file}" | cut -d "-" -f 1);
|
||||||
|
domain=$(echo "${file}" | cut -d "-" -f 2);
|
||||||
|
if [ ! -d "${base_folder}/includes/locale/${locale}/LC_MESSAGES/" ]; then
|
||||||
|
mkdir -p "${base_folder}/includes/locale/${locale}/LC_MESSAGES/";
|
||||||
|
fi;
|
||||||
|
msgfmt -o ${base_folder}/includes/locale/${locale}/LC_MESSAGES/${domain}.mo ${base_folder}${po_folder}${locale}-${domain}.po;
|
||||||
|
done;
|
||||||
|
|
||||||
|
rx_msgid_empty="^msgid \"\"";
|
||||||
|
rx_msgid="^msgid \"";
|
||||||
|
rx_msgstr="^msgstr \""
|
||||||
|
|
||||||
|
# quick copy string at the end
|
||||||
|
quick_copy='';
|
||||||
|
|
||||||
|
for language in ${language_list[*]}; do
|
||||||
|
# I don't know which one must be set, but I think at least LANGUAGE
|
||||||
|
case ${language} in
|
||||||
|
ja)
|
||||||
|
LANG=ja_JP.UTF-8;
|
||||||
|
ENCODING=UTF-8;
|
||||||
|
LANGUAGE=ja;
|
||||||
|
;;
|
||||||
|
en)
|
||||||
|
# was en_JP.UTF-8
|
||||||
|
LANG=en_US.UTF-8;
|
||||||
|
ENCODING=UTF-8;
|
||||||
|
LANGUAGE=en;
|
||||||
|
;;
|
||||||
|
esac;
|
||||||
|
# write only one for language and then symlink files
|
||||||
|
template_file=$(echo ${template_file_stump} | sed -e "s/##SUFFIX##//" | sed -e "s/##LANGUAGE##/${LANG}/");
|
||||||
|
original_file=$(echo ${template_file} | sed -e 's/\.TMP//g');
|
||||||
|
if [ "${FILE_MOVE}" -eq 0 ]; then
|
||||||
|
file=${target_folder}${template_file};
|
||||||
|
else
|
||||||
|
file=${target_folder}${original_file};
|
||||||
|
fi;
|
||||||
|
echo "===> Write translation file ${file}";
|
||||||
|
echo ". = normal, : = escape, x = skip";
|
||||||
|
# init line [aka don't touch this file]
|
||||||
|
echo "// AUTO FILL, changes will be overwritten" > $file;
|
||||||
|
echo "// source: ${suffix}, language: ${language}" >> $file;
|
||||||
|
echo "// Translation strings in the format" >> $file;
|
||||||
|
echo "// \"Original\":\"Translated\""$'\n' >> $file;
|
||||||
|
echo "var i18n = {" >> $file;
|
||||||
|
# translations stuff
|
||||||
|
# read the po file
|
||||||
|
pos=0; # do we add a , for the next line
|
||||||
|
cat "${base_folder}${po_folder}${language}-${TEXTDOMAIN}.po" |
|
||||||
|
while read str; do
|
||||||
|
# echo "S: ${str}";
|
||||||
|
# skip empty
|
||||||
|
if [[ "${str}" =~ ${rx_msgid_empty} ]]; then
|
||||||
|
# skip on empty
|
||||||
|
echo -n "x";
|
||||||
|
# msgid is left, msgstr is right
|
||||||
|
elif [[ "${str}" =~ ${rx_msgid} ]]; then
|
||||||
|
echo -n ".";
|
||||||
|
# open left side
|
||||||
|
# TODO: how to handle multi line strings: or don't use them
|
||||||
|
# extract from between ""
|
||||||
|
str_source=$(echo "${str}" | sed -e "s/^msgid \"//" | sed -e "s/\"$//");
|
||||||
|
# close right side, if not last add ,
|
||||||
|
if [ "${pos}" -eq 1 ]; then
|
||||||
|
echo -n "," >> $file;
|
||||||
|
fi;
|
||||||
|
# all " inside string need to be escaped
|
||||||
|
str_source=$(echo "${str_source}" | sed -e 's/"/\\"/g');
|
||||||
|
# fix with proper layout
|
||||||
|
echo -n "\"$str_source\":\"$(TEXTDOMAINDIR=${TEXTDOMAINDIR} LANGUAGE=${language} LANG=${LANG} gettext ${TEXTDOMAIN} "${str_source}")\"" >> $file;
|
||||||
|
pos=1;
|
||||||
|
elif [[ "${str}" =~ ${rx_msgstr} ]]; then
|
||||||
|
# open right side (ignore)
|
||||||
|
echo -n "";
|
||||||
|
else
|
||||||
|
# general ignore (anything between or comments)
|
||||||
|
echo -n "";
|
||||||
|
fi;
|
||||||
|
done;
|
||||||
|
|
||||||
|
echo "" >> $file;
|
||||||
|
echo "};" >> $file;
|
||||||
|
echo " [DONE]";
|
||||||
|
|
||||||
|
# on no move
|
||||||
|
if [ "${FILE_MOVE}" -eq 0 ]; then
|
||||||
|
echo "===> Confirm all changes in ${file} and then move data to original";
|
||||||
|
echo "";
|
||||||
|
quick_copy=${quick_copy}"mv ${template_file} ${original_file}"$'\n';
|
||||||
|
fi;
|
||||||
|
|
||||||
|
# symlink to master file
|
||||||
|
for suffix in ${source_list[*]}; do
|
||||||
|
# symlink with full lang name
|
||||||
|
symlink_file[0]=$(echo ${template_file_stump} | sed -e "s/##SUFFIX##/${suffix}_/" | sed -e "s/##LANGUAGE##/${LANG}/" | sed -e 's/\.TMP//g');
|
||||||
|
# create second one with lang (no country) + encoding
|
||||||
|
symlink_file[1]=$(echo ${template_file_stump} | sed -e "s/##SUFFIX##/${suffix}_/" | sed -e "s/##LANGUAGE##/${LANGUAGE}\.${ENCODING}/" | sed -e 's/\.TMP//g');
|
||||||
|
for template_file in ${symlink_file[@]}; do
|
||||||
|
# if this is not symlink, create them
|
||||||
|
if [ ! -h "${template_file}" ]; then
|
||||||
|
echo "Create symlink: ${template_file}";
|
||||||
|
# symlik to original
|
||||||
|
cd "${target_folder}";
|
||||||
|
ln -sf "${original_file}" "${template_file}";
|
||||||
|
cd - >/dev/null;
|
||||||
|
fi;
|
||||||
|
done;
|
||||||
|
done;
|
||||||
|
done;
|
||||||
|
|
||||||
|
if [ "${FILE_MOVE}" -eq 0 ]; then
|
||||||
|
echo "";
|
||||||
|
echo "-- IN FOLDER: ${target_folder}";
|
||||||
|
echo "-- START: copy lines below to copy created over original --";
|
||||||
|
echo "${quick_copy}";
|
||||||
|
echo "-- END ----------------------------------------------------";
|
||||||
|
fi;
|
||||||
|
|
||||||
|
# __END__
|
||||||
@@ -3,7 +3,7 @@ base="/storage/var/www/html/developers/clemens/core_data/php_libraries/trunk/";
|
|||||||
# --testdox
|
# --testdox
|
||||||
# call with "t" to give verbose testdox output
|
# call with "t" to give verbose testdox output
|
||||||
# SUPPORTED: https://www.php.net/supported-versions.php
|
# SUPPORTED: https://www.php.net/supported-versions.php
|
||||||
# call with 7.3, 7.4, 8.0, 8.1 to force a certain php version
|
# call with 7.4, 8.0, 8.1 to force a certain php version
|
||||||
|
|
||||||
opt_testdox="";
|
opt_testdox="";
|
||||||
if [ "${1}" = "t" ] || [ "${2}" = "t" ]; then
|
if [ "${1}" = "t" ] || [ "${2}" = "t" ]; then
|
||||||
@@ -16,6 +16,7 @@ if [ ! -z "${1}" ]; then
|
|||||||
"7.4") php_bin="/usr/bin/php7.4 "; ;;
|
"7.4") php_bin="/usr/bin/php7.4 "; ;;
|
||||||
"8.0") php_bin="/usr/bin/php8.0 "; ;;
|
"8.0") php_bin="/usr/bin/php8.0 "; ;;
|
||||||
"8.1") php_bin="/usr/bin/php8.1 "; ;;
|
"8.1") php_bin="/usr/bin/php8.1 "; ;;
|
||||||
|
"8.2") php_bin="/usr/bin/php8.2 "; ;;
|
||||||
*) echo "Not support PHP: ${1}"; exit; ;;
|
*) echo "Not support PHP: ${1}"; exit; ;;
|
||||||
esac;
|
esac;
|
||||||
fi;
|
fi;
|
||||||
@@ -25,6 +26,7 @@ if [ ! -z "${2}" ] && [ -z "${php_bin}" ]; then
|
|||||||
"7.4") php_bin="/usr/bin/php7.4 "; ;;
|
"7.4") php_bin="/usr/bin/php7.4 "; ;;
|
||||||
"8.0") php_bin="/usr/bin/php8.0 "; ;;
|
"8.0") php_bin="/usr/bin/php8.0 "; ;;
|
||||||
"8.1") php_bin="/usr/bin/php8.1 "; ;;
|
"8.1") php_bin="/usr/bin/php8.1 "; ;;
|
||||||
|
"8.2") php_bin="/usr/bin/php8.2 "; ;;
|
||||||
*) echo "Not support PHP: ${1}"; exit; ;;
|
*) echo "Not support PHP: ${1}"; exit; ;;
|
||||||
esac;
|
esac;
|
||||||
fi;
|
fi;
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ CREATE OR REPLACE FUNCTION set_edit_generic()
|
|||||||
RETURNS TRIGGER AS
|
RETURNS TRIGGER AS
|
||||||
$$
|
$$
|
||||||
DECLARE
|
DECLARE
|
||||||
random_length INT = 12; -- that should be long enough
|
random_length INT = 25; -- that should be long enough
|
||||||
BEGIN
|
BEGIN
|
||||||
IF TG_OP = 'INSERT' THEN
|
IF TG_OP = 'INSERT' THEN
|
||||||
NEW.date_created := 'now';
|
NEW.date_created := 'now';
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ rm -f $tmpf_web;
|
|||||||
echo ".*.swp" >> $tmpf_web;
|
echo ".*.swp" >> $tmpf_web;
|
||||||
echo "._*" >> $tmpf_web;
|
echo "._*" >> $tmpf_web;
|
||||||
echo ".DS_Store" >> $tmpf_web;
|
echo ".DS_Store" >> $tmpf_web;
|
||||||
|
echo ".user.ini" >> $tmpf_web;
|
||||||
echo ".svn" >> $tmpf_web;
|
echo ".svn" >> $tmpf_web;
|
||||||
echo ".svnignore" >> $tmpf_web;
|
echo ".svnignore" >> $tmpf_web;
|
||||||
echo ".git" >> $tmpf_web;
|
echo ".git" >> $tmpf_web;
|
||||||
|
|||||||
@@ -1477,7 +1477,7 @@ final class CoreLibsACLLoginTest extends TestCase
|
|||||||
);
|
);
|
||||||
// - loginGetLoginHTML
|
// - loginGetLoginHTML
|
||||||
$this->assertStringContainsString(
|
$this->assertStringContainsString(
|
||||||
'<html>',
|
'<html lang="',
|
||||||
$login_mock->loginGetLoginHTML(),
|
$login_mock->loginGetLoginHTML(),
|
||||||
'Assert login html string exits'
|
'Assert login html string exits'
|
||||||
);
|
);
|
||||||
@@ -1529,7 +1529,7 @@ final class CoreLibsACLLoginTest extends TestCase
|
|||||||
// html login basic check only, content is the same as when
|
// html login basic check only, content is the same as when
|
||||||
// read from loginGetLoginHTML()
|
// read from loginGetLoginHTML()
|
||||||
$this->assertStringContainsString(
|
$this->assertStringContainsString(
|
||||||
'<html>',
|
'<html lang="',
|
||||||
$_POST['login_html'],
|
$_POST['login_html'],
|
||||||
'Assert ajax _POST html string exits'
|
'Assert ajax _POST html string exits'
|
||||||
);
|
);
|
||||||
|
|||||||
47
4dev/tests/CoreLibsAdminEditPageTest.php
Normal file
47
4dev/tests/CoreLibsAdminEditPageTest.php
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Admin\EditPage
|
||||||
|
* @coversDefaultClass \CoreLibs\Admin\EditPage
|
||||||
|
* @testdox \CoreLibs\Admin\EditPage method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsAdminEditPageTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function setUp(): void
|
||||||
|
{
|
||||||
|
if (!extension_loaded('pgsql')) {
|
||||||
|
$this->markTestSkipped(
|
||||||
|
'The PgSQL extension is not available.'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @testdox Admin\EditPage Class tests
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testAdminEditPage()
|
||||||
|
{
|
||||||
|
/* $this->assertTrue(true, 'ACL Login Tests not implemented');
|
||||||
|
$this->markTestIncomplete(
|
||||||
|
'ACL\Login Tests have not yet been implemented'
|
||||||
|
); */
|
||||||
|
$this->markTestSkipped('No implementation for Admin\EditPage at the moment');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
329
4dev/tests/CoreLibsCheckColorsTest.php
Normal file
329
4dev/tests/CoreLibsCheckColorsTest.php
Normal file
@@ -0,0 +1,329 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Check\Colors
|
||||||
|
* @coversDefaultClass \CoreLibs\Check\Colors
|
||||||
|
* @testdox \CoreLibs\Check\Colors method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsCheckColorsTest extends TestCase
|
||||||
|
{
|
||||||
|
public function validateColorProvider(): array
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
0: input color string
|
||||||
|
1: flag (or flags to set)
|
||||||
|
2: expected result (bool)
|
||||||
|
*/
|
||||||
|
return [
|
||||||
|
// * hex
|
||||||
|
'valid hex rgb, flag ALL (default)' => [
|
||||||
|
'#ab12cd',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid hex rgb, flag ALL' => [
|
||||||
|
'#ab12cd',
|
||||||
|
\CoreLibs\Check\Colors::ALL,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid hex rgb, flag HEX_RGB' => [
|
||||||
|
'#ab12cd',
|
||||||
|
\CoreLibs\Check\Colors::HEX_RGB,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid hex rgb, wrong flag' => [
|
||||||
|
'#ab12cd',
|
||||||
|
\CoreLibs\Check\Colors::RGB,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
// error
|
||||||
|
'invalid hex rgb A' => [
|
||||||
|
'#ab12zz',
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'invalid hex rgb B' => [
|
||||||
|
'#ZyQfo',
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
// other valid hex checks
|
||||||
|
'valid hex rgb, alt A' => [
|
||||||
|
'#AB12cd',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
// * hax alpha
|
||||||
|
'valid hex rgb alpha, flag ALL (default)' => [
|
||||||
|
'#ab12cd12',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid hex rgb alpha, flag ALL' => [
|
||||||
|
'#ab12cd12',
|
||||||
|
\CoreLibs\Check\Colors::ALL,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid hex rgb alpha, flag HEX_RGBA' => [
|
||||||
|
'#ab12cd12',
|
||||||
|
\CoreLibs\Check\Colors::HEX_RGBA,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid hex rgb alpha, wrong flag' => [
|
||||||
|
'#ab12cd12',
|
||||||
|
\CoreLibs\Check\Colors::RGB,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
// error
|
||||||
|
'invalid hex rgb alpha A' => [
|
||||||
|
'#ab12dd1',
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'invalid hex rgb alpha B' => [
|
||||||
|
'#ab12ddzz',
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'valid hex rgb alpha, alt A' => [
|
||||||
|
'#ab12cdEE',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
// * rgb
|
||||||
|
'valid rgb, flag ALL (default)' => [
|
||||||
|
'rgb(255, 10, 20)',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid rgb, flag ALL' => [
|
||||||
|
'rgb(255, 10, 20)',
|
||||||
|
\CoreLibs\Check\Colors::ALL,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid rgb, flag RGB' => [
|
||||||
|
'rgb(255, 10, 20)',
|
||||||
|
\CoreLibs\Check\Colors::RGB,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid rgb, wrong flag' => [
|
||||||
|
'rgb(255, 10, 20)',
|
||||||
|
\CoreLibs\Check\Colors::HEX_RGB,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
// error
|
||||||
|
'invalid rgb A' => [
|
||||||
|
'rgb(356, 10, 20)',
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
// other valid rgb conbinations
|
||||||
|
'valid rgb, alt A (percent)' => [
|
||||||
|
'rgb(100%, 10%, 20%)',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
// TODO check all % and non percent combinations
|
||||||
|
'valid rgb, alt B (percent, mix)' => [
|
||||||
|
'rgb(100%, 10, 40)',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
// * rgb alpha
|
||||||
|
'valid rgba, flag ALL (default)' => [
|
||||||
|
'rgba(255, 10, 20, 0.5)',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid rgba, flag ALL' => [
|
||||||
|
'rgba(255, 10, 20, 0.5)',
|
||||||
|
\CoreLibs\Check\Colors::ALL,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid rgba, flag RGB' => [
|
||||||
|
'rgba(255, 10, 20, 0.5)',
|
||||||
|
\CoreLibs\Check\Colors::RGBA,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid rgba, wrong flag' => [
|
||||||
|
'rgba(255, 10, 20, 0.5)',
|
||||||
|
\CoreLibs\Check\Colors::HEX_RGB,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
// error
|
||||||
|
'invalid rgba A' => [
|
||||||
|
'rgba(356, 10, 20, 0.5)',
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
// other valid rgba combinations
|
||||||
|
'valid rgba, alt A (percent)' => [
|
||||||
|
'rgba(100%, 10%, 20%, 0.5)',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
// TODO check all % and non percent combinations
|
||||||
|
'valid rgba, alt B (percent, mix)' => [
|
||||||
|
'rgba(100%, 10, 40, 0.5)',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
// TODO check all % and non percent combinations with percent transparent
|
||||||
|
'valid rgba, alt C (percent transparent)' => [
|
||||||
|
'rgba(100%, 10%, 20%, 50%)',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
/*
|
||||||
|
// hsl
|
||||||
|
'hsl(100, 50%, 60%)',
|
||||||
|
'hsl(100, 50.5%, 60.5%)',
|
||||||
|
'hsla(100, 50%, 60%)',
|
||||||
|
'hsla(100, 50.5%, 60.5%)',
|
||||||
|
'hsla(100, 50%, 60%, 0.5)',
|
||||||
|
'hsla(100, 50.5%, 60.5%, 0.5)',
|
||||||
|
'hsla(100, 50%, 60%, 50%)',
|
||||||
|
'hsla(100, 50.5%, 60.5%, 50%)',
|
||||||
|
*/
|
||||||
|
// * hsl
|
||||||
|
'valid hsl, flag ALL (default)' => [
|
||||||
|
'hsl(100, 50%, 60%)',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid hsl, flag ALL' => [
|
||||||
|
'hsl(100, 50%, 60%)',
|
||||||
|
\CoreLibs\Check\Colors::ALL,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid hsl, flag RGB' => [
|
||||||
|
'hsl(100, 50%, 60%)',
|
||||||
|
\CoreLibs\Check\Colors::HSL,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid hsl, wrong flag' => [
|
||||||
|
'hsl(100, 50%, 60%)',
|
||||||
|
\CoreLibs\Check\Colors::HEX_RGB,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'invalid hsl A' => [
|
||||||
|
'hsl(500, 50%, 60%)',
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'valid hsl, alt A' => [
|
||||||
|
'hsl(100, 50.5%, 60.5%)',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
// * hsl alpha
|
||||||
|
'valid hsla, flag ALL (default)' => [
|
||||||
|
'hsla(100, 50%, 60%, 0.5)',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid hsla, flag ALL' => [
|
||||||
|
'hsla(100, 50%, 60%, 0.5)',
|
||||||
|
\CoreLibs\Check\Colors::ALL,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid hsla, flag RGB' => [
|
||||||
|
'hsla(100, 50%, 60%, 0.5)',
|
||||||
|
\CoreLibs\Check\Colors::HSLA,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid hsla, wrong flag' => [
|
||||||
|
'hsla(100, 50%, 60%, 0.5)',
|
||||||
|
\CoreLibs\Check\Colors::HEX_RGB,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'invalid hsla A' => [
|
||||||
|
'hsla(500, 50%, 60%, 0.5)',
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'valid hsla, alt A (percent alpha' => [
|
||||||
|
'hsla(100, 50%, 60%, 50%)',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid hsla, alt A (percent alpha' => [
|
||||||
|
'hsla(100, 50.5%, 60.5%, 50%)',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
// * combined flag checks
|
||||||
|
'valid rgb, flag RGB|RGBA' => [
|
||||||
|
'rgb(100%, 10%, 20%)',
|
||||||
|
\CoreLibs\Check\Colors::RGB | \CoreLibs\Check\Colors::RGBA,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
// TODO other combined flag checks all combinations
|
||||||
|
// * invalid string
|
||||||
|
'invalid string A' => [
|
||||||
|
'invalid string',
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'invalid string B' => [
|
||||||
|
'(hsla(100, 100, 100))',
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'invalid string C' => [
|
||||||
|
'hsla(100, 100, 100',
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::validateColor
|
||||||
|
* @dataProvider validateColorProvider
|
||||||
|
* @testdox validateColor $input with flags $flags be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param int|null $flags
|
||||||
|
* @param bool $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testValidateColor(string $input, ?int $flags, bool $expected)
|
||||||
|
{
|
||||||
|
if ($flags === null) {
|
||||||
|
$result = \CoreLibs\Check\Colors::validateColor($input);
|
||||||
|
} else {
|
||||||
|
$result = \CoreLibs\Check\Colors::validateColor($input, $flags);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$result
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::validateColor
|
||||||
|
* @testWith [99]
|
||||||
|
* @testdox Check Exception throw for $flag
|
||||||
|
*
|
||||||
|
* @param int $flag
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testValidateColorException(int $flag): void
|
||||||
|
{
|
||||||
|
$this->expectException(\Exception::class);
|
||||||
|
\CoreLibs\Check\Colors::validateColor('#ffffff', $flag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -92,6 +92,7 @@ final class CoreLibsCheckEncodingTest extends TestCase
|
|||||||
$error_char,
|
$error_char,
|
||||||
$expected
|
$expected
|
||||||
): void {
|
): void {
|
||||||
|
$current_subsitute_character = mb_substitute_character();
|
||||||
if ($error_char !== null) {
|
if ($error_char !== null) {
|
||||||
\CoreLibs\Check\Encoding::setErrorChar($error_char);
|
\CoreLibs\Check\Encoding::setErrorChar($error_char);
|
||||||
if (!in_array($error_char, ['none', 'long', 'entity'])) {
|
if (!in_array($error_char, ['none', 'long', 'entity'])) {
|
||||||
@@ -111,6 +112,8 @@ final class CoreLibsCheckEncodingTest extends TestCase
|
|||||||
$expected,
|
$expected,
|
||||||
$return
|
$return
|
||||||
);
|
);
|
||||||
|
// reset after test
|
||||||
|
mb_substitute_character($current_subsitute_character);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ use PHPUnit\Framework\TestCase;
|
|||||||
*/
|
*/
|
||||||
final class CoreLibsConvertByteTest extends TestCase
|
final class CoreLibsConvertByteTest extends TestCase
|
||||||
{
|
{
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -24,7 +23,31 @@ final class CoreLibsConvertByteTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function byteProvider(): array
|
public function byteProvider(): array
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* 0: input string
|
||||||
|
* 1: default flags
|
||||||
|
* 2: BYTE_FORMAT_SI
|
||||||
|
* 3: BYTE_FORMAT_NOSPACE
|
||||||
|
* 4: BYTE_FORMAT_ADJUST
|
||||||
|
* 5: BYTE_FORMAT_SI | BYTE_FORMAT_NOSPACE
|
||||||
|
*/
|
||||||
return [
|
return [
|
||||||
|
'string number' => [
|
||||||
|
0 => '1024',
|
||||||
|
1 => '1 KB',
|
||||||
|
2 => '1.02 KiB',
|
||||||
|
3 => '1KB',
|
||||||
|
4 => '1.00 KB',
|
||||||
|
5 => '1.02KiB',
|
||||||
|
],
|
||||||
|
'invalud string number' => [
|
||||||
|
0 => '1024 MB',
|
||||||
|
1 => '1024 MB',
|
||||||
|
2 => '1024 MB',
|
||||||
|
3 => '1024 MB',
|
||||||
|
4 => '1024 MB',
|
||||||
|
5 => '1024 MB',
|
||||||
|
],
|
||||||
'negative number' => [
|
'negative number' => [
|
||||||
0 => -123123123,
|
0 => -123123123,
|
||||||
1 => '-117.42 MB',
|
1 => '-117.42 MB',
|
||||||
@@ -217,6 +240,41 @@ final class CoreLibsConvertByteTest extends TestCase
|
|||||||
\CoreLibs\Convert\Byte::stringByteFormat($input, \CoreLibs\Convert\Byte::BYTE_FORMAT_SI)
|
\CoreLibs\Convert\Byte::stringByteFormat($input, \CoreLibs\Convert\Byte::BYTE_FORMAT_SI)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Exceptions tests
|
||||||
|
*
|
||||||
|
* @covers ::humanReadableByteFormat
|
||||||
|
* @testWith [99]
|
||||||
|
* @testdox Test exception for humanReadableByteFormat with flag $flag
|
||||||
|
*
|
||||||
|
* @param int $flag
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testHumanReadableByteFormatException(int $flag): void
|
||||||
|
{
|
||||||
|
$this->expectException(\Exception::class);
|
||||||
|
\CoreLibs\Convert\Byte::humanReadableByteFormat(12, $flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Exceptions tests
|
||||||
|
* can only be 4, try 1,2 and over
|
||||||
|
*
|
||||||
|
* @covers ::stringByteFormat
|
||||||
|
* @testWith [1]
|
||||||
|
* [2]
|
||||||
|
* [99]
|
||||||
|
* @testdox Test exception for stringByteFormat with flag $flag
|
||||||
|
*
|
||||||
|
* @param int $flag
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testStringByteFormatException(int $flag): void
|
||||||
|
{
|
||||||
|
$this->expectException(\Exception::class);
|
||||||
|
\CoreLibs\Convert\Byte::stringByteFormat(12, $flag);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
@@ -122,6 +122,8 @@ final class CoreLibsConvertColorsTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function rgb2hslAndhsbList(): array
|
public function rgb2hslAndhsbList(): array
|
||||||
{
|
{
|
||||||
|
// if hsb_from or hsl_from is set, this will be used in hsb/hsl convert
|
||||||
|
// hsb_rgb is used for adjusted rgb valus due to round error to in
|
||||||
return [
|
return [
|
||||||
'valid gray' => [
|
'valid gray' => [
|
||||||
'rgb' => [12, 12, 12],
|
'rgb' => [12, 12, 12],
|
||||||
@@ -137,6 +139,16 @@ final class CoreLibsConvertColorsTest extends TestCase
|
|||||||
'hsl' => [211.6, 90.5, 41.2],
|
'hsl' => [211.6, 90.5, 41.2],
|
||||||
'valid' => true,
|
'valid' => true,
|
||||||
],
|
],
|
||||||
|
// hsg/hsl with 360 which is seen as 0
|
||||||
|
'valid color hue 360' => [
|
||||||
|
'rgb' => [200, 10, 10],
|
||||||
|
'hsb' => [0, 95, 78.0],
|
||||||
|
'hsb_from' => [360, 95, 78.0],
|
||||||
|
'hsb_rgb' => [199, 10, 10], // should be rgb, but rounding error
|
||||||
|
'hsl' => [0.0, 90.5, 41.2],
|
||||||
|
'hsl_from' => [360.0, 90.5, 41.2],
|
||||||
|
'valid' => true,
|
||||||
|
],
|
||||||
// invalid values
|
// invalid values
|
||||||
'invalid color' => [
|
'invalid color' => [
|
||||||
'rgb' => [-12, 300, 12],
|
'rgb' => [-12, 300, 12],
|
||||||
@@ -176,9 +188,9 @@ final class CoreLibsConvertColorsTest extends TestCase
|
|||||||
$list = [];
|
$list = [];
|
||||||
foreach ($this->rgb2hslAndhsbList() as $name => $values) {
|
foreach ($this->rgb2hslAndhsbList() as $name => $values) {
|
||||||
$list[$name . ', hsb to rgb'] = [
|
$list[$name . ', hsb to rgb'] = [
|
||||||
0 => $values['hsb'][0],
|
0 => $values['hsb_from'][0] ?? $values['hsb'][0],
|
||||||
1 => $values['hsb'][1],
|
1 => $values['hsb_from'][1] ?? $values['hsb'][1],
|
||||||
2 => $values['hsb'][2],
|
2 => $values['hsb_from'][2] ?? $values['hsb'][2],
|
||||||
3 => $values['valid'] ? $values['hsb_rgb'] : false
|
3 => $values['valid'] ? $values['hsb_rgb'] : false
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@@ -214,9 +226,9 @@ final class CoreLibsConvertColorsTest extends TestCase
|
|||||||
$list = [];
|
$list = [];
|
||||||
foreach ($this->rgb2hslAndhsbList() as $name => $values) {
|
foreach ($this->rgb2hslAndhsbList() as $name => $values) {
|
||||||
$list[$name . ', hsl to rgb'] = [
|
$list[$name . ', hsl to rgb'] = [
|
||||||
0 => $values['hsl'][0],
|
0 => $values['hsl_from'][0] ?? $values['hsl'][0],
|
||||||
1 => $values['hsl'][1],
|
1 => $values['hsl_from'][1] ?? $values['hsl'][1],
|
||||||
2 => $values['hsl'][2],
|
2 => $values['hsl_from'][2] ?? $values['hsl'][2],
|
||||||
3 => $values['valid'] ? $values['rgb'] : false
|
3 => $values['valid'] ? $values['rgb'] : false
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@@ -382,6 +394,27 @@ final class CoreLibsConvertColorsTest extends TestCase
|
|||||||
\CoreLibs\Convert\Colors::hsl2rgb($input_h, $input_s, $input_l)
|
\CoreLibs\Convert\Colors::hsl2rgb($input_h, $input_s, $input_l)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* edge case check hsl/hsb and hue 360 (= 0)
|
||||||
|
*
|
||||||
|
* @covers ::hsl2rgb
|
||||||
|
* @covers ::hsb2rgb
|
||||||
|
* @testdox hsl2rgb/hsb2rgb hue 360 valid check
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testHslHsb360hue(): void
|
||||||
|
{
|
||||||
|
$this->assertNotFalse(
|
||||||
|
\CoreLibs\Convert\Colors::hsl2rgb(360.0, 90.5, 41.2),
|
||||||
|
'HSL to RGB with 360 hue'
|
||||||
|
);
|
||||||
|
$this->assertNotFalse(
|
||||||
|
\CoreLibs\Convert\Colors::hsb2rgb(360, 95, 78.0),
|
||||||
|
'HSB to RGB with 360 hue'
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
@@ -113,7 +113,10 @@ final class CoreLibsCreateEmailTest extends TestCase
|
|||||||
'日本語カタカナパ',
|
'日本語カタカナパ',
|
||||||
'ISO-2022-JP',
|
'ISO-2022-JP',
|
||||||
true,
|
true,
|
||||||
'"=?ISO-2022-JP?B?GyRCRnxLXDhsGyhCPz8/Pz8=?=" <test@test.com>'
|
// was ok php 8.1
|
||||||
|
// '"=?ISO-2022-JP?B?GyRCRnxLXDhsGyhCPz8/Pz8=?=" <test@test.com>'
|
||||||
|
// below ok php 8.1.12, 2022/12/9
|
||||||
|
'"=?ISO-2022-JP?B?GyRCRnxLXDhsGyhCPz8/Pz8/?=" <test@test.com>'
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@@ -122,8 +125,13 @@ final class CoreLibsCreateEmailTest extends TestCase
|
|||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
* @dataProvider encodeEmailNameProvider
|
* @dataProvider encodeEmailNameProvider
|
||||||
* @testdox encode email $email, name $name, encoding $encoding will be $expected [$_dataName]
|
* @testdox encode email $email, name $name, encoding $encoding, folding $kv_folding will be $expected [$_dataName]
|
||||||
*
|
*
|
||||||
|
* @param string $email
|
||||||
|
* @param string|null $name
|
||||||
|
* @param string|null $encoding
|
||||||
|
* @param bool|null $kv_folding
|
||||||
|
* @param string $expected
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function testEncodeEmailName(
|
public function testEncodeEmailName(
|
||||||
|
|||||||
@@ -181,7 +181,7 @@ final class CoreLibsCreateSessionTest extends TestCase
|
|||||||
string $type,
|
string $type,
|
||||||
array $mock_data,
|
array $mock_data,
|
||||||
string $expected,
|
string $expected,
|
||||||
string $expected_error,
|
string $expected_error
|
||||||
): void {
|
): void {
|
||||||
// override expected
|
// override expected
|
||||||
if ($type == 'd') {
|
if ($type == 'd') {
|
||||||
|
|||||||
@@ -1189,7 +1189,13 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
|
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected,
|
$expected,
|
||||||
$db->dbEscapeBytea($input)
|
$db->dbEscapeBytea($input),
|
||||||
|
'Assert error to bytea'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$input,
|
||||||
|
$db->dbUnescapeBytea($expected),
|
||||||
|
'Assert error from bytes'
|
||||||
);
|
);
|
||||||
|
|
||||||
$db->dbClose();
|
$db->dbClose();
|
||||||
@@ -1570,6 +1576,13 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
// clear any current query
|
// clear any current query
|
||||||
// $db->dbResetQuery();
|
// $db->dbResetQuery();
|
||||||
|
|
||||||
|
// assert never called query is 0
|
||||||
|
$this->assertEquals(
|
||||||
|
0,
|
||||||
|
$db->dbGetQueryCalled($query),
|
||||||
|
'Assert never called query is null'
|
||||||
|
);
|
||||||
|
|
||||||
// if expected result is not a bool
|
// if expected result is not a bool
|
||||||
// for PHP 8.1 or higher it has to be an object
|
// for PHP 8.1 or higher it has to be an object
|
||||||
// for anything before PHP 8.1 this has to be a resource
|
// for anything before PHP 8.1 this has to be a resource
|
||||||
@@ -2536,7 +2549,7 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
private function subAssertCursorExtTestDbReturnFunction(
|
private function subAssertCursorExtTestDbReturnFunction(
|
||||||
\CoreLibs\DB\IO $db,
|
\CoreLibs\DB\IO $db,
|
||||||
string $query,
|
string $query,
|
||||||
array $cursor_ext_checks,
|
array $cursor_ext_checks
|
||||||
): void {
|
): void {
|
||||||
// cursor check
|
// cursor check
|
||||||
if (
|
if (
|
||||||
@@ -2757,7 +2770,7 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
}
|
}
|
||||||
|
|
||||||
// - prepared query execute
|
// - prepared query execute
|
||||||
// dbPrepare, dbExecute, dbFetchArray
|
// dbPrepare, dbExecute, dbFetchArray, dbGetPrepareCursorValue
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
@@ -2782,6 +2795,7 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
// 11: read query (if insert/update)
|
// 11: read query (if insert/update)
|
||||||
// 11: execute data to check (array)
|
// 11: execute data to check (array)
|
||||||
// 12: insert data
|
// 12: insert data
|
||||||
|
// 13: prepated cursor array data match values
|
||||||
return [
|
return [
|
||||||
// insert
|
// insert
|
||||||
'prepare query insert' => [
|
'prepare query insert' => [
|
||||||
@@ -2805,6 +2819,14 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
],
|
],
|
||||||
// insert data (for select)
|
// insert data (for select)
|
||||||
'',
|
'',
|
||||||
|
// get prepared data
|
||||||
|
[
|
||||||
|
'pk_name' => 'table_with_primary_key_id',
|
||||||
|
'count' => 2,
|
||||||
|
'query' => 'INSERT INTO table_with_primary_key (row_int, uid) '
|
||||||
|
. 'VALUES ($1, $2) RETURNING table_with_primary_key_id',
|
||||||
|
'returning_id' => true,
|
||||||
|
],
|
||||||
],
|
],
|
||||||
// update
|
// update
|
||||||
'prepare query update' => [
|
'prepare query update' => [
|
||||||
@@ -2831,6 +2853,14 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
//
|
//
|
||||||
"INSERT INTO table_with_primary_key (row_int, uid) VALUES "
|
"INSERT INTO table_with_primary_key (row_int, uid) VALUES "
|
||||||
. "(111, 'TEST A')",
|
. "(111, 'TEST A')",
|
||||||
|
//
|
||||||
|
[
|
||||||
|
'pk_name' => '',
|
||||||
|
'count' => 3,
|
||||||
|
'query' => 'UPDATE table_with_primary_key SET row_int = $1, '
|
||||||
|
. 'row_varchar = $2 WHERE uid = $3',
|
||||||
|
'returning_id' => false,
|
||||||
|
],
|
||||||
],
|
],
|
||||||
// select
|
// select
|
||||||
'prepare select query' => [
|
'prepare select query' => [
|
||||||
@@ -2852,7 +2882,14 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
],
|
],
|
||||||
],
|
],
|
||||||
//
|
//
|
||||||
$insert_query
|
$insert_query,
|
||||||
|
//
|
||||||
|
[
|
||||||
|
'pk_name' => '',
|
||||||
|
'count' => 1,
|
||||||
|
'query' => 'SELECT row_int, uid FROM table_with_primary_key WHERE uid = $1',
|
||||||
|
'returning_id' => false,
|
||||||
|
],
|
||||||
],
|
],
|
||||||
// any query but with no parameters
|
// any query but with no parameters
|
||||||
'prepare select query no parameter' => [
|
'prepare select query no parameter' => [
|
||||||
@@ -2877,7 +2914,14 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
],
|
],
|
||||||
],
|
],
|
||||||
//
|
//
|
||||||
$insert_query
|
$insert_query,
|
||||||
|
//
|
||||||
|
[
|
||||||
|
'pk_name' => '',
|
||||||
|
'count' => 0,
|
||||||
|
'query' => 'SELECT row_int, uid FROM table_with_primary_key',
|
||||||
|
'returning_id' => false,
|
||||||
|
],
|
||||||
],
|
],
|
||||||
// no statement name (25)
|
// no statement name (25)
|
||||||
'empty statement' => [
|
'empty statement' => [
|
||||||
@@ -2894,6 +2938,13 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
[],
|
[],
|
||||||
//
|
//
|
||||||
'',
|
'',
|
||||||
|
//
|
||||||
|
[
|
||||||
|
'pk_name' => '',
|
||||||
|
'count' => 0,
|
||||||
|
'query' => '',
|
||||||
|
'returning_id' => false,
|
||||||
|
],
|
||||||
],
|
],
|
||||||
// no query (prepare 11)
|
// no query (prepare 11)
|
||||||
// no prepared cursor found with statement name (execute 24)
|
// no prepared cursor found with statement name (execute 24)
|
||||||
@@ -2911,6 +2962,13 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
[],
|
[],
|
||||||
//
|
//
|
||||||
'',
|
'',
|
||||||
|
//
|
||||||
|
[
|
||||||
|
'pk_name' => '',
|
||||||
|
'count' => 0,
|
||||||
|
'query' => '',
|
||||||
|
'returning_id' => false,
|
||||||
|
],
|
||||||
],
|
],
|
||||||
// no db connection (prepare/execute 16)
|
// no db connection (prepare/execute 16)
|
||||||
// TODO no db connection test
|
// TODO no db connection test
|
||||||
@@ -2931,8 +2989,15 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
// no query but data for data only compare
|
// no query but data for data only compare
|
||||||
'',
|
'',
|
||||||
[],
|
[],
|
||||||
//,
|
//
|
||||||
$insert_query
|
$insert_query,
|
||||||
|
//
|
||||||
|
[
|
||||||
|
'pk_name' => '',
|
||||||
|
'count' => 0,
|
||||||
|
'query' => 'SELECT row_int, uid FROM table_with_primary_key',
|
||||||
|
'returning_id' => false,
|
||||||
|
],
|
||||||
],
|
],
|
||||||
// insert wrong data count compared to needed (execute 23)
|
// insert wrong data count compared to needed (execute 23)
|
||||||
'wrong parmeter count' => [
|
'wrong parmeter count' => [
|
||||||
@@ -2949,7 +3014,15 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
'',
|
'',
|
||||||
[],
|
[],
|
||||||
//
|
//
|
||||||
''
|
'',
|
||||||
|
//
|
||||||
|
[
|
||||||
|
'pk_name' => 'table_with_primary_key_id',
|
||||||
|
'count' => 2,
|
||||||
|
'query' => 'INSERT INTO table_with_primary_key (row_int, uid) VALUES '
|
||||||
|
. '($1, $2) RETURNING table_with_primary_key_id',
|
||||||
|
'returning_id' => true,
|
||||||
|
],
|
||||||
],
|
],
|
||||||
// execute does not return a result (22)
|
// execute does not return a result (22)
|
||||||
// TODO execute does not return a result
|
// TODO execute does not return a result
|
||||||
@@ -2962,6 +3035,7 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
* @covers ::dbPrepare
|
* @covers ::dbPrepare
|
||||||
* @covers ::dbExecute
|
* @covers ::dbExecute
|
||||||
* @covers ::dbFetchArray
|
* @covers ::dbFetchArray
|
||||||
|
* @covers ::dbGetPrepareCursorValue
|
||||||
* @dataProvider preparedProvider
|
* @dataProvider preparedProvider
|
||||||
* @testdox prepared query $stm_name with $expected_prepare (warning $warning_prepare/error $error_prepare) and $expected_execute (warning $warning_execute/error $error_execute) [$_dataName]
|
* @testdox prepared query $stm_name with $expected_prepare (warning $warning_prepare/error $error_prepare) and $expected_execute (warning $warning_execute/error $error_execute) [$_dataName]
|
||||||
*
|
*
|
||||||
@@ -2978,6 +3052,7 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
* @param string $expected_data_query
|
* @param string $expected_data_query
|
||||||
* @param array $expected_data
|
* @param array $expected_data
|
||||||
* @param string $insert_data
|
* @param string $insert_data
|
||||||
|
* @param array $prepare_cursor
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function testDbPrepared(
|
public function testDbPrepared(
|
||||||
@@ -2993,7 +3068,8 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
string $error_execute,
|
string $error_execute,
|
||||||
string $expected_data_query,
|
string $expected_data_query,
|
||||||
array $expected_data,
|
array $expected_data,
|
||||||
string $insert_data
|
string $insert_data,
|
||||||
|
array $prepare_cursor,
|
||||||
): void {
|
): void {
|
||||||
// self::$log->setLogLevelAll('debug', true);
|
// self::$log->setLogLevelAll('debug', true);
|
||||||
// self::$log->setLogLevelAll('print', true);
|
// self::$log->setLogLevelAll('print', true);
|
||||||
@@ -3103,6 +3179,15 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check dbGetPrepareCursorValue
|
||||||
|
foreach (['pk_name', 'count', 'query', 'returning_id'] as $key) {
|
||||||
|
$this->assertEquals(
|
||||||
|
$prepare_cursor[$key],
|
||||||
|
$db->dbGetPrepareCursorValue($stm_name, $key),
|
||||||
|
'Prepared cursor: ' . $key . ': failed assertion'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// reset all data
|
// reset all data
|
||||||
$db->dbExec("TRUNCATE table_with_primary_key");
|
$db->dbExec("TRUNCATE table_with_primary_key");
|
||||||
$db->dbExec("TRUNCATE table_without_primary_key");
|
$db->dbExec("TRUNCATE table_without_primary_key");
|
||||||
@@ -3110,6 +3195,90 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
$db->dbClose();
|
$db->dbClose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// dedicated error checks for prepare cursor return
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function preparedProviderValue(): array
|
||||||
|
{
|
||||||
|
// 1: query (can be empty for do not set)
|
||||||
|
// 2: stm name
|
||||||
|
// 3: key
|
||||||
|
// 4: expected error return
|
||||||
|
return [
|
||||||
|
'no error' => [
|
||||||
|
"SELECT row_int, uid FROM table_with_primary_key",
|
||||||
|
'read',
|
||||||
|
'pk_name',
|
||||||
|
''
|
||||||
|
],
|
||||||
|
'statement name empty' => [
|
||||||
|
'',
|
||||||
|
'',
|
||||||
|
'',
|
||||||
|
'101',
|
||||||
|
],
|
||||||
|
'key empty' => [
|
||||||
|
'',
|
||||||
|
'read',
|
||||||
|
'',
|
||||||
|
'102',
|
||||||
|
],
|
||||||
|
'key invalid' => [
|
||||||
|
'',
|
||||||
|
'read',
|
||||||
|
'invalid',
|
||||||
|
'102',
|
||||||
|
],
|
||||||
|
'statement name not found' => [
|
||||||
|
'',
|
||||||
|
'invalid',
|
||||||
|
'pk_name',
|
||||||
|
'103',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test return prepare cursor errors
|
||||||
|
*
|
||||||
|
* @covers ::dbGetPrepareCursorValue
|
||||||
|
* @dataProvider preparedProviderValue
|
||||||
|
* @testdox prepared query $stm_name with $key expect error id $error_id [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @param string $stm_name
|
||||||
|
* @param string $key
|
||||||
|
* @param string $error_id
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testDbGetPrepareCursorValue(
|
||||||
|
string $query,
|
||||||
|
string $stm_name,
|
||||||
|
string $key,
|
||||||
|
$error_id
|
||||||
|
): void {
|
||||||
|
$db = new \CoreLibs\DB\IO(
|
||||||
|
self::$db_config['valid'],
|
||||||
|
self::$log
|
||||||
|
);
|
||||||
|
if (!empty($query)) {
|
||||||
|
$db->dbPrepare($stm_name, $query);
|
||||||
|
$db->dbExecute($stm_name);
|
||||||
|
}
|
||||||
|
$db->dbGetPrepareCursorValue($stm_name, $key);
|
||||||
|
// match check error
|
||||||
|
$last_error = $db->dbGetLastError();
|
||||||
|
$this->assertEquals(
|
||||||
|
$error_id,
|
||||||
|
$last_error,
|
||||||
|
'get prepare cursor value error check'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// - schema set/get tests
|
// - schema set/get tests
|
||||||
// dbGetSchema, dbSetSchema
|
// dbGetSchema, dbSetSchema
|
||||||
|
|
||||||
|
|||||||
22
4dev/update/20220906_edit_acl_update/20220906_readme.md
Normal file
22
4dev/update/20220906_edit_acl_update/20220906_readme.md
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
# Files to be changed
|
||||||
|
|
||||||
|
Change: Update Generate\Form to use ACL for form creation (basic)
|
||||||
|
Date: 2022/9/6
|
||||||
|
|
||||||
|
## File List
|
||||||
|
|
||||||
|
```sh
|
||||||
|
includes/table_arrays/array_edit_pages.php
|
||||||
|
includes/table_arrays/array_edit_users.php
|
||||||
|
includes/templates/admin/edit_body.tpl
|
||||||
|
includes/templates/admin/edit_elements.tpl
|
||||||
|
includes/templates/admin/edit_load.tpl
|
||||||
|
includes/templates/admin/edit_new.tpl
|
||||||
|
includes/templates/admin/edit_save_delete.tpl
|
||||||
|
includes/edit_base.php
|
||||||
|
lib/CoreLibs/ACL/Login.php
|
||||||
|
lib/CoreLibs/DB/Extended/ArrayIO.php
|
||||||
|
lib/CoreLibs/Convert/MimeEncode.php
|
||||||
|
lib/CoreLibs/Create/Email.php
|
||||||
|
lib/CoreLibs/Output/Form/Generate.php
|
||||||
|
```
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
# Files to be changed
|
||||||
|
|
||||||
|
Change: Update edit_page and template/css
|
||||||
|
Date: 2023/1/6
|
||||||
|
|
||||||
|
## Detail
|
||||||
|
|
||||||
|
* add stripes to sub table entries (edit.css)
|
||||||
|
* fix cellspacing and cellpadding in sub tables (edit_element.tpl)
|
||||||
|
* doctype added (edit_order.tpl)
|
||||||
|
* code clean up in edit base, move to class system (edit_base.php)
|
||||||
|
|
||||||
|
## File List
|
||||||
|
|
||||||
|
```sh
|
||||||
|
includes/templates/admin/edit_elements.tpl
|
||||||
|
includes/templates/admin/edit_order.tpl
|
||||||
|
includes/edit_base.php
|
||||||
|
layout/admin/css/edit.css
|
||||||
|
```
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
-- Fixes for column types
|
||||||
|
|
||||||
|
-- edit group
|
||||||
|
ALTER TABLE edit_group ALTER name TYPE VARCHAR;
|
||||||
|
-- edit language
|
||||||
|
ALTER TABLE edit_language ALTER short_name TYPE VARCHAR;
|
||||||
|
ALTER TABLE edit_language ALTER long_name TYPE VARCHAR;
|
||||||
|
ALTER TABLE edit_language ALTER iso_name TYPE VARCHAR;
|
||||||
|
-- edit menu group
|
||||||
|
ALTER TABLE edit_menu_group ALTER name TYPE VARCHAR;
|
||||||
|
ALTER TABLE edit_menu_group ALTER flag TYPE VARCHAR;
|
||||||
|
-- edit page
|
||||||
|
ALTER TABLE edit_page ALTER filename TYPE VARCHAR;
|
||||||
|
ALTER TABLE edit_page ALTER name TYPE VARCHAR;
|
||||||
|
-- edit query string
|
||||||
|
ALTER TABLE edit_query_string ALTER name TYPE VARCHAR;
|
||||||
|
ALTER TABLE edit_query_string ALTER value TYPE VARCHAR;
|
||||||
|
-- edit scheme
|
||||||
|
ALTER TABLE edit_scheme ALTER name TYPE VARCHAR;
|
||||||
|
ALTER TABLE edit_scheme ALTER header_color TYPE VARCHAR;
|
||||||
|
ALTER TABLE edit_scheme ALTER css_file TYPE VARCHAR;
|
||||||
|
ALTER TABLE edit_scheme ALTER template TYPE VARCHAR;
|
||||||
|
-- edit visible group
|
||||||
|
ALTER TABLE edit_visible_group ALTER name TYPE VARCHAR;
|
||||||
|
ALTER TABLE edit_visible_group ALTER flag TYPE VARCHAR;
|
||||||
@@ -1,72 +1,47 @@
|
|||||||
parameters:
|
parameters:
|
||||||
ignoreErrors:
|
ignoreErrors:
|
||||||
-
|
-
|
||||||
message: "#^Parameter \\#1 \\$connection of function pg_connection_busy expects PgSql\\\\Connection, object\\|resource given\\.$#"
|
message: "#^Parameter \\#1 \\$connection of function pg_escape_bytea expects PgSql\\\\Connection\\|string, object\\|resource given\\.$#"
|
||||||
count: 3
|
|
||||||
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Parameter \\#1 \\$connection of function pg_connection_status expects PgSql\\\\Connection, object\\|resource given\\.$#"
|
|
||||||
count: 1
|
count: 1
|
||||||
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Parameter \\#1 \\$connection of function pg_get_result expects PgSql\\\\Connection, object\\|resource given\\.$#"
|
message: "#^Parameter \\#1 \\$connection of function pg_escape_identifier expects PgSql\\\\Connection\\|string, object\\|resource given\\.$#"
|
||||||
count: 2
|
|
||||||
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Parameter \\#1 \\$connection of function pg_meta_data expects PgSql\\\\Connection, object\\|resource given\\.$#"
|
|
||||||
count: 1
|
count: 1
|
||||||
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Parameter \\#1 \\$connection of function pg_send_query expects PgSql\\\\Connection, object\\|resource given\\.$#"
|
message: "#^Parameter \\#1 \\$connection of function pg_escape_literal expects PgSql\\\\Connection\\|string, object\\|resource given\\.$#"
|
||||||
count: 2
|
|
||||||
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Parameter \\#1 \\$connection of function pg_socket expects PgSql\\\\Connection, object\\|resource given\\.$#"
|
|
||||||
count: 1
|
count: 1
|
||||||
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Parameter \\#1 \\$connection of function pg_version expects PgSql\\\\Connection\\|null, object\\|resource given\\.$#"
|
message: "#^Parameter \\#1 \\$connection of function pg_escape_string expects PgSql\\\\Connection\\|string, object\\|resource given\\.$#"
|
||||||
count: 2
|
|
||||||
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Parameter \\#1 \\$result of function pg_affected_rows expects PgSql\\\\Result, object\\|resource given\\.$#"
|
|
||||||
count: 1
|
count: 1
|
||||||
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Parameter \\#1 \\$result of function pg_fetch_all expects PgSql\\\\Result, object\\|resource given\\.$#"
|
message: "#^Parameter \\#1 \\$connection of function pg_execute expects PgSql\\\\Connection\\|string, object\\|resource given\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Parameter \\#1 \\$result of function pg_fetch_array expects PgSql\\\\Result, object\\|resource given\\.$#"
|
message: "#^Parameter \\#1 \\$connection of function pg_parameter_status expects PgSql\\\\Connection\\|string, object\\|resource given\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Parameter \\#1 \\$result of function pg_field_name expects PgSql\\\\Result, object\\|resource given\\.$#"
|
message: "#^Parameter \\#1 \\$connection of function pg_prepare expects PgSql\\\\Connection\\|string, object\\|resource given\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Parameter \\#1 \\$result of function pg_num_fields expects PgSql\\\\Result, object\\|resource given\\.$#"
|
message: "#^Parameter \\#1 \\$connection of function pg_query expects PgSql\\\\Connection\\|string, object\\|resource given\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Parameter \\#1 \\$result of function pg_num_rows expects PgSql\\\\Result, object\\|resource given\\.$#"
|
message: "#^Parameter \\#1 \\$connection of function pg_query_params expects PgSql\\\\Connection\\|string, object\\|resource given\\.$#"
|
||||||
count: 1
|
|
||||||
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Parameter \\#1 \\$result of function pg_result_error expects PgSql\\\\Result, object\\|resource given\\.$#"
|
|
||||||
count: 1
|
count: 1
|
||||||
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
||||||
|
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ parameters:
|
|||||||
# deprecated files
|
# deprecated files
|
||||||
- www/includes/admin_set_paths.php # ignore the admin include stuff
|
- www/includes/admin_set_paths.php # ignore the admin include stuff
|
||||||
- www/includes/admin_smarty.php # ignore the admin include stuff
|
- www/includes/admin_smarty.php # ignore the admin include stuff
|
||||||
|
- www/includes/edit_base.LEGACY.php # old style
|
||||||
# folders with data no check needed
|
# folders with data no check needed
|
||||||
- www/templates_c
|
- www/templates_c
|
||||||
- www/cache
|
- www/cache
|
||||||
@@ -49,11 +50,11 @@ parameters:
|
|||||||
- www/vendor
|
- www/vendor
|
||||||
# ignore errores with
|
# ignore errores with
|
||||||
ignoreErrors:
|
ignoreErrors:
|
||||||
- # this error is ignore because of the PHP 8.0 to 8.1 change for pg_*, only for 8.0 or lower
|
#- # this error is ignore because of the PHP 8.0 to 8.1 change for pg_*, only for 8.0 or lower
|
||||||
message: "#^Parameter \\#1 \\$(result|connection) of function pg_\\w+ expects resource(\\|null)?, object\\|resource(\\|bool)? given\\.$#"
|
# message: "#^Parameter \\#1 \\$(result|connection) of function pg_\\w+ expects resource(\\|null)?, object\\|resource(\\|bool)? given\\.$#"
|
||||||
path: %currentWorkingDirectory%/www/lib/CoreLibs/DB/SQL/PgSQL.php
|
# path: %currentWorkingDirectory%/www/lib/CoreLibs/DB/SQL/PgSQL.php
|
||||||
- # this is for 8.1 or newer
|
- # this is for 8.1 or newer
|
||||||
message: "#^Parameter \\#1 \\$(result|connection) of function pg_\\w+ expects PgSql\\\\(Result|Connection(\\|null)?), object\\|resource given\\.$#"
|
message: "#^Parameter \\#1 \\$(result|connection) of function pg_\\w+ expects PgSql\\\\(Result|Connection(\\|string)?(\\|null)?), object\\|resource given\\.$#"
|
||||||
path: %currentWorkingDirectory%/www/lib/CoreLibs/DB/SQL/PgSQL.php
|
path: %currentWorkingDirectory%/www/lib/CoreLibs/DB/SQL/PgSQL.php
|
||||||
# this is ignored for now
|
# this is ignored for now
|
||||||
# - '#Expression in empty\(\) is always falsy.#'
|
# - '#Expression in empty\(\) is always falsy.#'
|
||||||
|
|||||||
@@ -50,21 +50,22 @@ print '<div><h1>' . $PAGE_NAME . '</h1></div>';
|
|||||||
$byte = 254779258;
|
$byte = 254779258;
|
||||||
$string = '242.98 MB';
|
$string = '242.98 MB';
|
||||||
// static
|
// static
|
||||||
print "S::BYTE TO: $byte: " . $byte_class::humanReadableByteFormat($byte) . "<br>";
|
print "S::BYTE TO (calls as var): $byte: " . $byte_class::humanReadableByteFormat($byte) . "<br>";
|
||||||
print "S::BYTE TO: $byte: " . $byte_class::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_SI) . "<br>";
|
print "S::BYTE TO: $byte: " . Byte::humanReadableByteFormat($byte) . "<br>";
|
||||||
print "S::BYTE TO: $byte: " . $byte_class::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_ADJUST) . "<br>";
|
print "S::BYTE TO: $byte: " . Byte::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_SI) . "<br>";
|
||||||
print "S::BYTE TO: $byte: " . $byte_class::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_NOSPACE) . "<br>";
|
print "S::BYTE TO: $byte: " . Byte::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_ADJUST) . "<br>";
|
||||||
print "S::BYTE FROM: $string: " . $byte_class::stringByteFormat($string) . "<br>";
|
print "S::BYTE TO: $byte: " . Byte::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_NOSPACE) . "<br>";
|
||||||
|
print "S::BYTE FROM: $string: " . Byte::stringByteFormat($string) . "<br>";
|
||||||
//
|
//
|
||||||
$byte = 314572800;
|
$byte = 314572800;
|
||||||
$string = '300 MB';
|
$string = '300 MB';
|
||||||
print "S::BYTE TO: $byte: " . $byte_class::humanReadableByteFormat($byte) . "<br>";
|
print "S::BYTE TO: $byte: " . Byte::humanReadableByteFormat($byte) . "<br>";
|
||||||
print "S::BYTE TO: $byte: " . $byte_class::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_SI) . "<br>";
|
print "S::BYTE TO: $byte: " . Byte::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_SI) . "<br>";
|
||||||
print "S::BYTE TO: $byte: " . $byte_class::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_ADJUST) . "<br>";
|
print "S::BYTE TO: $byte: " . Byte::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_ADJUST) . "<br>";
|
||||||
print "S::BYTE TO: $byte: "
|
print "S::BYTE TO: $byte: "
|
||||||
. $byte_class::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_ADJUST | Byte::BYTE_FORMAT_NOSPACE) . "<br>";
|
. Byte::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_ADJUST | Byte::BYTE_FORMAT_NOSPACE) . "<br>";
|
||||||
print "S::BYTE TO: $byte: " . $byte_class::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_NOSPACE) . "<br>";
|
print "S::BYTE TO: $byte: " . Byte::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_NOSPACE) . "<br>";
|
||||||
print "S::BYTE FROM: $string: " . $byte_class::stringByteFormat($string) . "<br>";
|
print "S::BYTE FROM: $string: " . Byte::stringByteFormat($string) . "<br>";
|
||||||
|
|
||||||
// *** BYTES TEST ***
|
// *** BYTES TEST ***
|
||||||
$bytes = [
|
$bytes = [
|
||||||
|
|||||||
123
www/admin/class_test.check.colors.php
Normal file
123
www/admin/class_test.check.colors.php
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
<?php // phpcs:ignore warning
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @phan-file-suppress PhanTypeSuspiciousStringExpression
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
|
||||||
|
$DEBUG_ALL = 1;
|
||||||
|
$PRINT_ALL = 1;
|
||||||
|
$DB_DEBUG = 1;
|
||||||
|
|
||||||
|
if ($DEBUG_ALL) {
|
||||||
|
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
ob_start();
|
||||||
|
|
||||||
|
// basic class test file
|
||||||
|
define('USE_DATABASE', false);
|
||||||
|
// sample config
|
||||||
|
require 'config.php';
|
||||||
|
// define log file id
|
||||||
|
$LOG_FILE_ID = 'classTest-check-colors';
|
||||||
|
ob_end_flush();
|
||||||
|
|
||||||
|
use CoreLibs\Check\Colors;
|
||||||
|
// use CoreLibs\Debug\Support as DgS;
|
||||||
|
|
||||||
|
$log = new CoreLibs\Debug\Logging([
|
||||||
|
'log_folder' => BASE . LOG,
|
||||||
|
'file_id' => $LOG_FILE_ID,
|
||||||
|
// add file date
|
||||||
|
'print_file_date' => true,
|
||||||
|
// set debug and print flags
|
||||||
|
'debug_all' => $DEBUG_ALL ?? false,
|
||||||
|
'echo_all' => $ECHO_ALL ?? false,
|
||||||
|
'print_all' => $PRINT_ALL ?? false,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$PAGE_NAME = 'TEST CLASS: CHECK COLORS';
|
||||||
|
print "<!DOCTYPE html>";
|
||||||
|
print "<html><head><title>" . $PAGE_NAME . "</title><head>";
|
||||||
|
print "<body>";
|
||||||
|
print '<div><a href="class_test.php">Class Test Master</a></div>';
|
||||||
|
print '<div><h1>' . $PAGE_NAME . '</h1></div>';
|
||||||
|
|
||||||
|
// list of colors to check
|
||||||
|
$css_colors = [
|
||||||
|
// base hex
|
||||||
|
'#ab12cd',
|
||||||
|
'#ab12cd12',
|
||||||
|
// rgb
|
||||||
|
'rgb(255, 10, 20)',
|
||||||
|
'rgb(100%, 10%, 20%)',
|
||||||
|
'rgba(255, 10, 20)',
|
||||||
|
'rgba(100%, 10%, 20%)',
|
||||||
|
'rgba(255, 10, 20, 0.5)',
|
||||||
|
'rgba(100%, 10%, 20%, 0.5)',
|
||||||
|
'rgba(255, 10, 20, 50%)',
|
||||||
|
'rgba(100%, 10%, 20%, 50%)',
|
||||||
|
// hsl
|
||||||
|
'hsl(100, 50%, 60%)',
|
||||||
|
'hsl(100, 50.5%, 60.5%)',
|
||||||
|
'hsla(100, 50%, 60%)',
|
||||||
|
'hsla(100, 50.5%, 60.5%)',
|
||||||
|
'hsla(100, 50%, 60%, 0.5)',
|
||||||
|
'hsla(100, 50.5%, 60.5%, 0.5)',
|
||||||
|
'hsla(100, 50%, 60%, 50%)',
|
||||||
|
'hsla(100, 50.5%, 60.5%, 50%)',
|
||||||
|
// invalid here
|
||||||
|
'invalid string',
|
||||||
|
'(hsla(100, 100, 100))',
|
||||||
|
'hsla(100, 100, 100',
|
||||||
|
// invalid numbers
|
||||||
|
'#zzab99',
|
||||||
|
'#abcdef0',
|
||||||
|
'rgb(255%, 100, 100)',
|
||||||
|
'rgb(255%, 100, -10)',
|
||||||
|
'rgb(100%, 100, -10)',
|
||||||
|
'hsl(370, 100, 10)',
|
||||||
|
'hsl(200, 100%, 160%)',
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach ($css_colors as $color) {
|
||||||
|
$check = Colors::validateColor($color);
|
||||||
|
print "Color check: $color with (" . Colors::ALL . "): ";
|
||||||
|
if ($check) {
|
||||||
|
print '<span style="color: green;">OK</span>';
|
||||||
|
} else {
|
||||||
|
print '<span style="color: red;">ERROR</span>';
|
||||||
|
}
|
||||||
|
print "<br>";
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "<hr>";
|
||||||
|
|
||||||
|
// valid rgb/hsl checks
|
||||||
|
$color = 'hsla(360, 100%, 60%, 0.556)';
|
||||||
|
$check = Colors::validateColor($color);
|
||||||
|
print "Color check: $color with (" . Colors::ALL . "): ";
|
||||||
|
if ($check) {
|
||||||
|
print '<span style="color: green;">OK</span>';
|
||||||
|
} else {
|
||||||
|
print '<span style="color: red;">ERROR</span>';
|
||||||
|
}
|
||||||
|
|
||||||
|
// invalid flag
|
||||||
|
echo "<hr>";
|
||||||
|
try {
|
||||||
|
$check = Colors::validateColor('#ab12cd', 99);
|
||||||
|
print "No Exception";
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
print "ERROR: " . $e->getCode() . ": " . $e->getMessage() . "<br>";
|
||||||
|
}
|
||||||
|
|
||||||
|
// error message
|
||||||
|
print $log->printErrorMsg();
|
||||||
|
|
||||||
|
print "</body></html>";
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -22,7 +22,7 @@ define('USE_DATABASE', false);
|
|||||||
// sample config
|
// sample config
|
||||||
require 'config.php';
|
require 'config.php';
|
||||||
// define log file id
|
// define log file id
|
||||||
$LOG_FILE_ID = 'classTest-colors';
|
$LOG_FILE_ID = 'classTest-convert-colors';
|
||||||
ob_end_flush();
|
ob_end_flush();
|
||||||
|
|
||||||
use CoreLibs\Convert\Colors;
|
use CoreLibs\Convert\Colors;
|
||||||
@@ -40,7 +40,7 @@ $log = new CoreLibs\Debug\Logging([
|
|||||||
]);
|
]);
|
||||||
$color_class = 'CoreLibs\Convert\Colors';
|
$color_class = 'CoreLibs\Convert\Colors';
|
||||||
|
|
||||||
$PAGE_NAME = 'TEST CLASS: COLORS';
|
$PAGE_NAME = 'TEST CLASS: CONVERT COLORS';
|
||||||
print "<!DOCTYPE html>";
|
print "<!DOCTYPE html>";
|
||||||
print "<html><head><title>" . $PAGE_NAME . "</title><head>";
|
print "<html><head><title>" . $PAGE_NAME . "</title><head>";
|
||||||
print "<body>";
|
print "<body>";
|
||||||
@@ -145,6 +145,11 @@ print "PREPARE INSERT[ins_test_foo] STATUS: " . Support::printToString($status)
|
|||||||
print "PREPARE INSERT PREVIOUS INSERTED: "
|
print "PREPARE INSERT PREVIOUS INSERTED: "
|
||||||
. print_r($db->dbReturnRow("SELECT test_foo_id, test FROM test_foo "
|
. print_r($db->dbReturnRow("SELECT test_foo_id, test FROM test_foo "
|
||||||
. "WHERE test_foo_id = " . $db->dbGetInsertPK()), true) . "<br>";
|
. "WHERE test_foo_id = " . $db->dbGetInsertPK()), true) . "<br>";
|
||||||
|
|
||||||
|
print "PREPARE CURSOR RETURN:<br>";
|
||||||
|
foreach (['pk_name', 'count', 'query', 'returning_id'] as $key) {
|
||||||
|
print "KEY: " . $key . ': ' . $db->dbGetPrepareCursorValue('ins_test_foo', $key) . "<br>";
|
||||||
|
}
|
||||||
// returning test with multiple entries
|
// returning test with multiple entries
|
||||||
// $status = $db->db_exec(
|
// $status = $db->db_exec(
|
||||||
// "INSERT INTO test_foo (test) VALUES "
|
// "INSERT INTO test_foo (test) VALUES "
|
||||||
|
|||||||
@@ -27,6 +27,10 @@ $ECHO_ALL = true;
|
|||||||
$LOG_FILE_ID = 'classTest-form';
|
$LOG_FILE_ID = 'classTest-form';
|
||||||
ob_end_flush();
|
ob_end_flush();
|
||||||
|
|
||||||
|
// start session, needed for Form\Generate
|
||||||
|
$SET_SESSION_NAME = EDIT_SESSION_NAME;
|
||||||
|
$session = new CoreLibs\Create\Session($SET_SESSION_NAME);
|
||||||
|
|
||||||
// define an array for page use
|
// define an array for page use
|
||||||
$table_arrays = [];
|
$table_arrays = [];
|
||||||
$table_arrays[\CoreLibs\Get\System::getPageName(1)] = [
|
$table_arrays[\CoreLibs\Get\System::getPageName(1)] = [
|
||||||
|
|||||||
@@ -54,8 +54,9 @@ print "<html><head><title>TEST CLASS</title><head>";
|
|||||||
print "<body>";
|
print "<body>";
|
||||||
|
|
||||||
print '<div><a href="class_test.db.php">Class Test: DB</a></div>';
|
print '<div><a href="class_test.db.php">Class Test: DB</a></div>';
|
||||||
print '<div><a href="class_test.db.DbReturn.php">Class Test: DB dbReturn</a></div>';
|
print '<div><a href="class_test.db.dbReturn.php">Class Test: DB dbReturn</a></div>';
|
||||||
print '<div><a href="class_test.colors.php">Class Test: COLORS</a></div>';
|
print '<div><a href="class_test.convert.colors.php">Class Test: CONVERT COLORS</a></div>';
|
||||||
|
print '<div><a href="class_test.check.colors.php">Class Test: CHECK COLORS</a></div>';
|
||||||
print '<div><a href="class_test.mime.php">Class Test: MIME</a></div>';
|
print '<div><a href="class_test.mime.php">Class Test: MIME</a></div>';
|
||||||
print '<div><a href="class_test.json.php">Class Test: JSON</a></div>';
|
print '<div><a href="class_test.json.php">Class Test: JSON</a></div>';
|
||||||
print '<div><a href="class_test.token.php">Class Test: FORM TOKEN</a></div>';
|
print '<div><a href="class_test.token.php">Class Test: FORM TOKEN</a></div>';
|
||||||
@@ -84,6 +85,7 @@ print '<div><a href="class_test.output.form.php">Class Test: OUTPUT FORM</a></di
|
|||||||
print '<div><a href="class_test.admin.backend.php">Class Test: BACKEND ADMIN CLASS</a></div>';
|
print '<div><a href="class_test.admin.backend.php">Class Test: BACKEND ADMIN CLASS</a></div>';
|
||||||
print '<div><a href="class_test.lang.php">Class Test: LANG/L10n</a></div>';
|
print '<div><a href="class_test.lang.php">Class Test: LANG/L10n</a></div>';
|
||||||
print '<div><a href="class_test.session.php">Class Test: SESSION</a></div>';
|
print '<div><a href="class_test.session.php">Class Test: SESSION</a></div>';
|
||||||
|
print '<div><a href="class_test.session.read.php">Class Test: SESSION: READ</a></div>';
|
||||||
print '<div><a href="class_test.smarty.php">Class Test: SMARTY</a></div>';
|
print '<div><a href="class_test.smarty.php">Class Test: SMARTY</a></div>';
|
||||||
print '<div><a href="class_test.login.php">Class Test: LOGIN</a></div>';
|
print '<div><a href="class_test.login.php">Class Test: LOGIN</a></div>';
|
||||||
print '<div><a href="class_test.autoloader.php">Class Test: AUTOLOADER</a></div>';
|
print '<div><a href="class_test.autoloader.php">Class Test: AUTOLOADER</a></div>';
|
||||||
|
|||||||
474
www/composer.lock
generated
474
www/composer.lock
generated
@@ -9,30 +9,30 @@
|
|||||||
"packages-dev": [
|
"packages-dev": [
|
||||||
{
|
{
|
||||||
"name": "doctrine/instantiator",
|
"name": "doctrine/instantiator",
|
||||||
"version": "1.4.1",
|
"version": "1.5.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/doctrine/instantiator.git",
|
"url": "https://github.com/doctrine/instantiator.git",
|
||||||
"reference": "10dcfce151b967d20fde1b34ae6640712c3891bc"
|
"reference": "0a0fa9780f5d4e507415a065172d26a98d02047b"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc",
|
"url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b",
|
||||||
"reference": "10dcfce151b967d20fde1b34ae6640712c3891bc",
|
"reference": "0a0fa9780f5d4e507415a065172d26a98d02047b",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": "^7.1 || ^8.0"
|
"php": "^7.1 || ^8.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"doctrine/coding-standard": "^9",
|
"doctrine/coding-standard": "^9 || ^11",
|
||||||
"ext-pdo": "*",
|
"ext-pdo": "*",
|
||||||
"ext-phar": "*",
|
"ext-phar": "*",
|
||||||
"phpbench/phpbench": "^0.16 || ^1",
|
"phpbench/phpbench": "^0.16 || ^1",
|
||||||
"phpstan/phpstan": "^1.4",
|
"phpstan/phpstan": "^1.4",
|
||||||
"phpstan/phpstan-phpunit": "^1",
|
"phpstan/phpstan-phpunit": "^1",
|
||||||
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
|
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
|
||||||
"vimeo/psalm": "^4.22"
|
"vimeo/psalm": "^4.30 || ^5.4"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"autoload": {
|
"autoload": {
|
||||||
@@ -59,7 +59,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/doctrine/instantiator/issues",
|
"issues": "https://github.com/doctrine/instantiator/issues",
|
||||||
"source": "https://github.com/doctrine/instantiator/tree/1.4.1"
|
"source": "https://github.com/doctrine/instantiator/tree/1.5.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -75,7 +75,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2022-03-03T08:28:38+00:00"
|
"time": "2022-12-30T00:15:36+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "myclabs/deep-copy",
|
"name": "myclabs/deep-copy",
|
||||||
@@ -138,16 +138,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "nikic/php-parser",
|
"name": "nikic/php-parser",
|
||||||
"version": "v4.13.2",
|
"version": "v4.15.2",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/nikic/PHP-Parser.git",
|
"url": "https://github.com/nikic/PHP-Parser.git",
|
||||||
"reference": "210577fe3cf7badcc5814d99455df46564f3c077"
|
"reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077",
|
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc",
|
||||||
"reference": "210577fe3cf7badcc5814d99455df46564f3c077",
|
"reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -188,9 +188,9 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/nikic/PHP-Parser/issues",
|
"issues": "https://github.com/nikic/PHP-Parser/issues",
|
||||||
"source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2"
|
"source": "https://github.com/nikic/PHP-Parser/tree/v4.15.2"
|
||||||
},
|
},
|
||||||
"time": "2021-11-30T19:35:32+00:00"
|
"time": "2022-11-12T15:38:23+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phar-io/manifest",
|
"name": "phar-io/manifest",
|
||||||
@@ -303,252 +303,25 @@
|
|||||||
},
|
},
|
||||||
"time": "2022-02-21T01:04:05+00:00"
|
"time": "2022-02-21T01:04:05+00:00"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "phpdocumentor/reflection-common",
|
|
||||||
"version": "2.2.0",
|
|
||||||
"source": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/phpDocumentor/ReflectionCommon.git",
|
|
||||||
"reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
|
|
||||||
},
|
|
||||||
"dist": {
|
|
||||||
"type": "zip",
|
|
||||||
"url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
|
|
||||||
"reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
|
|
||||||
"shasum": ""
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"php": "^7.2 || ^8.0"
|
|
||||||
},
|
|
||||||
"type": "library",
|
|
||||||
"extra": {
|
|
||||||
"branch-alias": {
|
|
||||||
"dev-2.x": "2.x-dev"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"autoload": {
|
|
||||||
"psr-4": {
|
|
||||||
"phpDocumentor\\Reflection\\": "src/"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
|
||||||
"license": [
|
|
||||||
"MIT"
|
|
||||||
],
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Jaap van Otterdijk",
|
|
||||||
"email": "opensource@ijaap.nl"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"description": "Common reflection classes used by phpdocumentor to reflect the code structure",
|
|
||||||
"homepage": "http://www.phpdoc.org",
|
|
||||||
"keywords": [
|
|
||||||
"FQSEN",
|
|
||||||
"phpDocumentor",
|
|
||||||
"phpdoc",
|
|
||||||
"reflection",
|
|
||||||
"static analysis"
|
|
||||||
],
|
|
||||||
"support": {
|
|
||||||
"issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
|
|
||||||
"source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
|
|
||||||
},
|
|
||||||
"time": "2020-06-27T09:03:43+00:00"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "phpdocumentor/reflection-docblock",
|
|
||||||
"version": "5.3.0",
|
|
||||||
"source": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
|
|
||||||
"reference": "622548b623e81ca6d78b721c5e029f4ce664f170"
|
|
||||||
},
|
|
||||||
"dist": {
|
|
||||||
"type": "zip",
|
|
||||||
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170",
|
|
||||||
"reference": "622548b623e81ca6d78b721c5e029f4ce664f170",
|
|
||||||
"shasum": ""
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"ext-filter": "*",
|
|
||||||
"php": "^7.2 || ^8.0",
|
|
||||||
"phpdocumentor/reflection-common": "^2.2",
|
|
||||||
"phpdocumentor/type-resolver": "^1.3",
|
|
||||||
"webmozart/assert": "^1.9.1"
|
|
||||||
},
|
|
||||||
"require-dev": {
|
|
||||||
"mockery/mockery": "~1.3.2",
|
|
||||||
"psalm/phar": "^4.8"
|
|
||||||
},
|
|
||||||
"type": "library",
|
|
||||||
"extra": {
|
|
||||||
"branch-alias": {
|
|
||||||
"dev-master": "5.x-dev"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"autoload": {
|
|
||||||
"psr-4": {
|
|
||||||
"phpDocumentor\\Reflection\\": "src"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
|
||||||
"license": [
|
|
||||||
"MIT"
|
|
||||||
],
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Mike van Riel",
|
|
||||||
"email": "me@mikevanriel.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Jaap van Otterdijk",
|
|
||||||
"email": "account@ijaap.nl"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
|
|
||||||
"support": {
|
|
||||||
"issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
|
|
||||||
"source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0"
|
|
||||||
},
|
|
||||||
"time": "2021-10-19T17:43:47+00:00"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "phpdocumentor/type-resolver",
|
|
||||||
"version": "1.6.1",
|
|
||||||
"source": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/phpDocumentor/TypeResolver.git",
|
|
||||||
"reference": "77a32518733312af16a44300404e945338981de3"
|
|
||||||
},
|
|
||||||
"dist": {
|
|
||||||
"type": "zip",
|
|
||||||
"url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3",
|
|
||||||
"reference": "77a32518733312af16a44300404e945338981de3",
|
|
||||||
"shasum": ""
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"php": "^7.2 || ^8.0",
|
|
||||||
"phpdocumentor/reflection-common": "^2.0"
|
|
||||||
},
|
|
||||||
"require-dev": {
|
|
||||||
"ext-tokenizer": "*",
|
|
||||||
"psalm/phar": "^4.8"
|
|
||||||
},
|
|
||||||
"type": "library",
|
|
||||||
"extra": {
|
|
||||||
"branch-alias": {
|
|
||||||
"dev-1.x": "1.x-dev"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"autoload": {
|
|
||||||
"psr-4": {
|
|
||||||
"phpDocumentor\\Reflection\\": "src"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
|
||||||
"license": [
|
|
||||||
"MIT"
|
|
||||||
],
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Mike van Riel",
|
|
||||||
"email": "me@mikevanriel.com"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
|
|
||||||
"support": {
|
|
||||||
"issues": "https://github.com/phpDocumentor/TypeResolver/issues",
|
|
||||||
"source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1"
|
|
||||||
},
|
|
||||||
"time": "2022-03-15T21:29:03+00:00"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "phpspec/prophecy",
|
|
||||||
"version": "v1.15.0",
|
|
||||||
"source": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/phpspec/prophecy.git",
|
|
||||||
"reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13"
|
|
||||||
},
|
|
||||||
"dist": {
|
|
||||||
"type": "zip",
|
|
||||||
"url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13",
|
|
||||||
"reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13",
|
|
||||||
"shasum": ""
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"doctrine/instantiator": "^1.2",
|
|
||||||
"php": "^7.2 || ~8.0, <8.2",
|
|
||||||
"phpdocumentor/reflection-docblock": "^5.2",
|
|
||||||
"sebastian/comparator": "^3.0 || ^4.0",
|
|
||||||
"sebastian/recursion-context": "^3.0 || ^4.0"
|
|
||||||
},
|
|
||||||
"require-dev": {
|
|
||||||
"phpspec/phpspec": "^6.0 || ^7.0",
|
|
||||||
"phpunit/phpunit": "^8.0 || ^9.0"
|
|
||||||
},
|
|
||||||
"type": "library",
|
|
||||||
"extra": {
|
|
||||||
"branch-alias": {
|
|
||||||
"dev-master": "1.x-dev"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"autoload": {
|
|
||||||
"psr-4": {
|
|
||||||
"Prophecy\\": "src/Prophecy"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
|
||||||
"license": [
|
|
||||||
"MIT"
|
|
||||||
],
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Konstantin Kudryashov",
|
|
||||||
"email": "ever.zet@gmail.com",
|
|
||||||
"homepage": "http://everzet.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Marcello Duarte",
|
|
||||||
"email": "marcello.duarte@gmail.com"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"description": "Highly opinionated mocking framework for PHP 5.3+",
|
|
||||||
"homepage": "https://github.com/phpspec/prophecy",
|
|
||||||
"keywords": [
|
|
||||||
"Double",
|
|
||||||
"Dummy",
|
|
||||||
"fake",
|
|
||||||
"mock",
|
|
||||||
"spy",
|
|
||||||
"stub"
|
|
||||||
],
|
|
||||||
"support": {
|
|
||||||
"issues": "https://github.com/phpspec/prophecy/issues",
|
|
||||||
"source": "https://github.com/phpspec/prophecy/tree/v1.15.0"
|
|
||||||
},
|
|
||||||
"time": "2021-12-08T12:19:24+00:00"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "phpunit/php-code-coverage",
|
"name": "phpunit/php-code-coverage",
|
||||||
"version": "9.2.15",
|
"version": "9.2.23",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
|
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
|
||||||
"reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f"
|
"reference": "9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2e9da11878c4202f97915c1cb4bb1ca318a63f5f",
|
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c",
|
||||||
"reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f",
|
"reference": "9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"ext-dom": "*",
|
"ext-dom": "*",
|
||||||
"ext-libxml": "*",
|
"ext-libxml": "*",
|
||||||
"ext-xmlwriter": "*",
|
"ext-xmlwriter": "*",
|
||||||
"nikic/php-parser": "^4.13.0",
|
"nikic/php-parser": "^4.14",
|
||||||
"php": ">=7.3",
|
"php": ">=7.3",
|
||||||
"phpunit/php-file-iterator": "^3.0.3",
|
"phpunit/php-file-iterator": "^3.0.3",
|
||||||
"phpunit/php-text-template": "^2.0.2",
|
"phpunit/php-text-template": "^2.0.2",
|
||||||
@@ -597,7 +370,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
|
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
|
||||||
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.15"
|
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.23"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -605,7 +378,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2022-03-07T09:28:20+00:00"
|
"time": "2022-12-28T12:41:10+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpunit/php-file-iterator",
|
"name": "phpunit/php-file-iterator",
|
||||||
@@ -850,16 +623,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpunit/phpunit",
|
"name": "phpunit/phpunit",
|
||||||
"version": "9.5.20",
|
"version": "9.5.27",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
||||||
"reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba"
|
"reference": "a2bc7ffdca99f92d959b3f2270529334030bba38"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/12bc8879fb65aef2138b26fc633cb1e3620cffba",
|
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a2bc7ffdca99f92d959b3f2270529334030bba38",
|
||||||
"reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba",
|
"reference": "a2bc7ffdca99f92d959b3f2270529334030bba38",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -874,7 +647,6 @@
|
|||||||
"phar-io/manifest": "^2.0.3",
|
"phar-io/manifest": "^2.0.3",
|
||||||
"phar-io/version": "^3.0.2",
|
"phar-io/version": "^3.0.2",
|
||||||
"php": ">=7.3",
|
"php": ">=7.3",
|
||||||
"phpspec/prophecy": "^1.12.1",
|
|
||||||
"phpunit/php-code-coverage": "^9.2.13",
|
"phpunit/php-code-coverage": "^9.2.13",
|
||||||
"phpunit/php-file-iterator": "^3.0.5",
|
"phpunit/php-file-iterator": "^3.0.5",
|
||||||
"phpunit/php-invoker": "^3.1.1",
|
"phpunit/php-invoker": "^3.1.1",
|
||||||
@@ -882,20 +654,16 @@
|
|||||||
"phpunit/php-timer": "^5.0.2",
|
"phpunit/php-timer": "^5.0.2",
|
||||||
"sebastian/cli-parser": "^1.0.1",
|
"sebastian/cli-parser": "^1.0.1",
|
||||||
"sebastian/code-unit": "^1.0.6",
|
"sebastian/code-unit": "^1.0.6",
|
||||||
"sebastian/comparator": "^4.0.5",
|
"sebastian/comparator": "^4.0.8",
|
||||||
"sebastian/diff": "^4.0.3",
|
"sebastian/diff": "^4.0.3",
|
||||||
"sebastian/environment": "^5.1.3",
|
"sebastian/environment": "^5.1.3",
|
||||||
"sebastian/exporter": "^4.0.3",
|
"sebastian/exporter": "^4.0.5",
|
||||||
"sebastian/global-state": "^5.0.1",
|
"sebastian/global-state": "^5.0.1",
|
||||||
"sebastian/object-enumerator": "^4.0.3",
|
"sebastian/object-enumerator": "^4.0.3",
|
||||||
"sebastian/resource-operations": "^3.0.3",
|
"sebastian/resource-operations": "^3.0.3",
|
||||||
"sebastian/type": "^3.0",
|
"sebastian/type": "^3.2",
|
||||||
"sebastian/version": "^3.0.2"
|
"sebastian/version": "^3.0.2"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
|
||||||
"ext-pdo": "*",
|
|
||||||
"phpspec/prophecy-phpunit": "^2.0.1"
|
|
||||||
},
|
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"ext-soap": "*",
|
"ext-soap": "*",
|
||||||
"ext-xdebug": "*"
|
"ext-xdebug": "*"
|
||||||
@@ -937,7 +705,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
|
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
|
||||||
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.20"
|
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.27"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -947,9 +715,13 @@
|
|||||||
{
|
{
|
||||||
"url": "https://github.com/sebastianbergmann",
|
"url": "https://github.com/sebastianbergmann",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
|
||||||
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2022-04-01T12:37:26+00:00"
|
"time": "2022-12-09T07:31:23+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sebastian/cli-parser",
|
"name": "sebastian/cli-parser",
|
||||||
@@ -1120,16 +892,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sebastian/comparator",
|
"name": "sebastian/comparator",
|
||||||
"version": "4.0.6",
|
"version": "4.0.8",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/sebastianbergmann/comparator.git",
|
"url": "https://github.com/sebastianbergmann/comparator.git",
|
||||||
"reference": "55f4261989e546dc112258c7a75935a81a7ce382"
|
"reference": "fa0f136dd2334583309d32b62544682ee972b51a"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382",
|
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a",
|
||||||
"reference": "55f4261989e546dc112258c7a75935a81a7ce382",
|
"reference": "fa0f136dd2334583309d32b62544682ee972b51a",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -1182,7 +954,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/sebastianbergmann/comparator/issues",
|
"issues": "https://github.com/sebastianbergmann/comparator/issues",
|
||||||
"source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6"
|
"source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -1190,7 +962,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2020-10-26T15:49:45+00:00"
|
"time": "2022-09-14T12:41:17+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sebastian/complexity",
|
"name": "sebastian/complexity",
|
||||||
@@ -1380,16 +1152,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sebastian/exporter",
|
"name": "sebastian/exporter",
|
||||||
"version": "4.0.4",
|
"version": "4.0.5",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/sebastianbergmann/exporter.git",
|
"url": "https://github.com/sebastianbergmann/exporter.git",
|
||||||
"reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9"
|
"reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9",
|
"url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
|
||||||
"reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9",
|
"reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -1445,7 +1217,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/sebastianbergmann/exporter/issues",
|
"issues": "https://github.com/sebastianbergmann/exporter/issues",
|
||||||
"source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4"
|
"source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -1453,7 +1225,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2021-11-11T14:18:36+00:00"
|
"time": "2022-09-14T06:03:37+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sebastian/global-state",
|
"name": "sebastian/global-state",
|
||||||
@@ -1808,16 +1580,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sebastian/type",
|
"name": "sebastian/type",
|
||||||
"version": "3.0.0",
|
"version": "3.2.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/sebastianbergmann/type.git",
|
"url": "https://github.com/sebastianbergmann/type.git",
|
||||||
"reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad"
|
"reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b233b84bc4465aff7b57cf1c4bc75c86d00d6dad",
|
"url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e",
|
||||||
"reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad",
|
"reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -1829,7 +1601,7 @@
|
|||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "3.0-dev"
|
"dev-master": "3.2-dev"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
@@ -1852,7 +1624,7 @@
|
|||||||
"homepage": "https://github.com/sebastianbergmann/type",
|
"homepage": "https://github.com/sebastianbergmann/type",
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/sebastianbergmann/type/issues",
|
"issues": "https://github.com/sebastianbergmann/type/issues",
|
||||||
"source": "https://github.com/sebastianbergmann/type/tree/3.0.0"
|
"source": "https://github.com/sebastianbergmann/type/tree/3.2.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -1860,7 +1632,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2022-03-15T09:54:48+00:00"
|
"time": "2022-09-12T14:47:03+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sebastian/version",
|
"name": "sebastian/version",
|
||||||
@@ -1915,88 +1687,6 @@
|
|||||||
],
|
],
|
||||||
"time": "2020-09-28T06:39:44+00:00"
|
"time": "2020-09-28T06:39:44+00:00"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "symfony/polyfill-ctype",
|
|
||||||
"version": "v1.25.0",
|
|
||||||
"source": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/symfony/polyfill-ctype.git",
|
|
||||||
"reference": "30885182c981ab175d4d034db0f6f469898070ab"
|
|
||||||
},
|
|
||||||
"dist": {
|
|
||||||
"type": "zip",
|
|
||||||
"url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab",
|
|
||||||
"reference": "30885182c981ab175d4d034db0f6f469898070ab",
|
|
||||||
"shasum": ""
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"php": ">=7.1"
|
|
||||||
},
|
|
||||||
"provide": {
|
|
||||||
"ext-ctype": "*"
|
|
||||||
},
|
|
||||||
"suggest": {
|
|
||||||
"ext-ctype": "For best performance"
|
|
||||||
},
|
|
||||||
"type": "library",
|
|
||||||
"extra": {
|
|
||||||
"branch-alias": {
|
|
||||||
"dev-main": "1.23-dev"
|
|
||||||
},
|
|
||||||
"thanks": {
|
|
||||||
"name": "symfony/polyfill",
|
|
||||||
"url": "https://github.com/symfony/polyfill"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"autoload": {
|
|
||||||
"files": [
|
|
||||||
"bootstrap.php"
|
|
||||||
],
|
|
||||||
"psr-4": {
|
|
||||||
"Symfony\\Polyfill\\Ctype\\": ""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
|
||||||
"license": [
|
|
||||||
"MIT"
|
|
||||||
],
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Gert de Pagter",
|
|
||||||
"email": "BackEndTea@gmail.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Symfony Community",
|
|
||||||
"homepage": "https://symfony.com/contributors"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"description": "Symfony polyfill for ctype functions",
|
|
||||||
"homepage": "https://symfony.com",
|
|
||||||
"keywords": [
|
|
||||||
"compatibility",
|
|
||||||
"ctype",
|
|
||||||
"polyfill",
|
|
||||||
"portable"
|
|
||||||
],
|
|
||||||
"support": {
|
|
||||||
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.25.0"
|
|
||||||
},
|
|
||||||
"funding": [
|
|
||||||
{
|
|
||||||
"url": "https://symfony.com/sponsor",
|
|
||||||
"type": "custom"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "https://github.com/fabpot",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
|
||||||
"type": "tidelift"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"time": "2021-10-20T20:35:02+00:00"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "theseer/tokenizer",
|
"name": "theseer/tokenizer",
|
||||||
"version": "1.2.1",
|
"version": "1.2.1",
|
||||||
@@ -2046,64 +1736,6 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2021-07-28T10:34:58+00:00"
|
"time": "2021-07-28T10:34:58+00:00"
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "webmozart/assert",
|
|
||||||
"version": "1.10.0",
|
|
||||||
"source": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/webmozarts/assert.git",
|
|
||||||
"reference": "6964c76c7804814a842473e0c8fd15bab0f18e25"
|
|
||||||
},
|
|
||||||
"dist": {
|
|
||||||
"type": "zip",
|
|
||||||
"url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25",
|
|
||||||
"reference": "6964c76c7804814a842473e0c8fd15bab0f18e25",
|
|
||||||
"shasum": ""
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"php": "^7.2 || ^8.0",
|
|
||||||
"symfony/polyfill-ctype": "^1.8"
|
|
||||||
},
|
|
||||||
"conflict": {
|
|
||||||
"phpstan/phpstan": "<0.12.20",
|
|
||||||
"vimeo/psalm": "<4.6.1 || 4.6.2"
|
|
||||||
},
|
|
||||||
"require-dev": {
|
|
||||||
"phpunit/phpunit": "^8.5.13"
|
|
||||||
},
|
|
||||||
"type": "library",
|
|
||||||
"extra": {
|
|
||||||
"branch-alias": {
|
|
||||||
"dev-master": "1.10-dev"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"autoload": {
|
|
||||||
"psr-4": {
|
|
||||||
"Webmozart\\Assert\\": "src/"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
|
||||||
"license": [
|
|
||||||
"MIT"
|
|
||||||
],
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Bernhard Schussek",
|
|
||||||
"email": "bschussek@gmail.com"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"description": "Assertions to validate method input/output with nice error messages.",
|
|
||||||
"keywords": [
|
|
||||||
"assert",
|
|
||||||
"check",
|
|
||||||
"validate"
|
|
||||||
],
|
|
||||||
"support": {
|
|
||||||
"issues": "https://github.com/webmozarts/assert/issues",
|
|
||||||
"source": "https://github.com/webmozarts/assert/tree/1.10.0"
|
|
||||||
},
|
|
||||||
"time": "2021-03-09T10:59:23+00:00"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
|
|||||||
@@ -249,7 +249,7 @@ if ($is_secure) {
|
|||||||
define('HOST_PROTOCOL', 'http://');
|
define('HOST_PROTOCOL', 'http://');
|
||||||
}
|
}
|
||||||
// define the db config set name, the db config and the db schema
|
// define the db config set name, the db config and the db schema
|
||||||
define('DB_CONFIG_NAME', $SITE_CONFIG[HOST_NAME]['db_host']);
|
define('DB_CONFIG_NAME', $SITE_CONFIG[HOST_NAME]['db_host'] ?? '');
|
||||||
define('DB_CONFIG', $DB_CONFIG[DB_CONFIG_NAME] ?? []);
|
define('DB_CONFIG', $DB_CONFIG[DB_CONFIG_NAME] ?? []);
|
||||||
// because we can't change constant, but we want to for db debug flag
|
// because we can't change constant, but we want to for db debug flag
|
||||||
$GLOBALS['DB_CONFIG_SET'] = DB_CONFIG;
|
$GLOBALS['DB_CONFIG_SET'] = DB_CONFIG;
|
||||||
@@ -268,9 +268,9 @@ define('SITE_ENCODING', $SITE_CONFIG[HOST_NAME]['site_encoding'] ?? DEFAULT_ENCO
|
|||||||
define('LOGIN_ENABLED', $SITE_CONFIG[HOST_NAME]['login_enabled'] ?? false);
|
define('LOGIN_ENABLED', $SITE_CONFIG[HOST_NAME]['login_enabled'] ?? false);
|
||||||
define('AUTH', $SITE_CONFIG[HOST_NAME]['auth'] ?? false);
|
define('AUTH', $SITE_CONFIG[HOST_NAME]['auth'] ?? false);
|
||||||
// paths
|
// paths
|
||||||
// define('CSV_PATH', $PATHS[TARGET]['csv_path']);
|
// define('CSV_PATH', $PATHS[TARGET]['csv_path'] ?? '');
|
||||||
// define('EXPORT_SCRIPT', $PATHS[TARGET]['perl_bin']);
|
// define('EXPORT_SCRIPT', $PATHS[TARGET]['perl_bin'] ?? '');
|
||||||
// define('REDIRECT_URL', $PATHS[TARGET]['redirect_url']);
|
// define('REDIRECT_URL', $PATHS[TARGET]['redirect_url'] ?? '');
|
||||||
|
|
||||||
// show all errors if debug_all & show_error_handling are enabled
|
// show all errors if debug_all & show_error_handling are enabled
|
||||||
define('SHOW_ALL_ERRORS', true);
|
define('SHOW_ALL_ERRORS', true);
|
||||||
|
|||||||
563
www/includes/edit_base.LEGACY.php
Normal file
563
www/includes/edit_base.LEGACY.php
Normal file
@@ -0,0 +1,563 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* AUTHOR: Clemens "Gullevek" Schwaighofer (www.gullevek.org)
|
||||||
|
* CREATED: 2003/06/10
|
||||||
|
* SHORT DESCRIPTION:
|
||||||
|
* central include for all edit_pages
|
||||||
|
* - edit_groups.php
|
||||||
|
* - edit_languages.php
|
||||||
|
* - edit_pages.php
|
||||||
|
* - edit_schemes.php
|
||||||
|
* - edit_users.php
|
||||||
|
* - edit_visible_group.php
|
||||||
|
* HISTORY:
|
||||||
|
* 2005/06/30 (cs) remove color settings, they are in CSS File now
|
||||||
|
* 2005/06/22 (cs) moved load of config array into form class, set lang
|
||||||
|
* and lang is must set var for form class; removed the
|
||||||
|
* page name setting, moved it into the form class,
|
||||||
|
* emove all HTML from main page
|
||||||
|
* 2004/09/30 (cs) changed layout to fit default layout & changed LIBS, etc
|
||||||
|
* 2003-06-10: creation of this page
|
||||||
|
*********************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
$DEBUG_ALL = true;
|
||||||
|
$PRINT_ALL = true;
|
||||||
|
$ECHO_ALL = false;
|
||||||
|
$DB_DEBUG = true;
|
||||||
|
|
||||||
|
// TODO: only extract _POST data that is needed
|
||||||
|
extract($_POST, EXTR_SKIP);
|
||||||
|
|
||||||
|
ob_start();
|
||||||
|
require 'config.php';
|
||||||
|
// overrride debug flags
|
||||||
|
if (!DEBUG) {
|
||||||
|
$DEBUG_ALL = false;
|
||||||
|
$PRINT_ALL = false;
|
||||||
|
$DB_DEBUG = false;
|
||||||
|
$ECHO_ALL = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// should be utf8
|
||||||
|
header("Content-type: text/html; charset=" . DEFAULT_ENCODING);
|
||||||
|
// start session
|
||||||
|
$session = new \CoreLibs\Create\Session(EDIT_SESSION_NAME);
|
||||||
|
// init logger
|
||||||
|
$log = new CoreLibs\Debug\Logging([
|
||||||
|
'log_folder' => BASE . LOG,
|
||||||
|
'file_id' => LOG_FILE_ID . 'EditBase',
|
||||||
|
'print_file_date' => true,
|
||||||
|
'per_class' => true,
|
||||||
|
'debug_all' => $DEBUG_ALL,
|
||||||
|
'echo_all' => $ECHO_ALL,
|
||||||
|
'print_all' => $PRINT_ALL,
|
||||||
|
]);
|
||||||
|
// db connection
|
||||||
|
$db = new CoreLibs\DB\IO(DB_CONFIG, $log);
|
||||||
|
// login page
|
||||||
|
$login = new CoreLibs\ACL\Login($db, $log, $session);
|
||||||
|
// lang, path, domain
|
||||||
|
// pre auto detect language after login
|
||||||
|
$locale = \CoreLibs\Language\GetLocale::setLocale();
|
||||||
|
// set lang and pass to smarty/backend
|
||||||
|
$l10n = new \CoreLibs\Language\L10n(
|
||||||
|
$locale['locale'],
|
||||||
|
$locale['domain'],
|
||||||
|
$locale['path'],
|
||||||
|
);
|
||||||
|
// flush and start
|
||||||
|
ob_end_flush();
|
||||||
|
// turn off set log per class
|
||||||
|
$log->setLogPer('class', false);
|
||||||
|
// create form class
|
||||||
|
$form = new CoreLibs\Output\Form\Generate(DB_CONFIG, $log, $l10n, $locale);
|
||||||
|
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($l10n, $locale);
|
||||||
|
|
||||||
|
// $form->log->debug('POST', $form->log->prAr($_POST));
|
||||||
|
|
||||||
|
if (TARGET == 'live' || TARGET == 'remote') {
|
||||||
|
// login
|
||||||
|
$login->log->setLogLevelAll('debug', DEBUG ? true : false);
|
||||||
|
$login->log->setLogLevelAll('echo', false);
|
||||||
|
$login->log->setLogLevelAll('print', DEBUG ? true : false);
|
||||||
|
// form
|
||||||
|
$form->log->setLogLevelAll('debug', DEBUG ? true : false);
|
||||||
|
$form->log->setLogLevelAll('echo', false);
|
||||||
|
$form->log->setLogLevelAll('print', DEBUG ? true : false);
|
||||||
|
}
|
||||||
|
// space for setting special debug flags
|
||||||
|
$login->log->setLogLevelAll('debug', true);
|
||||||
|
// set smarty arrays
|
||||||
|
$HEADER = [];
|
||||||
|
$DATA = [];
|
||||||
|
$DEBUG_DATA = [];
|
||||||
|
// set the template dir
|
||||||
|
// WARNING: this has a special check for the mailing tool layout (old layout)
|
||||||
|
if (defined('LAYOUT')) {
|
||||||
|
$smarty->setTemplateDir(BASE . INCLUDES . TEMPLATES . CONTENT_PATH);
|
||||||
|
$DATA['css'] = LAYOUT . CSS;
|
||||||
|
$DATA['js'] = LAYOUT . JS;
|
||||||
|
} else {
|
||||||
|
$smarty->setTemplateDir(TEMPLATES);
|
||||||
|
$DATA['css'] = CSS;
|
||||||
|
$DATA['js'] = JS;
|
||||||
|
}
|
||||||
|
// set table width
|
||||||
|
$table_width = '100%';
|
||||||
|
$ADMIN_STYLESHEET = 'edit.css';
|
||||||
|
// define all needed smarty stuff for the general HTML/page building
|
||||||
|
$HEADER['CSS'] = CSS;
|
||||||
|
$HEADER['DEFAULT_ENCODING'] = DEFAULT_ENCODING;
|
||||||
|
/** @phpstan-ignore-next-line because ADMIN_STYLESHEET can be null */
|
||||||
|
$HEADER['STYLESHEET'] = $ADMIN_STYLESHEET ?? ADMIN_STYLESHEET;
|
||||||
|
|
||||||
|
if ($form->my_page_name == 'edit_order') {
|
||||||
|
// get is for "table_name" and "where" only
|
||||||
|
$table_name = $_GET['table_name'] ?? '';
|
||||||
|
// $where = $_GET['where'] ?? '';
|
||||||
|
// order name is _always_ order_number for the edit interface
|
||||||
|
|
||||||
|
// follwing arrays do exist here:
|
||||||
|
// $position ... has the positions of the [0..max], cause in a <select>
|
||||||
|
// I can't put an number into the array field, in this array,
|
||||||
|
// there are the POSITION stored, that should CHANGE there order (up/down)
|
||||||
|
// $row_data_id ... has ALL ids from the sorting part
|
||||||
|
// $row_data_order ... has ALL order positions from the soirting part
|
||||||
|
if (!isset($position)) {
|
||||||
|
$position = [];
|
||||||
|
}
|
||||||
|
$row_data_id = $_POST['row_data_id'] ?? [];
|
||||||
|
$original_id = $row_data_id;
|
||||||
|
if (count($position)) {
|
||||||
|
$row_data_order = $_POST['row_data_order'];
|
||||||
|
|
||||||
|
// FIRST u have to put right sort, then read again ...
|
||||||
|
// hast to be >0 or the first one is selected and then there is no move
|
||||||
|
if (isset($up) && isset($position[0]) && $position[0] > 0) {
|
||||||
|
for ($i = 0; $i < count($position); $i++) {
|
||||||
|
// change position order
|
||||||
|
// this gets temp, id before that, gets actual (moves one "down")
|
||||||
|
// this gets the old before (moves one "up")
|
||||||
|
// is done for every element in row
|
||||||
|
// echo "A: ".$row_data_id[$position[$i]]
|
||||||
|
// ." (".$row_data_order[$position[$i]].") -- ".$row_data_id[$position[$i]-1]
|
||||||
|
// ." (".$row_data_order[$position[$i]-1].")<br>";
|
||||||
|
$temp_id = $row_data_id[$position[$i]] ?? null;
|
||||||
|
$row_data_id[$position[$i]] = $row_data_id[$position[$i] - 1] ?? null;
|
||||||
|
$row_data_id[$position[$i] - 1] = $temp_id;
|
||||||
|
// echo "A: ".$row_data_id[$position[$i]]
|
||||||
|
// ." (".$row_data_order[$position[$i]].") -- "
|
||||||
|
// .$row_data_id[$position[$i]-1]." (".$row_data_order[$position[$i]-1].")<br>";
|
||||||
|
} // for
|
||||||
|
} // if up
|
||||||
|
|
||||||
|
// the last position id from position array is not to be the count - 1 of
|
||||||
|
// row_data_id array, or it is the last element
|
||||||
|
if (isset($down) && ($position[count($position) - 1] != (count($row_data_id) - 1))) {
|
||||||
|
for ($i = count($position) - 1; $i >= 0; $i--) {
|
||||||
|
// same as up, just up in other way, starts from bottom (last element) and moves "up"
|
||||||
|
// element before actuel gets temp, this element, becomes element after this,
|
||||||
|
// element after this, gets this
|
||||||
|
$temp_id = $row_data_id[$position[$i] + 1] ?? null;
|
||||||
|
$row_data_id[$position[$i] + 1] = $row_data_id[$position[$i]] ?? null;
|
||||||
|
$row_data_id[$position[$i]] = $temp_id;
|
||||||
|
} // for
|
||||||
|
} // if down
|
||||||
|
|
||||||
|
// write data ... (which has to be abstrackt ...)
|
||||||
|
if (
|
||||||
|
(isset($up) && $position[0] > 0) ||
|
||||||
|
(isset($down) && ($position[count($position) - 1] != (count($row_data_id) - 1)))
|
||||||
|
) {
|
||||||
|
for ($i = 0; $i < count($row_data_id); $i++) {
|
||||||
|
if (isset($row_data_order[$i]) && isset($row_data_id[$i])) {
|
||||||
|
$q = "UPDATE " . $table_name
|
||||||
|
. " SET order_number = " . $row_data_order[$i]
|
||||||
|
. " WHERE " . $table_name . "_id = " . $row_data_id[$i];
|
||||||
|
$q = $form->dbExec($q);
|
||||||
|
}
|
||||||
|
} // for all article ids ...
|
||||||
|
} // if write
|
||||||
|
} // if there is something to move
|
||||||
|
|
||||||
|
// get ...
|
||||||
|
$q = "SELECT " . $table_name . "_id, name, order_number FROM " . $table_name . " ";
|
||||||
|
if (!empty($where_string)) {
|
||||||
|
$q .= "WHERE $where_string ";
|
||||||
|
}
|
||||||
|
$q .= "ORDER BY order_number";
|
||||||
|
|
||||||
|
// init arrays
|
||||||
|
$row_data = [];
|
||||||
|
$options_id = [];
|
||||||
|
$options_name = [];
|
||||||
|
$options_selected = [];
|
||||||
|
// DB read data for menu
|
||||||
|
while (is_array($res = $form->dbReturn($q))) {
|
||||||
|
$row_data[] = [
|
||||||
|
"id" => $res[$table_name . "_id"],
|
||||||
|
"name" => $res["name"],
|
||||||
|
"order" => $res["order_number"]
|
||||||
|
];
|
||||||
|
} // while read data ...
|
||||||
|
|
||||||
|
// html title
|
||||||
|
$HEADER['HTML_TITLE'] = $form->l->__('Edit Order');
|
||||||
|
|
||||||
|
$messages = [];
|
||||||
|
// error msg
|
||||||
|
if (isset($error)) {
|
||||||
|
if (!isset($msg)) {
|
||||||
|
$msg = [];
|
||||||
|
}
|
||||||
|
$messages[] = [
|
||||||
|
'msg' => $msg,
|
||||||
|
'class' => 'error',
|
||||||
|
'width' => '100%'
|
||||||
|
];
|
||||||
|
}
|
||||||
|
$DATA['form_error_msg'] = $messages;
|
||||||
|
|
||||||
|
// all the row data
|
||||||
|
for ($i = 0; $i < count($row_data); $i++) {
|
||||||
|
$options_id[] = $i;
|
||||||
|
$options_name[] = $row_data[$i]['name'];
|
||||||
|
// list of points to order
|
||||||
|
for ($j = 0; $j < count($position); $j++) {
|
||||||
|
// if matches, put into select array
|
||||||
|
if (
|
||||||
|
isset($original_id[$position[$j]]) && isset($row_data[$i]['id']) &&
|
||||||
|
$original_id[$position[$j]] == $row_data[$i]['id']
|
||||||
|
) {
|
||||||
|
$options_selected[] = $i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$DATA['options_id'] = $options_id;
|
||||||
|
$DATA['options_name'] = $options_name;
|
||||||
|
$DATA['options_selected'] = $options_selected;
|
||||||
|
|
||||||
|
// hidden list for the data (id, order number)
|
||||||
|
$row_data_id = [];
|
||||||
|
$row_data_order = [];
|
||||||
|
for ($i = 0; $i < count($row_data); $i++) {
|
||||||
|
$row_data_id[] = $row_data[$i]['id'];
|
||||||
|
$row_data_order[] = $row_data[$i]['order'];
|
||||||
|
}
|
||||||
|
$DATA['row_data_id'] = $row_data_id;
|
||||||
|
$DATA['row_data_order'] = $row_data_order;
|
||||||
|
|
||||||
|
// hidden names for the table & where string
|
||||||
|
$DATA['table_name'] = $table_name;
|
||||||
|
$DATA['where_string'] = $where_string ?? '';
|
||||||
|
|
||||||
|
$EDIT_TEMPLATE = 'edit_order.tpl';
|
||||||
|
} else {
|
||||||
|
// load call only if id is set
|
||||||
|
if (isset(${$form->archive_pk_name})) {
|
||||||
|
$form->formProcedureLoad(${$form->archive_pk_name});
|
||||||
|
}
|
||||||
|
$form->formProcedureNew();
|
||||||
|
$form->formProcedureSave();
|
||||||
|
$form->formProcedureDelete();
|
||||||
|
// delete call only if those two are set
|
||||||
|
if (isset($element_list) && isset($remove_name)) {
|
||||||
|
$form->formProcedureDeleteFromElementList($element_list, $remove_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
$DATA['table_width'] = $table_width;
|
||||||
|
|
||||||
|
$messages = [];
|
||||||
|
// write out error / status messages
|
||||||
|
$messages[] = $form->formPrintMsg();
|
||||||
|
$DATA['form_error_msg'] = $messages;
|
||||||
|
|
||||||
|
// MENU START
|
||||||
|
// request some session vars
|
||||||
|
if (!isset($HEADER_COLOR)) {
|
||||||
|
$DATA['HEADER_COLOR'] = '#E0E2FF';
|
||||||
|
} else {
|
||||||
|
$DATA['HEADER_COLOR'] = $_SESSION['HEADER_COLOR'];
|
||||||
|
}
|
||||||
|
$DATA['USER_NAME'] = $_SESSION['USER_NAME'];
|
||||||
|
$DATA['EUID'] = $_SESSION['EUID'];
|
||||||
|
$DATA['GROUP_NAME'] = $_SESSION['GROUP_NAME'];
|
||||||
|
$DATA['GROUP_LEVEL'] = $_SESSION['GROUP_ACL_LEVEL'];
|
||||||
|
$PAGES = $_SESSION['PAGES'];
|
||||||
|
|
||||||
|
//$form->log->debug('menu', $form->log->prAr($PAGES));
|
||||||
|
|
||||||
|
// build nav from $PAGES ...
|
||||||
|
if (!isset($PAGES) || !is_array($PAGES)) {
|
||||||
|
$PAGES = [];
|
||||||
|
}
|
||||||
|
$menuarray = [];
|
||||||
|
foreach ($PAGES as $PAGE_CUID => $PAGE_DATA) {
|
||||||
|
if ($PAGE_DATA['menu'] && $PAGE_DATA['online']) {
|
||||||
|
$menuarray[] = $PAGE_DATA;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// split point for nav points
|
||||||
|
$COUNT_NAV_POINTS = count($menuarray);
|
||||||
|
$SPLIT_FACTOR = 3;
|
||||||
|
$START_SPLIT_COUNT = 3;
|
||||||
|
// WTF ?? I dunno what I am doing here ...
|
||||||
|
for ($i = 9; $i < $COUNT_NAV_POINTS; $i += $START_SPLIT_COUNT) {
|
||||||
|
if ($COUNT_NAV_POINTS > $i) {
|
||||||
|
$SPLIT_FACTOR += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$position = 0;
|
||||||
|
$menu_data = [];
|
||||||
|
// for ($i = 1; $i <= count($menuarray); $i ++) {
|
||||||
|
foreach ($menuarray as $i => $data) {
|
||||||
|
// do that for new array
|
||||||
|
$j = $i + 1;
|
||||||
|
$menu_data[$i]['pagename'] = htmlentities($data['page_name']);
|
||||||
|
$menu_data[$i]['filename'] =
|
||||||
|
// prefix folder or host name
|
||||||
|
(isset($data['hostname']) && $data['hostname'] ?
|
||||||
|
$data['hostname'] :
|
||||||
|
''
|
||||||
|
)
|
||||||
|
// filename
|
||||||
|
. ($data['filename'] ?? '')
|
||||||
|
// query string
|
||||||
|
. (isset($data['query_string']) && $data['query_string'] ?
|
||||||
|
$data['query_string'] :
|
||||||
|
''
|
||||||
|
);
|
||||||
|
if ($j == 1 || !($i % $SPLIT_FACTOR)) {
|
||||||
|
$menu_data[$i]['splitfactor_in'] = 1;
|
||||||
|
} else {
|
||||||
|
$menu_data[$i]['splitfactor_in'] = 0;
|
||||||
|
}
|
||||||
|
// on matching, we also need to check if we are in the same folder
|
||||||
|
if (
|
||||||
|
isset($data['filename']) &&
|
||||||
|
$data['filename'] == \CoreLibs\Get\System::getPageName() &&
|
||||||
|
(!isset($data['hostname']) || (
|
||||||
|
isset($data['hostname']) &&
|
||||||
|
(!$data['hostname'] || strstr($data['hostname'], CONTENT_PATH) !== false)
|
||||||
|
))
|
||||||
|
) {
|
||||||
|
$position = $i;
|
||||||
|
$menu_data[$i]['position'] = 1;
|
||||||
|
$menu_data[$i]['popup'] = 0;
|
||||||
|
} else {
|
||||||
|
// add query stuff
|
||||||
|
// HAS TO DONE LATER ... set urlencode, etc ...
|
||||||
|
// check if popup needed
|
||||||
|
if (isset($data['popup']) && $data['popup'] == 1) {
|
||||||
|
$menu_data[$i]['popup'] = 1;
|
||||||
|
$menu_data[$i]['rand'] = uniqid((string)rand());
|
||||||
|
$menu_data[$i]['width'] = $data['popup_x'];
|
||||||
|
$menu_data[$i]['height'] = $data['popup_y'];
|
||||||
|
} else {
|
||||||
|
$menu_data[$i]['popup'] = 0;
|
||||||
|
}
|
||||||
|
$menu_data[$i]['position'] = 0;
|
||||||
|
} // highlight or not
|
||||||
|
if (!($j % $SPLIT_FACTOR) || (($j + 1) > count($menuarray))) {
|
||||||
|
$menu_data[$i]['splitfactor_out'] = 1;
|
||||||
|
} else {
|
||||||
|
$menu_data[$i]['splitfactor_out'] = 0;
|
||||||
|
}
|
||||||
|
} // for
|
||||||
|
// $form->log->debug('MENU ARRAY', $form->log->prAr($menu_data));
|
||||||
|
$DATA['menu_data'] = $menu_data;
|
||||||
|
$DATA['page_name'] = $menuarray[$position]['page_name'] ?? '-Undefined [' . $position . '] -';
|
||||||
|
$L_TITLE = $DATA['page_name'];
|
||||||
|
// html title
|
||||||
|
$HEADER['HTML_TITLE'] = $form->l->__($L_TITLE);
|
||||||
|
// END MENU
|
||||||
|
// LOAD AND NEW
|
||||||
|
$DATA['load'] = $form->formCreateLoad();
|
||||||
|
$DATA['new'] = $form->formCreateNew();
|
||||||
|
// SHOW DATA PART
|
||||||
|
if ($form->yes) {
|
||||||
|
$DATA['form_yes'] = $form->yes;
|
||||||
|
$DATA['form_my_page_name'] = $form->my_page_name;
|
||||||
|
$DATA['filename_exist'] = 0;
|
||||||
|
$DATA['drop_down_input'] = 0;
|
||||||
|
$elements = [];
|
||||||
|
// depending on the "getPageName()" I show different stuff
|
||||||
|
switch ($form->my_page_name) {
|
||||||
|
case 'edit_users':
|
||||||
|
$elements[] = $form->formCreateElement('login_error_count');
|
||||||
|
$elements[] = $form->formCreateElement('login_error_date_last');
|
||||||
|
$elements[] = $form->formCreateElement('login_error_date_first');
|
||||||
|
$elements[] = $form->formCreateElement('enabled');
|
||||||
|
$elements[] = $form->formCreateElement('deleted');
|
||||||
|
$elements[] = $form->formCreateElement('protected');
|
||||||
|
$elements[] = $form->formCreateElement('username');
|
||||||
|
$elements[] = $form->formCreateElement('password');
|
||||||
|
$elements[] = $form->formCreateElement('password_change_interval');
|
||||||
|
$elements[] = $form->formCreateElement('login_user_id');
|
||||||
|
$elements[] = $form->formCreateElement('login_user_id_set_date');
|
||||||
|
$elements[] = $form->formCreateElement('login_user_id_last_revalidate');
|
||||||
|
$elements[] = $form->formCreateElement('login_user_id_locked');
|
||||||
|
$elements[] = $form->formCreateElement('login_user_id_revalidate_after');
|
||||||
|
$elements[] = $form->formCreateElement('login_user_id_valid_from');
|
||||||
|
$elements[] = $form->formCreateElement('login_user_id_valid_until');
|
||||||
|
$elements[] = $form->formCreateElement('email');
|
||||||
|
$elements[] = $form->formCreateElement('last_name');
|
||||||
|
$elements[] = $form->formCreateElement('first_name');
|
||||||
|
$elements[] = $form->formCreateElement('edit_group_id');
|
||||||
|
$elements[] = $form->formCreateElement('edit_access_right_id');
|
||||||
|
$elements[] = $form->formCreateElement('strict');
|
||||||
|
$elements[] = $form->formCreateElement('locked');
|
||||||
|
$elements[] = $form->formCreateElement('lock_until');
|
||||||
|
$elements[] = $form->formCreateElement('lock_after');
|
||||||
|
$elements[] = $form->formCreateElement('admin');
|
||||||
|
$elements[] = $form->formCreateElement('debug');
|
||||||
|
$elements[] = $form->formCreateElement('db_debug');
|
||||||
|
$elements[] = $form->formCreateElement('edit_language_id');
|
||||||
|
$elements[] = $form->formCreateElement('edit_scheme_id');
|
||||||
|
$elements[] = $form->formCreateElementListTable('edit_access_user');
|
||||||
|
$elements[] = $form->formCreateElement('additional_acl');
|
||||||
|
break;
|
||||||
|
case 'edit_schemes':
|
||||||
|
$elements[] = $form->formCreateElement('enabled');
|
||||||
|
$elements[] = $form->formCreateElement('name');
|
||||||
|
$elements[] = $form->formCreateElement('header_color');
|
||||||
|
$elements[] = $form->formCreateElement('template');
|
||||||
|
break;
|
||||||
|
case 'edit_pages':
|
||||||
|
if (!isset($form->table_array['edit_page_id']['value'])) {
|
||||||
|
$q = "DELETE FROM temp_files";
|
||||||
|
$form->dbExec($q);
|
||||||
|
// gets all files in the current dir and dirs given ending with .php
|
||||||
|
$folders = ['../admin/', '../frontend/'];
|
||||||
|
$files = ['*.php'];
|
||||||
|
$search_glob = [];
|
||||||
|
foreach ($folders as $folder) {
|
||||||
|
// make sure this folder actually exists
|
||||||
|
if (is_dir(ROOT . $folder)) {
|
||||||
|
foreach ($files as $file) {
|
||||||
|
$search_glob[] = $folder . $file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$crap = exec('ls ' . join(' ', $search_glob), $output, $status);
|
||||||
|
// now get all that are NOT in de DB
|
||||||
|
$q = "INSERT INTO temp_files (folder, filename) VALUES ";
|
||||||
|
$t_q = '';
|
||||||
|
foreach ($output as $output_file) {
|
||||||
|
// split the ouput into folder and file
|
||||||
|
$pathinfo = pathinfo($output_file);
|
||||||
|
if (!empty($pathinfo['dirname'])) {
|
||||||
|
$pathinfo['dirname'] .= DIRECTORY_SEPARATOR;
|
||||||
|
} else {
|
||||||
|
$pathinfo['dirname'] = '';
|
||||||
|
}
|
||||||
|
if ($t_q) {
|
||||||
|
$t_q .= ', ';
|
||||||
|
}
|
||||||
|
$t_q .= "('" . $form->dbEscapeString($pathinfo['dirname']) . "', '"
|
||||||
|
. $form->dbEscapeString($pathinfo['basename']) . "')";
|
||||||
|
}
|
||||||
|
$form->dbExec($q . $t_q, 'NULL');
|
||||||
|
$elements[] = $form->formCreateElement('filename');
|
||||||
|
} else {
|
||||||
|
// show file menu
|
||||||
|
// just show name of file ...
|
||||||
|
$DATA['filename_exist'] = 1;
|
||||||
|
$DATA['filename'] = $form->table_array['filename']['value'];
|
||||||
|
} // File Name View IF
|
||||||
|
$elements[] = $form->formCreateElement('hostname');
|
||||||
|
$elements[] = $form->formCreateElement('name');
|
||||||
|
// $elements[] = $form->formCreateElement('tag');
|
||||||
|
// $elements[] = $form->formCreateElement('min_acl');
|
||||||
|
$elements[] = $form->formCreateElement('order_number');
|
||||||
|
$elements[] = $form->formCreateElement('online');
|
||||||
|
$elements[] = $form->formCreateElement('menu');
|
||||||
|
$elements[] = $form->formCreateElementListTable('edit_query_string');
|
||||||
|
$elements[] = $form->formCreateElement('content_alias_edit_page_id');
|
||||||
|
$elements[] = $form->formCreateElementListTable('edit_page_content');
|
||||||
|
$elements[] = $form->formCreateElement('popup');
|
||||||
|
$elements[] = $form->formCreateElement('popup_x');
|
||||||
|
$elements[] = $form->formCreateElement('popup_y');
|
||||||
|
$elements[] = $form->formCreateElementReferenceTable('edit_visible_group');
|
||||||
|
$elements[] = $form->formCreateElementReferenceTable('edit_menu_group');
|
||||||
|
break;
|
||||||
|
case 'edit_languages':
|
||||||
|
$elements[] = $form->formCreateElement('enabled');
|
||||||
|
$elements[] = $form->formCreateElement('short_name');
|
||||||
|
$elements[] = $form->formCreateElement('long_name');
|
||||||
|
$elements[] = $form->formCreateElement('iso_name');
|
||||||
|
break;
|
||||||
|
case 'edit_groups':
|
||||||
|
$elements[] = $form->formCreateElement('enabled');
|
||||||
|
$elements[] = $form->formCreateElement('name');
|
||||||
|
$elements[] = $form->formCreateElement('edit_access_right_id');
|
||||||
|
$elements[] = $form->formCreateElement('edit_scheme_id');
|
||||||
|
$elements[] = $form->formCreateElementListTable('edit_page_access');
|
||||||
|
$elements[] = $form->formCreateElement('additional_acl');
|
||||||
|
break;
|
||||||
|
case 'edit_visible_group':
|
||||||
|
$elements[] = $form->formCreateElement('name');
|
||||||
|
$elements[] = $form->formCreateElement('flag');
|
||||||
|
break;
|
||||||
|
case 'edit_menu_group':
|
||||||
|
$elements[] = $form->formCreateElement('name');
|
||||||
|
$elements[] = $form->formCreateElement('flag');
|
||||||
|
$elements[] = $form->formCreateElement('order_number');
|
||||||
|
break;
|
||||||
|
case 'edit_access':
|
||||||
|
$elements[] = $form->formCreateElement('name');
|
||||||
|
$elements[] = $form->formCreateElement('enabled');
|
||||||
|
$elements[] = $form->formCreateElement('protected');
|
||||||
|
$elements[] = $form->formCreateElement('color');
|
||||||
|
$elements[] = $form->formCreateElement('description');
|
||||||
|
// add name/value list here
|
||||||
|
$elements[] = $form->formCreateElementListTable('edit_access_data');
|
||||||
|
$elements[] = $form->formCreateElement('additional_acl');
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
print '[No valid page definition given]';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// $form->log->debug('edit', "Elements: <pre>".$form->log->prAr($elements));
|
||||||
|
$DATA['elements'] = $elements;
|
||||||
|
$DATA['hidden'] = $form->formCreateHiddenFields();
|
||||||
|
$DATA['save_delete'] = $form->formCreateSaveDelete();
|
||||||
|
} else {
|
||||||
|
$DATA['form_yes'] = 0;
|
||||||
|
}
|
||||||
|
$EDIT_TEMPLATE = 'edit_body.tpl';
|
||||||
|
}
|
||||||
|
|
||||||
|
// debug data, if DEBUG flag is on, this data is print out
|
||||||
|
$DEBUG_DATA['DEBUG'] = $DEBUG_TMPL ?? '';
|
||||||
|
|
||||||
|
// create main data array
|
||||||
|
$CONTENT_DATA = array_merge($HEADER, $DATA, $DEBUG_DATA);
|
||||||
|
// data is 1:1 mapping (all vars, values, etc)
|
||||||
|
foreach ($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($EDIT_TEMPLATE, 'editAdmin_' . $smarty->lang, 'editAdmin_' . $smarty->lang);
|
||||||
|
|
||||||
|
$form->log->debug('DEBUGEND', '==================================== [Form END]');
|
||||||
|
// debug output
|
||||||
|
echo $login->log->printErrorMsg();
|
||||||
|
echo $form->log->printErrorMsg();
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -23,23 +23,8 @@
|
|||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
$DEBUG_ALL = true;
|
|
||||||
$PRINT_ALL = true;
|
|
||||||
$ECHO_ALL = false;
|
|
||||||
$DB_DEBUG = true;
|
|
||||||
|
|
||||||
// TODO: only extract _POST data that is needed
|
|
||||||
extract($_POST, EXTR_SKIP);
|
|
||||||
|
|
||||||
ob_start();
|
ob_start();
|
||||||
require 'config.php';
|
require 'config.php';
|
||||||
// overrride debug flags
|
|
||||||
if (!DEBUG) {
|
|
||||||
$DEBUG_ALL = false;
|
|
||||||
$PRINT_ALL = false;
|
|
||||||
$DB_DEBUG = false;
|
|
||||||
$ECHO_ALL = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// should be utf8
|
// should be utf8
|
||||||
header("Content-type: text/html; charset=" . DEFAULT_ENCODING);
|
header("Content-type: text/html; charset=" . DEFAULT_ENCODING);
|
||||||
@@ -51,14 +36,16 @@ $log = new CoreLibs\Debug\Logging([
|
|||||||
'file_id' => LOG_FILE_ID . 'EditBase',
|
'file_id' => LOG_FILE_ID . 'EditBase',
|
||||||
'print_file_date' => true,
|
'print_file_date' => true,
|
||||||
'per_class' => true,
|
'per_class' => true,
|
||||||
'debug_all' => $DEBUG_ALL,
|
'debug_all' => $DEBUG_ALL ?? false,
|
||||||
'echo_all' => $ECHO_ALL,
|
'echo_all' => $ECHO_ALL ?? false,
|
||||||
'print_all' => $PRINT_ALL,
|
'print_all' => $PRINT_ALL ?? false,
|
||||||
]);
|
]);
|
||||||
// db connection
|
// db connection
|
||||||
$db = new CoreLibs\DB\IO(DB_CONFIG, $log);
|
$db = new CoreLibs\DB\IO(DB_CONFIG, $log);
|
||||||
// login page
|
// login page
|
||||||
$login = new CoreLibs\ACL\Login($db, $log, $session);
|
$login = new CoreLibs\ACL\Login($db, $log, $session);
|
||||||
|
// space for setting special debug flags
|
||||||
|
// $login->log->setLogLevelAll('debug', true);
|
||||||
// lang, path, domain
|
// lang, path, domain
|
||||||
// pre auto detect language after login
|
// pre auto detect language after login
|
||||||
$locale = \CoreLibs\Language\GetLocale::setLocale();
|
$locale = \CoreLibs\Language\GetLocale::setLocale();
|
||||||
@@ -70,490 +57,10 @@ $l10n = new \CoreLibs\Language\L10n(
|
|||||||
);
|
);
|
||||||
// flush and start
|
// flush and start
|
||||||
ob_end_flush();
|
ob_end_flush();
|
||||||
// turn off set log per class
|
|
||||||
$log->setLogPer('class', false);
|
|
||||||
// create form class
|
|
||||||
$form = new CoreLibs\Output\Form\Generate(DB_CONFIG, $log, $l10n, $locale);
|
|
||||||
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($l10n, $locale);
|
|
||||||
|
|
||||||
// $form->log->debug('POST', $form->log->prAr($_POST));
|
// init smarty and form class
|
||||||
|
$edit_base = new CoreLibs\Admin\EditBase(DB_CONFIG, $log, $l10n, $locale);
|
||||||
if (TARGET == 'live' || TARGET == 'remote') {
|
// creates edit pages and runs actions
|
||||||
// login
|
$edit_base->editBaseRun();
|
||||||
$login->log->setLogLevelAll('debug', DEBUG ? true : false);
|
|
||||||
$login->log->setLogLevelAll('echo', false);
|
|
||||||
$login->log->setLogLevelAll('print', DEBUG ? true : false);
|
|
||||||
// form
|
|
||||||
$form->log->setLogLevelAll('debug', DEBUG ? true : false);
|
|
||||||
$form->log->setLogLevelAll('echo', false);
|
|
||||||
$form->log->setLogLevelAll('print', DEBUG ? true : false);
|
|
||||||
}
|
|
||||||
// space for setting special debug flags
|
|
||||||
$login->log->setLogLevelAll('debug', true);
|
|
||||||
// set smarty arrays
|
|
||||||
$HEADER = [];
|
|
||||||
$DATA = [];
|
|
||||||
$DEBUG_DATA = [];
|
|
||||||
// set the template dir
|
|
||||||
// WARNING: this has a special check for the mailing tool layout (old layout)
|
|
||||||
if (defined('LAYOUT')) {
|
|
||||||
$smarty->setTemplateDir(BASE . INCLUDES . TEMPLATES . CONTENT_PATH);
|
|
||||||
$DATA['css'] = LAYOUT . CSS;
|
|
||||||
$DATA['js'] = LAYOUT . JS;
|
|
||||||
} else {
|
|
||||||
$smarty->setTemplateDir(TEMPLATES);
|
|
||||||
$DATA['css'] = CSS;
|
|
||||||
$DATA['js'] = JS;
|
|
||||||
}
|
|
||||||
// set table width
|
|
||||||
$table_width = '100%';
|
|
||||||
|
|
||||||
// define all needed smarty stuff for the general HTML/page building
|
|
||||||
$HEADER['CSS'] = CSS;
|
|
||||||
$HEADER['DEFAULT_ENCODING'] = DEFAULT_ENCODING;
|
|
||||||
$HEADER['STYLESHEET'] = $ADMIN_STYLESHEET ?? ADMIN_STYLESHEET;
|
|
||||||
|
|
||||||
if ($form->my_page_name == 'edit_order') {
|
|
||||||
// get is for "table_name" and "where" only
|
|
||||||
$table_name = $_GET['table_name'] ?? '';
|
|
||||||
// $where = $_GET['where'] ?? '';
|
|
||||||
// order name is _always_ order_number for the edit interface
|
|
||||||
|
|
||||||
// follwing arrays do exist here:
|
|
||||||
// $position ... has the positions of the [0..max], cause in a <select>
|
|
||||||
// I can't put an number into the array field, in this array,
|
|
||||||
// there are the POSITION stored, that should CHANGE there order (up/down)
|
|
||||||
// $row_data_id ... has ALL ids from the sorting part
|
|
||||||
// $row_data_order ... has ALL order positions from the soirting part
|
|
||||||
if (!isset($position)) {
|
|
||||||
$position = [];
|
|
||||||
}
|
|
||||||
$row_data_id = $_POST['row_data_id'] ?? [];
|
|
||||||
$original_id = $row_data_id;
|
|
||||||
if (count($position)) {
|
|
||||||
$row_data_order = $_POST['row_data_order'];
|
|
||||||
|
|
||||||
// FIRST u have to put right sort, then read again ...
|
|
||||||
// hast to be >0 or the first one is selected and then there is no move
|
|
||||||
if (isset($up) && isset($position[0]) && $position[0] > 0) {
|
|
||||||
for ($i = 0; $i < count($position); $i++) {
|
|
||||||
// change position order
|
|
||||||
// this gets temp, id before that, gets actual (moves one "down")
|
|
||||||
// this gets the old before (moves one "up")
|
|
||||||
// is done for every element in row
|
|
||||||
// echo "A: ".$row_data_id[$position[$i]]
|
|
||||||
// ." (".$row_data_order[$position[$i]].") -- ".$row_data_id[$position[$i]-1]
|
|
||||||
// ." (".$row_data_order[$position[$i]-1].")<br>";
|
|
||||||
$temp_id = $row_data_id[$position[$i]] ?? null;
|
|
||||||
$row_data_id[$position[$i]] = $row_data_id[$position[$i] - 1] ?? null;
|
|
||||||
$row_data_id[$position[$i] - 1] = $temp_id;
|
|
||||||
// echo "A: ".$row_data_id[$position[$i]]
|
|
||||||
// ." (".$row_data_order[$position[$i]].") -- "
|
|
||||||
// .$row_data_id[$position[$i]-1]." (".$row_data_order[$position[$i]-1].")<br>";
|
|
||||||
} // for
|
|
||||||
} // if up
|
|
||||||
|
|
||||||
// the last position id from position array is not to be the count - 1 of
|
|
||||||
// row_data_id array, or it is the last element
|
|
||||||
if (isset($down) && ($position[count($position) - 1] != (count($row_data_id) - 1))) {
|
|
||||||
for ($i = count($position) - 1; $i >= 0; $i--) {
|
|
||||||
// same as up, just up in other way, starts from bottom (last element) and moves "up"
|
|
||||||
// element before actuel gets temp, this element, becomes element after this,
|
|
||||||
// element after this, gets this
|
|
||||||
$temp_id = $row_data_id[$position[$i] + 1] ?? null;
|
|
||||||
$row_data_id[$position[$i] + 1] = $row_data_id[$position[$i]] ?? null;
|
|
||||||
$row_data_id[$position[$i]] = $temp_id;
|
|
||||||
} // for
|
|
||||||
} // if down
|
|
||||||
|
|
||||||
// write data ... (which has to be abstrackt ...)
|
|
||||||
if (
|
|
||||||
(isset($up) && $position[0] > 0) ||
|
|
||||||
(isset($down) && ($position[count($position) - 1] != (count($row_data_id) - 1)))
|
|
||||||
) {
|
|
||||||
for ($i = 0; $i < count($row_data_id); $i++) {
|
|
||||||
if (isset($row_data_order[$i]) && isset($row_data_id[$i])) {
|
|
||||||
$q = "UPDATE " . $table_name
|
|
||||||
. " SET order_number = " . $row_data_order[$i]
|
|
||||||
. " WHERE " . $table_name . "_id = " . $row_data_id[$i];
|
|
||||||
$q = $form->dbExec($q);
|
|
||||||
}
|
|
||||||
} // for all article ids ...
|
|
||||||
} // if write
|
|
||||||
} // if there is something to move
|
|
||||||
|
|
||||||
// get ...
|
|
||||||
$q = "SELECT " . $table_name . "_id, name, order_number FROM " . $table_name . " ";
|
|
||||||
if (!empty($where_string)) {
|
|
||||||
$q .= "WHERE $where_string ";
|
|
||||||
}
|
|
||||||
$q .= "ORDER BY order_number";
|
|
||||||
|
|
||||||
// init arrays
|
|
||||||
$row_data = [];
|
|
||||||
$options_id = [];
|
|
||||||
$options_name = [];
|
|
||||||
$options_selected = [];
|
|
||||||
// DB read data for menu
|
|
||||||
while (is_array($res = $form->dbReturn($q))) {
|
|
||||||
$row_data[] = [
|
|
||||||
"id" => $res[$table_name . "_id"],
|
|
||||||
"name" => $res["name"],
|
|
||||||
"order" => $res["order_number"]
|
|
||||||
];
|
|
||||||
} // while read data ...
|
|
||||||
|
|
||||||
// html title
|
|
||||||
$HEADER['HTML_TITLE'] = $form->l->__('Edit Order');
|
|
||||||
|
|
||||||
$messages = [];
|
|
||||||
// error msg
|
|
||||||
if (isset($error)) {
|
|
||||||
if (!isset($msg)) {
|
|
||||||
$msg = [];
|
|
||||||
}
|
|
||||||
$messages[] = [
|
|
||||||
'msg' => $msg,
|
|
||||||
'class' => 'error',
|
|
||||||
'width' => '100%'
|
|
||||||
];
|
|
||||||
}
|
|
||||||
$DATA['form_error_msg'] = $messages;
|
|
||||||
|
|
||||||
// all the row data
|
|
||||||
for ($i = 0; $i < count($row_data); $i++) {
|
|
||||||
$options_id[] = $i;
|
|
||||||
$options_name[] = $row_data[$i]['name'];
|
|
||||||
// list of points to order
|
|
||||||
for ($j = 0; $j < count($position); $j++) {
|
|
||||||
// if matches, put into select array
|
|
||||||
if (
|
|
||||||
isset($original_id[$position[$j]]) && isset($row_data[$i]['id']) &&
|
|
||||||
$original_id[$position[$j]] == $row_data[$i]['id']
|
|
||||||
) {
|
|
||||||
$options_selected[] = $i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$DATA['options_id'] = $options_id;
|
|
||||||
$DATA['options_name'] = $options_name;
|
|
||||||
$DATA['options_selected'] = $options_selected;
|
|
||||||
|
|
||||||
// hidden list for the data (id, order number)
|
|
||||||
$row_data_id = [];
|
|
||||||
$row_data_order = [];
|
|
||||||
for ($i = 0; $i < count($row_data); $i++) {
|
|
||||||
$row_data_id[] = $row_data[$i]['id'];
|
|
||||||
$row_data_order[] = $row_data[$i]['order'];
|
|
||||||
}
|
|
||||||
$DATA['row_data_id'] = $row_data_id;
|
|
||||||
$DATA['row_data_order'] = $row_data_order;
|
|
||||||
|
|
||||||
// hidden names for the table & where string
|
|
||||||
$DATA['table_name'] = $table_name;
|
|
||||||
$DATA['where_string'] = $where_string ?? '';
|
|
||||||
|
|
||||||
$EDIT_TEMPLATE = 'edit_order.tpl';
|
|
||||||
} else {
|
|
||||||
// load call only if id is set
|
|
||||||
if (isset(${$form->archive_pk_name})) {
|
|
||||||
$form->formProcedureLoad(${$form->archive_pk_name});
|
|
||||||
}
|
|
||||||
$form->formProcedureNew();
|
|
||||||
$form->formProcedureSave();
|
|
||||||
$form->formProcedureDelete();
|
|
||||||
// delete call only if those two are set
|
|
||||||
if (isset($element_list) && isset($remove_name)) {
|
|
||||||
$form->formProcedureDeleteFromElementList($element_list, $remove_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
$DATA['table_width'] = $table_width;
|
|
||||||
|
|
||||||
$messages = [];
|
|
||||||
// write out error / status messages
|
|
||||||
$messages[] = $form->formPrintMsg();
|
|
||||||
$DATA['form_error_msg'] = $messages;
|
|
||||||
|
|
||||||
// MENU START
|
|
||||||
// request some session vars
|
|
||||||
if (!isset($HEADER_COLOR)) {
|
|
||||||
$DATA['HEADER_COLOR'] = '#E0E2FF';
|
|
||||||
} else {
|
|
||||||
$DATA['HEADER_COLOR'] = $_SESSION['HEADER_COLOR'];
|
|
||||||
}
|
|
||||||
$DATA['USER_NAME'] = $_SESSION['USER_NAME'];
|
|
||||||
$DATA['EUID'] = $_SESSION['EUID'];
|
|
||||||
$DATA['GROUP_NAME'] = $_SESSION['GROUP_NAME'];
|
|
||||||
$DATA['GROUP_LEVEL'] = $_SESSION['GROUP_ACL_LEVEL'];
|
|
||||||
$PAGES = $_SESSION['PAGES'];
|
|
||||||
|
|
||||||
//$form->log->debug('menu', $form->log->prAr($PAGES));
|
|
||||||
|
|
||||||
// build nav from $PAGES ...
|
|
||||||
if (!isset($PAGES) || !is_array($PAGES)) {
|
|
||||||
$PAGES = [];
|
|
||||||
}
|
|
||||||
$menuarray = [];
|
|
||||||
foreach ($PAGES as $PAGE_CUID => $PAGE_DATA) {
|
|
||||||
if ($PAGE_DATA['menu'] && $PAGE_DATA['online']) {
|
|
||||||
$menuarray[] = $PAGE_DATA;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// split point for nav points
|
|
||||||
$COUNT_NAV_POINTS = count($menuarray);
|
|
||||||
$SPLIT_FACTOR = 3;
|
|
||||||
$START_SPLIT_COUNT = 3;
|
|
||||||
// WTF ?? I dunno what I am doing here ...
|
|
||||||
for ($i = 9; $i < $COUNT_NAV_POINTS; $i += $START_SPLIT_COUNT) {
|
|
||||||
if ($COUNT_NAV_POINTS > $i) {
|
|
||||||
$SPLIT_FACTOR += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$position = 0;
|
|
||||||
$menu_data = [];
|
|
||||||
// for ($i = 1; $i <= count($menuarray); $i ++) {
|
|
||||||
foreach ($menuarray as $i => $data) {
|
|
||||||
// do that for new array
|
|
||||||
$j = $i + 1;
|
|
||||||
$menu_data[$i]['pagename'] = htmlentities($data['page_name']);
|
|
||||||
$menu_data[$i]['filename'] =
|
|
||||||
// prefix folder or host name
|
|
||||||
(isset($data['hostname']) && $data['hostname'] ?
|
|
||||||
$data['hostname'] :
|
|
||||||
''
|
|
||||||
)
|
|
||||||
// filename
|
|
||||||
. ($data['filename'] ?? '')
|
|
||||||
// query string
|
|
||||||
. (isset($data['query_string']) && $data['query_string'] ?
|
|
||||||
$data['query_string'] :
|
|
||||||
''
|
|
||||||
);
|
|
||||||
if ($j == 1 || !($i % $SPLIT_FACTOR)) {
|
|
||||||
$menu_data[$i]['splitfactor_in'] = 1;
|
|
||||||
} else {
|
|
||||||
$menu_data[$i]['splitfactor_in'] = 0;
|
|
||||||
}
|
|
||||||
// on matching, we also need to check if we are in the same folder
|
|
||||||
if (
|
|
||||||
isset($data['filename']) &&
|
|
||||||
$data['filename'] == \CoreLibs\Get\System::getPageName() &&
|
|
||||||
(!isset($data['hostname']) || (
|
|
||||||
isset($data['hostname']) &&
|
|
||||||
(!$data['hostname'] || strstr($data['hostname'], CONTENT_PATH) !== false)
|
|
||||||
))
|
|
||||||
) {
|
|
||||||
$position = $i;
|
|
||||||
$menu_data[$i]['position'] = 1;
|
|
||||||
$menu_data[$i]['popup'] = 0;
|
|
||||||
} else {
|
|
||||||
// add query stuff
|
|
||||||
// HAS TO DONE LATER ... set urlencode, etc ...
|
|
||||||
// check if popup needed
|
|
||||||
if (isset($data['popup']) && $data['popup'] == 1) {
|
|
||||||
$menu_data[$i]['popup'] = 1;
|
|
||||||
$menu_data[$i]['rand'] = uniqid((string)rand());
|
|
||||||
$menu_data[$i]['width'] = $data['popup_x'];
|
|
||||||
$menu_data[$i]['height'] = $data['popup_y'];
|
|
||||||
} else {
|
|
||||||
$menu_data[$i]['popup'] = 0;
|
|
||||||
}
|
|
||||||
$menu_data[$i]['position'] = 0;
|
|
||||||
} // highlight or not
|
|
||||||
if (!($j % $SPLIT_FACTOR) || (($j + 1) > count($menuarray))) {
|
|
||||||
$menu_data[$i]['splitfactor_out'] = 1;
|
|
||||||
} else {
|
|
||||||
$menu_data[$i]['splitfactor_out'] = 0;
|
|
||||||
}
|
|
||||||
} // for
|
|
||||||
// $form->log->debug('MENU ARRAY', $form->log->prAr($menu_data));
|
|
||||||
$DATA['menu_data'] = $menu_data;
|
|
||||||
$DATA['page_name'] = $menuarray[$position]['page_name'] ?? '-Undefined [' . $position . '] -';
|
|
||||||
$L_TITLE = $DATA['page_name'];
|
|
||||||
// html title
|
|
||||||
$HEADER['HTML_TITLE'] = $form->l->__($L_TITLE);
|
|
||||||
// END MENU
|
|
||||||
// LOAD AND NEW
|
|
||||||
$DATA['load'] = $form->formCreateLoad();
|
|
||||||
$DATA['new'] = $form->formCreateNew();
|
|
||||||
// SHOW DATA PART
|
|
||||||
if ($form->yes) {
|
|
||||||
$DATA['form_yes'] = $form->yes;
|
|
||||||
$DATA['form_my_page_name'] = $form->my_page_name;
|
|
||||||
$DATA['filename_exist'] = 0;
|
|
||||||
$DATA['drop_down_input'] = 0;
|
|
||||||
$elements = [];
|
|
||||||
// depending on the "getPageName()" I show different stuff
|
|
||||||
switch ($form->my_page_name) {
|
|
||||||
case 'edit_users':
|
|
||||||
$elements[] = $form->formCreateElement('login_error_count');
|
|
||||||
$elements[] = $form->formCreateElement('login_error_date_last');
|
|
||||||
$elements[] = $form->formCreateElement('login_error_date_first');
|
|
||||||
$elements[] = $form->formCreateElement('enabled');
|
|
||||||
$elements[] = $form->formCreateElement('deleted');
|
|
||||||
$elements[] = $form->formCreateElement('protected');
|
|
||||||
$elements[] = $form->formCreateElement('username');
|
|
||||||
$elements[] = $form->formCreateElement('password');
|
|
||||||
$elements[] = $form->formCreateElement('password_change_interval');
|
|
||||||
$elements[] = $form->formCreateElement('login_user_id');
|
|
||||||
$elements[] = $form->formCreateElement('login_user_id_set_date');
|
|
||||||
$elements[] = $form->formCreateElement('login_user_id_last_revalidate');
|
|
||||||
$elements[] = $form->formCreateElement('login_user_id_locked');
|
|
||||||
$elements[] = $form->formCreateElement('login_user_id_revalidate_after');
|
|
||||||
$elements[] = $form->formCreateElement('login_user_id_valid_from');
|
|
||||||
$elements[] = $form->formCreateElement('login_user_id_valid_until');
|
|
||||||
$elements[] = $form->formCreateElement('email');
|
|
||||||
$elements[] = $form->formCreateElement('last_name');
|
|
||||||
$elements[] = $form->formCreateElement('first_name');
|
|
||||||
$elements[] = $form->formCreateElement('edit_group_id');
|
|
||||||
$elements[] = $form->formCreateElement('edit_access_right_id');
|
|
||||||
$elements[] = $form->formCreateElement('strict');
|
|
||||||
$elements[] = $form->formCreateElement('locked');
|
|
||||||
$elements[] = $form->formCreateElement('lock_until');
|
|
||||||
$elements[] = $form->formCreateElement('lock_after');
|
|
||||||
$elements[] = $form->formCreateElement('admin');
|
|
||||||
$elements[] = $form->formCreateElement('debug');
|
|
||||||
$elements[] = $form->formCreateElement('db_debug');
|
|
||||||
$elements[] = $form->formCreateElement('edit_language_id');
|
|
||||||
$elements[] = $form->formCreateElement('edit_scheme_id');
|
|
||||||
$elements[] = $form->formCreateElementListTable('edit_access_user');
|
|
||||||
$elements[] = $form->formCreateElement('additional_acl');
|
|
||||||
break;
|
|
||||||
case 'edit_schemes':
|
|
||||||
$elements[] = $form->formCreateElement('enabled');
|
|
||||||
$elements[] = $form->formCreateElement('name');
|
|
||||||
$elements[] = $form->formCreateElement('header_color');
|
|
||||||
$elements[] = $form->formCreateElement('template');
|
|
||||||
break;
|
|
||||||
case 'edit_pages':
|
|
||||||
if (!isset($form->table_array['edit_page_id']['value'])) {
|
|
||||||
$q = "DELETE FROM temp_files";
|
|
||||||
$form->dbExec($q);
|
|
||||||
// gets all files in the current dir and dirs given ending with .php
|
|
||||||
$folders = ['../admin/', '../frontend/'];
|
|
||||||
$files = ['*.php'];
|
|
||||||
$search_glob = [];
|
|
||||||
foreach ($folders as $folder) {
|
|
||||||
// make sure this folder actually exists
|
|
||||||
if (is_dir(ROOT . $folder)) {
|
|
||||||
foreach ($files as $file) {
|
|
||||||
$search_glob[] = $folder . $file;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$crap = exec('ls ' . join(' ', $search_glob), $output, $status);
|
|
||||||
// now get all that are NOT in de DB
|
|
||||||
$q = "INSERT INTO temp_files (folder, filename) VALUES ";
|
|
||||||
$t_q = '';
|
|
||||||
foreach ($output as $output_file) {
|
|
||||||
// split the ouput into folder and file
|
|
||||||
$pathinfo = pathinfo($output_file);
|
|
||||||
if (!empty($pathinfo['dirname'])) {
|
|
||||||
$pathinfo['dirname'] .= DIRECTORY_SEPARATOR;
|
|
||||||
}
|
|
||||||
if ($t_q) {
|
|
||||||
$t_q .= ', ';
|
|
||||||
}
|
|
||||||
$t_q .= "('" . $form->dbEscapeString($pathinfo['dirname']) . "', '"
|
|
||||||
. $form->dbEscapeString($pathinfo['basename']) . "')";
|
|
||||||
}
|
|
||||||
$form->dbExec($q . $t_q, 'NULL');
|
|
||||||
$elements[] = $form->formCreateElement('filename');
|
|
||||||
} else {
|
|
||||||
// show file menu
|
|
||||||
// just show name of file ...
|
|
||||||
$DATA['filename_exist'] = 1;
|
|
||||||
$DATA['filename'] = $form->table_array['filename']['value'];
|
|
||||||
} // File Name View IF
|
|
||||||
$elements[] = $form->formCreateElement('hostname');
|
|
||||||
$elements[] = $form->formCreateElement('name');
|
|
||||||
// $elements[] = $form->formCreateElement('tag');
|
|
||||||
// $elements[] = $form->formCreateElement('min_acl');
|
|
||||||
$elements[] = $form->formCreateElement('order_number');
|
|
||||||
$elements[] = $form->formCreateElement('online');
|
|
||||||
$elements[] = $form->formCreateElement('menu');
|
|
||||||
$elements[] = $form->formCreateElementListTable('edit_query_string');
|
|
||||||
$elements[] = $form->formCreateElement('content_alias_edit_page_id');
|
|
||||||
$elements[] = $form->formCreateElementListTable('edit_page_content');
|
|
||||||
$elements[] = $form->formCreateElement('popup');
|
|
||||||
$elements[] = $form->formCreateElement('popup_x');
|
|
||||||
$elements[] = $form->formCreateElement('popup_y');
|
|
||||||
$elements[] = $form->formCreateElementReferenceTable('edit_visible_group');
|
|
||||||
$elements[] = $form->formCreateElementReferenceTable('edit_menu_group');
|
|
||||||
break;
|
|
||||||
case 'edit_languages':
|
|
||||||
$elements[] = $form->formCreateElement('enabled');
|
|
||||||
$elements[] = $form->formCreateElement('short_name');
|
|
||||||
$elements[] = $form->formCreateElement('long_name');
|
|
||||||
$elements[] = $form->formCreateElement('iso_name');
|
|
||||||
break;
|
|
||||||
case 'edit_groups':
|
|
||||||
$elements[] = $form->formCreateElement('enabled');
|
|
||||||
$elements[] = $form->formCreateElement('name');
|
|
||||||
$elements[] = $form->formCreateElement('edit_access_right_id');
|
|
||||||
$elements[] = $form->formCreateElement('edit_scheme_id');
|
|
||||||
$elements[] = $form->formCreateElementListTable('edit_page_access');
|
|
||||||
$elements[] = $form->formCreateElement('additional_acl');
|
|
||||||
break;
|
|
||||||
case 'edit_visible_group':
|
|
||||||
$elements[] = $form->formCreateElement('name');
|
|
||||||
$elements[] = $form->formCreateElement('flag');
|
|
||||||
break;
|
|
||||||
case 'edit_menu_group':
|
|
||||||
$elements[] = $form->formCreateElement('name');
|
|
||||||
$elements[] = $form->formCreateElement('flag');
|
|
||||||
$elements[] = $form->formCreateElement('order_number');
|
|
||||||
break;
|
|
||||||
case 'edit_access':
|
|
||||||
$elements[] = $form->formCreateElement('name');
|
|
||||||
$elements[] = $form->formCreateElement('enabled');
|
|
||||||
$elements[] = $form->formCreateElement('protected');
|
|
||||||
$elements[] = $form->formCreateElement('color');
|
|
||||||
$elements[] = $form->formCreateElement('description');
|
|
||||||
// add name/value list here
|
|
||||||
$elements[] = $form->formCreateElementListTable('edit_access_data');
|
|
||||||
$elements[] = $form->formCreateElement('additional_acl');
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
print '[No valid page definition given]';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// $form->log->debug('edit', "Elements: <pre>".$form->log->prAr($elements));
|
|
||||||
$DATA['elements'] = $elements;
|
|
||||||
$DATA['hidden'] = $form->formCreateHiddenFields();
|
|
||||||
$DATA['save_delete'] = $form->formCreateSaveDelete();
|
|
||||||
} else {
|
|
||||||
$DATA['form_yes'] = 0;
|
|
||||||
}
|
|
||||||
$EDIT_TEMPLATE = 'edit_body.tpl';
|
|
||||||
}
|
|
||||||
|
|
||||||
// debug data, if DEBUG flag is on, this data is print out
|
|
||||||
$DEBUG_DATA['DEBUG'] = $DEBUG_TMPL ?? '';
|
|
||||||
|
|
||||||
// create main data array
|
|
||||||
$CONTENT_DATA = array_merge($HEADER, $DATA, $DEBUG_DATA);
|
|
||||||
// data is 1:1 mapping (all vars, values, etc)
|
|
||||||
foreach ($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($EDIT_TEMPLATE, 'editAdmin_' . $smarty->lang, 'editAdmin_' . $smarty->lang);
|
|
||||||
|
|
||||||
// debug output
|
|
||||||
echo $login->log->printErrorMsg();
|
|
||||||
echo $form->log->printErrorMsg();
|
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
@@ -5,35 +5,36 @@ declare(strict_types=1);
|
|||||||
$edit_access = [
|
$edit_access = [
|
||||||
'table_array' => [
|
'table_array' => [
|
||||||
'edit_access_id' => [
|
'edit_access_id' => [
|
||||||
'value' => $GLOBALS['edit_access_id'] ?? '',
|
'value' => $_POST['edit_access_id'] ?? '',
|
||||||
'type' => 'hidden',
|
'type' => 'hidden',
|
||||||
'pk' => 1
|
'pk' => 1
|
||||||
],
|
],
|
||||||
'name' => [
|
'name' => [
|
||||||
'value' => $GLOBALS['name'] ?? '',
|
'value' => $_POST['name'] ?? '',
|
||||||
'output_name' => 'Access Group Name',
|
'output_name' => 'Access Group Name',
|
||||||
'mandatory' => 1,
|
'mandatory' => 1,
|
||||||
'type' => 'text',
|
'type' => 'text',
|
||||||
'error_check' => 'alphanumericspace|unique'
|
'error_check' => 'alphanumericspace|unique'
|
||||||
],
|
],
|
||||||
'description' => [
|
'description' => [
|
||||||
'value' => $GLOBALS['description'] ?? '',
|
'value' => $_POST['description'] ?? '',
|
||||||
'output_name' => 'Description',
|
'output_name' => 'Description',
|
||||||
'type' => 'textarea'
|
'type' => 'textarea'
|
||||||
],
|
],
|
||||||
'color' => [
|
'color' => [
|
||||||
'value' => $GLOBALS['color'] ?? '',
|
'value' => $_POST['color'] ?? '',
|
||||||
'output_name' => 'Color',
|
'output_name' => 'Color',
|
||||||
'mandatory' => 0,
|
'mandatory' => 0,
|
||||||
'type' => 'text',
|
'type' => 'text',
|
||||||
'size' => 6,
|
'size' => 10,
|
||||||
'length' => 6,
|
'length' => 9,
|
||||||
'error_check' => 'custom',
|
'error_check' => 'custom',
|
||||||
'error_regex' => "/[\dA-Fa-f]{6}/",
|
// FIXME: update regex check for hex/rgb/hsl with color check class
|
||||||
'error_example' => 'F6A544'
|
'error_regex' => '/^#([\dA-Fa-f]{6}|[\dA-Fa-f]{8})$/',
|
||||||
|
'error_example' => '#F6A544'
|
||||||
],
|
],
|
||||||
'enabled' => [
|
'enabled' => [
|
||||||
'value' => $GLOBALS['enabled'] ?? 0,
|
'value' => $_POST['enabled'] ?? 0,
|
||||||
'output_name' => 'Enabled',
|
'output_name' => 'Enabled',
|
||||||
'type' => 'binary',
|
'type' => 'binary',
|
||||||
'int' => 1, // OR 'bool' => 1
|
'int' => 1, // OR 'bool' => 1
|
||||||
@@ -43,7 +44,7 @@ $edit_access = [
|
|||||||
],
|
],
|
||||||
],
|
],
|
||||||
'protected' => [
|
'protected' => [
|
||||||
'value' => $GLOBALS['protected'] ?? 0,
|
'value' => $_POST['protected'] ?? 0,
|
||||||
'output_name' => 'Protected',
|
'output_name' => 'Protected',
|
||||||
'type' => 'binary',
|
'type' => 'binary',
|
||||||
'int' => 1,
|
'int' => 1,
|
||||||
@@ -53,7 +54,7 @@ $edit_access = [
|
|||||||
],
|
],
|
||||||
],
|
],
|
||||||
'additional_acl' => [
|
'additional_acl' => [
|
||||||
'value' => $GLOBALS['additional_acl'] ?? '',
|
'value' => $_POST['additional_acl'] ?? '',
|
||||||
'output_name' => 'Additional ACL (as JSON)',
|
'output_name' => 'Additional ACL (as JSON)',
|
||||||
'type' => 'textarea',
|
'type' => 'textarea',
|
||||||
'error_check' => 'json',
|
'error_check' => 'json',
|
||||||
|
|||||||
@@ -5,12 +5,12 @@ declare(strict_types=1);
|
|||||||
$edit_groups = [
|
$edit_groups = [
|
||||||
'table_array' => [
|
'table_array' => [
|
||||||
'edit_group_id' => [
|
'edit_group_id' => [
|
||||||
'value' => $GLOBALS['edit_group_id'] ?? '',
|
'value' => $_POST['edit_group_id'] ?? '',
|
||||||
'pk' => 1,
|
'pk' => 1,
|
||||||
'type' => 'hidden'
|
'type' => 'hidden'
|
||||||
],
|
],
|
||||||
'enabled' => [
|
'enabled' => [
|
||||||
'value' => $GLOBALS['enabled'] ?? '',
|
'value' => $_POST['enabled'] ?? '',
|
||||||
'output_name' => 'Enabled',
|
'output_name' => 'Enabled',
|
||||||
'int' => 1,
|
'int' => 1,
|
||||||
'type' => 'binary',
|
'type' => 'binary',
|
||||||
@@ -20,13 +20,13 @@ $edit_groups = [
|
|||||||
],
|
],
|
||||||
],
|
],
|
||||||
'name' => [
|
'name' => [
|
||||||
'value' => $GLOBALS['name'] ?? '',
|
'value' => $_POST['name'] ?? '',
|
||||||
'output_name' => 'Group Name',
|
'output_name' => 'Group Name',
|
||||||
'type' => 'text',
|
'type' => 'text',
|
||||||
'mandatory' => 1
|
'mandatory' => 1
|
||||||
],
|
],
|
||||||
'edit_access_right_id' => [
|
'edit_access_right_id' => [
|
||||||
'value' => $GLOBALS['edit_access_right_id'] ?? '',
|
'value' => $_POST['edit_access_right_id'] ?? '',
|
||||||
'output_name' => 'Group Level',
|
'output_name' => 'Group Level',
|
||||||
'mandatory' => 1,
|
'mandatory' => 1,
|
||||||
'int' => 1,
|
'int' => 1,
|
||||||
@@ -34,14 +34,14 @@ $edit_groups = [
|
|||||||
'query' => "SELECT edit_access_right_id, name FROM edit_access_right ORDER BY level"
|
'query' => "SELECT edit_access_right_id, name FROM edit_access_right ORDER BY level"
|
||||||
],
|
],
|
||||||
'edit_scheme_id' => [
|
'edit_scheme_id' => [
|
||||||
'value' => $GLOBALS['edit_scheme_id'] ?? '',
|
'value' => $_POST['edit_scheme_id'] ?? '',
|
||||||
'output_name' => 'Group Scheme',
|
'output_name' => 'Group Scheme',
|
||||||
'int_null' => 1,
|
'int_null' => 1,
|
||||||
'type' => 'drop_down_db',
|
'type' => 'drop_down_db',
|
||||||
'query' => "SELECT edit_scheme_id, name FROM edit_scheme WHERE enabled = 1 ORDER BY name"
|
'query' => "SELECT edit_scheme_id, name FROM edit_scheme WHERE enabled = 1 ORDER BY name"
|
||||||
],
|
],
|
||||||
'additional_acl' => [
|
'additional_acl' => [
|
||||||
'value' => $GLOBALS['additional_acl'] ?? '',
|
'value' => $_POST['additional_acl'] ?? '',
|
||||||
'output_name' => 'Additional ACL (as JSON)',
|
'output_name' => 'Additional ACL (as JSON)',
|
||||||
'type' => 'textarea',
|
'type' => 'textarea',
|
||||||
'error_check' => 'json',
|
'error_check' => 'json',
|
||||||
|
|||||||
@@ -5,12 +5,12 @@ declare(strict_types=1);
|
|||||||
$edit_languages = [
|
$edit_languages = [
|
||||||
'table_array' => [
|
'table_array' => [
|
||||||
'edit_language_id' => [
|
'edit_language_id' => [
|
||||||
'value' => $GLOBALS['edit_language_id'] ?? '',
|
'value' => $_POST['edit_language_id'] ?? '',
|
||||||
'type' => 'hidden',
|
'type' => 'hidden',
|
||||||
'pk' => 1
|
'pk' => 1
|
||||||
],
|
],
|
||||||
'short_name' => [
|
'short_name' => [
|
||||||
'value' => $GLOBALS['short_name'] ?? '',
|
'value' => $_POST['short_name'] ?? '',
|
||||||
'output_name' => 'Language (short)',
|
'output_name' => 'Language (short)',
|
||||||
'mandatory' => 1,
|
'mandatory' => 1,
|
||||||
'type' => 'text',
|
'type' => 'text',
|
||||||
@@ -18,25 +18,25 @@ $edit_languages = [
|
|||||||
'length' => 2
|
'length' => 2
|
||||||
],
|
],
|
||||||
'long_name' => [
|
'long_name' => [
|
||||||
'value' => $GLOBALS['long_name'] ?? '',
|
'value' => $_POST['long_name'] ?? '',
|
||||||
'output_name' => 'Language (long)',
|
'output_name' => 'Language (long)',
|
||||||
'mandatory' => 1,
|
'mandatory' => 1,
|
||||||
'type' => 'text',
|
'type' => 'text',
|
||||||
'size' => 40
|
'size' => 40
|
||||||
],
|
],
|
||||||
'iso_name' => [
|
'iso_name' => [
|
||||||
'value' => $GLOBALS['iso_name'] ?? '',
|
'value' => $_POST['iso_name'] ?? '',
|
||||||
'output_name' => 'ISO Code',
|
'output_name' => 'ISO Code',
|
||||||
'mandatory' => 1,
|
'mandatory' => 1,
|
||||||
'type' => 'text'
|
'type' => 'text'
|
||||||
],
|
],
|
||||||
'order_number' => [
|
'order_number' => [
|
||||||
'value' => $GLOBALS['order_number'] ?? '',
|
'value' => $_POST['order_number'] ?? '',
|
||||||
'int' => 1,
|
'int' => 1,
|
||||||
'order' => 1
|
'order' => 1
|
||||||
],
|
],
|
||||||
'enabled' => [
|
'enabled' => [
|
||||||
'value' => $GLOBALS['enabled'] ?? '',
|
'value' => $_POST['enabled'] ?? '',
|
||||||
'output_name' => 'Enabled',
|
'output_name' => 'Enabled',
|
||||||
'int' => 1,
|
'int' => 1,
|
||||||
'type' => 'binary',
|
'type' => 'binary',
|
||||||
@@ -46,7 +46,7 @@ $edit_languages = [
|
|||||||
],
|
],
|
||||||
],
|
],
|
||||||
'lang_default' => [
|
'lang_default' => [
|
||||||
'value' => $GLOBALS['lang_default'] ?? '',
|
'value' => $_POST['lang_default'] ?? '',
|
||||||
'output_name' => 'Default Language',
|
'output_name' => 'Default Language',
|
||||||
'int' => 1,
|
'int' => 1,
|
||||||
'type' => 'binary',
|
'type' => 'binary',
|
||||||
|
|||||||
@@ -5,25 +5,25 @@ declare(strict_types=1);
|
|||||||
$edit_menu_group = [
|
$edit_menu_group = [
|
||||||
'table_array' => [
|
'table_array' => [
|
||||||
'edit_menu_group_id' => [
|
'edit_menu_group_id' => [
|
||||||
'value' => $GLOBALS['edit_menu_group_id'] ?? '',
|
'value' => $_POST['edit_menu_group_id'] ?? '',
|
||||||
'type' => 'hidden',
|
'type' => 'hidden',
|
||||||
'pk' => 1
|
'pk' => 1
|
||||||
],
|
],
|
||||||
'name' => [
|
'name' => [
|
||||||
'value' => $GLOBALS['name'] ?? '',
|
'value' => $_POST['name'] ?? '',
|
||||||
'output_name' => 'Group name',
|
'output_name' => 'Group name',
|
||||||
'mandatory' => 1,
|
'mandatory' => 1,
|
||||||
'type' => 'text'
|
'type' => 'text'
|
||||||
],
|
],
|
||||||
'flag' => [
|
'flag' => [
|
||||||
'value' => $GLOBALS['flag'] ?? '',
|
'value' => $_POST['flag'] ?? '',
|
||||||
'output_name' => 'Flag',
|
'output_name' => 'Flag',
|
||||||
'mandatory' => 1,
|
'mandatory' => 1,
|
||||||
'type' => 'text',
|
'type' => 'text',
|
||||||
'error_check' => 'alphanumeric|unique'
|
'error_check' => 'alphanumeric|unique'
|
||||||
],
|
],
|
||||||
'order_number' => [
|
'order_number' => [
|
||||||
'value' => $GLOBALS['order_number'] ?? '',
|
'value' => $_POST['order_number'] ?? '',
|
||||||
'output_name' => 'Group order',
|
'output_name' => 'Group order',
|
||||||
'type' => 'order',
|
'type' => 'order',
|
||||||
'int' => 1,
|
'int' => 1,
|
||||||
|
|||||||
@@ -5,40 +5,41 @@ declare(strict_types=1);
|
|||||||
$edit_pages = [
|
$edit_pages = [
|
||||||
'table_array' => [
|
'table_array' => [
|
||||||
'edit_page_id' => [
|
'edit_page_id' => [
|
||||||
'value' => $GLOBALS['edit_page_id'] ?? '',
|
'value' => $_POST['edit_page_id'] ?? '',
|
||||||
'type' => 'hidden',
|
'type' => 'hidden',
|
||||||
'pk' => 1
|
'pk' => 1
|
||||||
],
|
],
|
||||||
'filename' => [
|
'filename' => [
|
||||||
'value' => $GLOBALS['filename'] ?? '',
|
'value' => $_POST['filename'] ?? '',
|
||||||
'output_name' => 'Add File ...',
|
'output_name' => 'Add File ...',
|
||||||
'mandatory' => 1,
|
'mandatory' => 1,
|
||||||
'type' => 'drop_down_db',
|
'type' => 'drop_down_db',
|
||||||
'query' => "SELECT DISTINCT temp_files.filename AS id, temp_files.folder || temp_files.filename AS name "
|
'query' => "SELECT DISTINCT temp_files.filename AS id, "
|
||||||
|
. "temp_files.folder || temp_files.filename AS name "
|
||||||
. "FROM temp_files "
|
. "FROM temp_files "
|
||||||
. "LEFT JOIN edit_page ep ON temp_files.filename = ep.filename "
|
. "LEFT JOIN edit_page ep ON temp_files.filename = ep.filename "
|
||||||
. "WHERE ep.filename IS NULL"
|
. "WHERE ep.filename IS NULL"
|
||||||
],
|
],
|
||||||
'hostname' => [
|
'hostname' => [
|
||||||
'value' => $GLOBALS['hostname'] ?? '',
|
'value' => $_POST['hostname'] ?? '',
|
||||||
'output_name' => 'Hostname or folder',
|
'output_name' => 'Hostname or folder',
|
||||||
'type' => 'text'
|
'type' => 'text'
|
||||||
],
|
],
|
||||||
'name' => [
|
'name' => [
|
||||||
'value' => $GLOBALS['name'] ?? '',
|
'value' => $_POST['name'] ?? '',
|
||||||
'output_name' => 'Page name',
|
'output_name' => 'Page name',
|
||||||
'mandatory' => 1,
|
'mandatory' => 1,
|
||||||
'type' => 'text'
|
'type' => 'text'
|
||||||
],
|
],
|
||||||
'order_number' => [
|
'order_number' => [
|
||||||
'value' => $GLOBALS['order_number'] ?? '',
|
'value' => $_POST['order_number'] ?? '',
|
||||||
'output_name' => 'Page order',
|
'output_name' => 'Page order',
|
||||||
'type' => 'order',
|
'type' => 'order',
|
||||||
'int' => 1,
|
'int' => 1,
|
||||||
'order' => 1
|
'order' => 1
|
||||||
],
|
],
|
||||||
/* 'flag' => [
|
/* 'flag' => [
|
||||||
'value' => isset($GLOBALS['flag']) ? $GLOBALS['flag'] : '',
|
'value' => $_POST['flag']) ?? '',
|
||||||
'output_name' => 'Page Flag',
|
'output_name' => 'Page Flag',
|
||||||
'type' => 'drop_down_array',
|
'type' => 'drop_down_array',
|
||||||
'query' => [
|
'query' => [
|
||||||
@@ -51,7 +52,7 @@ $edit_pages = [
|
|||||||
],
|
],
|
||||||
],*/
|
],*/
|
||||||
'online' => [
|
'online' => [
|
||||||
'value' => $GLOBALS['online'] ?? '',
|
'value' => $_POST['online'] ?? '',
|
||||||
'output_name' => 'Online',
|
'output_name' => 'Online',
|
||||||
'int' => 1,
|
'int' => 1,
|
||||||
'type' => 'binary',
|
'type' => 'binary',
|
||||||
@@ -61,7 +62,7 @@ $edit_pages = [
|
|||||||
],
|
],
|
||||||
],
|
],
|
||||||
'menu' => [
|
'menu' => [
|
||||||
'value' => $GLOBALS['menu'] ?? '',
|
'value' => $_POST['menu'] ?? '',
|
||||||
'output_name' => 'Menu',
|
'output_name' => 'Menu',
|
||||||
'int' => 1,
|
'int' => 1,
|
||||||
'type' => 'binary',
|
'type' => 'binary',
|
||||||
@@ -71,7 +72,7 @@ $edit_pages = [
|
|||||||
],
|
],
|
||||||
],
|
],
|
||||||
'popup' => [
|
'popup' => [
|
||||||
'value' => $GLOBALS['popup'] ?? '',
|
'value' => $_POST['popup'] ?? '',
|
||||||
'output_name' => 'Popup',
|
'output_name' => 'Popup',
|
||||||
'int' => 1,
|
'int' => 1,
|
||||||
'type' => 'binary',
|
'type' => 'binary',
|
||||||
@@ -81,7 +82,7 @@ $edit_pages = [
|
|||||||
],
|
],
|
||||||
],
|
],
|
||||||
'popup_x' => [
|
'popup_x' => [
|
||||||
'value' => $GLOBALS['popup_x'] ?? '',
|
'value' => $_POST['popup_x'] ?? '',
|
||||||
'output_name' => 'Popup Width',
|
'output_name' => 'Popup Width',
|
||||||
'int_null' => 1,
|
'int_null' => 1,
|
||||||
'type' => 'text',
|
'type' => 'text',
|
||||||
@@ -89,7 +90,7 @@ $edit_pages = [
|
|||||||
'length' => 4
|
'length' => 4
|
||||||
],
|
],
|
||||||
'popup_y' => [
|
'popup_y' => [
|
||||||
'value' => $GLOBALS['popup_y'] ?? '',
|
'value' => $_POST['popup_y'] ?? '',
|
||||||
'output_name' => 'Popup Height',
|
'output_name' => 'Popup Height',
|
||||||
'int_null' => 1,
|
'int_null' => 1,
|
||||||
'type' => 'text',
|
'type' => 'text',
|
||||||
@@ -97,7 +98,7 @@ $edit_pages = [
|
|||||||
'length' => 4
|
'length' => 4
|
||||||
],
|
],
|
||||||
'content_alias_edit_page_id' => [
|
'content_alias_edit_page_id' => [
|
||||||
'value' => $GLOBALS['content_alias_edit_page_id'] ?? '',
|
'value' => $_POST['content_alias_edit_page_id'] ?? '',
|
||||||
'output_name' => 'Content Alias Source',
|
'output_name' => 'Content Alias Source',
|
||||||
'int_null' => 1,
|
'int_null' => 1,
|
||||||
'type' => 'drop_down_db',
|
'type' => 'drop_down_db',
|
||||||
@@ -110,7 +111,7 @@ $edit_pages = [
|
|||||||
'order_by' => 'order_number'
|
'order_by' => 'order_number'
|
||||||
// 'query' => "SELECT edit_page_id AS content_alias_edit_page_id, name ".
|
// 'query' => "SELECT edit_page_id AS content_alias_edit_page_id, name ".
|
||||||
// "FROM edit_page ".
|
// "FROM edit_page ".
|
||||||
// (isset($GLOBALS['edit_page_id']) ? " WHERE edit_page_id <> ".$GLOBALS['edit_page_id'] : "")." ".
|
// (!empty($_POST['edit_page_id']) ? " WHERE edit_page_id <> ".$_POST['edit_page_id'] : "")." ".
|
||||||
// "ORDER BY order_number"
|
// "ORDER BY order_number"
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
@@ -151,7 +152,7 @@ $edit_pages = [
|
|||||||
'output_name' => 'Visible Groups (access)',
|
'output_name' => 'Visible Groups (access)',
|
||||||
'mandatory' => 1,
|
'mandatory' => 1,
|
||||||
'select_size' => 10,
|
'select_size' => 10,
|
||||||
'selected' => $GLOBALS['edit_visible_group_id'] ?? '',
|
'selected' => $_POST['edit_visible_group_id'] ?? '',
|
||||||
'query' => "SELECT edit_visible_group_id, 'Name: ' || name || ', ' || 'Flag: ' || flag "
|
'query' => "SELECT edit_visible_group_id, 'Name: ' || name || ', ' || 'Flag: ' || flag "
|
||||||
. "FROM edit_visible_group ORDER BY name"
|
. "FROM edit_visible_group ORDER BY name"
|
||||||
],
|
],
|
||||||
@@ -161,7 +162,7 @@ $edit_pages = [
|
|||||||
'output_name' => 'Menu Groups (grouping)',
|
'output_name' => 'Menu Groups (grouping)',
|
||||||
'mandatory' => 1,
|
'mandatory' => 1,
|
||||||
'select_size' => 10,
|
'select_size' => 10,
|
||||||
'selected' => $GLOBALS['edit_menu_group_id'] ?? '',
|
'selected' => $_POST['edit_menu_group_id'] ?? '',
|
||||||
'query' => "SELECT edit_menu_group_id, 'Name: ' || name || ', ' || 'Flag: ' || flag "
|
'query' => "SELECT edit_menu_group_id, 'Name: ' || name || ', ' || 'Flag: ' || flag "
|
||||||
. "FROM edit_menu_group ORDER BY order_number"
|
. "FROM edit_menu_group ORDER BY order_number"
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -5,29 +5,30 @@ declare(strict_types=1);
|
|||||||
$edit_schemes = [
|
$edit_schemes = [
|
||||||
'table_array' => [
|
'table_array' => [
|
||||||
'edit_scheme_id' => [
|
'edit_scheme_id' => [
|
||||||
'value' => $GLOBALS['edit_scheme_id'] ?? '',
|
'value' => $_POST['edit_scheme_id'] ?? '',
|
||||||
'type' => 'hidden',
|
'type' => 'hidden',
|
||||||
'pk' => 1
|
'pk' => 1
|
||||||
],
|
],
|
||||||
'name' => [
|
'name' => [
|
||||||
'value' => $GLOBALS['name'] ?? '',
|
'value' => $_POST['name'] ?? '',
|
||||||
'output_name' => 'Scheme Name',
|
'output_name' => 'Scheme Name',
|
||||||
'mandatory' => 1,
|
'mandatory' => 1,
|
||||||
'type' => 'text'
|
'type' => 'text'
|
||||||
],
|
],
|
||||||
'header_color' => [
|
'header_color' => [
|
||||||
'value' => $GLOBALS['header_color'] ?? '',
|
'value' => $_POST['header_color'] ?? '',
|
||||||
'output_name' => 'Header Color',
|
'output_name' => 'Header Color',
|
||||||
'mandatory' => 1,
|
'mandatory' => 1,
|
||||||
'type' => 'text',
|
'type' => 'text',
|
||||||
'size' => 6,
|
'size' => 10,
|
||||||
'length' => 6,
|
'length' => 9,
|
||||||
'error_check' => 'custom',
|
'error_check' => 'custom',
|
||||||
'error_regex' => '/[\dA-Fa-f]{6}/',
|
// FIXME: update regex check for hex/rgb/hsl with color check class
|
||||||
'error_example' => 'F6A544'
|
'error_regex' => '/^#([\dA-Fa-f]{6}|[\dA-Fa-f]{8})$/',
|
||||||
|
'error_example' => '#F6A544'
|
||||||
],
|
],
|
||||||
'enabled' => [
|
'enabled' => [
|
||||||
'value' => $GLOBALS['enabled'] ?? '',
|
'value' => $_POST['enabled'] ?? '',
|
||||||
'output_name' => 'Enabled',
|
'output_name' => 'Enabled',
|
||||||
'int' => 1,
|
'int' => 1,
|
||||||
'type' => 'binary',
|
'type' => 'binary',
|
||||||
@@ -37,7 +38,7 @@ $edit_schemes = [
|
|||||||
],
|
],
|
||||||
],
|
],
|
||||||
'template' => [
|
'template' => [
|
||||||
'value' => $GLOBALS['template'] ?? '',
|
'value' => $_POST['template'] ?? '',
|
||||||
'output_name' => 'Template',
|
'output_name' => 'Template',
|
||||||
'type' => 'text'
|
'type' => 'text'
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -1,26 +1,32 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
/** @var \CoreLibs\Output\Form\Generate $this */
|
||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
$edit_users = [
|
$edit_users = [
|
||||||
'table_array' => [
|
'table_array' => [
|
||||||
'edit_user_id' => [
|
'edit_user_id' => [
|
||||||
'value' => $GLOBALS['edit_user_id'] ?? '',
|
'value' => $_POST['edit_user_id'] ?? '',
|
||||||
'type' => 'hidden',
|
'type' => 'hidden',
|
||||||
'pk' => 1,
|
'pk' => 1,
|
||||||
'int' => 1
|
'int' => 1
|
||||||
],
|
],
|
||||||
'username' => [
|
'username' => [
|
||||||
'value' => $GLOBALS['username'] ?? '',
|
'value' => $_POST['username'] ?? '',
|
||||||
'output_name' => 'Username',
|
'output_name' => 'Username',
|
||||||
'mandatory' => 1,
|
'mandatory' => 1,
|
||||||
'error_check' => 'unique|alphanumericextended',
|
'error_check' => 'unique|alphanumericextended',
|
||||||
'type' => 'text'
|
'type' => 'text',
|
||||||
|
// if not min_edit_acl only read
|
||||||
|
// if not min_show_acl not visible
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '-1',
|
||||||
],
|
],
|
||||||
'password' => [
|
'password' => [
|
||||||
'value' => $GLOBALS['password'] ?? '',
|
'value' => $_POST['password'] ?? '',
|
||||||
'HIDDEN_value' => $GLOBALS['HIDDEN_password'] ?? '',
|
'HIDDEN_value' => $_POST['HIDDEN_password'] ?? '',
|
||||||
'CONFIRM_value' => $GLOBALS['CONFIRM_password'] ?? '',
|
'CONFIRM_value' => $_POST['CONFIRM_password'] ?? '',
|
||||||
'output_name' => 'Password',
|
'output_name' => 'Password',
|
||||||
'mandatory' => 1,
|
'mandatory' => 1,
|
||||||
'type' => 'password', // later has to be password for encryption in database
|
'type' => 'password', // later has to be password for encryption in database
|
||||||
@@ -30,21 +36,25 @@ $edit_users = [
|
|||||||
'value' => 'NOW()' // value [todo: complex reference
|
'value' => 'NOW()' // value [todo: complex reference
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
// password date when first insert and password is set, needs special field with connection to password
|
// password date when first insert and password is set, needs special field with connection to password
|
||||||
// password reset force interval, if set, user needs to reset password after X time period
|
// password reset force interval, if set, user needs to reset password after X time period
|
||||||
'password_change_interval' => [
|
'password_change_interval' => [
|
||||||
'value' => $GLOBALS['password_change_interval'] ?? '',
|
'value' => $_POST['password_change_interval'] ?? '',
|
||||||
'output_name' => 'Password change interval',
|
'output_name' => 'Password change interval',
|
||||||
// can be any date length format. n Y/M/D [not H/M/S], only one set, no combination
|
// can be any date length format. n Y/M/D [not H/M/S], only one set, no combination
|
||||||
'error_check' => 'intervalshort',
|
'error_check' => 'intervalshort',
|
||||||
'type' => 'text',
|
'type' => 'text',
|
||||||
'interval' => 1, // interval needs NULL write for empty
|
'interval' => 1, // interval needs NULL write for empty
|
||||||
'size' => 5, // make it 5 chars long
|
'size' => 5, // make it 5 chars long
|
||||||
'length' => 5
|
'length' => 5,
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
'enabled' => [
|
'enabled' => [
|
||||||
'value' => $GLOBALS['enabled'] ?? '',
|
'value' => $_POST['enabled'] ?? '',
|
||||||
'output_name' => 'Enabled',
|
'output_name' => 'Enabled',
|
||||||
'type' => 'binary',
|
'type' => 'binary',
|
||||||
'int' => 1,
|
'int' => 1,
|
||||||
@@ -52,9 +62,11 @@ $edit_users = [
|
|||||||
'1' => 'Yes',
|
'1' => 'Yes',
|
||||||
'0' => 'No'
|
'0' => 'No'
|
||||||
],
|
],
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '-1',
|
||||||
],
|
],
|
||||||
'deleted' => [
|
'deleted' => [
|
||||||
'value' => $GLOBALS['deleted'] ?? '',
|
'value' => $_POST['deleted'] ?? '',
|
||||||
'output_name' => 'Deleted',
|
'output_name' => 'Deleted',
|
||||||
'type' => 'binary',
|
'type' => 'binary',
|
||||||
'int' => 1,
|
'int' => 1,
|
||||||
@@ -62,9 +74,11 @@ $edit_users = [
|
|||||||
'1' => 'Yes',
|
'1' => 'Yes',
|
||||||
'0' => 'No'
|
'0' => 'No'
|
||||||
],
|
],
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
'strict' => [
|
'strict' => [
|
||||||
'value' => $GLOBALS['strict'] ?? '',
|
'value' => $_POST['strict'] ?? '',
|
||||||
'output_name' => 'Strict (Lock after errors)',
|
'output_name' => 'Strict (Lock after errors)',
|
||||||
'type' => 'binary',
|
'type' => 'binary',
|
||||||
'int' => 1,
|
'int' => 1,
|
||||||
@@ -72,9 +86,11 @@ $edit_users = [
|
|||||||
'1' => 'Yes',
|
'1' => 'Yes',
|
||||||
'0' => 'No'
|
'0' => 'No'
|
||||||
],
|
],
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
'locked' => [
|
'locked' => [
|
||||||
'value' => $GLOBALS['locked'] ?? '',
|
'value' => $_POST['locked'] ?? '',
|
||||||
'output_name' => 'Locked (auto set if strict with errors)',
|
'output_name' => 'Locked (auto set if strict with errors)',
|
||||||
'type' => 'binary',
|
'type' => 'binary',
|
||||||
'int' => 1,
|
'int' => 1,
|
||||||
@@ -82,9 +98,11 @@ $edit_users = [
|
|||||||
'1' => 'Yes',
|
'1' => 'Yes',
|
||||||
'0' => 'No'
|
'0' => 'No'
|
||||||
],
|
],
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
'admin' => [
|
'admin' => [
|
||||||
'value' => $GLOBALS['admin'] ?? '',
|
'value' => $_POST['admin'] ?? '',
|
||||||
'output_name' => 'Admin',
|
'output_name' => 'Admin',
|
||||||
'type' => 'binary',
|
'type' => 'binary',
|
||||||
'int' => 1,
|
'int' => 1,
|
||||||
@@ -92,9 +110,11 @@ $edit_users = [
|
|||||||
'1' => 'Yes',
|
'1' => 'Yes',
|
||||||
'0' => 'No'
|
'0' => 'No'
|
||||||
],
|
],
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
'debug' => [
|
'debug' => [
|
||||||
'value' => $GLOBALS['debug'] ?? '',
|
'value' => $_POST['debug'] ?? '',
|
||||||
'output_name' => 'Debug',
|
'output_name' => 'Debug',
|
||||||
'type' => 'binary',
|
'type' => 'binary',
|
||||||
'int' => 1,
|
'int' => 1,
|
||||||
@@ -102,9 +122,11 @@ $edit_users = [
|
|||||||
'1' => 'Yes',
|
'1' => 'Yes',
|
||||||
'0' => 'No'
|
'0' => 'No'
|
||||||
],
|
],
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
'db_debug' => [
|
'db_debug' => [
|
||||||
'value' => $GLOBALS['db_debug'] ?? '',
|
'value' => $_POST['db_debug'] ?? '',
|
||||||
'output_name' => 'DB Debug',
|
'output_name' => 'DB Debug',
|
||||||
'type' => 'binary',
|
'type' => 'binary',
|
||||||
'int' => 1,
|
'int' => 1,
|
||||||
@@ -112,61 +134,75 @@ $edit_users = [
|
|||||||
'1' => 'Yes',
|
'1' => 'Yes',
|
||||||
'0' => 'No'
|
'0' => 'No'
|
||||||
],
|
],
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
'email' => [
|
'email' => [
|
||||||
'value' => $GLOBALS['email'] ?? '',
|
'value' => $_POST['email'] ?? '',
|
||||||
'output_name' => 'E-Mail',
|
'output_name' => 'E-Mail',
|
||||||
'type' => 'text',
|
'type' => 'text',
|
||||||
'error_check' => 'email'
|
'error_check' => 'email',
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
'last_name' => [
|
'last_name' => [
|
||||||
'value' => $GLOBALS['last_name'] ?? '',
|
'value' => $_POST['last_name'] ?? '',
|
||||||
'output_name' => 'Last Name',
|
'output_name' => 'Last Name',
|
||||||
'type' => 'text'
|
'type' => 'text',
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
'first_name' => [
|
'first_name' => [
|
||||||
'value' => $GLOBALS['first_name'] ?? '',
|
'value' => $_POST['first_name'] ?? '',
|
||||||
'output_name' => 'First Name',
|
'output_name' => 'First Name',
|
||||||
'type' => 'text'
|
'type' => 'text',
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
'lock_until' => [
|
'lock_until' => [
|
||||||
'value' => $GLOBALS['lock_until'] ?? '',
|
'value' => $_POST['lock_until'] ?? '',
|
||||||
'output_name' => 'Lock account until',
|
'output_name' => 'Lock account until',
|
||||||
'type' => 'datetime',
|
'type' => 'datetime',
|
||||||
'error_check' => 'datetime',
|
'error_check' => 'datetime',
|
||||||
'sql_read' => 'YYYY-MM-DD HH24:MI',
|
'sql_read' => 'YYYY-MM-DD HH24:MI',
|
||||||
'datetime' => 1,
|
'datetime' => 1,
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
'lock_after' => [
|
'lock_after' => [
|
||||||
'value' => $GLOBALS['lock_after'] ?? '',
|
'value' => $_POST['lock_after'] ?? '',
|
||||||
'output_name' => 'Lock account after',
|
'output_name' => 'Lock account after',
|
||||||
'type' => 'datetime',
|
'type' => 'datetime',
|
||||||
'error_check' => 'datetime',
|
'error_check' => 'datetime',
|
||||||
'sql_read' => 'YYYY-MM-DD HH24:MI',
|
'sql_read' => 'YYYY-MM-DD HH24:MI',
|
||||||
'datetime' => 1,
|
'datetime' => 1,'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
'login_user_id' => [
|
'login_user_id' => [
|
||||||
'value' => $GLOBALS['login_user_id'] ?? '',
|
'value' => $_POST['login_user_id'] ?? '',
|
||||||
'output_name' => '_GET/_POST loginUserId direct login ID',
|
'output_name' => '_GET/_POST loginUserId direct login ID',
|
||||||
'type' => 'text',
|
'type' => 'text',
|
||||||
'error_check' => 'unique|custom',
|
'error_check' => 'unique|custom',
|
||||||
'error_regex' => "/^[A-Za-z0-9]+$/",
|
'error_regex' => "/^[A-Za-z0-9]+$/",
|
||||||
'emptynull' => 1,
|
'emptynull' => 1,'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
'login_user_id_set_date' => [
|
'login_user_id_set_date' => [
|
||||||
'output_name' => 'loginUserId set date',
|
'output_name' => 'loginUserId set date',
|
||||||
'value' => $GLOBALS['login_user_id_set_date'] ?? '',
|
'value' => $_POST['login_user_id_set_date'] ?? '',
|
||||||
'type' => 'view',
|
'type' => 'view',
|
||||||
'empty' => '-'
|
'empty' => '-',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
'login_user_id_last_revalidate' => [
|
'login_user_id_last_revalidate' => [
|
||||||
'output_name' => 'loginUserId last revalidate date',
|
'output_name' => 'loginUserId last revalidate date',
|
||||||
'value' => $GLOBALS['login_user_id_last_revalidate'] ?? '',
|
'value' => $_POST['login_user_id_last_revalidate'] ?? '',
|
||||||
'type' => 'view',
|
'type' => 'view',
|
||||||
'empty' => '-'
|
'empty' => '-',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
'login_user_id_locked' => [
|
'login_user_id_locked' => [
|
||||||
'value' => $GLOBALS['login_user_id_locked'] ?? '',
|
'value' => $_POST['login_user_id_locked'] ?? '',
|
||||||
'output_name' => 'loginUserId usage locked',
|
'output_name' => 'loginUserId usage locked',
|
||||||
'type' => 'binary',
|
'type' => 'binary',
|
||||||
'int' => 1,
|
'int' => 1,
|
||||||
@@ -174,83 +210,102 @@ $edit_users = [
|
|||||||
'1' => 'Yes',
|
'1' => 'Yes',
|
||||||
'0' => 'No'
|
'0' => 'No'
|
||||||
],
|
],
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
'login_user_id_revalidate_after' => [
|
'login_user_id_revalidate_after' => [
|
||||||
'value' => $GLOBALS['login_user_id_revalidate_after'] ?? '',
|
'value' => $_POST['login_user_id_revalidate_after'] ?? '',
|
||||||
'output_name' => 'loginUserId, User must login after n days',
|
'output_name' => 'loginUserId, User must login after n days',
|
||||||
'type' => 'text',
|
'type' => 'text',
|
||||||
'error_check' => 'intervalshort',
|
'error_check' => 'intervalshort',
|
||||||
'interval' => 1, // interval needs NULL write for empty
|
'interval' => 1, // interval needs NULL write for empty
|
||||||
'size' => 5, // make it 5 chars long
|
'size' => 5, // make it 5 chars long
|
||||||
'length' => 5
|
'length' => 5,
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
'login_user_id_valid_from' => [
|
'login_user_id_valid_from' => [
|
||||||
'value' => $GLOBALS['login_user_id_valid_from'] ?? '',
|
'value' => $_POST['login_user_id_valid_from'] ?? '',
|
||||||
'output_name' => 'loginUserId valid from',
|
'output_name' => 'loginUserId valid from',
|
||||||
'type' => 'datetime',
|
'type' => 'datetime',
|
||||||
'error_check' => 'datetime',
|
'error_check' => 'datetime',
|
||||||
'sql_read' => 'YYYY-MM-DD HH24:MI',
|
'sql_read' => 'YYYY-MM-DD HH24:MI',
|
||||||
'datetime' => 1,
|
'datetime' => 1,
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
'login_user_id_valid_until' => [
|
'login_user_id_valid_until' => [
|
||||||
'value' => $GLOBALS['login_user_id_valid_until'] ?? '',
|
'value' => $_POST['login_user_id_valid_until'] ?? '',
|
||||||
'output_name' => 'loginUserId valid until',
|
'output_name' => 'loginUserId valid until',
|
||||||
'type' => 'datetime',
|
'type' => 'datetime',
|
||||||
'error_check' => 'datetime',
|
'error_check' => 'datetime',
|
||||||
'sql_read' => 'YYYY-MM-DD HH24:MI',
|
'sql_read' => 'YYYY-MM-DD HH24:MI',
|
||||||
'datetime' => 1,
|
'datetime' => 1,
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
'edit_language_id' => [
|
'edit_language_id' => [
|
||||||
'value' => $GLOBALS['edit_language_id'] ?? '',
|
'value' => $_POST['edit_language_id'] ?? '',
|
||||||
'output_name' => 'Language',
|
'output_name' => 'Language',
|
||||||
'mandatory' => 1,
|
'mandatory' => 1,
|
||||||
'int' => 1,
|
'int' => 1,
|
||||||
'type' => 'drop_down_db',
|
'type' => 'drop_down_db',
|
||||||
'query' => "SELECT edit_language_id, long_name FROM edit_language WHERE enabled = 1 ORDER BY order_number"
|
'query' => "SELECT edit_language_id, long_name FROM edit_language WHERE enabled = 1 ORDER BY order_number",
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
'edit_scheme_id' => [
|
'edit_scheme_id' => [
|
||||||
'value' => $GLOBALS['edit_scheme_id'] ?? '',
|
'value' => $_POST['edit_scheme_id'] ?? '',
|
||||||
'output_name' => 'Scheme',
|
'output_name' => 'Scheme',
|
||||||
'int_null' => 1,
|
'int_null' => 1,
|
||||||
'type' => 'drop_down_db',
|
'type' => 'drop_down_db',
|
||||||
'query' => "SELECT edit_scheme_id, name FROM edit_scheme WHERE enabled = 1 ORDER BY name"
|
'query' => "SELECT edit_scheme_id, name FROM edit_scheme WHERE enabled = 1 ORDER BY name",
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
'edit_group_id' => [
|
'edit_group_id' => [
|
||||||
'value' => $GLOBALS['edit_group_id'] ?? '',
|
'value' => $_POST['edit_group_id'] ?? '',
|
||||||
'output_name' => 'Group',
|
'output_name' => 'Group',
|
||||||
'int' => 1,
|
'int' => 1,
|
||||||
'type' => 'drop_down_db',
|
'type' => 'drop_down_db',
|
||||||
'query' => "SELECT edit_group_id, name FROM edit_group WHERE enabled = 1 ORDER BY name",
|
'query' => "SELECT edit_group_id, name FROM edit_group WHERE enabled = 1 ORDER BY name",
|
||||||
'mandatory' => 1
|
'mandatory' => 1,
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
'edit_access_right_id' => [
|
'edit_access_right_id' => [
|
||||||
'value' => $GLOBALS['edit_access_right_id'] ?? '',
|
'value' => $_POST['edit_access_right_id'] ?? '',
|
||||||
'output_name' => 'User Level',
|
'output_name' => 'User Level',
|
||||||
'mandatory' => 1,
|
'mandatory' => 1,
|
||||||
'int' => 1,
|
'int' => 1,
|
||||||
'type' => 'drop_down_db',
|
'type' => 'drop_down_db',
|
||||||
'query' => "SELECT edit_access_right_id, name FROM edit_access_right ORDER BY level"
|
'query' => "SELECT edit_access_right_id, name FROM edit_access_right ORDER BY level",
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
'login_error_count' => [
|
'login_error_count' => [
|
||||||
'output_name' => 'Login error count',
|
'output_name' => 'Login error count',
|
||||||
'value' => $GLOBALS['login_error_count'] ?? '',
|
'value' => $_POST['login_error_count'] ?? '',
|
||||||
'type' => 'view',
|
'type' => 'view',
|
||||||
'empty' => '0'
|
'empty' => '0',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
'login_error_date_last' => [
|
'login_error_date_last' => [
|
||||||
'output_name' => 'Last login error',
|
'output_name' => 'Last login error',
|
||||||
'value' => $GLOBALS['login_error_date_liast'] ?? '',
|
'value' => $_POST['login_error_date_liast'] ?? '',
|
||||||
'type' => 'view',
|
'type' => 'view',
|
||||||
'empty' => '-'
|
'empty' => '-',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
'login_error_date_first' => [
|
'login_error_date_first' => [
|
||||||
'output_name' => 'First login error',
|
'output_name' => 'First login error',
|
||||||
'value' => $GLOBALS['login_error_date_first'] ?? '',
|
'value' => $_POST['login_error_date_first'] ?? '',
|
||||||
'type' => 'view',
|
'type' => 'view',
|
||||||
'empty' => '-'
|
'empty' => '-',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
'protected' => [
|
'protected' => [
|
||||||
'value' => $GLOBALS['protected'] ?? '',
|
'value' => $_POST['protected'] ?? '',
|
||||||
'output_name' => 'Protected',
|
'output_name' => 'Protected',
|
||||||
'type' => 'binary',
|
'type' => 'binary',
|
||||||
'int' => 1,
|
'int' => 1,
|
||||||
@@ -258,19 +313,37 @@ $edit_users = [
|
|||||||
'1' => 'Yes',
|
'1' => 'Yes',
|
||||||
'0' => 'No'
|
'0' => 'No'
|
||||||
],
|
],
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
'additional_acl' => [
|
'additional_acl' => [
|
||||||
'value' => $GLOBALS['additional_acl'] ?? '',
|
'value' => $_POST['additional_acl'] ?? '',
|
||||||
'output_name' => 'Additional ACL (as JSON)',
|
'output_name' => 'Additional ACL (as JSON)',
|
||||||
'type' => 'textarea',
|
'type' => 'textarea',
|
||||||
'error_check' => 'json',
|
'error_check' => 'json',
|
||||||
'rows' => 10,
|
'rows' => 10,
|
||||||
'cols' => 60
|
'cols' => 60,
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
'load_query' => "SELECT edit_user_id, username, enabled, deleted, "
|
'load_query' => "SELECT edit_user_id, username, enabled, deleted, "
|
||||||
. "strict, locked, login_error_count "
|
. "strict, locked, login_error_count "
|
||||||
. "FROM edit_user ORDER BY username",
|
. "FROM edit_user "
|
||||||
|
// if base acl is not 90 only list enabled
|
||||||
|
// if not admin flag, do not list admin flagged
|
||||||
|
. (
|
||||||
|
!$this->getAclAdmin() ?
|
||||||
|
"WHERE admin = 0 "
|
||||||
|
. (
|
||||||
|
!$this->checkBaseACL(90) ?
|
||||||
|
// $_POST['base_acl_level'] < 90 ?
|
||||||
|
"AND enabled = 1 " :
|
||||||
|
""
|
||||||
|
)
|
||||||
|
: ''
|
||||||
|
)
|
||||||
|
. "ORDER BY username",
|
||||||
'table_name' => 'edit_user',
|
'table_name' => 'edit_user',
|
||||||
'show_fields' => [
|
'show_fields' => [
|
||||||
[
|
[
|
||||||
@@ -305,7 +378,12 @@ $edit_users = [
|
|||||||
'edit_access_user' => [
|
'edit_access_user' => [
|
||||||
'output_name' => 'Accounts',
|
'output_name' => 'Accounts',
|
||||||
'mandatory' => 1,
|
'mandatory' => 1,
|
||||||
'delete' => 0, // set then reference entries are deleted, else the 'enable' flag is only set
|
// set then reference entries are deleted, else the 'enable' flag is only set
|
||||||
|
'delete' => 0,
|
||||||
|
// acl
|
||||||
|
'min_edit_acl' => '40',
|
||||||
|
'min_show_acl' => '20',
|
||||||
|
// table read prefix
|
||||||
'prefix' => 'ecu',
|
'prefix' => 'ecu',
|
||||||
'read_data' => [
|
'read_data' => [
|
||||||
'table_name' => 'edit_access',
|
'table_name' => 'edit_access',
|
||||||
|
|||||||
@@ -5,18 +5,18 @@ declare(strict_types=1);
|
|||||||
$edit_visible_group = [
|
$edit_visible_group = [
|
||||||
'table_array' => [
|
'table_array' => [
|
||||||
'edit_visible_group_id' => [
|
'edit_visible_group_id' => [
|
||||||
'value' => $GLOBALS['edit_visible_group_id'] ?? '',
|
'value' => $_POST['edit_visible_group_id'] ?? '',
|
||||||
'type' => 'hidden',
|
'type' => 'hidden',
|
||||||
'pk' => 1
|
'pk' => 1
|
||||||
],
|
],
|
||||||
'name' => [
|
'name' => [
|
||||||
'value' => $GLOBALS['name'] ?? '',
|
'value' => $_POST['name'] ?? '',
|
||||||
'output_name' => 'Group name',
|
'output_name' => 'Group name',
|
||||||
'mandatory' => 1,
|
'mandatory' => 1,
|
||||||
'type' => 'text'
|
'type' => 'text'
|
||||||
],
|
],
|
||||||
'flag' => [
|
'flag' => [
|
||||||
'value' => $GLOBALS['flag'] ?? '',
|
'value' => $_POST['flag'] ?? '',
|
||||||
'output_name' => 'Flag',
|
'output_name' => 'Flag',
|
||||||
'mandatory' => 1,
|
'mandatory' => 1,
|
||||||
'type' => 'text',
|
'type' => 'text',
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
********************************************************************
|
********************************************************************
|
||||||
*}
|
*}
|
||||||
|
|
||||||
|
<!doctype html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>{$HTML_TITLE}</title>
|
<title>{$HTML_TITLE}</title>
|
||||||
@@ -83,13 +84,8 @@ function pop(theURL, winName, features) {
|
|||||||
<td width="{$table_width}" class="edit_bgcolor">
|
<td width="{$table_width}" class="edit_bgcolor">
|
||||||
<form method="post" name="edit_form" style="margin-block-end: 0em;">
|
<form method="post" name="edit_form" style="margin-block-end: 0em;">
|
||||||
<table width="100%" border="0" cellpadding="2" cellspacing="1">
|
<table width="100%" border="0" cellpadding="2" cellspacing="1">
|
||||||
<!-- LOAD START //-->
|
|
||||||
{include file="edit_load.tpl"}
|
{include file="edit_load.tpl"}
|
||||||
<!-- LOAD END //-->
|
|
||||||
<!-- NEW START //-->
|
|
||||||
{include file="edit_new.tpl"}
|
{include file="edit_new.tpl"}
|
||||||
{* $form_create_new*}
|
|
||||||
<!-- NEW END //-->
|
|
||||||
{if $form_yes}
|
{if $form_yes}
|
||||||
{include file="edit_save_delete.tpl"}
|
{include file="edit_save_delete.tpl"}
|
||||||
{if $form_my_page_name == "edit_pages" && $filename_exist}
|
{if $form_my_page_name == "edit_pages" && $filename_exist}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
********************************************************************
|
********************************************************************
|
||||||
*}
|
*}
|
||||||
{foreach from=$elements item=element key=key name=loop}
|
{foreach from=$elements item=element key=key name=loop}
|
||||||
|
{if $element.allow_edit}
|
||||||
<tr>
|
<tr>
|
||||||
<td class="edit_fgcolor" class="normal" valign="top">
|
<td class="edit_fgcolor" class="normal" valign="top">
|
||||||
{$element.output_name}
|
{$element.output_name}
|
||||||
@@ -50,7 +51,6 @@
|
|||||||
{* not yet implemented *}
|
{* not yet implemented *}
|
||||||
{/if}
|
{/if}
|
||||||
{if $element.type == 'order'}
|
{if $element.type == 'order'}
|
||||||
{* <input type="button" name="order" value="{$element.data.output_name}" OnClick="pop('order.php?col_name={$element.data.col_name}&table_name={$element.data.table_name}&where={$element.data.query}','Order','status=no,scrollbars=yes,width=700,height=500');"> *}
|
|
||||||
<input type="button" name="order" value="{$element.data.output_name}" OnClick="pop('edit_order.php?table_name={$element.data.table_name}&where={$element.data.query}','Order','status=no,scrollbars=yes,width=700,height=500');">
|
<input type="button" name="order" value="{$element.data.output_name}" OnClick="pop('edit_order.php?table_name={$element.data.table_name}&where={$element.data.query}','Order','status=no,scrollbars=yes,width=700,height=500');">
|
||||||
<input type="hidden" name="{$element.data.name}" value="{$element.data.value}">
|
<input type="hidden" name="{$element.data.name}" value="{$element.data.value}">
|
||||||
{/if}
|
{/if}
|
||||||
@@ -68,8 +68,20 @@
|
|||||||
</select>
|
</select>
|
||||||
{/if}
|
{/if}
|
||||||
{if $element.type == 'element_list'}
|
{if $element.type == 'element_list'}
|
||||||
|
<script language="JavaScript">
|
||||||
|
function deleteElement(delete_name, line_item)
|
||||||
|
{
|
||||||
|
let confirm_val = confirm('{t}Do you want to remove this entry?{/t}');
|
||||||
|
if (confirm_val === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
document.getElementById(delete_name).value = line_item;
|
||||||
|
document.getElementById(delete_name + '_flag').value = confirm_val;
|
||||||
|
document.edit_form.submit();
|
||||||
|
}
|
||||||
|
</script>
|
||||||
{* each row of data *}
|
{* each row of data *}
|
||||||
<table width="100%" border="0">
|
<table width="100%" border="0" cellspacing="0" cellpadding="2">
|
||||||
{foreach from=$element.data.content item=line key=key}
|
{foreach from=$element.data.content item=line key=key}
|
||||||
<tr>
|
<tr>
|
||||||
{* now each line of data *}
|
{* now each line of data *}
|
||||||
@@ -106,7 +118,7 @@
|
|||||||
{/if}
|
{/if}
|
||||||
{* if there is a hidden key, set delete, but only if we have a delete string *}
|
{* if there is a hidden key, set delete, but only if we have a delete string *}
|
||||||
{if $element.data.type.$line_key == 'hidden' && $line_item && $element.data.delete_name}
|
{if $element.data.type.$line_key == 'hidden' && $line_item && $element.data.delete_name}
|
||||||
<input type="submit" name="remove_button" value="{t}Delete{/t}" onClick="document.edit_form.{$element.data.delete_name}.value={$line_item};document.edit_form.{$element.data.delete_name}_flag.value=confirm('{t}Do you want to remove this entry?{/t}');document.edit_form.submit();">
|
<input type="button" name="remove_button" value="{t}Delete{/t}" onClick="deleteElement('{$element.data.delete_name}', '{$line_item}');">
|
||||||
{/if}
|
{/if}
|
||||||
{if $element.data.type.$line_key == 'hidden' && $element.data.enable_name && $element.data.delete && $element.data.output_name.$line_key}
|
{if $element.data.type.$line_key == 'hidden' && $element.data.enable_name && $element.data.delete && $element.data.output_name.$line_key}
|
||||||
<input type="checkbox" name="{$element.data.enable_name}[{$key}]" value="1" {if $line_item}checked{/if}> {$element.data.output_name.$line_key}
|
<input type="checkbox" name="{$element.data.enable_name}[{$key}]" value="1" {if $line_item}checked{/if}> {$element.data.output_name.$line_key}
|
||||||
@@ -129,4 +141,21 @@
|
|||||||
{/if}
|
{/if}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
{elseif $element.allow_show}
|
||||||
|
<tr>
|
||||||
|
<td class="edit_fgcolor" class="normal" valign="top">
|
||||||
|
{$element.output_name}
|
||||||
|
</td>
|
||||||
|
<td class="{$element.color}" class="normal">
|
||||||
|
{if $element.type != 'view'}
|
||||||
|
{$element.show_value}
|
||||||
|
<input type="hidden" name="{$element.data.name}" value="{$element.show_value}">
|
||||||
|
{else}
|
||||||
|
{$element.data.value}
|
||||||
|
{/if}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{* {else}
|
||||||
|
<!-- No {$key} --> *}
|
||||||
|
{/if}
|
||||||
{/foreach}
|
{/foreach}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
* HISTORY:
|
* HISTORY:
|
||||||
********************************************************************
|
********************************************************************
|
||||||
*}
|
*}
|
||||||
|
<!-- LOAD START //-->
|
||||||
<tr>
|
<tr>
|
||||||
<td class="edit_fgcolor_alt" class="normal">
|
<td class="edit_fgcolor_alt" class="normal">
|
||||||
Load:
|
Load:
|
||||||
@@ -20,3 +20,4 @@
|
|||||||
<input type="submit" name="archive" value="{t}Load{/t}">
|
<input type="submit" name="archive" value="{t}Load{/t}">
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<!-- LOAD END //-->
|
||||||
|
|||||||
@@ -7,7 +7,8 @@
|
|||||||
* HISTORY:
|
* HISTORY:
|
||||||
********************************************************************
|
********************************************************************
|
||||||
*}
|
*}
|
||||||
|
{if $new.seclevel_okay}
|
||||||
|
<!-- NEW START //-->
|
||||||
<tr>
|
<tr>
|
||||||
<td class="edit_fgcolor_alt" class="normal">
|
<td class="edit_fgcolor_alt" class="normal">
|
||||||
{t}Create new media:{/t}
|
{t}Create new media:{/t}
|
||||||
@@ -21,3 +22,5 @@
|
|||||||
<input type="submit" name="new" value="{$new.new_name}">
|
<input type="submit" name="new" value="{$new.new_name}">
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<!-- NEW END //-->
|
||||||
|
{/if}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
********************************************************************
|
********************************************************************
|
||||||
*}
|
*}
|
||||||
|
|
||||||
|
<!doctype html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>{$HTML_TITLE}</title>
|
<title>{$HTML_TITLE}</title>
|
||||||
|
|||||||
@@ -7,16 +7,18 @@
|
|||||||
* HISTORY:
|
* HISTORY:
|
||||||
********************************************************************
|
********************************************************************
|
||||||
*}
|
*}
|
||||||
<tr>
|
|
||||||
{if $save_delete.seclevel_okay}
|
{if $save_delete.seclevel_okay}
|
||||||
|
<tr>
|
||||||
|
<!-- SAVE START //-->
|
||||||
<td class="edit_fgcolor_alt" class="normal">
|
<td class="edit_fgcolor_alt" class="normal">
|
||||||
<input type="submit" name="save" value="{$save_delete.save}">
|
<input type="submit" name="save" value="{$save_delete.save}">
|
||||||
{if $save_delete.old_school_hidden}
|
{if $save_delete.old_school_hidden}
|
||||||
<input type="hidden" name="{$save_delete.pk_name}" value="{$save_delete.pk_value}">
|
<input type="hidden" name="{$save_delete.pk_name}" value="{$save_delete.pk_value}">
|
||||||
{/if}
|
{/if}
|
||||||
</td>
|
</td>
|
||||||
{/if}
|
<!-- SAVE END //-->
|
||||||
{if $save_delete.show_delete}
|
{if $save_delete.show_delete}
|
||||||
|
<!-- DELETE START //-->
|
||||||
<td class="edit_fgcolor_delete">
|
<td class="edit_fgcolor_delete">
|
||||||
{if !$save_delete.hide_delete_checkbox}
|
{if !$save_delete.hide_delete_checkbox}
|
||||||
<input type="checkbox" name="really_delete" value="yes"> {t}really{/t}
|
<input type="checkbox" name="really_delete" value="yes"> {t}really{/t}
|
||||||
@@ -24,9 +26,11 @@
|
|||||||
<input type="hidden" name="really_delete" value="yes">
|
<input type="hidden" name="really_delete" value="yes">
|
||||||
{/if}
|
{/if}
|
||||||
<input type="submit" name="delete" value="{t}Delete{/t}">
|
<input type="submit" name="delete" value="{t}Delete{/t}">
|
||||||
|
<!-- DELETE END //-->
|
||||||
{else}
|
{else}
|
||||||
<td class="edit_fgcolor_alt" class="normal">
|
<td class="edit_fgcolor_alt" class="normal">
|
||||||
|
|
||||||
{/if}
|
{/if}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
{/if}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
********************************************************************
|
********************************************************************
|
||||||
*}
|
*}
|
||||||
|
|
||||||
|
<!doctype html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>{$HTML_TITLE}</title>
|
<title>{$HTML_TITLE}</title>
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
********************************************************************
|
********************************************************************
|
||||||
*}
|
*}
|
||||||
|
|
||||||
|
<!doctype html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>{$HTML_TITLE}</title>
|
<title>{$HTML_TITLE}</title>
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ body {
|
|||||||
background-color: white;
|
background-color: white;
|
||||||
color: black;
|
color: black;
|
||||||
font-family: Verdana,Arial,Helvetica,sans-serif;
|
font-family: Verdana,Arial,Helvetica,sans-serif;
|
||||||
font-size : 8pt;
|
font-size : 9pt;
|
||||||
}
|
}
|
||||||
|
|
||||||
.large {
|
.large {
|
||||||
@@ -159,9 +159,9 @@ input[type="text"]:focus, textarea:focus, select:focus {
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.warning {
|
.warning, .warn {
|
||||||
border: 1px solid #df7700;
|
border: 1px solid #ffa947;
|
||||||
color: #d57200;
|
color: #ffa947;
|
||||||
margin: 5px;
|
margin: 5px;
|
||||||
padding: 2px;
|
padding: 2px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
@@ -181,8 +181,8 @@ input[type="text"]:focus, textarea:focus, select:focus {
|
|||||||
margin-top: 1px;
|
margin-top: 1px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.div_warning {
|
.div_warning, .div_warn {
|
||||||
border: 1px solid #df7700;
|
border: 1px solid #ffa947;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* borders */
|
/* borders */
|
||||||
@@ -455,4 +455,11 @@ input[type="text"]:focus, textarea:focus, select:focus {
|
|||||||
background-color: #FFDF6F;
|
background-color: #FFDF6F;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
td.edit_fgcolor tr:nth-child(odd) {
|
||||||
|
background-color: #e2e2c5;
|
||||||
|
}
|
||||||
|
td.edit_fgcolor tr:nth-child(even) {
|
||||||
|
background-color: #ffffcd;
|
||||||
|
}
|
||||||
|
|
||||||
/* ***************************** ADMIN EDIT INTERFACE COLORS ********************************* */
|
/* ***************************** ADMIN EDIT INTERFACE COLORS ********************************* */
|
||||||
|
|||||||
@@ -974,7 +974,7 @@ function phfo(tree)
|
|||||||
if (tree.id) {
|
if (tree.id) {
|
||||||
line += ' id="' + tree.id + '"';
|
line += ' id="' + tree.id + '"';
|
||||||
// if anything input (input, textarea, select then add name too)
|
// if anything input (input, textarea, select then add name too)
|
||||||
if (['input', 'textarea', 'select'].includes(tree.tag)) {
|
if (['input', 'textarea', 'select', 'button'].includes(tree.tag)) {
|
||||||
line += ' name="' + (tree.name ? tree.name : tree.id) + '"';
|
line += ' name="' + (tree.name ? tree.name : tree.id) + '"';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1014,8 +1014,12 @@ function phfo(tree)
|
|||||||
} else if (tree.content) {
|
} else if (tree.content) {
|
||||||
content.push(tree.content);
|
content.push(tree.content);
|
||||||
}
|
}
|
||||||
// if not input close
|
// if not input, image or br, then close
|
||||||
if (tree.tag != 'input') {
|
if (
|
||||||
|
tree.tag != 'input' ||
|
||||||
|
tree.tag != 'img' ||
|
||||||
|
tree.tag != 'br'
|
||||||
|
) {
|
||||||
content.push('</' + tree.tag + '>');
|
content.push('</' + tree.tag + '>');
|
||||||
}
|
}
|
||||||
// combine to string
|
// combine to string
|
||||||
@@ -1329,11 +1333,12 @@ function createLoginRow(login_string, header_id = 'mainHeader') // eslint-disabl
|
|||||||
}
|
}
|
||||||
// clear out just in case for first entry
|
// clear out just in case for first entry
|
||||||
// fill with div name & login/logout button
|
// fill with div name & login/logout button
|
||||||
$('#loginRow').html(phfo(cel('div', '', login_string)));
|
$('#loginRow').html(phfo(cel('div', 'loginRow-name', login_string)));
|
||||||
|
$('#loginRow').append(phfo(cel('div', 'loginRow-info', '')));
|
||||||
$('#loginRow').append(phfo(
|
$('#loginRow').append(phfo(
|
||||||
aelx(
|
aelx(
|
||||||
// outer div
|
// outer div
|
||||||
cel('div'),
|
cel('div', 'loginRow-logout'),
|
||||||
// inner element
|
// inner element
|
||||||
cel('input', 'logout', '', [], {
|
cel('input', 'logout', '', [], {
|
||||||
value: __('Logout'),
|
value: __('Logout'),
|
||||||
@@ -1386,6 +1391,8 @@ function createNavMenu(nav_menu, header_id = 'mainHeader') // eslint-disable-lin
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
$('#menuRow').html(content.join(''));
|
$('#menuRow').html(content.join(''));
|
||||||
|
} else {
|
||||||
|
$('#menuRow').hide();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
(function (global, factory) {
|
(function (global, factory) {
|
||||||
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
||||||
typeof define === 'function' && define.amd ? define(['exports'], factory) :
|
typeof define === 'function' && define.amd ? define(['exports'], factory) :
|
||||||
(global = global || self, factory(global.ja = {}));
|
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.ja = {}));
|
||||||
}(this, function (exports) { 'use strict';
|
}(this, (function (exports) { 'use strict';
|
||||||
|
|
||||||
var fp = typeof window !== "undefined" && window.flatpickr !== undefined
|
var fp = typeof window !== "undefined" && window.flatpickr !== undefined
|
||||||
? window.flatpickr
|
? window.flatpickr
|
||||||
: {
|
: {
|
||||||
l10ns: {}
|
l10ns: {},
|
||||||
};
|
};
|
||||||
var Japanese = {
|
var Japanese = {
|
||||||
weekdays: {
|
weekdays: {
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
"木曜日",
|
"木曜日",
|
||||||
"金曜日",
|
"金曜日",
|
||||||
"土曜日",
|
"土曜日",
|
||||||
]
|
],
|
||||||
},
|
},
|
||||||
months: {
|
months: {
|
||||||
shorthand: [
|
shorthand: [
|
||||||
@@ -50,11 +50,15 @@
|
|||||||
"10月",
|
"10月",
|
||||||
"11月",
|
"11月",
|
||||||
"12月",
|
"12月",
|
||||||
]
|
],
|
||||||
},
|
},
|
||||||
time_24hr: true,
|
time_24hr: true,
|
||||||
rangeSeparator: " から ",
|
rangeSeparator: " から ",
|
||||||
firstDayOfWeek: 1
|
monthAriaLabel: "月",
|
||||||
|
amPM: ["午前", "午後"],
|
||||||
|
yearAriaLabel: "年",
|
||||||
|
hourAriaLabel: "時間",
|
||||||
|
minuteAriaLabel: "分",
|
||||||
};
|
};
|
||||||
fp.l10ns.ja = Japanese;
|
fp.l10ns.ja = Japanese;
|
||||||
var ja = fp.l10ns;
|
var ja = fp.l10ns;
|
||||||
@@ -64,4 +68,4 @@
|
|||||||
|
|
||||||
Object.defineProperty(exports, '__esModule', { value: true });
|
Object.defineProperty(exports, '__esModule', { value: true });
|
||||||
|
|
||||||
}));
|
})));
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -677,9 +677,20 @@ class Login
|
|||||||
$_SESSION['GROUP_ACL_TYPE'] = $res['group_type'];
|
$_SESSION['GROUP_ACL_TYPE'] = $res['group_type'];
|
||||||
// deprecated TEMPLATE setting
|
// deprecated TEMPLATE setting
|
||||||
$_SESSION['TEMPLATE'] = $res['template'] ? $res['template'] : '';
|
$_SESSION['TEMPLATE'] = $res['template'] ? $res['template'] : '';
|
||||||
$_SESSION['HEADER_COLOR'] = $res['second_header_color'] ?
|
$_SESSION['HEADER_COLOR'] = !empty($res['second_header_color']) ?
|
||||||
$res['second_header_color'] :
|
$res['second_header_color'] :
|
||||||
$res['first_header_color'];
|
$res['first_header_color'];
|
||||||
|
// missing # before, this is for legacy data, will be deprecated
|
||||||
|
if (preg_match("/^[\dA-Fa-f]{6,8}$/", $_SESSION['HEADER_COLOR'])) {
|
||||||
|
$_SESSION['HEADER_COLOR'] = '#' . $_SESSION['HEADER_COLOR'];
|
||||||
|
}
|
||||||
|
// TODO: make sure that header color is valid:
|
||||||
|
// # + 6 hex
|
||||||
|
// # + 8 hex (alpha)
|
||||||
|
// rgb(), rgba(), hsl(), hsla()
|
||||||
|
// rgb: nnn.n for each
|
||||||
|
// hsl: nnn.n for first, nnn.n% for 2nd, 3rd
|
||||||
|
// Check\Colors::validateColor()
|
||||||
$_SESSION['LANG'] = $res['locale'] ?? 'en';
|
$_SESSION['LANG'] = $res['locale'] ?? 'en';
|
||||||
$_SESSION['DEFAULT_CHARSET'] = $res['encoding'] ?? 'UTF-8';
|
$_SESSION['DEFAULT_CHARSET'] = $res['encoding'] ?? 'UTF-8';
|
||||||
$_SESSION['DEFAULT_LOCALE'] = $_SESSION['LANG']
|
$_SESSION['DEFAULT_LOCALE'] = $_SESSION['LANG']
|
||||||
@@ -1131,6 +1142,9 @@ class Login
|
|||||||
|
|
||||||
$html_string = (string)$this->login_template['template'];
|
$html_string = (string)$this->login_template['template'];
|
||||||
|
|
||||||
|
$locales = $this->l->parseLocale($this->l->getLocale());
|
||||||
|
$this->login_template['strings']['LANGUAGE'] = $locales['lang'] ?? 'en';
|
||||||
|
|
||||||
// if password change is okay
|
// if password change is okay
|
||||||
if ($this->password_change) {
|
if ($this->password_change) {
|
||||||
$html_string_password_change = $this->login_template['password_change'];
|
$html_string_password_change = $this->login_template['password_change'];
|
||||||
@@ -1334,7 +1348,7 @@ EOM;
|
|||||||
if (!$this->login_template['template']) {
|
if (!$this->login_template['template']) {
|
||||||
$this->login_template['template'] = <<<EOM
|
$this->login_template['template'] = <<<EOM
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="{LANGUAGE}">
|
||||||
<head>
|
<head>
|
||||||
<title>{HTML_TITLE}</title>
|
<title>{HTML_TITLE}</title>
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
@@ -1617,7 +1631,7 @@ EOM;
|
|||||||
// set the locale
|
// set the locale
|
||||||
if (
|
if (
|
||||||
$this->session->checkActiveSession() === true &&
|
$this->session->checkActiveSession() === true &&
|
||||||
!empty($_SESSION['DEFAULT_LANG'])
|
!empty($_SESSION['DEFAULT_LOCALE'])
|
||||||
) {
|
) {
|
||||||
$locale = $_SESSION['DEFAULT_LOCALE'] ?? '';
|
$locale = $_SESSION['DEFAULT_LOCALE'] ?? '';
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
588
www/lib/CoreLibs/Admin/EditBase.php
Normal file
588
www/lib/CoreLibs/Admin/EditBase.php
Normal file
@@ -0,0 +1,588 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
* AUTHOR: Clemens Schwaighofer
|
||||||
|
* CREATED: 2023/1/6
|
||||||
|
* DESCRIPTION:
|
||||||
|
* Original created: 2003/06/10
|
||||||
|
* This is the edit_base.php data as is moved into a class so we can
|
||||||
|
* more easy update this and also move to a different AJAX style more
|
||||||
|
* easy
|
||||||
|
*********************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace CoreLibs\Admin;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
|
use SmartyException;
|
||||||
|
|
||||||
|
class EditBase
|
||||||
|
{
|
||||||
|
/** @var array<mixed> */
|
||||||
|
private $HEADER = [];
|
||||||
|
/** @var array<mixed> */
|
||||||
|
private $DATA = [];
|
||||||
|
/** @var array<mixed> */
|
||||||
|
private $DEBUG_DATA = [];
|
||||||
|
|
||||||
|
/** @var string the template name */
|
||||||
|
private $EDIT_TEMPLATE = '';
|
||||||
|
|
||||||
|
/** @var \CoreLibs\Template\SmartyExtend smarty system */
|
||||||
|
private $smarty;
|
||||||
|
/** @var \CoreLibs\Output\Form\Generate form generate system */
|
||||||
|
private $form;
|
||||||
|
/** @var \CoreLibs\Debug\Logging */
|
||||||
|
public $log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* construct form generator
|
||||||
|
*
|
||||||
|
* @param array<mixed> $db_config db config array, mandatory
|
||||||
|
* @param \CoreLibs\Debug\Logging $log Logging class, null auto set
|
||||||
|
* @param \CoreLibs\Language\L10n $l10n l10n language class, null auto set
|
||||||
|
* @param array<string,string> $locale locale array from ::setLocale,
|
||||||
|
* null auto set
|
||||||
|
*/
|
||||||
|
public function __construct(
|
||||||
|
array $db_config,
|
||||||
|
\CoreLibs\Debug\Logging $log,
|
||||||
|
\CoreLibs\Language\L10n $l10n,
|
||||||
|
array $locale
|
||||||
|
) {
|
||||||
|
$this->log = $log;
|
||||||
|
// smarty template engine (extended Translation version)
|
||||||
|
$this->smarty = new \CoreLibs\Template\SmartyExtend($l10n, $locale);
|
||||||
|
// turn off set log per class
|
||||||
|
$log->setLogPer('class', false);
|
||||||
|
|
||||||
|
// create form class
|
||||||
|
$this->form = new \CoreLibs\Output\Form\Generate(
|
||||||
|
$db_config,
|
||||||
|
$log,
|
||||||
|
$l10n,
|
||||||
|
$locale
|
||||||
|
);
|
||||||
|
if ($this->form->mobile_phone) {
|
||||||
|
echo "I am sorry, but this page cannot be viewed by a mobile phone";
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
// $this->form->log->debug('POST', $this->form->log->prAr($_POST));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* edit order page
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private function editOrderPage(): void
|
||||||
|
{
|
||||||
|
// get is for "table_name" and "where" only
|
||||||
|
$table_name = $_GET['table_name'] ?? $_POST['table_name'] ?? '';
|
||||||
|
// not in use
|
||||||
|
// $where_string = $_GET['where'] ?? $_POST['where'] ?? '';
|
||||||
|
// order name is _always_ order_number for the edit interface
|
||||||
|
|
||||||
|
// follwing arrays do exist here:
|
||||||
|
// $position ... has the positions of the [0..max], cause in a <select>
|
||||||
|
// I can't put an number into the array field, in this array,
|
||||||
|
// there are the POSITION stored,
|
||||||
|
// that should CHANGE there order (up/down)
|
||||||
|
// $row_data_id ... has ALL ids from the sorting part
|
||||||
|
// $row_data_order ... has ALL order positions from the soirting part
|
||||||
|
$position = $_POST['position'] ?? [];
|
||||||
|
$row_data_id = $_POST['row_data_id'] ?? [];
|
||||||
|
$original_id = $row_data_id;
|
||||||
|
$row_data_order = $_POST['row_data_order'] ?? [];
|
||||||
|
// direction
|
||||||
|
$up = $_POST['up'] ?? '';
|
||||||
|
$down = $_POST['down'] ?? '';
|
||||||
|
if (count($position)) {
|
||||||
|
// FIRST u have to put right sort, then read again ...
|
||||||
|
// hast to be >0 or the first one is selected and then there is no move
|
||||||
|
if (!empty($up) && isset($position[0]) && $position[0] > 0) {
|
||||||
|
for ($i = 0; $i < count($position); $i++) {
|
||||||
|
// change position order
|
||||||
|
// this gets temp, id before that, gets actual (moves one "down")
|
||||||
|
// this gets the old before (moves one "up")
|
||||||
|
// is done for every element in row
|
||||||
|
// echo "A: ".$row_data_id[$position[$i]]
|
||||||
|
// ." (".$row_data_order[$position[$i]].") -- ".$row_data_id[$position[$i]-1]
|
||||||
|
// ." (".$row_data_order[$position[$i]-1].")<br>";
|
||||||
|
$temp_id = $row_data_id[$position[$i]] ?? null;
|
||||||
|
$row_data_id[$position[$i]] = $row_data_id[(int)$position[$i] - 1] ?? null;
|
||||||
|
$row_data_id[(int)$position[$i] - 1] = $temp_id;
|
||||||
|
// echo "A: ".$row_data_id[$position[$i]]
|
||||||
|
// ." (".$row_data_order[$position[$i]].") -- "
|
||||||
|
// .$row_data_id[$position[$i]-1]." (".$row_data_order[$position[$i]-1].")<br>";
|
||||||
|
} // for
|
||||||
|
} // if up
|
||||||
|
|
||||||
|
// the last position id from position array is not to be the count - 1 of
|
||||||
|
// row_data_id array, or it is the last element
|
||||||
|
if (!empty($down) && ($position[count($position) - 1] != (count($row_data_id) - 1))) {
|
||||||
|
for ($i = count($position) - 1; $i >= 0; $i--) {
|
||||||
|
// same as up, just up in other way, starts from bottom (last element) and moves "up"
|
||||||
|
// element before actuel gets temp, this element, becomes element after this,
|
||||||
|
// element after this, gets this
|
||||||
|
$temp_id = $row_data_id[(int)$position[$i] + 1] ?? null;
|
||||||
|
$row_data_id[(int)$position[$i] + 1] = $row_data_id[$position[$i]] ?? null;
|
||||||
|
$row_data_id[$position[$i]] = $temp_id;
|
||||||
|
} // for
|
||||||
|
} // if down
|
||||||
|
|
||||||
|
// write data ... (which has to be abstrackt ...)
|
||||||
|
if (
|
||||||
|
(!empty($up) && $position[0] > 0) ||
|
||||||
|
(!empty($down) && ($position[count($position) - 1] != (count($row_data_id) - 1)))
|
||||||
|
) {
|
||||||
|
for ($i = 0; $i < count($row_data_id); $i++) {
|
||||||
|
if (isset($row_data_order[$i]) && isset($row_data_id[$i])) {
|
||||||
|
$q = "UPDATE " . $table_name
|
||||||
|
. " SET order_number = " . $row_data_order[$i]
|
||||||
|
. " WHERE " . $table_name . "_id = " . $row_data_id[$i];
|
||||||
|
$q = $this->form->dbExec($q);
|
||||||
|
}
|
||||||
|
} // for all article ids ...
|
||||||
|
} // if write
|
||||||
|
} // if there is something to move
|
||||||
|
|
||||||
|
// get ...
|
||||||
|
$q = "SELECT " . $table_name . "_id, name, order_number FROM " . $table_name . " ";
|
||||||
|
// /* if (!empty($where_string)) {
|
||||||
|
// $q .= "WHERE $where_string ";
|
||||||
|
// } */
|
||||||
|
$q .= "ORDER BY order_number";
|
||||||
|
|
||||||
|
// init arrays
|
||||||
|
$row_data = [];
|
||||||
|
$options_id = [];
|
||||||
|
$options_name = [];
|
||||||
|
$options_selected = [];
|
||||||
|
// DB read data for menu
|
||||||
|
while (is_array($res = $this->form->dbReturn($q))) {
|
||||||
|
$row_data[] = [
|
||||||
|
"id" => $res[$table_name . "_id"],
|
||||||
|
"name" => $res["name"],
|
||||||
|
"order" => $res["order_number"]
|
||||||
|
];
|
||||||
|
} // while read data ...
|
||||||
|
|
||||||
|
// html title
|
||||||
|
$this->HEADER['HTML_TITLE'] = $this->form->l->__('Edit Order');
|
||||||
|
|
||||||
|
$messages = [];
|
||||||
|
$error = $_POST['error'] ?? 0;
|
||||||
|
// error msg
|
||||||
|
if (!empty($error)) {
|
||||||
|
$msg = $_POST['msg'] ?? [];
|
||||||
|
if (!is_array($msg)) {
|
||||||
|
$msg = [];
|
||||||
|
}
|
||||||
|
$messages[] = [
|
||||||
|
'msg' => $msg,
|
||||||
|
'class' => 'error',
|
||||||
|
'width' => '100%'
|
||||||
|
];
|
||||||
|
}
|
||||||
|
$this->DATA['form_error_msg'] = $messages;
|
||||||
|
|
||||||
|
// all the row data
|
||||||
|
for ($i = 0; $i < count($row_data); $i++) {
|
||||||
|
$options_id[] = $i;
|
||||||
|
$options_name[] = $row_data[$i]['name'];
|
||||||
|
// list of points to order
|
||||||
|
for ($j = 0; $j < count($position); $j++) {
|
||||||
|
// if matches, put into select array
|
||||||
|
if (
|
||||||
|
isset($original_id[$position[$j]]) && isset($row_data[$i]['id']) &&
|
||||||
|
$original_id[$position[$j]] == $row_data[$i]['id']
|
||||||
|
) {
|
||||||
|
$options_selected[] = $i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->DATA['options_id'] = $options_id;
|
||||||
|
$this->DATA['options_name'] = $options_name;
|
||||||
|
$this->DATA['options_selected'] = $options_selected;
|
||||||
|
|
||||||
|
// hidden list for the data (id, order number)
|
||||||
|
$row_data_id = [];
|
||||||
|
$row_data_order = [];
|
||||||
|
for ($i = 0; $i < count($row_data); $i++) {
|
||||||
|
$row_data_id[] = $row_data[$i]['id'];
|
||||||
|
$row_data_order[] = $row_data[$i]['order'];
|
||||||
|
}
|
||||||
|
$this->DATA['row_data_id'] = $row_data_id;
|
||||||
|
$this->DATA['row_data_order'] = $row_data_order;
|
||||||
|
|
||||||
|
// hidden names for the table & where string
|
||||||
|
$this->DATA['table_name'] = $table_name;
|
||||||
|
$this->DATA['where_string'] = '';
|
||||||
|
// $this->DATA['where_string'] = $where_string ?? '';
|
||||||
|
|
||||||
|
$this->EDIT_TEMPLATE = 'edit_order.tpl';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* all edit pages
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private function editPageFlow(): void
|
||||||
|
{
|
||||||
|
// set table width
|
||||||
|
$table_width = '100%';
|
||||||
|
// load call only if id is set
|
||||||
|
if (!empty($_POST[$this->form->archive_pk_name])) {
|
||||||
|
$this->form->formProcedureLoad($_POST[$this->form->archive_pk_name]);
|
||||||
|
}
|
||||||
|
$this->form->formProcedureNew();
|
||||||
|
$this->form->formProcedureSave();
|
||||||
|
$this->form->formProcedureDelete();
|
||||||
|
// delete call only if those two are set
|
||||||
|
// and we are not in new/save/master delete
|
||||||
|
if (
|
||||||
|
!$this->form->new &&
|
||||||
|
!$this->form->save &&
|
||||||
|
!$this->form->delete &&
|
||||||
|
!empty($_POST['element_list']) &&
|
||||||
|
!empty($_POST['remove_name'])
|
||||||
|
) {
|
||||||
|
$this->form->formProcedureDeleteFromElementList(
|
||||||
|
$_POST['element_list'],
|
||||||
|
$_POST['remove_name']
|
||||||
|
);
|
||||||
|
// run a load post element delete to not end up with empty page
|
||||||
|
$this->form->formLoadTableArray($_POST[$this->form->archive_pk_name]);
|
||||||
|
$this->form->yes = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->DATA['table_width'] = $table_width;
|
||||||
|
|
||||||
|
$messages = [];
|
||||||
|
// write out error / status messages
|
||||||
|
$messages[] = $this->form->formPrintMsg();
|
||||||
|
$this->DATA['form_error_msg'] = $messages;
|
||||||
|
|
||||||
|
// MENU START
|
||||||
|
// request some session vars
|
||||||
|
if (empty($_SESSION['HEADER_COLOR'])) {
|
||||||
|
$this->DATA['HEADER_COLOR'] = '#E0E2FF';
|
||||||
|
} else {
|
||||||
|
$this->DATA['HEADER_COLOR'] = $_SESSION['HEADER_COLOR'];
|
||||||
|
}
|
||||||
|
$this->DATA['USER_NAME'] = $_SESSION['USER_NAME'];
|
||||||
|
$this->DATA['EUID'] = $_SESSION['EUID'];
|
||||||
|
$this->DATA['GROUP_NAME'] = $_SESSION['GROUP_NAME'];
|
||||||
|
$this->DATA['GROUP_LEVEL'] = $_SESSION['GROUP_ACL_LEVEL'];
|
||||||
|
$PAGES = $_SESSION['PAGES'];
|
||||||
|
|
||||||
|
//$this->form->log->debug('menu', $this->form->log->prAr($PAGES));
|
||||||
|
|
||||||
|
// build nav from $PAGES ...
|
||||||
|
if (!isset($PAGES) || !is_array($PAGES)) {
|
||||||
|
$PAGES = [];
|
||||||
|
}
|
||||||
|
$menuarray = [];
|
||||||
|
foreach ($PAGES as $PAGE_CUID => $PAGE_DATA) {
|
||||||
|
if ($PAGE_DATA['menu'] && $PAGE_DATA['online']) {
|
||||||
|
$menuarray[] = $PAGE_DATA;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// split point for nav points
|
||||||
|
$COUNT_NAV_POINTS = count($menuarray);
|
||||||
|
$SPLIT_FACTOR = 3;
|
||||||
|
$START_SPLIT_COUNT = 3;
|
||||||
|
// WTF ?? I dunno what I am doing here ...
|
||||||
|
for ($i = 9; $i < $COUNT_NAV_POINTS; $i += $START_SPLIT_COUNT) {
|
||||||
|
if ($COUNT_NAV_POINTS > $i) {
|
||||||
|
$SPLIT_FACTOR += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$position = 0;
|
||||||
|
$menu_data = [];
|
||||||
|
// for ($i = 1; $i <= count($menuarray); $i ++) {
|
||||||
|
foreach ($menuarray as $i => $menu_element) {
|
||||||
|
// do that for new array
|
||||||
|
$j = $i + 1;
|
||||||
|
$menu_data[$i]['pagename'] = htmlentities($menu_element['page_name']);
|
||||||
|
$menu_data[$i]['filename'] =
|
||||||
|
// prefix folder or host name
|
||||||
|
(isset($menu_element['hostname']) && $menu_element['hostname'] ?
|
||||||
|
$menu_element['hostname'] :
|
||||||
|
''
|
||||||
|
)
|
||||||
|
// filename
|
||||||
|
. ($menu_element['filename'] ?? '')
|
||||||
|
// query string
|
||||||
|
. (isset($menu_element['query_string']) && $menu_element['query_string'] ?
|
||||||
|
$menu_element['query_string'] :
|
||||||
|
''
|
||||||
|
);
|
||||||
|
if ($j == 1 || !($i % $SPLIT_FACTOR)) {
|
||||||
|
$menu_data[$i]['splitfactor_in'] = 1;
|
||||||
|
} else {
|
||||||
|
$menu_data[$i]['splitfactor_in'] = 0;
|
||||||
|
}
|
||||||
|
// on matching, we also need to check if we are in the same folder
|
||||||
|
if (
|
||||||
|
isset($menu_element['filename']) &&
|
||||||
|
$menu_element['filename'] == \CoreLibs\Get\System::getPageName() &&
|
||||||
|
(!isset($menu_element['hostname']) || (
|
||||||
|
isset($menu_element['hostname']) &&
|
||||||
|
(!$menu_element['hostname'] || strstr($menu_element['hostname'], CONTENT_PATH) !== false)
|
||||||
|
))
|
||||||
|
) {
|
||||||
|
$position = $i;
|
||||||
|
$menu_data[$i]['position'] = 1;
|
||||||
|
$menu_data[$i]['popup'] = 0;
|
||||||
|
} else {
|
||||||
|
// add query stuff
|
||||||
|
// HAS TO DONE LATER ... set urlencode, etc ...
|
||||||
|
// check if popup needed
|
||||||
|
if (isset($menu_element['popup']) && $menu_element['popup'] == 1) {
|
||||||
|
$menu_data[$i]['popup'] = 1;
|
||||||
|
$menu_data[$i]['rand'] = uniqid((string)rand());
|
||||||
|
$menu_data[$i]['width'] = $menu_element['popup_x'];
|
||||||
|
$menu_data[$i]['height'] = $menu_element['popup_y'];
|
||||||
|
} else {
|
||||||
|
$menu_data[$i]['popup'] = 0;
|
||||||
|
}
|
||||||
|
$menu_data[$i]['position'] = 0;
|
||||||
|
} // highlight or not
|
||||||
|
if (!($j % $SPLIT_FACTOR) || (($j + 1) > count($menuarray))) {
|
||||||
|
$menu_data[$i]['splitfactor_out'] = 1;
|
||||||
|
} else {
|
||||||
|
$menu_data[$i]['splitfactor_out'] = 0;
|
||||||
|
}
|
||||||
|
} // for
|
||||||
|
// $this->form->log->debug('MENU ARRAY', $this->form->log->prAr($menu_data));
|
||||||
|
$this->DATA['menu_data'] = $menu_data;
|
||||||
|
$this->DATA['page_name'] = $menuarray[$position]['page_name'] ?? '-Undefined [' . $position . '] -';
|
||||||
|
$L_TITLE = $this->DATA['page_name'];
|
||||||
|
// html title
|
||||||
|
$this->HEADER['HTML_TITLE'] = $this->form->l->__($L_TITLE);
|
||||||
|
// END MENU
|
||||||
|
// LOAD AND NEW
|
||||||
|
$this->DATA['load'] = $this->form->formCreateLoad();
|
||||||
|
$this->DATA['new'] = $this->form->formCreateNew();
|
||||||
|
// SHOW DATA PART
|
||||||
|
if ($this->form->yes) {
|
||||||
|
$this->DATA['form_yes'] = $this->form->yes;
|
||||||
|
$this->DATA['form_my_page_name'] = $this->form->my_page_name;
|
||||||
|
$this->DATA['filename_exist'] = 0;
|
||||||
|
$this->DATA['drop_down_input'] = 0;
|
||||||
|
$elements = [];
|
||||||
|
// depending on the "getPageName()" I show different stuff
|
||||||
|
switch ($this->form->my_page_name) {
|
||||||
|
case 'edit_users':
|
||||||
|
$elements[] = $this->form->formCreateElement('login_error_count');
|
||||||
|
$elements[] = $this->form->formCreateElement('login_error_date_last');
|
||||||
|
$elements[] = $this->form->formCreateElement('login_error_date_first');
|
||||||
|
$elements[] = $this->form->formCreateElement('enabled');
|
||||||
|
$elements[] = $this->form->formCreateElement('deleted');
|
||||||
|
$elements[] = $this->form->formCreateElement('protected');
|
||||||
|
$elements[] = $this->form->formCreateElement('username');
|
||||||
|
$elements[] = $this->form->formCreateElement('password');
|
||||||
|
$elements[] = $this->form->formCreateElement('password_change_interval');
|
||||||
|
$elements[] = $this->form->formCreateElement('login_user_id');
|
||||||
|
$elements[] = $this->form->formCreateElement('login_user_id_set_date');
|
||||||
|
$elements[] = $this->form->formCreateElement('login_user_id_last_revalidate');
|
||||||
|
$elements[] = $this->form->formCreateElement('login_user_id_locked');
|
||||||
|
$elements[] = $this->form->formCreateElement('login_user_id_revalidate_after');
|
||||||
|
$elements[] = $this->form->formCreateElement('login_user_id_valid_from');
|
||||||
|
$elements[] = $this->form->formCreateElement('login_user_id_valid_until');
|
||||||
|
$elements[] = $this->form->formCreateElement('email');
|
||||||
|
$elements[] = $this->form->formCreateElement('last_name');
|
||||||
|
$elements[] = $this->form->formCreateElement('first_name');
|
||||||
|
$elements[] = $this->form->formCreateElement('edit_group_id');
|
||||||
|
$elements[] = $this->form->formCreateElement('edit_access_right_id');
|
||||||
|
$elements[] = $this->form->formCreateElement('strict');
|
||||||
|
$elements[] = $this->form->formCreateElement('locked');
|
||||||
|
$elements[] = $this->form->formCreateElement('lock_until');
|
||||||
|
$elements[] = $this->form->formCreateElement('lock_after');
|
||||||
|
$elements[] = $this->form->formCreateElement('admin');
|
||||||
|
$elements[] = $this->form->formCreateElement('debug');
|
||||||
|
$elements[] = $this->form->formCreateElement('db_debug');
|
||||||
|
$elements[] = $this->form->formCreateElement('edit_language_id');
|
||||||
|
$elements[] = $this->form->formCreateElement('edit_scheme_id');
|
||||||
|
$elements[] = $this->form->formCreateElementListTable('edit_access_user');
|
||||||
|
$elements[] = $this->form->formCreateElement('additional_acl');
|
||||||
|
break;
|
||||||
|
case 'edit_schemes':
|
||||||
|
$elements[] = $this->form->formCreateElement('enabled');
|
||||||
|
$elements[] = $this->form->formCreateElement('name');
|
||||||
|
$elements[] = $this->form->formCreateElement('header_color');
|
||||||
|
$elements[] = $this->form->formCreateElement('template');
|
||||||
|
break;
|
||||||
|
case 'edit_pages':
|
||||||
|
if (!isset($this->form->table_array['edit_page_id']['value'])) {
|
||||||
|
$q = "DELETE FROM temp_files";
|
||||||
|
$this->form->dbExec($q);
|
||||||
|
// gets all files in the current dir and dirs given ending with .php
|
||||||
|
$folders = ['../admin/', '../frontend/'];
|
||||||
|
$files = ['*.php'];
|
||||||
|
$search_glob = [];
|
||||||
|
foreach ($folders as $folder) {
|
||||||
|
// make sure this folder actually exists
|
||||||
|
if (is_dir(ROOT . $folder)) {
|
||||||
|
foreach ($files as $file) {
|
||||||
|
$search_glob[] = $folder . $file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$crap = exec('ls ' . join(' ', $search_glob), $output, $status);
|
||||||
|
// now get all that are NOT in de DB
|
||||||
|
$q = "INSERT INTO temp_files (folder, filename) VALUES ";
|
||||||
|
$t_q = '';
|
||||||
|
foreach ($output as $output_file) {
|
||||||
|
// split the ouput into folder and file
|
||||||
|
$pathinfo = pathinfo($output_file);
|
||||||
|
if (!empty($pathinfo['dirname'])) {
|
||||||
|
$pathinfo['dirname'] .= DIRECTORY_SEPARATOR;
|
||||||
|
} else {
|
||||||
|
$pathinfo['dirname'] = '';
|
||||||
|
}
|
||||||
|
if ($t_q) {
|
||||||
|
$t_q .= ', ';
|
||||||
|
}
|
||||||
|
$t_q .= "('" . $this->form->dbEscapeString($pathinfo['dirname']) . "', '"
|
||||||
|
. $this->form->dbEscapeString($pathinfo['basename']) . "')";
|
||||||
|
}
|
||||||
|
$this->form->dbExec($q . $t_q, 'NULL');
|
||||||
|
$elements[] = $this->form->formCreateElement('filename');
|
||||||
|
} else {
|
||||||
|
// show file menu
|
||||||
|
// just show name of file ...
|
||||||
|
$this->DATA['filename_exist'] = 1;
|
||||||
|
$this->DATA['filename'] = $this->form->table_array['filename']['value'];
|
||||||
|
} // File Name View IF
|
||||||
|
$elements[] = $this->form->formCreateElement('hostname');
|
||||||
|
$elements[] = $this->form->formCreateElement('name');
|
||||||
|
// $elements[] = $this->form->formCreateElement('tag');
|
||||||
|
// $elements[] = $this->form->formCreateElement('min_acl');
|
||||||
|
$elements[] = $this->form->formCreateElement('order_number');
|
||||||
|
$elements[] = $this->form->formCreateElement('online');
|
||||||
|
$elements[] = $this->form->formCreateElement('menu');
|
||||||
|
$elements[] = $this->form->formCreateElementListTable('edit_query_string');
|
||||||
|
$elements[] = $this->form->formCreateElement('content_alias_edit_page_id');
|
||||||
|
$elements[] = $this->form->formCreateElementListTable('edit_page_content');
|
||||||
|
$elements[] = $this->form->formCreateElement('popup');
|
||||||
|
$elements[] = $this->form->formCreateElement('popup_x');
|
||||||
|
$elements[] = $this->form->formCreateElement('popup_y');
|
||||||
|
$elements[] = $this->form->formCreateElementReferenceTable('edit_visible_group');
|
||||||
|
$elements[] = $this->form->formCreateElementReferenceTable('edit_menu_group');
|
||||||
|
break;
|
||||||
|
case 'edit_languages':
|
||||||
|
$elements[] = $this->form->formCreateElement('enabled');
|
||||||
|
$elements[] = $this->form->formCreateElement('short_name');
|
||||||
|
$elements[] = $this->form->formCreateElement('long_name');
|
||||||
|
$elements[] = $this->form->formCreateElement('iso_name');
|
||||||
|
break;
|
||||||
|
case 'edit_groups':
|
||||||
|
$elements[] = $this->form->formCreateElement('enabled');
|
||||||
|
$elements[] = $this->form->formCreateElement('name');
|
||||||
|
$elements[] = $this->form->formCreateElement('edit_access_right_id');
|
||||||
|
$elements[] = $this->form->formCreateElement('edit_scheme_id');
|
||||||
|
$elements[] = $this->form->formCreateElementListTable('edit_page_access');
|
||||||
|
$elements[] = $this->form->formCreateElement('additional_acl');
|
||||||
|
break;
|
||||||
|
case 'edit_visible_group':
|
||||||
|
$elements[] = $this->form->formCreateElement('name');
|
||||||
|
$elements[] = $this->form->formCreateElement('flag');
|
||||||
|
break;
|
||||||
|
case 'edit_menu_group':
|
||||||
|
$elements[] = $this->form->formCreateElement('name');
|
||||||
|
$elements[] = $this->form->formCreateElement('flag');
|
||||||
|
$elements[] = $this->form->formCreateElement('order_number');
|
||||||
|
break;
|
||||||
|
case 'edit_access':
|
||||||
|
$elements[] = $this->form->formCreateElement('name');
|
||||||
|
$elements[] = $this->form->formCreateElement('enabled');
|
||||||
|
$elements[] = $this->form->formCreateElement('protected');
|
||||||
|
$elements[] = $this->form->formCreateElement('color');
|
||||||
|
$elements[] = $this->form->formCreateElement('description');
|
||||||
|
// add name/value list here
|
||||||
|
$elements[] = $this->form->formCreateElementListTable('edit_access_data');
|
||||||
|
$elements[] = $this->form->formCreateElement('additional_acl');
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
print '[No valid page definition given]';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// $this->form->log->debug('edit', "Elements: <pre>".$this->form->log->prAr($elements));
|
||||||
|
$this->DATA['elements'] = $elements;
|
||||||
|
$this->DATA['hidden'] = $this->form->formCreateHiddenFields();
|
||||||
|
$this->DATA['save_delete'] = $this->form->formCreateSaveDelete();
|
||||||
|
} else {
|
||||||
|
$this->DATA['form_yes'] = 0;
|
||||||
|
}
|
||||||
|
$this->EDIT_TEMPLATE = 'edit_body.tpl';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* main method that either calls edit order page method or general page
|
||||||
|
* builds the smarty content and runs smarty display output
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
* @throws Exception
|
||||||
|
* @throws SmartyException
|
||||||
|
*/
|
||||||
|
public function editBaseRun()
|
||||||
|
{
|
||||||
|
// set the template dir
|
||||||
|
// WARNING: this has a special check for the mailing tool layout (old layout)
|
||||||
|
if (defined('LAYOUT')) {
|
||||||
|
$this->smarty->setTemplateDir(BASE . INCLUDES . TEMPLATES . CONTENT_PATH);
|
||||||
|
$this->DATA['css'] = LAYOUT . CSS;
|
||||||
|
$this->DATA['js'] = LAYOUT . JS;
|
||||||
|
} else {
|
||||||
|
$this->smarty->setTemplateDir(TEMPLATES);
|
||||||
|
$this->DATA['css'] = CSS;
|
||||||
|
$this->DATA['js'] = JS;
|
||||||
|
}
|
||||||
|
$ADMIN_STYLESHEET = 'edit.css';
|
||||||
|
// define all needed smarty stuff for the general HTML/page building
|
||||||
|
$this->HEADER['CSS'] = CSS;
|
||||||
|
$this->HEADER['DEFAULT_ENCODING'] = DEFAULT_ENCODING;
|
||||||
|
/** @phpstan-ignore-next-line because ADMIN_STYLESHEET can be null */
|
||||||
|
$this->HEADER['STYLESHEET'] = $ADMIN_STYLESHEET ?? ADMIN_STYLESHEET;
|
||||||
|
|
||||||
|
// main run
|
||||||
|
if ($this->form->my_page_name == 'edit_order') {
|
||||||
|
$this->editOrderPage();
|
||||||
|
} else {
|
||||||
|
$this->editPageFlow();
|
||||||
|
}
|
||||||
|
|
||||||
|
// debug data, if DEBUG flag is on, this data is print out
|
||||||
|
// $this->DEBUG_DATA['DEBUG'] = $DEBUG_TMPL ?? '';
|
||||||
|
$this->DEBUG_DATA['DEBUG'] = '';
|
||||||
|
|
||||||
|
// create main data array
|
||||||
|
$CONTENT_DATA = array_merge($this->HEADER, $this->DATA, $this->DEBUG_DATA);
|
||||||
|
// data is 1:1 mapping (all vars, values, etc)
|
||||||
|
foreach ($CONTENT_DATA as $key => $value) {
|
||||||
|
$this->smarty->assign($key, $value);
|
||||||
|
}
|
||||||
|
if (is_dir(BASE . TEMPLATES_C)) {
|
||||||
|
$this->smarty->setCompileDir(BASE . TEMPLATES_C);
|
||||||
|
}
|
||||||
|
if (is_dir(BASE . CACHE)) {
|
||||||
|
$this->smarty->setCacheDir(BASE . CACHE);
|
||||||
|
}
|
||||||
|
$this->smarty->display(
|
||||||
|
$this->EDIT_TEMPLATE,
|
||||||
|
'editAdmin_' . $this->smarty->lang,
|
||||||
|
'editAdmin_' . $this->smarty->lang
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->form->log->debug('DEBUGEND', '==================================== [Form END]');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
187
www/lib/CoreLibs/Check/Colors.php
Normal file
187
www/lib/CoreLibs/Check/Colors.php
Normal file
@@ -0,0 +1,187 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* valid checks for css/html based colors
|
||||||
|
* # hex
|
||||||
|
* # hex + alpha
|
||||||
|
* rgb
|
||||||
|
* rgba
|
||||||
|
* hsl
|
||||||
|
* hsla
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace CoreLibs\Check;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
|
|
||||||
|
class Colors
|
||||||
|
{
|
||||||
|
/** @var int 1 for HEX rgb */
|
||||||
|
public const HEX_RGB = 1;
|
||||||
|
/** @var int 2 for HEX rgb with alpha */
|
||||||
|
public const HEX_RGBA = 2;
|
||||||
|
/** @var int 4 for rgb() */
|
||||||
|
public const RGB = 4;
|
||||||
|
/** @var int 8 for rgba() */
|
||||||
|
public const RGBA = 8;
|
||||||
|
/** @var int 16 for hsl() */
|
||||||
|
public const HSL = 16;
|
||||||
|
/** @var int 32 for hsla() */
|
||||||
|
public const HSLA = 32;
|
||||||
|
/** @var int 63 for all bits set (sum of above) */
|
||||||
|
public const ALL = 63;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* check rgb/hsl content values in detail
|
||||||
|
* will abort and return false on first error found
|
||||||
|
*
|
||||||
|
* @param string $color html/css tring to check
|
||||||
|
* @param int|false $rgb_flag flag to check for rgb
|
||||||
|
* @param int|false $hsl_flag flag to check for hsl type
|
||||||
|
* @return bool True if no error, False if error
|
||||||
|
*/
|
||||||
|
private static function rgbHslContentCheck(string $color, $rgb_flag, $hsl_flag): bool
|
||||||
|
{
|
||||||
|
// extract string between () and split into elements
|
||||||
|
preg_match("/\((.*)\)/", $color, $matches);
|
||||||
|
if (
|
||||||
|
!is_array($color_list = preg_split("/,\s*/", $matches[1] ?? ''))
|
||||||
|
) {
|
||||||
|
throw new \Exception("Could not extract color list from rgg/hsl", 3);
|
||||||
|
}
|
||||||
|
// based on rgb/hsl settings check that entries are valid
|
||||||
|
// rgb: either 0-255 OR 0-100%
|
||||||
|
// hsl: first: 0-360
|
||||||
|
foreach ($color_list as $pos => $color_check) {
|
||||||
|
if (empty($color_check)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$percent_check = false;
|
||||||
|
if (strrpos($color_check, '%', -1) !== false) {
|
||||||
|
$percent_check = true;
|
||||||
|
$color_check = str_replace('%', '', $color_check);
|
||||||
|
}
|
||||||
|
// first three normal percent or valid number
|
||||||
|
if ($rgb_flag !== false) {
|
||||||
|
if ($percent_check === true) {
|
||||||
|
// for ALL pos
|
||||||
|
if ($color_check < 0 || $color_check > 100) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} elseif (
|
||||||
|
$pos < 3 &&
|
||||||
|
($color_check < 0 || $color_check > 255)
|
||||||
|
) {
|
||||||
|
return false;
|
||||||
|
} elseif (
|
||||||
|
// RGBA set pos 3 if not percent
|
||||||
|
$pos == 3 &&
|
||||||
|
($color_check < 0 || $color_check > 1)
|
||||||
|
) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} elseif ($hsl_flag !== false) {
|
||||||
|
// pos 0: 0-360
|
||||||
|
// pos 1,2: %
|
||||||
|
// pos 3: % or 0-1 (float)
|
||||||
|
if (
|
||||||
|
$pos == 0 &&
|
||||||
|
($color_check < 0 || $color_check > 360)
|
||||||
|
) {
|
||||||
|
return false;
|
||||||
|
} elseif (
|
||||||
|
// if pos 1/2 are not percent
|
||||||
|
($pos == 1 || $pos == 2) &&
|
||||||
|
($percent_check != true ||
|
||||||
|
($color_check < 0 || $color_check > 100))
|
||||||
|
) {
|
||||||
|
return false;
|
||||||
|
} elseif (
|
||||||
|
// 3 is either percent or 0~1
|
||||||
|
$pos == 3 &&
|
||||||
|
(
|
||||||
|
($percent_check == false &&
|
||||||
|
($color_check < 0 || $color_check > 1)) ||
|
||||||
|
($percent_check === true &&
|
||||||
|
($color_check < 0 || $color_check > 100))
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* check if html/css color string is valid
|
||||||
|
* @param string $color A color string of any format
|
||||||
|
* @param int $flags defaults to ALL, else use | to combined from
|
||||||
|
* HEX_RGB, HEX_RGBA, RGB, RGBA, HSL, HSLA
|
||||||
|
* @return bool True if valid, False if not
|
||||||
|
* @throws Exception 1: no valid flag set
|
||||||
|
*/
|
||||||
|
public static function validateColor(string $color, int $flags = self::ALL): bool
|
||||||
|
{
|
||||||
|
// blocks for each check
|
||||||
|
$regex_blocks = [];
|
||||||
|
// set what to check
|
||||||
|
if ($flags & self::HEX_RGB) {
|
||||||
|
$regex_blocks[] = '#[\dA-Fa-f]{6}';
|
||||||
|
}
|
||||||
|
if ($flags & self::HEX_RGBA) {
|
||||||
|
$regex_blocks[] = '#[\dA-Fa-f]{8}';
|
||||||
|
}
|
||||||
|
if ($flags & self::RGB) {
|
||||||
|
$regex_blocks[] = 'rgb\(\d{1,3}%?,\s*\d{1,3}%?,\s*\d{1,3}%?\)';
|
||||||
|
}
|
||||||
|
if ($flags & self::RGBA) {
|
||||||
|
$regex_blocks[] = 'rgba\(\d{1,3}%?,\s*\d{1,3}%?,\s*\d{1,3}%?(,\s*(0\.\d{1,2}|1(\.0)?|\d{1,3}%))?\)';
|
||||||
|
}
|
||||||
|
if ($flags & self::HSL) {
|
||||||
|
$regex_blocks[] = 'hsl\(\d{1,3},\s*\d{1,3}(\.\d{1})?%,\s*\d{1,3}(\.\d{1})?%\)';
|
||||||
|
}
|
||||||
|
if ($flags & self::HSLA) {
|
||||||
|
$regex_blocks[] = 'hsla\(\d{1,3},\s*\d{1,3}(\.\d{1})?%,\s*\d{1,3}'
|
||||||
|
. '(\.\d{1})?%(,\s*(0\.\d{1,2}|1(\.0)?|\d{1,3}%))?\)';
|
||||||
|
}
|
||||||
|
// wrong flag set
|
||||||
|
if ($flags > self::ALL) {
|
||||||
|
throw new \Exception("Invalid flags parameter: $flags", 1);
|
||||||
|
}
|
||||||
|
if (!count($regex_blocks)) {
|
||||||
|
throw new \Exception("No regex blocks set: $flags", 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// build regex
|
||||||
|
$regex = '^('
|
||||||
|
. join('|', $regex_blocks)
|
||||||
|
// close regex
|
||||||
|
. ')$';
|
||||||
|
// print "C: $color, F: $flags, R: $regex\n";
|
||||||
|
|
||||||
|
if (preg_match("/$regex/", $color)) {
|
||||||
|
// if valid regex, we now need to check if the content is actually valid
|
||||||
|
// only for rgb/hsl type
|
||||||
|
/** @var int|false */
|
||||||
|
$rgb_flag = strpos($color, 'rgb');
|
||||||
|
/** @var int|false */
|
||||||
|
$hsl_flag = strpos($color, 'hsl');
|
||||||
|
// if both not match, return true
|
||||||
|
if (
|
||||||
|
$rgb_flag === false &&
|
||||||
|
$hsl_flag === false
|
||||||
|
) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// run detaul rgb/hsl content check
|
||||||
|
return self::rgbHslContentCheck($color, $rgb_flag, $hsl_flag);
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -312,16 +312,17 @@ class DateTime
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* plits & checks date, wrap around for check_date function
|
* compares two dates, tries to convert them via strtotime to timestamps
|
||||||
* returns int in:
|
* returns int/bool in:
|
||||||
* -1 if the first date is smaller the last
|
* -1 if the first date is smaller the last
|
||||||
* 0 if both are equal
|
* 0 if both are equal
|
||||||
* 1 if the first date is bigger than the last
|
* 1 if the first date is bigger than the last
|
||||||
* false (bool): error
|
* false if date validation/conversion failed
|
||||||
*
|
*
|
||||||
* @param string $start_date start date string in YYYY-MM-DD
|
* @param string $start_date start date string in YYYY-MM-DD
|
||||||
* @param string $end_date end date string in YYYY-MM-DD
|
* @param string $end_date end date string in YYYY-MM-DD
|
||||||
* @return int|bool false on error, or int -1/0/1 as difference
|
* @return int|bool false on error
|
||||||
|
* or int -1 (s<e)/0 (s=e)/1 (s>e) as difference
|
||||||
*/
|
*/
|
||||||
public static function compareDate($start_date, $end_date)
|
public static function compareDate($start_date, $end_date)
|
||||||
{
|
{
|
||||||
@@ -354,16 +355,17 @@ class DateTime
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* compares the two dates + times. if seconds missing in one set,
|
* compares the two dates + times. if seconds missing in one set,
|
||||||
* add :00, converts / to -
|
* adds :00, converts date + times via strtotime to timestamps
|
||||||
* returns int/bool in:
|
* returns int/bool in:
|
||||||
* -1 if the first date is smaller the last
|
* -1 if the first date is smaller the last
|
||||||
* 0 if both are equal
|
* 0 if both are equal
|
||||||
* 1 if the first date is bigger than the last
|
* 1 if the first date is bigger than the last
|
||||||
* false if no valid date/times chould be found
|
* false if date/times validation/conversion failed
|
||||||
*
|
*
|
||||||
* @param string $start_datetime start date/time in YYYY-MM-DD HH:mm:ss
|
* @param string $start_datetime start date/time in YYYY-MM-DD HH:mm:ss
|
||||||
* @param string $end_datetime end date/time in YYYY-MM-DD HH:mm:ss
|
* @param string $end_datetime end date/time in YYYY-MM-DD HH:mm:ss
|
||||||
* @return int|bool false for error or -1/0/1 as difference
|
* @return int|bool false for error
|
||||||
|
* or -1 (s<e)/0 (s=e)/1 (s>e) as difference
|
||||||
*/
|
*/
|
||||||
public static function compareDateTime($start_datetime, $end_datetime)
|
public static function compareDateTime($start_datetime, $end_datetime)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -26,14 +26,18 @@ class Byte
|
|||||||
* Source Idea: SOURCE: https://programming.guide/worlds-most-copied-so-snippet.html
|
* Source Idea: SOURCE: https://programming.guide/worlds-most-copied-so-snippet.html
|
||||||
*
|
*
|
||||||
* The class itself hast the following defined
|
* The class itself hast the following defined
|
||||||
* BYTE_FORMAT_NOSPACE [1] turn off spaces between number and extension
|
* BYTE_FORMAT_NOSPACE [1] turn off spaces between number and suffix
|
||||||
* BYTE_FORMAT_ADJUST [2] use sprintf to always print two decimals
|
* BYTE_FORMAT_ADJUST [2] use sprintf to always print two decimals
|
||||||
* BYTE_FORMAT_SI [3] use si standard 1000 instead of bytes 1024
|
* BYTE_FORMAT_SI [4] use si standard 1000 instead of bytes 1024
|
||||||
* To use the constant from outside use class::CONSTANT
|
* To use the constant from outside use class::CONSTANT
|
||||||
*
|
*
|
||||||
* @param string|int|float $bytes bytes as string int or pure int
|
* @param string|int|float $bytes bytes as string int or pure int
|
||||||
* @param int $flags bitwise flag with use space turned on
|
* @param int $flags bitwise flag with use space turned on
|
||||||
|
* BYTE_FORMAT_NOSPACE: no space between number and suffix
|
||||||
|
* BYTE_FORMAT_ADJUST: sprintf adjusted two 2 decimals
|
||||||
|
* BYTE_FORMAT_SI: use 1000 instead of 1024
|
||||||
* @return string converted byte number (float) with suffix
|
* @return string converted byte number (float) with suffix
|
||||||
|
* @throws \Exception 1: no valid flag set
|
||||||
*/
|
*/
|
||||||
public static function humanReadableByteFormat($bytes, int $flags = 0): string
|
public static function humanReadableByteFormat($bytes, int $flags = 0): string
|
||||||
{
|
{
|
||||||
@@ -58,11 +62,14 @@ class Byte
|
|||||||
} else {
|
} else {
|
||||||
$si = false;
|
$si = false;
|
||||||
}
|
}
|
||||||
|
if ($flags > 7) {
|
||||||
|
throw new \Exception("Invalid flags parameter: $flags", 1);
|
||||||
|
}
|
||||||
|
|
||||||
// si or normal
|
// si or normal
|
||||||
$unit = $si ? 1000 : 1024;
|
$unit = $si ? 1000 : 1024;
|
||||||
// always positive
|
// always positive
|
||||||
$abs_bytes = $bytes == PHP_INT_MIN ? PHP_INT_MAX : abs($bytes);
|
$abs_bytes = $bytes == PHP_INT_MIN ? PHP_INT_MAX : abs((float)$bytes);
|
||||||
// smaller than unit is always B
|
// smaller than unit is always B
|
||||||
if ($abs_bytes < $unit) {
|
if ($abs_bytes < $unit) {
|
||||||
return $bytes . 'B';
|
return $bytes . 'B';
|
||||||
@@ -106,11 +113,13 @@ class Byte
|
|||||||
* calculates the bytes based on a string with nnG, nnGB, nnM, etc
|
* calculates the bytes based on a string with nnG, nnGB, nnM, etc
|
||||||
* NOTE: large exabyte numbers will overflow
|
* NOTE: large exabyte numbers will overflow
|
||||||
* flag allowed:
|
* flag allowed:
|
||||||
* BYTE_FORMAT_SI [3] use si standard 1000 instead of bytes 1024
|
* BYTE_FORMAT_SI [4] use si standard 1000 instead of bytes 1024
|
||||||
*
|
*
|
||||||
* @param string|int|float $number any string or number to convert
|
* @param string|int|float $number any string or number to convert
|
||||||
* @param int $flags bitwise flag with use space turned on
|
* @param int $flags bitwise flag with use space turned on
|
||||||
|
* BYTE_FORMAT_SI: use 1000 instead of 1024
|
||||||
* @return string|int|float converted value or original value
|
* @return string|int|float converted value or original value
|
||||||
|
* @throws \Exception 1: no valid flag set
|
||||||
*/
|
*/
|
||||||
public static function stringByteFormat($number, int $flags = 0)
|
public static function stringByteFormat($number, int $flags = 0)
|
||||||
{
|
{
|
||||||
@@ -120,6 +129,9 @@ class Byte
|
|||||||
} else {
|
} else {
|
||||||
$si = false;
|
$si = false;
|
||||||
}
|
}
|
||||||
|
if ($flags != 0 && $flags != 4) {
|
||||||
|
throw new \Exception("Invalid flags parameter: $flags", 1);
|
||||||
|
}
|
||||||
// matches in regex
|
// matches in regex
|
||||||
$matches = [];
|
$matches = [];
|
||||||
// all valid units
|
// all valid units
|
||||||
@@ -134,7 +146,7 @@ class Byte
|
|||||||
// remove all non valid characters from the number
|
// remove all non valid characters from the number
|
||||||
$number = preg_replace('/[^0-9\.]/', '', $matches[2]);
|
$number = preg_replace('/[^0-9\.]/', '', $matches[2]);
|
||||||
// final clean up and convert to float
|
// final clean up and convert to float
|
||||||
$number = (float)trim($number);
|
$number = (float)trim((string)$number);
|
||||||
// convert any mb/gb/etc to single m/b
|
// convert any mb/gb/etc to single m/b
|
||||||
$unit = preg_replace('/[^bkmgtpezy]/i', '', $matches[3]);
|
$unit = preg_replace('/[^bkmgtpezy]/i', '', $matches[3]);
|
||||||
if ($unit) {
|
if ($unit) {
|
||||||
|
|||||||
@@ -150,6 +150,9 @@ class Colors
|
|||||||
{
|
{
|
||||||
// check that H is 0 to 359, 360 = 0
|
// check that H is 0 to 359, 360 = 0
|
||||||
// and S and V are 0 to 1
|
// and S and V are 0 to 1
|
||||||
|
if ($H == 360) {
|
||||||
|
$H = 0;
|
||||||
|
}
|
||||||
if ($H < 0 || $H > 359) {
|
if ($H < 0 || $H > 359) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -287,6 +290,9 @@ class Colors
|
|||||||
if (!is_numeric($hue)) {
|
if (!is_numeric($hue)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if ($hue == 360) {
|
||||||
|
$hue = 0;
|
||||||
|
}
|
||||||
if ($hue < 0 || $hue > 359) {
|
if ($hue < 0 || $hue > 359) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ class MimeEncode
|
|||||||
string $encoding,
|
string $encoding,
|
||||||
string $line_break = "\r\n"
|
string $line_break = "\r\n"
|
||||||
): string {
|
): string {
|
||||||
|
$current_internal_encoding = mb_internal_encoding();
|
||||||
// set internal encoding, so the mimeheader encode works correctly
|
// set internal encoding, so the mimeheader encode works correctly
|
||||||
mb_internal_encoding($encoding);
|
mb_internal_encoding($encoding);
|
||||||
// if a subject, make a work around for the broken mb_mimencode
|
// if a subject, make a work around for the broken mb_mimencode
|
||||||
@@ -60,6 +61,9 @@ class MimeEncode
|
|||||||
}
|
}
|
||||||
// strip out any spaces BEFORE a line break
|
// strip out any spaces BEFORE a line break
|
||||||
$string = str_replace(" " . $line_break, $line_break, $_string);
|
$string = str_replace(" " . $line_break, $line_break, $_string);
|
||||||
|
// before we end, reset internal encoding
|
||||||
|
mb_internal_encoding($current_internal_encoding);
|
||||||
|
// return mime encoded string
|
||||||
return $string;
|
return $string;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,7 +45,9 @@ class Email
|
|||||||
string $encoding = 'UTF-8',
|
string $encoding = 'UTF-8',
|
||||||
bool $kv_folding = false
|
bool $kv_folding = false
|
||||||
): string {
|
): string {
|
||||||
if (!empty($email_name)) {
|
if (empty($email_name)) {
|
||||||
|
return $email;
|
||||||
|
}
|
||||||
// if encoding is not UTF-8 then we convert
|
// if encoding is not UTF-8 then we convert
|
||||||
if ($encoding != 'UTF-8') {
|
if ($encoding != 'UTF-8') {
|
||||||
$email_name = mb_convert_encoding($email_name, $encoding, 'UTF-8');
|
$email_name = mb_convert_encoding($email_name, $encoding, 'UTF-8');
|
||||||
@@ -63,9 +65,6 @@ class Email
|
|||||||
);
|
);
|
||||||
return '"' . $email_name . '" '
|
return '"' . $email_name . '" '
|
||||||
. '<' . (string)$email . '>';
|
. '<' . (string)$email . '>';
|
||||||
} else {
|
|
||||||
return $email;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
* you don't have to write any SQL queries, worry over update/insert
|
* you don't have to write any SQL queries, worry over update/insert
|
||||||
*
|
*
|
||||||
* HISTORY:
|
* HISTORY:
|
||||||
* 2019/9/11 (cs) error string 21->91, 22->92 for not overlapping with IO
|
* 2019/9/11 (cs) error string 21->1021, 22->1022 for not overlapping with IO
|
||||||
* 2005/07/07 (cs) updated array class for postgres: set 0 & NULL if int field given, insert uses () values () syntax
|
* 2005/07/07 (cs) updated array class for postgres: set 0 & NULL if int field given, insert uses () values () syntax
|
||||||
* 2005/03/31 (cs) fixed the class call with all debug vars
|
* 2005/03/31 (cs) fixed the class call with all debug vars
|
||||||
* 2003-03-10: error_ids where still wrong chagned 11->21 and 12->22
|
* 2003-03-10: error_ids where still wrong chagned 11->21 and 12->22
|
||||||
@@ -46,6 +46,9 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
public $pk_name = ''; // the primary key from this table
|
public $pk_name = ''; // the primary key from this table
|
||||||
/** @var int|string|null */
|
/** @var int|string|null */
|
||||||
public $pk_id; // the PK id
|
public $pk_id; // the PK id
|
||||||
|
// security values
|
||||||
|
/** @var int base acl for current page */
|
||||||
|
private $base_acl_level = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* constructor for the array io class, set the
|
* constructor for the array io class, set the
|
||||||
@@ -55,30 +58,39 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
* @param array<mixed> $table_array table array config
|
* @param array<mixed> $table_array table array config
|
||||||
* @param string $table_name table name string
|
* @param string $table_name table name string
|
||||||
* @param \CoreLibs\Debug\Logging|null $log Logging class, default set if not set
|
* @param \CoreLibs\Debug\Logging|null $log Logging class, default set if not set
|
||||||
|
* @param int $base_acl_level Set base acl level, if needed
|
||||||
|
* @param int $acl_admin Flag if this is an admin ACL access level
|
||||||
*/
|
*/
|
||||||
public function __construct(
|
public function __construct(
|
||||||
array $db_config,
|
array $db_config,
|
||||||
array $table_array,
|
array $table_array,
|
||||||
string $table_name,
|
string $table_name,
|
||||||
\CoreLibs\Debug\Logging $log = null
|
\CoreLibs\Debug\Logging $log = null,
|
||||||
|
int $base_acl_level = 0,
|
||||||
|
int $acl_admin = 0
|
||||||
) {
|
) {
|
||||||
// instance db_io class
|
// instance db_io class
|
||||||
parent::__construct($db_config, $log ?? new \CoreLibs\Debug\Logging());
|
parent::__construct($db_config, $log ?? new \CoreLibs\Debug\Logging());
|
||||||
// more error vars for this class
|
// more error vars for this class
|
||||||
$this->error_string['91'] = 'No Primary Key given';
|
$this->error_string['1999'] = 'No table array or table name set';
|
||||||
$this->error_string['92'] = 'Could not run Array Query';
|
$this->error_string['1021'] = 'No Primary Key given';
|
||||||
|
$this->error_string['1022'] = 'Could not run Array Query';
|
||||||
|
|
||||||
$this->table_array = $table_array;
|
$this->table_array = $table_array;
|
||||||
$this->table_name = $table_name;
|
$this->table_name = $table_name;
|
||||||
|
|
||||||
|
// error abort if no table array or no table name
|
||||||
|
if (empty($table_array) || empty($table_name)) {
|
||||||
|
$this->__dbError(1999, false, 'MAJOR ERROR: Core settings missing');
|
||||||
|
}
|
||||||
|
|
||||||
// set primary key for given table_array
|
// set primary key for given table_array
|
||||||
if (is_array($this->table_array)) {
|
|
||||||
foreach ($this->table_array as $key => $value) {
|
foreach ($this->table_array as $key => $value) {
|
||||||
if (isset($value['pk'])) {
|
if (!empty($value['pk'])) {
|
||||||
$this->pk_name = $key;
|
$this->pk_name = $key;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} // set pk_name IF table_array was given
|
$this->dbArrayIOSetAcl($base_acl_level, $acl_admin);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -89,6 +101,33 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
parent::__destruct();
|
parent::__destruct();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set the base acl level and admin acl flag
|
||||||
|
* This is needed for table array ACL checks
|
||||||
|
* if not set I assume 0 (non write/non read/non admin)
|
||||||
|
*
|
||||||
|
* @param int $base_acl_level ACL Level from 0 to 100, -1 is not allowed
|
||||||
|
* Will sett 0 if invalid
|
||||||
|
* @param int $acl_admin 0 for non admin, 1 for admin (base acl is 100)
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function dbArrayIOSetAcl(int $base_acl_level, int $acl_admin): void
|
||||||
|
{
|
||||||
|
// default not allowed, must be 0 at least
|
||||||
|
if ($base_acl_level < 0) {
|
||||||
|
$base_acl_level = 0;
|
||||||
|
}
|
||||||
|
// only 0 or 1 allowed
|
||||||
|
if (!in_array($acl_admin, [0, 1])) {
|
||||||
|
$acl_admin = 0;
|
||||||
|
}
|
||||||
|
// if the user is admin flagged, auto set to 100, if not already set to 100
|
||||||
|
if ($acl_admin == 1) {
|
||||||
|
$base_acl_level = 100;
|
||||||
|
}
|
||||||
|
$this->base_acl_level = $base_acl_level;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* changes all previously alterd HTML code into visible one,
|
* changes all previously alterd HTML code into visible one,
|
||||||
* works for <b>,<i>, and <a> (thought <a> can be / or should
|
* works for <b>,<i>, and <a> (thought <a> can be / or should
|
||||||
@@ -162,7 +201,7 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
// if not set ... produce error
|
// if not set ... produce error
|
||||||
if (!$this->table_array[$this->pk_name]['value']) {
|
if (!$this->table_array[$this->pk_name]['value']) {
|
||||||
// if no PK found, error ...
|
// if no PK found, error ...
|
||||||
$this->__dbError(91);
|
$this->__dbError(1021);
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
return true;
|
return true;
|
||||||
@@ -191,9 +230,10 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
*
|
*
|
||||||
* @param array<mixed> $table_array optional override for table array set
|
* @param array<mixed> $table_array optional override for table array set
|
||||||
* set this as new table array too
|
* set this as new table array too
|
||||||
|
* @param boolean $acl_limit [false], if set to true, well do ACL limit check
|
||||||
* @return array<mixed> returns the table array that was deleted
|
* @return array<mixed> returns the table array that was deleted
|
||||||
*/
|
*/
|
||||||
public function dbDelete($table_array = [])
|
public function dbDelete($table_array = [], $acl_limit = false)
|
||||||
{
|
{
|
||||||
// is array and has values, override set and set new
|
// is array and has values, override set and set new
|
||||||
if (is_array($table_array) && count($table_array)) {
|
if (is_array($table_array) && count($table_array)) {
|
||||||
@@ -202,6 +242,11 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
if (!$this->dbCheckPkSet()) {
|
if (!$this->dbCheckPkSet()) {
|
||||||
return $this->table_array;
|
return $this->table_array;
|
||||||
}
|
}
|
||||||
|
if ($acl_limit === true && $this->base_acl_level < 100) {
|
||||||
|
$this->log->debug('DB DELETE ERROR', 'ACL Limit on, Delete, '
|
||||||
|
. 'but base ACL level of 100 not met: ' . $this->base_acl_level);
|
||||||
|
return $this->table_array;
|
||||||
|
}
|
||||||
// delete query
|
// delete query
|
||||||
$q = 'DELETE FROM ' . $this->table_name . ' WHERE ';
|
$q = 'DELETE FROM ' . $this->table_name . ' WHERE ';
|
||||||
$q .= $this->pk_name . ' = ' . $this->table_array[$this->pk_name]['value'] . ' ';
|
$q .= $this->pk_name . ' = ' . $this->table_array[$this->pk_name]['value'] . ' ';
|
||||||
@@ -241,7 +286,7 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
// if 0, error
|
// if 0, error
|
||||||
$this->pk_id = null;
|
$this->pk_id = null;
|
||||||
if (!$this->dbExec($q)) {
|
if (!$this->dbExec($q)) {
|
||||||
$this->__dbError(92);
|
$this->__dbError(1022);
|
||||||
}
|
}
|
||||||
return $this->table_array;
|
return $this->table_array;
|
||||||
}
|
}
|
||||||
@@ -328,7 +373,7 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
// possible dbFetchArray errors ...
|
// possible dbFetchArray errors ...
|
||||||
$this->pk_id = $this->table_array[$this->pk_name]['value'];
|
$this->pk_id = $this->table_array[$this->pk_name]['value'];
|
||||||
} else {
|
} else {
|
||||||
$this->__dbError(92);
|
$this->__dbError(1022);
|
||||||
}
|
}
|
||||||
return $this->table_array;
|
return $this->table_array;
|
||||||
}
|
}
|
||||||
@@ -338,10 +383,14 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
*
|
*
|
||||||
* @param boolean $addslashes old convert entities and set set escape
|
* @param boolean $addslashes old convert entities and set set escape
|
||||||
* @param array<mixed> $table_array optional table array, overwrites internal one
|
* @param array<mixed> $table_array optional table array, overwrites internal one
|
||||||
|
* @param boolean $acl_limit [false], if set to true, well do ACL limit check
|
||||||
* @return array<mixed> table array or null
|
* @return array<mixed> table array or null
|
||||||
*/
|
*/
|
||||||
public function dbWrite($addslashes = false, $table_array = [])
|
public function dbWrite(
|
||||||
{
|
bool $addslashes = false,
|
||||||
|
array $table_array = [],
|
||||||
|
bool $acl_limit = false
|
||||||
|
): array {
|
||||||
if (is_array($table_array) && count($table_array)) {
|
if (is_array($table_array) && count($table_array)) {
|
||||||
$this->table_array = $table_array;
|
$this->table_array = $table_array;
|
||||||
}
|
}
|
||||||
@@ -355,6 +404,12 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
} else {
|
} else {
|
||||||
$insert = 0;
|
$insert = 0;
|
||||||
}
|
}
|
||||||
|
// early abort for new write with not enough ACL level
|
||||||
|
if ($insert && $acl_limit === true && $this->base_acl_level < 100) {
|
||||||
|
$this->log->debug('DB WRITE ERROR', 'ACL Limit on, Insert, '
|
||||||
|
. 'but base ACL level of 100 not met: ' . $this->base_acl_level);
|
||||||
|
return $this->table_array;
|
||||||
|
}
|
||||||
|
|
||||||
reset($this->table_array);
|
reset($this->table_array);
|
||||||
$q_data = '';
|
$q_data = '';
|
||||||
@@ -408,11 +463,25 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
/********************************* END FILE **************************************/
|
/********************************* END FILE **************************************/
|
||||||
|
|
||||||
// do not write 'pk' (primary key) or 'view' values
|
// do not write 'pk' (primary key) or 'view' values
|
||||||
|
// also do not write UPDATE for elements that are
|
||||||
|
// acl flagged, not if we have an ACL limiter, don't insert
|
||||||
|
// $this->log->debug('DB WRITE', 'C: ' . $column . ', '
|
||||||
|
// . 'ACL Level ' . $this->log->prBl($acl_limit) . ', '
|
||||||
|
// . 'TA ACL: ' . ($this->table_array[$column]['min_edit_acl'] ?? 100) . ', '
|
||||||
|
// . 'Base ACL: ' . $this->base_acl_level);
|
||||||
if (
|
if (
|
||||||
!isset($this->table_array[$column]['pk']) &&
|
!isset($this->table_array[$column]['pk']) &&
|
||||||
isset($this->table_array[$column]['type']) &&
|
isset($this->table_array[$column]['type']) &&
|
||||||
$this->table_array[$column]['type'] != 'view' &&
|
$this->table_array[$column]['type'] != 'view' &&
|
||||||
strlen($column) > 0
|
strlen($column) > 0 &&
|
||||||
|
// no acl limiter
|
||||||
|
($acl_limit === false ||
|
||||||
|
(
|
||||||
|
// acl limit is true, min edit must be at larger than set
|
||||||
|
$acl_limit === true &&
|
||||||
|
$this->base_acl_level >=
|
||||||
|
($this->table_array[$column]['min_edit_acl'] ?? 100)
|
||||||
|
))
|
||||||
) {
|
) {
|
||||||
// for password use hidden value if main is not set
|
// for password use hidden value if main is not set
|
||||||
if (
|
if (
|
||||||
@@ -510,6 +579,11 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
}
|
}
|
||||||
} // while ...
|
} // while ...
|
||||||
|
|
||||||
|
if (empty($q_data)) {
|
||||||
|
$this->log->debug('DB WRITE ERROR', 'No data to write, possible through ACL');
|
||||||
|
return $this->table_array;
|
||||||
|
}
|
||||||
|
|
||||||
// NOW get PK, and FK settings (FK only for update query)
|
// NOW get PK, and FK settings (FK only for update query)
|
||||||
// get it at the end, cause now we can be more sure of no double IDs, etc
|
// get it at the end, cause now we can be more sure of no double IDs, etc
|
||||||
reset($this->table_array);
|
reset($this->table_array);
|
||||||
@@ -561,7 +635,7 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
}
|
}
|
||||||
// return success or not
|
// return success or not
|
||||||
if (!$this->dbExec($q)) {
|
if (!$this->dbExec($q)) {
|
||||||
$this->__dbError(92);
|
$this->__dbError(1022);
|
||||||
}
|
}
|
||||||
// set primary key
|
// set primary key
|
||||||
if ($insert) {
|
if ($insert) {
|
||||||
|
|||||||
@@ -452,6 +452,11 @@ class IO
|
|||||||
'71' => 'Failed to set search path/schema',
|
'71' => 'Failed to set search path/schema',
|
||||||
'80' => 'Trying to set an empty encoding',
|
'80' => 'Trying to set an empty encoding',
|
||||||
'81' => 'Failed to set client encoding',
|
'81' => 'Failed to set client encoding',
|
||||||
|
// for prepared cursor return
|
||||||
|
'101' => 'Statement name empty for get prepare cursor',
|
||||||
|
'102' => 'Key empty for get prepare cursir',
|
||||||
|
'103' => 'No prepared cursor with this name',
|
||||||
|
'104' => 'No Key with this name in the prepared cursor array'
|
||||||
];
|
];
|
||||||
|
|
||||||
// load the core DB functions wrapper class
|
// load the core DB functions wrapper class
|
||||||
@@ -1481,19 +1486,29 @@ class IO
|
|||||||
* @param string $string string to escape
|
* @param string $string string to escape
|
||||||
* @return string escaped string
|
* @return string escaped string
|
||||||
*/
|
*/
|
||||||
public function dbEscapeIdentifier($string): string
|
public function dbEscapeIdentifier(string $string): string
|
||||||
{
|
{
|
||||||
return $this->db_functions->__dbEscapeIdentifier($string);
|
return $this->db_functions->__dbEscapeIdentifier($string);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* escape data for writing to bytea type column field
|
* escape data for writing to bytea type column field
|
||||||
* @param string $bytea bytea to escape
|
* @param string $data data to escape to bytea
|
||||||
* @return string escaped bytea
|
* @return string escaped bytea string
|
||||||
*/
|
*/
|
||||||
public function dbEscapeBytea($bytea)
|
public function dbEscapeBytea(string $data): string
|
||||||
{
|
{
|
||||||
return $this->db_functions->__dbEscapeBytea($bytea);
|
return $this->db_functions->__dbEscapeBytea($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* unescape bytea data back to normal binrary data
|
||||||
|
* @param string $bytea bytea data stream
|
||||||
|
* @return string binary data string
|
||||||
|
*/
|
||||||
|
public function dbUnescapeBytea(string $bytea): string
|
||||||
|
{
|
||||||
|
return $this->db_functions->__dbUnescapeBytea($bytea);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1811,6 +1826,7 @@ class IO
|
|||||||
|
|
||||||
// if cursor exists ...
|
// if cursor exists ...
|
||||||
if ($this->cursor_ext[$query_hash]['cursor']) {
|
if ($this->cursor_ext[$query_hash]['cursor']) {
|
||||||
|
/** @phpstan-ignore-next-line claims this is always false, but can be true */
|
||||||
if ($first_call === true) {
|
if ($first_call === true) {
|
||||||
$this->cursor_ext[$query_hash]['log'][] = 'First call';
|
$this->cursor_ext[$query_hash]['log'][] = 'First call';
|
||||||
// count the rows returned (if select)
|
// count the rows returned (if select)
|
||||||
@@ -2195,7 +2211,7 @@ class IO
|
|||||||
public function dbGetQueryCalled(string $query): int
|
public function dbGetQueryCalled(string $query): int
|
||||||
{
|
{
|
||||||
$query_hash = $this->dbGetQueryHash($query);
|
$query_hash = $this->dbGetQueryHash($query);
|
||||||
if ($this->query_called[$query_hash]) {
|
if (!empty($this->query_called[$query_hash])) {
|
||||||
return $this->query_called[$query_hash];
|
return $this->query_called[$query_hash];
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
@@ -2580,9 +2596,9 @@ class IO
|
|||||||
// loop through the write array and each field to build the query
|
// loop through the write array and each field to build the query
|
||||||
foreach ($write_array as $field) {
|
foreach ($write_array as $field) {
|
||||||
if (
|
if (
|
||||||
(empty($primary_key['value']) ||
|
(
|
||||||
(!empty($primary_key['value']) &&
|
empty($primary_key['value']) ||
|
||||||
!in_array($field, $not_write_update_array))
|
!in_array($field, $not_write_update_array)
|
||||||
) &&
|
) &&
|
||||||
!in_array($field, $not_write_array)
|
!in_array($field, $not_write_array)
|
||||||
) {
|
) {
|
||||||
@@ -3055,6 +3071,60 @@ class IO
|
|||||||
return $this->field_names;
|
return $this->field_names;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the value for given key in statement
|
||||||
|
* Will write error if statemen id does not exist
|
||||||
|
* or key is invalid
|
||||||
|
*
|
||||||
|
* @param string $stm_name The name of the stored statement
|
||||||
|
* @param string $key Key field name in prepared cursor array
|
||||||
|
* Allowed are: pk_name, count, query, returning_id
|
||||||
|
* @return null|string|int|bool Entry from each of the valid keys
|
||||||
|
* Will return false on error
|
||||||
|
* Not ethat returnin_id also can return false
|
||||||
|
* but will not set an error entry
|
||||||
|
*/
|
||||||
|
public function dbGetPrepareCursorValue(string $stm_name, string $key)
|
||||||
|
{
|
||||||
|
// if no statement name
|
||||||
|
if (empty($stm_name)) {
|
||||||
|
$this->__dbError(
|
||||||
|
101,
|
||||||
|
false,
|
||||||
|
'No statement name given'
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// if not a valid key
|
||||||
|
if (!in_array($key, ['pk_name', 'count', 'query', 'returning_id'])) {
|
||||||
|
$this->__dbError(
|
||||||
|
102,
|
||||||
|
false,
|
||||||
|
'Invalid key name'
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// statement name not in prepared list
|
||||||
|
if (empty($this->prepare_cursor[$stm_name])) {
|
||||||
|
$this->__dbError(
|
||||||
|
103,
|
||||||
|
false,
|
||||||
|
'Statement name does not exist in prepare cursor array'
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// key doest not exists, this will never hit as we filter out invalid ones
|
||||||
|
if (!isset($this->prepare_cursor[$stm_name][$key])) {
|
||||||
|
$this->__dbError(
|
||||||
|
104,
|
||||||
|
false,
|
||||||
|
'Key does not exist in prepare cursor array'
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return $this->prepare_cursor[$stm_name][$key];
|
||||||
|
}
|
||||||
|
|
||||||
// ***************************
|
// ***************************
|
||||||
// ERROR AND WARNING DATA
|
// ERROR AND WARNING DATA
|
||||||
// ***************************
|
// ***************************
|
||||||
|
|||||||
@@ -559,15 +559,26 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions
|
|||||||
/**
|
/**
|
||||||
* wrapper for pg_escape_byte
|
* wrapper for pg_escape_byte
|
||||||
*
|
*
|
||||||
* @param string $bytea bytea data stream
|
* @param string $data data stream
|
||||||
* @return string escaped bytea string
|
* @return string escaped bytea string
|
||||||
*/
|
*/
|
||||||
public function __dbEscapeBytea(string $bytea): string
|
public function __dbEscapeBytea(string $data): string
|
||||||
{
|
{
|
||||||
if ($this->dbh === false || is_bool($this->dbh)) {
|
if ($this->dbh === false || is_bool($this->dbh)) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
return pg_escape_bytea($this->dbh, $bytea);
|
return pg_escape_bytea($this->dbh, $data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* unescape bytea data from postgesql
|
||||||
|
*
|
||||||
|
* @param string $bytea Bytea data stream
|
||||||
|
* @return string Unescaped bytea data
|
||||||
|
*/
|
||||||
|
public function __dbUnescapeBytea(string $bytea): string
|
||||||
|
{
|
||||||
|
return pg_unescape_bytea($bytea);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -779,7 +790,6 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions
|
|||||||
}
|
}
|
||||||
// get result
|
// get result
|
||||||
$db_schema = $this->__dbFetchArray($cursor, PGSQL_ASSOC);
|
$db_schema = $this->__dbFetchArray($cursor, PGSQL_ASSOC);
|
||||||
/** @phpstan-ignore-next-line Cannot access offset string on array|bool */
|
|
||||||
return $db_schema[$show_string] ?? '';
|
return $db_schema[$show_string] ?? '';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -806,7 +816,6 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions
|
|||||||
}
|
}
|
||||||
// check if schema does not exists
|
// check if schema does not exists
|
||||||
$row = $this->__dbFetchArray($cursor, PGSQL_ASSOC);
|
$row = $this->__dbFetchArray($cursor, PGSQL_ASSOC);
|
||||||
/** @phpstan-ignore-next-line */
|
|
||||||
if (empty($row['exists']) || $row['exists'] == 'f') {
|
if (empty($row['exists']) || $row['exists'] == 'f') {
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -211,13 +211,21 @@ interface SqlFunctions
|
|||||||
*/
|
*/
|
||||||
public function __dbEscapeIdentifier(string $string): string;
|
public function __dbEscapeIdentifier(string $string): string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @param string $data
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function __dbEscapeBytea(string $data): string;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
* @param string $bytea
|
* @param string $bytea
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function __dbEscapeBytea(string $bytea): string;
|
public function __dbUnescapeBytea(string $bytea): string;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
|
|||||||
@@ -173,7 +173,7 @@ class Logging
|
|||||||
|
|
||||||
// can be overridden with basicSetLogFileId later
|
// can be overridden with basicSetLogFileId later
|
||||||
if (!empty($this->options['file_id'])) {
|
if (!empty($this->options['file_id'])) {
|
||||||
$this->setLogId($this->options['file_id'] ?? '');
|
$this->setLogId($this->options['file_id']);
|
||||||
} elseif (!empty($GLOBALS['LOG_FILE_ID'])) {
|
} elseif (!empty($GLOBALS['LOG_FILE_ID'])) {
|
||||||
// legacy flow, should be removed and only set via options
|
// legacy flow, should be removed and only set via options
|
||||||
$this->setLogId($GLOBALS['LOG_FILE_ID']);
|
$this->setLogId($GLOBALS['LOG_FILE_ID']);
|
||||||
|
|||||||
@@ -94,6 +94,10 @@ class DotEnv
|
|||||||
// strip ending " and EVERYTHING that follows after that
|
// strip ending " and EVERYTHING that follows after that
|
||||||
$line = $matches[1];
|
$line = $matches[1];
|
||||||
}
|
}
|
||||||
|
// just be sure it is init before we fill
|
||||||
|
if (!isset($_ENV[$var])) {
|
||||||
|
$_ENV[$var] = '';
|
||||||
|
}
|
||||||
// strip line of slashes
|
// strip line of slashes
|
||||||
$_ENV[$var] .= stripslashes($line);
|
$_ENV[$var] .= stripslashes($line);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -270,9 +270,11 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
public $save;
|
public $save;
|
||||||
/** @var string */
|
/** @var string */
|
||||||
public $remove_button;
|
public $remove_button;
|
||||||
// security publics
|
// security values
|
||||||
/** @var int */
|
/** @var int base acl for current page */
|
||||||
public $base_acl_level;
|
private $base_acl_level = 0;
|
||||||
|
/** @var int admin master flag (1/0) */
|
||||||
|
private $acl_admin = 0;
|
||||||
/** @var array<mixed> */
|
/** @var array<mixed> */
|
||||||
public $security_level;
|
public $security_level;
|
||||||
// layout publics
|
// layout publics
|
||||||
@@ -305,14 +307,21 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
* @param \CoreLibs\Language\L10n|null $l10n l10n language class, null auto set
|
* @param \CoreLibs\Language\L10n|null $l10n l10n language class, null auto set
|
||||||
* @param array<string,string>|null $locale locale array from ::setLocale,
|
* @param array<string,string>|null $locale locale array from ::setLocale,
|
||||||
* null auto set
|
* null auto set
|
||||||
|
* @param array<mixed>|null $table_arrays Override table array data
|
||||||
|
* instead of try to load from
|
||||||
|
* include file
|
||||||
*/
|
*/
|
||||||
public function __construct(
|
public function __construct(
|
||||||
array $db_config,
|
array $db_config,
|
||||||
?\CoreLibs\Debug\Logging $log = null,
|
?\CoreLibs\Debug\Logging $log = null,
|
||||||
?\CoreLibs\Language\L10n $l10n = null,
|
?\CoreLibs\Language\L10n $l10n = null,
|
||||||
?array $locale = null
|
?array $locale = null,
|
||||||
|
?array $table_arrays = null,
|
||||||
) {
|
) {
|
||||||
global $table_arrays;
|
// don't log per class
|
||||||
|
if ($log !== null) {
|
||||||
|
$log->setLogPer('class', false);
|
||||||
|
}
|
||||||
// replace any non valid variable names
|
// replace any non valid variable names
|
||||||
// TODO extract only alphanumeric and _ after . to _ replacement
|
// TODO extract only alphanumeric and _ after . to _ replacement
|
||||||
$this->my_page_name = str_replace(['.'], '_', System::getPageName(System::NO_EXTENSION));
|
$this->my_page_name = str_replace(['.'], '_', System::getPageName(System::NO_EXTENSION));
|
||||||
@@ -336,19 +345,20 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
// load config array
|
// load config array
|
||||||
// get table array definitions for current page name
|
// get table array definitions for current page name
|
||||||
|
|
||||||
|
// security settings
|
||||||
|
$this->base_acl_level = (int)$_SESSION['BASE_ACL_LEVEL'];
|
||||||
|
$this->acl_admin = (int)$_SESSION['ADMIN'];
|
||||||
|
|
||||||
// first check if we have a in page override as $table_arrays[page name]
|
// first check if we have a in page override as $table_arrays[page name]
|
||||||
if (
|
if (
|
||||||
/* isset($GLOBALS['table_arrays']) &&
|
|
||||||
is_array($GLOBALS['table_arrays']) &&
|
|
||||||
isset($GLOBALS['table_arrays'][System::getPageName(System::NO_EXTENSION)]) &&
|
|
||||||
is_array($GLOBALS['table_arrays'][System::getPageName(System::NO_EXTENSION)]) */
|
|
||||||
isset($table_arrays[System::getPageName(System::NO_EXTENSION)]) &&
|
isset($table_arrays[System::getPageName(System::NO_EXTENSION)]) &&
|
||||||
is_array($table_arrays[System::getPageName(System::NO_EXTENSION)])
|
is_array($table_arrays[System::getPageName(System::NO_EXTENSION)])
|
||||||
) {
|
) {
|
||||||
// $config_array = $GLOBALS['table_arrays'][System::getPageName(1)];
|
// $config_array = $GLOBALS['table_arrays'][System::getPageName(1)];
|
||||||
$config_array = $table_arrays[System::getPageName(1)];
|
$config_array = $table_arrays[System::getPageName(1)];
|
||||||
} else {
|
} else {
|
||||||
// WARNING: auto spl load does not work with this as it is an array and not a function/object
|
// WARNING: auto spl load does not work with this as it is an array
|
||||||
|
// and not a function/object
|
||||||
// check if this is the old path or the new path
|
// check if this is the old path or the new path
|
||||||
// check local folder in current path
|
// check local folder in current path
|
||||||
// then check general global folder
|
// then check general global folder
|
||||||
@@ -374,17 +384,18 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// don't log per class
|
// $log->debug('CONFIG ARRAY', $log->prAr($config_array));
|
||||||
if ($log !== null) {
|
|
||||||
$log->setLogPer('class', false);
|
|
||||||
}
|
|
||||||
// start the array_io class which will start db_io ...
|
// start the array_io class which will start db_io ...
|
||||||
parent::__construct(
|
parent::__construct(
|
||||||
$db_config,
|
$db_config,
|
||||||
$config_array['table_array'],
|
$config_array['table_array'],
|
||||||
$config_array['table_name'],
|
$config_array['table_name'],
|
||||||
$log ?? new \CoreLibs\Debug\Logging()
|
$log ?? new \CoreLibs\Debug\Logging(),
|
||||||
|
// set the ACL
|
||||||
|
$this->base_acl_level,
|
||||||
|
$this->acl_admin
|
||||||
);
|
);
|
||||||
|
// $this->log->debug('SESSION FORM', 'sessin: ' . $this->log->prAr($_SESSION));
|
||||||
// here should be a check if the config_array is correct ...
|
// here should be a check if the config_array is correct ...
|
||||||
if (isset($config_array['show_fields']) && is_array($config_array['show_fields'])) {
|
if (isset($config_array['show_fields']) && is_array($config_array['show_fields'])) {
|
||||||
$this->field_array = $config_array['show_fields'];
|
$this->field_array = $config_array['show_fields'];
|
||||||
@@ -392,6 +403,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
if (isset($config_array['load_query']) && $config_array['load_query']) {
|
if (isset($config_array['load_query']) && $config_array['load_query']) {
|
||||||
$this->load_query = $config_array['load_query'];
|
$this->load_query = $config_array['load_query'];
|
||||||
}
|
}
|
||||||
|
if (empty($this->load_query)) {
|
||||||
|
$this->log->debug('INIT ERROR', 'Missing Load Query for: ' . $this->my_page_name);
|
||||||
|
}
|
||||||
$this->archive_pk_name = 'a_' . $this->pk_name;
|
$this->archive_pk_name = 'a_' . $this->pk_name;
|
||||||
$this->col_name = str_replace('_id', '', $this->pk_name);
|
$this->col_name = str_replace('_id', '', $this->pk_name);
|
||||||
$this->int_pk_name = $this->pk_name;
|
$this->int_pk_name = $this->pk_name;
|
||||||
@@ -416,8 +430,6 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
$this->save = $_POST['save'] ?? '';
|
$this->save = $_POST['save'] ?? '';
|
||||||
$this->remove_button = $_POST['remove_button'] ?? '';
|
$this->remove_button = $_POST['remove_button'] ?? '';
|
||||||
|
|
||||||
// security settings
|
|
||||||
$this->base_acl_level = $_SESSION['BASE_ACL_LEVEL'] ?? 0;
|
|
||||||
// security levels for buttons/actions
|
// security levels for buttons/actions
|
||||||
// if array does not exists create basic
|
// if array does not exists create basic
|
||||||
if (
|
if (
|
||||||
@@ -428,9 +440,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
$this->security_level = [
|
$this->security_level = [
|
||||||
'load' => 100,
|
'load' => 20,
|
||||||
'new' => 100,
|
'new' => 100,
|
||||||
'save' => 100,
|
'save' => 40,
|
||||||
'delete' => 100
|
'delete' => 100
|
||||||
];
|
];
|
||||||
} else {
|
} else {
|
||||||
@@ -438,9 +450,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
$this->security_level = isset($config_array['security_level']) ?
|
$this->security_level = isset($config_array['security_level']) ?
|
||||||
$config_array['security_level'] :
|
$config_array['security_level'] :
|
||||||
[
|
[
|
||||||
'load' => 100,
|
'load' => 20,
|
||||||
'new' => 100,
|
'new' => 100,
|
||||||
'save' => 100,
|
'save' => 40,
|
||||||
'delete' => 100
|
'delete' => 100
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@@ -462,6 +474,27 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
|
|
||||||
// PUBLIC METHODS |=================================================>
|
// PUBLIC METHODS |=================================================>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return current acl admin flag (1/0)
|
||||||
|
*
|
||||||
|
* @return int Admin flag 1 for on or 0 for off
|
||||||
|
*/
|
||||||
|
public function getAclAdmin(): int
|
||||||
|
{
|
||||||
|
return $this->acl_admin;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* check if current acl level is match to requested on
|
||||||
|
*
|
||||||
|
* @param int $level Requested ACL level
|
||||||
|
* @return bool if current level equal or larger return tru, else false
|
||||||
|
*/
|
||||||
|
public function checkBaseACL(int $level): bool
|
||||||
|
{
|
||||||
|
return $this->base_acl_level >= $level ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dumps all values into output (for error msg)
|
* dumps all values into output (for error msg)
|
||||||
*
|
*
|
||||||
@@ -489,8 +522,10 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
* @param string|null $key_value value to match to (optional)
|
* @param string|null $key_value value to match to (optional)
|
||||||
* @return string|null returns key found or empty string
|
* @return string|null returns key found or empty string
|
||||||
*/
|
*/
|
||||||
public function formGetColNameFromKey(string $want_key, ?string $key_value = null): ?string
|
public function formGetColNameFromKey(
|
||||||
{
|
string $want_key,
|
||||||
|
?string $key_value = null
|
||||||
|
): ?string {
|
||||||
if (!is_array($this->table_array)) {
|
if (!is_array($this->table_array)) {
|
||||||
$this->table_array = [];
|
$this->table_array = [];
|
||||||
}
|
}
|
||||||
@@ -513,8 +548,10 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
* @param string|null $key_value if set searches for special right value
|
* @param string|null $key_value if set searches for special right value
|
||||||
* @return array<mixed> found key fields
|
* @return array<mixed> found key fields
|
||||||
*/
|
*/
|
||||||
public function formGetColNameArrayFromKey(string $want_key, ?string $key_value = null): array
|
public function formGetColNameArrayFromKey(
|
||||||
{
|
string $want_key,
|
||||||
|
?string $key_value = null
|
||||||
|
): array {
|
||||||
$key_array = [];
|
$key_array = [];
|
||||||
if (!is_array($this->table_array)) {
|
if (!is_array($this->table_array)) {
|
||||||
$this->table_array = [];
|
$this->table_array = [];
|
||||||
@@ -648,8 +685,10 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
* @param array<mixed> $remove_name key names that should be removed
|
* @param array<mixed> $remove_name key names that should be removed
|
||||||
* @return void has no return
|
* @return void has no return
|
||||||
*/
|
*/
|
||||||
public function formProcedureDeleteFromElementList(array $element_list, array $remove_name): void
|
public function formProcedureDeleteFromElementList(
|
||||||
{
|
array $element_list,
|
||||||
|
array $remove_name
|
||||||
|
): void {
|
||||||
/** @phan-suppress-next-line PhanTypeArraySuspiciousNullable */
|
/** @phan-suppress-next-line PhanTypeArraySuspiciousNullable */
|
||||||
$this->log->debug('REMOVE ELEMENT', 'Remove REF ELEMENT: ' . $this->base_acl_level . ' >= '
|
$this->log->debug('REMOVE ELEMENT', 'Remove REF ELEMENT: ' . $this->base_acl_level . ' >= '
|
||||||
. $this->security_level['delete']);
|
. $this->security_level['delete']);
|
||||||
@@ -752,11 +791,27 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
$t_pk_name = '';
|
$t_pk_name = '';
|
||||||
$pk_names = [];
|
$pk_names = [];
|
||||||
$pk_ids = [];
|
$pk_ids = [];
|
||||||
|
$seclevel_okay = false;
|
||||||
|
// for error abort only
|
||||||
|
$return_array = [
|
||||||
|
't_pk_name' => $t_pk_name,
|
||||||
|
'pk_ids' => $pk_ids,
|
||||||
|
'pk_names' => $pk_names,
|
||||||
|
'pk_selected' => $pk_selected,
|
||||||
|
'seclevel_okay' => $seclevel_okay,
|
||||||
|
];
|
||||||
// when security level is okay ...
|
// when security level is okay ...
|
||||||
if (
|
if (
|
||||||
isset($this->security_level['load']) &&
|
empty($this->security_level['load']) ||
|
||||||
$this->base_acl_level >= $this->security_level['load']
|
$this->base_acl_level < $this->security_level['load']
|
||||||
) {
|
) {
|
||||||
|
return $return_array;
|
||||||
|
}
|
||||||
|
if (empty($this->load_query)) {
|
||||||
|
$this->log->debug('LOAD LIST ERROR', 'Missing load list query');
|
||||||
|
return $return_array;
|
||||||
|
}
|
||||||
|
|
||||||
$t_pk_name = $this->archive_pk_name;
|
$t_pk_name = $this->archive_pk_name;
|
||||||
|
|
||||||
// load list data
|
// load list data
|
||||||
@@ -795,12 +850,13 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
}
|
}
|
||||||
$pk_names[] = $t_string;
|
$pk_names[] = $t_string;
|
||||||
}
|
}
|
||||||
} // show it at all
|
$seclevel_okay = true;
|
||||||
return [
|
return [
|
||||||
't_pk_name' => $t_pk_name,
|
't_pk_name' => $t_pk_name,
|
||||||
'pk_ids' => $pk_ids,
|
'pk_ids' => $pk_ids,
|
||||||
'pk_names' => $pk_names,
|
'pk_names' => $pk_names,
|
||||||
'pk_selected' => $pk_selected
|
'pk_selected' => $pk_selected,
|
||||||
|
'seclevel_okay' => $seclevel_okay,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -808,19 +864,26 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
* Create new entry element for HTML output
|
* Create new entry element for HTML output
|
||||||
*
|
*
|
||||||
* @param bool $hide_new_checkbox show or hide the new checkbox, default is false
|
* @param bool $hide_new_checkbox show or hide the new checkbox, default is false
|
||||||
* @return array<string,string|int> return the new create array with name & checkbox show flag
|
* @return array<string,string|bool> return the new create array with name & checkbox show flag
|
||||||
*/
|
*/
|
||||||
public function formCreateNew($hide_new_checkbox = false): array
|
public function formCreateNew(bool $hide_new_checkbox = false): array
|
||||||
{
|
{
|
||||||
$show_checkbox = 0;
|
$show_checkbox = false;
|
||||||
$new_name = '';
|
$new_name = '';
|
||||||
|
$seclevel_okay = false;
|
||||||
// when security level is okay
|
// when security level is okay
|
||||||
if (
|
if (
|
||||||
isset($this->security_level['new']) &&
|
empty($this->security_level['new']) ||
|
||||||
$this->base_acl_level >= $this->security_level['new']
|
$this->base_acl_level < $this->security_level['new']
|
||||||
) {
|
) {
|
||||||
|
return [
|
||||||
|
'new_name' => $new_name,
|
||||||
|
'show_checkbox' => $show_checkbox,
|
||||||
|
'seclevel_okay' => $seclevel_okay,
|
||||||
|
];
|
||||||
|
}
|
||||||
if ($this->yes && !$hide_new_checkbox) {
|
if ($this->yes && !$hide_new_checkbox) {
|
||||||
$show_checkbox = 1;
|
$show_checkbox = false;
|
||||||
}
|
}
|
||||||
// set type of new name
|
// set type of new name
|
||||||
if ($this->yes) {
|
if ($this->yes) {
|
||||||
@@ -828,10 +891,11 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
} else {
|
} else {
|
||||||
$new_name = $this->l->__('New');
|
$new_name = $this->l->__('New');
|
||||||
}
|
}
|
||||||
} // security level okay
|
$seclevel_okay = true;
|
||||||
return [
|
return [
|
||||||
'new_name' => $new_name,
|
'new_name' => $new_name,
|
||||||
'show_checkbox' => $show_checkbox
|
'show_checkbox' => $show_checkbox,
|
||||||
|
'seclevel_okay' => $seclevel_okay,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -842,29 +906,44 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
* @return array<string,mixed> return the hide/show delete framework
|
* @return array<string,mixed> return the hide/show delete framework
|
||||||
* for html creation
|
* for html creation
|
||||||
*/
|
*/
|
||||||
public function formCreateSaveDelete($hide_delete = false, $hide_delete_checkbox = false): array
|
public function formCreateSaveDelete(
|
||||||
{
|
bool $hide_delete = false,
|
||||||
$seclevel_okay = 0;
|
bool $hide_delete_checkbox = false,
|
||||||
|
bool $old_school_hidden = false
|
||||||
|
): array {
|
||||||
|
$seclevel_okay = false;
|
||||||
$save = '';
|
$save = '';
|
||||||
$pk_name = '';
|
$pk_name = '';
|
||||||
$pk_value = '';
|
$pk_value = '';
|
||||||
$show_delete = 0;
|
$show_delete = false;
|
||||||
$old_school_hidden = 0;
|
|
||||||
if (
|
if (
|
||||||
(isset($this->security_level['save']) &&
|
(empty($this->security_level['save']) ||
|
||||||
$this->base_acl_level >= $this->security_level['save']) ||
|
$this->base_acl_level < $this->security_level['save']) &&
|
||||||
(isset($this->security_level['delete']) &&
|
(empty($this->security_level['delete']) ||
|
||||||
$this->base_acl_level >= $this->security_level['delete'])
|
$this->base_acl_level < $this->security_level['delete'])
|
||||||
) {
|
) {
|
||||||
if ($this->base_acl_level >= $this->security_level['save']) {
|
return [
|
||||||
$seclevel_okay = 1;
|
'seclevel_okay' => $seclevel_okay,
|
||||||
|
'save' => $save,
|
||||||
|
'pk_name' => $pk_name,
|
||||||
|
'pk_value' => $pk_value,
|
||||||
|
'show_delete' => $show_delete,
|
||||||
|
'old_school_hidden' => $old_school_hidden,
|
||||||
|
'hide_delete_checkbox' => $hide_delete_checkbox
|
||||||
|
];
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
!empty($this->security_level['save']) &&
|
||||||
|
$this->base_acl_level >= $this->security_level['save']
|
||||||
|
) {
|
||||||
|
$seclevel_okay = true;
|
||||||
if (empty($this->table_array[$this->int_pk_name]['value'])) {
|
if (empty($this->table_array[$this->int_pk_name]['value'])) {
|
||||||
$save = $this->l->__('Save');
|
$save = $this->l->__('Save');
|
||||||
} else {
|
} else {
|
||||||
$save = $this->l->__('Update');
|
$save = $this->l->__('Update');
|
||||||
}
|
}
|
||||||
// print the old_school hidden if requestet
|
// print the old_school hidden if requestet
|
||||||
if ($old_school_hidden == 1) { /** @phpstan-ignore-line Unclear logic */
|
if ($old_school_hidden === true) {
|
||||||
$pk_name = $this->int_pk_name;
|
$pk_name = $this->int_pk_name;
|
||||||
$pk_value = $this->table_array[$this->int_pk_name]['value'];
|
$pk_value = $this->table_array[$this->int_pk_name]['value'];
|
||||||
}
|
}
|
||||||
@@ -873,11 +952,11 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
if (
|
if (
|
||||||
!empty($this->table_array[$this->int_pk_name]['value']) &&
|
!empty($this->table_array[$this->int_pk_name]['value']) &&
|
||||||
!$hide_delete &&
|
!$hide_delete &&
|
||||||
|
!empty($this->security_level['delete']) &&
|
||||||
$this->base_acl_level >= $this->security_level['delete']
|
$this->base_acl_level >= $this->security_level['delete']
|
||||||
) {
|
) {
|
||||||
$show_delete = 1;
|
$show_delete = true;
|
||||||
}
|
}
|
||||||
} // print save/delete row at all$
|
|
||||||
return [
|
return [
|
||||||
'seclevel_okay' => $seclevel_okay,
|
'seclevel_okay' => $seclevel_okay,
|
||||||
'save' => $save,
|
'save' => $save,
|
||||||
@@ -921,11 +1000,16 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
}
|
}
|
||||||
// create right side depending on 'definiton' in table_array
|
// create right side depending on 'definiton' in table_array
|
||||||
$type = $this->table_array[$element_name]['type'];
|
$type = $this->table_array[$element_name]['type'];
|
||||||
|
// set default min edit/read to 100 (admin)
|
||||||
|
$min_edit_acl = $this->table_array[$element_name]['min_edit_acl'] ?? 100;
|
||||||
|
$min_show_acl = $this->table_array[$element_name]['min_show_acl'] ?? 100;
|
||||||
|
$show_value = '-';
|
||||||
// view only output
|
// view only output
|
||||||
if ($this->table_array[$element_name]['type'] == 'view') {
|
if ($this->table_array[$element_name]['type'] == 'view') {
|
||||||
$data['value'] = empty($this->table_array[$element_name]['value']) ?
|
$data['value'] = empty($this->table_array[$element_name]['value']) ?
|
||||||
$this->table_array[$element_name]['empty'] :
|
$this->table_array[$element_name]['empty'] :
|
||||||
$this->table_array[$element_name]['value'];
|
$this->table_array[$element_name]['value'];
|
||||||
|
$show_value = $data['value'];
|
||||||
}
|
}
|
||||||
// binary true/false element
|
// binary true/false element
|
||||||
if ($this->table_array[$element_name]['type'] == 'binary') {
|
if ($this->table_array[$element_name]['type'] == 'binary') {
|
||||||
@@ -940,6 +1024,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
(!$i && !$this->table_array[$element_name]['value']))
|
(!$i && !$this->table_array[$element_name]['value']))
|
||||||
) {
|
) {
|
||||||
$data['checked'] = $this->table_array[$element_name]['value'];
|
$data['checked'] = $this->table_array[$element_name]['value'];
|
||||||
|
$show_value = $this->table_array[$element_name]['element_list'][$i] ?? $data['checked'];
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($i) {
|
if ($i) {
|
||||||
@@ -952,6 +1037,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
$data['name'] = $element_name;
|
$data['name'] = $element_name;
|
||||||
$data['value'][] = $this->table_array[$element_name]['element_list'];
|
$data['value'][] = $this->table_array[$element_name]['element_list'];
|
||||||
$data['checked'] = $this->table_array[$element_name]['value'];
|
$data['checked'] = $this->table_array[$element_name]['value'];
|
||||||
|
// array map element list + value
|
||||||
|
// foreach ($data['checked'] as $checked)
|
||||||
|
$show_value = join(', ', $data['checked']);
|
||||||
}
|
}
|
||||||
// normal text element
|
// normal text element
|
||||||
if ($this->table_array[$element_name]['type'] == 'text') {
|
if ($this->table_array[$element_name]['type'] == 'text') {
|
||||||
@@ -959,6 +1047,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
$data['value'] = $this->table_array[$element_name]['value'] ?? '';
|
$data['value'] = $this->table_array[$element_name]['value'] ?? '';
|
||||||
$data['size'] = $this->table_array[$element_name]['size'] ?? '';
|
$data['size'] = $this->table_array[$element_name]['size'] ?? '';
|
||||||
$data['length'] = $this->table_array[$element_name]['length'] ?? '';
|
$data['length'] = $this->table_array[$element_name]['length'] ?? '';
|
||||||
|
$show_value = $data['value'];
|
||||||
}
|
}
|
||||||
// password element, does not write back the value
|
// password element, does not write back the value
|
||||||
if ($this->table_array[$element_name]['type'] == 'password') {
|
if ($this->table_array[$element_name]['type'] == 'password') {
|
||||||
@@ -971,11 +1060,13 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
if ($this->table_array[$element_name]['type'] == 'date') {
|
if ($this->table_array[$element_name]['type'] == 'date') {
|
||||||
$data['name'] = $element_name;
|
$data['name'] = $element_name;
|
||||||
$data['value'] = $this->table_array[$element_name]['value'] ?? '';
|
$data['value'] = $this->table_array[$element_name]['value'] ?? '';
|
||||||
|
$show_value = $data['value'];
|
||||||
}
|
}
|
||||||
// date time (no sec) (YYYY-MM-DD HH:mm)
|
// date time (no sec) (YYYY-MM-DD HH:mm)
|
||||||
if ($this->table_array[$element_name]['type'] == 'datetime') {
|
if ($this->table_array[$element_name]['type'] == 'datetime') {
|
||||||
$data['name'] = $element_name;
|
$data['name'] = $element_name;
|
||||||
$data['value'] = $this->table_array[$element_name]['value'] ?? '';
|
$data['value'] = $this->table_array[$element_name]['value'] ?? '';
|
||||||
|
$show_value = $data['value'];
|
||||||
}
|
}
|
||||||
// textarea
|
// textarea
|
||||||
if ($this->table_array[$element_name]['type'] == 'textarea') {
|
if ($this->table_array[$element_name]['type'] == 'textarea') {
|
||||||
@@ -983,6 +1074,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
$data['value'] = $this->table_array[$element_name]['value'] ?? '';
|
$data['value'] = $this->table_array[$element_name]['value'] ?? '';
|
||||||
$data['rows'] = $this->table_array[$element_name]['rows'] ?? '';
|
$data['rows'] = $this->table_array[$element_name]['rows'] ?? '';
|
||||||
$data['cols'] = $this->table_array[$element_name]['cols'] ?? '';
|
$data['cols'] = $this->table_array[$element_name]['cols'] ?? '';
|
||||||
|
$show_value = $data['value'];
|
||||||
}
|
}
|
||||||
// for drop_down_*
|
// for drop_down_*
|
||||||
if (preg_match("/^drop_down_/", $this->table_array[$element_name]['type'])) {
|
if (preg_match("/^drop_down_/", $this->table_array[$element_name]['type'])) {
|
||||||
@@ -1047,6 +1139,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
$this->table_array[$element_name]['value'] == $res[0]
|
$this->table_array[$element_name]['value'] == $res[0]
|
||||||
) {
|
) {
|
||||||
$data['selected'] = $this->table_array[$element_name]['value'];
|
$data['selected'] = $this->table_array[$element_name]['value'];
|
||||||
|
$show_value = $res[1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// for _input put additional field next to drop down
|
// for _input put additional field next to drop down
|
||||||
@@ -1079,6 +1172,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
$data['output'][] = $value;
|
$data['output'][] = $value;
|
||||||
if ($this->table_array[$element_name]['value'] == $key) {
|
if ($this->table_array[$element_name]['value'] == $key) {
|
||||||
$data['selected'] = $this->table_array[$element_name]['value'];
|
$data['selected'] = $this->table_array[$element_name]['value'];
|
||||||
|
$show_value = $value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1093,6 +1187,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
$data['output'][] = $value;
|
$data['output'][] = $value;
|
||||||
if ($this->table_array[$element_name]['value'] == $key) {
|
if ($this->table_array[$element_name]['value'] == $key) {
|
||||||
$data['checked'] = $this->table_array[$element_name]['value'];
|
$data['checked'] = $this->table_array[$element_name]['value'];
|
||||||
|
$show_value = $value;
|
||||||
}
|
}
|
||||||
$data['separator'] = '';
|
$data['separator'] = '';
|
||||||
}
|
}
|
||||||
@@ -1126,7 +1221,10 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
'output_name' => $output_name,
|
'output_name' => $output_name,
|
||||||
'color' => $EDIT_FGCOLOR_T,
|
'color' => $EDIT_FGCOLOR_T,
|
||||||
'type' => $type,
|
'type' => $type,
|
||||||
'data' => $data
|
'data' => $data,
|
||||||
|
'show_value' => $show_value,
|
||||||
|
'allow_edit' => $this->base_acl_level >= $min_edit_acl ? 1 : 0,
|
||||||
|
'allow_show' => $this->base_acl_level >= $min_show_acl ? 1 : 0,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1146,6 +1244,12 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
}
|
}
|
||||||
reset($this->table_array);
|
reset($this->table_array);
|
||||||
foreach ($this->table_array as $key => $value) {
|
foreach ($this->table_array as $key => $value) {
|
||||||
|
// skip if we are not allowe to write this anyway
|
||||||
|
// $this->log->debug('ERROR CHECK', 'ACL K: ' . $key . ', '
|
||||||
|
// . ($value['min_edit_acl'] ?? 100) . ' < ' . $this->base_acl_level);
|
||||||
|
if ($this->base_acl_level < ($value['min_edit_acl'] ?? 100)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
//if ($value['mandatory'] && $value['error_check'])
|
//if ($value['mandatory'] && $value['error_check'])
|
||||||
// if error value set && somethign input, check if input okay
|
// if error value set && somethign input, check if input okay
|
||||||
if (
|
if (
|
||||||
@@ -1373,6 +1477,12 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
// do check for reference tables
|
// do check for reference tables
|
||||||
reset($this->reference_array);
|
reset($this->reference_array);
|
||||||
foreach ($this->reference_array as $key => $value) {
|
foreach ($this->reference_array as $key => $value) {
|
||||||
|
// skip if not allowed to write
|
||||||
|
if (
|
||||||
|
$this->base_acl_level < ($this->reference_array[$key]['min_edit_acl'] ?? 100)
|
||||||
|
) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (
|
if (
|
||||||
isset($this->reference_array[$key]['mandatory']) &&
|
isset($this->reference_array[$key]['mandatory']) &&
|
||||||
$this->reference_array[$key]['mandatory'] &&
|
$this->reference_array[$key]['mandatory'] &&
|
||||||
@@ -1387,11 +1497,18 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
// $this->log->debug('edit_error', 'QS: <pre>' . print_r($_POST, true) . '</pre>');
|
// $this->log->debug('edit_error', 'QS: <pre>' . print_r($_POST, true) . '</pre>');
|
||||||
if (is_array($this->element_list)) {
|
if (is_array($this->element_list)) {
|
||||||
// check the mandatory stuff
|
// check the mandatory stuff
|
||||||
// if mandatory, check that at least on pk exists or if at least the mandatory field is filled
|
// if mandatory, check that at least on pk exists or
|
||||||
|
// if at least the mandatory field is filled
|
||||||
foreach ($this->element_list as $table_name => $reference_array) {
|
foreach ($this->element_list as $table_name => $reference_array) {
|
||||||
if (!is_array($reference_array)) {
|
if (!is_array($reference_array)) {
|
||||||
$reference_array = [];
|
$reference_array = [];
|
||||||
}
|
}
|
||||||
|
// skip if not allowed to write
|
||||||
|
if (
|
||||||
|
$this->base_acl_level < ($this->reference_array['min_edit_acl'] ?? 100)
|
||||||
|
) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
// set pk/fk id for this
|
// set pk/fk id for this
|
||||||
$_pk_name = '';
|
$_pk_name = '';
|
||||||
$_fk_name = '';
|
$_fk_name = '';
|
||||||
@@ -1421,7 +1538,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
// . count($_POST[$prfx.$key]) . ' | M: $max');
|
// . count($_POST[$prfx.$key]) . ' | M: $max');
|
||||||
// $this->log->debug('edit_error_chk', 'K: ' . $_POST[$prfx.$key] . ' | ' . $_POST[$prfx.$key][0]);
|
// $this->log->debug('edit_error_chk', 'K: ' . $_POST[$prfx.$key] . ' | ' . $_POST[$prfx.$key][0]);
|
||||||
}
|
}
|
||||||
$this->log->debug('POST ARRAY', $this->log->prAr($_POST));
|
// $this->log->debug('POST ARRAY', $this->log->prAr($_POST));
|
||||||
// init variables before inner loop run
|
// init variables before inner loop run
|
||||||
$mand_okay = 0;
|
$mand_okay = 0;
|
||||||
$mand_name = '';
|
$mand_name = '';
|
||||||
@@ -1433,15 +1550,17 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
for ($i = 0; $i < $max; $i++) {
|
for ($i = 0; $i < $max; $i++) {
|
||||||
// either one of the post pks is set, or the mandatory
|
// either one of the post pks is set, or the mandatory
|
||||||
foreach ($reference_array['elements'] as $el_name => $data_array) {
|
foreach ($reference_array['elements'] as $el_name => $data_array) {
|
||||||
if (isset($data_array['mandatory']) && $data_array['mandatory']) {
|
if (
|
||||||
|
isset($data_array['mandatory']) &&
|
||||||
|
$data_array['mandatory']
|
||||||
|
) {
|
||||||
$mand_name = $data_array['output_name'];
|
$mand_name = $data_array['output_name'];
|
||||||
}
|
}
|
||||||
// check if there is a primary ket inside, so it is okay
|
// check if there is a primary ket inside, so it is okay
|
||||||
if (
|
if (
|
||||||
isset($data_array['pk_id']) &&
|
isset($data_array['pk_id']) &&
|
||||||
count($_POST[$prfx . $el_name]) &&
|
count($_POST[$prfx . $el_name]) &&
|
||||||
isset($reference_array['mandatory']) &&
|
!empty($reference_array['mandatory'])
|
||||||
$reference_array['mandatory']
|
|
||||||
) {
|
) {
|
||||||
$mand_okay = 1;
|
$mand_okay = 1;
|
||||||
}
|
}
|
||||||
@@ -1452,15 +1571,14 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
// . $_POST[$prfx . $el_name] . ' - ' . $reference_array['enable_name'] . ' - '
|
// . $_POST[$prfx . $el_name] . ' - ' . $reference_array['enable_name'] . ' - '
|
||||||
// . $_POST[$reference_array['enable_name']][$_POST[$prfx . $el_name][$i]]);
|
// . $_POST[$reference_array['enable_name']][$_POST[$prfx . $el_name][$i]]);
|
||||||
if (
|
if (
|
||||||
isset($data_array['mandatory']) &&
|
!empty($data_array['mandatory']) &&
|
||||||
$data_array['mandatory'] &&
|
!empty($_POST[$prfx . $el_name][$i])
|
||||||
isset($_POST[$prfx . $el_name][$i]) &&
|
|
||||||
$_POST[$prfx . $el_name][$i]
|
|
||||||
) {
|
) {
|
||||||
$mand_okay = 1;
|
$mand_okay = 1;
|
||||||
$row_okay[$i] = 1;
|
$row_okay[$i] = 1;
|
||||||
} elseif (
|
} elseif (
|
||||||
!empty($data_array['type']) && $data_array['type'] == 'radio_group' &&
|
!empty($data_array['type']) &&
|
||||||
|
$data_array['type'] == 'radio_group' &&
|
||||||
!isset($_POST[$prfx . $el_name])
|
!isset($_POST[$prfx . $el_name])
|
||||||
) {
|
) {
|
||||||
// radio group and set where one not active
|
// radio group and set where one not active
|
||||||
@@ -1468,20 +1586,22 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
$row_okay[$_POST[$prfx . $el_name][$i] ?? 0] = 0;
|
$row_okay[$_POST[$prfx . $el_name][$i] ?? 0] = 0;
|
||||||
$default_wrong[$_POST[$prfx . $el_name][$i] ?? 0] = 1;
|
$default_wrong[$_POST[$prfx . $el_name][$i] ?? 0] = 1;
|
||||||
$error[$_POST[$prfx . $el_name][$i] ?? 0] = 1;
|
$error[$_POST[$prfx . $el_name][$i] ?? 0] = 1;
|
||||||
} elseif (isset($_POST[$prfx . $el_name][$i]) && !isset($error[$i])) {
|
} elseif (
|
||||||
|
isset($_POST[$prfx . $el_name][$i]) &&
|
||||||
|
!isset($error[$i])
|
||||||
|
) {
|
||||||
// $this->log->debug('edit_error_chk', '[$i]');
|
// $this->log->debug('edit_error_chk', '[$i]');
|
||||||
$element_set[$i] = 1;
|
$element_set[$i] = 1;
|
||||||
$row_okay[$i] = 1;
|
$row_okay[$i] = 1;
|
||||||
} elseif (
|
} elseif (
|
||||||
isset($data_array['mandatory']) &&
|
!empty($data_array['mandatory']) &&
|
||||||
$data_array['mandatory'] &&
|
|
||||||
!$_POST[$prfx . $el_name][$i]
|
!$_POST[$prfx . $el_name][$i]
|
||||||
) {
|
) {
|
||||||
$row_okay[$i] = 0;
|
$row_okay[$i] = 0;
|
||||||
}
|
}
|
||||||
// do optional error checks like for normal fields
|
// do optional error checks like for normal fields
|
||||||
// currently active: unique/alphanumeric
|
// currently active: unique/alphanumeric
|
||||||
if (isset($data_array['error_check'])) {
|
if (!empty($data_array['error_check'])) {
|
||||||
foreach (explode('|', $data_array['error_check']) as $error_check) {
|
foreach (explode('|', $data_array['error_check']) as $error_check) {
|
||||||
switch ($error_check) {
|
switch ($error_check) {
|
||||||
// check unique, check if field is filled and not same in _POST set
|
// check unique, check if field is filled and not same in _POST set
|
||||||
@@ -1500,6 +1620,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
$reference_array['output_name'],
|
$reference_array['output_name'],
|
||||||
$i
|
$i
|
||||||
);
|
);
|
||||||
|
$_POST['ERROR'][$prfx][$i] = 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'alphanumericspace':
|
case 'alphanumericspace':
|
||||||
@@ -1515,6 +1636,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
$reference_array['output_name'],
|
$reference_array['output_name'],
|
||||||
$i
|
$i
|
||||||
);
|
);
|
||||||
|
$_POST['ERROR'][$prfx][$i] = 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1526,8 +1648,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
// main mandatory is met -> error msg
|
// main mandatory is met -> error msg
|
||||||
if (
|
if (
|
||||||
!$mand_okay &&
|
!$mand_okay &&
|
||||||
isset($reference_array['mandatory']) &&
|
!empty($reference_array['mandatory'])
|
||||||
$reference_array['mandatory']
|
|
||||||
) {
|
) {
|
||||||
$this->msg .= sprintf(
|
$this->msg .= sprintf(
|
||||||
$this->l->__('You need to enter at least one data set for field <b>%s</b>!<br>'),
|
$this->l->__('You need to enter at least one data set for field <b>%s</b>!<br>'),
|
||||||
@@ -1567,7 +1688,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
{
|
{
|
||||||
// get order name
|
// get order name
|
||||||
$order_name = $this->formGetColNameFromKey('order');
|
$order_name = $this->formGetColNameFromKey('order');
|
||||||
if ($order_name) {
|
if (empty($order_name)) {
|
||||||
|
return $this->table_array;
|
||||||
|
}
|
||||||
// first check out of order ...
|
// first check out of order ...
|
||||||
if (empty($this->table_array[$order_name]['value'])) {
|
if (empty($this->table_array[$order_name]['value'])) {
|
||||||
// set order (read max)
|
// set order (read max)
|
||||||
@@ -1594,7 +1717,6 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
$this->table_array[$order_name]['value'] = $res['order_name'];
|
$this->table_array[$order_name]['value'] = $res['order_name'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return $this->table_array;
|
return $this->table_array;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1681,7 +1803,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
* @param bool $addslashes override internal addslasahes flag (default false)
|
* @param bool $addslashes override internal addslasahes flag (default false)
|
||||||
* @return void has no return
|
* @return void has no return
|
||||||
*/
|
*/
|
||||||
public function formSaveTableArray($addslashes = false)
|
public function formSaveTableArray(bool $addslashes = false)
|
||||||
{
|
{
|
||||||
// for drop_down_db_input check if text field is filled and if, if not yet in db ...
|
// for drop_down_db_input check if text field is filled and if, if not yet in db ...
|
||||||
// and upload files
|
// and upload files
|
||||||
@@ -1827,7 +1949,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
// . $this->table_array[$this->pk_name]['value'] . "/"
|
// . $this->table_array[$this->pk_name]['value'] . "/"
|
||||||
// . $this->table_array[$this->int_pk_name]['value']);
|
// . $this->table_array[$this->int_pk_name]['value']);
|
||||||
// write the object
|
// write the object
|
||||||
$this->dbWrite($addslashes);
|
$this->dbWrite($addslashes, [], true);
|
||||||
// write reference array (s) if necessary
|
// write reference array (s) if necessary
|
||||||
if (is_array($this->reference_array)) {
|
if (is_array($this->reference_array)) {
|
||||||
if (!is_array($this->reference_array)) {
|
if (!is_array($this->reference_array)) {
|
||||||
@@ -1852,6 +1974,10 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
$type = [];
|
$type = [];
|
||||||
reset($this->element_list);
|
reset($this->element_list);
|
||||||
foreach ($this->element_list as $table_name => $reference_array) {
|
foreach ($this->element_list as $table_name => $reference_array) {
|
||||||
|
// early skip if not enought ACL
|
||||||
|
if ($this->base_acl_level < ($reference_array['min_edit_acl'] ?? 100)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
// init arrays
|
// init arrays
|
||||||
$q_begin = [];
|
$q_begin = [];
|
||||||
$q_middle = [];
|
$q_middle = [];
|
||||||
@@ -2157,7 +2283,14 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
public function formCreateElementReferenceTable(string $table_name): array
|
public function formCreateElementReferenceTable(string $table_name): array
|
||||||
{
|
{
|
||||||
$data = [];
|
$data = [];
|
||||||
|
//
|
||||||
|
$show_value = '';
|
||||||
|
// set default min edit/read to 100 (admin)
|
||||||
|
$min_edit_acl = $this->reference_array[$table_name]['min_edit_acl'] ?? 100;
|
||||||
|
$min_show_acl = $this->reference_array[$table_name]['min_show_acl'] ?? 100;
|
||||||
|
// output name
|
||||||
$output_name = $this->reference_array[$table_name]['output_name'];
|
$output_name = $this->reference_array[$table_name]['output_name'];
|
||||||
|
// mandatory flag
|
||||||
if (
|
if (
|
||||||
isset($this->reference_array[$table_name]['mandatory']) &&
|
isset($this->reference_array[$table_name]['mandatory']) &&
|
||||||
$this->reference_array[$table_name]['mandatory']
|
$this->reference_array[$table_name]['mandatory']
|
||||||
@@ -2169,17 +2302,27 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
while (is_array($res = $this->dbReturn($this->reference_array[$table_name]['query']))) {
|
while (is_array($res = $this->dbReturn($this->reference_array[$table_name]['query']))) {
|
||||||
$data['value'][] = $res[0];
|
$data['value'][] = $res[0];
|
||||||
$data['output'][] = $res[1];
|
$data['output'][] = $res[1];
|
||||||
$data['selected'][] = (\CoreLibs\Convert\Html::checked(
|
$selected = (\CoreLibs\Convert\Html::checked(
|
||||||
$this->reference_array[$table_name]['selected'] ?? '',
|
$this->reference_array[$table_name]['selected'] ?? '',
|
||||||
$res[0]
|
$res[0]
|
||||||
)) ? $res[0] : '';
|
)) ? $res[0] : '';
|
||||||
|
$data['selected'][] = $selected;
|
||||||
|
if (!empty($selected)) {
|
||||||
|
if (!empty($show_value)) {
|
||||||
|
$show_value .= ", ";
|
||||||
|
}
|
||||||
|
$show_value .= $res[1];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
$type = 'reference_table';
|
$type = 'reference_table';
|
||||||
return [
|
return [
|
||||||
'output_name' => $output_name,
|
'output_name' => $output_name,
|
||||||
'type' => $type,
|
'type' => $type,
|
||||||
'color' => 'edit_fgcolor',
|
'color' => 'edit_fgcolor',
|
||||||
'data' => $data
|
'data' => $data,
|
||||||
|
'show_value' => empty($show_value) ? '-' : $show_value,
|
||||||
|
'allow_edit' => $this->base_acl_level >= $min_edit_acl ? 1 : 0,
|
||||||
|
'allow_show' => $this->base_acl_level >= $min_show_acl ? 1 : 0,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2211,8 +2354,13 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
'pos' => [],
|
'pos' => [],
|
||||||
'table_name' => $table_name // sub table name
|
'table_name' => $table_name // sub table name
|
||||||
];
|
];
|
||||||
|
$show_value = '-';
|
||||||
|
// set default min edit/read to 100 (admin)
|
||||||
|
$min_edit_acl = $this->element_list[$table_name]['min_edit_acl'] ?? 100;
|
||||||
|
$min_show_acl = $this->element_list[$table_name]['min_show_acl'] ?? 100;
|
||||||
// output name for the viewable left table td box, prefixed with * if mandatory
|
// output name for the viewable left table td box, prefixed with * if mandatory
|
||||||
$output_name = $this->element_list[$table_name]['output_name'];
|
$output_name = $this->element_list[$table_name]['output_name'];
|
||||||
|
// mandatory flag
|
||||||
if (
|
if (
|
||||||
isset($this->element_list[$table_name]['mandatory']) &&
|
isset($this->element_list[$table_name]['mandatory']) &&
|
||||||
$this->element_list[$table_name]['mandatory']
|
$this->element_list[$table_name]['mandatory']
|
||||||
@@ -2409,12 +2557,13 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
}
|
}
|
||||||
// $this->log->debug('CFG QUERY', 'Q: ' . $q);
|
// $this->log->debug('CFG QUERY', 'Q: ' . $q);
|
||||||
// only run if we have query strnig
|
// only run if we have query strnig
|
||||||
|
$written_pos = [];
|
||||||
if (isset($q)) {
|
if (isset($q)) {
|
||||||
|
$prfx = $data['prefix']; // short
|
||||||
$pos = 0; // position in while for overwrite if needed
|
$pos = 0; // position in while for overwrite if needed
|
||||||
// read out the list and add the selected data if needed
|
// read out the list and add the selected data if needed
|
||||||
while (is_array($res = $this->dbReturn($q))) {
|
while (is_array($res = $this->dbReturn($q))) {
|
||||||
$_data = [];
|
$_data = [];
|
||||||
$prfx = $data['prefix']; // short
|
|
||||||
// go through each res
|
// go through each res
|
||||||
for ($i = 0, $i_max = count($q_select); $i < $i_max; $i++) {
|
for ($i = 0, $i_max = count($q_select); $i < $i_max; $i++) {
|
||||||
// query select part, set to the element name
|
// query select part, set to the element name
|
||||||
@@ -2444,13 +2593,48 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
}
|
}
|
||||||
$data['content'][] = $_data;
|
$data['content'][] = $_data;
|
||||||
$data['pos'][] = [0 => $pos]; // this is for the checkboxes
|
$data['pos'][] = [0 => $pos]; // this is for the checkboxes
|
||||||
|
$written_pos[] = $pos;
|
||||||
$pos++; // move up one
|
$pos++; // move up one
|
||||||
// reset and unset before next run
|
// reset and unset before next run
|
||||||
unset($_data);
|
unset($_data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// add lost error ones
|
||||||
|
$this->log->debug('ERROR', 'P: ' . $data['prefix'] . ', '
|
||||||
|
. $this->log->prAr($_POST['ERROR'][$data['prefix']] ?? []));
|
||||||
|
if ($this->error && !empty($_POST['ERROR'][$data['prefix']])) {
|
||||||
|
$prfx = $data['prefix']; // short
|
||||||
|
$_post_data = [];
|
||||||
|
// MAX entries defined via $data['pk_name'] entry (must exist)
|
||||||
|
$_max_pos = count($_POST[$data['pk_name']] ?? []);
|
||||||
|
// write all excte previous loaded @ $pos
|
||||||
|
foreach ($q_select as $_el_name) {
|
||||||
|
for ($_pos = 0; $_pos <= $_max_pos; $_pos++) {
|
||||||
|
// if not in data pos
|
||||||
|
if (!in_array($_pos, $written_pos)) {
|
||||||
|
$_post_data[$_pos][$prfx . $_el_name] =
|
||||||
|
$_POST[$prfx . $_el_name][$_pos] ?? '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// only add if all fields in data are filled, else skip
|
||||||
|
// pk_name field is excluded of check
|
||||||
|
foreach ($_post_data as $_pos => $_data) {
|
||||||
|
$filled = false;
|
||||||
|
foreach ($_data as $_name => $_value) {
|
||||||
|
if ($_name != $data['pk_name'] && !empty($_value)) {
|
||||||
|
$filled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($filled == true) {
|
||||||
|
$data['content'][] = $_data;
|
||||||
|
$data['pos'][] = [0 => $_pos];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
// if this is normal single reference data check the content on the element count
|
// if this is normal single reference data check the content on the element count
|
||||||
// if there is a max_empty is set, then fill up new elements (unfilled) until we reach max empty
|
// if there is a max_empty is set, then fill up new elements (unfilled)
|
||||||
|
// until we reach max empty
|
||||||
if (
|
if (
|
||||||
/*isset($this->element_list[$table_name]['type']) &&
|
/*isset($this->element_list[$table_name]['type']) &&
|
||||||
$this->element_list[$table_name]['type'] == 'reference_data' &&*/
|
$this->element_list[$table_name]['type'] == 'reference_data' &&*/
|
||||||
@@ -2523,7 +2707,10 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
'output_name' => $output_name,
|
'output_name' => $output_name,
|
||||||
'type' => $type,
|
'type' => $type,
|
||||||
'color' => 'edit_fgcolor',
|
'color' => 'edit_fgcolor',
|
||||||
'data' => $data
|
'data' => $data,
|
||||||
|
'show_value' => $show_value,
|
||||||
|
'allow_edit' => $this->base_acl_level >= $min_edit_acl ? 1 : 0,
|
||||||
|
'allow_show' => $this->base_acl_level >= $min_show_acl ? 1 : 0,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
// end of class
|
// end of class
|
||||||
|
|||||||
@@ -105,6 +105,8 @@ class SmartyExtend extends \Smarty
|
|||||||
public $CSS_TEMPLATE_NAME;
|
public $CSS_TEMPLATE_NAME;
|
||||||
/** @var string|null */
|
/** @var string|null */
|
||||||
public $TEMPLATE_TRANSLATE;
|
public $TEMPLATE_TRANSLATE;
|
||||||
|
/** @var string|null */
|
||||||
|
public $JS_TRANSLATE;
|
||||||
// core group
|
// core group
|
||||||
/** @var string */
|
/** @var string */
|
||||||
public $JS_CORE_TEMPLATE_NAME;
|
public $JS_CORE_TEMPLATE_NAME;
|
||||||
@@ -317,14 +319,14 @@ class SmartyExtend extends \Smarty
|
|||||||
}
|
}
|
||||||
// javascript translate data as template for auto translate
|
// javascript translate data as template for auto translate
|
||||||
if (empty($this->TEMPLATE_TRANSLATE)) {
|
if (empty($this->TEMPLATE_TRANSLATE)) {
|
||||||
$this->TEMPLATE_TRANSLATE = 'jsTranslate_'
|
$this->TEMPLATE_TRANSLATE = 'jsTranslate-'
|
||||||
. $this->locale_set . '.' . $this->encoding
|
. $this->locale_set . '.' . $this->encoding
|
||||||
. '.tpl';
|
. '.tpl';
|
||||||
} else {
|
} else {
|
||||||
// we assume we have some fixed set
|
// we assume we have some fixed set
|
||||||
// we must add _<$this->lang>
|
// we must add _<locale>.<encoding>
|
||||||
// if .tpl, put before .tpl
|
// if .tpl, put before .tpl
|
||||||
// if not .tpl, add _<$this->lang>.tpl
|
// if not .tpl, add _<locale>.<encoding>.tpl
|
||||||
if (strpos($this->TEMPLATE_TRANSLATE, '.tpl')) {
|
if (strpos($this->TEMPLATE_TRANSLATE, '.tpl')) {
|
||||||
$this->TEMPLATE_TRANSLATE = str_replace(
|
$this->TEMPLATE_TRANSLATE = str_replace(
|
||||||
'.tpl',
|
'.tpl',
|
||||||
@@ -332,7 +334,7 @@ class SmartyExtend extends \Smarty
|
|||||||
$this->TEMPLATE_TRANSLATE
|
$this->TEMPLATE_TRANSLATE
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
$this->TEMPLATE_TRANSLATE .= '_'
|
$this->TEMPLATE_TRANSLATE .= '-'
|
||||||
. $this->locale_set . '.' . $this->encoding
|
. $this->locale_set . '.' . $this->encoding
|
||||||
. '.tpl';
|
. '.tpl';
|
||||||
}
|
}
|
||||||
@@ -341,6 +343,31 @@ class SmartyExtend extends \Smarty
|
|||||||
if (!file_exists($this->getTemplateDir()[0] . DIRECTORY_SEPARATOR . $this->TEMPLATE_TRANSLATE)) {
|
if (!file_exists($this->getTemplateDir()[0] . DIRECTORY_SEPARATOR . $this->TEMPLATE_TRANSLATE)) {
|
||||||
$this->TEMPLATE_TRANSLATE = null;
|
$this->TEMPLATE_TRANSLATE = null;
|
||||||
}
|
}
|
||||||
|
if (empty($this->JS_TRANSLATE)) {
|
||||||
|
$this->JS_TRANSLATE = 'translate-'
|
||||||
|
. $this->locale_set . '.' . $this->encoding . '.js';
|
||||||
|
} else {
|
||||||
|
// we assume we have some fixed set
|
||||||
|
// we must add _<locale>.<encoding>
|
||||||
|
// if .js, put before .js
|
||||||
|
// if not .js, add _<locale>.<encoding>.js
|
||||||
|
if (strpos($this->JS_TRANSLATE, '.js')) {
|
||||||
|
$this->JS_TRANSLATE = str_replace(
|
||||||
|
'.js',
|
||||||
|
'-' . $this->locale_set . '.' . $this->encoding . '.js',
|
||||||
|
$this->JS_TRANSLATE
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->JS_TRANSLATE .= '-'
|
||||||
|
. $this->locale_set . '.' . $this->encoding
|
||||||
|
. '.js';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!file_exists($this->JAVASCRIPT . $this->JS_TRANSLATE)) {
|
||||||
|
$this->JS_TRANSLATE = null;
|
||||||
|
} else {
|
||||||
|
$this->JS_TRANSLATE = $this->JAVASCRIPT . $this->JS_TRANSLATE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -423,7 +450,7 @@ class SmartyExtend extends \Smarty
|
|||||||
$this->DATA['ADMIN'] = $cms->acl['admin'] ?? 0;
|
$this->DATA['ADMIN'] = $cms->acl['admin'] ?? 0;
|
||||||
// top menu
|
// top menu
|
||||||
$this->DATA['nav_menu'] = $cms->adbTopMenu();
|
$this->DATA['nav_menu'] = $cms->adbTopMenu();
|
||||||
$this->DATA['nav_menu_count'] = is_array($this->DATA['nav_menu']) ? count($this->DATA['nav_menu']) : 0;
|
$this->DATA['nav_menu_count'] = count($this->DATA['nav_menu']);
|
||||||
// messages = ['msg' =>, 'class' => 'error/warning/...']
|
// messages = ['msg' =>, 'class' => 'error/warning/...']
|
||||||
$this->DATA['messages'] = $cms->messages;
|
$this->DATA['messages'] = $cms->messages;
|
||||||
} else { /** @phpstan-ignore-line Because I assume object for phpstan */
|
} else { /** @phpstan-ignore-line Because I assume object for phpstan */
|
||||||
@@ -438,7 +465,7 @@ class SmartyExtend extends \Smarty
|
|||||||
$this->HEADER['JAVASCRIPT'] = $this->ADMIN_JAVASCRIPT ? $this->ADMIN_JAVASCRIPT : ADMIN_JAVASCRIPT;
|
$this->HEADER['JAVASCRIPT'] = $this->ADMIN_JAVASCRIPT ? $this->ADMIN_JAVASCRIPT : ADMIN_JAVASCRIPT;
|
||||||
// the page name
|
// the page name
|
||||||
$this->DATA['page_name'] = $this->page_name;
|
$this->DATA['page_name'] = $this->page_name;
|
||||||
$this->DATA['table_width'] = empty($this->PAGE_WIDTH) ?: PAGE_WIDTH;
|
$this->DATA['table_width'] = !empty($this->PAGE_WIDTH) ?: PAGE_WIDTH;
|
||||||
$this->DATA['form_name'] = $this->DATA['FORM_NAME'];
|
$this->DATA['form_name'] = $this->DATA['FORM_NAME'];
|
||||||
// for tinymce special
|
// for tinymce special
|
||||||
$this->DATA['TINYMCE_LANG'] = $this->lang_short;
|
$this->DATA['TINYMCE_LANG'] = $this->lang_short;
|
||||||
@@ -469,6 +496,7 @@ class SmartyExtend extends \Smarty
|
|||||||
$this->DATA['TEMPLATE_NAME'] = $this->TEMPLATE_NAME;
|
$this->DATA['TEMPLATE_NAME'] = $this->TEMPLATE_NAME;
|
||||||
$this->DATA['CONTENT_INCLUDE'] = $this->CONTENT_INCLUDE;
|
$this->DATA['CONTENT_INCLUDE'] = $this->CONTENT_INCLUDE;
|
||||||
$this->DATA['TEMPLATE_TRANSLATE'] = $this->TEMPLATE_TRANSLATE ?? null;
|
$this->DATA['TEMPLATE_TRANSLATE'] = $this->TEMPLATE_TRANSLATE ?? null;
|
||||||
|
$this->DATA['JS_TRANSLATE'] = $this->JS_TRANSLATE ?? null;
|
||||||
$this->DATA['PAGE_FILE_NAME'] = str_replace('.php', '', $this->page_name) . '.tpl';
|
$this->DATA['PAGE_FILE_NAME'] = str_replace('.php', '', $this->page_name) . '.tpl';
|
||||||
// render page
|
// render page
|
||||||
$this->renderSmarty();
|
$this->renderSmarty();
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
smarty-4.1.0/libs/
|
smarty-4.3.0/libs/
|
||||||
77
www/lib/smarty-4.1.0/.github/workflows/ci.yml
vendored
77
www/lib/smarty-4.1.0/.github/workflows/ci.yml
vendored
@@ -1,77 +0,0 @@
|
|||||||
# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
|
|
||||||
|
|
||||||
on:
|
|
||||||
- pull_request
|
|
||||||
- push
|
|
||||||
|
|
||||||
name: CI
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
tests:
|
|
||||||
name: Tests
|
|
||||||
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
|
|
||||||
env:
|
|
||||||
PHP_EXTENSIONS: dom, json, libxml, mbstring, pdo_sqlite, soap, xml, xmlwriter
|
|
||||||
PHP_INI_VALUES: assert.exception=1, zend.assertions=1
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
os:
|
|
||||||
- ubuntu-latest
|
|
||||||
|
|
||||||
php-version:
|
|
||||||
- "7.1"
|
|
||||||
- "7.2"
|
|
||||||
- "7.3"
|
|
||||||
- "7.4"
|
|
||||||
- "8.0"
|
|
||||||
- "8.1"
|
|
||||||
|
|
||||||
compiler:
|
|
||||||
- default
|
|
||||||
|
|
||||||
include:
|
|
||||||
- os: ubuntu-latest
|
|
||||||
php-version: "8.0"
|
|
||||||
compiler: jit
|
|
||||||
- os: ubuntu-latest
|
|
||||||
php-version: "8.1"
|
|
||||||
compiler: jit
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Override PHP ini values for JIT compiler
|
|
||||||
if: matrix.compiler == 'jit'
|
|
||||||
run: echo "PHP_INI_VALUES::assert.exception=1, zend.assertions=1, opcache.enable=1, opcache.enable_cli=1, opcache.optimization_level=-1, opcache.jit=1255, opcache.jit_buffer_size=32M" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
- name: Install PHP with extensions
|
|
||||||
uses: shivammathur/setup-php@v2
|
|
||||||
with:
|
|
||||||
php-version: ${{ matrix.php-version }}
|
|
||||||
coverage: pcov
|
|
||||||
extensions: ${{ env.PHP_EXTENSIONS }}
|
|
||||||
ini-values: ${{ env.PHP_INI_VALUES }}
|
|
||||||
|
|
||||||
- name: Validate composer.json and composer.lock
|
|
||||||
run: composer validate
|
|
||||||
|
|
||||||
- name: Cache Composer packages
|
|
||||||
id: composer-cache
|
|
||||||
uses: actions/cache@v2
|
|
||||||
with:
|
|
||||||
path: vendor
|
|
||||||
key: ${{ runner.os }}-php-${{ matrix.php-version }}-${{ hashFiles('**/composer.lock') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-php-${{ matrix.php-version }}-
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
if: steps.composer-cache.outputs.cache-hit != 'true'
|
|
||||||
run: composer install --prefer-dist --no-progress --no-suggest
|
|
||||||
|
|
||||||
- name: Run tests with phpunit
|
|
||||||
run: ./phpunit.sh
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,179 +0,0 @@
|
|||||||
Smarty: the PHP compiling template engine
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 3.0 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
|
|
||||||
See the GNU Lesser General Public License below for more details.
|
|
||||||
|
|
||||||
|
|
||||||
GNU LESSER GENERAL PUBLIC LICENSE
|
|
||||||
Version 3, 29 June 2007
|
|
||||||
|
|
||||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
|
|
||||||
This version of the GNU Lesser General Public License incorporates
|
|
||||||
the terms and conditions of version 3 of the GNU General Public
|
|
||||||
License, supplemented by the additional permissions listed below.
|
|
||||||
|
|
||||||
0. Additional Definitions.
|
|
||||||
|
|
||||||
As used herein, "this License" refers to version 3 of the GNU Lesser
|
|
||||||
General Public License, and the "GNU GPL" refers to version 3 of the GNU
|
|
||||||
General Public License.
|
|
||||||
|
|
||||||
"The Library" refers to a covered work governed by this License,
|
|
||||||
other than an Application or a Combined Work as defined below.
|
|
||||||
|
|
||||||
An "Application" is any work that makes use of an interface provided
|
|
||||||
by the Library, but which is not otherwise based on the Library.
|
|
||||||
Defining a subclass of a class defined by the Library is deemed a mode
|
|
||||||
of using an interface provided by the Library.
|
|
||||||
|
|
||||||
A "Combined Work" is a work produced by combining or linking an
|
|
||||||
Application with the Library. The particular version of the Library
|
|
||||||
with which the Combined Work was made is also called the "Linked
|
|
||||||
Version".
|
|
||||||
|
|
||||||
The "Minimal Corresponding Source" for a Combined Work means the
|
|
||||||
Corresponding Source for the Combined Work, excluding any source code
|
|
||||||
for portions of the Combined Work that, considered in isolation, are
|
|
||||||
based on the Application, and not on the Linked Version.
|
|
||||||
|
|
||||||
The "Corresponding Application Code" for a Combined Work means the
|
|
||||||
object code and/or source code for the Application, including any data
|
|
||||||
and utility programs needed for reproducing the Combined Work from the
|
|
||||||
Application, but excluding the System Libraries of the Combined Work.
|
|
||||||
|
|
||||||
1. Exception to Section 3 of the GNU GPL.
|
|
||||||
|
|
||||||
You may convey a covered work under sections 3 and 4 of this License
|
|
||||||
without being bound by section 3 of the GNU GPL.
|
|
||||||
|
|
||||||
2. Conveying Modified Versions.
|
|
||||||
|
|
||||||
If you modify a copy of the Library, and, in your modifications, a
|
|
||||||
facility refers to a function or data to be supplied by an Application
|
|
||||||
that uses the facility (other than as an argument passed when the
|
|
||||||
facility is invoked), then you may convey a copy of the modified
|
|
||||||
version:
|
|
||||||
|
|
||||||
a) under this License, provided that you make a good faith effort to
|
|
||||||
ensure that, in the event an Application does not supply the
|
|
||||||
function or data, the facility still operates, and performs
|
|
||||||
whatever part of its purpose remains meaningful, or
|
|
||||||
|
|
||||||
b) under the GNU GPL, with none of the additional permissions of
|
|
||||||
this License applicable to that copy.
|
|
||||||
|
|
||||||
3. Object Code Incorporating Material from Library Header Files.
|
|
||||||
|
|
||||||
The object code form of an Application may incorporate material from
|
|
||||||
a header file that is part of the Library. You may convey such object
|
|
||||||
code under terms of your choice, provided that, if the incorporated
|
|
||||||
material is not limited to numerical parameters, data structure
|
|
||||||
layouts and accessors, or small macros, inline functions and templates
|
|
||||||
(ten or fewer lines in length), you do both of the following:
|
|
||||||
|
|
||||||
a) Give prominent notice with each copy of the object code that the
|
|
||||||
Library is used in it and that the Library and its use are
|
|
||||||
covered by this License.
|
|
||||||
|
|
||||||
b) Accompany the object code with a copy of the GNU GPL and this license
|
|
||||||
document.
|
|
||||||
|
|
||||||
4. Combined Works.
|
|
||||||
|
|
||||||
You may convey a Combined Work under terms of your choice that,
|
|
||||||
taken together, effectively do not restrict modification of the
|
|
||||||
portions of the Library contained in the Combined Work and reverse
|
|
||||||
engineering for debugging such modifications, if you also do each of
|
|
||||||
the following:
|
|
||||||
|
|
||||||
a) Give prominent notice with each copy of the Combined Work that
|
|
||||||
the Library is used in it and that the Library and its use are
|
|
||||||
covered by this License.
|
|
||||||
|
|
||||||
b) Accompany the Combined Work with a copy of the GNU GPL and this license
|
|
||||||
document.
|
|
||||||
|
|
||||||
c) For a Combined Work that displays copyright notices during
|
|
||||||
execution, include the copyright notice for the Library among
|
|
||||||
these notices, as well as a reference directing the user to the
|
|
||||||
copies of the GNU GPL and this license document.
|
|
||||||
|
|
||||||
d) Do one of the following:
|
|
||||||
|
|
||||||
0) Convey the Minimal Corresponding Source under the terms of this
|
|
||||||
License, and the Corresponding Application Code in a form
|
|
||||||
suitable for, and under terms that permit, the user to
|
|
||||||
recombine or relink the Application with a modified version of
|
|
||||||
the Linked Version to produce a modified Combined Work, in the
|
|
||||||
manner specified by section 6 of the GNU GPL for conveying
|
|
||||||
Corresponding Source.
|
|
||||||
|
|
||||||
1) Use a suitable shared library mechanism for linking with the
|
|
||||||
Library. A suitable mechanism is one that (a) uses at run time
|
|
||||||
a copy of the Library already present on the user's computer
|
|
||||||
system, and (b) will operate properly with a modified version
|
|
||||||
of the Library that is interface-compatible with the Linked
|
|
||||||
Version.
|
|
||||||
|
|
||||||
e) Provide Installation Information, but only if you would otherwise
|
|
||||||
be required to provide such information under section 6 of the
|
|
||||||
GNU GPL, and only to the extent that such information is
|
|
||||||
necessary to install and execute a modified version of the
|
|
||||||
Combined Work produced by recombining or relinking the
|
|
||||||
Application with a modified version of the Linked Version. (If
|
|
||||||
you use option 4d0, the Installation Information must accompany
|
|
||||||
the Minimal Corresponding Source and Corresponding Application
|
|
||||||
Code. If you use option 4d1, you must provide the Installation
|
|
||||||
Information in the manner specified by section 6 of the GNU GPL
|
|
||||||
for conveying Corresponding Source.)
|
|
||||||
|
|
||||||
5. Combined Libraries.
|
|
||||||
|
|
||||||
You may place library facilities that are a work based on the
|
|
||||||
Library side by side in a single library together with other library
|
|
||||||
facilities that are not Applications and are not covered by this
|
|
||||||
License, and convey such a combined library under terms of your
|
|
||||||
choice, if you do both of the following:
|
|
||||||
|
|
||||||
a) Accompany the combined library with a copy of the same work based
|
|
||||||
on the Library, uncombined with any other library facilities,
|
|
||||||
conveyed under the terms of this License.
|
|
||||||
|
|
||||||
b) Give prominent notice with the combined library that part of it
|
|
||||||
is a work based on the Library, and explaining where to find the
|
|
||||||
accompanying uncombined form of the same work.
|
|
||||||
|
|
||||||
6. Revised Versions of the GNU Lesser General Public License.
|
|
||||||
|
|
||||||
The Free Software Foundation may publish revised and/or new versions
|
|
||||||
of the GNU Lesser General Public License from time to time. Such new
|
|
||||||
versions will be similar in spirit to the present version, but may
|
|
||||||
differ in detail to address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the
|
|
||||||
Library as you received it specifies that a certain numbered version
|
|
||||||
of the GNU Lesser General Public License "or any later version"
|
|
||||||
applies to it, you have the option of following the terms and
|
|
||||||
conditions either of that published version or of any later version
|
|
||||||
published by the Free Software Foundation. If the Library as you
|
|
||||||
received it does not specify a version number of the GNU Lesser
|
|
||||||
General Public License, you may choose any version of the GNU Lesser
|
|
||||||
General Public License ever published by the Free Software Foundation.
|
|
||||||
|
|
||||||
If the Library as you received it specifies that a proxy can decide
|
|
||||||
whether future versions of the GNU Lesser General Public License shall
|
|
||||||
apply, that proxy's public statement of acceptance of any version is
|
|
||||||
permanent authorization for you to choose that version for the
|
|
||||||
Library.
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
# Smarty template engine
|
|
||||||
Smarty is a template engine for PHP, facilitating the separation of presentation (HTML/CSS) from application logic.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## Documentation
|
|
||||||
Read the [documentation](https://smarty-php.github.io/smarty/) to find out how to use it.
|
|
||||||
|
|
||||||
## Requirements
|
|
||||||
Smarty can be run with PHP 7.1 to PHP 8.1.
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
Smarty versions 3.1.11 or later can be installed with [Composer](https://getcomposer.org/).
|
|
||||||
|
|
||||||
To get the latest stable version of Smarty use:
|
|
||||||
```bash
|
|
||||||
composer require smarty/smarty
|
|
||||||
````
|
|
||||||
|
|
||||||
More in the [Getting Started](./docs/getting-started.md) section of the docs.
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
# Security Policy
|
|
||||||
|
|
||||||
## Supported Versions
|
|
||||||
|
|
||||||
Smarty currently supports the latest minor version of Smarty 3 and Smarty 4. (Smarty 4 has not been released yet.)
|
|
||||||
|
|
||||||
| Version | Supported |
|
|
||||||
| ------- | ------------------ |
|
|
||||||
| 4.0.x | :white_check_mark: |
|
|
||||||
| 3.1.x | :white_check_mark: |
|
|
||||||
| < 3.1 | :x: |
|
|
||||||
|
|
||||||
## Reporting a Vulnerability
|
|
||||||
|
|
||||||
If you have discovered a security issue with Smarty, please contact us at mail [at] simonwisselink.nl. Do not
|
|
||||||
disclose your findings publicly and PLEASE PLEASE do not file an Issue.
|
|
||||||
|
|
||||||
We will try to confirm the vulnerability and develop a fix if appropriate. When we release the fix, we will publish
|
|
||||||
a security release. Please let us know if you want to be credited.
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "smarty/smarty",
|
|
||||||
"type": "library",
|
|
||||||
"description": "Smarty - the compiling PHP template engine",
|
|
||||||
"keywords": [
|
|
||||||
"templating"
|
|
||||||
],
|
|
||||||
"homepage": "https://smarty-php.github.io/smarty/",
|
|
||||||
"license": "LGPL-3.0",
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Monte Ohrt",
|
|
||||||
"email": "monte@ohrt.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Uwe Tews",
|
|
||||||
"email": "uwe.tews@googlemail.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Rodney Rehm",
|
|
||||||
"email": "rodney.rehm@medialize.de"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Simon Wisselink",
|
|
||||||
"homepage": "https://www.iwink.nl/"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"support": {
|
|
||||||
"issues": "https://github.com/smarty-php/smarty/issues",
|
|
||||||
"forum": "https://github.com/smarty-php/smarty/discussions"
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"php": "^7.1 || ^8.0"
|
|
||||||
},
|
|
||||||
"autoload": {
|
|
||||||
"classmap": [
|
|
||||||
"libs/"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"extra": {
|
|
||||||
"branch-alias": {
|
|
||||||
"dev-master": "4.0.x-dev"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"require-dev": {
|
|
||||||
"phpunit/phpunit": "^8.5 || ^7.5",
|
|
||||||
"smarty/smarty-lexer": "^3.1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
title = Welcome to Smarty!
|
|
||||||
cutoff_size = 40
|
|
||||||
|
|
||||||
[setup]
|
|
||||||
bold = true
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* Example Application
|
|
||||||
*
|
|
||||||
* @package Example-application
|
|
||||||
*/
|
|
||||||
require '../libs/Smarty.class.php';
|
|
||||||
$smarty = new Smarty;
|
|
||||||
//$smarty->force_compile = true;
|
|
||||||
$smarty->debugging = true;
|
|
||||||
$smarty->caching = true;
|
|
||||||
$smarty->cache_lifetime = 120;
|
|
||||||
$smarty->assign("Name", "Fred Irving Johnathan Bradley Peppergill", true);
|
|
||||||
$smarty->assign("FirstName", array("John", "Mary", "James", "Henry"));
|
|
||||||
$smarty->assign("LastName", array("Doe", "Smith", "Johnson", "Case"));
|
|
||||||
$smarty->assign(
|
|
||||||
"Class",
|
|
||||||
array(
|
|
||||||
array("A", "B", "C", "D"),
|
|
||||||
array("E", "F", "G", "H"),
|
|
||||||
array("I", "J", "K", "L"),
|
|
||||||
array("M", "N", "O", "P")
|
|
||||||
)
|
|
||||||
);
|
|
||||||
$smarty->assign(
|
|
||||||
"contacts",
|
|
||||||
array(
|
|
||||||
array("phone" => "1", "fax" => "2", "cell" => "3"),
|
|
||||||
array("phone" => "555-4444", "fax" => "555-3333", "cell" => "760-1234")
|
|
||||||
)
|
|
||||||
);
|
|
||||||
$smarty->assign("option_values", array("NY", "NE", "KS", "IA", "OK", "TX"));
|
|
||||||
$smarty->assign("option_output", array("New York", "Nebraska", "Kansas", "Iowa", "Oklahoma", "Texas"));
|
|
||||||
$smarty->assign("option_selected", "NE");
|
|
||||||
$smarty->display('index.tpl');
|
|
||||||
@@ -1,85 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* APC CacheResource
|
|
||||||
* CacheResource Implementation based on the KeyValueStore API to use
|
|
||||||
* memcache as the storage resource for Smarty's output caching.
|
|
||||||
* *
|
|
||||||
*
|
|
||||||
* @package CacheResource-examples
|
|
||||||
* @author Uwe Tews
|
|
||||||
*/
|
|
||||||
class Smarty_CacheResource_Apc extends Smarty_CacheResource_KeyValueStore
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Smarty_CacheResource_Apc constructor.
|
|
||||||
*
|
|
||||||
* @throws \Exception
|
|
||||||
*/
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
// test if APC is present
|
|
||||||
if (!function_exists('apc_cache_info')) {
|
|
||||||
throw new Exception('APC Template Caching Error: APC is not installed');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Read values for a set of keys from cache
|
|
||||||
*
|
|
||||||
* @param array $keys list of keys to fetch
|
|
||||||
*
|
|
||||||
* @return array list of values with the given keys used as indexes
|
|
||||||
* @return boolean true on success, false on failure
|
|
||||||
*/
|
|
||||||
protected function read(array $keys)
|
|
||||||
{
|
|
||||||
$_res = array();
|
|
||||||
$res = apc_fetch($keys);
|
|
||||||
foreach ($res as $k => $v) {
|
|
||||||
$_res[ $k ] = $v;
|
|
||||||
}
|
|
||||||
return $_res;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Save values for a set of keys to cache
|
|
||||||
*
|
|
||||||
* @param array $keys list of values to save
|
|
||||||
* @param int $expire expiration time
|
|
||||||
*
|
|
||||||
* @return boolean true on success, false on failure
|
|
||||||
*/
|
|
||||||
protected function write(array $keys, $expire = null)
|
|
||||||
{
|
|
||||||
foreach ($keys as $k => $v) {
|
|
||||||
apc_store($k, $v, $expire);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove values from cache
|
|
||||||
*
|
|
||||||
* @param array $keys list of keys to delete
|
|
||||||
*
|
|
||||||
* @return boolean true on success, false on failure
|
|
||||||
*/
|
|
||||||
protected function delete(array $keys)
|
|
||||||
{
|
|
||||||
foreach ($keys as $k) {
|
|
||||||
apc_delete($k);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove *all* values from cache
|
|
||||||
*
|
|
||||||
* @return boolean true on success, false on failure
|
|
||||||
*/
|
|
||||||
protected function purge()
|
|
||||||
{
|
|
||||||
return apc_clear_cache('user');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Memcache CacheResource
|
|
||||||
* CacheResource Implementation based on the KeyValueStore API to use
|
|
||||||
* memcache as the storage resource for Smarty's output caching.
|
|
||||||
* Note that memcache has a limitation of 256 characters per cache-key.
|
|
||||||
* To avoid complications all cache-keys are translated to a sha1 hash.
|
|
||||||
*
|
|
||||||
* @package CacheResource-examples
|
|
||||||
* @author Rodney Rehm
|
|
||||||
*/
|
|
||||||
class Smarty_CacheResource_Memcache extends Smarty_CacheResource_KeyValueStore
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* memcache instance
|
|
||||||
*
|
|
||||||
* @var Memcache
|
|
||||||
*/
|
|
||||||
protected $memcache = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Smarty_CacheResource_Memcache constructor.
|
|
||||||
*/
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
if (class_exists('Memcached')) {
|
|
||||||
$this->memcache = new Memcached();
|
|
||||||
} else {
|
|
||||||
$this->memcache = new Memcache();
|
|
||||||
}
|
|
||||||
$this->memcache->addServer('127.0.0.1', 11211);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Read values for a set of keys from cache
|
|
||||||
*
|
|
||||||
* @param array $keys list of keys to fetch
|
|
||||||
*
|
|
||||||
* @return array list of values with the given keys used as indexes
|
|
||||||
* @return boolean true on success, false on failure
|
|
||||||
*/
|
|
||||||
protected function read(array $keys)
|
|
||||||
{
|
|
||||||
$res = array();
|
|
||||||
foreach ($keys as $key) {
|
|
||||||
$k = sha1($key);
|
|
||||||
$res[$key] = $this->memcache->get($k);
|
|
||||||
}
|
|
||||||
return $res;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Save values for a set of keys to cache
|
|
||||||
*
|
|
||||||
* @param array $keys list of values to save
|
|
||||||
* @param int $expire expiration time
|
|
||||||
*
|
|
||||||
* @return boolean true on success, false on failure
|
|
||||||
*/
|
|
||||||
protected function write(array $keys, $expire = null)
|
|
||||||
{
|
|
||||||
foreach ($keys as $k => $v) {
|
|
||||||
$k = sha1($k);
|
|
||||||
if (class_exists('Memcached')) {
|
|
||||||
$this->memcache->set($k, $v, $expire);
|
|
||||||
} else {
|
|
||||||
$this->memcache->set($k, $v, 0, $expire);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove values from cache
|
|
||||||
*
|
|
||||||
* @param array $keys list of keys to delete
|
|
||||||
*
|
|
||||||
* @return boolean true on success, false on failure
|
|
||||||
*/
|
|
||||||
protected function delete(array $keys)
|
|
||||||
{
|
|
||||||
foreach ($keys as $k) {
|
|
||||||
$k = sha1($k);
|
|
||||||
$this->memcache->delete($k);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove *all* values from cache
|
|
||||||
*
|
|
||||||
* @return boolean true on success, false on failure
|
|
||||||
*/
|
|
||||||
protected function purge()
|
|
||||||
{
|
|
||||||
return $this->memcache->flush();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,183 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MySQL CacheResource
|
|
||||||
* CacheResource Implementation based on the Custom API to use
|
|
||||||
* MySQL as the storage resource for Smarty's output caching.
|
|
||||||
* Table definition:
|
|
||||||
* <pre>CREATE TABLE IF NOT EXISTS `output_cache` (
|
|
||||||
* `id` CHAR(40) NOT NULL COMMENT 'sha1 hash',
|
|
||||||
* `name` VARCHAR(250) NOT NULL,
|
|
||||||
* `cache_id` VARCHAR(250) NULL DEFAULT NULL,
|
|
||||||
* `compile_id` VARCHAR(250) NULL DEFAULT NULL,
|
|
||||||
* `modified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
||||||
* `content` LONGTEXT NOT NULL,
|
|
||||||
* PRIMARY KEY (`id`),
|
|
||||||
* INDEX(`name`),
|
|
||||||
* INDEX(`cache_id`),
|
|
||||||
* INDEX(`compile_id`),
|
|
||||||
* INDEX(`modified`)
|
|
||||||
* ) ENGINE = InnoDB;</pre>
|
|
||||||
*
|
|
||||||
* @package CacheResource-examples
|
|
||||||
* @author Rodney Rehm
|
|
||||||
*/
|
|
||||||
class Smarty_CacheResource_Mysql extends Smarty_CacheResource_Custom
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @var \PDO
|
|
||||||
*/
|
|
||||||
protected $db;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var \PDOStatement
|
|
||||||
*/
|
|
||||||
protected $fetch;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var \PDOStatement
|
|
||||||
*/
|
|
||||||
protected $fetchTimestamp;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var \PDOStatement
|
|
||||||
*/
|
|
||||||
protected $save;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Smarty_CacheResource_Mysql constructor.
|
|
||||||
*
|
|
||||||
* @throws \SmartyException
|
|
||||||
*/
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
$this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty");
|
|
||||||
} catch (PDOException $e) {
|
|
||||||
throw new SmartyException('Mysql Resource failed: ' . $e->getMessage());
|
|
||||||
}
|
|
||||||
$this->fetch = $this->db->prepare('SELECT modified, content FROM output_cache WHERE id = :id');
|
|
||||||
$this->fetchTimestamp = $this->db->prepare('SELECT modified FROM output_cache WHERE id = :id');
|
|
||||||
$this->save = $this->db->prepare(
|
|
||||||
'REPLACE INTO output_cache (id, name, cache_id, compile_id, content)
|
|
||||||
VALUES (:id, :name, :cache_id, :compile_id, :content)'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* fetch cached content and its modification time from data source
|
|
||||||
*
|
|
||||||
* @param string $id unique cache content identifier
|
|
||||||
* @param string $name template name
|
|
||||||
* @param string $cache_id cache id
|
|
||||||
* @param string $compile_id compile id
|
|
||||||
* @param string $content cached content
|
|
||||||
* @param integer $mtime cache modification timestamp (epoch)
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
protected function fetch($id, $name, $cache_id, $compile_id, &$content, &$mtime)
|
|
||||||
{
|
|
||||||
$this->fetch->execute(array('id' => $id));
|
|
||||||
$row = $this->fetch->fetch();
|
|
||||||
$this->fetch->closeCursor();
|
|
||||||
if ($row) {
|
|
||||||
$content = $row[ 'content' ];
|
|
||||||
$mtime = strtotime($row[ 'modified' ]);
|
|
||||||
} else {
|
|
||||||
$content = null;
|
|
||||||
$mtime = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fetch cached content's modification timestamp from data source
|
|
||||||
*
|
|
||||||
* @note implementing this method is optional. Only implement it if modification times can be accessed faster than
|
|
||||||
* loading the complete cached content.
|
|
||||||
*
|
|
||||||
* @param string $id unique cache content identifier
|
|
||||||
* @param string $name template name
|
|
||||||
* @param string $cache_id cache id
|
|
||||||
* @param string $compile_id compile id
|
|
||||||
*
|
|
||||||
* @return integer|boolean timestamp (epoch) the template was modified, or false if not found
|
|
||||||
*/
|
|
||||||
protected function fetchTimestamp($id, $name, $cache_id, $compile_id)
|
|
||||||
{
|
|
||||||
$this->fetchTimestamp->execute(array('id' => $id));
|
|
||||||
$mtime = strtotime($this->fetchTimestamp->fetchColumn());
|
|
||||||
$this->fetchTimestamp->closeCursor();
|
|
||||||
return $mtime;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Save content to cache
|
|
||||||
*
|
|
||||||
* @param string $id unique cache content identifier
|
|
||||||
* @param string $name template name
|
|
||||||
* @param string $cache_id cache id
|
|
||||||
* @param string $compile_id compile id
|
|
||||||
* @param integer|null $exp_time seconds till expiration time in seconds or null
|
|
||||||
* @param string $content content to cache
|
|
||||||
*
|
|
||||||
* @return boolean success
|
|
||||||
*/
|
|
||||||
protected function save($id, $name, $cache_id, $compile_id, $exp_time, $content)
|
|
||||||
{
|
|
||||||
$this->save->execute(
|
|
||||||
array('id' => $id,
|
|
||||||
'name' => $name,
|
|
||||||
'cache_id' => $cache_id,
|
|
||||||
'compile_id' => $compile_id,
|
|
||||||
'content' => $content,)
|
|
||||||
);
|
|
||||||
return !!$this->save->rowCount();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete content from cache
|
|
||||||
*
|
|
||||||
* @param string $name template name
|
|
||||||
* @param string $cache_id cache id
|
|
||||||
* @param string $compile_id compile id
|
|
||||||
* @param integer|null $exp_time seconds till expiration or null
|
|
||||||
*
|
|
||||||
* @return integer number of deleted caches
|
|
||||||
*/
|
|
||||||
protected function delete($name, $cache_id, $compile_id, $exp_time)
|
|
||||||
{
|
|
||||||
// delete the whole cache
|
|
||||||
if ($name === null && $cache_id === null && $compile_id === null && $exp_time === null) {
|
|
||||||
// returning the number of deleted caches would require a second query to count them
|
|
||||||
$query = $this->db->query('TRUNCATE TABLE output_cache');
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
// build the filter
|
|
||||||
$where = array();
|
|
||||||
// equal test name
|
|
||||||
if ($name !== null) {
|
|
||||||
$where[] = 'name = ' . $this->db->quote($name);
|
|
||||||
}
|
|
||||||
// equal test compile_id
|
|
||||||
if ($compile_id !== null) {
|
|
||||||
$where[] = 'compile_id = ' . $this->db->quote($compile_id);
|
|
||||||
}
|
|
||||||
// range test expiration time
|
|
||||||
if ($exp_time !== null) {
|
|
||||||
$where[] = 'modified < DATE_SUB(NOW(), INTERVAL ' . intval($exp_time) . ' SECOND)';
|
|
||||||
}
|
|
||||||
// equal test cache_id and match sub-groups
|
|
||||||
if ($cache_id !== null) {
|
|
||||||
$where[] =
|
|
||||||
'(cache_id = ' .
|
|
||||||
$this->db->quote($cache_id) .
|
|
||||||
' OR cache_id LIKE ' .
|
|
||||||
$this->db->quote($cache_id . '|%') .
|
|
||||||
')';
|
|
||||||
}
|
|
||||||
// run delete query
|
|
||||||
$query = $this->db->query('DELETE FROM output_cache WHERE ' . join(' AND ', $where));
|
|
||||||
return $query->rowCount();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,346 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* PDO Cache Handler
|
|
||||||
* Allows you to store Smarty Cache files into your db.
|
|
||||||
* Example table :
|
|
||||||
* CREATE TABLE `smarty_cache` (
|
|
||||||
* `id` char(40) NOT NULL COMMENT 'sha1 hash',
|
|
||||||
* `name` varchar(250) NOT NULL,
|
|
||||||
* `cache_id` varchar(250) DEFAULT NULL,
|
|
||||||
* `compile_id` varchar(250) DEFAULT NULL,
|
|
||||||
* `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
||||||
* `expire` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
|
|
||||||
* `content` mediumblob NOT NULL,
|
|
||||||
* PRIMARY KEY (`id`),
|
|
||||||
* KEY `name` (`name`),
|
|
||||||
* KEY `cache_id` (`cache_id`),
|
|
||||||
* KEY `compile_id` (`compile_id`),
|
|
||||||
* KEY `modified` (`modified`),
|
|
||||||
* KEY `expire` (`expire`)
|
|
||||||
* ) ENGINE=InnoDB
|
|
||||||
* Example usage :
|
|
||||||
* $cnx = new PDO("mysql:host=localhost;dbname=mydb", "username", "password");
|
|
||||||
* $smarty->setCachingType('pdo');
|
|
||||||
* $smarty->loadPlugin('Smarty_CacheResource_Pdo');
|
|
||||||
* $smarty->registerCacheResource('pdo', new Smarty_CacheResource_Pdo($cnx, 'smarty_cache'));
|
|
||||||
*
|
|
||||||
* @author Beno!t POLASZEK - 2014
|
|
||||||
*/
|
|
||||||
class Smarty_CacheResource_Pdo extends Smarty_CacheResource_Custom
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @var string[]
|
|
||||||
*/
|
|
||||||
protected $fetchStatements = array('default' => 'SELECT %2$s
|
|
||||||
FROM %1$s
|
|
||||||
WHERE 1
|
|
||||||
AND id = :id
|
|
||||||
AND cache_id IS NULL
|
|
||||||
AND compile_id IS NULL',
|
|
||||||
'withCacheId' => 'SELECT %2$s
|
|
||||||
FROM %1$s
|
|
||||||
WHERE 1
|
|
||||||
AND id = :id
|
|
||||||
AND cache_id = :cache_id
|
|
||||||
AND compile_id IS NULL',
|
|
||||||
'withCompileId' => 'SELECT %2$s
|
|
||||||
FROM %1$s
|
|
||||||
WHERE 1
|
|
||||||
AND id = :id
|
|
||||||
AND compile_id = :compile_id
|
|
||||||
AND cache_id IS NULL',
|
|
||||||
'withCacheIdAndCompileId' => 'SELECT %2$s
|
|
||||||
FROM %1$s
|
|
||||||
WHERE 1
|
|
||||||
AND id = :id
|
|
||||||
AND cache_id = :cache_id
|
|
||||||
AND compile_id = :compile_id');
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $insertStatement = 'INSERT INTO %s
|
|
||||||
|
|
||||||
SET id = :id,
|
|
||||||
name = :name,
|
|
||||||
cache_id = :cache_id,
|
|
||||||
compile_id = :compile_id,
|
|
||||||
modified = CURRENT_TIMESTAMP,
|
|
||||||
expire = DATE_ADD(CURRENT_TIMESTAMP, INTERVAL :expire SECOND),
|
|
||||||
content = :content
|
|
||||||
|
|
||||||
ON DUPLICATE KEY UPDATE
|
|
||||||
name = :name,
|
|
||||||
cache_id = :cache_id,
|
|
||||||
compile_id = :compile_id,
|
|
||||||
modified = CURRENT_TIMESTAMP,
|
|
||||||
expire = DATE_ADD(CURRENT_TIMESTAMP, INTERVAL :expire SECOND),
|
|
||||||
content = :content';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $deleteStatement = 'DELETE FROM %1$s WHERE %2$s';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $truncateStatement = 'TRUNCATE TABLE %s';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $fetchColumns = 'modified, content';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $fetchTimestampColumns = 'modified';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var \PDO
|
|
||||||
*/
|
|
||||||
protected $pdo;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var
|
|
||||||
*/
|
|
||||||
protected $table;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var null
|
|
||||||
*/
|
|
||||||
protected $database;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
*
|
|
||||||
* @param PDO $pdo PDO : active connection
|
|
||||||
* @param string $table : table (or view) name
|
|
||||||
* @param string $database : optional - if table is located in another db
|
|
||||||
*
|
|
||||||
* @throws \SmartyException
|
|
||||||
*/
|
|
||||||
public function __construct(PDO $pdo, $table, $database = null)
|
|
||||||
{
|
|
||||||
if (is_null($table)) {
|
|
||||||
throw new SmartyException("Table name for caching can't be null");
|
|
||||||
}
|
|
||||||
$this->pdo = $pdo;
|
|
||||||
$this->table = $table;
|
|
||||||
$this->database = $database;
|
|
||||||
$this->fillStatementsWithTableName();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fills the table name into the statements.
|
|
||||||
*
|
|
||||||
* @return $this Current Instance
|
|
||||||
* @access protected
|
|
||||||
*/
|
|
||||||
protected function fillStatementsWithTableName()
|
|
||||||
{
|
|
||||||
foreach ($this->fetchStatements as &$statement) {
|
|
||||||
$statement = sprintf($statement, $this->getTableName(), '%s');
|
|
||||||
}
|
|
||||||
$this->insertStatement = sprintf($this->insertStatement, $this->getTableName());
|
|
||||||
$this->deleteStatement = sprintf($this->deleteStatement, $this->getTableName(), '%s');
|
|
||||||
$this->truncateStatement = sprintf($this->truncateStatement, $this->getTableName());
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the fetch statement, depending on what you specify
|
|
||||||
*
|
|
||||||
* @param string $columns : the column(s) name(s) you want to retrieve from the database
|
|
||||||
* @param string $id unique cache content identifier
|
|
||||||
* @param string|null $cache_id cache id
|
|
||||||
* @param string|null $compile_id compile id
|
|
||||||
*
|
|
||||||
* @access protected
|
|
||||||
* @return \PDOStatement
|
|
||||||
*/
|
|
||||||
protected function getFetchStatement($columns, $id, $cache_id = null, $compile_id = null)
|
|
||||||
{
|
|
||||||
$args = array();
|
|
||||||
if (!is_null($cache_id) && !is_null($compile_id)) {
|
|
||||||
$query = $this->fetchStatements[ 'withCacheIdAndCompileId' ] and
|
|
||||||
$args = array('id' => $id, 'cache_id' => $cache_id, 'compile_id' => $compile_id);
|
|
||||||
} elseif (is_null($cache_id) && !is_null($compile_id)) {
|
|
||||||
$query = $this->fetchStatements[ 'withCompileId' ] and
|
|
||||||
$args = array('id' => $id, 'compile_id' => $compile_id);
|
|
||||||
} elseif (!is_null($cache_id) && is_null($compile_id)) {
|
|
||||||
$query = $this->fetchStatements[ 'withCacheId' ] and $args = array('id' => $id, 'cache_id' => $cache_id);
|
|
||||||
} else {
|
|
||||||
$query = $this->fetchStatements[ 'default' ] and $args = array('id' => $id);
|
|
||||||
}
|
|
||||||
$query = sprintf($query, $columns);
|
|
||||||
$stmt = $this->pdo->prepare($query);
|
|
||||||
foreach ($args as $key => $value) {
|
|
||||||
$stmt->bindValue($key, $value);
|
|
||||||
}
|
|
||||||
return $stmt;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* fetch cached content and its modification time from data source
|
|
||||||
*
|
|
||||||
* @param string $id unique cache content identifier
|
|
||||||
* @param string $name template name
|
|
||||||
* @param string|null $cache_id cache id
|
|
||||||
* @param string|null $compile_id compile id
|
|
||||||
* @param string $content cached content
|
|
||||||
* @param integer $mtime cache modification timestamp (epoch)
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
* @access protected
|
|
||||||
*/
|
|
||||||
protected function fetch($id, $name, $cache_id = null, $compile_id = null, &$content, &$mtime)
|
|
||||||
{
|
|
||||||
$stmt = $this->getFetchStatement($this->fetchColumns, $id, $cache_id, $compile_id);
|
|
||||||
$stmt->execute();
|
|
||||||
$row = $stmt->fetch();
|
|
||||||
$stmt->closeCursor();
|
|
||||||
if ($row) {
|
|
||||||
$content = $this->outputContent($row[ 'content' ]);
|
|
||||||
$mtime = strtotime($row[ 'modified' ]);
|
|
||||||
} else {
|
|
||||||
$content = null;
|
|
||||||
$mtime = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fetch cached content's modification timestamp from data source
|
|
||||||
* {@internal implementing this method is optional.
|
|
||||||
* Only implement it if modification times can be accessed faster than loading the complete cached content.}}
|
|
||||||
*
|
|
||||||
* @param string $id unique cache content identifier
|
|
||||||
* @param string $name template name
|
|
||||||
* @param string|null $cache_id cache id
|
|
||||||
* @param string|null $compile_id compile id
|
|
||||||
*
|
|
||||||
* @return integer|boolean timestamp (epoch) the template was modified, or false if not found
|
|
||||||
* @access protected
|
|
||||||
*/
|
|
||||||
// protected function fetchTimestamp($id, $name, $cache_id = null, $compile_id = null) {
|
|
||||||
// $stmt = $this->getFetchStatement($this->fetchTimestampColumns, $id, $cache_id, $compile_id);
|
|
||||||
// $stmt -> execute();
|
|
||||||
// $mtime = strtotime($stmt->fetchColumn());
|
|
||||||
// $stmt -> closeCursor();
|
|
||||||
// return $mtime;
|
|
||||||
// }
|
|
||||||
/**
|
|
||||||
* Save content to cache
|
|
||||||
*
|
|
||||||
* @param string $id unique cache content identifier
|
|
||||||
* @param string $name template name
|
|
||||||
* @param string|null $cache_id cache id
|
|
||||||
* @param string|null $compile_id compile id
|
|
||||||
* @param integer|null $exp_time seconds till expiration time in seconds or null
|
|
||||||
* @param string $content content to cache
|
|
||||||
*
|
|
||||||
* @return boolean success
|
|
||||||
* @access protected
|
|
||||||
*/
|
|
||||||
protected function save($id, $name, $cache_id = null, $compile_id = null, $exp_time, $content)
|
|
||||||
{
|
|
||||||
$stmt = $this->pdo->prepare($this->insertStatement);
|
|
||||||
$stmt->bindValue('id', $id);
|
|
||||||
$stmt->bindValue('name', $name);
|
|
||||||
$stmt->bindValue('cache_id', $cache_id, (is_null($cache_id)) ? PDO::PARAM_NULL : PDO::PARAM_STR);
|
|
||||||
$stmt->bindValue('compile_id', $compile_id, (is_null($compile_id)) ? PDO::PARAM_NULL : PDO::PARAM_STR);
|
|
||||||
$stmt->bindValue('expire', (int)$exp_time, PDO::PARAM_INT);
|
|
||||||
$stmt->bindValue('content', $this->inputContent($content));
|
|
||||||
$stmt->execute();
|
|
||||||
return !!$stmt->rowCount();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Encodes the content before saving to database
|
|
||||||
*
|
|
||||||
* @param string $content
|
|
||||||
*
|
|
||||||
* @return string $content
|
|
||||||
* @access protected
|
|
||||||
*/
|
|
||||||
protected function inputContent($content)
|
|
||||||
{
|
|
||||||
return $content;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Decodes the content before saving to database
|
|
||||||
*
|
|
||||||
* @param string $content
|
|
||||||
*
|
|
||||||
* @return string $content
|
|
||||||
* @access protected
|
|
||||||
*/
|
|
||||||
protected function outputContent($content)
|
|
||||||
{
|
|
||||||
return $content;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete content from cache
|
|
||||||
*
|
|
||||||
* @param string|null $name template name
|
|
||||||
* @param string|null $cache_id cache id
|
|
||||||
* @param string|null $compile_id compile id
|
|
||||||
* @param integer|null|-1 $exp_time seconds till expiration or null
|
|
||||||
*
|
|
||||||
* @return integer number of deleted caches
|
|
||||||
* @access protected
|
|
||||||
*/
|
|
||||||
protected function delete($name = null, $cache_id = null, $compile_id = null, $exp_time = null)
|
|
||||||
{
|
|
||||||
// delete the whole cache
|
|
||||||
if ($name === null && $cache_id === null && $compile_id === null && $exp_time === null) {
|
|
||||||
// returning the number of deleted caches would require a second query to count them
|
|
||||||
$this->pdo->query($this->truncateStatement);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
// build the filter
|
|
||||||
$where = array();
|
|
||||||
// equal test name
|
|
||||||
if ($name !== null) {
|
|
||||||
$where[] = 'name = ' . $this->pdo->quote($name);
|
|
||||||
}
|
|
||||||
// equal test cache_id and match sub-groups
|
|
||||||
if ($cache_id !== null) {
|
|
||||||
$where[] =
|
|
||||||
'(cache_id = ' .
|
|
||||||
$this->pdo->quote($cache_id) .
|
|
||||||
' OR cache_id LIKE ' .
|
|
||||||
$this->pdo->quote($cache_id . '|%') .
|
|
||||||
')';
|
|
||||||
}
|
|
||||||
// equal test compile_id
|
|
||||||
if ($compile_id !== null) {
|
|
||||||
$where[] = 'compile_id = ' . $this->pdo->quote($compile_id);
|
|
||||||
}
|
|
||||||
// for clearing expired caches
|
|
||||||
if ($exp_time === Smarty::CLEAR_EXPIRED) {
|
|
||||||
$where[] = 'expire < CURRENT_TIMESTAMP';
|
|
||||||
} // range test expiration time
|
|
||||||
elseif ($exp_time !== null) {
|
|
||||||
$where[] = 'modified < DATE_SUB(NOW(), INTERVAL ' . intval($exp_time) . ' SECOND)';
|
|
||||||
}
|
|
||||||
// run delete query
|
|
||||||
$query = $this->pdo->query(sprintf($this->deleteStatement, join(' AND ', $where)));
|
|
||||||
return $query->rowCount();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the formatted table name
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
* @access protected
|
|
||||||
*/
|
|
||||||
protected function getTableName()
|
|
||||||
{
|
|
||||||
return (is_null($this->database)) ? "`{$this->table}`" : "`{$this->database}`.`{$this->table}`";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
<?php
|
|
||||||
require_once 'cacheresource.pdo.php';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* PDO Cache Handler with GZIP support
|
|
||||||
* Example usage :
|
|
||||||
* $cnx = new PDO("mysql:host=localhost;dbname=mydb", "username", "password");
|
|
||||||
* $smarty->setCachingType('pdo_gzip');
|
|
||||||
* $smarty->loadPlugin('Smarty_CacheResource_Pdo_Gzip');
|
|
||||||
* $smarty->registerCacheResource('pdo_gzip', new Smarty_CacheResource_Pdo_Gzip($cnx, 'smarty_cache'));
|
|
||||||
*
|
|
||||||
* @require Smarty_CacheResource_Pdo class
|
|
||||||
* @author Beno!t POLASZEK - 2014
|
|
||||||
*/
|
|
||||||
class Smarty_CacheResource_Pdo_Gzip extends Smarty_CacheResource_Pdo
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Encodes the content before saving to database
|
|
||||||
*
|
|
||||||
* @param string $content
|
|
||||||
*
|
|
||||||
* @return string $content
|
|
||||||
* @access protected
|
|
||||||
*/
|
|
||||||
protected function inputContent($content)
|
|
||||||
{
|
|
||||||
return gzdeflate($content);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Decodes the content before saving to database
|
|
||||||
*
|
|
||||||
* @param string $content
|
|
||||||
*
|
|
||||||
* @return string $content
|
|
||||||
* @access protected
|
|
||||||
*/
|
|
||||||
protected function outputContent($content)
|
|
||||||
{
|
|
||||||
return gzinflate($content);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extends All Resource
|
|
||||||
* Resource Implementation modifying the extends-Resource to walk
|
|
||||||
* through the template_dirs and inherit all templates of the same name
|
|
||||||
*
|
|
||||||
* @package Resource-examples
|
|
||||||
* @author Rodney Rehm
|
|
||||||
*/
|
|
||||||
class Smarty_Resource_Extendsall extends Smarty_Internal_Resource_Extends
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* populate Source Object with meta data from Resource
|
|
||||||
*
|
|
||||||
* @param Smarty_Template_Source $source source object
|
|
||||||
* @param Smarty_Internal_Template $_template template object
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null)
|
|
||||||
{
|
|
||||||
$uid = '';
|
|
||||||
$sources = array();
|
|
||||||
$timestamp = 0;
|
|
||||||
foreach ($source->smarty->getTemplateDir() as $key => $directory) {
|
|
||||||
try {
|
|
||||||
$s = Smarty_Resource::source(null, $source->smarty, 'file:' . '[' . $key . ']' . $source->name);
|
|
||||||
if (!$s->exists) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$sources[ $s->uid ] = $s;
|
|
||||||
$uid .= $s->filepath;
|
|
||||||
$timestamp = $s->timestamp > $timestamp ? $s->timestamp : $timestamp;
|
|
||||||
} catch (SmartyException $e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!$sources) {
|
|
||||||
$source->exists = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$sources = array_reverse($sources, true);
|
|
||||||
reset($sources);
|
|
||||||
$s = current($sources);
|
|
||||||
$source->components = $sources;
|
|
||||||
$source->filepath = $s->filepath;
|
|
||||||
$source->uid = sha1($uid . $source->smarty->_joined_template_dir);
|
|
||||||
$source->exists = true;
|
|
||||||
$source->timestamp = $timestamp;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Disable timestamp checks for extendsall resource.
|
|
||||||
* The individual source components will be checked.
|
|
||||||
*
|
|
||||||
* @return bool false
|
|
||||||
*/
|
|
||||||
public function checkTimestamps()
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,101 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MySQL Resource
|
|
||||||
* Resource Implementation based on the Custom API to use
|
|
||||||
* MySQL as the storage resource for Smarty's templates and configs.
|
|
||||||
* Table definition:
|
|
||||||
* <pre>CREATE TABLE IF NOT EXISTS `templates` (
|
|
||||||
* `name` varchar(100) NOT NULL,
|
|
||||||
* `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
||||||
* `source` text,
|
|
||||||
* PRIMARY KEY (`name`)
|
|
||||||
* ) ENGINE=InnoDB DEFAULT CHARSET=utf8;</pre>
|
|
||||||
* Demo data:
|
|
||||||
* <pre>INSERT INTO `templates` (`name`, `modified`, `source`) VALUES ('test.tpl', "2010-12-25 22:00:00", '{$x="hello
|
|
||||||
* world"}{$x}');</pre>
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @package Resource-examples
|
|
||||||
* @author Rodney Rehm
|
|
||||||
*/
|
|
||||||
class Smarty_Resource_Mysql extends Smarty_Resource_Custom
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* PDO instance
|
|
||||||
*
|
|
||||||
* @var \PDO
|
|
||||||
*/
|
|
||||||
protected $db;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* prepared fetch() statement
|
|
||||||
*
|
|
||||||
* @var \PDOStatement
|
|
||||||
*/
|
|
||||||
protected $fetch;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* prepared fetchTimestamp() statement
|
|
||||||
*
|
|
||||||
* @var \PDOStatement
|
|
||||||
*/
|
|
||||||
protected $mtime;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Smarty_Resource_Mysql constructor.
|
|
||||||
*
|
|
||||||
* @throws \SmartyException
|
|
||||||
*/
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
$this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty");
|
|
||||||
} catch (PDOException $e) {
|
|
||||||
throw new SmartyException('Mysql Resource failed: ' . $e->getMessage());
|
|
||||||
}
|
|
||||||
$this->fetch = $this->db->prepare('SELECT modified, source FROM templates WHERE name = :name');
|
|
||||||
$this->mtime = $this->db->prepare('SELECT modified FROM templates WHERE name = :name');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fetch a template and its modification time from database
|
|
||||||
*
|
|
||||||
* @param string $name template name
|
|
||||||
* @param string $source template source
|
|
||||||
* @param integer $mtime template modification timestamp (epoch)
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
protected function fetch($name, &$source, &$mtime)
|
|
||||||
{
|
|
||||||
$this->fetch->execute(array('name' => $name));
|
|
||||||
$row = $this->fetch->fetch();
|
|
||||||
$this->fetch->closeCursor();
|
|
||||||
if ($row) {
|
|
||||||
$source = $row[ 'source' ];
|
|
||||||
$mtime = strtotime($row[ 'modified' ]);
|
|
||||||
} else {
|
|
||||||
$source = null;
|
|
||||||
$mtime = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fetch a template's modification time from database
|
|
||||||
*
|
|
||||||
* @note implementing this method is optional. Only implement it if modification times can be accessed faster than
|
|
||||||
* loading the comple template source.
|
|
||||||
*
|
|
||||||
* @param string $name template name
|
|
||||||
*
|
|
||||||
* @return integer timestamp (epoch) the template was modified
|
|
||||||
*/
|
|
||||||
protected function fetchTimestamp($name)
|
|
||||||
{
|
|
||||||
$this->mtime->execute(array('name' => $name));
|
|
||||||
$mtime = $this->mtime->fetchColumn();
|
|
||||||
$this->mtime->closeCursor();
|
|
||||||
return strtotime($mtime);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MySQL Resource
|
|
||||||
* Resource Implementation based on the Custom API to use
|
|
||||||
* MySQL as the storage resource for Smarty's templates and configs.
|
|
||||||
* Note that this MySQL implementation fetches the source and timestamps in
|
|
||||||
* a single database query, instead of two separate like resource.mysql.php does.
|
|
||||||
* Table definition:
|
|
||||||
* <pre>CREATE TABLE IF NOT EXISTS `templates` (
|
|
||||||
* `name` varchar(100) NOT NULL,
|
|
||||||
* `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
||||||
* `source` text,
|
|
||||||
* PRIMARY KEY (`name`)
|
|
||||||
* ) ENGINE=InnoDB DEFAULT CHARSET=utf8;</pre>
|
|
||||||
* Demo data:
|
|
||||||
* <pre>INSERT INTO `templates` (`name`, `modified`, `source`) VALUES ('test.tpl', "2010-12-25 22:00:00", '{$x="hello
|
|
||||||
* world"}{$x}');</pre>
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @package Resource-examples
|
|
||||||
* @author Rodney Rehm
|
|
||||||
*/
|
|
||||||
class Smarty_Resource_Mysqls extends Smarty_Resource_Custom
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* PDO instance
|
|
||||||
*
|
|
||||||
* @var \PDO
|
|
||||||
*/
|
|
||||||
protected $db;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* prepared fetch() statement
|
|
||||||
*
|
|
||||||
* @var \PDOStatement
|
|
||||||
*/
|
|
||||||
protected $fetch;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Smarty_Resource_Mysqls constructor.
|
|
||||||
*
|
|
||||||
* @throws \SmartyException
|
|
||||||
*/
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
$this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty");
|
|
||||||
} catch (PDOException $e) {
|
|
||||||
throw new SmartyException('Mysql Resource failed: ' . $e->getMessage());
|
|
||||||
}
|
|
||||||
$this->fetch = $this->db->prepare('SELECT modified, source FROM templates WHERE name = :name');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fetch a template and its modification time from database
|
|
||||||
*
|
|
||||||
* @param string $name template name
|
|
||||||
* @param string $source template source
|
|
||||||
* @param integer $mtime template modification timestamp (epoch)
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
protected function fetch($name, &$source, &$mtime)
|
|
||||||
{
|
|
||||||
$this->fetch->execute(array('name' => $name));
|
|
||||||
$row = $this->fetch->fetch();
|
|
||||||
$this->fetch->closeCursor();
|
|
||||||
if ($row) {
|
|
||||||
$source = $row[ 'source' ];
|
|
||||||
$mtime = strtotime($row[ 'modified' ]);
|
|
||||||
} else {
|
|
||||||
$source = null;
|
|
||||||
$mtime = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
</BODY>
|
|
||||||
</HTML>
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
<HTML>
|
|
||||||
<HEAD>
|
|
||||||
<TITLE>{$title} - {$Name}</TITLE>
|
|
||||||
</HEAD>
|
|
||||||
<BODY bgcolor="#ffffff">
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
{config_load file="test.conf" section="setup"}
|
|
||||||
{include file="header.tpl" title=foo}
|
|
||||||
|
|
||||||
<PRE>
|
|
||||||
|
|
||||||
{* bold and title are read from the config file *}
|
|
||||||
{if #bold#}<b>{/if}
|
|
||||||
{* capitalize the first letters of each word of the title *}
|
|
||||||
Title: {#title#|capitalize}
|
|
||||||
{if #bold#}</b>{/if}
|
|
||||||
|
|
||||||
The current date and time is {$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}
|
|
||||||
|
|
||||||
The value of global assigned variable $SCRIPT_NAME is {$SCRIPT_NAME}
|
|
||||||
|
|
||||||
Example of accessing server environment variable SERVER_NAME: {$smarty.server.SERVER_NAME}
|
|
||||||
|
|
||||||
The value of {ldelim}$Name{rdelim} is <b>{$Name}</b>
|
|
||||||
|
|
||||||
variable modifier example of {ldelim}$Name|upper{rdelim}
|
|
||||||
|
|
||||||
<b>{$Name|upper}</b>
|
|
||||||
|
|
||||||
|
|
||||||
An example of a section loop:
|
|
||||||
|
|
||||||
{section name=outer
|
|
||||||
loop=$FirstName}
|
|
||||||
{if $smarty.section.outer.index is odd by 2}
|
|
||||||
{$smarty.section.outer.rownum} . {$FirstName[outer]} {$LastName[outer]}
|
|
||||||
{else}
|
|
||||||
{$smarty.section.outer.rownum} * {$FirstName[outer]} {$LastName[outer]}
|
|
||||||
{/if}
|
|
||||||
{sectionelse}
|
|
||||||
none
|
|
||||||
{/section}
|
|
||||||
|
|
||||||
An example of section looped key values:
|
|
||||||
|
|
||||||
{section name=sec1 loop=$contacts}
|
|
||||||
phone: {$contacts[sec1].phone}
|
|
||||||
<br>
|
|
||||||
|
|
||||||
fax: {$contacts[sec1].fax}
|
|
||||||
<br>
|
|
||||||
|
|
||||||
cell: {$contacts[sec1].cell}
|
|
||||||
<br>
|
|
||||||
{/section}
|
|
||||||
<p>
|
|
||||||
|
|
||||||
testing strip tags
|
|
||||||
{strip}
|
|
||||||
<table border=0>
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<A HREF="{$SCRIPT_NAME}">
|
|
||||||
<font color="red">This is a test </font>
|
|
||||||
</A>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
{/strip}
|
|
||||||
|
|
||||||
</PRE>
|
|
||||||
|
|
||||||
This is an example of the html_select_date function:
|
|
||||||
|
|
||||||
<form>
|
|
||||||
{html_select_date start_year=1998 end_year=2010}
|
|
||||||
</form>
|
|
||||||
|
|
||||||
This is an example of the html_select_time function:
|
|
||||||
|
|
||||||
<form>
|
|
||||||
{html_select_time use_24_hours=false}
|
|
||||||
</form>
|
|
||||||
|
|
||||||
This is an example of the html_options function:
|
|
||||||
|
|
||||||
<form>
|
|
||||||
<select name=states>
|
|
||||||
{html_options values=$option_values selected=$option_selected output=$option_output}
|
|
||||||
</select>
|
|
||||||
</form>
|
|
||||||
|
|
||||||
{include file="footer.tpl"}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
theme: jekyll-theme-minimal
|
|
||||||
@@ -1,332 +0,0 @@
|
|||||||
Tips & Tricks {#tips}
|
|
||||||
=============
|
|
||||||
|
|
||||||
Blank Variable Handling {#tips.blank.var.handling}
|
|
||||||
=======================
|
|
||||||
|
|
||||||
There may be times when you want to print a default value for an empty
|
|
||||||
variable instead of printing nothing, such as printing ` ` so that
|
|
||||||
html table backgrounds work properly. Many would use an
|
|
||||||
[`{if}`](#language.function.if) statement to handle this, but there is a
|
|
||||||
shorthand way with Smarty, using the
|
|
||||||
[`default`](#language.modifier.default) variable modifier.
|
|
||||||
|
|
||||||
> **Note**
|
|
||||||
>
|
|
||||||
> "Undefined variable" errors will show an E\_NOTICE if not disabled in
|
|
||||||
> PHP\'s [`error_reporting()`](&url.php-manual;error_reporting) level or
|
|
||||||
> Smarty\'s [`$error_reporting`](#variable.error.reporting) property and
|
|
||||||
> a variable had not been assigned to Smarty.
|
|
||||||
|
|
||||||
|
|
||||||
{* the long way *}
|
|
||||||
{if $title eq ''}
|
|
||||||
|
|
||||||
{else}
|
|
||||||
{$title}
|
|
||||||
{/if}
|
|
||||||
|
|
||||||
{* the short way *}
|
|
||||||
{$title|default:' '}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
See also [`default`](#language.modifier.default) modifier and [default
|
|
||||||
variable handling](#tips.default.var.handling).
|
|
||||||
|
|
||||||
Default Variable Handling {#tips.default.var.handling}
|
|
||||||
=========================
|
|
||||||
|
|
||||||
If a variable is used frequently throughout your templates, applying the
|
|
||||||
[`default`](#language.modifier.default) modifier every time it is
|
|
||||||
mentioned can get a bit ugly. You can remedy this by assigning the
|
|
||||||
variable its default value with the
|
|
||||||
[`{assign}`](#language.function.assign) function.
|
|
||||||
|
|
||||||
|
|
||||||
{* do this somewhere at the top of your template *}
|
|
||||||
{assign var='title' value=$title|default:'no title'}
|
|
||||||
|
|
||||||
{* if $title was empty, it now contains the value "no title" when you use it *}
|
|
||||||
{$title}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
See also [`default`](#language.modifier.default) modifier and [blank
|
|
||||||
variable handling](#tips.blank.var.handling).
|
|
||||||
|
|
||||||
Passing variable title to header template {#tips.passing.vars}
|
|
||||||
=========================================
|
|
||||||
|
|
||||||
When the majority of your templates use the same headers and footers, it
|
|
||||||
is common to split those out into their own templates and
|
|
||||||
[`{include}`](#language.function.include) them. But what if the header
|
|
||||||
needs to have a different title, depending on what page you are coming
|
|
||||||
from? You can pass the title to the header as an
|
|
||||||
[attribute](#language.syntax.attributes) when it is included.
|
|
||||||
|
|
||||||
`mainpage.tpl` - When the main page is drawn, the title of "Main Page"
|
|
||||||
is passed to the `header.tpl`, and will subsequently be used as the
|
|
||||||
title.
|
|
||||||
|
|
||||||
|
|
||||||
{include file='header.tpl' title='Main Page'}
|
|
||||||
{* template body goes here *}
|
|
||||||
{include file='footer.tpl'}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
`archives.tpl` - When the archives page is drawn, the title will be
|
|
||||||
"Archives". Notice in the archive example, we are using a variable from
|
|
||||||
the `archives_page.conf` file instead of a hard coded variable.
|
|
||||||
|
|
||||||
|
|
||||||
{config_load file='archive_page.conf'}
|
|
||||||
|
|
||||||
{include file='header.tpl' title=#archivePageTitle#}
|
|
||||||
{* template body goes here *}
|
|
||||||
{include file='footer.tpl'}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
`header.tpl` - Notice that "Smarty News" is printed if the `$title`
|
|
||||||
variable is not set, using the [`default`](#language.modifier.default)
|
|
||||||
variable modifier.
|
|
||||||
|
|
||||||
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>{$title|default:'Smarty News'}</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
`footer.tpl`
|
|
||||||
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Dates {#tips.dates}
|
|
||||||
=====
|
|
||||||
|
|
||||||
As a rule of thumb, always pass dates to Smarty as
|
|
||||||
[timestamps](&url.php-manual;time). This allows template designers to
|
|
||||||
use the [`date_format`](#language.modifier.date.format) modifier for
|
|
||||||
full control over date formatting, and also makes it easy to compare
|
|
||||||
dates if necessary.
|
|
||||||
|
|
||||||
|
|
||||||
{$startDate|date_format}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
This will output:
|
|
||||||
|
|
||||||
|
|
||||||
Jan 4, 2009
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{$startDate|date_format:"%Y/%m/%d"}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
This will output:
|
|
||||||
|
|
||||||
|
|
||||||
2009/01/04
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Dates can be compared in the template by timestamps with:
|
|
||||||
|
|
||||||
|
|
||||||
{if $order_date < $invoice_date}
|
|
||||||
...do something..
|
|
||||||
{/if}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
When using [`{html_select_date}`](#language.function.html.select.date)
|
|
||||||
in a template, the programmer will most likely want to convert the
|
|
||||||
output from the form back into timestamp format. Here is a function to
|
|
||||||
help you with that.
|
|
||||||
|
|
||||||
|
|
||||||
<?php
|
|
||||||
|
|
||||||
// this assumes your form elements are named
|
|
||||||
// startDate_Day, startDate_Month, startDate_Year
|
|
||||||
|
|
||||||
$startDate = makeTimeStamp($startDate_Year, $startDate_Month, $startDate_Day);
|
|
||||||
|
|
||||||
function makeTimeStamp($year='', $month='', $day='')
|
|
||||||
{
|
|
||||||
if(empty($year)) {
|
|
||||||
$year = strftime('%Y');
|
|
||||||
}
|
|
||||||
if(empty($month)) {
|
|
||||||
$month = strftime('%m');
|
|
||||||
}
|
|
||||||
if(empty($day)) {
|
|
||||||
$day = strftime('%d');
|
|
||||||
}
|
|
||||||
|
|
||||||
return mktime(0, 0, 0, $month, $day, $year);
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
See also [`{html_select_date}`](#language.function.html.select.date),
|
|
||||||
[`{html_select_time}`](#language.function.html.select.time),
|
|
||||||
[`date_format`](#language.modifier.date.format) and
|
|
||||||
[`$smarty.now`](#language.variables.smarty.now),
|
|
||||||
|
|
||||||
WAP/WML {#tips.wap}
|
|
||||||
=======
|
|
||||||
|
|
||||||
WAP/WML templates require a php [Content-Type
|
|
||||||
header](&url.php-manual;header) to be passed along with the template.
|
|
||||||
The easist way to do this would be to write a custom function that
|
|
||||||
prints the header. If you are using [caching](#caching), that won\'t
|
|
||||||
work so we\'ll do it using the [`{insert}`](#language.function.insert)
|
|
||||||
tag; remember `{insert}` tags are not cached! Be sure that there is
|
|
||||||
nothing output to the browser before the template, or else the header
|
|
||||||
may fail.
|
|
||||||
|
|
||||||
|
|
||||||
<?php
|
|
||||||
|
|
||||||
// be sure apache is configure for the .wml extensions!
|
|
||||||
// put this function somewhere in your application, or in Smarty.addons.php
|
|
||||||
function insert_header($params)
|
|
||||||
{
|
|
||||||
// this function expects $content argument
|
|
||||||
if (empty($params['content'])) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
header($params['content']);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
?>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
your Smarty template *must* begin with the insert tag :
|
|
||||||
|
|
||||||
|
|
||||||
{insert name=header content="Content-Type: text/vnd.wap.wml"}
|
|
||||||
|
|
||||||
<?xml version="1.0"?>
|
|
||||||
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
|
|
||||||
|
|
||||||
<!-- begin new wml deck -->
|
|
||||||
<wml>
|
|
||||||
<!-- begin first card -->
|
|
||||||
<card>
|
|
||||||
<do type="accept">
|
|
||||||
<go href="#two"/>
|
|
||||||
</do>
|
|
||||||
<p>
|
|
||||||
Welcome to WAP with Smarty!
|
|
||||||
Press OK to continue...
|
|
||||||
</p>
|
|
||||||
</card>
|
|
||||||
<!-- begin second card -->
|
|
||||||
<card id="two">
|
|
||||||
<p>
|
|
||||||
Pretty easy isn't it?
|
|
||||||
</p>
|
|
||||||
</card>
|
|
||||||
</wml>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Componentized Templates {#tips.componentized.templates}
|
|
||||||
=======================
|
|
||||||
|
|
||||||
Traditionally, programming templates into your applications goes as
|
|
||||||
follows: First, you accumulate your variables within your PHP
|
|
||||||
application, (maybe with database queries.) Then, you instantiate your
|
|
||||||
Smarty object, [`assign()`](#api.assign) the variables and
|
|
||||||
[`display()`](#api.display) the template. So lets say for example we
|
|
||||||
have a stock ticker on our template. We would collect the stock data in
|
|
||||||
our application, then assign these variables in the template and display
|
|
||||||
it. Now wouldn\'t it be nice if you could add this stock ticker to any
|
|
||||||
application by merely including the template, and not worry about
|
|
||||||
fetching the data up front?
|
|
||||||
|
|
||||||
You can do this by writing a custom plugin for fetching the content and
|
|
||||||
assigning it to a template variable.
|
|
||||||
|
|
||||||
`function.load_ticker.php` - drop file in
|
|
||||||
[`$plugins directory`](#variable.plugins.dir)
|
|
||||||
|
|
||||||
|
|
||||||
<?php
|
|
||||||
|
|
||||||
// setup our function for fetching stock data
|
|
||||||
function fetch_ticker($symbol)
|
|
||||||
{
|
|
||||||
// put logic here that fetches $ticker_info
|
|
||||||
// from some ticker resource
|
|
||||||
return $ticker_info;
|
|
||||||
}
|
|
||||||
|
|
||||||
function smarty_function_load_ticker($params, $smarty)
|
|
||||||
{
|
|
||||||
// call the function
|
|
||||||
$ticker_info = fetch_ticker($params['symbol']);
|
|
||||||
|
|
||||||
// assign template variable
|
|
||||||
$smarty->assign($params['assign'], $ticker_info);
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
`index.tpl`
|
|
||||||
|
|
||||||
|
|
||||||
{load_ticker symbol='SMARTY' assign='ticker'}
|
|
||||||
|
|
||||||
Stock Name: {$ticker.name} Stock Price: {$ticker.price}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
See also [`{include_php}`](#language.function.include.php),
|
|
||||||
[`{include}`](#language.function.include) and
|
|
||||||
[`{php}`](#language.function.php).
|
|
||||||
|
|
||||||
Obfuscating E-mail Addresses {#tips.obfuscating.email}
|
|
||||||
============================
|
|
||||||
|
|
||||||
Do you ever wonder how your email address gets on so many spam mailing
|
|
||||||
lists? One way spammers collect email addresses is from web pages. To
|
|
||||||
help combat this problem, you can make your email address show up in
|
|
||||||
scrambled javascript in the HTML source, yet it it will look and work
|
|
||||||
correctly in the browser. This is done with the
|
|
||||||
[`{mailto}`](#language.function.mailto) plugin.
|
|
||||||
|
|
||||||
|
|
||||||
<div id="contact">Send inquiries to
|
|
||||||
{mailto address=$EmailAddress encode='javascript' subject='Hello'}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
> **Note**
|
|
||||||
>
|
|
||||||
> This method isn\'t 100% foolproof. A spammer could conceivably program
|
|
||||||
> his e-mail collector to decode these values, but not likely\....
|
|
||||||
> hopefully..yet \... wheres that quantum computer :-?.
|
|
||||||
|
|
||||||
See also [`escape`](#language.modifier.escape) modifier and
|
|
||||||
[`{mailto}`](#language.function.mailto).
|
|
||||||
@@ -1,120 +0,0 @@
|
|||||||
Troubleshooting
|
|
||||||
===============
|
|
||||||
|
|
||||||
Smarty/PHP errors {#smarty.php.errors}
|
|
||||||
=================
|
|
||||||
|
|
||||||
Smarty can catch many errors such as missing tag attributes or malformed
|
|
||||||
variable names. If this happens, you will see an error similar to the
|
|
||||||
following:
|
|
||||||
|
|
||||||
|
|
||||||
Warning: Smarty: [in index.tpl line 4]: syntax error: unknown tag - '%blah'
|
|
||||||
in /path/to/smarty/Smarty.class.php on line 1041
|
|
||||||
|
|
||||||
Fatal error: Smarty: [in index.tpl line 28]: syntax error: missing section name
|
|
||||||
in /path/to/smarty/Smarty.class.php on line 1041
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Smarty shows you the template name, the line number and the error. After
|
|
||||||
that, the error consists of the actual line number in the Smarty class
|
|
||||||
that the error occurred.
|
|
||||||
|
|
||||||
There are certain errors that Smarty cannot catch, such as missing close
|
|
||||||
tags. These types of errors usually end up in PHP compile-time parsing
|
|
||||||
errors.
|
|
||||||
|
|
||||||
|
|
||||||
Parse error: parse error in /path/to/smarty/templates_c/index.tpl.php on line 75
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
When you encounter a PHP parsing error, the error line number will
|
|
||||||
correspond to the compiled PHP script, NOT the template itself. Usually
|
|
||||||
you can look at the template and spot the syntax error. Here are some
|
|
||||||
common things to look for: missing close tags for
|
|
||||||
[`{if}{/if}`](#language.function.if) or
|
|
||||||
[`{section}{/section}`](#language.function.if), or syntax of logic
|
|
||||||
within an `{if}` tag. If you can\'t find the error, you might have to
|
|
||||||
open the compiled PHP file and go to the line number to figure out where
|
|
||||||
the corresponding error is in the template.
|
|
||||||
|
|
||||||
|
|
||||||
Warning: Smarty error: unable to read resource: "index.tpl" in...
|
|
||||||
or
|
|
||||||
Warning: Smarty error: unable to read resource: "site.conf" in...
|
|
||||||
|
|
||||||
- The [`$template_dir`](#variable.template.dir) is incorrect, doesn\'t
|
|
||||||
exist or the file `index.tpl` is not in the `templates/` directory
|
|
||||||
|
|
||||||
- A [`{config_load}`](#language.function.config.load) function is
|
|
||||||
within a template (or [`configLoad()`](#api.config.load) has been
|
|
||||||
called) and either [`$config_dir`](#variable.config.dir) is
|
|
||||||
incorrect, does not exist or `site.conf` is not in the directory.
|
|
||||||
|
|
||||||
<!-- -->
|
|
||||||
|
|
||||||
|
|
||||||
Fatal error: Smarty error: the $compile_dir 'templates_c' does not exist,
|
|
||||||
or is not a directory...
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
- Either the [`$compile_dir`](#variable.compile.dir)is incorrectly
|
|
||||||
set, the directory does not exist, or `templates_c` is a file and
|
|
||||||
not a directory.
|
|
||||||
|
|
||||||
<!-- -->
|
|
||||||
|
|
||||||
|
|
||||||
Fatal error: Smarty error: unable to write to $compile_dir '....
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
- The [`$compile_dir`](#variable.compile.dir) is not writable by the
|
|
||||||
web server. See the bottom of the [installing
|
|
||||||
smarty](#installing.smarty.basic) page for more about permissions.
|
|
||||||
|
|
||||||
<!-- -->
|
|
||||||
|
|
||||||
|
|
||||||
Fatal error: Smarty error: the $cache_dir 'cache' does not exist,
|
|
||||||
or is not a directory. in /..
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
- This means that [`$caching`](#variable.caching) is enabled and
|
|
||||||
either; the [`$cache_dir`](#variable.cache.dir) is incorrectly set,
|
|
||||||
the directory does not exist, or `cache/` is a file and not a
|
|
||||||
directory.
|
|
||||||
|
|
||||||
<!-- -->
|
|
||||||
|
|
||||||
|
|
||||||
Fatal error: Smarty error: unable to write to $cache_dir '/...
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
- This means that [`$caching`](#variable.caching) is enabled and the
|
|
||||||
[`$cache_dir`](#variable.cache.dir) is not writable by the web
|
|
||||||
server. See the bottom of the [installing
|
|
||||||
smarty](#installing.smarty.basic) page for permissions.
|
|
||||||
|
|
||||||
<!-- -->
|
|
||||||
|
|
||||||
|
|
||||||
Warning: filemtime(): stat failed for /path/to/smarty/cache/3ab50a623e65185c49bf17c63c90cc56070ea85c.one.tpl.php
|
|
||||||
in /path/to/smarty/libs/sysplugins/smarty_resource.php
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
- This means that your application registered a custom error hander
|
|
||||||
(using [set\_error\_handler()](&url.php-manual;set_error_handler))
|
|
||||||
which is not respecting the given `$errno` as it should. If, for
|
|
||||||
whatever reason, this is the desired behaviour of your custom error
|
|
||||||
handler, please call
|
|
||||||
[`muteExpectedErrors()`](#api.mute.expected.errors) after you\'ve
|
|
||||||
registered your custom error handler.
|
|
||||||
|
|
||||||
See also [debugging](#chapter.debugging.console).
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
Debugging Console {#chapter.debugging.console}
|
|
||||||
=================
|
|
||||||
|
|
||||||
There is a debugging console included with Smarty. The console informs
|
|
||||||
you of all the [included](./language-builtin-functions/language-function-include.md) templates,
|
|
||||||
[assigned](../programmers/api-functions/api-assign.md) variables and
|
|
||||||
[config](./language-variables/language-config-variables.md) file variables for the current
|
|
||||||
invocation of the template. A template file named `debug.tpl` is
|
|
||||||
included with the distribution of Smarty which controls the formatting
|
|
||||||
of the console.
|
|
||||||
|
|
||||||
Set [`$debugging`](../programmers/api-variables/variable-debugging.md) to TRUE in Smarty, and if needed
|
|
||||||
set [`$debug_tpl`](../programmers/api-variables/variable-debug-template.md) to the template resource
|
|
||||||
path to `debug.tpl` (this is in [`SMARTY_DIR`](../programmers/smarty-constants.md) by
|
|
||||||
default). When you load the page, a Javascript console window will pop
|
|
||||||
up and give you the names of all the included templates and assigned
|
|
||||||
variables for the current page.
|
|
||||||
|
|
||||||
To see the available variables for a particular template, see the
|
|
||||||
[`{debug}`](./language-builtin-functions/language-function-debug.md) template function. To disable the
|
|
||||||
debugging console, set [`$debugging`](../programmers/api-variables/variable-debugging.md) to FALSE. You
|
|
||||||
can also temporarily turn on the debugging console by putting
|
|
||||||
`SMARTY_DEBUG` in the URL if you enable this option with
|
|
||||||
[`$debugging_ctrl`](../programmers/api-variables/variable-debugging-ctrl.md).
|
|
||||||
|
|
||||||
> **Note**
|
|
||||||
>
|
|
||||||
> The debugging console does not work when you use the
|
|
||||||
> [`fetch()`](../programmers/api-functions/api-fetch.md) API, only when using
|
|
||||||
> [`display()`](../programmers/api-functions/api-display.md). It is a set of javascript statements
|
|
||||||
> added to the very bottom of the generated template. If you do not like
|
|
||||||
> javascript, you can edit the `debug.tpl` template to format the output
|
|
||||||
> however you like. Debug data is not cached and `debug.tpl` info is not
|
|
||||||
> included in the output of the debug console.
|
|
||||||
|
|
||||||
> **Note**
|
|
||||||
>
|
|
||||||
> The load times of each template and config file are in seconds, or
|
|
||||||
> fractions thereof.
|
|
||||||
|
|
||||||
See also [troubleshooting](../appendixes/troubleshooting.md).
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
Config Files {#config.files}
|
|
||||||
============
|
|
||||||
|
|
||||||
Config files are handy for designers to manage global template variables
|
|
||||||
from one file. One example is template colors. Normally if you wanted to
|
|
||||||
change the color scheme of an application, you would have to go through
|
|
||||||
each and every template file and change the colors. With a config file,
|
|
||||||
the colors can be kept in one place, and only one file needs to be
|
|
||||||
updated.
|
|
||||||
|
|
||||||
|
|
||||||
# global variables
|
|
||||||
pageTitle = "Main Menu"
|
|
||||||
bodyBgColor = #000000
|
|
||||||
tableBgColor = #000000
|
|
||||||
rowBgColor = #00ff00
|
|
||||||
|
|
||||||
[Customer]
|
|
||||||
pageTitle = "Customer Info"
|
|
||||||
|
|
||||||
[Login]
|
|
||||||
pageTitle = "Login"
|
|
||||||
focus = "username"
|
|
||||||
Intro = """This is a value that spans more
|
|
||||||
than one line. you must enclose
|
|
||||||
it in triple quotes."""
|
|
||||||
|
|
||||||
# hidden section
|
|
||||||
[.Database]
|
|
||||||
host=my.example.com
|
|
||||||
db=ADDRESSBOOK
|
|
||||||
user=php-user
|
|
||||||
pass=foobar
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Values of [config file variables](./language-variables/language-config-variables.md) can be in
|
|
||||||
quotes, but not necessary. You can use either single or double quotes.
|
|
||||||
If you have a value that spans more than one line, enclose the entire
|
|
||||||
value with triple quotes (\"\"\"). You can put comments into config
|
|
||||||
files by any syntax that is not a valid config file syntax. We recommend
|
|
||||||
using a `
|
|
||||||
#` (hash) at the beginning of the line.
|
|
||||||
|
|
||||||
The example config file above has two sections. Section names are
|
|
||||||
enclosed in \[brackets\]. Section names can be arbitrary strings not
|
|
||||||
containing `[` or `]` symbols. The four variables at the top are global
|
|
||||||
variables, or variables not within a section. These variables are always
|
|
||||||
loaded from the config file. If a particular section is loaded, then the
|
|
||||||
global variables and the variables from that section are also loaded. If
|
|
||||||
a variable exists both as a global and in a section, the section
|
|
||||||
variable is used. If you name two variables the same within a section,
|
|
||||||
the last one will be used unless
|
|
||||||
[`$config_overwrite`](../programmers/api-variables/variable-config-overwrite.md) is disabled.
|
|
||||||
|
|
||||||
Config files are loaded into templates with the built-in template
|
|
||||||
function [`
|
|
||||||
{config_load}`](./language-builtin-functions/language-function-config-load.md) or the API
|
|
||||||
[`configLoad()`](../programmers/api-functions/api-config-load.md) function.
|
|
||||||
|
|
||||||
You can hide variables or entire sections by prepending the variable
|
|
||||||
name or section name with a period(.) eg `[.hidden]`. This is useful if
|
|
||||||
your application reads the config files and gets sensitive data from
|
|
||||||
them that the template engine does not need. If you have third parties
|
|
||||||
doing template editing, you can be certain that they cannot read
|
|
||||||
sensitive data from the config file by loading it into the template.
|
|
||||||
|
|
||||||
Config files (or resources) are loaded by the same resource facilities
|
|
||||||
as templates. That means that a config file can also be loaded from a db
|
|
||||||
`$smarty->configLoad("db:my.conf")`.
|
|
||||||
|
|
||||||
See also [`{config_load}`](./language-builtin-functions/language-function-config-load.md),
|
|
||||||
[`$config_overwrite`](../programmers/api-variables/variable-config-overwrite.md),
|
|
||||||
[`$default_config_handler_func`](../programmers/api-variables/variable-default-config-handler-func.md),
|
|
||||||
[`getConfigVars()`](../programmers/api-functions/api-get-config-vars.md),
|
|
||||||
[`clearConfig()`](../programmers/api-functions/api-clear-config.md) and
|
|
||||||
[`configLoad()`](../programmers/api-functions/api-config-load.md)
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
Basic Syntax
|
|
||||||
============
|
|
||||||
|
|
||||||
A simple Smarty template could look like this:
|
|
||||||
```html
|
|
||||||
<h1>{$title|escape}</h1>
|
|
||||||
<ul>
|
|
||||||
{foreach $cities as $city}
|
|
||||||
<li>{$city.name|escape} ({$city.population})</li>
|
|
||||||
{foreachelse}
|
|
||||||
<li>no cities found</li>
|
|
||||||
{/foreach}
|
|
||||||
</ul>
|
|
||||||
```
|
|
||||||
|
|
||||||
All Smarty template tags are enclosed within delimiters. By default
|
|
||||||
these are `{` and `}`, but they can be
|
|
||||||
[changed](../programmers/api-variables/variable-left-delimiter.md).
|
|
||||||
|
|
||||||
For the examples in this manual, we will assume that you are using the
|
|
||||||
default delimiters. In Smarty, all content outside of delimiters is
|
|
||||||
displayed as static content, or unchanged. When Smarty encounters
|
|
||||||
template tags, it attempts to interpret them, and displays the
|
|
||||||
appropriate output in their place.
|
|
||||||
|
|
||||||
The basis components of the Smarty syntax are:
|
|
||||||
- [Comments](./language-basic-syntax/language-syntax-comments.md)
|
|
||||||
- [Variables](./language-basic-syntax/language-syntax-variables.md)
|
|
||||||
- [Functions](./language-basic-syntax/language-syntax-functions.md)
|
|
||||||
- [Attributes](./language-basic-syntax/language-syntax-attributes.md)
|
|
||||||
- [Quotes](./language-basic-syntax/language-syntax-quotes.md)
|
|
||||||
- [Math](./language-basic-syntax/language-math.md)
|
|
||||||
- [Escaping](./language-basic-syntax/language-escaping.md)
|
|
||||||
@@ -1,84 +0,0 @@
|
|||||||
Escaping Smarty Parsing {#language.escaping}
|
|
||||||
=======================
|
|
||||||
|
|
||||||
It is sometimes desirable or even necessary to have Smarty ignore
|
|
||||||
sections it would otherwise parse. A classic example is embedding
|
|
||||||
Javascript or CSS code in a template. The problem arises as those
|
|
||||||
languages use the { and } characters which are also the default
|
|
||||||
[delimiters](#language.function.ldelim) for Smarty.
|
|
||||||
|
|
||||||
> **Note**
|
|
||||||
>
|
|
||||||
> A good practice for avoiding escapement altogether is by separating
|
|
||||||
> your Javascript/CSS into their own files and use standard HTML methods
|
|
||||||
> to access them. This will also take advantage of browser script
|
|
||||||
> caching. When you need to embed Smarty variables/functions into your
|
|
||||||
> Javascript/CSS, then the following applies.
|
|
||||||
|
|
||||||
In Smarty templates, the { and } braces will be ignored so long as they
|
|
||||||
are surrounded by white space. This behavior can be disabled by setting
|
|
||||||
the Smarty class variable [`$auto_literal`](#variable.auto.literal) to
|
|
||||||
false.
|
|
||||||
|
|
||||||
|
|
||||||
<script>
|
|
||||||
// the following braces are ignored by Smarty
|
|
||||||
// since they are surrounded by whitespace
|
|
||||||
function foobar {
|
|
||||||
alert('foobar!');
|
|
||||||
}
|
|
||||||
// this one will need literal escapement
|
|
||||||
{literal}
|
|
||||||
function bazzy {alert('foobar!');}
|
|
||||||
{/literal}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[`{literal}..{/literal}`](#language.function.literal) blocks are used
|
|
||||||
for escaping blocks of template logic. You can also escape the braces
|
|
||||||
individually with
|
|
||||||
[`{ldelim}`](#language.function.ldelim),[`{rdelim}`](#language.function.ldelim)
|
|
||||||
tags or
|
|
||||||
[`{$smarty.ldelim}`,`{$smarty.rdelim}`](#language.variables.smarty.ldelim)
|
|
||||||
variables.
|
|
||||||
|
|
||||||
Smarty\'s default delimiters { and } cleanly represent presentational
|
|
||||||
content. However if another set of delimiters suit your needs better,
|
|
||||||
you can change them with Smarty\'s
|
|
||||||
[`$left_delimiter`](#variable.left.delimiter) and
|
|
||||||
[`$right_delimiter`](#variable.right.delimiter) values.
|
|
||||||
|
|
||||||
> **Note**
|
|
||||||
>
|
|
||||||
> Changing delimiters affects ALL template syntax and escapement. Be
|
|
||||||
> sure to clear out cache and compiled files if you decide to change
|
|
||||||
> them.
|
|
||||||
|
|
||||||
|
|
||||||
<?php
|
|
||||||
|
|
||||||
$smarty->left_delimiter = '<!--{';
|
|
||||||
$smarty->right_delimiter = '}-->';
|
|
||||||
|
|
||||||
$smarty->assign('foo', 'bar');
|
|
||||||
$smarty->assign('name', 'Albert');
|
|
||||||
$smarty->display('example.tpl');
|
|
||||||
|
|
||||||
?>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Where the template is:
|
|
||||||
|
|
||||||
|
|
||||||
Welcome <!--{$name}--> to Smarty
|
|
||||||
<script language="javascript">
|
|
||||||
var foo = <!--{$foo}-->;
|
|
||||||
function dosomething() {
|
|
||||||
alert("foo is " + foo);
|
|
||||||
}
|
|
||||||
dosomething();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
Math {#language.math}
|
|
||||||
====
|
|
||||||
|
|
||||||
Math can be applied directly to variable values.
|
|
||||||
|
|
||||||
|
|
||||||
{$foo+1}
|
|
||||||
|
|
||||||
{$foo*$bar}
|
|
||||||
|
|
||||||
{* some more complicated examples *}
|
|
||||||
|
|
||||||
{$foo->bar-$bar[1]*$baz->foo->bar()-3*7}
|
|
||||||
|
|
||||||
{if ($foo+$bar.test%$baz*134232+10+$b+10)}
|
|
||||||
|
|
||||||
{$foo|truncate:"`$fooTruncCount/$barTruncFactor-1`"}
|
|
||||||
|
|
||||||
{assign var="foo" value="`$foo+$bar`"}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
> **Note**
|
|
||||||
>
|
|
||||||
> Although Smarty can handle some very complex expressions and syntax,
|
|
||||||
> it is a good rule of thumb to keep the template syntax minimal and
|
|
||||||
> focused on presentation. If you find your template syntax getting too
|
|
||||||
> complex, it may be a good idea to move the bits that do not deal
|
|
||||||
> explicitly with presentation to PHP by way of plugins or modifiers.
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
Attributes {#language.syntax.attributes}
|
|
||||||
==========
|
|
||||||
|
|
||||||
Most of the [functions](#language.syntax.functions) take attributes that
|
|
||||||
specify or modify their behavior. Attributes to Smarty functions are
|
|
||||||
much like HTML attributes. Static values don\'t have to be enclosed in
|
|
||||||
quotes, but it is required for literal strings. Variables with or
|
|
||||||
without modifiers may also be used, and should not be in quotes. You can
|
|
||||||
even use PHP function results, plugin results and complex expressions.
|
|
||||||
|
|
||||||
Some attributes require boolean values (TRUE or FALSE). These can be
|
|
||||||
specified as `true` and `false`. If an attribute has no value assigned
|
|
||||||
it gets the default boolean value of true.
|
|
||||||
|
|
||||||
|
|
||||||
{include file="header.tpl"}
|
|
||||||
|
|
||||||
{include file="header.tpl" nocache} // is equivalent to nocache=true
|
|
||||||
|
|
||||||
{include file="header.tpl" attrib_name="attrib value"}
|
|
||||||
|
|
||||||
{include file=$includeFile}
|
|
||||||
|
|
||||||
{include file=#includeFile# title="My Title"}
|
|
||||||
|
|
||||||
{assign var=foo value={counter}} // plugin result
|
|
||||||
|
|
||||||
{assign var=foo value=substr($bar,2,5)} // PHP function result
|
|
||||||
|
|
||||||
{assign var=foo value=$bar|strlen} // using modifier
|
|
||||||
|
|
||||||
{assign var=foo value=$buh+$bar|strlen} // more complex expression
|
|
||||||
|
|
||||||
{html_select_date display_days=true}
|
|
||||||
|
|
||||||
{mailto address="smarty@example.com"}
|
|
||||||
|
|
||||||
<select name="company_id">
|
|
||||||
{html_options options=$companies selected=$company_id}
|
|
||||||
</select>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
> **Note**
|
|
||||||
>
|
|
||||||
> Although Smarty can handle some very complex expressions and syntax,
|
|
||||||
> it is a good rule of thumb to keep the template syntax minimal and
|
|
||||||
> focused on presentation. If you find your template syntax getting too
|
|
||||||
> complex, it may be a good idea to move the bits that do not deal
|
|
||||||
> explicitly with presentation to PHP by way of plugins or modifiers.
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user