Compare commits

...

36 Commits

Author SHA1 Message Date
Clemens Schwaighofer
764ca1f098 fix Generate\Form test with missing session init 2023-01-05 11:32:39 +09:00
Clemens Schwaighofer
3d23e5b066 Composer update 2023-01-05 10:55:01 +09:00
Clemens Schwaighofer
90e418ba24 Smarty update to 4.3.0 2023-01-05 10:38:51 +09:00
Clemens Schwaighofer
b6a0937e0c autoloader update 2022-12-28 17:46:40 +09:00
Clemens Schwaighofer
b3f6f8ef18 Raname Progressbar.php to ProgressBar.php 2022-12-28 16:14:38 +09:00
Clemens Schwaighofer
d9d5400498 Add Test for get run times for unrun queryies 2022-12-28 11:31:39 +09:00
Clemens Schwaighofer
b1be681afb Bug fix in DB\IO for wrong array check
Did not use empty to check if query called hash entry exists
2022-12-28 11:26:56 +09:00
Clemens Schwaighofer
8ef309d479 PHP unit 8.2, cel builder br/input fix, doctype add, sync .user.ini
- do not sync .user.ini file in sync template
- add PHP 8.2 for test target phpunit
- cel/phfo builder update to not close br or img tags (besides input)
- psalm settings update
- add doctype to all base templates
2022-12-27 16:58:51 +09:00
Clemens Schwaighofer
6e59b63791 DB\IO phpdoc and phpstan fixes 2022-12-14 14:18:33 +09:00
Clemens Schwaighofer
9c7b3cea83 SQL Interface docstring fix 2022-12-14 13:53:54 +09:00
Clemens Schwaighofer
26af6a07f4 PHP unit tests updates for class changes 2022-12-09 16:53:10 +09:00
Clemens Schwaighofer
b7c6d4b478 DB\IO add unescape bytea data 2022-12-09 16:33:58 +09:00
Clemens Schwaighofer
9936fc04da Convert\Byte class fix string in abs call 2022-12-09 16:33:47 +09:00
Clemens Schwaighofer
1e0dfa2106 Update documentation for Convert\Byte Class
add more info in parameters flag
2022-12-09 13:43:15 +09:00
Clemens Schwaighofer
3af6f6a8f0 edit interface, hard set edit.css style sheet 2022-12-07 06:56:47 +09:00
Clemens Schwaighofer
1e793c0d16 Switch all SQL from tab to spaces 2022-12-06 09:27:08 +09:00
Clemens Schwaighofer
5be34453ce Fix in Smarty Template class and PAGE WIDTH set 2022-11-10 10:26:59 +09:00
Clemens Schwaighofer
7773b78e17 Fix in CoreLib Bytes for null to trim 2022-11-09 18:11:14 +09:00
Clemens Schwaighofer
2a3798c8c2 Create mo file update, basic edit css/javascript updates 2022-10-25 16:48:34 +09:00
Clemens Schwaighofer
bc8303fe5f Composer update 2022-10-25 16:48:12 +09:00
Clemens Schwaighofer
ba89b188d9 Mo create script update, phpstan fixes, document updates
create_mo:
set auto base folder bases on current location so we do not need do
adjust paths in script

phpstan fixes:
edit_base.php
CoreLibs/Basci.php
CoreLibs/DB/SQL/PgSQL.php

Update documentation in method headers
CoreLibs/Combined/DateTime.php
2022-10-12 09:48:22 +09:00
Clemens Schwaighofer
d15618cde4 Add JS_TRANSLATE file to smart template flow 2022-10-04 17:35:46 +09:00
Clemens Schwaighofer
0fd89727e9 Update Output\Form to allow ACL controlled edit/view entries
Fixed phpunit test runs with encoding test run and not resetting the
subsitute character back to default

Note: There are mime encoding failures for php 7.4 and 8.0 and one ACL
login failure test for php 7.4
2022-09-06 11:17:03 +09:00
Clemens Schwaighofer
a8e75d158b Update composer installed packages 2022-09-06 11:16:33 +09:00
Clemens Schwaighofer
4b3fbaa309 Updates based on latest phpstan run 2022-09-02 17:00:22 +09:00
Clemens Schwaighofer
1a6c65df0e Minor test updates, comment typo updates, DB_CONFIG_SET for default
$DB_CONFIG_SET is now default current selcted db config instead of
$DB_CONFIG so to not overwrite the array itself
2022-08-05 12:43:57 +09:00
Clemens Schwaighofer
24f553a17e Update comments for split element counter 2022-07-29 13:20:54 +09:00
Clemens Schwaighofer
9a3ea2f7db update strings class with split counter method 2022-07-29 13:19:45 +09:00
Clemens Schwaighofer
bcdb877d90 Phan/phpstan fixes 2022-07-29 11:06:53 +09:00
Clemens Schwaighofer
6d0e528c38 Combined\Datetime date/number to weekday conversion
Convert functions for date or weekday number to weekday name or date to
weekday number
2022-07-29 11:02:25 +09:00
Clemens Schwaighofer
7e6474195b String split format fix for non ascii characters
Currently just abort and return string as is
2022-07-29 10:38:32 +09:00
Clemens Schwaighofer
1795d3ba6c String convert class added
Currently with one method: splitFormatString

Converts a string to a string with separater characters based on a
format string
2022-07-29 07:00:02 +09:00
Clemens Schwaighofer
e1340acf55 Class header info string fix 2022-07-29 06:59:33 +09:00
Clemens Schwaighofer
b5ead3e266 Minor code block comment clean ups 2022-07-15 17:42:38 +09:00
Clemens Schwaighofer
f5daaca598 Fixes for Create\Email docstrings 2022-07-08 17:25:45 +09:00
Clemens Schwaighofer
6b4f310cd2 Email\Sending add dedicated kv folding flag
kv folding is now done via flag and only if an encoded is detected that
is japanese or UTF-8
2022-07-04 15:45:51 +09:00
974 changed files with 6300 additions and 48736 deletions

View File

@@ -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,7 @@ 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'
], ],
// what not to show as problem // what not to show as problem

View File

@@ -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;

View File

@@ -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;

View File

@@ -25,4 +25,4 @@ BEGIN
RETURN NEW; RETURN NEW;
END; END;
$$ $$
LANGUAGE 'plpgsql'; LANGUAGE 'plpgsql';

View File

@@ -25,4 +25,4 @@ BEGIN
RETURN NEW; RETURN NEW;
END; END;
$$ $$
LANGUAGE 'plpgsql'; LANGUAGE 'plpgsql';

View File

@@ -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';

View File

@@ -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;

View File

@@ -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'
); );

View File

@@ -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);
} }
} }

View File

@@ -13,7 +13,6 @@ use PHPUnit\Framework\TestCase;
*/ */
final class CoreLibsCombinedDateTimeTest extends TestCase final class CoreLibsCombinedDateTimeTest extends TestCase
{ {
/** /**
* timestamps * timestamps
* *
@@ -618,13 +617,169 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
* @param array $expected * @param array $expected
* @return void * @return void
*/ */
public function testCalcDaysInterval(string $input_a, string $input_b, bool $flag, $expected): void public function testCalcDaysInterval(
{ string $input_a,
string $input_b,
bool $flag,
$expected
): void {
$this->assertEquals( $this->assertEquals(
$expected, $expected,
\CoreLibs\Combined\DateTime::calcDaysInterval($input_a, $input_b, $flag) \CoreLibs\Combined\DateTime::calcDaysInterval($input_a, $input_b, $flag)
); );
} }
/**
* Undocumented function
*
* @return array
*/
public function weekdayNumberProvider(): array
{
return [
'0 invalid' => [0, null, 'Inv',],
'0 invalid long' => [0, true, 'Invalid',],
'1 short' => [1, null, 'Mon',],
'1 long' => [1, true, 'Monday',],
'2 short' => [2, null, 'Tue',],
'2 long' => [2, true, 'Tuesday',],
'3 short' => [3, null, 'Wed',],
'3 long' => [3, true, 'Wednesday',],
'4 short' => [4, null, 'Thu',],
'4 long' => [4, true, 'Thursday',],
'5 short' => [5, null, 'Fri',],
'5 long' => [5, true, 'Friday',],
'6 short' => [6, null, 'Sat',],
'6 long' => [6, true, 'Saturday',],
'7 short' => [7, null, 'Sun',],
'7 long' => [7, true, 'Sunday',],
'8 invalid' => [8, null, 'Inv',],
'8 invalid long' => [8, true, 'Invalid',],
];
}
/**
* int weekday number to string weekday
*
* @covers ::setWeekdayNameFromIsoDow
* @dataProvider weekdayNumberProvider
* @testdox weekdayListProvider $input (short $flag) will be $expected [$_dataName]
*
* @param int $input
* @param bool|null $flag
* @param string $expected
* @return void
*/
public function testSetWeekdayNameFromIsoDow(
int $input,
?bool $flag,
string $expected
): void {
if ($flag === null) {
$output = \CoreLibs\Combined\DateTime::setWeekdayNameFromIsoDow($input);
} else {
$output = \CoreLibs\Combined\DateTime::setWeekdayNameFromIsoDow($input, $flag);
}
$this->assertEquals(
$expected,
$output
);
}
/**
* Undocumented function
*
* @return array
*/
public function weekdayDateProvider(): array
{
return [
'invalid date' => ['2022-02-31', -1],
'1: monday' => ['2022-07-25', 1],
'2: tuesday' => ['2022-07-26', 2],
'3: wednesday' => ['2022-07-27', 3],
'4: thursday' => ['2022-07-28', 4],
'5: friday' => ['2022-07-29', 5],
'6: saturday' => ['2022-07-30', 6],
'7: sunday' => ['2022-07-31', 7],
];
}
/**
* date to weekday number
*
* @covers ::setWeekdayNumberFromDate
* @dataProvider weekdayDateProvider
* @testdox setWeekdayNumberFromDate $input will be $expected [$_dataName]
*
* @param string $input
* @param int $expected
* @return void
*/
public function testSetWeekdayNumberFromDate(
string $input,
int $expected
): void {
$this->assertEquals(
$expected,
\CoreLibs\Combined\DateTime::setWeekdayNumberFromDate($input)
);
}
/**
* Undocumented function
*
* @return array
*/
public function weekdayDateNameProvider(): array
{
return [
'invalid date short' => ['2022-02-31', null, 'Inv'],
'invalid date long' => ['2022-02-31', true, 'Invalid'],
'Mon short' => ['2022-07-25', null, 'Mon'],
'Monday long' => ['2022-07-25', true, 'Monday'],
'Tue short' => ['2022-07-26', null, 'Tue'],
'Tuesday long' => ['2022-07-26', true, 'Tuesday'],
'Wed short' => ['2022-07-27', null, 'Wed'],
'Wednesday long' => ['2022-07-27', true, 'Wednesday'],
'Thu short' => ['2022-07-28', null, 'Thu'],
'Thursday long' => ['2022-07-28', true, 'Thursday'],
'Fri short' => ['2022-07-29', null, 'Fri'],
'Friday long' => ['2022-07-29', true, 'Friday'],
'Sat short' => ['2022-07-30', null, 'Sat'],
'Saturday long' => ['2022-07-30', true, 'Saturday'],
'Sun short' => ['2022-07-31', null, 'Sun'],
'Sunday long' => ['2022-07-31', true, 'Sunday'],
];
}
/**
* date to weekday name
*
* @covers ::setWeekdayNameFromDate
* @dataProvider weekdayDateNameProvider
* @testdox setWeekdayNameFromDate $input (short $flag) will be $expected [$_dataName]
*
* @param string $input
* @param bool|null $flag
* @param string $expected
* @return void
*/
public function testSetWeekdayNameFromDate(
string $input,
?bool $flag,
string $expected
): void {
if ($flag === null) {
$output = \CoreLibs\Combined\DateTime::setWeekdayNameFromDate($input);
} else {
$output = \CoreLibs\Combined\DateTime::setWeekdayNameFromDate($input, $flag);
}
$this->assertEquals(
$expected,
$output
);
}
} }
// __END__ // __END__

View File

@@ -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',

View File

@@ -0,0 +1,261 @@
<?php // phpcs:disable Generic.Files.LineLength
declare(strict_types=1);
namespace tests;
use PHPUnit\Framework\TestCase;
/**
* Test class for Convert\Strings
* @coversDefaultClass \CoreLibs\Convert\Strings
* @testdox \CoreLibs\Convert\Strings method tests
*/
final class CoreLibsConvertStringsTest extends TestCase
{
/**
* Undocumented function
*
* @return array
*/
public function splitFormatStringProvider(): array
{
// 0: input
// 1: format
// 2: split characters as string, null for default
// 3: expected
return [
'all empty string' => [
'',
'',
null,
''
],
'empty input string' => [
'',
'2-2',
null,
''
],
'empty format string string' => [
'1234',
'',
null,
'1234'
],
'string format match' => [
'1234',
'2-2',
null,
'12-34'
],
'string format trailing match' => [
'1234',
'2-2-',
null,
'12-34'
],
'string format leading match' => [
'1234',
'-2-2',
null,
'12-34'
],
'string format double inside match' => [
'1234',
'2--2',
null,
'12--34',
],
'string format short first' => [
'1',
'2-2',
null,
'1'
],
'string format match first' => [
'12',
'2-2',
null,
'12'
],
'string format short second' => [
'123',
'2-2',
null,
'12-3'
],
'string format too long' => [
'1234567',
'2-2',
null,
'12-34-567'
],
'string format invalid format string' => [
'1234',
'2_2',
null,
'1234'
],
'different split character' => [
'1234',
'2_2',
'_',
'12_34'
],
'mixed split characters' => [
'123456',
'2-2_2',
'-_',
'12-34_56'
],
'length mixed' => [
'ABCD12345568ABC13',
'2-4_5-2#4',
'-_#',
'AB-CD12_34556-8A#BC13'
],
'split with split chars in string' => [
'12-34',
'2-2',
null,
'12--3-4'
],
'mutltibyte string' => [
'あいうえ',
'2-2',
null,
'あいうえ'
],
'mutltibyte split string' => [
'1234',
'-',
null,
'1234'
],
];
}
/**
* split format string
*
* @covers ::splitFormatString
* @dataProvider splitFormatStringProvider
* @testdox splitFormatString $input with format $format and splitters $split_characters will be $expected [$_dataName]
*
* @param string $input
* @param string $format
* @param string|null $split_characters
* @param string $expected
* @return void
*/
public function testSplitFormatString(
string $input,
string $format,
?string $split_characters,
string $expected
): void {
if ($split_characters === null) {
$output = \CoreLibs\Convert\Strings::splitFormatString(
$input,
$format
);
} else {
$output = \CoreLibs\Convert\Strings::splitFormatString(
$input,
$format,
$split_characters
);
}
$this->assertEquals(
$expected,
$output
);
}
/**
* Undocumented function
*
* @return array
*/
public function countSplitPartsProvider(): array
{
return [
'0 elements' => [
'',
null,
0
],
'1 element' => [
'1',
null,
1,
],
'2 elements, trailing' => [
'1-2-',
null,
2
],
'2 elements, leading' => [
'-1-2',
null,
2
],
'2 elements, midde double' => [
'1--2',
null,
2
],
'4 elements' => [
'1-2-3-4',
null,
4
],
'3 elemenst, other splitter' => [
'2-3_3',
'-_',
3
],
'illegal splitter' => [
'あsdf',
null,
0
]
];
}
/**
* count split parts
*
* @covers ::countSplitParts
* @dataProvider countSplitPartsProvider
* @testdox countSplitParts $input with splitters $split_characters will be $expected [$_dataName]
*
* @param string $input
* @param string|null $split_characters
* @param int $expected
* @return void
*/
public function testCountSplitParts(
string $input,
?string $split_characters,
int $expected
): void {
if ($split_characters === null) {
$output = \CoreLibs\Convert\Strings::countSplitParts(
$input
);
} else {
$output = \CoreLibs\Convert\Strings::countSplitParts(
$input,
$split_characters
);
}
$this->assertEquals(
$expected,
$output
);
}
}
// __END__

View File

@@ -41,36 +41,56 @@ final class CoreLibsCreateEmailTest extends TestCase
// 0: email // 0: email
// 1: name // 1: name
// 2: encoding // 2: encoding
// 3: expected // 3: kv_folding
// 4: expected
return [ return [
'all empty' => [ 'all empty' => [
'', '',
null, null,
null, null,
null,
'' ''
], ],
'email only' => [ 'email only' => [
'test@test.com', 'test@test.com',
null, null,
null, null,
null,
'test@test.com' 'test@test.com'
], ],
'email and name' => [ 'email and name' => [
'test@test.com', 'test@test.com',
'Test Name', 'Test Name',
null, null,
null,
'"Test Name" <test@test.com>' '"Test Name" <test@test.com>'
], ],
'name in mime encoded, default UTF-8' => [ 'name in mime encoded, default UTF-8' => [
'test@test.com', 'test@test.com',
'日本語', '日本語',
null, null,
null,
'"=?UTF-8?B?5pel5pys6Kqe?=" <test@test.com>' '"=?UTF-8?B?5pel5pys6Kqe?=" <test@test.com>'
], ],
'name in mime encoded with half width Katakana, default UTF-8' => [
'test@test.com',
'日本語カタカナパ',
null,
null,
'"=?UTF-8?B?5pel5pys6Kqe7722776A7722776F776K776f?=" <test@test.com>'
],
'name in mime encoded with half width Katakana, folding on, default UTF-8' => [
'test@test.com',
'日本語カタカナパ',
'UTF-8',
true,
'"=?UTF-8?B?5pel5pys6Kqe44Kr44K/44Kr44OK44OR?=" <test@test.com>'
],
'name in mime encoded, UTF-8 parameter' => [ 'name in mime encoded, UTF-8 parameter' => [
'test@test.com', 'test@test.com',
'日本語', '日本語',
'UTF-8', 'UTF-8',
null,
'"=?UTF-8?B?5pel5pys6Kqe?=" <test@test.com>' '"=?UTF-8?B?5pel5pys6Kqe?=" <test@test.com>'
], ],
// does internal UTF-8 to ISO-2022-JP convert // does internal UTF-8 to ISO-2022-JP convert
@@ -78,7 +98,25 @@ final class CoreLibsCreateEmailTest extends TestCase
'test@test.com', 'test@test.com',
'日本語', '日本語',
'ISO-2022-JP', 'ISO-2022-JP',
'"=?ISO-2022-JP?B?GyRCRnxLXA==?=" <test@test.com>' null,
'"=?ISO-2022-JP?B?GyRCRnxLXDhsGyhC?=" <test@test.com>'
],
'encoding with half width Katakana in ISO-2022-JP' => [
'test@test.com',
'日本語カタカナパ',
'ISO-2022-JP',
null,
'"=?ISO-2022-JP?B?GyRCRnxLXDhsGyhCPz8/Pz8/?=" <test@test.com>'
],
'encoding with half width Katakana, folding on in ISO-2022-JP' => [
'test@test.com',
'日本語カタカナパ',
'ISO-2022-JP',
true,
// 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>'
] ]
]; ];
} }
@@ -87,22 +125,30 @@ 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(
string $email, string $email,
?string $name, ?string $name,
?string $encoding, ?string $encoding,
?bool $kv_folding,
string $expected string $expected
): void { ): void {
if ($name === null && $encoding === null) { if ($name === null && $encoding === null && $kv_folding === null) {
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email); $encoded_email = \CoreLibs\Create\Email::encodeEmailName($email);
} elseif ($encoding === null) { } elseif ($encoding === null && $kv_folding === null) {
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email, $name); $encoded_email = \CoreLibs\Create\Email::encodeEmailName($email, $name);
} else { } elseif ($kv_folding === null) {
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email, $name, $encoding); $encoded_email = \CoreLibs\Create\Email::encodeEmailName($email, $name, $encoding);
} else {
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email, $name, $encoding, $kv_folding);
} }
$this->assertEquals( $this->assertEquals(
$expected, $expected,
@@ -119,6 +165,7 @@ final class CoreLibsCreateEmailTest extends TestCase
// 4: array for to email // 4: array for to email
// 5: replace content ([]/null) // 5: replace content ([]/null)
// 6: encoding (UTF-8/null) // 6: encoding (UTF-8/null)
// 7: kv_folding
// 8: return status // 8: return status
// 9: expected content // 9: expected content
return [ return [
@@ -130,6 +177,7 @@ final class CoreLibsCreateEmailTest extends TestCase
'to_email' => [], 'to_email' => [],
'replace' => null, 'replace' => null,
'encoding' => null, 'encoding' => null,
'kv_folding' => null,
'expected_status' => -1, 'expected_status' => -1,
'expected_content' => [], 'expected_content' => [],
], ],
@@ -141,9 +189,22 @@ final class CoreLibsCreateEmailTest extends TestCase
'to_email' => [], 'to_email' => [],
'replace' => null, 'replace' => null,
'encoding' => null, 'encoding' => null,
'kv_folding' => null,
'expected_status' => -2, 'expected_status' => -2,
'expected_content' => [], 'expected_content' => [],
], ],
'bad encoding, fail -3' => [
'subject' => 'SUBJECT',
'body' => 'BODY',
'from_email' => 'test@test.com',
'from_name' => '',
'to_email' => ['to@test.com'],
'replace' => null,
'encoding' => 'IDONTEXISTENCODING',
'kv_folding' => null,
'expected_status' => -3,
'expected_content' => [],
],
'sending email 1' => [ 'sending email 1' => [
'subject' => 'SUBJECT', 'subject' => 'SUBJECT',
'body' => 'BODY', 'body' => 'BODY',
@@ -154,6 +215,7 @@ final class CoreLibsCreateEmailTest extends TestCase
], ],
'replace' => null, 'replace' => null,
'encoding' => null, 'encoding' => null,
'kv_folding' => null,
'expected_status' => 2, 'expected_status' => 2,
'expected_content' => [ 'expected_content' => [
[ [
@@ -176,6 +238,7 @@ final class CoreLibsCreateEmailTest extends TestCase
], ],
'replace' => null, 'replace' => null,
'encoding' => null, 'encoding' => null,
'kv_folding' => null,
'expected_status' => 2, 'expected_status' => 2,
'expected_content' => [ 'expected_content' => [
[ [
@@ -188,6 +251,52 @@ final class CoreLibsCreateEmailTest extends TestCase
] ]
], ],
], ],
'sending email 1, encoded, with half width katakanata' => [
'subject' => 'SUBJECT 日本語カタカナパ',
'body' => 'BODY 日本語',
'from_email' => 'test@test.com',
'from_name' => '',
'to_email' => [
'test@test.com'
],
'replace' => null,
'encoding' => 'UTF-8',
'kv_folding' => null,
'expected_status' => 2,
'expected_content' => [
[
'header' => [
'From' => 'test@test.com'
],
'to' => 'test@test.com',
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6Kqe7722776A7722776F776K776f?=',
'body' => 'BODY 日本語',
]
],
],
'sending email 1, encoded, with half width katakanata, folding on' => [
'subject' => 'SUBJECT 日本語カタカナパ',
'body' => 'BODY 日本語',
'from_email' => 'test@test.com',
'from_name' => '',
'to_email' => [
'test@test.com'
],
'replace' => null,
'encoding' => 'UTF-8',
'kv_folding' => true,
'expected_status' => 2,
'expected_content' => [
[
'header' => [
'From' => 'test@test.com'
],
'to' => 'test@test.com',
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6Kqe44Kr44K/44Kr44OK44OR?=',
'body' => 'BODY 日本語',
]
],
],
'sending email 1, encoded subject ISO-2022-JP' => [ 'sending email 1, encoded subject ISO-2022-JP' => [
'subject' => 'SUBJECT 日本語', 'subject' => 'SUBJECT 日本語',
'body' => 'BODY 日本語', 'body' => 'BODY 日本語',
@@ -198,6 +307,7 @@ final class CoreLibsCreateEmailTest extends TestCase
], ],
'replace' => null, 'replace' => null,
'encoding' => 'ISO-2022-JP', 'encoding' => 'ISO-2022-JP',
'kv_folding' => null,
'expected_status' => 2, 'expected_status' => 2,
'expected_content' => [ 'expected_content' => [
[ [
@@ -222,6 +332,7 @@ final class CoreLibsCreateEmailTest extends TestCase
], ],
'replace' => null, 'replace' => null,
'encoding' => null, 'encoding' => null,
'kv_folding' => null,
'expected_status' => 2, 'expected_status' => 2,
'expected_content' => [ 'expected_content' => [
[ [
@@ -255,6 +366,7 @@ final class CoreLibsCreateEmailTest extends TestCase
'VAR' => 'bar', 'VAR' => 'bar',
], ],
'encoding' => null, 'encoding' => null,
'kv_folding' => null,
'expected_status' => 2, 'expected_status' => 2,
'expected_content' => [ 'expected_content' => [
[ [
@@ -280,6 +392,7 @@ final class CoreLibsCreateEmailTest extends TestCase
'VAR' => 'bar', 'VAR' => 'bar',
], ],
'encoding' => null, 'encoding' => null,
'kv_folding' => null,
'expected_status' => 2, 'expected_status' => 2,
'expected_content' => [ 'expected_content' => [
[ [
@@ -310,6 +423,7 @@ final class CoreLibsCreateEmailTest extends TestCase
'VAR' => 'bar', 'VAR' => 'bar',
], ],
'encoding' => null, 'encoding' => null,
'kv_folding' => null,
'expected_status' => 2, 'expected_status' => 2,
'expected_content' => [ 'expected_content' => [
[ [
@@ -340,6 +454,7 @@ final class CoreLibsCreateEmailTest extends TestCase
'VAR' => 'bar', 'VAR' => 'bar',
], ],
'encoding' => null, 'encoding' => null,
'kv_folding' => null,
'expected_status' => 2, 'expected_status' => 2,
'expected_content' => [ 'expected_content' => [
[ [
@@ -379,6 +494,7 @@ final class CoreLibsCreateEmailTest extends TestCase
'VAR' => 'bar', 'VAR' => 'bar',
], ],
'encoding' => null, 'encoding' => null,
'kv_folding' => null,
'expected_status' => 2, 'expected_status' => 2,
'expected_content' => [ 'expected_content' => [
[ [
@@ -434,6 +550,7 @@ final class CoreLibsCreateEmailTest extends TestCase
'VAR' => 'bar', 'VAR' => 'bar',
], ],
'encoding' => null, 'encoding' => null,
'kv_folding' => null,
'expected_status' => 2, 'expected_status' => 2,
'expected_content' => [ 'expected_content' => [
[ [
@@ -478,6 +595,7 @@ final class CoreLibsCreateEmailTest extends TestCase
* @param array $to_email * @param array $to_email
* @param array|null $replace * @param array|null $replace
* @param string|null $encoding * @param string|null $encoding
* @param bool|null $kv_folding
* @param int $expected_status * @param int $expected_status
* @param array $expected_content * @param array $expected_content
* @return void * @return void
@@ -490,6 +608,7 @@ final class CoreLibsCreateEmailTest extends TestCase
array $to_email, array $to_email,
?array $replace, ?array $replace,
?string $encoding, ?string $encoding,
?bool $kv_folding,
int $expected_status, int $expected_status,
array $expected_content array $expected_content
): void { ): void {
@@ -499,6 +618,9 @@ final class CoreLibsCreateEmailTest extends TestCase
if ($encoding === null) { if ($encoding === null) {
$encoding = 'UTF-8'; $encoding = 'UTF-8';
} }
if ($kv_folding === null) {
$kv_folding = false;
}
// force new set for each run // force new set for each run
self::$log->setLogUniqueId(true); self::$log->setLogUniqueId(true);
// set on of unique log id // set on of unique log id
@@ -512,6 +634,7 @@ final class CoreLibsCreateEmailTest extends TestCase
$to_email, $to_email,
$replace, $replace,
$encoding, $encoding,
$kv_folding,
true, true,
self::$log self::$log
); );

View File

@@ -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') {

View File

@@ -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 (

View File

@@ -1,5 +1,7 @@
-- 2022/6/17 update edit_user with login uid -- 2022/6/17 update edit_user with login uid
-- !!! COPY TABLE ARRAY FOLDER !!!
-- the login uid, at least 32 chars -- the login uid, at least 32 chars
ALTER TABLE edit_user ADD login_user_id VARCHAR UNIQUE; ALTER TABLE edit_user ADD login_user_id VARCHAR UNIQUE;
-- CREATE UNIQUE INDEX edit_user_login_user_id_key ON edit_user (login_user_id) WHERE login_user_id IS NOT NULL; -- CREATE UNIQUE INDEX edit_user_login_user_id_key ON edit_user (login_user_id) WHERE login_user_id IS NOT NULL;

View 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
```

View File

@@ -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

View File

@@ -49,11 +49,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.#'

View File

@@ -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 = [

View File

@@ -70,10 +70,11 @@ $status = Email::sendEmail(
], ],
[], [],
'UTF-8', 'UTF-8',
false,
true, true,
$log $log
); );
print "SENDING: " . $status . "<br>"; print "SENDING A: " . $status . "<br>";
$status = Email::sendEmail( $status = Email::sendEmail(
'TEST {REPLACE}', 'TEST {REPLACE}',
'BODY {OTHER}', 'BODY {OTHER}',
@@ -97,10 +98,11 @@ $status = Email::sendEmail(
'OTHER' => '**other**' 'OTHER' => '**other**'
], ],
'UTF-8', 'UTF-8',
false,
true, true,
$log $log
); );
print "SENDING: " . $status . "<br>"; print "SENDING B: " . $status . "<br>";
$status = Email::sendEmail( $status = Email::sendEmail(
'TEST', 'TEST',
@@ -110,10 +112,29 @@ $status = Email::sendEmail(
['a@a.com', 'b@b.com'], ['a@a.com', 'b@b.com'],
[], [],
'UTF-8', 'UTF-8',
false,
true, true,
$log $log
); );
print "SENDING: " . $status . "<br>"; print "SENDING C: " . $status . "<br>";
// SUBJECT 日本語カタカナパ
$status = Email::sendEmail(
'TEST 日本語カタカナパカタカナバ',
'BODY 日本語カタカナパカタカナバ',
'test@test.com',
'Test Name 日本語カタカナパ',
[
['email' => 'a@a.com', 'name' => 'a 日本語カタカナパカタカナバ'],
['email' => 'b@b.com', 'name' => 'b 日本語プブガバケブプガバケ'],
],
[],
'UTF-8',
false,
true,
$log
);
print "SENDING D: " . $status . "<br>";
// error message // error message
print $log->printErrorMsg(); print $log->printErrorMsg();

View File

@@ -139,6 +139,22 @@ foreach ($compare_dates as $compare_date) {
. DgS::printAr(DateTime::calcDaysInterval($compare_date[0], $compare_date[1], true)) . "<br>"; . DgS::printAr(DateTime::calcDaysInterval($compare_date[0], $compare_date[1], true)) . "<br>";
} }
// test date conversion
$dow = 2;
print "DOW[$dow]: " . DateTime::setWeekdayNameFromIsoDow($dow) . "<br>";
print "DOW[$dow],long: " . DateTime::setWeekdayNameFromIsoDow($dow, true) . "<br>";
$date = '2022-7-22';
print "DATE-dow[$date]: " . DateTime::setWeekdayNameFromDate($date) . "<br>";
print "DATE-dow[$date],long: " . DateTime::setWeekdayNameFromDate($date, true) . "<br>";
print "DOW-date[$date]: " . DateTime::setWeekdayNumberFromDate($date) . "<br>";
$dow = 11;
print "DOW[$dow];invalid: " . DateTime::setWeekdayNameFromIsoDow($dow) . "<br>";
print "DOW[$dow],long;invalid: " . DateTime::setWeekdayNameFromIsoDow($dow, true) . "<br>";
$date = '2022-70-242';
print "DATE-dow[$date];invalid: " . DateTime::setWeekdayNameFromDate($date) . "<br>";
print "DATE-dow[$date],long;invalid: " . DateTime::setWeekdayNameFromDate($date, true) . "<br>";
print "DOW-date[$date];invalid: " . DateTime::setWeekdayNumberFromDate($date) . "<br>";
// error message // error message
print $log->printErrorMsg(); print $log->printErrorMsg();

View File

@@ -209,13 +209,12 @@ print "INSERT WITH NO PRIMARY KEY WITH RETURNING STATUS: " . Support::printToStr
print "</pre>"; print "</pre>";
// READ PREPARE // READ PREPARE
if ( $q_prep = "SELECT test_foo_id, test, some_bool, string_a, number_a, "
$db->dbPrepare( . "number_a_numeric, some_time "
'sel_test_foo', . "FROM test_foo "
"SELECT test_foo_id, test, some_bool, string_a, number_a, number_a_numeric, some_time " . "WHERE test = $1 "
. "FROM test_foo ORDER BY test_foo_id DESC LIMIT 5" . "ORDER BY test_foo_id DESC LIMIT 5";
) === false if ($db->dbPrepare('sel_test_foo', $q_prep) === false) {
) {
print "Error in sel_test_foo prepare<br>"; print "Error in sel_test_foo prepare<br>";
} else { } else {
$max_rows = 6; $max_rows = 6;
@@ -229,6 +228,29 @@ if (
$i++; $i++;
} }
} }
// prepre a second time on normal connection
if ($db->dbPrepare('sel_test_foo', $q_prep) === false) {
print "Error prepareing<br>";
print "ERROR (dbPrepare on same query): "
. $db->dbGetLastError() . "/" . $db->dbGetLastWarning() . "/"
. "<pre>" . print_r($db->dbGetCombinedErrorHistory(), true) . "</pre><br>";
}
// NOTE: try to replacate connection still exists if script is run a second time
// open pg bouncer connection
$db_pgb = new CoreLibs\DB\IO($DB_CONFIG['test_pgbouncer'], $log);
print "[PGB] DBINFO: " . $db_pgb->dbInfo() . "<br>";
if ($db->dbPrepare('pgb_sel_test_foo', $q_prep) === false) {
print "[PGB] [1] Error in pgb_sel_test_foo prepare<br>";
} else {
print "[PGB] [1] pgb_sel_test_foo prepare OK<br>";
}
// second prepare
if ($db->dbPrepare('pgb_sel_test_foo', $q_prep) === false) {
print "[PGB] [2] Error in pgb_sel_test_foo prepare<br>";
} else {
print "[PGB] [2] pgb_sel_test_foo prepare OK<br>";
}
$db_pgb->dbClose();
# db write class test # db write class test
$table = 'test_foo'; $table = 'test_foo';

View File

@@ -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)] = [

View File

@@ -54,7 +54,7 @@ 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.colors.php">Class Test: COLORS</a></div>';
print '<div><a href="class_test.mime.php">Class Test: MIME</a></div>'; print '<div><a href="class_test.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>';
@@ -70,6 +70,7 @@ print '<div><a href="class_test.hash.php">Class Test: HASH</a></div>';
print '<div><a href="class_test.encoding.php">Class Test: ENCODING (CHECK/CONVERT/MIME)</a></div>'; print '<div><a href="class_test.encoding.php">Class Test: ENCODING (CHECK/CONVERT/MIME)</a></div>';
print '<div><a href="class_test.image.php">Class Test: IMAGE</a></div>'; print '<div><a href="class_test.image.php">Class Test: IMAGE</a></div>';
print '<div><a href="class_test.byte.php">Class Test: BYTE CONVERT</a></div>'; print '<div><a href="class_test.byte.php">Class Test: BYTE CONVERT</a></div>';
print '<div><a href="class_test.strings.php">Class Test: STRING CONVERT</a></div>';
print '<div><a href="class_test.datetime.php">Class Test: DATE/TIME</a></div>'; print '<div><a href="class_test.datetime.php">Class Test: DATE/TIME</a></div>';
print '<div><a href="class_test.array.php">Class Test: ARRAY HANDLER</a></div>'; print '<div><a href="class_test.array.php">Class Test: ARRAY HANDLER</a></div>';
print '<div><a href="class_test.file.php">Class Test: FILE</a></div>'; print '<div><a href="class_test.file.php">Class Test: FILE</a></div>';
@@ -83,6 +84,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>';

View File

@@ -0,0 +1,86 @@
<?php // phpcs:ignore warning
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-string';
ob_end_flush();
$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,
]);
$byte_class = 'CoreLibs\Convert\Strings';
$PAGE_NAME = 'TEST CLASS: STRINGS CONVERT';
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>';
$split = '4-4-4';
$test_strings = [
'13',
'1234',
'12341',
'12341234',
'123412341',
'123412341234',
'1234123412341234512345',
];
foreach ($test_strings as $string) {
print "Convert: $string with $split to: "
. \CoreLibs\Convert\Strings::splitFormatString($string, $split)
. "<br>";
}
$split = '2_2';
$string = '1234';
print "Convert: $string with $split to: "
. \CoreLibs\Convert\Strings::splitFormatString($string, $split)
. "<br>";
$split = '2-2';
$string = 'あいうえ';
print "Convert: $string with $split to: "
. \CoreLibs\Convert\Strings::splitFormatString($string, $split)
. "<br>";
$test_splits = [
'',
'2',
'2-2',
'2-3-4',
];
foreach ($test_splits as $split) {
print "$split with count: " . \CoreLibs\Convert\Strings::countSplitParts($split) . "<br>";
}
// error message
print $log->printErrorMsg();
print "</body></html>";
// __END__

474
www/composer.lock generated
View File

@@ -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": [],

View File

@@ -17,7 +17,20 @@ $DB_CONFIG = [
'db_user' => $_ENV['DB_USER.TEST'] ?? '', 'db_user' => $_ENV['DB_USER.TEST'] ?? '',
'db_pass' => $_ENV['DB_PASS.TEST'] ?? '', 'db_pass' => $_ENV['DB_PASS.TEST'] ?? '',
'db_host' => $_ENV['DB_HOST.TEST'] ?? '', 'db_host' => $_ENV['DB_HOST.TEST'] ?? '',
'db_port' => 5432, 'db_port' => $_ENV['DB_PORT.PG'] ?? 5432,
'db_schema' => 'public',
'db_type' => 'pgsql',
'db_encoding' => '',
'db_ssl' => 'allow', // allow, disable, require, prefer
'db_debug' => true, // turn on logging or not
],
// same as above, but uses pg bouncer
'test_pgbouncer' => [
'db_name' => $_ENV['DB_NAME.TEST'] ?? '',
'db_user' => $_ENV['DB_USER.TEST'] ?? '',
'db_pass' => $_ENV['DB_PASS.TEST'] ?? '',
'db_host' => $_ENV['DB_HOST.TEST'] ?? '',
'db_port' => $_ENV['DB_PORT.PG_BOUNCER'] ?? 5432,
'db_schema' => 'public', 'db_schema' => 'public',
'db_type' => 'pgsql', 'db_type' => 'pgsql',
'db_encoding' => '', 'db_encoding' => '',

View File

@@ -249,10 +249,10 @@ 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'] = DB_CONFIG; $GLOBALS['DB_CONFIG_SET'] = DB_CONFIG;
// define('DB_CONFIG_TARGET', SITE_CONFIG[$HOST_NAME]['db_host_target']); // define('DB_CONFIG_TARGET', SITE_CONFIG[$HOST_NAME]['db_host_target']);
// define('DB_CONFIG_OTHER', SITE_CONFIG[$HOST_NAME]['db_host_other']); // define('DB_CONFIG_OTHER', SITE_CONFIG[$HOST_NAME]['db_host_other']);
// override for login and global schemas // override for login and global schemas
@@ -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);

View File

@@ -2,9 +2,9 @@
/******************************************************************** /********************************************************************
* AUTHOR: Clemens Schwaighofer * AUTHOR: Clemens Schwaighofer
* CREATED: 2008/08/14 * CREATED:
* SHORT DESCRIPTION: * SHORT DESCRIPTION:
* URL redirect header *
* HISTORY: * HISTORY:
*********************************************************************/ *********************************************************************/

View File

@@ -2,8 +2,9 @@
/******************************************************************** /********************************************************************
* AUTHOR: Clemens Schwaighofer * AUTHOR: Clemens Schwaighofer
* CREATED: 2008/08/01 * CREATED:
* SHORT DESCRIPTION: * SHORT DESCRIPTION:
*
* HISTORY: * HISTORY:
*********************************************************************/ *********************************************************************/

View File

@@ -112,10 +112,11 @@ if (defined('LAYOUT')) {
} }
// set table width // set table width
$table_width = '100%'; $table_width = '100%';
$ADMIN_STYLESHEET = 'edit.css';
// define all needed smarty stuff for the general HTML/page building // define all needed smarty stuff for the general HTML/page building
$HEADER['CSS'] = CSS; $HEADER['CSS'] = CSS;
$HEADER['DEFAULT_ENCODING'] = DEFAULT_ENCODING; $HEADER['DEFAULT_ENCODING'] = DEFAULT_ENCODING;
/** @phpstan-ignore-next-line because ADMIN_STYLESHEET can be null */
$HEADER['STYLESHEET'] = $ADMIN_STYLESHEET ?? ADMIN_STYLESHEET; $HEADER['STYLESHEET'] = $ADMIN_STYLESHEET ?? ADMIN_STYLESHEET;
if ($form->my_page_name == 'edit_order') { if ($form->my_page_name == 'edit_order') {
@@ -457,6 +458,8 @@ if ($form->my_page_name == 'edit_order') {
$pathinfo = pathinfo($output_file); $pathinfo = pathinfo($output_file);
if (!empty($pathinfo['dirname'])) { if (!empty($pathinfo['dirname'])) {
$pathinfo['dirname'] .= DIRECTORY_SEPARATOR; $pathinfo['dirname'] .= DIRECTORY_SEPARATOR;
} else {
$pathinfo['dirname'] = '';
} }
if ($t_q) { if ($t_q) {
$t_q .= ', '; $t_q .= ', ';
@@ -552,6 +555,7 @@ if (is_dir(BASE . CACHE)) {
} }
$smarty->display($EDIT_TEMPLATE, 'editAdmin_' . $smarty->lang, 'editAdmin_' . $smarty->lang); $smarty->display($EDIT_TEMPLATE, 'editAdmin_' . $smarty->lang, 'editAdmin_' . $smarty->lang);
$form->log->debug('DEBUGEND', '==================================== [Form END]');
// debug output // debug output
echo $login->log->printErrorMsg(); echo $login->log->printErrorMsg();
echo $form->log->printErrorMsg(); echo $form->log->printErrorMsg();

View File

@@ -15,7 +15,11 @@ $edit_users = [
'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' => $GLOBALS['password'] ?? '',
@@ -30,6 +34,8 @@ $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
@@ -41,7 +47,9 @@ $edit_users = [
'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' => $GLOBALS['enabled'] ?? '',
@@ -52,6 +60,8 @@ $edit_users = [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
], ],
'min_edit_acl' => '100',
'min_show_acl' => '-1',
], ],
'deleted' => [ 'deleted' => [
'value' => $GLOBALS['deleted'] ?? '', 'value' => $GLOBALS['deleted'] ?? '',
@@ -62,6 +72,8 @@ $edit_users = [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
], ],
'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
'strict' => [ 'strict' => [
'value' => $GLOBALS['strict'] ?? '', 'value' => $GLOBALS['strict'] ?? '',
@@ -72,6 +84,8 @@ $edit_users = [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
], ],
'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
'locked' => [ 'locked' => [
'value' => $GLOBALS['locked'] ?? '', 'value' => $GLOBALS['locked'] ?? '',
@@ -82,6 +96,8 @@ $edit_users = [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
], ],
'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
'admin' => [ 'admin' => [
'value' => $GLOBALS['admin'] ?? '', 'value' => $GLOBALS['admin'] ?? '',
@@ -92,6 +108,8 @@ $edit_users = [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
], ],
'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
'debug' => [ 'debug' => [
'value' => $GLOBALS['debug'] ?? '', 'value' => $GLOBALS['debug'] ?? '',
@@ -102,6 +120,8 @@ $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' => $GLOBALS['db_debug'] ?? '',
@@ -112,22 +132,30 @@ $edit_users = [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
], ],
'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
'email' => [ 'email' => [
'value' => $GLOBALS['email'] ?? '', 'value' => $GLOBALS['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' => $GLOBALS['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' => $GLOBALS['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' => $GLOBALS['lock_until'] ?? '',
@@ -136,6 +164,8 @@ $edit_users = [
'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' => $GLOBALS['lock_after'] ?? '',
@@ -143,7 +173,8 @@ $edit_users = [
'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' => $GLOBALS['login_user_id'] ?? '',
@@ -151,19 +182,22 @@ $edit_users = [
'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' => $GLOBALS['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' => $GLOBALS['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' => $GLOBALS['login_user_id_locked'] ?? '',
@@ -174,6 +208,8 @@ $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' => $GLOBALS['login_user_id_revalidate_after'] ?? '',
@@ -182,7 +218,9 @@ $edit_users = [
'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' => $GLOBALS['login_user_id_valid_from'] ?? '',
@@ -191,6 +229,8 @@ $edit_users = [
'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' => $GLOBALS['login_user_id_valid_until'] ?? '',
@@ -199,6 +239,8 @@ $edit_users = [
'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' => $GLOBALS['edit_language_id'] ?? '',
@@ -206,14 +248,18 @@ $edit_users = [
'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' => $GLOBALS['edit_scheme_id'] ?? '',
'output_name' => 'Scheme', 'output_name' => 'Scheme',
'int_null' => 1, 'int_null' => 1,
'type' => 'drop_down_db', 'type' => 'drop_down_db',
'query' => "SELECT edit_scheme_id, name FROM edit_scheme WHERE enabled = 1 ORDER BY name" 'query' => "SELECT edit_scheme_id, name FROM edit_scheme WHERE enabled = 1 ORDER BY name",
'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
'edit_group_id' => [ 'edit_group_id' => [
'value' => $GLOBALS['edit_group_id'] ?? '', 'value' => $GLOBALS['edit_group_id'] ?? '',
@@ -221,7 +267,9 @@ $edit_users = [
'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' => $GLOBALS['edit_access_right_id'] ?? '',
@@ -229,25 +277,30 @@ $edit_users = [
'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' => $GLOBALS['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' => $GLOBALS['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' => $GLOBALS['login_error_date_first'] ?? '',
'type' => 'view', 'type' => 'view',
'empty' => '-' 'empty' => '-',
'min_show_acl' => '100',
], ],
'protected' => [ 'protected' => [
'value' => $GLOBALS['protected'] ?? '', 'value' => $GLOBALS['protected'] ?? '',
@@ -258,6 +311,8 @@ $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' => $GLOBALS['additional_acl'] ?? '',
@@ -265,12 +320,27 @@ $edit_users = [
'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
. (
!$GLOBALS['acl_admin'] ?
"WHERE admin = 0 "
. (
$GLOBALS['base_acl_level'] < 90 ?
"AND enabled = 1 " :
""
)
: ''
)
. "ORDER BY username",
'table_name' => 'edit_user', 'table_name' => 'edit_user',
'show_fields' => [ 'show_fields' => [
[ [
@@ -305,7 +375,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',

View File

@@ -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}

View File

@@ -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}
@@ -129,4 +130,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}

View File

@@ -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 //-->

View File

@@ -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}

View File

@@ -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">&nbsp;{t}really{/t}&nbsp; <input type="checkbox" name="really_delete" value="yes">&nbsp;{t}really{/t}&nbsp;
@@ -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">
&nbsp; &nbsp;
{/if} {/if}
</td> </td>
</tr> </tr>
{/if}

View File

@@ -8,6 +8,7 @@
******************************************************************** ********************************************************************
*} *}
<!doctype html>
<html> <html>
<head> <head>
<title>{$HTML_TITLE}</title> <title>{$HTML_TITLE}</title>

View File

@@ -8,6 +8,7 @@
******************************************************************** ********************************************************************
*} *}
<!doctype html>
<html> <html>
<head> <head>
<title>{$HTML_TITLE}</title> <title>{$HTML_TITLE}</title>

View File

@@ -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 */

View File

@@ -14,9 +14,9 @@ if (!DEBUG) {
}); });
}*/ }*/
// open overlay boxes counter // open overlay boxes counter for z-index
var GL_OB_S = 30; var GL_OB_S = 100;
var GL_OB_BASE = 30; var GL_OB_BASE = 100;
/** /**
* opens a popup window with winName and given features (string) * opens a popup window with winName and given features (string)
@@ -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();
} }
} }

View File

@@ -1131,6 +1131,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'];
@@ -1287,6 +1290,7 @@ class Login
. $strings['PASSWORD_CHANGE_BUTTON_VALUE'] . $strings['PASSWORD_CHANGE_BUTTON_VALUE']
. '" OnClick="ShowHideDiv(\'pw_change_div\');">' . '" OnClick="ShowHideDiv(\'pw_change_div\');">'
]); ]);
// TODO: submit or JS to set target page as ajax call
// NOTE: for the HTML block I ignore line lengths // NOTE: for the HTML block I ignore line lengths
// phpcs:disable // phpcs:disable
$this->login_template['password_change'] = <<<EOM $this->login_template['password_change'] = <<<EOM
@@ -1329,9 +1333,11 @@ EOM;
} }
// now check templates // now check templates
// TODO: submit or JS to set target page as ajax call
if (!$this->login_template['template']) { if (!$this->login_template['template']) {
$this->login_template['template'] = <<<EOM $this->login_template['template'] = <<<EOM
<html> <!DOCTYPE html>
<html lang="{LANGUAGE}">
<head> <head>
<title>{HTML_TITLE}</title> <title>{HTML_TITLE}</title>
<style type="text/css"> <style type="text/css">
@@ -1485,7 +1491,6 @@ EOM;
} }
// initial the session if there is no session running already // initial the session if there is no session running already
// check if session exists and could be created // check if session exists and could be created
// TODO: move session creation and check to outside?
if ($this->session->checkActiveSession() === false) { if ($this->session->checkActiveSession() === false) {
$this->login_error = 2; $this->login_error = 2;
echo '<b>No active session found</b>'; echo '<b>No active session found</b>';
@@ -1615,7 +1620,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 {

View File

@@ -66,7 +66,7 @@ class Basic
// logging interface, Debug\Logging class // logging interface, Debug\Logging class
/** @var \CoreLibs\Debug\Logging */ /** @var \CoreLibs\Debug\Logging */
public $log; public $log;
/** @var\CoreLibs\Create\Session */ /** @var \CoreLibs\Create\Session */
public $session; public $session;
// email valid checks // email valid checks

View File

@@ -1,7 +1,7 @@
<?php <?php
/* /*
* DEPRECATED: Use correct Json:: instead * DEPRECATED: Use correct Convert\Json:: instead
*/ */
declare(strict_types=1); declare(strict_types=1);

View File

@@ -1,7 +1,7 @@
<?php <?php
/* /*
* html convert functions * array search and transform functions
*/ */
declare(strict_types=1); declare(strict_types=1);

View File

@@ -1,7 +1,7 @@
<?php <?php
/* /*
* image thumbnail, rotate, etc * date convert and check functions
*/ */
declare(strict_types=1); declare(strict_types=1);
@@ -193,6 +193,54 @@ class DateTime
} }
} }
/**
* Returns long or short day of week name based on ISO day of week number
* 1: Monday
* ...
* 7: Sunday
*
* @param int $isodow 1: Monday, 7: Sunday
* @param bool $long Default false 'Mon', if true 'Monday'
* @return string Day of week string either short 'Mon' or long 'Monday'
*/
public static function setWeekdayNameFromIsoDow(int $isodow, bool $long = false): string
{
// if not valid, set to invalid
if ($isodow < 1 || $isodow > 7) {
return $long ? 'Invalid' : 'Inv';
}
return date($long ? 'l' : 'D', strtotime("Sunday +{$isodow} days") ?: null);
}
/**
* Get the day of week Name from date
*
* @param string $date Any valid date
* @param bool $long Default false 'Mon', if true 'Monday'
* @return string Day of week string either short 'Mon' or long 'Monday'
*/
public static function setWeekdayNameFromDate(string $date, bool $long = false): string
{
if (!self::checkDate($date)) {
return $long ? 'Invalid' : 'Inv';
}
return date($long ? 'l' : 'D', strtotime($date) ?: null);
}
/**
* Get the day of week Name from date
*
* @param string $date Any valid date
* @return int ISO Weekday number 1: Monday, 7: Sunday, -1 for invalid date
*/
public static function setWeekdayNumberFromDate(string $date): int
{
if (!self::checkDate($date)) {
return -1;
}
return (int)date('N', strtotime($date) ?: null);
}
/** /**
* splits & checks date, wrap around for check_date function * splits & checks date, wrap around for check_date function
* *
@@ -264,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)
{ {
@@ -306,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)
{ {

View File

@@ -1,7 +1,7 @@
<?php <?php
/* /*
* image thumbnail, rotate, etc * byte conversion from and to human readable
*/ */
declare(strict_types=1); declare(strict_types=1);
@@ -26,13 +26,16 @@ 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 [3] 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
*/ */
public static function humanReadableByteFormat($bytes, int $flags = 0): string public static function humanReadableByteFormat($bytes, int $flags = 0): string
@@ -62,7 +65,7 @@ class Byte
// 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';
@@ -110,6 +113,7 @@ class Byte
* *
* @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
*/ */
public static function stringByteFormat($number, int $flags = 0) public static function stringByteFormat($number, int $flags = 0)
@@ -134,7 +138,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) {

View File

@@ -1,7 +1,7 @@
<?php <?php
/* /*
* check if string is valid in target encoding * convert string frmo one encdoing to another with auto detect flags
*/ */
declare(strict_types=1); declare(strict_types=1);

View File

@@ -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;
} }
} }

View File

@@ -0,0 +1,123 @@
<?php
/*
* string convert and transform functions
*/
declare(strict_types=1);
namespace CoreLibs\Convert;
class Strings
{
/**
* return the number of elements in the split list
* 0 if nothing / invalid split
* 1 if no split character found
* n for the numbers in the split list
*
* @param string $split_format
* @param string $split_characters
* @return int
*/
public static function countSplitParts(
string $split_format,
string $split_characters = '-'
): int {
if (
empty($split_format) ||
// non valid characters inside, abort
!preg_match("/^[0-9" . $split_characters . "]/", $split_format) ||
preg_match('/[^\x20-\x7e]/', $split_characters)
) {
return 0;
}
$split_list = preg_split(
// allowed split characters
"/([" . $split_characters . "]{1})/",
$split_format
);
if (!is_array($split_list)) {
return 0;
}
return count(array_filter($split_list));
}
/**
* split format a string base on a split format string
* split format string is eg
* 4-4-4 that means 4 characters DASH 4 characters DASH 4 characters
* So a string in the format of
* ABCD1234EFGH will be ABCD-1234-EFGH
* Note a string LONGER then the maxium will be attached with the LAST
* split character. In above exmaple
* ABCD1234EFGHTOOLONG will be ABCD-1234-EFGH-TOOLONG
*
* @param string $value string value to split
* @param string $split_format split format
* @param string $split_characters list of charcters with which we split
* if not set uses dash ('-')
* @return string split formatted string or original value if not chnaged
*/
public static function splitFormatString(
string $value,
string $split_format,
string $split_characters = '-'
): string {
if (
// abort if split format is empty
empty($split_format) ||
// if not in the valid ASCII character range for any of the strings
preg_match('/[^\x20-\x7e]/', $value) ||
// preg_match('/[^\x20-\x7e]/', $split_format) ||
preg_match('/[^\x20-\x7e]/', $split_characters) ||
// only numbers and split characters in split_format
!preg_match("/[0-9" . $split_characters . "]/", $split_format)
) {
return $value;
}
// split format list
$split_list = preg_split(
// allowed split characters
"/([" . $split_characters . "]{1})/",
$split_format,
-1,
PREG_SPLIT_DELIM_CAPTURE
);
// if this is false, or only one array, abort split
if (!is_array($split_list) || count($split_list) == 1) {
return $value;
}
$out = '';
$pos = 0;
$last_split = '';
foreach ($split_list as $offset) {
if (is_numeric($offset)) {
$_part = substr($value, $pos, (int)$offset);
if (empty($_part)) {
break;
}
$out .= $_part;
$pos += (int)$offset;
} elseif ($pos) { // if first, do not add
$out .= $offset;
$last_split = $offset;
}
}
if (!empty($out) && $pos < strlen($value)) {
$out .= $last_split . substr($value, $pos);
}
// if last is not alphanumeric remove, remove
if (!strcspn(substr($out, -1, 1), $split_characters)) {
$out = substr($out, 0, -1);
}
// overwrite only if out is set
if (!empty($out)) {
return $out;
} else {
return $value;
}
}
}
// __END__

View File

@@ -13,6 +13,20 @@ namespace CoreLibs\Create;
*/ */
class Email class Email
{ {
/** @var array<string> allowed list for encodings that can do KV folding */
private static $encoding_kv_allowed = [
'UTF-8',
'EUC-JP',
'SJIS',
'SJIS-win',
'ISO-2022-JP',
'ISO-2022-JP-MS',
'JIS',
'JIS-ms',
];
/** @var string normaly this does not need to be changed */
private static $mb_convert_kana_mode = 'KV';
/** /**
* create mime encoded email part for to/from emails. * create mime encoded email part for to/from emails.
* If encoding is not UTF-8 it will convert the email name to target encoding * If encoding is not UTF-8 it will convert the email name to target encoding
@@ -22,32 +36,35 @@ class Email
* @param string $email E-Mail address * @param string $email E-Mail address
* @param string $email_name Name for the email address, in UTF-8, if not set, empty * @param string $email_name Name for the email address, in UTF-8, if not set, empty
* @param string $encoding Encoding, if not set UTF-8 * @param string $encoding Encoding, if not set UTF-8
* @param bool $kv_folding If set to true and a valid encoding, do KV folding
* @return string Correctly encoded and build email string * @return string Correctly encoded and build email string
*/ */
public static function encodeEmailName( public static function encodeEmailName(
string $email, string $email,
string $email_name = '', string $email_name = '',
string $encoding = 'UTF-8' string $encoding = 'UTF-8',
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');
} }
$email_name = $email_name =
mb_encode_mimeheader( mb_encode_mimeheader(
in_array($encoding, self::$encoding_kv_allowed) && $kv_folding ?
mb_convert_kana( mb_convert_kana(
$email_name, $email_name,
'KV', self::$mb_convert_kana_mode,
$encoding $encoding
), ) :
$email_name,
$encoding $encoding
); );
return '"' . $email_name . '" ' return '"' . $email_name . '" '
. '<' . (string)$email . '>'; . '<' . (string)$email . '>';
} else {
return $email;
}
} }
/** /**
@@ -57,13 +74,16 @@ class Email
* @param string $body Body string, in UTF-8 * @param string $body Body string, in UTF-8
* @param array<string,string> $replace Replace the array as key -> value, in UTF-8 * @param array<string,string> $replace Replace the array as key -> value, in UTF-8
* @param string $encoding Encoding for subject encode mime header * @param string $encoding Encoding for subject encode mime header
* @param bool $kv_folding If set to true and a valid encoding,
* do KV folding
* @return array<string> Pos 0: Subject, Pos 1: Body * @return array<string> Pos 0: Subject, Pos 1: Body
*/ */
private static function replaceContent( private static function replaceContent(
string $subject, string $subject,
string $body, string $body,
array $replace, array $replace,
string $encoding string $encoding,
bool $kv_folding
): array { ): array {
foreach (['subject', 'body'] as $element) { foreach (['subject', 'body'] as $element) {
$$element = str_replace( $$element = str_replace(
@@ -83,7 +103,17 @@ class Email
$body = mb_convert_encoding($body, $encoding, 'UTF-8'); $body = mb_convert_encoding($body, $encoding, 'UTF-8');
} }
// we need to encodde the subject // we need to encodde the subject
$subject = mb_encode_mimeheader($subject, $encoding); $subject = mb_encode_mimeheader(
in_array($encoding, self::$encoding_kv_allowed) && $kv_folding ?
// for any non UTF-8 encoding convert kana
mb_convert_kana(
$subject,
self::$mb_convert_kana_mode,
$encoding
) :
$subject,
$encoding
);
return [$subject, $body]; return [$subject, $body];
} }
@@ -104,6 +134,8 @@ class Email
* @param array<string,string> $replace_content Subject/Body replace as * @param array<string,string> $replace_content Subject/Body replace as
* search -> replace, in UTF-8 * search -> replace, in UTF-8
* @param string $encoding E-Mail encoding, default UTF-8 * @param string $encoding E-Mail encoding, default UTF-8
* @param bool $kv_folding If set to true and a valid encoding,
* do KV folding
* @param bool $test test flag, default off * @param bool $test test flag, default off
* @param \CoreLibs\Debug\Logging|null $log Logging class, * @param \CoreLibs\Debug\Logging|null $log Logging class,
* only used if test flag is true * only used if test flag is true
@@ -112,6 +144,7 @@ class Email
* 0 for send not ok * 0 for send not ok
* -1 for nothing set (emails, subject, body) * -1 for nothing set (emails, subject, body)
* -2 for empty to list * -2 for empty to list
* -3 encoding target not valid or not installed
*/ */
public static function sendEmail( public static function sendEmail(
string $subject, string $subject,
@@ -121,6 +154,7 @@ class Email
array $send_to_emails, array $send_to_emails,
array $replace_content = [], array $replace_content = [],
string $encoding = 'UTF-8', string $encoding = 'UTF-8',
bool $kv_folding = false,
bool $test = false, bool $test = false,
?\CoreLibs\Debug\Logging $log = null ?\CoreLibs\Debug\Logging $log = null
): int { ): int {
@@ -136,6 +170,12 @@ class Email
if (empty($subject) || empty($body) || empty($from_email)) { if (empty($subject) || empty($body) || empty($from_email)) {
return -1; return -1;
} }
if (
$encoding != 'UTF-8' &&
!in_array($encoding, mb_list_encodings())
) {
return -3;
}
// if not one valid to, abort // if not one valid to, abort
foreach ($send_to_emails as $to_email) { foreach ($send_to_emails as $to_email) {
// to_email can be string, then only to email // to_email can be string, then only to email
@@ -147,7 +187,8 @@ class Email
$_to_email = self::encodeEmailName( $_to_email = self::encodeEmailName(
$to_email['email'], $to_email['email'],
$to_email['name'] ?? '', $to_email['name'] ?? '',
$encoding $encoding,
$kv_folding
); );
$to_emails[] = $_to_email; $to_emails[] = $_to_email;
// if we have to replacement, this override replace content // if we have to replacement, this override replace content
@@ -183,7 +224,8 @@ class Email
$subject, $subject,
$body, $body,
$replace_content, $replace_content,
$encoding $encoding,
$kv_folding
); );
} }
@@ -205,7 +247,8 @@ class Email
$subject, $subject,
$body, $body,
$_replace, $_replace,
$encoding $encoding,
$kv_folding
); );
} }
} }
@@ -220,6 +263,7 @@ class Email
// build debug strings: convert to UTF-8 if not utf-8 // build debug strings: convert to UTF-8 if not utf-8
$log->debug('SEND EMAIL', 'HEADERS: ' . $log->prAr($headers) . ', ' $log->debug('SEND EMAIL', 'HEADERS: ' . $log->prAr($headers) . ', '
. 'ENCODING: ' . $encoding . ', ' . 'ENCODING: ' . $encoding . ', '
. 'KV FOLDING: ' . $log->prBl($kv_folding) . ', '
. 'TO: ' . $to_email . ', ' . 'TO: ' . $to_email . ', '
. 'SUBJECT: ' . $out_subject . ', ' . 'SUBJECT: ' . $out_subject . ', '
. 'BODY: ' . ($encoding == 'UTF-8' ? . 'BODY: ' . ($encoding == 'UTF-8' ?
@@ -227,6 +271,7 @@ class Email
mb_convert_encoding($out_body, 'UTF-8', $encoding))); mb_convert_encoding($out_body, 'UTF-8', $encoding)));
$log->debug('SEND EMAIL JSON', json_encode([ $log->debug('SEND EMAIL JSON', json_encode([
'encoding' => $encoding, 'encoding' => $encoding,
'kv_folding' => $kv_folding,
'header' => $headers, 'header' => $headers,
'to' => $to_email, 'to' => $to_email,
'subject' => $out_subject, 'subject' => $out_subject,

View File

@@ -1,7 +1,7 @@
<?php <?php
/* /*
* html convert functions * random key functions
*/ */
declare(strict_types=1); declare(strict_types=1);

View File

@@ -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,12 +58,16 @@ 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());
@@ -79,6 +86,7 @@ class ArrayIO extends \CoreLibs\DB\IO
} }
} }
} // set pk_name IF table_array was given } // set pk_name IF table_array was given
$this->dbArrayIOSetAcl($base_acl_level, $acl_admin);
} }
/** /**
@@ -89,6 +97,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
@@ -191,9 +226,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 +238,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'] . ' ';
@@ -338,10 +379,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 +400,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 +459,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 +575,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);

View File

@@ -1481,19 +1481,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 +1821,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 +2206,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 +2591,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)
) { ) {
@@ -2963,7 +2974,7 @@ class IO
* Either as single array level for single insert * Either as single array level for single insert
* Or nested array for multiple insert values * Or nested array for multiple insert values
* *
* If key was set only returns tghose values directly or as array * If key was set only returns those values directly or as array
* *
* On multiple insert return the position for which to return can be set too * On multiple insert return the position for which to return can be set too
* *
@@ -2978,7 +2989,7 @@ class IO
// return as is if key is null // return as is if key is null
if ($key === null) { if ($key === null) {
if (count($this->insert_id_arr) == 1) { if (count($this->insert_id_arr) == 1) {
// return as nul if not found // return as null if not found
return $this->insert_id_arr[0] ?? null; return $this->insert_id_arr[0] ?? null;
} else { } else {
return $this->insert_id_arr; return $this->insert_id_arr;

View File

@@ -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;
} }

View File

@@ -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

View File

@@ -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']);

View File

@@ -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
@@ -336,6 +338,12 @@ 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'];
$GLOBALS['base_acl_level'] = $this->base_acl_level;
$GLOBALS['acl_admin'] = $this->acl_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']) && /* isset($GLOBALS['table_arrays']) &&
@@ -348,7 +356,8 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
// $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
@@ -383,8 +392,12 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$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 +405,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 +432,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 +442,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 +452,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
]; ];
} }
@@ -489,8 +503,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 +529,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 +666,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 +772,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 +831,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 +845,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 +872,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 +887,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 +933,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 +981,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 +1005,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 +1018,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 +1028,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 +1041,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 +1055,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 +1120,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 +1153,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 +1168,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 +1202,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 +1225,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 +1458,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'] &&
@@ -1392,6 +1483,12 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
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 = '';
@@ -1567,7 +1664,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 +1693,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 +1779,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 +1925,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 +1950,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 +2259,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 +2278,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 +2330,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']
@@ -2523,7 +2647,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

View File

@@ -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();

View File

@@ -1 +1 @@
smarty-4.1.0/libs/ smarty-4.3.0/libs/

View File

@@ -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

View File

@@ -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.

View File

@@ -1,20 +0,0 @@
# Smarty template engine
Smarty is a template engine for PHP, facilitating the separation of presentation (HTML/CSS) from application logic.
![CI](https://github.com/smarty-php/smarty/workflows/CI/badge.svg)
## 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.

View File

@@ -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.

View File

@@ -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"
}
}

View File

@@ -1,5 +0,0 @@
title = Welcome to Smarty!
cutoff_size = 40
[setup]
bold = true

View File

@@ -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');

View File

@@ -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');
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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}`";
}
}

View File

@@ -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);
}
}

View File

@@ -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;
}
}

View File

@@ -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);
}
}

View File

@@ -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;
}
}
}

View File

@@ -1,2 +0,0 @@
</BODY>
</HTML>

View File

@@ -1,5 +0,0 @@
<HTML>
<HEAD>
<TITLE>{$title} - {$Name}</TITLE>
</HEAD>
<BODY bgcolor="#ffffff">

View File

@@ -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"}

View File

@@ -1 +0,0 @@
theme: jekyll-theme-minimal

View File

@@ -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 `&nbsp;` 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 ''}
&nbsp;
{else}
{$title}
{/if}
{* the short way *}
{$title|default:'&nbsp;'}
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).

View File

@@ -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).

View File

@@ -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).

View File

@@ -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)

View File

@@ -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)

View File

@@ -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>

View File

@@ -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.

View File

@@ -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.

View File

@@ -1,71 +0,0 @@
Comments {#language.syntax.comments}
========
Template comments are surrounded by asterisks, and that is surrounded by
the [delimiter](#variable.left.delimiter) tags like so:
::: {.informalexample}
{* this is a comment *}
:::
Smarty comments are NOT displayed in the final output of the template,
unlike `<!-- HTML comments -->`. These are useful for making internal
notes in the templates which no one will see ;-)
{* I am a Smarty comment, I don't exist in the compiled output *}
<html>
<head>
<title>{$title}</title>
</head>
<body>
{* another single line smarty comment *}
<!-- HTML comment that is sent to the browser -->
{* this multiline smarty
comment is
not sent to browser
*}
{*********************************************************
Multi line comment block with credits block
@ author: bg@example.com
@ maintainer: support@example.com
@ para: var that sets block style
@ css: the style output
**********************************************************}
{* The header file with the main logo and stuff *}
{include file='header.tpl'}
{* Dev note: the $includeFile var is assigned in foo.php script *}
<!-- Displays main content block -->
{include file=$includeFile}
{* this <select> block is redundant *}
{*
<select name="company">
{html_options options=$vals selected=$selected_id}
</select>
*}
<!-- Show header from affiliate is disabled -->
{* $affiliate|upper *}
{* you cannot nest comments *}
{*
<select name="company">
{* <option value="0">-- none -- </option> *}
{html_options options=$vals selected=$selected_id}
</select>
*}
</body>
</html>

View File

@@ -1,40 +0,0 @@
Functions {#language.syntax.functions}
=========
Every Smarty tag either prints a [variable](#language.variables) or
invokes some sort of function. These are processed and displayed by
enclosing the function and its [attributes](#language.syntax.attributes)
within delimiters like so: `{funcname attr1="val1" attr2="val2"}`.
{config_load file="colors.conf"}
{include file="header.tpl"}
{insert file="banner_ads.tpl" title="My Site"}
{if $logged_in}
Welcome, <span style="color:{#fontColor#}">{$name}!</span>
{else}
hi, {$name}
{/if}
{include file="footer.tpl"}
- Both [built-in functions](#language.builtin.functions) and [custom
functions](#language.custom.functions) have the same syntax within
templates.
- Built-in functions are the **inner** workings of Smarty, such as
[`{if}`](#language.function.if),
[`{section}`](#language.function.section) and
[`{strip}`](#language.function.strip). There should be no need to
change or modify them.
- Custom functions are **additional** functions implemented via
[plugins](#plugins). They can be modified to your liking, or you can
create new ones. [`{html_options}`](#language.function.html.options)
is an example of a custom function.
See also [`registerPlugin()`](#api.register.plugin)

View File

@@ -1,61 +0,0 @@
Embedding Vars in Double Quotes {#language.syntax.quotes}
===============================
- Smarty will recognize [assigned](#api.assign)
[variables](#language.syntax.variables) embedded in \"double
quotes\" so long as the variable name contains only numbers, letters
and under\_scores. See [naming](&url.php-manual;language.variables)
for more detail.
- With any other characters, for example a period(.) or
`$object->reference`, then the variable must be surrounded by
`` `backticks` ``.
- In addition Smarty3 does allow embedded Smarty tags in double quoted
strings. This is useful if you want to include variables with
modifiers, plugin or PHP function results.
<!-- -->
{func var="test $foo test"} // sees $foo
{func var="test $foo_bar test"} // sees $foo_bar
{func var="test `$foo[0]` test"} // sees $foo[0]
{func var="test `$foo[bar]` test"} // sees $foo[bar]
{func var="test $foo.bar test"} // sees $foo (not $foo.bar)
{func var="test `$foo.bar` test"} // sees $foo.bar
{func var="test `$foo.bar` test"|escape} // modifiers outside quotes!
{func var="test {$foo|escape} test"} // modifiers inside quotes!
{func var="test {time()} test"} // PHP function result
{func var="test {counter} test"} // plugin result
{func var="variable foo is {if !$foo}not {/if} defined"} // Smarty block function
{* will replace $tpl_name with value *}
{include file="subdir/$tpl_name.tpl"}
{* does NOT replace $tpl_name *}
{include file='subdir/$tpl_name.tpl'} // vars require double quotes!
{* must have backticks as it contains a dot "." *}
{cycle values="one,two,`$smarty.config.myval`"}
{* must have backticks as it contains a dot "." *}
{include file="`$module.contact`.tpl"}
{* can use variable with dot syntax *}
{include file="`$module.$view`.tpl"}
> **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.
See also [`escape`](#language.modifier.escape).

View File

@@ -1,111 +0,0 @@
Variables {#language.syntax.variables}
=========
Template variables start with the \$dollar sign. They can contain
numbers, letters and underscores, much like a [PHP
variable](&url.php-manual;language.variables). You can reference arrays
by index numerically or non-numerically. Also reference object
properties and methods.
[Config file variables](#language.config.variables) are an exception to
the \$dollar syntax and are instead referenced with surrounding
\#hashmarks\#, or via the
[`$smarty.config`](#language.variables.smarty.config) variable.
{$foo} <-- displaying a simple variable (non array/object)
{$foo[4]} <-- display the 5th element of a zero-indexed array
{$foo.bar} <-- display the "bar" key value of an array, similar to PHP $foo['bar']
{$foo.$bar} <-- display variable key value of an array, similar to PHP $foo[$bar]
{$foo->bar} <-- display the object property "bar"
{$foo->bar()} <-- display the return value of object method "bar"
{#foo#} <-- display the config file variable "foo"
{$smarty.config.foo} <-- synonym for {#foo#}
{$foo[bar]} <-- syntax only valid in a section loop, see {section}
{assign var=foo value='baa'}{$foo} <-- displays "baa", see {assign}
Many other combinations are allowed
{$foo.bar.baz}
{$foo.$bar.$baz}
{$foo[4].baz}
{$foo[4].$baz}
{$foo.bar.baz[4]}
{$foo->bar($baz,2,$bar)} <-- passing parameters
{"foo"} <-- static values are allowed
{* display the server variable "SERVER_NAME" ($_SERVER['SERVER_NAME'])*}
{$smarty.server.SERVER_NAME}
Math and embedding tags:
{$x+$y} // will output the sum of x and y.
{assign var=foo value=$x+$y} // in attributes
{$foo[$x+3]} // as array index
{$foo={counter}+3} // tags within tags
{$foo="this is message {counter}"} // tags within double quoted strings
Defining Arrays:
{assign var=foo value=[1,2,3]}
{assign var=foo value=['y'=>'yellow','b'=>'blue']}
{assign var=foo value=[1,[9,8],3]} // can be nested
Short variable assignment:
{$foo=$bar+2}
{$foo = strlen($bar)} // function in assignment
{$foo = myfunct( ($x+$y)*3 )} // as function parameter
{$foo.bar=1} // assign to specific array element
{$foo.bar.baz=1}
{$foo[]=1} // appending to an array
Smarty "dot" syntax (note: embedded {} are used to address ambiguities):
{$foo.a.b.c} => $foo['a']['b']['c']
{$foo.a.$b.c} => $foo['a'][$b]['c'] // with variable index
{$foo.a.{$b+4}.c} => $foo['a'][$b+4]['c'] // with expression as index
{$foo.a.{$b.c}} => $foo['a'][$b['c']] // with nested index
PHP-like syntax, alternative to "dot" syntax:
{$foo[1]} // normal access
{$foo['bar']}
{$foo['bar'][1]}
{$foo[$x+$x]} // index may contain any expression
{$foo[$bar[1]]} // nested index
{$foo[section_name]} // smarty {section} access, not array access!
Variable variables:
$foo // normal variable
$foo_{$bar} // variable name containing other variable
$foo_{$x+$y} // variable name containing expressions
$foo_{$bar}_buh_{$blar} // variable name with multiple segments
{$foo_{$x}} // will output the variable $foo_1 if $x has a value of 1.
Object chaining:
{$object->method1($x)->method2($y)}
Direct PHP function access:
{time()}
> **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.
Request variables such as `$_GET`, `$_SESSION`, etc are available via
the reserved [`$smarty`](#language.variables.smarty) variable.
See also [`$smarty`](#language.variables.smarty), [config
variables](#language.config.variables)
[`{assign}`](#language.function.assign) and [`assign()`](#api.assign).

View File

@@ -1,39 +0,0 @@
Built-in Functions {#language.builtin.functions}
==================
## Table of contents
- [{$var=...}](./language-builtin-functions/language-function-shortform-assign.md)
- [{append}](./language-builtin-functions/language-function-append.md)
- [{assign}](./language-builtin-functions/language-function-assign.md)
- [{block}](./language-builtin-functions/language-function-block.md)
- [{call}](./language-builtin-functions/language-function-call.md)
- [{capture}](./language-builtin-functions/language-function-capture.md)
- [{config_load}](./language-builtin-functions/language-function-config.load)
- [{debug}](./language-builtin-functions/language-function-debug.md)
- [{extends}](./language-builtin-functions/language-function-extends.md)
- [{for}](./language-builtin-functions/language-function-for.md)
- [{foreach},{foreachelse}](./language-builtin-functions/language-function-foreach.md)
- [{function}](./language-builtin-functions/language-function-function.md)
- [{if},{elseif},{else}](./language-builtin-functions/language-function-if.md)
- [{include}](./language-builtin-functions/language-function-include.md)
- [{include_php}](./language-builtin-functions/language-function-include.php)
- [{insert}](./language-builtin-functions/language-function-insert.md)
- [{ldelim},{rdelim}](./language-builtin-functions/language-function-ldelim.md)
- [{literal}](./language-builtin-functions/language-function-literal.md)
- [{nocache}](./language-builtin-functions/language-function-nocache.md)
- [{section},{sectionelse}](./language-builtin-functions/language-function-section.md)
- [{setfilter}](./language-builtin-functions/language-function-setfilter.md)
- [{strip}](./language-builtin-functions/language-function-strip.md)
- [{while}](./language-builtin-functions/language-function-while.md)
Smarty comes with several built-in functions. These built-in functions
are the integral part of the smarty template engine. They are compiled
into corresponding inline PHP code for maximum performance.
You cannot create your own [custom
functions](./language-custom-functions.md) with the same name; and you
should not need to modify the built-in functions.
A few of these functions have an `assign` attribute which collects the
result the function to a named template variable instead of being
output; much like the [`{assign}`](./language-builtin-functions/language-function-assign.md) function.

View File

@@ -1,49 +0,0 @@
{append} {#language.function.append}
========
`{append}` is used for creating or appending template variable arrays
**during the execution of a template**.
> **Note**
>
> Assignment of variables in-template is essentially placing application
> logic into the presentation that may be better handled in PHP. Use at
> your own discretion.
**Attributes:**
Attribute Name Type Required Default Description
---------------- -------- ---------- --------- ----------------------------------------------------------------------------------------------------
var string Yes *n/a* The name of the variable being assigned
value string Yes *n/a* The value being assigned
index string No *n/a* The index for the new array element. If not specified the value is append to the end of the array.
scope string No *n/a* The scope of the assigned variable: \'parent\',\'root\' or \'global\'
**Option Flags:**
Name Description
--------- -----------------------------------------------------
nocache Assigns the variable with the \'nocache\' attribute
{append var='name' value='Bob' index='first'}
{append var='name' value='Meyer' index='last'}
// or
{append 'name' 'Bob' index='first'} {* short-hand *}
{append 'name' 'Meyer' index='last'} {* short-hand *}
The first name is {$name.first}.<br>
The last name is {$name.last}.
The above example will output:
The first name is Bob.
The last name is Meyer.
See also [`append()`](#api.append) and
[`getTemplateVars()`](#api.get.template.vars).

View File

@@ -1,149 +0,0 @@
{assign} {#language.function.assign}
========
`{assign}` is used for assigning template variables **during the
execution of a template**.
> **Note**
>
> Assignment of variables in-template is essentially placing application
> logic into the presentation that may be better handled in PHP. Use at
> your own discretion.
> **Note**
>
> See also the [`short-form`](#language.function.shortform.assign)
> method of assigning template vars.
**Attributes:**
Attribute Name Type Required Default Description
---------------- -------- ---------- --------- -----------------------------------------------------------------------
var string Yes *n/a* The name of the variable being assigned
value string Yes *n/a* The value being assigned
scope string No *n/a* The scope of the assigned variable: \'parent\',\'root\' or \'global\'
**Option Flags:**
Name Description
--------- -----------------------------------------------------
nocache Assigns the variable with the \'nocache\' attribute
{assign var="name" value="Bob"}
{assign "name" "Bob"} {* short-hand *}
The value of $name is {$name}.
The above example will output:
The value of $name is Bob.
{assign var="name" value="Bob" nocache}
{assign "name" "Bob" nocache} {* short-hand *}
The value of $name is {$name}.
The above example will output:
The value of $name is Bob.
{assign var=running_total value=$running_total+$some_array[$row].some_value}
Variables assigned in the included template will be seen in the
including template.
{include file="sub_template.tpl"}
...
{* display variable assigned in sub_template *}
{$foo}<br>
...
The template above includes the example `sub_template.tpl` below
...
{* foo will be known also in the including template *}
{assign var="foo" value="something" scope=parent}
{* bar is assigned only local in the including template *}
{assign var="bar" value="value"}
...
You can assign a variable to root of the current root tree. The variable
is seen by all templates using the same root tree.
{assign var=foo value="bar" scope="root"}
A global variable is seen by all templates.
{assign var=foo value="bar" scope="global"}
{assign "foo" "bar" scope="global"} {* short-hand *}
To access `{assign}` variables from a php script use
[`getTemplateVars()`](#api.get.template.vars). Here\'s the template that
creates the variable `$foo`.
{assign var="foo" value="Smarty"}
The template variables are only available after/during template
execution as in the following script.
<?php
// this will output nothing as the template has not been executed
echo $smarty->getTemplateVars('foo');
// fetch the template to a variable
$whole_page = $smarty->fetch('index.tpl');
// this will output 'smarty' as the template has been executed
echo $smarty->getTemplateVars('foo');
$smarty->assign('foo','Even smarter');
// this will output 'Even smarter'
echo $smarty->getTemplateVars('foo');
?>
The following functions can also *optionally* assign template variables.
[`{capture}`](#language.function.capture),
[`{include}`](#language.function.include),
[`{include_php}`](#language.function.include.php),
[`{insert}`](#language.function.insert),
[`{counter}`](#language.function.counter),
[`{cycle}`](#language.function.cycle),
[`{eval}`](#language.function.eval),
[`{fetch}`](#language.function.fetch),
[`{math}`](#language.function.math),
[`{textformat}`](#language.function.textformat)
See also [`{$var=...}`](#language.function.shortform.assign),
[`assign()`](#api.assign) and
[`getTemplateVars()`](#api.get.template.vars).

View File

@@ -1,191 +0,0 @@
{block} {#language.function.block}
=======
`{block}` is used to define a named area of template source for template
inheritance. For details see section of [Template
Interitance](#advanced.features.template.inheritance).
The `{block}` template source area of a child template will replace the
correponding areas in the parent template(s).
Optionally `{block}` areas of child and parent templates can be merged
into each other. You can append or prepend the parent `{block}` content
by using the `append` or `prepend` option flag with the childs `{block}`
definition. With the {\$smarty.block.parent} the `{block}` content of
the parent template can be inserted at any location of the child
`{block}` content. {\$smarty.block.child} inserts the `{block}` content
of the child template at any location of the parent `{block}`.
`{blocks}'s` can be nested.
**Attributes:**
Attribute Name Type Required Default Description
---------------- -------- ---------- --------- ---------------------------------------
name string Yes *n/a* The name of the template source block
**Option Flags (in child templates only):**
Name Description
--------- -------------------------------------------------------------------------------------------
append The `{block}` content will be be appended to the content of the parent template `{block}`
prepend The `{block}` content will be prepended to the content of the parent template `{block}`
hide Ignore the block content if no child block of same name is existing.
nocache Disables caching of the `{block}` content
parent.tpl
<html>
<head>
<title>{block name="title"}Default Title{/block}</title>
<title>{block "title"}Default Title{/block}</title> {* short-hand *}
</head>
</html>
child.tpl
{extends file="parent.tpl"}
{block name="title"}
Page Title
{/block}
The result would look like
<html>
<head>
<title>Page Title</title>
</head>
</html>
parent.tpl
<html>
<head>
<title>{block name="title"}Title - {/block}</title>
</head>
</html>
child.tpl
{extends file="parent.tpl"}
{block name="title" prepend}
Page Title
{/block}
The result would look like
<html>
<head>
<title>Title - Page Title</title>
</head>
</html>
parent.tpl
<html>
<head>
<title>{block name="title"} is my title{/block}</title>
</head>
</html>
child.tpl
{extends file="parent.tpl"}
{block name="title" append}
Page Title
{/block}
The result would look like
<html>
<head>
<title>Page title is my titel</title>
</head>
</html>
parent.tpl
<html>
<head>
<title>{block name="title"}The {$smarty.block.child} was inserted here{/block}</title>
</head>
</html>
child.tpl
{extends file="parent.tpl"}
{block name="title"}
Child Title
{/block}
The result would look like
<html>
<head>
<title>The Child Title was inserted here</title>
</head>
</html>
parent.tpl
<html>
<head>
<title>{block name="title"}Parent Title{/block}</title>
</head>
</html>
child.tpl
{extends file="parent.tpl"}
{block name="title"}
You will see now - {$smarty.block.parent} - here
{/block}
The result would look like
<html>
<head>
<title>You will see now - Parent Title - here</title>
</head>
</html>
See also [Template
Inheritance](#advanced.features.template.inheritance),
[`$smarty.block.parent`](#language.variables.smarty.block.parent),
[`$smarty.block.child`](#language.variables.smarty.block.child), and
[`{extends}`](#language.function.extends)

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