Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1a6c65df0e | ||
|
|
24f553a17e | ||
|
|
9a3ea2f7db | ||
|
|
bcdb877d90 | ||
|
|
6d0e528c38 | ||
|
|
7e6474195b | ||
|
|
1795d3ba6c | ||
|
|
e1340acf55 | ||
|
|
b5ead3e266 | ||
|
|
f5daaca598 | ||
|
|
6b4f310cd2 | ||
|
|
7b5bddb529 |
@@ -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;
|
||||||
|
|||||||
@@ -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__
|
||||||
|
|||||||
261
4dev/tests/CoreLibsConvertStringsTest.php
Normal file
261
4dev/tests/CoreLibsConvertStringsTest.php
Normal 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',
|
||||||
|
'2-2',
|
||||||
|
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__
|
||||||
@@ -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,22 @@ 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,
|
||||||
|
'"=?ISO-2022-JP?B?GyRCRnxLXDhsGyhCPz8/Pz8=?=" <test@test.com>'
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@@ -95,14 +130,17 @@ final class CoreLibsCreateEmailTest extends TestCase
|
|||||||
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 +157,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 +169,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 +181,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 +207,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 +230,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 +243,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 +299,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 +324,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 +358,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 +384,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 +415,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 +446,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 +486,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 +542,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 +587,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 +600,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 +610,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 +626,7 @@ final class CoreLibsCreateEmailTest extends TestCase
|
|||||||
$to_email,
|
$to_email,
|
||||||
$replace,
|
$replace,
|
||||||
$encoding,
|
$encoding,
|
||||||
|
$kv_folding,
|
||||||
true,
|
true,
|
||||||
self::$log
|
self::$log
|
||||||
);
|
);
|
||||||
@@ -567,12 +682,6 @@ final class CoreLibsCreateEmailTest extends TestCase
|
|||||||
$email['body'] ?? '',
|
$email['body'] ?? '',
|
||||||
'Email check: assert body'
|
'Email check: assert body'
|
||||||
);
|
);
|
||||||
/*
|
|
||||||
[header] [From] => test@test.com
|
|
||||||
[to] => test@test.com
|
|
||||||
[subject] => SUBJECT
|
|
||||||
[body] => BODY
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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';
|
||||||
|
|||||||
@@ -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>';
|
||||||
|
|||||||
86
www/admin/class_test.strings.php
Normal file
86
www/admin/class_test.strings.php
Normal 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__
|
||||||
@@ -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' => '',
|
||||||
|
|||||||
@@ -252,7 +252,7 @@ if ($is_secure) {
|
|||||||
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
|
||||||
|
|||||||
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
/********************************************************************
|
/********************************************************************
|
||||||
* AUTHOR: Clemens Schwaighofer
|
* AUTHOR: Clemens Schwaighofer
|
||||||
* CREATED: 2008/08/14
|
* CREATED:
|
||||||
* SHORT DESCRIPTION:
|
* SHORT DESCRIPTION:
|
||||||
* URL redirect header
|
*
|
||||||
* HISTORY:
|
* HISTORY:
|
||||||
*********************************************************************/
|
*********************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,9 @@
|
|||||||
|
|
||||||
/********************************************************************
|
/********************************************************************
|
||||||
* AUTHOR: Clemens Schwaighofer
|
* AUTHOR: Clemens Schwaighofer
|
||||||
* CREATED: 2008/08/01
|
* CREATED:
|
||||||
* SHORT DESCRIPTION:
|
* SHORT DESCRIPTION:
|
||||||
|
*
|
||||||
* HISTORY:
|
* HISTORY:
|
||||||
*********************************************************************/
|
*********************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -1287,6 +1287,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 +1330,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="en">
|
||||||
<head>
|
<head>
|
||||||
<title>{HTML_TITLE}</title>
|
<title>{HTML_TITLE}</title>
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
@@ -1485,7 +1488,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>';
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* html convert functions
|
* array search and transform functions
|
||||||
*/
|
*/
|
||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|||||||
@@ -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
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
123
www/lib/CoreLibs/Convert/Strings.php
Normal file
123
www/lib/CoreLibs/Convert/Strings.php
Normal 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__
|
||||||
@@ -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,12 +36,14 @@ 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)) {
|
||||||
// if encoding is not UTF-8 then we convert
|
// if encoding is not UTF-8 then we convert
|
||||||
@@ -36,11 +52,13 @@ class Email
|
|||||||
}
|
}
|
||||||
$email_name =
|
$email_name =
|
||||||
mb_encode_mimeheader(
|
mb_encode_mimeheader(
|
||||||
mb_convert_kana(
|
in_array($encoding, self::$encoding_kv_allowed) && $kv_folding ?
|
||||||
|
mb_convert_kana(
|
||||||
|
$email_name,
|
||||||
|
self::$mb_convert_kana_mode,
|
||||||
|
$encoding
|
||||||
|
) :
|
||||||
$email_name,
|
$email_name,
|
||||||
'KV',
|
|
||||||
$encoding
|
|
||||||
),
|
|
||||||
$encoding
|
$encoding
|
||||||
);
|
);
|
||||||
return '"' . $email_name . '" '
|
return '"' . $email_name . '" '
|
||||||
@@ -53,17 +71,20 @@ class Email
|
|||||||
/**
|
/**
|
||||||
* Subject/Body replace sub function
|
* Subject/Body replace sub function
|
||||||
*
|
*
|
||||||
* @param string $subject Subject string, in UTF-8
|
* @param string $subject Subject string, in UTF-8
|
||||||
* @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
|
||||||
* @return array<string> Pos 0: Subject, Pos 1: Body
|
* @param bool $kv_folding If set to true and a valid encoding,
|
||||||
|
* do KV folding
|
||||||
|
* @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 +104,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 +135,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 +145,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 +155,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 +171,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 +188,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
|
||||||
@@ -178,21 +220,20 @@ class Email
|
|||||||
// only if there is no dedicated to replace
|
// only if there is no dedicated to replace
|
||||||
// also run replace if there is nothing to replace at all
|
// also run replace if there is nothing to replace at all
|
||||||
// this will mime encode the subject
|
// this will mime encode the subject
|
||||||
if (
|
if (!count($to_replace)) {
|
||||||
!count($to_replace) &&
|
|
||||||
count($replace_content) || !count($replace_content)
|
|
||||||
) {
|
|
||||||
list($out_subject, $out_body) = self::replaceContent(
|
list($out_subject, $out_body) = self::replaceContent(
|
||||||
$subject,
|
$subject,
|
||||||
$body,
|
$body,
|
||||||
$replace_content,
|
$replace_content,
|
||||||
$encoding
|
$encoding,
|
||||||
|
$kv_folding
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
$mail_delivery_status = 1;
|
$mail_delivery_status = 1;
|
||||||
// send the email
|
// send the email
|
||||||
foreach ($to_emails as $to_email) {
|
foreach ($to_emails as $to_email) {
|
||||||
|
// default mail status is success
|
||||||
$mail_status = true;
|
$mail_status = true;
|
||||||
// if there is a to replace, if not use the original replace content
|
// if there is a to replace, if not use the original replace content
|
||||||
if (count($to_replace)) {
|
if (count($to_replace)) {
|
||||||
@@ -207,33 +248,39 @@ class Email
|
|||||||
$subject,
|
$subject,
|
||||||
$body,
|
$body,
|
||||||
$_replace,
|
$_replace,
|
||||||
$encoding
|
$encoding,
|
||||||
|
$kv_folding
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// if we are in test mode, do not send an email and set status to 2
|
||||||
if ($test === false) {
|
if ($test === false) {
|
||||||
$mail_status = mail($to_email, $out_subject, $out_body, $headers);
|
$mail_status = mail($to_email, $out_subject, $out_body, $headers);
|
||||||
} else {
|
} else {
|
||||||
if ($log instanceof \CoreLibs\Debug\Logging) {
|
|
||||||
// build debug strings: convert to UTF-8 if not utf-8
|
|
||||||
$log->debug('SEND EMAIL', 'HEADERS: ' . $log->prAr($headers) . ', '
|
|
||||||
. 'TO: ' . $to_email . ', '
|
|
||||||
. 'SUBJECT: ' . $out_subject . ', '
|
|
||||||
. 'BODY: ' . ($encoding == 'UTF-8' ?
|
|
||||||
$out_body :
|
|
||||||
mb_convert_encoding($out_body, 'UTF-8', $encoding)));
|
|
||||||
$log->debug('SEND EMAIL JSON', json_encode([
|
|
||||||
'encoding' => $encoding,
|
|
||||||
'header' => $headers,
|
|
||||||
'to' => $to_email,
|
|
||||||
'subject' => $out_subject,
|
|
||||||
'body' => ($encoding == 'UTF-8' ?
|
|
||||||
$out_body :
|
|
||||||
mb_convert_encoding($out_body, 'UTF-8', $encoding))
|
|
||||||
]) ?: '{}');
|
|
||||||
}
|
|
||||||
$mail_delivery_status = 2;
|
$mail_delivery_status = 2;
|
||||||
}
|
}
|
||||||
|
// log if an log instance exists
|
||||||
|
if ($log instanceof \CoreLibs\Debug\Logging) {
|
||||||
|
// build debug strings: convert to UTF-8 if not utf-8
|
||||||
|
$log->debug('SEND EMAIL', 'HEADERS: ' . $log->prAr($headers) . ', '
|
||||||
|
. 'ENCODING: ' . $encoding . ', '
|
||||||
|
. 'KV FOLDING: ' . $log->prBl($kv_folding) . ', '
|
||||||
|
. 'TO: ' . $to_email . ', '
|
||||||
|
. 'SUBJECT: ' . $out_subject . ', '
|
||||||
|
. 'BODY: ' . ($encoding == 'UTF-8' ?
|
||||||
|
$out_body :
|
||||||
|
mb_convert_encoding($out_body, 'UTF-8', $encoding)));
|
||||||
|
$log->debug('SEND EMAIL JSON', json_encode([
|
||||||
|
'encoding' => $encoding,
|
||||||
|
'kv_folding' => $kv_folding,
|
||||||
|
'header' => $headers,
|
||||||
|
'to' => $to_email,
|
||||||
|
'subject' => $out_subject,
|
||||||
|
'body' => ($encoding == 'UTF-8' ?
|
||||||
|
$out_body :
|
||||||
|
mb_convert_encoding($out_body, 'UTF-8', $encoding))
|
||||||
|
]) ?: '{}');
|
||||||
|
}
|
||||||
if (!$mail_status) {
|
if (!$mail_status) {
|
||||||
$mail_delivery_status = 0;
|
$mail_delivery_status = 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* html convert functions
|
* random key functions
|
||||||
*/
|
*/
|
||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|||||||
@@ -2963,7 +2963,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 +2978,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;
|
||||||
|
|||||||
1
www/vendor/composer/autoload_classmap.php
vendored
1
www/vendor/composer/autoload_classmap.php
vendored
@@ -27,6 +27,7 @@ return array(
|
|||||||
'CoreLibs\\Convert\\Math' => $baseDir . '/lib/CoreLibs/Convert/Math.php',
|
'CoreLibs\\Convert\\Math' => $baseDir . '/lib/CoreLibs/Convert/Math.php',
|
||||||
'CoreLibs\\Convert\\MimeAppName' => $baseDir . '/lib/CoreLibs/Convert/MimeAppName.php',
|
'CoreLibs\\Convert\\MimeAppName' => $baseDir . '/lib/CoreLibs/Convert/MimeAppName.php',
|
||||||
'CoreLibs\\Convert\\MimeEncode' => $baseDir . '/lib/CoreLibs/Convert/MimeEncode.php',
|
'CoreLibs\\Convert\\MimeEncode' => $baseDir . '/lib/CoreLibs/Convert/MimeEncode.php',
|
||||||
|
'CoreLibs\\Convert\\Strings' => $baseDir . '/lib/CoreLibs/Convert/Strings.php',
|
||||||
'CoreLibs\\Create\\Email' => $baseDir . '/lib/CoreLibs/Create/Email.php',
|
'CoreLibs\\Create\\Email' => $baseDir . '/lib/CoreLibs/Create/Email.php',
|
||||||
'CoreLibs\\Create\\Hash' => $baseDir . '/lib/CoreLibs/Create/Hash.php',
|
'CoreLibs\\Create\\Hash' => $baseDir . '/lib/CoreLibs/Create/Hash.php',
|
||||||
'CoreLibs\\Create\\RandomKey' => $baseDir . '/lib/CoreLibs/Create/RandomKey.php',
|
'CoreLibs\\Create\\RandomKey' => $baseDir . '/lib/CoreLibs/Create/RandomKey.php',
|
||||||
|
|||||||
1
www/vendor/composer/autoload_static.php
vendored
1
www/vendor/composer/autoload_static.php
vendored
@@ -92,6 +92,7 @@ class ComposerStaticInit10fe8fe2ec4017b8644d2b64bcf398b9
|
|||||||
'CoreLibs\\Convert\\Math' => __DIR__ . '/../..' . '/lib/CoreLibs/Convert/Math.php',
|
'CoreLibs\\Convert\\Math' => __DIR__ . '/../..' . '/lib/CoreLibs/Convert/Math.php',
|
||||||
'CoreLibs\\Convert\\MimeAppName' => __DIR__ . '/../..' . '/lib/CoreLibs/Convert/MimeAppName.php',
|
'CoreLibs\\Convert\\MimeAppName' => __DIR__ . '/../..' . '/lib/CoreLibs/Convert/MimeAppName.php',
|
||||||
'CoreLibs\\Convert\\MimeEncode' => __DIR__ . '/../..' . '/lib/CoreLibs/Convert/MimeEncode.php',
|
'CoreLibs\\Convert\\MimeEncode' => __DIR__ . '/../..' . '/lib/CoreLibs/Convert/MimeEncode.php',
|
||||||
|
'CoreLibs\\Convert\\Strings' => __DIR__ . '/../..' . '/lib/CoreLibs/Convert/Strings.php',
|
||||||
'CoreLibs\\Create\\Email' => __DIR__ . '/../..' . '/lib/CoreLibs/Create/Email.php',
|
'CoreLibs\\Create\\Email' => __DIR__ . '/../..' . '/lib/CoreLibs/Create/Email.php',
|
||||||
'CoreLibs\\Create\\Hash' => __DIR__ . '/../..' . '/lib/CoreLibs/Create/Hash.php',
|
'CoreLibs\\Create\\Hash' => __DIR__ . '/../..' . '/lib/CoreLibs/Create/Hash.php',
|
||||||
'CoreLibs\\Create\\RandomKey' => __DIR__ . '/../..' . '/lib/CoreLibs/Create/RandomKey.php',
|
'CoreLibs\\Create\\RandomKey' => __DIR__ . '/../..' . '/lib/CoreLibs/Create/RandomKey.php',
|
||||||
|
|||||||
Reference in New Issue
Block a user