Compare commits
65
Commits
No files matched your search
@@ -0,0 +1,3 @@
|
|||||||
|
composer.lock
|
||||||
|
vendor/
|
||||||
|
.env
|
||||||
@@ -1,11 +1,9 @@
|
|||||||
#!/bin/env bash
|
|
||||||
|
|
||||||
base="/storage/var/www/html/developers/clemens/core_data/php_libraries/trunk/";
|
base="/storage/var/www/html/developers/clemens/core_data/php_libraries/trunk/";
|
||||||
# -c phpunit.xml
|
# -c phpunit.xml
|
||||||
# --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 php version number 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
|
||||||
|
|||||||
File diff suppressed because it is too large.
Load diff
File renamed without changes.
File renamed without changes.
File diff suppressed because it is too large.
Load diff
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -0,0 +1,256 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Run is_<type> checks and return default value if not this type
|
||||||
|
* This will return default null on invalid entries
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace CoreLibs\Convert\Extends;
|
||||||
|
|
||||||
|
class VarSetTypeMain
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* If input variable is string then returns it, else returns default set
|
||||||
|
* if not null is true, then null as return is allowed, else return is
|
||||||
|
* converted to string
|
||||||
|
*
|
||||||
|
* @param mixed $val Input variable
|
||||||
|
* @param string|null $default Default value
|
||||||
|
* @param bool $to_null Convert to null (default no)
|
||||||
|
* @return string|null Input var or default value
|
||||||
|
*/
|
||||||
|
protected static function setStrMain(
|
||||||
|
mixed $val,
|
||||||
|
?string $default = null,
|
||||||
|
bool $to_null = false
|
||||||
|
): ?string {
|
||||||
|
if (is_string($val)) {
|
||||||
|
return $val;
|
||||||
|
}
|
||||||
|
if ($to_null === false) {
|
||||||
|
return (string)$default;
|
||||||
|
}
|
||||||
|
return $default;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Will convert input data to string if possible.
|
||||||
|
* Runs for string/int/float/bool/null
|
||||||
|
* Will skip array/object/resource/callable/etc and use default for that
|
||||||
|
*
|
||||||
|
* @param mixed $val Input variable
|
||||||
|
* @param string|null $default Default value
|
||||||
|
* @param bool $to_null Convert to null (default no)
|
||||||
|
* @return string|null Converted input data to string/null
|
||||||
|
*/
|
||||||
|
protected static function makeStrMain(
|
||||||
|
mixed $val,
|
||||||
|
string $default = null,
|
||||||
|
bool $to_null = false
|
||||||
|
): ?string {
|
||||||
|
// int/float/string/bool/null, everything else is ignored
|
||||||
|
// no: array/object/resource/callable
|
||||||
|
if (
|
||||||
|
is_int($val) ||
|
||||||
|
is_float($val) ||
|
||||||
|
is_string($val) ||
|
||||||
|
is_bool($val) ||
|
||||||
|
is_null($val)
|
||||||
|
) {
|
||||||
|
return (string)$val;
|
||||||
|
}
|
||||||
|
if ($to_null === false) {
|
||||||
|
return (string)$default;
|
||||||
|
}
|
||||||
|
return $default;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If input variable is int, return it, else return default value. If to_null
|
||||||
|
* is true then null as return is allowed, else only int is returned
|
||||||
|
*
|
||||||
|
* @param mixed $val Input variable
|
||||||
|
* @param int|null $default Default value
|
||||||
|
* @param bool $to_null Convert to null (default no)
|
||||||
|
* @return int|null Input var or default value
|
||||||
|
*/
|
||||||
|
protected static function setIntMain(
|
||||||
|
mixed $val,
|
||||||
|
?int $default = null,
|
||||||
|
bool $to_null = false
|
||||||
|
): ?int {
|
||||||
|
if (is_int($val)) {
|
||||||
|
return $val;
|
||||||
|
}
|
||||||
|
if ($to_null === false) {
|
||||||
|
return (int)$default;
|
||||||
|
}
|
||||||
|
return $default;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert input to int via filter_var. If not convertable return default value.
|
||||||
|
* If to_null is set to true null return is allowed
|
||||||
|
* NOTE: this is only a drastic fallback and not recommned for special use.
|
||||||
|
* It will try to check via filter_var if we can get an int value and then use
|
||||||
|
* intval to convert it.
|
||||||
|
* Reason is that filter_var will convert eg 1.5 to 15 instead 1
|
||||||
|
* One is very wrong, the other is at least better, but not perfect
|
||||||
|
*
|
||||||
|
* @param mixed $val Input variable
|
||||||
|
* @param int|null $default Default value
|
||||||
|
* @param bool $to_null Convert to null (default no)
|
||||||
|
* @return int|null Converted input data to int/null
|
||||||
|
*/
|
||||||
|
protected static function makeIntMain(
|
||||||
|
mixed $val,
|
||||||
|
int $default = null,
|
||||||
|
bool $to_null = false
|
||||||
|
): ?int {
|
||||||
|
// if we can filter it to a valid int, we can convert it
|
||||||
|
// we so avoid object, array, etc
|
||||||
|
if (
|
||||||
|
filter_var(
|
||||||
|
$val,
|
||||||
|
FILTER_SANITIZE_NUMBER_INT
|
||||||
|
) !== false
|
||||||
|
) {
|
||||||
|
return intval($val);
|
||||||
|
}
|
||||||
|
if ($to_null === false) {
|
||||||
|
return (int)$default;
|
||||||
|
}
|
||||||
|
return $default;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If input is float return it, else set to default value. If to_null is set
|
||||||
|
* to true, allow null return
|
||||||
|
*
|
||||||
|
* @param mixed $val Input variable
|
||||||
|
* @param float|null $default Default value
|
||||||
|
* @param bool $to_null Convert to null (default no)
|
||||||
|
* @return float|null Input var or default value
|
||||||
|
*/
|
||||||
|
protected static function setFloatMain(
|
||||||
|
mixed $val,
|
||||||
|
?float $default = null,
|
||||||
|
bool $to_null = false
|
||||||
|
): ?float {
|
||||||
|
if (is_float($val)) {
|
||||||
|
return $val;
|
||||||
|
}
|
||||||
|
if ($to_null === false) {
|
||||||
|
return (float)$default;
|
||||||
|
}
|
||||||
|
return $default;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert intput var to float via filter_var. If failed to so return default.
|
||||||
|
* If to_null is set to true allow null return
|
||||||
|
*
|
||||||
|
* @param mixed $val Input variable
|
||||||
|
* @param float|null $default Default value
|
||||||
|
* @param bool $to_null Convert to null (default no)
|
||||||
|
* @return float|null Converted intput data to float/null
|
||||||
|
*/
|
||||||
|
protected static function makeFloatMain(
|
||||||
|
mixed $val,
|
||||||
|
float $default = null,
|
||||||
|
bool $to_null = false
|
||||||
|
): ?float {
|
||||||
|
if (
|
||||||
|
(
|
||||||
|
$val = filter_var(
|
||||||
|
$val,
|
||||||
|
FILTER_SANITIZE_NUMBER_FLOAT,
|
||||||
|
FILTER_FLAG_ALLOW_FRACTION
|
||||||
|
)
|
||||||
|
) !== false
|
||||||
|
) {
|
||||||
|
return (float)$val;
|
||||||
|
}
|
||||||
|
if ($to_null === false) {
|
||||||
|
return (float)$default;
|
||||||
|
}
|
||||||
|
return $default;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If input var is array return it, else return default value. If to_null is
|
||||||
|
* set to true, allow null return
|
||||||
|
*
|
||||||
|
* @param mixed $val Input variable
|
||||||
|
* @param array<mixed>|null $default Default value
|
||||||
|
* @param bool $to_null Convert to null (default no)
|
||||||
|
* @return array<mixed>|null Input var or default value
|
||||||
|
*/
|
||||||
|
protected static function setArrayMain(
|
||||||
|
mixed $val,
|
||||||
|
?array $default = null,
|
||||||
|
bool $to_null = false
|
||||||
|
): ?array {
|
||||||
|
if (is_array($val)) {
|
||||||
|
return $val;
|
||||||
|
}
|
||||||
|
if ($to_null === false) {
|
||||||
|
return (array)$default;
|
||||||
|
}
|
||||||
|
return $default;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If input var is bool return it, else return default value. If to_null is
|
||||||
|
* set to true will allow null return.
|
||||||
|
*
|
||||||
|
* @param mixed $val Input variable
|
||||||
|
* @param bool|null $default Default value
|
||||||
|
* @param bool $to_null Convert to null (default no)
|
||||||
|
* @return bool|null Input var or default value
|
||||||
|
*/
|
||||||
|
protected static function setBoolMain(
|
||||||
|
mixed $val,
|
||||||
|
?bool $default = null,
|
||||||
|
bool $to_null = false
|
||||||
|
): ?bool {
|
||||||
|
if (is_bool($val)) {
|
||||||
|
return $val;
|
||||||
|
}
|
||||||
|
if ($to_null === false) {
|
||||||
|
return (bool)$default;
|
||||||
|
}
|
||||||
|
return $default;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert anything to bool. If it is a string it will try to use the filter_var
|
||||||
|
* to convert know true/false strings.
|
||||||
|
* Else it uses (bool) to convert the rest
|
||||||
|
* If null is allowed, will return null
|
||||||
|
*
|
||||||
|
* @param mixed $val Input variable
|
||||||
|
* @param bool $default Default value if to_null if false
|
||||||
|
* @param bool $to_null Convert to null (default no)
|
||||||
|
* @return bool|null Converted input data to bool/ null
|
||||||
|
*/
|
||||||
|
protected static function makeBoolMain(
|
||||||
|
mixed $val,
|
||||||
|
bool $default = false,
|
||||||
|
bool $to_null = false
|
||||||
|
): ?bool {
|
||||||
|
$boolvar = is_string($val) ?
|
||||||
|
filter_var(
|
||||||
|
$val,
|
||||||
|
FILTER_VALIDATE_BOOLEAN,
|
||||||
|
FILTER_NULL_ON_FAILURE
|
||||||
|
) :
|
||||||
|
(bool)$val;
|
||||||
|
return $boolvar === null && !$to_null ? $default : $boolvar;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -0,0 +1,136 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Run is_<type> checks and return default value if not this type
|
||||||
|
* This will return a default value as always what is expected and never null
|
||||||
|
* Use this for santize output from multi return functions where we know what
|
||||||
|
* will come back
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace CoreLibs\Convert;
|
||||||
|
|
||||||
|
use CoreLibs\Convert\Extends\VarSetTypeMain;
|
||||||
|
|
||||||
|
class VarSetType extends Extends\VarSetTypeMain
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Check is input is string, if not return default string.
|
||||||
|
* Will always return string
|
||||||
|
*
|
||||||
|
* @param mixed $val Input value
|
||||||
|
* @param string $default Default override value
|
||||||
|
* @return string Input value or default as string
|
||||||
|
*/
|
||||||
|
public static function setStr(mixed $val, string $default = ''): string
|
||||||
|
{
|
||||||
|
return (string)VarSetTypeMain::setStrMain($val, $default, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert input to string if possible.
|
||||||
|
* Will only work on string/int/float/bool/null types
|
||||||
|
* Will always return string
|
||||||
|
*
|
||||||
|
* @param mixed $val Input value
|
||||||
|
* @param string $default Default override value
|
||||||
|
* @return string Input value as string or default as string
|
||||||
|
*/
|
||||||
|
public static function makeStr(mixed $val, string $default = ''): string
|
||||||
|
{
|
||||||
|
return (string)VarSetTypeMain::makeStrMain($val, $default, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if input is int, if not return default int value 0.
|
||||||
|
* Will always return int.
|
||||||
|
*
|
||||||
|
* @param mixed $val Input value
|
||||||
|
* @param int $default Default override value
|
||||||
|
* @return int Input value or default as int
|
||||||
|
*/
|
||||||
|
public static function setInt(mixed $val, int $default = 0): int
|
||||||
|
{
|
||||||
|
return (int)VarSetTypeMain::setIntMain($val, $default, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert intput to int if possible, if not return default value 0.
|
||||||
|
* Will always return int.
|
||||||
|
*
|
||||||
|
* @param mixed $val Input value
|
||||||
|
* @param int $default Default override value
|
||||||
|
* @return int Input value as int or default as int
|
||||||
|
*/
|
||||||
|
public static function makeInt(mixed $val, int $default = 0): int
|
||||||
|
{
|
||||||
|
return (int)VarSetTypeMain::makeIntMain($val, $default, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if input is float, if not return default value value 0.0.
|
||||||
|
* Will always return float
|
||||||
|
*
|
||||||
|
* @param mixed $val Input value
|
||||||
|
* @param float $default Default override value
|
||||||
|
* @return float Input value or default as float
|
||||||
|
*/
|
||||||
|
public static function setFloat(mixed $val, float $default = 0.0): float
|
||||||
|
{
|
||||||
|
return (float)VarSetTypeMain::setFloatMain($val, $default, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert input to float, if not possible return default value 0.0.
|
||||||
|
* Will always return float
|
||||||
|
*
|
||||||
|
* @param mixed $val Input value
|
||||||
|
* @param float $default Default override value
|
||||||
|
* @return float Input value as float or default as float
|
||||||
|
*/
|
||||||
|
public static function makeFloat(mixed $val, float $default = 0.0): float
|
||||||
|
{
|
||||||
|
return (float)VarSetTypeMain::makeFloatMain($val, $default, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if input is array, if not return default empty array.
|
||||||
|
* Will always return array.
|
||||||
|
*
|
||||||
|
* @param mixed $val Input value
|
||||||
|
* @param array<mixed> $default Default override value
|
||||||
|
* @return array<mixed> Input value or default as array
|
||||||
|
*/
|
||||||
|
public static function setArray(mixed $val, array $default = []): array
|
||||||
|
{
|
||||||
|
return (array)VarSetTypeMain::setArrayMain($val, $default, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if input is bool, if not will return default value false.
|
||||||
|
* Will aways return bool.
|
||||||
|
*
|
||||||
|
* @param mixed $val Input value
|
||||||
|
* @param bool $default Default override value
|
||||||
|
* @return bool Input value or default as bool
|
||||||
|
*/
|
||||||
|
public static function setBool(mixed $val, bool $default = false): bool
|
||||||
|
{
|
||||||
|
return (bool)VarSetTypeMain::setBoolMain($val, $default, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert anything to bool
|
||||||
|
*
|
||||||
|
* @param mixed $val Input value
|
||||||
|
* @param bool $default Default override value
|
||||||
|
* @return bool Input value as bool or default as bool
|
||||||
|
*/
|
||||||
|
public static function makeBool(mixed $val, bool $default = false): bool
|
||||||
|
{
|
||||||
|
return (bool)VarSetTypeMain::makeBoolMain($val, $default, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -0,0 +1,130 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Run is_<type> checks and return default value if not this type
|
||||||
|
* This will return default null on invalid entries
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace CoreLibs\Convert;
|
||||||
|
|
||||||
|
use CoreLibs\Convert\Extends\VarSetTypeMain;
|
||||||
|
|
||||||
|
class VarSetTypeNull extends Extends\VarSetTypeMain
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Check is input is string, if not return default string.
|
||||||
|
* Will return null if no string as default.
|
||||||
|
*
|
||||||
|
* @param mixed $val Input value
|
||||||
|
* @param string|null $default Default override value
|
||||||
|
* @return string|null Input value or default as string/null
|
||||||
|
*/
|
||||||
|
public static function setStr(mixed $val, ?string $default = null): ?string
|
||||||
|
{
|
||||||
|
return VarSetTypeMain::setStrMain($val, $default, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert input to string if possible.
|
||||||
|
* Will only work on string/int/float/bool/null types.
|
||||||
|
* Will return null if convert failed as default.
|
||||||
|
*
|
||||||
|
* @param mixed $val Input value
|
||||||
|
* @param string|null $default Default override value
|
||||||
|
* @return string|null Input value as string or default as string/null
|
||||||
|
*/
|
||||||
|
public static function makeStr(mixed $val, string $default = null): ?string
|
||||||
|
{
|
||||||
|
return VarSetTypeMain::makeStrMain($val, $default, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if input is int, if not return default value null.
|
||||||
|
*
|
||||||
|
* @param mixed $val Input value
|
||||||
|
* @param int|null $default Default override value
|
||||||
|
* @return int|null Input value or default as int/null
|
||||||
|
*/
|
||||||
|
public static function setInt(mixed $val, ?int $default = null): ?int
|
||||||
|
{
|
||||||
|
return VarSetTypeMain::setIntMain($val, $default, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert intput to int if possible, if not return default value value null.
|
||||||
|
*
|
||||||
|
* @param mixed $val Input value $val
|
||||||
|
* @param int|null $default Default override value
|
||||||
|
* @return int|null Input value as int or default as int/null
|
||||||
|
*/
|
||||||
|
public static function makeInt(mixed $val, int $default = null): ?int
|
||||||
|
{
|
||||||
|
return VarSetTypeMain::makeIntMain($val, $default, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if input is float, if not return default value value null.
|
||||||
|
*
|
||||||
|
* @param mixed $val Input value $val
|
||||||
|
* @param float|null $default Default override value
|
||||||
|
* @return float|null Input value or default as float/null
|
||||||
|
*/
|
||||||
|
public static function setFloat(mixed $val, ?float $default = null): ?float
|
||||||
|
{
|
||||||
|
return VarSetTypeMain::setFloatMain($val, $default, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert input to float, if not possible return default value null.
|
||||||
|
*
|
||||||
|
* @param mixed $val Input value $val
|
||||||
|
* @param float|null $default Default override value
|
||||||
|
* @return float|null Input value as float or default as float/null
|
||||||
|
*/
|
||||||
|
public static function makeFloat(mixed $val, float $default = null): ?float
|
||||||
|
{
|
||||||
|
return VarSetTypeMain::makeFloatMain($val, $default, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if input is array, if not return default value null.
|
||||||
|
*
|
||||||
|
* @param mixed $val Input value $val
|
||||||
|
* @param array<mixed>|null $default Default override value
|
||||||
|
* @return array<mixed>|null Input value or default as array/null
|
||||||
|
*/
|
||||||
|
public static function setArray(mixed $val, ?array $default = null): ?array
|
||||||
|
{
|
||||||
|
return VarSetTypeMain::setArrayMain($val, $default, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if input is bool, if not will return default value null.
|
||||||
|
*
|
||||||
|
* @param mixed $val Input value $val
|
||||||
|
* @param bool|null $default Default override value
|
||||||
|
* @return bool|null Input value or default as bool/null
|
||||||
|
*/
|
||||||
|
public static function setBool(mixed $val, ?bool $default = null): ?bool
|
||||||
|
{
|
||||||
|
return VarSetTypeMain::setBoolMain($val, $default, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert anything to bool
|
||||||
|
*
|
||||||
|
* @param mixed $val Input value $val
|
||||||
|
* @return bool|null Input value as bool or default as bool/null
|
||||||
|
*/
|
||||||
|
public static function makeBool(mixed $val): ?bool
|
||||||
|
{
|
||||||
|
// note that the default value here is irrelevant, we return null
|
||||||
|
// on unsetable string var
|
||||||
|
return VarSetTypeMain::makeBoolMain($val, false, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -0,0 +1,371 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* AUTHOR: Clemens Schwaighofer
|
||||||
|
* DESCRIPTION:
|
||||||
|
* start a php sesseion
|
||||||
|
* name can be given via startSession parameter
|
||||||
|
* if not set tries to read $SET_SESSION_NAME from global
|
||||||
|
* else will use default set in php.ini
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace CoreLibs\Create;
|
||||||
|
|
||||||
|
class Session
|
||||||
|
{
|
||||||
|
/** @var string list for errors */
|
||||||
|
private $session_intern_error_str = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start session
|
||||||
|
* startSession should be called for complete check
|
||||||
|
* If this is called without any name set before the php.ini name is
|
||||||
|
* used.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function startSessionCall(): void
|
||||||
|
{
|
||||||
|
session_start();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* init a session, if array is empty or array does not have session_name set
|
||||||
|
* then no auto init is run
|
||||||
|
*
|
||||||
|
* @param string $session_name if set and not empty, will start session
|
||||||
|
*/
|
||||||
|
public function __construct(string $session_name = '')
|
||||||
|
{
|
||||||
|
if (!empty($session_name)) {
|
||||||
|
$this->startSession($session_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* check if we are in CLI, we set this, so we can mock this
|
||||||
|
* Not this is just a wrapper for the static System::checkCLI call
|
||||||
|
*
|
||||||
|
* @return bool True if we are in a CLI enviroment, or false for everything else
|
||||||
|
*/
|
||||||
|
public function checkCliStatus(): bool
|
||||||
|
{
|
||||||
|
return \CoreLibs\Get\System::checkCLI();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set session name call. If not valid session name, will return false
|
||||||
|
*
|
||||||
|
* @param string $session_name A valid string for session name
|
||||||
|
* @return bool True if session name is valid,
|
||||||
|
* False if not
|
||||||
|
*/
|
||||||
|
public function setSessionName(string $session_name): bool
|
||||||
|
{
|
||||||
|
if (!$this->checkValidSessionName($session_name)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
session_name($session_name);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return set error string, empty if none set
|
||||||
|
* Error strings are only set in the startSession method
|
||||||
|
*
|
||||||
|
* @return string Last error string
|
||||||
|
*/
|
||||||
|
public function getErrorStr(): string
|
||||||
|
{
|
||||||
|
return $this->session_intern_error_str;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* check if session name is valid
|
||||||
|
*
|
||||||
|
* As from PHP 8.1/8.0/7.4 error
|
||||||
|
* INVALID CHARS: =,; \t\r\n\013\014
|
||||||
|
* NOTE: using . will fail even thought valid
|
||||||
|
* we allow only alphanumeric with - (dash) and 1 to 128 characters
|
||||||
|
*
|
||||||
|
* @param string $session_name any string, not null
|
||||||
|
* @return bool True for valid, False for invalid
|
||||||
|
*/
|
||||||
|
public static function checkValidSessionName(string $session_name): bool
|
||||||
|
{
|
||||||
|
// check
|
||||||
|
if (
|
||||||
|
// must only have those
|
||||||
|
!preg_match('/^[-a-zA-Z0-9]{1,128}$/', $session_name) ||
|
||||||
|
// cannot be only numbers
|
||||||
|
preg_match('/^[0-9]+$/', $session_name)
|
||||||
|
) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* start session with given session name if set
|
||||||
|
* aborts on command line or if sessions are not enabled
|
||||||
|
* also aborts if session cannot be started
|
||||||
|
* On sucess returns the session id
|
||||||
|
*
|
||||||
|
* @param string|null $session_name
|
||||||
|
* @return string|bool
|
||||||
|
*/
|
||||||
|
public function startSession(?string $session_name = null)
|
||||||
|
{
|
||||||
|
// we can't start sessions on command line
|
||||||
|
if ($this->checkCliStatus()) {
|
||||||
|
$this->session_intern_error_str = '[SESSION] No sessions in php cli';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// if session are OFF
|
||||||
|
if ($this->getSessionStatus() === PHP_SESSION_DISABLED) {
|
||||||
|
$this->session_intern_error_str = '[SESSION] Sessions are disabled';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// session_status
|
||||||
|
// initial the session if there is no session running already
|
||||||
|
if (!$this->checkActiveSession()) {
|
||||||
|
// if session name is emtpy, check if there is a global set
|
||||||
|
// this is a deprecated fallback
|
||||||
|
$session_name = $session_name ?? $GLOBALS['SET_SESSION_NAME'] ?? '';
|
||||||
|
// DEPRECTED: constant SET_SESSION_NAME is no longer used
|
||||||
|
// if set, set special session name
|
||||||
|
if (!empty($session_name)) {
|
||||||
|
// invalid session name, abort
|
||||||
|
if (!$this->checkValidSessionName($session_name)) {
|
||||||
|
$this->session_intern_error_str = '[SESSION] Invalid session name: ' . $session_name;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$this->setSessionName($session_name);
|
||||||
|
}
|
||||||
|
// start session
|
||||||
|
$this->startSessionCall();
|
||||||
|
}
|
||||||
|
// if we still have no active session
|
||||||
|
if (!$this->checkActiveSession()) {
|
||||||
|
$this->session_intern_error_str = '[SESSION] Failed to activate session';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (false === ($session_id = $this->getSessionId())) {
|
||||||
|
$this->session_intern_error_str = '[SESSION] getSessionId did not return a session id';
|
||||||
|
}
|
||||||
|
return $session_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get current set session id or false if none started
|
||||||
|
*
|
||||||
|
* @return string|bool
|
||||||
|
*/
|
||||||
|
public function getSessionId()
|
||||||
|
{
|
||||||
|
return session_id();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get set session name or false if none started
|
||||||
|
*
|
||||||
|
* @return string|bool
|
||||||
|
*/
|
||||||
|
public function getSessionName()
|
||||||
|
{
|
||||||
|
return session_name();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if there is an active session.
|
||||||
|
* Does not check if we can have a session
|
||||||
|
*
|
||||||
|
* @return bool True if there is an active session, else false
|
||||||
|
*/
|
||||||
|
public function checkActiveSession(): bool
|
||||||
|
{
|
||||||
|
if ($this->getSessionStatus() === PHP_SESSION_ACTIVE) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* unlock the session file, so concurrent AJAX requests can be done
|
||||||
|
* NOTE: after this has been called, no changes in _SESSION will be stored
|
||||||
|
* NOTE: a new session with a different name can be started after this one is called
|
||||||
|
* if problem, run ob_flush() and flush() too
|
||||||
|
*
|
||||||
|
* @return bool True und sucess, false on failure
|
||||||
|
*/
|
||||||
|
public function writeClose(): bool
|
||||||
|
{
|
||||||
|
return session_write_close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Proper destroy a session
|
||||||
|
* - unset the _SESSION array
|
||||||
|
* - unset cookie if cookie on and we have not strict mode
|
||||||
|
* - destroy session
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function sessionDestroy(): bool
|
||||||
|
{
|
||||||
|
$_SESSION = [];
|
||||||
|
if (
|
||||||
|
ini_get('session.use_cookies') &&
|
||||||
|
!ini_get('session.use_strict_mode')
|
||||||
|
) {
|
||||||
|
$session_name = $this->getSessionName();
|
||||||
|
if ($session_name === false) {
|
||||||
|
$session_name = '';
|
||||||
|
}
|
||||||
|
$params = session_get_cookie_params();
|
||||||
|
setcookie(
|
||||||
|
(string)$session_name,
|
||||||
|
'',
|
||||||
|
time() - 42000,
|
||||||
|
$params['path'],
|
||||||
|
$params['domain'],
|
||||||
|
$params['secure'],
|
||||||
|
$params['httponly']
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return session_destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get session status
|
||||||
|
* PHP_SESSION_DISABLED if sessions are disabled.
|
||||||
|
* PHP_SESSION_NONE if sessions are enabled, but none exists.
|
||||||
|
* PHP_SESSION_ACTIVE if sessions are enabled, and one exists.
|
||||||
|
*
|
||||||
|
* https://www.php.net/manual/en/function.session-status.php
|
||||||
|
*
|
||||||
|
* @return int See possible return int values above
|
||||||
|
*/
|
||||||
|
public function getSessionStatus(): int
|
||||||
|
{
|
||||||
|
return session_status();
|
||||||
|
}
|
||||||
|
|
||||||
|
// _SESSION set/unset methods
|
||||||
|
|
||||||
|
/**
|
||||||
|
* unset all _SESSION entries
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function unsetAllS(): void
|
||||||
|
{
|
||||||
|
foreach (array_keys($_SESSION ?? []) as $name) {
|
||||||
|
unset($_SESSION[$name]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set _SESSION entry 'name' with any value
|
||||||
|
*
|
||||||
|
* @param string|int $name array name in _SESSION
|
||||||
|
* @param mixed $value value to set (can be anything)
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function setS($name, $value): void
|
||||||
|
{
|
||||||
|
$_SESSION[$name] = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get _SESSION 'name' entry or empty string if not set
|
||||||
|
*
|
||||||
|
* @param string|int $name value key to get from _SESSION
|
||||||
|
* @return mixed value stored in _SESSION
|
||||||
|
*/
|
||||||
|
public function getS($name)
|
||||||
|
{
|
||||||
|
return $_SESSION[$name] ?? '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a name is set in the _SESSION array
|
||||||
|
*
|
||||||
|
* @param string|int $name Name to check for
|
||||||
|
* @return bool True for set, False fornot set
|
||||||
|
*/
|
||||||
|
public function issetS($name): bool
|
||||||
|
{
|
||||||
|
return isset($_SESSION[$name]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* unset one _SESSION entry 'name' if exists
|
||||||
|
*
|
||||||
|
* @param string|int $name _SESSION key name to remove
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function unsetS($name): void
|
||||||
|
{
|
||||||
|
if (isset($_SESSION[$name])) {
|
||||||
|
unset($_SESSION[$name]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// set/get below
|
||||||
|
// ->var = value;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @param string|int $name
|
||||||
|
* @param mixed $value
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __set($name, $value): void
|
||||||
|
{
|
||||||
|
$_SESSION[$name] = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @param string|int $name
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function __get($name)
|
||||||
|
{
|
||||||
|
if (isset($_SESSION[$name])) {
|
||||||
|
return $_SESSION[$name];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @param string|int $name
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function __isset($name): bool
|
||||||
|
{
|
||||||
|
return isset($_SESSION[$name]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @param string|int $name
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __unset($name): void
|
||||||
|
{
|
||||||
|
if (isset($_SESSION[$name])) {
|
||||||
|
unset($_SESSION[$name]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
File renamed without changes.
File renamed without changes.
File diff suppressed because it is too large.
Load diff
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -0,0 +1,140 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace CoreLibs\Output\Form\TableArrays;
|
||||||
|
|
||||||
|
class EditAccess implements \CoreLibs\Output\Form\TableArraysInterface
|
||||||
|
{
|
||||||
|
/** @var \CoreLibs\Output\Form\Generate */
|
||||||
|
private $form;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* constructor
|
||||||
|
* @param \CoreLibs\Output\Form\Generate $form base form class
|
||||||
|
*/
|
||||||
|
public function __construct(\CoreLibs\Output\Form\Generate $form)
|
||||||
|
{
|
||||||
|
$this->form = $form;
|
||||||
|
$this->form->log->debug('CLASS LOAD', __NAMESPACE__ . __CLASS__);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the table array
|
||||||
|
*
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function setTableArray(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'table_array' => [
|
||||||
|
'edit_access_id' => [
|
||||||
|
'value' => $_POST['edit_access_id'] ?? '',
|
||||||
|
'type' => 'hidden',
|
||||||
|
'pk' => 1
|
||||||
|
],
|
||||||
|
'name' => [
|
||||||
|
'value' => $_POST['name'] ?? '',
|
||||||
|
'output_name' => 'Access Group Name',
|
||||||
|
'mandatory' => 1,
|
||||||
|
'type' => 'text',
|
||||||
|
'error_check' => 'alphanumericspace|unique'
|
||||||
|
],
|
||||||
|
'description' => [
|
||||||
|
'value' => $_POST['description'] ?? '',
|
||||||
|
'output_name' => 'Description',
|
||||||
|
'type' => 'textarea'
|
||||||
|
],
|
||||||
|
'color' => [
|
||||||
|
'value' => $_POST['color'] ?? '',
|
||||||
|
'output_name' => 'Color',
|
||||||
|
'mandatory' => 0,
|
||||||
|
'type' => 'text',
|
||||||
|
'size' => 10,
|
||||||
|
'length' => 9,
|
||||||
|
'error_check' => 'custom',
|
||||||
|
// FIXME: update regex check for hex/rgb/hsl with color check class
|
||||||
|
'error_regex' => '/^#([\dA-Fa-f]{6}|[\dA-Fa-f]{8})$/',
|
||||||
|
'error_example' => '#F6A544'
|
||||||
|
],
|
||||||
|
'enabled' => [
|
||||||
|
'value' => $_POST['enabled'] ?? 0,
|
||||||
|
'output_name' => 'Enabled',
|
||||||
|
'type' => 'binary',
|
||||||
|
'int' => 1, // OR 'bool' => 1
|
||||||
|
'element_list' => [
|
||||||
|
'1' => 'Yes',
|
||||||
|
'0' => 'No'
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'protected' => [
|
||||||
|
'value' => $_POST['protected'] ?? 0,
|
||||||
|
'output_name' => 'Protected',
|
||||||
|
'type' => 'binary',
|
||||||
|
'int' => 1,
|
||||||
|
'element_list' => [
|
||||||
|
'1' => 'Yes',
|
||||||
|
'0' => 'No'
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'additional_acl' => [
|
||||||
|
'value' => $_POST['additional_acl'] ?? '',
|
||||||
|
'output_name' => 'Additional ACL (as JSON)',
|
||||||
|
'type' => 'textarea',
|
||||||
|
'error_check' => 'json',
|
||||||
|
'rows' => 10,
|
||||||
|
'cols' => 60
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'table_name' => 'edit_access',
|
||||||
|
"load_query" => "SELECT edit_access_id, name FROM edit_access ORDER BY name",
|
||||||
|
'show_fields' => [
|
||||||
|
[
|
||||||
|
'name' => 'name'
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'element_list' => [
|
||||||
|
'edit_access_data' => [
|
||||||
|
'output_name' => 'Edit Access Data',
|
||||||
|
'delete_name' => 'remove_edit_access_data',
|
||||||
|
// is not a sub table read and connect, but only a sub table with data
|
||||||
|
// 'type' => 'reference_data',
|
||||||
|
// maxium visible if no data is set, if filled add this number to visible
|
||||||
|
'max_empty' => 5,
|
||||||
|
'prefix' => 'ead',
|
||||||
|
'elements' => [
|
||||||
|
'name' => [
|
||||||
|
'type' => 'text',
|
||||||
|
'error_check' => 'alphanumeric|unique',
|
||||||
|
'output_name' => 'Name',
|
||||||
|
'mandatory' => 1
|
||||||
|
],
|
||||||
|
'value' => [
|
||||||
|
'type' => 'text',
|
||||||
|
'output_name' => 'Value'
|
||||||
|
],
|
||||||
|
'enabled' => [
|
||||||
|
'type' => 'checkbox',
|
||||||
|
'output_name' => 'Activate',
|
||||||
|
'int' => 1,
|
||||||
|
'element_list' => [1]
|
||||||
|
],
|
||||||
|
/*'edit_access_id' => [
|
||||||
|
'int' => 1,
|
||||||
|
'type' => 'hidden',
|
||||||
|
// reference main key from master table above
|
||||||
|
'fk_id' => 1
|
||||||
|
],*/
|
||||||
|
'edit_access_data_id' => [
|
||||||
|
'type' => 'hidden',
|
||||||
|
'int' => 1,
|
||||||
|
'pk_id' => 1
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -0,0 +1,137 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace CoreLibs\Output\Form\TableArrays;
|
||||||
|
|
||||||
|
class EditGroups implements \CoreLibs\Output\Form\TableArraysInterface
|
||||||
|
{
|
||||||
|
/** @var \CoreLibs\Output\Form\Generate */
|
||||||
|
private $form;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* constructor
|
||||||
|
* @param \CoreLibs\Output\Form\Generate $form base form class
|
||||||
|
*/
|
||||||
|
public function __construct(\CoreLibs\Output\Form\Generate $form)
|
||||||
|
{
|
||||||
|
$this->form = $form;
|
||||||
|
$this->form->log->debug('CLASS LOAD', __NAMESPACE__ . __CLASS__);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the table array
|
||||||
|
*
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function setTableArray(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'table_array' => [
|
||||||
|
'edit_group_id' => [
|
||||||
|
'value' => $_POST['edit_group_id'] ?? '',
|
||||||
|
'pk' => 1,
|
||||||
|
'type' => 'hidden'
|
||||||
|
],
|
||||||
|
'enabled' => [
|
||||||
|
'value' => $_POST['enabled'] ?? '',
|
||||||
|
'output_name' => 'Enabled',
|
||||||
|
'int' => 1,
|
||||||
|
'type' => 'binary',
|
||||||
|
'element_list' => [
|
||||||
|
'1' => 'Yes',
|
||||||
|
'0' => 'No'
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'name' => [
|
||||||
|
'value' => $_POST['name'] ?? '',
|
||||||
|
'output_name' => 'Group Name',
|
||||||
|
'type' => 'text',
|
||||||
|
'mandatory' => 1
|
||||||
|
],
|
||||||
|
'edit_access_right_id' => [
|
||||||
|
'value' => $_POST['edit_access_right_id'] ?? '',
|
||||||
|
'output_name' => 'Group Level',
|
||||||
|
'mandatory' => 1,
|
||||||
|
'int' => 1,
|
||||||
|
'type' => 'drop_down_db',
|
||||||
|
'query' => "SELECT edit_access_right_id, name FROM edit_access_right ORDER BY level"
|
||||||
|
],
|
||||||
|
'edit_scheme_id' => [
|
||||||
|
'value' => $_POST['edit_scheme_id'] ?? '',
|
||||||
|
'output_name' => 'Group Scheme',
|
||||||
|
'int_null' => 1,
|
||||||
|
'type' => 'drop_down_db',
|
||||||
|
'query' => "SELECT edit_scheme_id, name FROM edit_scheme WHERE enabled = 1 ORDER BY name"
|
||||||
|
],
|
||||||
|
'additional_acl' => [
|
||||||
|
'value' => $_POST['additional_acl'] ?? '',
|
||||||
|
'output_name' => 'Additional ACL (as JSON)',
|
||||||
|
'type' => 'textarea',
|
||||||
|
'error_check' => 'json',
|
||||||
|
'rows' => 10,
|
||||||
|
'cols' => 60
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'load_query' => "SELECT edit_group_id, name, enabled FROM edit_group ORDER BY name",
|
||||||
|
'table_name' => 'edit_group',
|
||||||
|
'show_fields' => [
|
||||||
|
[
|
||||||
|
'name' => 'name'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'enabled',
|
||||||
|
'binary' => ['Yes', 'No'],
|
||||||
|
'before_value' => 'Enabled: '
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'element_list' => [
|
||||||
|
'edit_page_access' => [
|
||||||
|
'output_name' => 'Pages',
|
||||||
|
'mandatory' => 1,
|
||||||
|
'delete' => 0, // set then reference entries are deleted, else the 'enable' flag is only set
|
||||||
|
'enable_name' => 'enable_page_access',
|
||||||
|
'prefix' => 'epa',
|
||||||
|
'read_data' => [
|
||||||
|
'table_name' => 'edit_page',
|
||||||
|
'pk_id' => 'edit_page_id',
|
||||||
|
'name' => 'name',
|
||||||
|
'order' => 'order_number'
|
||||||
|
],
|
||||||
|
'elements' => [
|
||||||
|
'edit_page_access_id' => [
|
||||||
|
'type' => 'hidden',
|
||||||
|
'int' => 1,
|
||||||
|
'pk_id' => 1
|
||||||
|
],
|
||||||
|
'enabled' => [
|
||||||
|
'type' => 'checkbox',
|
||||||
|
'output_name' => 'Activate',
|
||||||
|
'int' => 1,
|
||||||
|
'element_list' => [1],
|
||||||
|
],
|
||||||
|
'edit_access_right_id' => [
|
||||||
|
'type' => 'drop_down_db',
|
||||||
|
'output_name' => 'Access Level',
|
||||||
|
'int' => 1,
|
||||||
|
'preset' => 1, // first of the select
|
||||||
|
'query' => "SELECT edit_access_right_id, name FROM edit_access_right ORDER BY level"
|
||||||
|
],
|
||||||
|
'edit_page_id' => [
|
||||||
|
'int' => 1,
|
||||||
|
'type' => 'hidden'
|
||||||
|
],
|
||||||
|
/*,
|
||||||
|
'edit_default' => [
|
||||||
|
'output_name' => 'Default',
|
||||||
|
'type' => 'radio',
|
||||||
|
'mandatory' => 1
|
||||||
|
],*/
|
||||||
|
],
|
||||||
|
], // edit pages ggroup
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -0,0 +1,105 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace CoreLibs\Output\Form\TableArrays;
|
||||||
|
|
||||||
|
class EditLanguages implements \CoreLibs\Output\Form\TableArraysInterface
|
||||||
|
{
|
||||||
|
/** @var \CoreLibs\Output\Form\Generate */
|
||||||
|
private $form;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* constructor
|
||||||
|
* @param \CoreLibs\Output\Form\Generate $form base form class
|
||||||
|
*/
|
||||||
|
public function __construct(\CoreLibs\Output\Form\Generate $form)
|
||||||
|
{
|
||||||
|
$this->form = $form;
|
||||||
|
$this->form->log->debug('CLASS LOAD', __NAMESPACE__ . __CLASS__);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the table array
|
||||||
|
*
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function setTableArray(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'table_array' => [
|
||||||
|
'edit_language_id' => [
|
||||||
|
'value' => $_POST['edit_language_id'] ?? '',
|
||||||
|
'type' => 'hidden',
|
||||||
|
'pk' => 1
|
||||||
|
],
|
||||||
|
'short_name' => [
|
||||||
|
'value' => $_POST['short_name'] ?? '',
|
||||||
|
'output_name' => 'Language (short)',
|
||||||
|
'mandatory' => 1,
|
||||||
|
'type' => 'text',
|
||||||
|
'size' => 2,
|
||||||
|
'length' => 2
|
||||||
|
],
|
||||||
|
'long_name' => [
|
||||||
|
'value' => $_POST['long_name'] ?? '',
|
||||||
|
'output_name' => 'Language (long)',
|
||||||
|
'mandatory' => 1,
|
||||||
|
'type' => 'text',
|
||||||
|
'size' => 40
|
||||||
|
],
|
||||||
|
'iso_name' => [
|
||||||
|
'value' => $_POST['iso_name'] ?? '',
|
||||||
|
'output_name' => 'ISO Code',
|
||||||
|
'mandatory' => 1,
|
||||||
|
'type' => 'text'
|
||||||
|
],
|
||||||
|
'order_number' => [
|
||||||
|
'value' => $_POST['order_number'] ?? '',
|
||||||
|
'int' => 1,
|
||||||
|
'order' => 1
|
||||||
|
],
|
||||||
|
'enabled' => [
|
||||||
|
'value' => $_POST['enabled'] ?? '',
|
||||||
|
'output_name' => 'Enabled',
|
||||||
|
'int' => 1,
|
||||||
|
'type' => 'binary',
|
||||||
|
'element_list' => [
|
||||||
|
'1' => 'Yes',
|
||||||
|
'0' => 'No'
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'lang_default' => [
|
||||||
|
'value' => $_POST['lang_default'] ?? '',
|
||||||
|
'output_name' => 'Default Language',
|
||||||
|
'int' => 1,
|
||||||
|
'type' => 'binary',
|
||||||
|
'element_list' => [
|
||||||
|
'1' => 'Yes',
|
||||||
|
'0' => 'No'
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'load_query' => "SELECT edit_language_id, long_name, iso_name, enabled "
|
||||||
|
. "FROM edit_language "
|
||||||
|
. "ORDER BY long_name",
|
||||||
|
'show_fields' => [
|
||||||
|
[
|
||||||
|
'name' => 'long_name'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'iso_name',
|
||||||
|
'before_value' => 'ISO: '
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'enabled',
|
||||||
|
'before_value' => 'Enabled: ',
|
||||||
|
'binary' => ['Yes','No'],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'table_name' => 'edit_language'
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace CoreLibs\Output\Form\TableArrays;
|
||||||
|
|
||||||
|
class EditMenuGroup implements \CoreLibs\Output\Form\TableArraysInterface
|
||||||
|
{
|
||||||
|
/** @var \CoreLibs\Output\Form\Generate */
|
||||||
|
private $form;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* constructor
|
||||||
|
* @param \CoreLibs\Output\Form\Generate $form base form class
|
||||||
|
*/
|
||||||
|
public function __construct(\CoreLibs\Output\Form\Generate $form)
|
||||||
|
{
|
||||||
|
$this->form = $form;
|
||||||
|
$this->form->log->debug('CLASS LOAD', __NAMESPACE__ . __CLASS__);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the table array
|
||||||
|
*
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function setTableArray(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'table_array' => [
|
||||||
|
'edit_menu_group_id' => [
|
||||||
|
'value' => $_POST['edit_menu_group_id'] ?? '',
|
||||||
|
'type' => 'hidden',
|
||||||
|
'pk' => 1
|
||||||
|
],
|
||||||
|
'name' => [
|
||||||
|
'value' => $_POST['name'] ?? '',
|
||||||
|
'output_name' => 'Group name',
|
||||||
|
'mandatory' => 1,
|
||||||
|
'type' => 'text'
|
||||||
|
],
|
||||||
|
'flag' => [
|
||||||
|
'value' => $_POST['flag'] ?? '',
|
||||||
|
'output_name' => 'Flag',
|
||||||
|
'mandatory' => 1,
|
||||||
|
'type' => 'text',
|
||||||
|
'error_check' => 'alphanumeric|unique'
|
||||||
|
],
|
||||||
|
'order_number' => [
|
||||||
|
'value' => $_POST['order_number'] ?? '',
|
||||||
|
'output_name' => 'Group order',
|
||||||
|
'type' => 'order',
|
||||||
|
'int' => 1,
|
||||||
|
'order' => 1
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'table_name' => 'edit_menu_group',
|
||||||
|
'load_query' => "SELECT edit_menu_group_id, name FROM edit_menu_group ORDER BY name",
|
||||||
|
'show_fields' => [
|
||||||
|
[
|
||||||
|
'name' => 'name'
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -0,0 +1,275 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace CoreLibs\Output\Form\TableArrays;
|
||||||
|
|
||||||
|
class EditPages implements \CoreLibs\Output\Form\TableArraysInterface
|
||||||
|
{
|
||||||
|
/** @var \CoreLibs\Output\Form\Generate */
|
||||||
|
private $form;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* constructor
|
||||||
|
* @param \CoreLibs\Output\Form\Generate $form base form class
|
||||||
|
*/
|
||||||
|
public function __construct(\CoreLibs\Output\Form\Generate $form)
|
||||||
|
{
|
||||||
|
$this->form = $form;
|
||||||
|
$this->form->log->debug('CLASS LOAD', __NAMESPACE__ . __CLASS__);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the table array
|
||||||
|
*
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function setTableArray(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'table_array' => [
|
||||||
|
'edit_page_id' => [
|
||||||
|
'value' => $_POST['edit_page_id'] ?? '',
|
||||||
|
'type' => 'hidden',
|
||||||
|
'pk' => 1
|
||||||
|
],
|
||||||
|
'filename' => [
|
||||||
|
'value' => $_POST['filename'] ?? '',
|
||||||
|
'output_name' => 'Add File ...',
|
||||||
|
'mandatory' => 1,
|
||||||
|
'type' => 'drop_down_db',
|
||||||
|
'query' => "SELECT DISTINCT temp_files.filename AS id, "
|
||||||
|
. "temp_files.folder || temp_files.filename AS name "
|
||||||
|
. "FROM temp_files "
|
||||||
|
. "LEFT JOIN edit_page ep ON temp_files.filename = ep.filename "
|
||||||
|
. "WHERE ep.filename IS NULL"
|
||||||
|
],
|
||||||
|
'hostname' => [
|
||||||
|
'value' => $_POST['hostname'] ?? '',
|
||||||
|
'output_name' => 'Hostname or folder',
|
||||||
|
'type' => 'text'
|
||||||
|
],
|
||||||
|
'name' => [
|
||||||
|
'value' => $_POST['name'] ?? '',
|
||||||
|
'output_name' => 'Page name',
|
||||||
|
'mandatory' => 1,
|
||||||
|
'type' => 'text'
|
||||||
|
],
|
||||||
|
'order_number' => [
|
||||||
|
'value' => $_POST['order_number'] ?? '',
|
||||||
|
'output_name' => 'Page order',
|
||||||
|
'type' => 'order',
|
||||||
|
'int' => 1,
|
||||||
|
'order' => 1
|
||||||
|
],
|
||||||
|
/* 'flag' => [
|
||||||
|
'value' => $_POST['flag']) ?? '',
|
||||||
|
'output_name' => 'Page Flag',
|
||||||
|
'type' => 'drop_down_array',
|
||||||
|
'query' => [
|
||||||
|
'0' => '0',
|
||||||
|
'1' => '1',
|
||||||
|
'2' => '2',
|
||||||
|
'3' => '3',
|
||||||
|
'4' => '4',
|
||||||
|
'5' => '5'
|
||||||
|
],
|
||||||
|
],*/
|
||||||
|
'online' => [
|
||||||
|
'value' => $_POST['online'] ?? '',
|
||||||
|
'output_name' => 'Online',
|
||||||
|
'int' => 1,
|
||||||
|
'type' => 'binary',
|
||||||
|
'element_list' => [
|
||||||
|
'1' => 'Yes',
|
||||||
|
'0' => 'No'
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'menu' => [
|
||||||
|
'value' => $_POST['menu'] ?? '',
|
||||||
|
'output_name' => 'Menu',
|
||||||
|
'int' => 1,
|
||||||
|
'type' => 'binary',
|
||||||
|
'element_list' => [
|
||||||
|
'1' => 'Yes',
|
||||||
|
'0' => 'No'
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'popup' => [
|
||||||
|
'value' => $_POST['popup'] ?? '',
|
||||||
|
'output_name' => 'Popup',
|
||||||
|
'int' => 1,
|
||||||
|
'type' => 'binary',
|
||||||
|
'element_list' => [
|
||||||
|
'1' => 'Yes',
|
||||||
|
'0' => 'No'
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'popup_x' => [
|
||||||
|
'value' => $_POST['popup_x'] ?? '',
|
||||||
|
'output_name' => 'Popup Width',
|
||||||
|
'int_null' => 1,
|
||||||
|
'type' => 'text',
|
||||||
|
'size' => 4,
|
||||||
|
'length' => 4
|
||||||
|
],
|
||||||
|
'popup_y' => [
|
||||||
|
'value' => $_POST['popup_y'] ?? '',
|
||||||
|
'output_name' => 'Popup Height',
|
||||||
|
'int_null' => 1,
|
||||||
|
'type' => 'text',
|
||||||
|
'size' => 4,
|
||||||
|
'length' => 4
|
||||||
|
],
|
||||||
|
'content_alias_edit_page_id' => [
|
||||||
|
'value' => $_POST['content_alias_edit_page_id'] ?? '',
|
||||||
|
'output_name' => 'Content Alias Source',
|
||||||
|
'int_null' => 1,
|
||||||
|
'type' => 'drop_down_db',
|
||||||
|
// query creation
|
||||||
|
'select_distinct' => 0,
|
||||||
|
'pk_name' => 'edit_page_id AS content_alias_edit_page_id',
|
||||||
|
'input_name' => 'name',
|
||||||
|
'table_name' => 'edit_page',
|
||||||
|
'where_not_self' => 1,
|
||||||
|
'order_by' => 'order_number'
|
||||||
|
// 'query' => "SELECT edit_page_id AS content_alias_edit_page_id, name ".
|
||||||
|
// "FROM edit_page ".
|
||||||
|
// (!empty($_POST['edit_page_id']) ? " WHERE edit_page_id <> ".$_POST['edit_page_id'] : "")." ".
|
||||||
|
// "ORDER BY order_number"
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'load_query' => "SELECT edit_page_id, "
|
||||||
|
. "CASE WHEN hostname IS NOT NULL THEN hostname ELSE ''::VARCHAR END || filename AS filename, "
|
||||||
|
. "name, online, menu, popup "
|
||||||
|
. "FROM edit_page "
|
||||||
|
. "ORDER BY order_number",
|
||||||
|
'table_name' => 'edit_page',
|
||||||
|
'show_fields' => [
|
||||||
|
[
|
||||||
|
'name' => 'name'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'filename',
|
||||||
|
'before_value' => 'Filename: '
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'online',
|
||||||
|
'binary' => ['Yes', 'No'],
|
||||||
|
'before_value' => 'Online: '
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'menu',
|
||||||
|
'binary' => ['Yes', 'No'],
|
||||||
|
'before_value' => 'Menu: '
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'popup',
|
||||||
|
'binary' => ['Yes', 'No'],
|
||||||
|
'before_value' => 'Popup: '
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'reference_arrays' => [
|
||||||
|
'edit_visible_group' => [
|
||||||
|
'table_name' => 'edit_page_visible_group',
|
||||||
|
'other_table_pk' => 'edit_visible_group_id',
|
||||||
|
'output_name' => 'Visible Groups (access)',
|
||||||
|
'mandatory' => 1,
|
||||||
|
'select_size' => 10,
|
||||||
|
'selected' => $_POST['edit_visible_group_id'] ?? '',
|
||||||
|
'query' => "SELECT edit_visible_group_id, 'Name: ' || name || ', ' || 'Flag: ' || flag "
|
||||||
|
. "FROM edit_visible_group ORDER BY name"
|
||||||
|
],
|
||||||
|
'edit_menu_group' => [
|
||||||
|
'table_name' => 'edit_page_menu_group',
|
||||||
|
'other_table_pk' => 'edit_menu_group_id',
|
||||||
|
'output_name' => 'Menu Groups (grouping)',
|
||||||
|
'mandatory' => 1,
|
||||||
|
'select_size' => 10,
|
||||||
|
'selected' => $_POST['edit_menu_group_id'] ?? '',
|
||||||
|
'query' => "SELECT edit_menu_group_id, 'Name: ' || name || ', ' || 'Flag: ' || flag "
|
||||||
|
. "FROM edit_menu_group ORDER BY order_number"
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'element_list' => [
|
||||||
|
'edit_query_string' => [
|
||||||
|
'output_name' => 'Query Strings',
|
||||||
|
'delete_name' => 'remove_query_string',
|
||||||
|
'prefix' => 'eqs',
|
||||||
|
'elements' => [
|
||||||
|
'name' => [
|
||||||
|
'output_name' => 'Name',
|
||||||
|
'type' => 'text',
|
||||||
|
'error_check' => 'unique|alphanumeric',
|
||||||
|
'mandatory' => 1
|
||||||
|
],
|
||||||
|
'value' => [
|
||||||
|
'output_name' => 'Value',
|
||||||
|
'type' => 'text'
|
||||||
|
],
|
||||||
|
'enabled' => [
|
||||||
|
'output_name' => 'Enabled',
|
||||||
|
'int' => 1,
|
||||||
|
'type' => 'checkbox',
|
||||||
|
'element_list' => [1],
|
||||||
|
],
|
||||||
|
'dynamic' => [
|
||||||
|
'output_name' => 'Dynamic',
|
||||||
|
'int' => 1,
|
||||||
|
'type' => 'checkbox',
|
||||||
|
'element_list' => [1],
|
||||||
|
],
|
||||||
|
'edit_query_string_id' => [
|
||||||
|
'type' => 'hidden',
|
||||||
|
'pk_id' => 1
|
||||||
|
],
|
||||||
|
], // elements
|
||||||
|
], // query_string element list
|
||||||
|
'edit_page_content' => [
|
||||||
|
'output_name' => 'Page Content',
|
||||||
|
'delete_name' => 'remove_page_content',
|
||||||
|
'prefix' => 'epc',
|
||||||
|
'elements' => [
|
||||||
|
'name' => [
|
||||||
|
'output_name' => 'Content',
|
||||||
|
'type' => 'text',
|
||||||
|
'error_check' => 'alphanumeric',
|
||||||
|
'mandatory' => 1
|
||||||
|
],
|
||||||
|
'uid' => [
|
||||||
|
'output_name' => 'UID',
|
||||||
|
'type' => 'text',
|
||||||
|
'error_check' => 'unique|alphanumeric',
|
||||||
|
'mandatory' => 1
|
||||||
|
],
|
||||||
|
'order_number' => [
|
||||||
|
'output_name' => 'Order',
|
||||||
|
'type' => 'text',
|
||||||
|
'error_check' => 'int',
|
||||||
|
'mandatory' => 1
|
||||||
|
],
|
||||||
|
'online' => [
|
||||||
|
'output_name' => 'Online',
|
||||||
|
'int' => 1,
|
||||||
|
'type' => 'checkbox',
|
||||||
|
'element_list' => [1],
|
||||||
|
],
|
||||||
|
'edit_access_right_id' => [
|
||||||
|
'type' => 'drop_down_db',
|
||||||
|
'output_name' => 'Access Level',
|
||||||
|
'int' => 1,
|
||||||
|
'preset' => 1, // first of the select
|
||||||
|
'query' => "SELECT edit_access_right_id, name FROM edit_access_right ORDER BY level"
|
||||||
|
],
|
||||||
|
'edit_page_content_id' => [
|
||||||
|
'type' => 'hidden',
|
||||||
|
'pk_id' => 1
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
], // element list
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace CoreLibs\Output\Form\TableArrays;
|
||||||
|
|
||||||
|
class EditSchemas implements \CoreLibs\Output\Form\TableArraysInterface
|
||||||
|
{
|
||||||
|
/** @var \CoreLibs\Output\Form\Generate */
|
||||||
|
private $form;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* constructor
|
||||||
|
* @param \CoreLibs\Output\Form\Generate $form base form class
|
||||||
|
*/
|
||||||
|
public function __construct(\CoreLibs\Output\Form\Generate $form)
|
||||||
|
{
|
||||||
|
$this->form = $form;
|
||||||
|
$this->form->log->debug('CLASS LOAD', __NAMESPACE__ . __CLASS__);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the table array
|
||||||
|
*
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function setTableArray(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'table_array' => [
|
||||||
|
'edit_scheme_id' => [
|
||||||
|
'value' => $_POST['edit_scheme_id'] ?? '',
|
||||||
|
'type' => 'hidden',
|
||||||
|
'pk' => 1
|
||||||
|
],
|
||||||
|
'name' => [
|
||||||
|
'value' => $_POST['name'] ?? '',
|
||||||
|
'output_name' => 'Scheme Name',
|
||||||
|
'mandatory' => 1,
|
||||||
|
'type' => 'text'
|
||||||
|
],
|
||||||
|
'header_color' => [
|
||||||
|
'value' => $_POST['header_color'] ?? '',
|
||||||
|
'output_name' => 'Header Color',
|
||||||
|
'mandatory' => 1,
|
||||||
|
'type' => 'text',
|
||||||
|
'size' => 10,
|
||||||
|
'length' => 9,
|
||||||
|
'error_check' => 'custom',
|
||||||
|
// FIXME: update regex check for hex/rgb/hsl with color check class
|
||||||
|
'error_regex' => '/^#([\dA-Fa-f]{6}|[\dA-Fa-f]{8})$/',
|
||||||
|
'error_example' => '#F6A544'
|
||||||
|
],
|
||||||
|
'enabled' => [
|
||||||
|
'value' => $_POST['enabled'] ?? '',
|
||||||
|
'output_name' => 'Enabled',
|
||||||
|
'int' => 1,
|
||||||
|
'type' => 'binary',
|
||||||
|
'element_list' => [
|
||||||
|
'1' => 'Yes',
|
||||||
|
'0' => 'No'
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'template' => [
|
||||||
|
'value' => $_POST['template'] ?? '',
|
||||||
|
'output_name' => 'Template',
|
||||||
|
'type' => 'text'
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'table_name' => 'edit_scheme',
|
||||||
|
'load_query' => "SELECT edit_scheme_id, name, enabled FROM edit_scheme ORDER BY name",
|
||||||
|
'show_fields' => [
|
||||||
|
[
|
||||||
|
'name' => 'name'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'enabled',
|
||||||
|
'binary' => ['Yes', 'No'],
|
||||||
|
'before_value' => 'Enabled: '
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -0,0 +1,456 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace CoreLibs\Output\Form\TableArrays;
|
||||||
|
|
||||||
|
class EditUsers implements \CoreLibs\Output\Form\TableArraysInterface
|
||||||
|
{
|
||||||
|
/** @var \CoreLibs\Output\Form\Generate */
|
||||||
|
private $form;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* constructor
|
||||||
|
* @param \CoreLibs\Output\Form\Generate $form base form class
|
||||||
|
*/
|
||||||
|
public function __construct(\CoreLibs\Output\Form\Generate $form)
|
||||||
|
{
|
||||||
|
$this->form = $form;
|
||||||
|
$this->form->log->debug('CLASS LOAD', __NAMESPACE__ . __CLASS__);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the table array
|
||||||
|
*
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function setTableArray(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'table_array' => [
|
||||||
|
'edit_user_id' => [
|
||||||
|
'value' => $_POST['edit_user_id'] ?? '',
|
||||||
|
'type' => 'hidden',
|
||||||
|
'pk' => 1,
|
||||||
|
'int' => 1
|
||||||
|
],
|
||||||
|
'username' => [
|
||||||
|
'value' => $_POST['username'] ?? '',
|
||||||
|
'output_name' => 'Username',
|
||||||
|
'mandatory' => 1,
|
||||||
|
'error_check' => 'unique|alphanumericextended',
|
||||||
|
'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' => [
|
||||||
|
'value' => $_POST['password'] ?? '',
|
||||||
|
'HIDDEN_value' => $_POST['HIDDEN_password'] ?? '',
|
||||||
|
'CONFIRM_value' => $_POST['CONFIRM_password'] ?? '',
|
||||||
|
'output_name' => 'Password',
|
||||||
|
'mandatory' => 1,
|
||||||
|
'type' => 'password', // later has to be password for encryption in database
|
||||||
|
'update' => [ // connected field updates, and update data
|
||||||
|
'password_change_date' => [ // db row to update
|
||||||
|
'type' => 'date', // type of field (int/text/date/etc)
|
||||||
|
'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 reset force interval, if set, user needs to reset password after X time period
|
||||||
|
'password_change_interval' => [
|
||||||
|
'value' => $_POST['password_change_interval'] ?? '',
|
||||||
|
'output_name' => 'Password change interval',
|
||||||
|
// can be any date length format. n Y/M/D [not H/M/S], only one set, no combination
|
||||||
|
'error_check' => 'intervalshort',
|
||||||
|
'type' => 'text',
|
||||||
|
'interval' => 1, // interval needs NULL write for empty
|
||||||
|
'size' => 5, // make it 5 chars long
|
||||||
|
'length' => 5,
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'enabled' => [
|
||||||
|
'value' => $_POST['enabled'] ?? '',
|
||||||
|
'output_name' => 'Enabled',
|
||||||
|
'type' => 'binary',
|
||||||
|
'int' => 1,
|
||||||
|
'element_list' => [
|
||||||
|
'1' => 'Yes',
|
||||||
|
'0' => 'No'
|
||||||
|
],
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '-1',
|
||||||
|
],
|
||||||
|
'deleted' => [
|
||||||
|
'value' => $_POST['deleted'] ?? '',
|
||||||
|
'output_name' => 'Deleted',
|
||||||
|
'type' => 'binary',
|
||||||
|
'int' => 1,
|
||||||
|
'element_list' => [
|
||||||
|
'1' => 'Yes',
|
||||||
|
'0' => 'No'
|
||||||
|
],
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'strict' => [
|
||||||
|
'value' => $_POST['strict'] ?? '',
|
||||||
|
'output_name' => 'Strict (Lock after errors)',
|
||||||
|
'type' => 'binary',
|
||||||
|
'int' => 1,
|
||||||
|
'element_list' => [
|
||||||
|
'1' => 'Yes',
|
||||||
|
'0' => 'No'
|
||||||
|
],
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'locked' => [
|
||||||
|
'value' => $_POST['locked'] ?? '',
|
||||||
|
'output_name' => 'Locked (auto set if strict with errors)',
|
||||||
|
'type' => 'binary',
|
||||||
|
'int' => 1,
|
||||||
|
'element_list' => [
|
||||||
|
'1' => 'Yes',
|
||||||
|
'0' => 'No'
|
||||||
|
],
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'admin' => [
|
||||||
|
'value' => $_POST['admin'] ?? '',
|
||||||
|
'output_name' => 'Admin',
|
||||||
|
'type' => 'binary',
|
||||||
|
'int' => 1,
|
||||||
|
'element_list' => [
|
||||||
|
'1' => 'Yes',
|
||||||
|
'0' => 'No'
|
||||||
|
],
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'debug' => [
|
||||||
|
'value' => $_POST['debug'] ?? '',
|
||||||
|
'output_name' => 'Debug',
|
||||||
|
'type' => 'binary',
|
||||||
|
'int' => 1,
|
||||||
|
'element_list' => [
|
||||||
|
'1' => 'Yes',
|
||||||
|
'0' => 'No'
|
||||||
|
],
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'db_debug' => [
|
||||||
|
'value' => $_POST['db_debug'] ?? '',
|
||||||
|
'output_name' => 'DB Debug',
|
||||||
|
'type' => 'binary',
|
||||||
|
'int' => 1,
|
||||||
|
'element_list' => [
|
||||||
|
'1' => 'Yes',
|
||||||
|
'0' => 'No'
|
||||||
|
],
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'email' => [
|
||||||
|
'value' => $_POST['email'] ?? '',
|
||||||
|
'output_name' => 'E-Mail',
|
||||||
|
'type' => 'text',
|
||||||
|
'error_check' => 'email',
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'last_name' => [
|
||||||
|
'value' => $_POST['last_name'] ?? '',
|
||||||
|
'output_name' => 'Last Name',
|
||||||
|
'type' => 'text',
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'first_name' => [
|
||||||
|
'value' => $_POST['first_name'] ?? '',
|
||||||
|
'output_name' => 'First Name',
|
||||||
|
'type' => 'text',
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'lock_until' => [
|
||||||
|
'value' => $_POST['lock_until'] ?? '',
|
||||||
|
'output_name' => 'Lock account until',
|
||||||
|
'type' => 'datetime',
|
||||||
|
'error_check' => 'datetime',
|
||||||
|
'sql_read' => 'YYYY-MM-DD HH24:MI',
|
||||||
|
'datetime' => 1,
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'lock_after' => [
|
||||||
|
'value' => $_POST['lock_after'] ?? '',
|
||||||
|
'output_name' => 'Lock account after',
|
||||||
|
'type' => 'datetime',
|
||||||
|
'error_check' => 'datetime',
|
||||||
|
'sql_read' => 'YYYY-MM-DD HH24:MI',
|
||||||
|
'datetime' => 1,'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'login_user_id' => [
|
||||||
|
'value' => $_POST['login_user_id'] ?? '',
|
||||||
|
'output_name' => '_GET/_POST loginUserId direct login ID',
|
||||||
|
'type' => 'text',
|
||||||
|
'error_check' => 'unique|custom',
|
||||||
|
'error_regex' => "/^[A-Za-z0-9]+$/",
|
||||||
|
'emptynull' => 1,'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'login_user_id_set_date' => [
|
||||||
|
'output_name' => 'loginUserId set date',
|
||||||
|
'value' => $_POST['login_user_id_set_date'] ?? '',
|
||||||
|
'type' => 'view',
|
||||||
|
'empty' => '-',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'login_user_id_last_revalidate' => [
|
||||||
|
'output_name' => 'loginUserId last revalidate date',
|
||||||
|
'value' => $_POST['login_user_id_last_revalidate'] ?? '',
|
||||||
|
'type' => 'view',
|
||||||
|
'empty' => '-',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'login_user_id_locked' => [
|
||||||
|
'value' => $_POST['login_user_id_locked'] ?? '',
|
||||||
|
'output_name' => 'loginUserId usage locked',
|
||||||
|
'type' => 'binary',
|
||||||
|
'int' => 1,
|
||||||
|
'element_list' => [
|
||||||
|
'1' => 'Yes',
|
||||||
|
'0' => 'No'
|
||||||
|
],
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'login_user_id_revalidate_after' => [
|
||||||
|
'value' => $_POST['login_user_id_revalidate_after'] ?? '',
|
||||||
|
'output_name' => 'loginUserId, User must login after n days',
|
||||||
|
'type' => 'text',
|
||||||
|
'error_check' => 'intervalshort',
|
||||||
|
'interval' => 1, // interval needs NULL write for empty
|
||||||
|
'size' => 5, // make it 5 chars long
|
||||||
|
'length' => 5,
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'login_user_id_valid_from' => [
|
||||||
|
'value' => $_POST['login_user_id_valid_from'] ?? '',
|
||||||
|
'output_name' => 'loginUserId valid from',
|
||||||
|
'type' => 'datetime',
|
||||||
|
'error_check' => 'datetime',
|
||||||
|
'sql_read' => 'YYYY-MM-DD HH24:MI',
|
||||||
|
'datetime' => 1,
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'login_user_id_valid_until' => [
|
||||||
|
'value' => $_POST['login_user_id_valid_until'] ?? '',
|
||||||
|
'output_name' => 'loginUserId valid until',
|
||||||
|
'type' => 'datetime',
|
||||||
|
'error_check' => 'datetime',
|
||||||
|
'sql_read' => 'YYYY-MM-DD HH24:MI',
|
||||||
|
'datetime' => 1,
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'edit_language_id' => [
|
||||||
|
'value' => $_POST['edit_language_id'] ?? '',
|
||||||
|
'output_name' => 'Language',
|
||||||
|
'mandatory' => 1,
|
||||||
|
'int' => 1,
|
||||||
|
'type' => 'drop_down_db',
|
||||||
|
'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' => [
|
||||||
|
'value' => $_POST['edit_scheme_id'] ?? '',
|
||||||
|
'output_name' => 'Scheme',
|
||||||
|
'int_null' => 1,
|
||||||
|
'type' => 'drop_down_db',
|
||||||
|
'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' => [
|
||||||
|
'value' => $_POST['edit_group_id'] ?? '',
|
||||||
|
'output_name' => 'Group',
|
||||||
|
'int' => 1,
|
||||||
|
'type' => 'drop_down_db',
|
||||||
|
'query' => "SELECT edit_group_id, name FROM edit_group WHERE enabled = 1 ORDER BY name",
|
||||||
|
'mandatory' => 1,
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'edit_access_right_id' => [
|
||||||
|
'value' => $_POST['edit_access_right_id'] ?? '',
|
||||||
|
'output_name' => 'User Level',
|
||||||
|
'mandatory' => 1,
|
||||||
|
'int' => 1,
|
||||||
|
'type' => 'drop_down_db',
|
||||||
|
'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' => [
|
||||||
|
'output_name' => 'Login error count',
|
||||||
|
'value' => $_POST['login_error_count'] ?? '',
|
||||||
|
'type' => 'view',
|
||||||
|
'empty' => '0',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'login_error_date_last' => [
|
||||||
|
'output_name' => 'Last login error',
|
||||||
|
'value' => $_POST['login_error_date_liast'] ?? '',
|
||||||
|
'type' => 'view',
|
||||||
|
'empty' => '-',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'login_error_date_first' => [
|
||||||
|
'output_name' => 'First login error',
|
||||||
|
'value' => $_POST['login_error_date_first'] ?? '',
|
||||||
|
'type' => 'view',
|
||||||
|
'empty' => '-',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'protected' => [
|
||||||
|
'value' => $_POST['protected'] ?? '',
|
||||||
|
'output_name' => 'Protected',
|
||||||
|
'type' => 'binary',
|
||||||
|
'int' => 1,
|
||||||
|
'element_list' => [
|
||||||
|
'1' => 'Yes',
|
||||||
|
'0' => 'No'
|
||||||
|
],
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'additional_acl' => [
|
||||||
|
'value' => $_POST['additional_acl'] ?? '',
|
||||||
|
'output_name' => 'Additional ACL (as JSON)',
|
||||||
|
'type' => 'textarea',
|
||||||
|
'error_check' => 'json',
|
||||||
|
'rows' => 10,
|
||||||
|
'cols' => 60,
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'load_query' => "SELECT edit_user_id, username, enabled, deleted, "
|
||||||
|
. "strict, locked, login_error_count "
|
||||||
|
. "FROM edit_user "
|
||||||
|
// if base acl is not 90 only list enabled
|
||||||
|
// if not admin flag, do not list admin flagged
|
||||||
|
. (
|
||||||
|
!$this->form->getAclAdmin() ?
|
||||||
|
"WHERE admin = 0 "
|
||||||
|
. (
|
||||||
|
!$this->form->checkBaseACL(90) ?
|
||||||
|
// $_POST['base_acl_level'] < 90 ?
|
||||||
|
"AND enabled = 1 " :
|
||||||
|
""
|
||||||
|
)
|
||||||
|
: ''
|
||||||
|
)
|
||||||
|
. "ORDER BY username",
|
||||||
|
'table_name' => 'edit_user',
|
||||||
|
'show_fields' => [
|
||||||
|
[
|
||||||
|
'name' => 'username'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'enabled',
|
||||||
|
'binary' => ['Yes', 'No'],
|
||||||
|
'before_value' => 'ENBL: '
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'deleted',
|
||||||
|
'binary' => ['Yes', 'No'],
|
||||||
|
'before_value' => 'DEL: '
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'strict',
|
||||||
|
'binary' => ['Yes', 'No'],
|
||||||
|
'before_value' => 'STRC: '
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'locked',
|
||||||
|
'binary' => ['Yes', 'No'],
|
||||||
|
'before_value' => 'LCK: '
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'login_error_count',
|
||||||
|
'before_value' => 'ERR: '
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'element_list' => [
|
||||||
|
'edit_access_user' => [
|
||||||
|
'output_name' => 'Accounts',
|
||||||
|
'mandatory' => 1,
|
||||||
|
// 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',
|
||||||
|
'read_data' => [
|
||||||
|
'table_name' => 'edit_access',
|
||||||
|
'pk_id' => 'edit_access_id',
|
||||||
|
'name' => 'name',
|
||||||
|
'order' => 'name'
|
||||||
|
],
|
||||||
|
'elements' => [
|
||||||
|
'edit_access_user_id' => [
|
||||||
|
'output_name' => 'Activate',
|
||||||
|
'type' => 'hidden',
|
||||||
|
'int' => 1,
|
||||||
|
'pk_id' => 1
|
||||||
|
],
|
||||||
|
'enabled' => [
|
||||||
|
'type' => 'checkbox',
|
||||||
|
'output_name' => 'Activate',
|
||||||
|
'int' => 1,
|
||||||
|
'element_list' => [1],
|
||||||
|
],
|
||||||
|
'edit_access_right_id' => [
|
||||||
|
'type' => 'drop_down_db',
|
||||||
|
'output_name' => 'Access Level',
|
||||||
|
'preset' => 1, // first of the select
|
||||||
|
'int' => 1,
|
||||||
|
'query' => "SELECT edit_access_right_id, name FROM edit_access_right ORDER BY level"
|
||||||
|
],
|
||||||
|
'edit_default' => [
|
||||||
|
'type' => 'radio_group',
|
||||||
|
'output_name' => 'Default',
|
||||||
|
'int' => 1,
|
||||||
|
'element_list' => 'radio_group'
|
||||||
|
],
|
||||||
|
'edit_access_id' => [
|
||||||
|
'type' => 'hidden',
|
||||||
|
'int' => 1
|
||||||
|
],
|
||||||
|
],
|
||||||
|
], // edit pages ggroup
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace CoreLibs\Output\Form\TableArrays;
|
||||||
|
|
||||||
|
class EditVisibleGroup implements \CoreLibs\Output\Form\TableArraysInterface
|
||||||
|
{
|
||||||
|
/** @var \CoreLibs\Output\Form\Generate */
|
||||||
|
private $form;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* constructor
|
||||||
|
* @param \CoreLibs\Output\Form\Generate $form base form class
|
||||||
|
*/
|
||||||
|
public function __construct(\CoreLibs\Output\Form\Generate $form)
|
||||||
|
{
|
||||||
|
$this->form = $form;
|
||||||
|
$this->form->log->debug('CLASS LOAD', __NAMESPACE__ . __CLASS__);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the table array
|
||||||
|
*
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function setTableArray(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'table_array' => [
|
||||||
|
'edit_visible_group_id' => [
|
||||||
|
'value' => $_POST['edit_visible_group_id'] ?? '',
|
||||||
|
'type' => 'hidden',
|
||||||
|
'pk' => 1
|
||||||
|
],
|
||||||
|
'name' => [
|
||||||
|
'value' => $_POST['name'] ?? '',
|
||||||
|
'output_name' => 'Group name',
|
||||||
|
'mandatory' => 1,
|
||||||
|
'type' => 'text'
|
||||||
|
],
|
||||||
|
'flag' => [
|
||||||
|
'value' => $_POST['flag'] ?? '',
|
||||||
|
'output_name' => 'Flag',
|
||||||
|
'mandatory' => 1,
|
||||||
|
'type' => 'text',
|
||||||
|
'error_check' => 'alphanumeric|unique'
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'table_name' => 'edit_visible_group',
|
||||||
|
'load_query' => "SELECT edit_visible_group_id, name FROM edit_visible_group ORDER BY name",
|
||||||
|
'show_fields' => [
|
||||||
|
[
|
||||||
|
'name' => 'name'
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -0,0 +1,16 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace CoreLibs\Output\Form;
|
||||||
|
|
||||||
|
interface TableArraysInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* setTableArray interface, set the table array
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function setTableArray(): array;
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -0,0 +1,551 @@
|
|||||||
|
<?php // phpcs:ignore PSR1.Files.SideEffects
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @phan-file-suppress PhanRedefinedExtendedClass
|
||||||
|
*/
|
||||||
|
|
||||||
|
// because smarty is symlinked folder
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* AUTHOR: Clemens Schwaighofer
|
||||||
|
* CREATED: 2004/12/21
|
||||||
|
* SHORT DESCRIPTION:
|
||||||
|
* extends smarty with the l10n class so I can use __(, etc calls
|
||||||
|
* HISTORY:
|
||||||
|
* 2005/06/22 (cs) include smarty class here, so there is no need to include it in the main file
|
||||||
|
*********************************************************************/
|
||||||
|
|
||||||
|
namespace CoreLibs\Template;
|
||||||
|
|
||||||
|
// leading slash if this is in lib\Smarty
|
||||||
|
class SmartyExtend extends \Smarty
|
||||||
|
{
|
||||||
|
// internal translation engine
|
||||||
|
/** @var \CoreLibs\Language\L10n */
|
||||||
|
public $l10n;
|
||||||
|
|
||||||
|
// lang & encoding
|
||||||
|
/** @var string */
|
||||||
|
public $lang_dir = '';
|
||||||
|
/** @var string */
|
||||||
|
public $lang;
|
||||||
|
/** @var string */
|
||||||
|
public $locale_set;
|
||||||
|
/** @var string */
|
||||||
|
public $lang_short;
|
||||||
|
/** @var string */
|
||||||
|
public $domain;
|
||||||
|
/** @var string */
|
||||||
|
public $encoding;
|
||||||
|
// page name
|
||||||
|
/** @var string */
|
||||||
|
public $page_name;
|
||||||
|
|
||||||
|
// array for data parsing
|
||||||
|
/** @var array<mixed> */
|
||||||
|
public $HEADER = [];
|
||||||
|
/** @var array<mixed> */
|
||||||
|
public $DATA = [];
|
||||||
|
/** @var array<mixed> */
|
||||||
|
public $DEBUG_DATA = [];
|
||||||
|
/** @var array<mixed> */
|
||||||
|
private $CONTENT_DATA = [];
|
||||||
|
// control vars
|
||||||
|
/** @var bool */
|
||||||
|
public $USE_PROTOTYPE = USE_PROTOTYPE;
|
||||||
|
/** @var bool */
|
||||||
|
public $USE_JQUERY = USE_JQUERY;
|
||||||
|
/** @var bool */
|
||||||
|
public $USE_SCRIPTACULOUS = USE_SCRIPTACULOUS;
|
||||||
|
// sub content input vars
|
||||||
|
/** @var bool */
|
||||||
|
public $USE_TINY_MCE = false;
|
||||||
|
/** @var bool */
|
||||||
|
public $JS_DATEPICKR = false;
|
||||||
|
/** @var bool */
|
||||||
|
public $JS_FLATPICKR = false;
|
||||||
|
/** @var bool */
|
||||||
|
public $JS_FILE_UPLOADER = false;
|
||||||
|
/** @var bool */
|
||||||
|
public $DEBUG_TMPL = false;
|
||||||
|
/** @var bool */
|
||||||
|
public $USE_INCLUDE_TEMPLATE = false;
|
||||||
|
// cache & compile
|
||||||
|
/** @var string */
|
||||||
|
public $CACHE_ID = '';
|
||||||
|
/** @var string */
|
||||||
|
public $COMPILE_ID = '';
|
||||||
|
// template vars
|
||||||
|
/** @var string */
|
||||||
|
public $MASTER_TEMPLATE_NAME;
|
||||||
|
/** @var string */
|
||||||
|
public $PAGE_FILE_NAME;
|
||||||
|
/** @var string */
|
||||||
|
public $CONTENT_INCLUDE;
|
||||||
|
/** @var string */
|
||||||
|
public $FORM_NAME;
|
||||||
|
/** @var string */
|
||||||
|
public $FORM_ACTION;
|
||||||
|
/** @var string */
|
||||||
|
public $L_TITLE;
|
||||||
|
/** @var string|int */
|
||||||
|
public $PAGE_WIDTH;
|
||||||
|
// smarty include/set var
|
||||||
|
/** @var string */
|
||||||
|
public $TEMPLATE_PATH;
|
||||||
|
/** @var string */
|
||||||
|
public $TEMPLATE_NAME;
|
||||||
|
/** @var string */
|
||||||
|
public $INC_TEMPLATE_NAME;
|
||||||
|
/** @var string */
|
||||||
|
public $JS_TEMPLATE_NAME;
|
||||||
|
/** @var string */
|
||||||
|
public $CSS_TEMPLATE_NAME;
|
||||||
|
/** @var string|null */
|
||||||
|
public $TEMPLATE_TRANSLATE;
|
||||||
|
/** @var string|null */
|
||||||
|
public $JS_TRANSLATE;
|
||||||
|
// core group
|
||||||
|
/** @var string */
|
||||||
|
public $JS_CORE_TEMPLATE_NAME;
|
||||||
|
/** @var string */
|
||||||
|
public $CSS_CORE_TEMPLATE_NAME;
|
||||||
|
/** @var string */
|
||||||
|
public $JS_CORE_INCLUDE;
|
||||||
|
/** @var string */
|
||||||
|
public $CSS_CORE_INCLUDE;
|
||||||
|
// local names
|
||||||
|
/** @var string */
|
||||||
|
public $JS_SPECIAL_TEMPLATE_NAME = '';
|
||||||
|
/** @var string */
|
||||||
|
public $CSS_SPECIAL_TEMPLATE_NAME = '';
|
||||||
|
/** @var string */
|
||||||
|
public $JS_INCLUDE;
|
||||||
|
/** @var string */
|
||||||
|
public $CSS_INCLUDE;
|
||||||
|
/** @var string */
|
||||||
|
public $JS_SPECIAL_INCLUDE;
|
||||||
|
/** @var string */
|
||||||
|
public $CSS_SPECIAL_INCLUDE;
|
||||||
|
/** @var string */
|
||||||
|
public $ADMIN_JAVASCRIPT;
|
||||||
|
/** @var string */
|
||||||
|
public $ADMIN_STYLESHEET;
|
||||||
|
/** @var string */
|
||||||
|
public $FRONTEND_JAVASCRIPT;
|
||||||
|
/** @var string */
|
||||||
|
public $FRONTEND_STYLESHEET;
|
||||||
|
// other smarty folder vars
|
||||||
|
/** @var string */
|
||||||
|
public $INCLUDES;
|
||||||
|
/** @var string */
|
||||||
|
public $JAVASCRIPT;
|
||||||
|
/** @var string */
|
||||||
|
public $CSS;
|
||||||
|
/** @var string */
|
||||||
|
public $FONT;
|
||||||
|
/** @var string */
|
||||||
|
public $PICTURES;
|
||||||
|
/** @var string */
|
||||||
|
public $CACHE_PICTURES;
|
||||||
|
/** @var string */
|
||||||
|
public $CACHE_PICTURES_ROOT;
|
||||||
|
|
||||||
|
// constructor class, just sets the language stuff
|
||||||
|
/**
|
||||||
|
* constructor class, just sets the language stuff
|
||||||
|
* calls L10 for pass on internaly in smarty
|
||||||
|
* also registers the getvar caller plugin
|
||||||
|
*
|
||||||
|
* @param \CoreLibs\Language\L10n $l10n l10n language class
|
||||||
|
* @param array<string,string> $locale locale data read from setLocale
|
||||||
|
*/
|
||||||
|
public function __construct(\CoreLibs\Language\L10n $l10n, array $locale)
|
||||||
|
{
|
||||||
|
// call basic smarty
|
||||||
|
// or Smarty::__construct();
|
||||||
|
parent::__construct();
|
||||||
|
// iinit lang
|
||||||
|
$this->l10n = $l10n;
|
||||||
|
// parse and read, legacy stuff
|
||||||
|
$this->encoding = $locale['encoding'];
|
||||||
|
$this->lang = $locale['lang'];
|
||||||
|
// get first part from lang
|
||||||
|
$this->lang_short = explode('_', $locale['lang'])[0];
|
||||||
|
$this->domain = $this->l10n->getDomain();
|
||||||
|
$this->locale_set = $this->l10n->getLocaleSet();
|
||||||
|
$this->lang_dir = $this->l10n->getBaseLocalePath();
|
||||||
|
|
||||||
|
// opt load functions so we can use legacy init for smarty run perhaps
|
||||||
|
\CoreLibs\Language\L10n::loadFunctions();
|
||||||
|
_setlocale(LC_MESSAGES, $locale['locale']);
|
||||||
|
_textdomain($this->domain);
|
||||||
|
_bindtextdomain($this->domain, $this->lang_dir);
|
||||||
|
_bind_textdomain_codeset($this->domain, $this->encoding);
|
||||||
|
|
||||||
|
// register smarty variable
|
||||||
|
$this->registerPlugin('modifier', 'getvar', [&$this, 'getTemplateVars']);
|
||||||
|
|
||||||
|
$this->page_name = \CoreLibs\Get\System::getPageName();
|
||||||
|
|
||||||
|
// set internal settings
|
||||||
|
$this->CACHE_ID = defined('CACHE_ID') ? CACHE_ID : '';
|
||||||
|
$this->COMPILE_ID = defined('COMPILE_ID') ? COMPILE_ID : '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private function setSmartCoreIncludeCssJs(): void
|
||||||
|
{
|
||||||
|
// core CS
|
||||||
|
$this->CSS_CORE_INCLUDE = '';
|
||||||
|
if (
|
||||||
|
file_exists($this->CSS . $this->CSS_CORE_TEMPLATE_NAME) &&
|
||||||
|
is_file($this->CSS . $this->CSS_CORE_TEMPLATE_NAME)
|
||||||
|
) {
|
||||||
|
$this->CSS_CORE_INCLUDE = $this->CSS . $this->CSS_CORE_TEMPLATE_NAME;
|
||||||
|
}
|
||||||
|
// core JS
|
||||||
|
$this->JS_CORE_INCLUDE = '';
|
||||||
|
if (
|
||||||
|
file_exists($this->JAVASCRIPT . $this->JS_CORE_TEMPLATE_NAME) &&
|
||||||
|
is_file($this->JAVASCRIPT . $this->JS_CORE_TEMPLATE_NAME)
|
||||||
|
) {
|
||||||
|
$this->JS_CORE_INCLUDE = $this->JAVASCRIPT . $this->JS_CORE_TEMPLATE_NAME;
|
||||||
|
}
|
||||||
|
// additional per page Javascript include
|
||||||
|
$this->JS_INCLUDE = '';
|
||||||
|
if (
|
||||||
|
file_exists($this->JAVASCRIPT . $this->JS_TEMPLATE_NAME) &&
|
||||||
|
is_file($this->JAVASCRIPT . $this->JS_TEMPLATE_NAME)
|
||||||
|
) {
|
||||||
|
$this->JS_INCLUDE = $this->JAVASCRIPT . $this->JS_TEMPLATE_NAME;
|
||||||
|
}
|
||||||
|
// per page css file
|
||||||
|
$this->CSS_INCLUDE = '';
|
||||||
|
if (
|
||||||
|
file_exists($this->CSS . $this->CSS_TEMPLATE_NAME) &&
|
||||||
|
is_file($this->CSS . $this->CSS_TEMPLATE_NAME)
|
||||||
|
) {
|
||||||
|
$this->CSS_INCLUDE = $this->CSS . $this->CSS_TEMPLATE_NAME;
|
||||||
|
}
|
||||||
|
// optional CSS file
|
||||||
|
$this->CSS_SPECIAL_INCLUDE = '';
|
||||||
|
if (
|
||||||
|
file_exists($this->CSS . $this->CSS_SPECIAL_TEMPLATE_NAME) &&
|
||||||
|
is_file($this->CSS . $this->CSS_SPECIAL_TEMPLATE_NAME)
|
||||||
|
) {
|
||||||
|
$this->CSS_SPECIAL_INCLUDE = $this->CSS . $this->CSS_SPECIAL_TEMPLATE_NAME;
|
||||||
|
}
|
||||||
|
// optional JS file
|
||||||
|
$this->JS_SPECIAL_INCLUDE = '';
|
||||||
|
if (
|
||||||
|
file_exists($this->JAVASCRIPT . $this->JS_SPECIAL_TEMPLATE_NAME) &&
|
||||||
|
is_file($this->JAVASCRIPT . $this->JS_SPECIAL_TEMPLATE_NAME)
|
||||||
|
) {
|
||||||
|
$this->JS_SPECIAL_INCLUDE = $this->JAVASCRIPT . $this->JS_SPECIAL_TEMPLATE_NAME;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sets all internal paths and names that need to be passed on to the smarty template
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function setSmartyPaths(): void
|
||||||
|
{
|
||||||
|
// master template
|
||||||
|
if (empty($this->MASTER_TEMPLATE_NAME)) {
|
||||||
|
$this->MASTER_TEMPLATE_NAME = MASTER_TEMPLATE_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
// set include & template names
|
||||||
|
if (empty($this->CONTENT_INCLUDE)) {
|
||||||
|
$this->CONTENT_INCLUDE = str_replace('.php', '', $this->page_name) . '.tpl';
|
||||||
|
}
|
||||||
|
// strip tpl and replace it with php
|
||||||
|
// php include file per page
|
||||||
|
$this->INC_TEMPLATE_NAME = str_replace('.tpl', '.php', $this->CONTENT_INCLUDE);
|
||||||
|
// javascript include per page
|
||||||
|
$this->JS_TEMPLATE_NAME = str_replace('.tpl', '.js', $this->CONTENT_INCLUDE);
|
||||||
|
// css per page
|
||||||
|
$this->CSS_TEMPLATE_NAME = str_replace('.tpl', '.css', $this->CONTENT_INCLUDE);
|
||||||
|
|
||||||
|
// set basic template path (tmp)
|
||||||
|
$this->INCLUDES = BASE . INCLUDES; // no longer in templates, only global
|
||||||
|
$this->TEMPLATE_PATH = BASE . INCLUDES . TEMPLATES . CONTENT_PATH;
|
||||||
|
$this->setTemplateDir($this->TEMPLATE_PATH);
|
||||||
|
$this->JAVASCRIPT = LAYOUT . JS;
|
||||||
|
$this->CSS = LAYOUT . CSS;
|
||||||
|
$this->FONT = LAYOUT . FONT;
|
||||||
|
$this->PICTURES = LAYOUT . IMAGES;
|
||||||
|
$this->CACHE_PICTURES = LAYOUT . CACHE;
|
||||||
|
$this->CACHE_PICTURES_ROOT = ROOT . $this->CACHE_PICTURES;
|
||||||
|
// check if we have an external file with the template name
|
||||||
|
if (
|
||||||
|
file_exists($this->INCLUDES . $this->INC_TEMPLATE_NAME) &&
|
||||||
|
is_file($this->INCLUDES . $this->INC_TEMPLATE_NAME)
|
||||||
|
) {
|
||||||
|
include($this->INCLUDES . $this->INC_TEMPLATE_NAME);
|
||||||
|
}
|
||||||
|
// check for template include
|
||||||
|
if (
|
||||||
|
$this->USE_INCLUDE_TEMPLATE === true &&
|
||||||
|
!$this->TEMPLATE_NAME
|
||||||
|
) {
|
||||||
|
$this->TEMPLATE_NAME = $this->CONTENT_INCLUDE;
|
||||||
|
// add to cache & compile id
|
||||||
|
$this->COMPILE_ID .= '_' . $this->TEMPLATE_NAME;
|
||||||
|
$this->CACHE_ID .= '_' . $this->TEMPLATE_NAME;
|
||||||
|
}
|
||||||
|
// set all the additional CSS/JS parths
|
||||||
|
$this->setSmartCoreIncludeCssJs();
|
||||||
|
// check if template names exist
|
||||||
|
if (!$this->MASTER_TEMPLATE_NAME) {
|
||||||
|
exit('MASTER TEMPLATE is not set');
|
||||||
|
} elseif (!file_exists($this->getTemplateDir()[0] . DIRECTORY_SEPARATOR . $this->MASTER_TEMPLATE_NAME)) {
|
||||||
|
// abort if master template could not be found
|
||||||
|
exit('MASTER TEMPLATE: ' . $this->MASTER_TEMPLATE_NAME . ' could not be found');
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
$this->TEMPLATE_NAME &&
|
||||||
|
!file_exists($this->getTemplateDir()[0] . DIRECTORY_SEPARATOR . $this->TEMPLATE_NAME)
|
||||||
|
) {
|
||||||
|
exit('INCLUDE TEMPLATE: ' . $this->TEMPLATE_NAME . ' could not be found');
|
||||||
|
}
|
||||||
|
// javascript translate data as template for auto translate
|
||||||
|
if (empty($this->TEMPLATE_TRANSLATE)) {
|
||||||
|
$this->TEMPLATE_TRANSLATE = 'jsTranslate-'
|
||||||
|
. $this->locale_set . '.' . $this->encoding
|
||||||
|
. '.tpl';
|
||||||
|
} else {
|
||||||
|
// we assume we have some fixed set
|
||||||
|
// we must add _<locale>.<encoding>
|
||||||
|
// if .tpl, put before .tpl
|
||||||
|
// if not .tpl, add _<locale>.<encoding>.tpl
|
||||||
|
if (strpos($this->TEMPLATE_TRANSLATE, '.tpl')) {
|
||||||
|
$this->TEMPLATE_TRANSLATE = str_replace(
|
||||||
|
'.tpl',
|
||||||
|
'-' . $this->locale_set . '.' . $this->encoding . '.tpl',
|
||||||
|
$this->TEMPLATE_TRANSLATE
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->TEMPLATE_TRANSLATE .= '-'
|
||||||
|
. $this->locale_set . '.' . $this->encoding
|
||||||
|
. '.tpl';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// if we can't find it, dump it
|
||||||
|
if (!file_exists($this->getTemplateDir()[0] . DIRECTORY_SEPARATOR . $this->TEMPLATE_TRANSLATE)) {
|
||||||
|
$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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wrapper call for setSmartyVars
|
||||||
|
* this is for frontend type and will not set any only admin needed variables
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function setSmartyVarsFrontend(): void
|
||||||
|
{
|
||||||
|
$this->setSmartyVars();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wrapper call for setSmartyVars
|
||||||
|
* this is only for admin interface and will set additional variables
|
||||||
|
*/
|
||||||
|
public function setSmartyVarsAdmin(): void
|
||||||
|
{
|
||||||
|
$this->setSmartyVars(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set smarty pass on variables, sub template names and finally calls the smarty parser
|
||||||
|
*
|
||||||
|
* @param boolean $admin_call default false, will set admin only variables
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private function setSmartyVars($admin_call = false): void
|
||||||
|
{
|
||||||
|
/** @var \CoreLibs\Admin\Backend This is an assumption */
|
||||||
|
global $cms;
|
||||||
|
if (is_object($cms)) {
|
||||||
|
$this->mergeCmsSmartyVars($cms);
|
||||||
|
}
|
||||||
|
|
||||||
|
// trigger flags
|
||||||
|
$this->HEADER['USE_PROTOTYPE'] = $this->USE_PROTOTYPE;
|
||||||
|
// scriptacolous, can only be used with prototype
|
||||||
|
if ($this->HEADER['USE_PROTOTYPE']) {
|
||||||
|
$this->HEADER['USE_SCRIPTACULOUS'] = $this->USE_SCRIPTACULOUS;
|
||||||
|
}
|
||||||
|
// jquery and prototype should not be used together
|
||||||
|
$this->HEADER['USE_JQUERY'] = $this->USE_JQUERY;
|
||||||
|
|
||||||
|
// set all the additional CSS/JS parths
|
||||||
|
$this->setSmartCoreIncludeCssJs();
|
||||||
|
|
||||||
|
// the actual include files for javascript (per page)
|
||||||
|
$this->HEADER['JS_CORE_INCLUDE'] = $this->JS_CORE_INCLUDE;
|
||||||
|
$this->HEADER['CSS_CORE_INCLUDE'] = $this->CSS_CORE_INCLUDE;
|
||||||
|
$this->HEADER['JS_INCLUDE'] = $this->JS_INCLUDE;
|
||||||
|
$this->HEADER['CSS_INCLUDE'] = $this->CSS_INCLUDE;
|
||||||
|
$this->HEADER['CSS_SPECIAL_INCLUDE'] = $this->CSS_SPECIAL_INCLUDE;
|
||||||
|
$this->HEADER['JS_SPECIAL_INCLUDE'] = $this->JS_SPECIAL_INCLUDE;
|
||||||
|
// paths to the files
|
||||||
|
$this->DATA['includes'] = $this->INCLUDES;
|
||||||
|
$this->DATA['js'] = $this->JAVASCRIPT;
|
||||||
|
$this->DATA['css'] = $this->CSS;
|
||||||
|
$this->DATA['pictures'] = $this->PICTURES;
|
||||||
|
|
||||||
|
// default CMS settings
|
||||||
|
// define all needed smarty stuff for the general HTML/page building
|
||||||
|
$this->HEADER['CSS'] = CSS;
|
||||||
|
$this->HEADER['FONT'] = FONT;
|
||||||
|
$this->HEADER['JS'] = JS;
|
||||||
|
$this->HEADER['ENCODING'] = $this->encoding;
|
||||||
|
$this->HEADER['DEFAULT_ENCODING'] = DEFAULT_ENCODING;
|
||||||
|
|
||||||
|
// form name
|
||||||
|
$this->DATA['FORM_NAME'] = !$this->FORM_NAME ?
|
||||||
|
str_replace('.php', '', $this->page_name) :
|
||||||
|
$this->FORM_NAME;
|
||||||
|
$this->DATA['FORM_ACTION'] = $this->FORM_ACTION;
|
||||||
|
// special for admin
|
||||||
|
if ($admin_call === true) {
|
||||||
|
// set ACL extra show
|
||||||
|
if (is_object($cms)) {
|
||||||
|
$this->DATA['show_ea_extra'] = $cms->acl['show_ea_extra'] ?? false;
|
||||||
|
$this->DATA['ADMIN'] = $cms->acl['admin'] ?? 0;
|
||||||
|
// top menu
|
||||||
|
$this->DATA['nav_menu'] = $cms->adbTopMenu();
|
||||||
|
$this->DATA['nav_menu_count'] = count($this->DATA['nav_menu']);
|
||||||
|
// messages = ['msg' =>, 'class' => 'error/warning/...']
|
||||||
|
$this->DATA['messages'] = $cms->messages;
|
||||||
|
} else { /** @phpstan-ignore-line Because I assume object for phpstan */
|
||||||
|
$this->DATA['show_ea_extra'] = false;
|
||||||
|
$this->DATA['ADMIN'] = 0;
|
||||||
|
$this->DATA['nav_menu'] = [];
|
||||||
|
$this->DATA['nav_menu_count'] = 0;
|
||||||
|
$this->DATA['messages'] = [];
|
||||||
|
}
|
||||||
|
// set style sheets
|
||||||
|
$this->HEADER['STYLESHEET'] = $this->ADMIN_STYLESHEET ? $this->ADMIN_STYLESHEET : ADMIN_STYLESHEET;
|
||||||
|
$this->HEADER['JAVASCRIPT'] = $this->ADMIN_JAVASCRIPT ? $this->ADMIN_JAVASCRIPT : ADMIN_JAVASCRIPT;
|
||||||
|
// the page name
|
||||||
|
$this->DATA['page_name'] = $this->page_name;
|
||||||
|
$this->DATA['table_width'] = !empty($this->PAGE_WIDTH) ?: PAGE_WIDTH;
|
||||||
|
$this->DATA['form_name'] = $this->DATA['FORM_NAME'];
|
||||||
|
// for tinymce special
|
||||||
|
$this->DATA['TINYMCE_LANG'] = $this->lang_short;
|
||||||
|
// include flags
|
||||||
|
$this->DATA['USE_TINY_MCE'] = $this->USE_TINY_MCE;
|
||||||
|
// debug data, if DEBUG flag is on, this data is print out
|
||||||
|
$this->DEBUG_DATA['DEBUG'] = $this->DEBUG_TMPL;
|
||||||
|
} else {
|
||||||
|
$this->HEADER['STYLESHEET'] = $this->FRONTEND_STYLESHEET ? $this->FRONTEND_STYLESHEET : STYLESHEET;
|
||||||
|
$this->HEADER['JAVASCRIPT'] = $this->FRONTEND_JAVASCRIPT ? $this->FRONTEND_JAVASCRIPT : JAVASCRIPT;
|
||||||
|
}
|
||||||
|
// html title
|
||||||
|
// set local page title
|
||||||
|
$this->HEADER['HTML_TITLE'] = !$this->L_TITLE ?
|
||||||
|
ucfirst(str_replace('_', ' ', \CoreLibs\Get\System::getPageName(1)))
|
||||||
|
. (defined('G_TITLE') ? ' - ' . $this->l10n->__(G_TITLE) : '') :
|
||||||
|
$this->l10n->__($this->L_TITLE);
|
||||||
|
|
||||||
|
// LANG
|
||||||
|
$this->DATA['LANG'] = $this->lang;
|
||||||
|
// include flags
|
||||||
|
$this->DATA['JS_DATEPICKR'] = $this->JS_DATEPICKR;
|
||||||
|
$this->DATA['JS_FLATPICKR'] = $this->JS_FLATPICKR;
|
||||||
|
$this->DATA['JS_FILE_UPLOADER'] = $this->JS_FILE_UPLOADER;
|
||||||
|
// user name
|
||||||
|
$this->DATA['USER_NAME'] = !empty($_SESSION['USER_NAME']) ? $_SESSION['USER_NAME'] : '';
|
||||||
|
// the template part to include into the body
|
||||||
|
$this->DATA['TEMPLATE_NAME'] = $this->TEMPLATE_NAME;
|
||||||
|
$this->DATA['CONTENT_INCLUDE'] = $this->CONTENT_INCLUDE;
|
||||||
|
$this->DATA['TEMPLATE_TRANSLATE'] = $this->TEMPLATE_TRANSLATE ?? null;
|
||||||
|
$this->DATA['JS_TRANSLATE'] = $this->JS_TRANSLATE ?? null;
|
||||||
|
$this->DATA['PAGE_FILE_NAME'] = str_replace('.php', '', $this->page_name) . '.tpl';
|
||||||
|
// render page
|
||||||
|
$this->renderSmarty();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* merge outside object HEADER/DATA/DEBUG_DATA vars into the smarty class
|
||||||
|
*
|
||||||
|
* @param object $cms object that has header/data/debug_data
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function mergeCmsSmartyVars(object $cms): void
|
||||||
|
{
|
||||||
|
// array merge HEADER, DATA, DEBUG DATA
|
||||||
|
foreach (['HEADER', 'DATA', 'DEBUG_DATA'] as $ext_smarty) {
|
||||||
|
if (
|
||||||
|
isset($cms->{$ext_smarty}) &&
|
||||||
|
is_array($cms->{$ext_smarty})
|
||||||
|
) {
|
||||||
|
$this->{$ext_smarty} = array_merge($this->{$ext_smarty}, $cms->{$ext_smarty});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* render smarty data (can be called sepparate)
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function renderSmarty(): void
|
||||||
|
{
|
||||||
|
// create main data array
|
||||||
|
$this->CONTENT_DATA = array_merge($this->HEADER, $this->DATA, $this->DEBUG_DATA);
|
||||||
|
// data is 1:1 mapping (all vars, values, etc)
|
||||||
|
foreach ($this->CONTENT_DATA as $key => $value) {
|
||||||
|
$this->assign($key, $value);
|
||||||
|
}
|
||||||
|
if (is_dir(BASE . TEMPLATES_C)) {
|
||||||
|
$this->setCompileDir(BASE . TEMPLATES_C);
|
||||||
|
}
|
||||||
|
if (is_dir(BASE . CACHE)) {
|
||||||
|
$this->setCacheDir(BASE . CACHE);
|
||||||
|
}
|
||||||
|
$this->display(
|
||||||
|
$this->MASTER_TEMPLATE_NAME,
|
||||||
|
$this->CACHE_ID . ($this->CACHE_ID ? '_' : '') . $this->lang,
|
||||||
|
$this->COMPILE_ID . ($this->COMPILE_ID ? '_' : '') . $this->lang
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
Symlink
+1
@@ -0,0 +1 @@
|
|||||||
|
smarty-4.3.0/libs/
|
||||||
@@ -0,0 +1,111 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty Autoloader
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
if (!defined('SMARTY_HELPER_FUNCTIONS_LOADED')) {
|
||||||
|
include __DIR__ . '/functions.php';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty Autoloader
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @author Uwe Tews
|
||||||
|
* Usage:
|
||||||
|
* require_once '...path/Autoloader.php';
|
||||||
|
* Smarty_Autoloader::register();
|
||||||
|
* or
|
||||||
|
* include '...path/bootstrap.php';
|
||||||
|
*
|
||||||
|
* $smarty = new Smarty();
|
||||||
|
*/
|
||||||
|
class Smarty_Autoloader
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Filepath to Smarty root
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
public static $SMARTY_DIR = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filepath to Smarty internal plugins
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
public static $SMARTY_SYSPLUGINS_DIR = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Array with Smarty core classes and their filename
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
public static $rootClasses = array('smarty' => 'Smarty.class.php');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers Smarty_Autoloader backward compatible to older installations.
|
||||||
|
*
|
||||||
|
* @param bool $prepend Whether to prepend the autoloader or not.
|
||||||
|
*/
|
||||||
|
public static function registerBC($prepend = false)
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* register the class autoloader
|
||||||
|
*/
|
||||||
|
if (!defined('SMARTY_SPL_AUTOLOAD')) {
|
||||||
|
define('SMARTY_SPL_AUTOLOAD', 0);
|
||||||
|
}
|
||||||
|
if (SMARTY_SPL_AUTOLOAD
|
||||||
|
&& set_include_path(get_include_path() . PATH_SEPARATOR . SMARTY_SYSPLUGINS_DIR) !== false
|
||||||
|
) {
|
||||||
|
$registeredAutoLoadFunctions = spl_autoload_functions();
|
||||||
|
if (!isset($registeredAutoLoadFunctions[ 'spl_autoload' ])) {
|
||||||
|
spl_autoload_register();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
self::register($prepend);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers Smarty_Autoloader as an SPL autoloader.
|
||||||
|
*
|
||||||
|
* @param bool $prepend Whether to prepend the autoloader or not.
|
||||||
|
*/
|
||||||
|
public static function register($prepend = false)
|
||||||
|
{
|
||||||
|
self::$SMARTY_DIR = defined('SMARTY_DIR') ? SMARTY_DIR : __DIR__ . DIRECTORY_SEPARATOR;
|
||||||
|
self::$SMARTY_SYSPLUGINS_DIR = defined('SMARTY_SYSPLUGINS_DIR') ? SMARTY_SYSPLUGINS_DIR :
|
||||||
|
self::$SMARTY_DIR . 'sysplugins' . DIRECTORY_SEPARATOR;
|
||||||
|
spl_autoload_register(array(__CLASS__, 'autoload'), true, $prepend);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles auto loading of classes.
|
||||||
|
*
|
||||||
|
* @param string $class A class name.
|
||||||
|
*/
|
||||||
|
public static function autoload($class)
|
||||||
|
{
|
||||||
|
if ($class[ 0 ] !== 'S' || strpos($class, 'Smarty') !== 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$_class = smarty_strtolower_ascii($class);
|
||||||
|
if (isset(self::$rootClasses[ $_class ])) {
|
||||||
|
$file = self::$SMARTY_DIR . self::$rootClasses[ $_class ];
|
||||||
|
if (is_file($file)) {
|
||||||
|
include $file;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$file = self::$SMARTY_SYSPLUGINS_DIR . $_class . '.php';
|
||||||
|
if (is_file($file)) {
|
||||||
|
include $file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,16 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This file is part of the Smarty package.
|
||||||
|
*
|
||||||
|
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Load and register Smarty Autoloader
|
||||||
|
*/
|
||||||
|
if (!class_exists('Smarty_Autoloader')) {
|
||||||
|
include __DIR__ . '/Autoloader.php';
|
||||||
|
}
|
||||||
|
Smarty_Autoloader::register(true);
|
||||||
@@ -0,0 +1,175 @@
|
|||||||
|
{capture name='_smarty_debug' assign=debug_output}
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<title>Smarty Debug Console</title>
|
||||||
|
<style>
|
||||||
|
{literal}
|
||||||
|
body, h1, h2, h3, td, th, p {
|
||||||
|
font-family: sans-serif;
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 0.9em;
|
||||||
|
margin: 1px;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
margin: 0;
|
||||||
|
text-align: left;
|
||||||
|
padding: 2px;
|
||||||
|
background-color: #f0c040;
|
||||||
|
color: black;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 1.2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
background-color: #9B410E;
|
||||||
|
color: white;
|
||||||
|
text-align: left;
|
||||||
|
font-weight: bold;
|
||||||
|
padding: 2px;
|
||||||
|
border-top: 1px solid black;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
text-align: left;
|
||||||
|
font-weight: bold;
|
||||||
|
color: black;
|
||||||
|
font-size: 0.7em;
|
||||||
|
padding: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
background: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
p, table, div {
|
||||||
|
background: #f0ead8;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin: 0;
|
||||||
|
font-style: italic;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
th, td {
|
||||||
|
font-family: monospace;
|
||||||
|
vertical-align: top;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
td {
|
||||||
|
color: green;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr:nth-child(odd) {
|
||||||
|
background-color: #eeeeee;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr:nth-child(even) {
|
||||||
|
background-color: #fafafa;
|
||||||
|
}
|
||||||
|
|
||||||
|
.exectime {
|
||||||
|
font-size: 0.8em;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
#bold div {
|
||||||
|
color: black;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
#blue h3 {
|
||||||
|
color: blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
#normal div {
|
||||||
|
color: black;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
#table_assigned_vars th {
|
||||||
|
color: blue;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
#table_config_vars th {
|
||||||
|
color: maroon;
|
||||||
|
}
|
||||||
|
{/literal}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h1>Smarty {Smarty::SMARTY_VERSION} Debug Console
|
||||||
|
- {if isset($template_name)}{$template_name|debug_print_var nofilter} {/if}{if !empty($template_data)}Total Time {$execution_time|string_format:"%.5f"}{/if}</h1>
|
||||||
|
|
||||||
|
{if !empty($template_data)}
|
||||||
|
<h2>included templates & config files (load time in seconds)</h2>
|
||||||
|
<div>
|
||||||
|
{foreach $template_data as $template}
|
||||||
|
<span style="color: brown;">{$template.name}</span>
|
||||||
|
<br> <span class="exectime">
|
||||||
|
(compile {$template['compile_time']|string_format:"%.5f"}) (render {$template['render_time']|string_format:"%.5f"}) (cache {$template['cache_time']|string_format:"%.5f"})
|
||||||
|
</span>
|
||||||
|
<br>
|
||||||
|
{/foreach}
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
<h2>assigned template variables</h2>
|
||||||
|
|
||||||
|
<table id="table_assigned_vars">
|
||||||
|
{foreach $assigned_vars as $vars}
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<h3 style="color: blue;">${$vars@key}</h3>
|
||||||
|
{if isset($vars['nocache'])}<strong>Nocache</strong><br>{/if}
|
||||||
|
{if isset($vars['scope'])}<strong>Origin:</strong> {$vars['scope']|debug_print_var nofilter}{/if}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<h3>Value</h3>
|
||||||
|
{$vars['value']|debug_print_var:10:80 nofilter}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{if isset($vars['attributes'])}
|
||||||
|
<h3>Attributes</h3>
|
||||||
|
{$vars['attributes']|debug_print_var nofilter}
|
||||||
|
{/if}
|
||||||
|
</td>
|
||||||
|
{/foreach}
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h2>assigned config file variables</h2>
|
||||||
|
|
||||||
|
<table id="table_config_vars">
|
||||||
|
{foreach $config_vars as $vars}
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<h3 style="color: blue;">#{$vars@key}#</h3>
|
||||||
|
{if isset($vars['scope'])}<strong>Origin:</strong> {$vars['scope']|debug_print_var nofilter}{/if}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{$vars['value']|debug_print_var:10:80 nofilter}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{/foreach}
|
||||||
|
|
||||||
|
</table>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
{/capture}
|
||||||
|
<script type="text/javascript">
|
||||||
|
{$id = '__Smarty__'}
|
||||||
|
{if $display_mode}{$id = "$offset$template_name"|md5}{/if}
|
||||||
|
_smarty_console = window.open("", "console{$id}", "width=1024,height=600,left={$offset},top={$offset},resizable,scrollbars=yes");
|
||||||
|
_smarty_console.document.write("{$debug_output|escape:'javascript' nofilter}");
|
||||||
|
_smarty_console.document.close();
|
||||||
|
</script>
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This file is part of the Smarty package.
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Registers some helper/polyfill functions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const SMARTY_HELPER_FUNCTIONS_LOADED = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts the first characters in $string to uppercase (A-Z) if it is an ASCII lowercase character (a-z).
|
||||||
|
*
|
||||||
|
* May not be required when running PHP8.2+: https://wiki.php.net/rfc/strtolower-ascii
|
||||||
|
*
|
||||||
|
* @param $string
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function smarty_ucfirst_ascii($string): string {
|
||||||
|
return smarty_strtoupper_ascii(substr($string, 0, 1)) . substr($string, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts all uppercase ASCII characters (A-Z) in $string to lowercase (a-z).
|
||||||
|
*
|
||||||
|
* May not be required when running PHP8.2+: https://wiki.php.net/rfc/strtolower-ascii
|
||||||
|
*
|
||||||
|
* @param $string
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function smarty_strtolower_ascii($string): string {
|
||||||
|
return strtr($string, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts all lowercase ASCII characters (a-z) in $string to uppercase (A-Z).
|
||||||
|
*
|
||||||
|
* May not be required when running PHP8.2+: https://wiki.php.net/rfc/strtolower-ascii
|
||||||
|
*
|
||||||
|
* @param $string
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function smarty_strtoupper_ascii($string): string {
|
||||||
|
return strtr($string, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ');
|
||||||
|
}
|
||||||
@@ -0,0 +1,211 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* smarty-gettext.php - Gettext support for smarty
|
||||||
|
*
|
||||||
|
* To register as a smarty block function named 't', use:
|
||||||
|
* $smarty->register_block('t', 'smarty_translate');
|
||||||
|
*
|
||||||
|
* NOTE: native php support for conext sensitive does not exist
|
||||||
|
* Those jumps are disabled
|
||||||
|
*
|
||||||
|
* @package smarty-gettext
|
||||||
|
* @version $Id: block.t.php 4738 2022-05-06 01:28:48Z clemens $
|
||||||
|
* @link http://smarty-gettext.sf.net/
|
||||||
|
* @author Sagi Bashari <sagi@boom.org.il>
|
||||||
|
* @copyright 2004 Sagi Bashari
|
||||||
|
* @copyright Elan Ruusamäe
|
||||||
|
* @copyright Clemens Schwaighofer
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replaces arguments in a string with their values.
|
||||||
|
* Arguments are represented by % followed by their number.
|
||||||
|
*
|
||||||
|
* @param string $str Source string
|
||||||
|
* @param mixed mixed Arguments, can be passed in an array or through single variables.
|
||||||
|
* @return string Modified string
|
||||||
|
*/
|
||||||
|
function smarty_gettext_strarg($str/*, $varargs... */)
|
||||||
|
{
|
||||||
|
$tr = [];
|
||||||
|
$p = 0;
|
||||||
|
|
||||||
|
$nargs = func_num_args();
|
||||||
|
for ($i = 1; $i < $nargs; $i++) {
|
||||||
|
$arg = func_get_arg($i);
|
||||||
|
|
||||||
|
if (is_array($arg)) {
|
||||||
|
foreach ($arg as $aarg) {
|
||||||
|
$tr['%' . ++$p] = $aarg;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$tr['%' . ++$p] = $arg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return strtr($str, $tr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty block function, provides gettext support for smarty.
|
||||||
|
*
|
||||||
|
* The block content is the text that should be translated.
|
||||||
|
*
|
||||||
|
* Any parameter that is sent to the function will be represented as %n in the translation text,
|
||||||
|
* where n is 1 for the first parameter. The following parameters are reserved:
|
||||||
|
* - escape - sets escape mode:
|
||||||
|
* - 'html' for HTML escaping, this is the default.
|
||||||
|
* - 'js' for javascript escaping.
|
||||||
|
* - 'url' for url escaping.
|
||||||
|
* - 'no'/'off'/0 - turns off escaping
|
||||||
|
* - plural - The plural version of the text (2nd parameter of ngettext())
|
||||||
|
* - count - The item count for plural mode (3rd parameter of ngettext())
|
||||||
|
* - domain - Textdomain to be used, default if skipped (dgettext() instead of gettext())
|
||||||
|
* - context - gettext context. reserved for future use.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
// cs modified: __ calls instead of direct gettext calls
|
||||||
|
|
||||||
|
function smarty_block_t($params, $text)
|
||||||
|
{
|
||||||
|
if (!isset($text)) {
|
||||||
|
return $text;
|
||||||
|
}
|
||||||
|
|
||||||
|
// set escape mode, default html escape
|
||||||
|
if (isset($params['escape'])) {
|
||||||
|
$escape = $params['escape'];
|
||||||
|
unset($params['escape']);
|
||||||
|
} else {
|
||||||
|
$escape = 'html';
|
||||||
|
}
|
||||||
|
|
||||||
|
// set plural parameters 'plural' and 'count'.
|
||||||
|
if (isset($params['plural'])) {
|
||||||
|
$plural = $params['plural'];
|
||||||
|
unset($params['plural']);
|
||||||
|
|
||||||
|
// set count
|
||||||
|
if (isset($params['count'])) {
|
||||||
|
$count = $params['count'];
|
||||||
|
unset($params['count']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// get domain param
|
||||||
|
if (isset($params['domain'])) {
|
||||||
|
$domain = $params['domain'];
|
||||||
|
unset($params['domain']);
|
||||||
|
} else {
|
||||||
|
$domain = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// get context param
|
||||||
|
if (isset($params['context'])) {
|
||||||
|
$context = $params['context'];
|
||||||
|
unset($params['context']);
|
||||||
|
} else {
|
||||||
|
$context = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// use plural if required parameters are set
|
||||||
|
if (isset($count) && isset($plural)) {
|
||||||
|
if (isset($domain) && isset($context)) {
|
||||||
|
if (is_callable('_dnpgettext')) {
|
||||||
|
$text = _dnpgettext($domain, $context, $text, $plural, $count);
|
||||||
|
}/* elseif (is_callable('dnpgettext')) {
|
||||||
|
$text = dnpgettext($domain, $context, $text, $plural, $count);
|
||||||
|
} */
|
||||||
|
} elseif (isset($domain)) {
|
||||||
|
if (is_callable('_dngettext')) {
|
||||||
|
$text = _dngettext($domain, $text, $plural, $count);
|
||||||
|
} elseif (is_callable('dngettext')) {
|
||||||
|
$text = dngettext($domain, $text, $plural, $count);
|
||||||
|
}
|
||||||
|
} elseif (isset($context)) {
|
||||||
|
if (is_callable('_npgettext')) {
|
||||||
|
$text = _npgettext($context, $text, $plural, $count);
|
||||||
|
}/* elseif (is_callable('npgettext')) {
|
||||||
|
$text = npgettext($context, $text, $plural, $count);
|
||||||
|
} */
|
||||||
|
} else {
|
||||||
|
if (is_callable('_ngettext')) {
|
||||||
|
$text = _ngettext($text, $plural, $count);
|
||||||
|
} elseif (is_callable('ngettext')) {
|
||||||
|
$text = ngettext($text, $plural, $count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else { // use normal
|
||||||
|
if (isset($domain) && isset($context)) {
|
||||||
|
if (is_callable('_dpgettext')) {
|
||||||
|
$text = _dpgettext($domain, $context, $text);
|
||||||
|
}/* elseif (is_callable('dpgettext')) {
|
||||||
|
$text = dpgettext($domain, $context, $text);
|
||||||
|
} */
|
||||||
|
} elseif (isset($domain)) {
|
||||||
|
if (is_callable('_dgettext')) {
|
||||||
|
$text = _dgettext($domain, $text);
|
||||||
|
} elseif (is_callable('dpgettext')) {
|
||||||
|
$text = dgettext($domain, $text);
|
||||||
|
}
|
||||||
|
} elseif (isset($context)) {
|
||||||
|
if (is_callable('_pgettext')) {
|
||||||
|
$text = _pgettext($context, $text);
|
||||||
|
}/* elseif (is_callable('pgettext')) {
|
||||||
|
$text = pgettext($context, $text);
|
||||||
|
} */
|
||||||
|
} else {
|
||||||
|
if (is_callable('_gettext')) {
|
||||||
|
$text = _gettext($text);
|
||||||
|
} elseif (is_callable('gettext')) {
|
||||||
|
$text = gettext($text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// run strarg if there are parameters
|
||||||
|
if (count($params)) {
|
||||||
|
$text = smarty_gettext_strarg($text, $params);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ($escape) {
|
||||||
|
case 'html':
|
||||||
|
// default
|
||||||
|
$text = nl2br(htmlspecialchars($text));
|
||||||
|
break;
|
||||||
|
case 'javascript':
|
||||||
|
case 'js':
|
||||||
|
// javascript escape
|
||||||
|
$text = strtr(
|
||||||
|
$text,
|
||||||
|
[
|
||||||
|
'\\' => '\\\\',
|
||||||
|
"'" => "\\'",
|
||||||
|
'"' => '\\"',
|
||||||
|
"\r" => '\\r',
|
||||||
|
"\n" => '\\n',
|
||||||
|
'</' => '<\/'
|
||||||
|
]
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case 'url':
|
||||||
|
// url escape
|
||||||
|
$text = urlencode($text);
|
||||||
|
break;
|
||||||
|
// below is a list for explicit OFF
|
||||||
|
case 'no':
|
||||||
|
case 'off':
|
||||||
|
case 'false':
|
||||||
|
case '0':
|
||||||
|
case 0:
|
||||||
|
// explicit OFF
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $text;
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -0,0 +1,121 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin to format text blocks
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsBlock
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Smarty {textformat}{/textformat} block plugin
|
||||||
|
* Type: block function
|
||||||
|
* Name: textformat
|
||||||
|
* Purpose: format text a certain way with preset styles
|
||||||
|
* or custom wrap/indent settings
|
||||||
|
* Params:
|
||||||
|
*
|
||||||
|
* - style - string (email)
|
||||||
|
* - indent - integer (0)
|
||||||
|
* - wrap - integer (80)
|
||||||
|
* - wrap_char - string ("\n")
|
||||||
|
* - indent_char - string (" ")
|
||||||
|
* - wrap_boundary - boolean (true)
|
||||||
|
*
|
||||||
|
* @link https://www.smarty.net/manual/en/language.function.textformat.php {textformat}
|
||||||
|
* (Smarty online manual)
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
* @param string $content contents of the block
|
||||||
|
* @param Smarty_Internal_Template $template template object
|
||||||
|
* @param boolean &$repeat repeat flag
|
||||||
|
*
|
||||||
|
* @return string content re-formatted
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
* @throws \SmartyException
|
||||||
|
*/
|
||||||
|
function smarty_block_textformat($params, $content, Smarty_Internal_Template $template, &$repeat)
|
||||||
|
{
|
||||||
|
if (is_null($content)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (Smarty::$_MBSTRING) {
|
||||||
|
$template->_checkPlugins(
|
||||||
|
array(
|
||||||
|
array(
|
||||||
|
'function' => 'smarty_modifier_mb_wordwrap',
|
||||||
|
'file' => SMARTY_PLUGINS_DIR . 'modifier.mb_wordwrap.php'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$style = null;
|
||||||
|
$indent = 0;
|
||||||
|
$indent_first = 0;
|
||||||
|
$indent_char = ' ';
|
||||||
|
$wrap = 80;
|
||||||
|
$wrap_char = "\n";
|
||||||
|
$wrap_cut = false;
|
||||||
|
$assign = null;
|
||||||
|
foreach ($params as $_key => $_val) {
|
||||||
|
switch ($_key) {
|
||||||
|
case 'style':
|
||||||
|
case 'indent_char':
|
||||||
|
case 'wrap_char':
|
||||||
|
case 'assign':
|
||||||
|
$$_key = (string)$_val;
|
||||||
|
break;
|
||||||
|
case 'indent':
|
||||||
|
case 'indent_first':
|
||||||
|
case 'wrap':
|
||||||
|
$$_key = (int)$_val;
|
||||||
|
break;
|
||||||
|
case 'wrap_cut':
|
||||||
|
$$_key = (bool)$_val;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
trigger_error("textformat: unknown attribute '{$_key}'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($style === 'email') {
|
||||||
|
$wrap = 72;
|
||||||
|
}
|
||||||
|
// split into paragraphs
|
||||||
|
$_paragraphs = preg_split('![\r\n]{2}!', $content);
|
||||||
|
foreach ($_paragraphs as &$_paragraph) {
|
||||||
|
if (!$_paragraph) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// convert mult. spaces & special chars to single space
|
||||||
|
$_paragraph =
|
||||||
|
preg_replace(
|
||||||
|
array(
|
||||||
|
'!\s+!' . Smarty::$_UTF8_MODIFIER,
|
||||||
|
'!(^\s+)|(\s+$)!' . Smarty::$_UTF8_MODIFIER
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
' ',
|
||||||
|
''
|
||||||
|
),
|
||||||
|
$_paragraph
|
||||||
|
);
|
||||||
|
// indent first line
|
||||||
|
if ($indent_first > 0) {
|
||||||
|
$_paragraph = str_repeat($indent_char, $indent_first) . $_paragraph;
|
||||||
|
}
|
||||||
|
// wordwrap sentences
|
||||||
|
if (Smarty::$_MBSTRING) {
|
||||||
|
$_paragraph = smarty_modifier_mb_wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut);
|
||||||
|
} else {
|
||||||
|
$_paragraph = wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut);
|
||||||
|
}
|
||||||
|
// indent lines
|
||||||
|
if ($indent > 0) {
|
||||||
|
$_paragraph = preg_replace('!^!m', str_repeat($indent_char, $indent), $_paragraph);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$_output = implode($wrap_char . $wrap_char, $_paragraphs);
|
||||||
|
if ($assign) {
|
||||||
|
$template->assign($assign, $_output);
|
||||||
|
} else {
|
||||||
|
return $_output;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsFunction
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Smarty {counter} function plugin
|
||||||
|
* Type: function
|
||||||
|
* Name: counter
|
||||||
|
* Purpose: print out a counter value
|
||||||
|
*
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
* @link https://www.smarty.net/manual/en/language.function.counter.php {counter}
|
||||||
|
* (Smarty online manual)
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
* @param Smarty_Internal_Template $template template object
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
function smarty_function_counter($params, $template)
|
||||||
|
{
|
||||||
|
static $counters = array();
|
||||||
|
$name = (isset($params[ 'name' ])) ? $params[ 'name' ] : 'default';
|
||||||
|
if (!isset($counters[ $name ])) {
|
||||||
|
$counters[ $name ] = array('start' => 1, 'skip' => 1, 'direction' => 'up', 'count' => 1);
|
||||||
|
}
|
||||||
|
$counter =& $counters[ $name ];
|
||||||
|
if (isset($params[ 'start' ])) {
|
||||||
|
$counter[ 'start' ] = $counter[ 'count' ] = (int)$params[ 'start' ];
|
||||||
|
}
|
||||||
|
if (!empty($params[ 'assign' ])) {
|
||||||
|
$counter[ 'assign' ] = $params[ 'assign' ];
|
||||||
|
}
|
||||||
|
if (isset($counter[ 'assign' ])) {
|
||||||
|
$template->assign($counter[ 'assign' ], $counter[ 'count' ]);
|
||||||
|
}
|
||||||
|
if (isset($params[ 'print' ])) {
|
||||||
|
$print = (bool)$params[ 'print' ];
|
||||||
|
} else {
|
||||||
|
$print = empty($counter[ 'assign' ]);
|
||||||
|
}
|
||||||
|
if ($print) {
|
||||||
|
$retval = $counter[ 'count' ];
|
||||||
|
} else {
|
||||||
|
$retval = null;
|
||||||
|
}
|
||||||
|
if (isset($params[ 'skip' ])) {
|
||||||
|
$counter[ 'skip' ] = $params[ 'skip' ];
|
||||||
|
}
|
||||||
|
if (isset($params[ 'direction' ])) {
|
||||||
|
$counter[ 'direction' ] = $params[ 'direction' ];
|
||||||
|
}
|
||||||
|
if ($counter[ 'direction' ] === 'down') {
|
||||||
|
$counter[ 'count' ] -= $counter[ 'skip' ];
|
||||||
|
} else {
|
||||||
|
$counter[ 'count' ] += $counter[ 'skip' ];
|
||||||
|
}
|
||||||
|
return $retval;
|
||||||
|
}
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsFunction
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Smarty {cycle} function plugin
|
||||||
|
* Type: function
|
||||||
|
* Name: cycle
|
||||||
|
* Date: May 3, 2002
|
||||||
|
* Purpose: cycle through given values
|
||||||
|
* Params:
|
||||||
|
*
|
||||||
|
* - name - name of cycle (optional)
|
||||||
|
* - values - comma separated list of values to cycle, or an array of values to cycle
|
||||||
|
* (this can be left out for subsequent calls)
|
||||||
|
* - reset - boolean - resets given var to true
|
||||||
|
* - print - boolean - print var or not. default is true
|
||||||
|
* - advance - boolean - whether or not to advance the cycle
|
||||||
|
* - delimiter - the value delimiter, default is ","
|
||||||
|
* - assign - boolean, assigns to template var instead of printed.
|
||||||
|
*
|
||||||
|
* Examples:
|
||||||
|
*
|
||||||
|
* {cycle values="#eeeeee,#d0d0d0d"}
|
||||||
|
* {cycle name=row values="one,two,three" reset=true}
|
||||||
|
* {cycle name=row}
|
||||||
|
*
|
||||||
|
* @link https://www.smarty.net/manual/en/language.function.cycle.php {cycle}
|
||||||
|
* (Smarty online manual)
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
* @author credit to Mark Priatel <mpriatel@rogers.com>
|
||||||
|
* @author credit to Gerard <gerard@interfold.com>
|
||||||
|
* @author credit to Jason Sweat <jsweat_php@yahoo.com>
|
||||||
|
* @version 1.3
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
* @param Smarty_Internal_Template $template template object
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
function smarty_function_cycle($params, $template)
|
||||||
|
{
|
||||||
|
static $cycle_vars;
|
||||||
|
$name = (empty($params[ 'name' ])) ? 'default' : $params[ 'name' ];
|
||||||
|
$print = (isset($params[ 'print' ])) ? (bool)$params[ 'print' ] : true;
|
||||||
|
$advance = (isset($params[ 'advance' ])) ? (bool)$params[ 'advance' ] : true;
|
||||||
|
$reset = (isset($params[ 'reset' ])) ? (bool)$params[ 'reset' ] : false;
|
||||||
|
if (!isset($params[ 'values' ])) {
|
||||||
|
if (!isset($cycle_vars[ $name ][ 'values' ])) {
|
||||||
|
trigger_error('cycle: missing \'values\' parameter');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (isset($cycle_vars[ $name ][ 'values' ]) && $cycle_vars[ $name ][ 'values' ] !== $params[ 'values' ]) {
|
||||||
|
$cycle_vars[ $name ][ 'index' ] = 0;
|
||||||
|
}
|
||||||
|
$cycle_vars[ $name ][ 'values' ] = $params[ 'values' ];
|
||||||
|
}
|
||||||
|
if (isset($params[ 'delimiter' ])) {
|
||||||
|
$cycle_vars[ $name ][ 'delimiter' ] = $params[ 'delimiter' ];
|
||||||
|
} elseif (!isset($cycle_vars[ $name ][ 'delimiter' ])) {
|
||||||
|
$cycle_vars[ $name ][ 'delimiter' ] = ',';
|
||||||
|
}
|
||||||
|
if (is_array($cycle_vars[ $name ][ 'values' ])) {
|
||||||
|
$cycle_array = $cycle_vars[ $name ][ 'values' ];
|
||||||
|
} else {
|
||||||
|
$cycle_array = explode($cycle_vars[ $name ][ 'delimiter' ], $cycle_vars[ $name ][ 'values' ]);
|
||||||
|
}
|
||||||
|
if (!isset($cycle_vars[ $name ][ 'index' ]) || $reset) {
|
||||||
|
$cycle_vars[ $name ][ 'index' ] = 0;
|
||||||
|
}
|
||||||
|
if (isset($params[ 'assign' ])) {
|
||||||
|
$print = false;
|
||||||
|
$template->assign($params[ 'assign' ], $cycle_array[ $cycle_vars[ $name ][ 'index' ] ]);
|
||||||
|
}
|
||||||
|
if ($print) {
|
||||||
|
$retval = $cycle_array[ $cycle_vars[ $name ][ 'index' ] ];
|
||||||
|
} else {
|
||||||
|
$retval = null;
|
||||||
|
}
|
||||||
|
if ($advance) {
|
||||||
|
if ($cycle_vars[ $name ][ 'index' ] >= count($cycle_array) - 1) {
|
||||||
|
$cycle_vars[ $name ][ 'index' ] = 0;
|
||||||
|
} else {
|
||||||
|
$cycle_vars[ $name ][ 'index' ]++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $retval;
|
||||||
|
}
|
||||||
@@ -0,0 +1,204 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsFunction
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Smarty {fetch} plugin
|
||||||
|
* Type: function
|
||||||
|
* Name: fetch
|
||||||
|
* Purpose: fetch file, web or ftp data and display results
|
||||||
|
*
|
||||||
|
* @link https://www.smarty.net/manual/en/language.function.fetch.php {fetch}
|
||||||
|
* (Smarty online manual)
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
* @param Smarty_Internal_Template $template template object
|
||||||
|
*
|
||||||
|
* @throws SmartyException
|
||||||
|
* @return string|null if the assign parameter is passed, Smarty assigns the result to a template variable
|
||||||
|
*/
|
||||||
|
function smarty_function_fetch($params, $template)
|
||||||
|
{
|
||||||
|
if (empty($params[ 'file' ])) {
|
||||||
|
trigger_error('[plugin] fetch parameter \'file\' cannot be empty', E_USER_NOTICE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// strip file protocol
|
||||||
|
if (stripos($params[ 'file' ], 'file://') === 0) {
|
||||||
|
$params[ 'file' ] = substr($params[ 'file' ], 7);
|
||||||
|
}
|
||||||
|
$protocol = strpos($params[ 'file' ], '://');
|
||||||
|
if ($protocol !== false) {
|
||||||
|
$protocol = strtolower(substr($params[ 'file' ], 0, $protocol));
|
||||||
|
}
|
||||||
|
if (isset($template->smarty->security_policy)) {
|
||||||
|
if ($protocol) {
|
||||||
|
// remote resource (or php stream, …)
|
||||||
|
if (!$template->smarty->security_policy->isTrustedUri($params[ 'file' ])) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// local file
|
||||||
|
if (!$template->smarty->security_policy->isTrustedResourceDir($params[ 'file' ])) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$content = '';
|
||||||
|
if ($protocol === 'http') {
|
||||||
|
// http fetch
|
||||||
|
if ($uri_parts = parse_url($params[ 'file' ])) {
|
||||||
|
// set defaults
|
||||||
|
$host = $server_name = $uri_parts[ 'host' ];
|
||||||
|
$timeout = 30;
|
||||||
|
$accept = 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*';
|
||||||
|
$agent = 'Smarty Template Engine ' . Smarty::SMARTY_VERSION;
|
||||||
|
$referer = '';
|
||||||
|
$uri = !empty($uri_parts[ 'path' ]) ? $uri_parts[ 'path' ] : '/';
|
||||||
|
$uri .= !empty($uri_parts[ 'query' ]) ? '?' . $uri_parts[ 'query' ] : '';
|
||||||
|
$_is_proxy = false;
|
||||||
|
if (empty($uri_parts[ 'port' ])) {
|
||||||
|
$port = 80;
|
||||||
|
} else {
|
||||||
|
$port = $uri_parts[ 'port' ];
|
||||||
|
}
|
||||||
|
if (!empty($uri_parts[ 'user' ])) {
|
||||||
|
$user = $uri_parts[ 'user' ];
|
||||||
|
}
|
||||||
|
if (!empty($uri_parts[ 'pass' ])) {
|
||||||
|
$pass = $uri_parts[ 'pass' ];
|
||||||
|
}
|
||||||
|
// loop through parameters, setup headers
|
||||||
|
foreach ($params as $param_key => $param_value) {
|
||||||
|
switch ($param_key) {
|
||||||
|
case 'file':
|
||||||
|
case 'assign':
|
||||||
|
case 'assign_headers':
|
||||||
|
break;
|
||||||
|
case 'user':
|
||||||
|
if (!empty($param_value)) {
|
||||||
|
$user = $param_value;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'pass':
|
||||||
|
if (!empty($param_value)) {
|
||||||
|
$pass = $param_value;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'accept':
|
||||||
|
if (!empty($param_value)) {
|
||||||
|
$accept = $param_value;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'header':
|
||||||
|
if (!empty($param_value)) {
|
||||||
|
if (!preg_match('![\w\d-]+: .+!', $param_value)) {
|
||||||
|
trigger_error("[plugin] invalid header format '{$param_value}'", E_USER_NOTICE);
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
$extra_headers[] = $param_value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'proxy_host':
|
||||||
|
if (!empty($param_value)) {
|
||||||
|
$proxy_host = $param_value;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'proxy_port':
|
||||||
|
if (!preg_match('!\D!', $param_value)) {
|
||||||
|
$proxy_port = (int)$param_value;
|
||||||
|
} else {
|
||||||
|
trigger_error("[plugin] invalid value for attribute '{$param_key }'", E_USER_NOTICE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'agent':
|
||||||
|
if (!empty($param_value)) {
|
||||||
|
$agent = $param_value;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'referer':
|
||||||
|
if (!empty($param_value)) {
|
||||||
|
$referer = $param_value;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'timeout':
|
||||||
|
if (!preg_match('!\D!', $param_value)) {
|
||||||
|
$timeout = (int)$param_value;
|
||||||
|
} else {
|
||||||
|
trigger_error("[plugin] invalid value for attribute '{$param_key}'", E_USER_NOTICE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
trigger_error("[plugin] unrecognized attribute '{$param_key}'", E_USER_NOTICE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!empty($proxy_host) && !empty($proxy_port)) {
|
||||||
|
$_is_proxy = true;
|
||||||
|
$fp = fsockopen($proxy_host, $proxy_port, $errno, $errstr, $timeout);
|
||||||
|
} else {
|
||||||
|
$fp = fsockopen($server_name, $port, $errno, $errstr, $timeout);
|
||||||
|
}
|
||||||
|
if (!$fp) {
|
||||||
|
trigger_error("[plugin] unable to fetch: $errstr ($errno)", E_USER_NOTICE);
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
if ($_is_proxy) {
|
||||||
|
fputs($fp, 'GET ' . $params[ 'file' ] . " HTTP/1.0\r\n");
|
||||||
|
} else {
|
||||||
|
fputs($fp, "GET $uri HTTP/1.0\r\n");
|
||||||
|
}
|
||||||
|
if (!empty($host)) {
|
||||||
|
fputs($fp, "Host: $host\r\n");
|
||||||
|
}
|
||||||
|
if (!empty($accept)) {
|
||||||
|
fputs($fp, "Accept: $accept\r\n");
|
||||||
|
}
|
||||||
|
if (!empty($agent)) {
|
||||||
|
fputs($fp, "User-Agent: $agent\r\n");
|
||||||
|
}
|
||||||
|
if (!empty($referer)) {
|
||||||
|
fputs($fp, "Referer: $referer\r\n");
|
||||||
|
}
|
||||||
|
if (isset($extra_headers) && is_array($extra_headers)) {
|
||||||
|
foreach ($extra_headers as $curr_header) {
|
||||||
|
fputs($fp, $curr_header . "\r\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!empty($user) && !empty($pass)) {
|
||||||
|
fputs($fp, 'Authorization: BASIC ' . base64_encode("$user:$pass") . "\r\n");
|
||||||
|
}
|
||||||
|
fputs($fp, "\r\n");
|
||||||
|
while (!feof($fp)) {
|
||||||
|
$content .= fgets($fp, 4096);
|
||||||
|
}
|
||||||
|
fclose($fp);
|
||||||
|
$csplit = preg_split("!\r\n\r\n!", $content, 2);
|
||||||
|
$content = $csplit[ 1 ];
|
||||||
|
if (!empty($params[ 'assign_headers' ])) {
|
||||||
|
$template->assign($params[ 'assign_headers' ], preg_split("!\r\n!", $csplit[ 0 ]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
trigger_error("[plugin fetch] unable to parse URL, check syntax", E_USER_NOTICE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$content = @file_get_contents($params[ 'file' ]);
|
||||||
|
if ($content === false) {
|
||||||
|
throw new SmartyException("{fetch} cannot read resource '" . $params[ 'file' ] . "'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!empty($params[ 'assign' ])) {
|
||||||
|
$template->assign($params[ 'assign' ], $content);
|
||||||
|
} else {
|
||||||
|
return $content;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,296 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsFunction
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Smarty {html_checkboxes} function plugin
|
||||||
|
* File: function.html_checkboxes.php
|
||||||
|
* Type: function
|
||||||
|
* Name: html_checkboxes
|
||||||
|
* Date: 24.Feb.2003
|
||||||
|
* Purpose: Prints out a list of checkbox input types
|
||||||
|
* Examples:
|
||||||
|
*
|
||||||
|
* {html_checkboxes values=$ids output=$names}
|
||||||
|
* {html_checkboxes values=$ids name='box' separator='<br>' output=$names}
|
||||||
|
* {html_checkboxes values=$ids checked=$checked separator='<br>' output=$names}
|
||||||
|
*
|
||||||
|
* Params:
|
||||||
|
*
|
||||||
|
* - name (optional) - string default "checkbox"
|
||||||
|
* - values (required) - array
|
||||||
|
* - options (optional) - associative array
|
||||||
|
* - checked (optional) - array default not set
|
||||||
|
* - separator (optional) - ie <br> or
|
||||||
|
* - output (optional) - the output next to each checkbox
|
||||||
|
* - assign (optional) - assign the output as an array to this variable
|
||||||
|
* - escape (optional) - escape the content (not value), defaults to true
|
||||||
|
*
|
||||||
|
* @link https://www.smarty.net/manual/en/language.function.html.checkboxes.php {html_checkboxes}
|
||||||
|
* (Smarty online manual)
|
||||||
|
* @author Christopher Kvarme <christopher.kvarme@flashjab.com>
|
||||||
|
* @author credits to Monte Ohrt <monte at ohrt dot com>
|
||||||
|
* @version 1.0
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
* @param Smarty_Internal_Template $template template object
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @uses smarty_function_escape_special_chars()
|
||||||
|
* @throws \SmartyException
|
||||||
|
*/
|
||||||
|
function smarty_function_html_checkboxes($params, Smarty_Internal_Template $template)
|
||||||
|
{
|
||||||
|
$template->_checkPlugins(
|
||||||
|
array(
|
||||||
|
array(
|
||||||
|
'function' => 'smarty_function_escape_special_chars',
|
||||||
|
'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$name = 'checkbox';
|
||||||
|
$values = null;
|
||||||
|
$options = null;
|
||||||
|
$selected = array();
|
||||||
|
$separator = '';
|
||||||
|
$escape = true;
|
||||||
|
$labels = true;
|
||||||
|
$label_ids = false;
|
||||||
|
$output = null;
|
||||||
|
$pos = null;
|
||||||
|
$extra = '';
|
||||||
|
foreach ($params as $_key => $_val) {
|
||||||
|
switch ($_key) {
|
||||||
|
case 'name':
|
||||||
|
case 'separator':
|
||||||
|
$$_key = (string)$_val;
|
||||||
|
break;
|
||||||
|
case 'escape':
|
||||||
|
case 'labels':
|
||||||
|
case 'label_ids':
|
||||||
|
$$_key = (bool)$_val;
|
||||||
|
break;
|
||||||
|
case 'options':
|
||||||
|
$$_key = (array)$_val;
|
||||||
|
break;
|
||||||
|
case 'values':
|
||||||
|
case 'output':
|
||||||
|
$$_key = array_values((array)$_val);
|
||||||
|
break;
|
||||||
|
case 'checked':
|
||||||
|
case 'selected':
|
||||||
|
if (is_array($_val)) {
|
||||||
|
$selected = array();
|
||||||
|
foreach ($_val as $_sel) {
|
||||||
|
if (is_object($_sel)) {
|
||||||
|
if (method_exists($_sel, '__toString')) {
|
||||||
|
$_sel = smarty_function_escape_special_chars((string)$_sel->__toString());
|
||||||
|
} else {
|
||||||
|
trigger_error(
|
||||||
|
'html_checkboxes: selected attribute contains an object of class \'' .
|
||||||
|
get_class($_sel) . '\' without __toString() method',
|
||||||
|
E_USER_NOTICE
|
||||||
|
);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$_sel = smarty_function_escape_special_chars((string)$_sel);
|
||||||
|
}
|
||||||
|
$selected[ $_sel ] = true;
|
||||||
|
}
|
||||||
|
} elseif (is_object($_val)) {
|
||||||
|
if (method_exists($_val, '__toString')) {
|
||||||
|
$selected = smarty_function_escape_special_chars((string)$_val->__toString());
|
||||||
|
} else {
|
||||||
|
trigger_error(
|
||||||
|
'html_checkboxes: selected attribute is an object of class \'' . get_class($_val) .
|
||||||
|
'\' without __toString() method',
|
||||||
|
E_USER_NOTICE
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$selected = smarty_function_escape_special_chars((string)$_val);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'checkboxes':
|
||||||
|
trigger_error(
|
||||||
|
'html_checkboxes: the use of the "checkboxes" attribute is deprecated, use "options" instead',
|
||||||
|
E_USER_WARNING
|
||||||
|
);
|
||||||
|
$options = (array)$_val;
|
||||||
|
break;
|
||||||
|
case 'assign':
|
||||||
|
break;
|
||||||
|
case 'pos':
|
||||||
|
$$_key = array_values((array)$_val);
|
||||||
|
break;
|
||||||
|
case 'strict':
|
||||||
|
break;
|
||||||
|
case 'disabled':
|
||||||
|
case 'readonly':
|
||||||
|
if (!empty($params[ 'strict' ])) {
|
||||||
|
if (!is_scalar($_val)) {
|
||||||
|
trigger_error(
|
||||||
|
"html_options: {$_key} attribute must be a scalar, only boolean true or string '{$_key}' will actually add the attribute",
|
||||||
|
E_USER_NOTICE
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if ($_val === true || $_val === $_key) {
|
||||||
|
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// omit break; to fall through!
|
||||||
|
// no break
|
||||||
|
default:
|
||||||
|
if (!is_array($_val)) {
|
||||||
|
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"';
|
||||||
|
} else {
|
||||||
|
trigger_error("html_checkboxes: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!isset($options) && !isset($values)) {
|
||||||
|
return '';
|
||||||
|
} /* raise error here? */
|
||||||
|
$_html_result = array();
|
||||||
|
if (isset($options)) {
|
||||||
|
foreach ($options as $_key => $_val) {
|
||||||
|
$_pos = isset($pos[ $_key ]) ? $pos[ $_key ] : '';
|
||||||
|
$_html_result[] =
|
||||||
|
smarty_function_html_checkboxes_output(
|
||||||
|
$name,
|
||||||
|
$_key,
|
||||||
|
$_val,
|
||||||
|
$selected,
|
||||||
|
$extra,
|
||||||
|
$separator,
|
||||||
|
$labels,
|
||||||
|
$label_ids,
|
||||||
|
$_pos,
|
||||||
|
$escape
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
foreach ($values as $_i => $_key) {
|
||||||
|
$_val = isset($output[ $_i ]) ? $output[ $_i ] : '';
|
||||||
|
$_pos = isset($pos[ $_i ]) ? $pos[ $_i ] : '';
|
||||||
|
$_html_result[] =
|
||||||
|
smarty_function_html_checkboxes_output(
|
||||||
|
$name,
|
||||||
|
$_key,
|
||||||
|
$_val,
|
||||||
|
$selected,
|
||||||
|
$extra,
|
||||||
|
$separator,
|
||||||
|
$labels,
|
||||||
|
$label_ids,
|
||||||
|
$_pos,
|
||||||
|
$escape
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!empty($params[ 'assign' ])) {
|
||||||
|
$template->assign($params[ 'assign' ], $_html_result);
|
||||||
|
} else {
|
||||||
|
return implode("\n", $_html_result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $name
|
||||||
|
* @param $value
|
||||||
|
* @param $output
|
||||||
|
* @param $selected
|
||||||
|
* @param $extra
|
||||||
|
* @param $separator
|
||||||
|
* @param $labels
|
||||||
|
* @param $label_ids
|
||||||
|
* @param $pos
|
||||||
|
* @param bool $escape
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function smarty_function_html_checkboxes_output(
|
||||||
|
$name,
|
||||||
|
$value,
|
||||||
|
$output,
|
||||||
|
$selected,
|
||||||
|
$extra,
|
||||||
|
$separator,
|
||||||
|
$labels,
|
||||||
|
$label_ids,
|
||||||
|
$pos,
|
||||||
|
$escape = true
|
||||||
|
) {
|
||||||
|
$_output = '';
|
||||||
|
if (is_object($value)) {
|
||||||
|
if (method_exists($value, '__toString')) {
|
||||||
|
$value = (string)$value->__toString();
|
||||||
|
} else {
|
||||||
|
trigger_error(
|
||||||
|
'html_options: value is an object of class \'' . get_class($value) .
|
||||||
|
'\' without __toString() method',
|
||||||
|
E_USER_NOTICE
|
||||||
|
);
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$value = (string)$value;
|
||||||
|
}
|
||||||
|
if (is_object($output)) {
|
||||||
|
if (method_exists($output, '__toString')) {
|
||||||
|
$output = (string)$output->__toString();
|
||||||
|
} else {
|
||||||
|
trigger_error(
|
||||||
|
'html_options: output is an object of class \'' . get_class($output) .
|
||||||
|
'\' without __toString() method',
|
||||||
|
E_USER_NOTICE
|
||||||
|
);
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$output = (string)$output;
|
||||||
|
}
|
||||||
|
if ($labels) {
|
||||||
|
if ($label_ids) {
|
||||||
|
$_id = smarty_function_escape_special_chars(
|
||||||
|
preg_replace(
|
||||||
|
'![^\w\-\.]!' . Smarty::$_UTF8_MODIFIER,
|
||||||
|
'_',
|
||||||
|
$name . '_' . $value
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$_output .= '<label for="' . $_id . '">';
|
||||||
|
} else {
|
||||||
|
$_output .= '<label>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$name = smarty_function_escape_special_chars($name);
|
||||||
|
$value = smarty_function_escape_special_chars($value);
|
||||||
|
if ($escape) {
|
||||||
|
$output = smarty_function_escape_special_chars($output);
|
||||||
|
}
|
||||||
|
$_output .= '<input type="checkbox" name="' . $name . '[' . $pos . ']" value="' . $value . '"';
|
||||||
|
if ($labels && $label_ids) {
|
||||||
|
$_output .= ' id="' . $_id . '"';
|
||||||
|
}
|
||||||
|
if (is_array($selected)) {
|
||||||
|
if (isset($selected[ $value ])) {
|
||||||
|
$_output .= ' checked="checked"';
|
||||||
|
}
|
||||||
|
} elseif ($value === $selected) {
|
||||||
|
$_output .= ' checked="checked"';
|
||||||
|
}
|
||||||
|
$_output .= $extra . ' />' . $output;
|
||||||
|
if ($labels) {
|
||||||
|
$_output .= '</label>';
|
||||||
|
}
|
||||||
|
$_output .= $separator;
|
||||||
|
return $_output;
|
||||||
|
}
|
||||||
@@ -0,0 +1,158 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsFunction
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Smarty {html_image} function plugin
|
||||||
|
* Type: function
|
||||||
|
* Name: html_image
|
||||||
|
* Date: Feb 24, 2003
|
||||||
|
* Purpose: format HTML tags for the image
|
||||||
|
* Examples: {html_image file="/images/masthead.gif"}
|
||||||
|
* Output: <img src="/images/masthead.gif" width=400 height=23>
|
||||||
|
* Params:
|
||||||
|
*
|
||||||
|
* - file - (required) - file (and path) of image
|
||||||
|
* - height - (optional) - image height (default actual height)
|
||||||
|
* - width - (optional) - image width (default actual width)
|
||||||
|
* - basedir - (optional) - base directory for absolute paths, default is environment variable DOCUMENT_ROOT
|
||||||
|
* - path_prefix - prefix for path output (optional, default empty)
|
||||||
|
*
|
||||||
|
* @link https://www.smarty.net/manual/en/language.function.html.image.php {html_image}
|
||||||
|
* (Smarty online manual)
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
* @author credits to Duda <duda@big.hu>
|
||||||
|
* @version 1.0
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
* @param Smarty_Internal_Template $template template object
|
||||||
|
*
|
||||||
|
* @throws SmartyException
|
||||||
|
* @return string
|
||||||
|
* @uses smarty_function_escape_special_chars()
|
||||||
|
*/
|
||||||
|
function smarty_function_html_image($params, Smarty_Internal_Template $template)
|
||||||
|
{
|
||||||
|
$template->_checkPlugins(
|
||||||
|
array(
|
||||||
|
array(
|
||||||
|
'function' => 'smarty_function_escape_special_chars',
|
||||||
|
'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$alt = '';
|
||||||
|
$file = '';
|
||||||
|
$height = '';
|
||||||
|
$width = '';
|
||||||
|
$extra = '';
|
||||||
|
$prefix = '';
|
||||||
|
$suffix = '';
|
||||||
|
$path_prefix = '';
|
||||||
|
$basedir = isset($_SERVER[ 'DOCUMENT_ROOT' ]) ? $_SERVER[ 'DOCUMENT_ROOT' ] : '';
|
||||||
|
foreach ($params as $_key => $_val) {
|
||||||
|
switch ($_key) {
|
||||||
|
case 'file':
|
||||||
|
case 'height':
|
||||||
|
case 'width':
|
||||||
|
case 'dpi':
|
||||||
|
case 'path_prefix':
|
||||||
|
case 'basedir':
|
||||||
|
$$_key = $_val;
|
||||||
|
break;
|
||||||
|
case 'alt':
|
||||||
|
if (!is_array($_val)) {
|
||||||
|
$$_key = smarty_function_escape_special_chars($_val);
|
||||||
|
} else {
|
||||||
|
throw new SmartyException(
|
||||||
|
"html_image: extra attribute '{$_key}' cannot be an array",
|
||||||
|
E_USER_NOTICE
|
||||||
|
);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'link':
|
||||||
|
case 'href':
|
||||||
|
$prefix = '<a href="' . $_val . '">';
|
||||||
|
$suffix = '</a>';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (!is_array($_val)) {
|
||||||
|
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"';
|
||||||
|
} else {
|
||||||
|
throw new SmartyException(
|
||||||
|
"html_image: extra attribute '{$_key}' cannot be an array",
|
||||||
|
E_USER_NOTICE
|
||||||
|
);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (empty($file)) {
|
||||||
|
trigger_error('html_image: missing \'file\' parameter', E_USER_NOTICE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ($file[ 0 ] === '/') {
|
||||||
|
$_image_path = $basedir . $file;
|
||||||
|
} else {
|
||||||
|
$_image_path = $file;
|
||||||
|
}
|
||||||
|
// strip file protocol
|
||||||
|
if (stripos($params[ 'file' ], 'file://') === 0) {
|
||||||
|
$params[ 'file' ] = substr($params[ 'file' ], 7);
|
||||||
|
}
|
||||||
|
$protocol = strpos($params[ 'file' ], '://');
|
||||||
|
if ($protocol !== false) {
|
||||||
|
$protocol = strtolower(substr($params[ 'file' ], 0, $protocol));
|
||||||
|
}
|
||||||
|
if (isset($template->smarty->security_policy)) {
|
||||||
|
if ($protocol) {
|
||||||
|
// remote resource (or php stream, …)
|
||||||
|
if (!$template->smarty->security_policy->isTrustedUri($params[ 'file' ])) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// local file
|
||||||
|
if (!$template->smarty->security_policy->isTrustedResourceDir($_image_path)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!isset($params[ 'width' ]) || !isset($params[ 'height' ])) {
|
||||||
|
// FIXME: (rodneyrehm) getimagesize() loads the complete file off a remote resource, use custom [jpg,png,gif]header reader!
|
||||||
|
if (!$_image_data = @getimagesize($_image_path)) {
|
||||||
|
if (!file_exists($_image_path)) {
|
||||||
|
trigger_error("html_image: unable to find '{$_image_path}'", E_USER_NOTICE);
|
||||||
|
return;
|
||||||
|
} elseif (!is_readable($_image_path)) {
|
||||||
|
trigger_error("html_image: unable to read '{$_image_path}'", E_USER_NOTICE);
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
trigger_error("html_image: '{$_image_path}' is not a valid image file", E_USER_NOTICE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!isset($params[ 'width' ])) {
|
||||||
|
$width = $_image_data[ 0 ];
|
||||||
|
}
|
||||||
|
if (!isset($params[ 'height' ])) {
|
||||||
|
$height = $_image_data[ 1 ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isset($params[ 'dpi' ])) {
|
||||||
|
if (strstr($_SERVER[ 'HTTP_USER_AGENT' ], 'Mac')) {
|
||||||
|
// FIXME: (rodneyrehm) wrong dpi assumption
|
||||||
|
// don't know who thought this up… even if it was true in 1998, it's definitely wrong in 2011.
|
||||||
|
$dpi_default = 72;
|
||||||
|
} else {
|
||||||
|
$dpi_default = 96;
|
||||||
|
}
|
||||||
|
$_resize = $dpi_default / $params[ 'dpi' ];
|
||||||
|
$width = round($width * $_resize);
|
||||||
|
$height = round($height * $_resize);
|
||||||
|
}
|
||||||
|
return $prefix . '<img src="' . $path_prefix . $file . '" alt="' . $alt . '" width="' . $width . '" height="' .
|
||||||
|
$height . '"' . $extra . ' />' . $suffix;
|
||||||
|
}
|
||||||
@@ -0,0 +1,260 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsFunction
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Smarty {html_options} function plugin
|
||||||
|
* Type: function
|
||||||
|
* Name: html_options
|
||||||
|
* Purpose: Prints the list of <option> tags generated from
|
||||||
|
* the passed parameters
|
||||||
|
* Params:
|
||||||
|
*
|
||||||
|
* - name (optional) - string default "select"
|
||||||
|
* - values (required) - if no options supplied) - array
|
||||||
|
* - options (required) - if no values supplied) - associative array
|
||||||
|
* - selected (optional) - string default not set
|
||||||
|
* - output (required) - if not options supplied) - array
|
||||||
|
* - id (optional) - string default not set
|
||||||
|
* - class (optional) - string default not set
|
||||||
|
*
|
||||||
|
* @link https://www.smarty.net/manual/en/language.function.html.options.php {html_image}
|
||||||
|
* (Smarty online manual)
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
* @author Ralf Strehle (minor optimization) <ralf dot strehle at yahoo dot de>
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
*
|
||||||
|
* @param \Smarty_Internal_Template $template
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @uses smarty_function_escape_special_chars()
|
||||||
|
* @throws \SmartyException
|
||||||
|
*/
|
||||||
|
function smarty_function_html_options($params, Smarty_Internal_Template $template)
|
||||||
|
{
|
||||||
|
$template->_checkPlugins(
|
||||||
|
array(
|
||||||
|
array(
|
||||||
|
'function' => 'smarty_function_escape_special_chars',
|
||||||
|
'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$name = null;
|
||||||
|
$values = null;
|
||||||
|
$options = null;
|
||||||
|
$selected = null;
|
||||||
|
$output = null;
|
||||||
|
$id = null;
|
||||||
|
$class = null;
|
||||||
|
$label = true;
|
||||||
|
$extra = '';
|
||||||
|
foreach ($params as $_key => $_val) {
|
||||||
|
switch ($_key) {
|
||||||
|
case 'name':
|
||||||
|
case 'class':
|
||||||
|
case 'id':
|
||||||
|
$$_key = (string)$_val;
|
||||||
|
break;
|
||||||
|
case 'options':
|
||||||
|
$options = (array)$_val;
|
||||||
|
break;
|
||||||
|
case 'values':
|
||||||
|
case 'output':
|
||||||
|
$$_key = array_values((array)$_val);
|
||||||
|
break;
|
||||||
|
case 'selected':
|
||||||
|
if (is_array($_val)) {
|
||||||
|
$selected = array();
|
||||||
|
foreach ($_val as $_sel) {
|
||||||
|
if (is_object($_sel)) {
|
||||||
|
if (method_exists($_sel, '__toString')) {
|
||||||
|
$_sel = smarty_function_escape_special_chars((string)$_sel->__toString());
|
||||||
|
} else {
|
||||||
|
trigger_error(
|
||||||
|
'html_options: selected attribute contains an object of class \'' .
|
||||||
|
get_class($_sel) . '\' without __toString() method',
|
||||||
|
E_USER_NOTICE
|
||||||
|
);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$_sel = smarty_function_escape_special_chars((string)$_sel);
|
||||||
|
}
|
||||||
|
$selected[ $_sel ] = true;
|
||||||
|
}
|
||||||
|
} elseif (is_object($_val)) {
|
||||||
|
if (method_exists($_val, '__toString')) {
|
||||||
|
$selected = smarty_function_escape_special_chars((string)$_val->__toString());
|
||||||
|
} else {
|
||||||
|
trigger_error(
|
||||||
|
'html_options: selected attribute is an object of class \'' . get_class($_val) .
|
||||||
|
'\' without __toString() method',
|
||||||
|
E_USER_NOTICE
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$selected = smarty_function_escape_special_chars((string)$_val);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'label':
|
||||||
|
if ($_val == 'true' || $_val == 'false') {
|
||||||
|
$$_key = (string)$_val;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'strict':
|
||||||
|
break;
|
||||||
|
case 'disabled':
|
||||||
|
case 'readonly':
|
||||||
|
if (!empty($params[ 'strict' ])) {
|
||||||
|
if (!is_scalar($_val)) {
|
||||||
|
trigger_error(
|
||||||
|
"html_options: {$_key} attribute must be a scalar, only boolean true or string '{$_key}' will actually add the attribute",
|
||||||
|
E_USER_NOTICE
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if ($_val === true || $_val === $_key) {
|
||||||
|
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// omit break; to fall through!
|
||||||
|
// no break
|
||||||
|
default:
|
||||||
|
if (!is_array($_val)) {
|
||||||
|
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"';
|
||||||
|
} else {
|
||||||
|
trigger_error("html_options: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!isset($options) && !isset($values)) {
|
||||||
|
/* raise error here? */
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
$_html_result = '';
|
||||||
|
$_idx = 0;
|
||||||
|
if (isset($options)) {
|
||||||
|
foreach ($options as $_key => $_val) {
|
||||||
|
$_html_result .= smarty_function_html_options_optoutput(
|
||||||
|
$_key,
|
||||||
|
$_val,
|
||||||
|
$selected,
|
||||||
|
$id,
|
||||||
|
$class,
|
||||||
|
$label,
|
||||||
|
$_idx
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
foreach ($values as $_i => $_key) {
|
||||||
|
$_val = isset($output[ $_i ]) ? $output[ $_i ] : '';
|
||||||
|
$_html_result .= smarty_function_html_options_optoutput(
|
||||||
|
$_key,
|
||||||
|
$_val,
|
||||||
|
$selected,
|
||||||
|
$id,
|
||||||
|
$class,
|
||||||
|
$label,
|
||||||
|
$_idx
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!empty($name)) {
|
||||||
|
$_html_class = !empty($class) ? ' class="' . $class . '"' : '';
|
||||||
|
$_html_id = !empty($id) ? ' id="' . $id . '"' : '';
|
||||||
|
$_html_result =
|
||||||
|
'<select name="' . $name . '"' . $_html_class . $_html_id . $extra . '>' . "\n" . $_html_result .
|
||||||
|
'</select>' . "\n";
|
||||||
|
}
|
||||||
|
return $_html_result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $key
|
||||||
|
* @param $value
|
||||||
|
* @param $selected
|
||||||
|
* @param $id
|
||||||
|
* @param $class
|
||||||
|
* @param $label
|
||||||
|
* @param $idx
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function smarty_function_html_options_optoutput($key, $value, $selected, $id, $class, $label, &$idx)
|
||||||
|
{
|
||||||
|
if (!is_array($value)) {
|
||||||
|
$_key = smarty_function_escape_special_chars($key);
|
||||||
|
$_html_result = '<option'
|
||||||
|
. (($label == 'true') ?
|
||||||
|
' label="' . smarty_function_escape_special_chars($value) . '"' : ''
|
||||||
|
)
|
||||||
|
. ' value="' . $_key . '"';
|
||||||
|
if (is_array($selected)) {
|
||||||
|
if (isset($selected[ $_key ])) {
|
||||||
|
$_html_result .= ' selected="selected"';
|
||||||
|
}
|
||||||
|
} elseif ($_key === $selected) {
|
||||||
|
$_html_result .= ' selected="selected"';
|
||||||
|
}
|
||||||
|
$_html_class = !empty($class) ? ' class="' . $class . ' option"' : '';
|
||||||
|
$_html_id = !empty($id) ? ' id="' . $id . '-' . $idx . '"' : '';
|
||||||
|
if (is_object($value)) {
|
||||||
|
if (method_exists($value, '__toString')) {
|
||||||
|
$value = smarty_function_escape_special_chars((string)$value->__toString());
|
||||||
|
} else {
|
||||||
|
trigger_error(
|
||||||
|
'html_options: value is an object of class \'' . get_class($value) .
|
||||||
|
'\' without __toString() method',
|
||||||
|
E_USER_NOTICE
|
||||||
|
);
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$value = smarty_function_escape_special_chars((string)$value);
|
||||||
|
}
|
||||||
|
$_html_result .= $_html_class . $_html_id . '>' . $value . '</option>' . "\n";
|
||||||
|
$idx++;
|
||||||
|
} else {
|
||||||
|
$_idx = 0;
|
||||||
|
$_html_result =
|
||||||
|
smarty_function_html_options_optgroup(
|
||||||
|
$key,
|
||||||
|
$value,
|
||||||
|
$selected,
|
||||||
|
!empty($id) ? ($id . '-' . $idx) : null,
|
||||||
|
$class,
|
||||||
|
$label,
|
||||||
|
$_idx
|
||||||
|
);
|
||||||
|
$idx++;
|
||||||
|
}
|
||||||
|
return $_html_result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $key
|
||||||
|
* @param $values
|
||||||
|
* @param $selected
|
||||||
|
* @param $id
|
||||||
|
* @param $class
|
||||||
|
* @param $label
|
||||||
|
* @param $idx
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function smarty_function_html_options_optgroup($key, $values, $selected, $id, $class, $label, &$idx)
|
||||||
|
{
|
||||||
|
$optgroup_html = '<optgroup label="' . smarty_function_escape_special_chars($key) . '">' . "\n";
|
||||||
|
foreach ($values as $key => $value) {
|
||||||
|
$optgroup_html .= smarty_function_html_options_optoutput($key, $value, $selected, $id, $class, $label, $idx);
|
||||||
|
}
|
||||||
|
$optgroup_html .= "</optgroup>\n";
|
||||||
|
return $optgroup_html;
|
||||||
|
}
|
||||||
@@ -0,0 +1,266 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsFunction
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Smarty {html_radios} function plugin
|
||||||
|
* File: function.html_radios.php
|
||||||
|
* Type: function
|
||||||
|
* Name: html_radios
|
||||||
|
* Date: 24.Feb.2003
|
||||||
|
* Purpose: Prints out a list of radio input types
|
||||||
|
* Params:
|
||||||
|
*
|
||||||
|
* - name (optional) - string default "radio"
|
||||||
|
* - values (required) - array
|
||||||
|
* - options (required) - associative array
|
||||||
|
* - checked (optional) - array default not set
|
||||||
|
* - separator (optional) - ie <br> or
|
||||||
|
* - output (optional) - the output next to each radio button
|
||||||
|
* - assign (optional) - assign the output as an array to this variable
|
||||||
|
* - escape (optional) - escape the content (not value), defaults to true
|
||||||
|
*
|
||||||
|
* Examples:
|
||||||
|
*
|
||||||
|
* {html_radios values=$ids output=$names}
|
||||||
|
* {html_radios values=$ids name='box' separator='<br>' output=$names}
|
||||||
|
* {html_radios values=$ids checked=$checked separator='<br>' output=$names}
|
||||||
|
*
|
||||||
|
* @link https://www.smarty.net/manual/en/language.function.html.radios.php {html_radios}
|
||||||
|
* (Smarty online manual)
|
||||||
|
* @author Christopher Kvarme <christopher.kvarme@flashjab.com>
|
||||||
|
* @author credits to Monte Ohrt <monte at ohrt dot com>
|
||||||
|
* @version 1.0
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
* @param Smarty_Internal_Template $template template object
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @uses smarty_function_escape_special_chars()
|
||||||
|
* @throws \SmartyException
|
||||||
|
*/
|
||||||
|
function smarty_function_html_radios($params, Smarty_Internal_Template $template)
|
||||||
|
{
|
||||||
|
$template->_checkPlugins(
|
||||||
|
array(
|
||||||
|
array(
|
||||||
|
'function' => 'smarty_function_escape_special_chars',
|
||||||
|
'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$name = 'radio';
|
||||||
|
$values = null;
|
||||||
|
$options = null;
|
||||||
|
$selected = null;
|
||||||
|
$separator = '';
|
||||||
|
$escape = true;
|
||||||
|
$labels = true;
|
||||||
|
$label_ids = false;
|
||||||
|
$output = null;
|
||||||
|
$extra = '';
|
||||||
|
foreach ($params as $_key => $_val) {
|
||||||
|
switch ($_key) {
|
||||||
|
case 'name':
|
||||||
|
case 'separator':
|
||||||
|
$$_key = (string)$_val;
|
||||||
|
break;
|
||||||
|
case 'checked':
|
||||||
|
case 'selected':
|
||||||
|
if (is_array($_val)) {
|
||||||
|
trigger_error('html_radios: the "' . $_key . '" attribute cannot be an array', E_USER_WARNING);
|
||||||
|
} elseif (is_object($_val)) {
|
||||||
|
if (method_exists($_val, '__toString')) {
|
||||||
|
$selected = smarty_function_escape_special_chars((string)$_val->__toString());
|
||||||
|
} else {
|
||||||
|
trigger_error(
|
||||||
|
'html_radios: selected attribute is an object of class \'' . get_class($_val) .
|
||||||
|
'\' without __toString() method',
|
||||||
|
E_USER_NOTICE
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$selected = (string)$_val;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'escape':
|
||||||
|
case 'labels':
|
||||||
|
case 'label_ids':
|
||||||
|
$$_key = (bool)$_val;
|
||||||
|
break;
|
||||||
|
case 'options':
|
||||||
|
$$_key = (array)$_val;
|
||||||
|
break;
|
||||||
|
case 'values':
|
||||||
|
case 'output':
|
||||||
|
$$_key = array_values((array)$_val);
|
||||||
|
break;
|
||||||
|
case 'radios':
|
||||||
|
trigger_error(
|
||||||
|
'html_radios: the use of the "radios" attribute is deprecated, use "options" instead',
|
||||||
|
E_USER_WARNING
|
||||||
|
);
|
||||||
|
$options = (array)$_val;
|
||||||
|
break;
|
||||||
|
case 'assign':
|
||||||
|
break;
|
||||||
|
case 'strict':
|
||||||
|
break;
|
||||||
|
case 'disabled':
|
||||||
|
case 'readonly':
|
||||||
|
if (!empty($params[ 'strict' ])) {
|
||||||
|
if (!is_scalar($_val)) {
|
||||||
|
trigger_error(
|
||||||
|
"html_options: {$_key} attribute must be a scalar, only boolean true or string '$_key' will actually add the attribute",
|
||||||
|
E_USER_NOTICE
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if ($_val === true || $_val === $_key) {
|
||||||
|
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// omit break; to fall through!
|
||||||
|
// no break
|
||||||
|
default:
|
||||||
|
if (!is_array($_val)) {
|
||||||
|
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"';
|
||||||
|
} else {
|
||||||
|
trigger_error("html_radios: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!isset($options) && !isset($values)) {
|
||||||
|
/* raise error here? */
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
$_html_result = array();
|
||||||
|
if (isset($options)) {
|
||||||
|
foreach ($options as $_key => $_val) {
|
||||||
|
$_html_result[] =
|
||||||
|
smarty_function_html_radios_output(
|
||||||
|
$name,
|
||||||
|
$_key,
|
||||||
|
$_val,
|
||||||
|
$selected,
|
||||||
|
$extra,
|
||||||
|
$separator,
|
||||||
|
$labels,
|
||||||
|
$label_ids,
|
||||||
|
$escape
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
foreach ($values as $_i => $_key) {
|
||||||
|
$_val = isset($output[ $_i ]) ? $output[ $_i ] : '';
|
||||||
|
$_html_result[] =
|
||||||
|
smarty_function_html_radios_output(
|
||||||
|
$name,
|
||||||
|
$_key,
|
||||||
|
$_val,
|
||||||
|
$selected,
|
||||||
|
$extra,
|
||||||
|
$separator,
|
||||||
|
$labels,
|
||||||
|
$label_ids,
|
||||||
|
$escape
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!empty($params[ 'assign' ])) {
|
||||||
|
$template->assign($params[ 'assign' ], $_html_result);
|
||||||
|
} else {
|
||||||
|
return implode("\n", $_html_result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $name
|
||||||
|
* @param $value
|
||||||
|
* @param $output
|
||||||
|
* @param $selected
|
||||||
|
* @param $extra
|
||||||
|
* @param $separator
|
||||||
|
* @param $labels
|
||||||
|
* @param $label_ids
|
||||||
|
* @param $escape
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function smarty_function_html_radios_output(
|
||||||
|
$name,
|
||||||
|
$value,
|
||||||
|
$output,
|
||||||
|
$selected,
|
||||||
|
$extra,
|
||||||
|
$separator,
|
||||||
|
$labels,
|
||||||
|
$label_ids,
|
||||||
|
$escape
|
||||||
|
) {
|
||||||
|
$_output = '';
|
||||||
|
if (is_object($value)) {
|
||||||
|
if (method_exists($value, '__toString')) {
|
||||||
|
$value = (string)$value->__toString();
|
||||||
|
} else {
|
||||||
|
trigger_error(
|
||||||
|
'html_options: value is an object of class \'' . get_class($value) .
|
||||||
|
'\' without __toString() method',
|
||||||
|
E_USER_NOTICE
|
||||||
|
);
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$value = (string)$value;
|
||||||
|
}
|
||||||
|
if (is_object($output)) {
|
||||||
|
if (method_exists($output, '__toString')) {
|
||||||
|
$output = (string)$output->__toString();
|
||||||
|
} else {
|
||||||
|
trigger_error(
|
||||||
|
'html_options: output is an object of class \'' . get_class($output) .
|
||||||
|
'\' without __toString() method',
|
||||||
|
E_USER_NOTICE
|
||||||
|
);
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$output = (string)$output;
|
||||||
|
}
|
||||||
|
if ($labels) {
|
||||||
|
if ($label_ids) {
|
||||||
|
$_id = smarty_function_escape_special_chars(
|
||||||
|
preg_replace(
|
||||||
|
'![^\w\-\.]!' . Smarty::$_UTF8_MODIFIER,
|
||||||
|
'_',
|
||||||
|
$name . '_' . $value
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$_output .= '<label for="' . $_id . '">';
|
||||||
|
} else {
|
||||||
|
$_output .= '<label>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$name = smarty_function_escape_special_chars($name);
|
||||||
|
$value = smarty_function_escape_special_chars($value);
|
||||||
|
if ($escape) {
|
||||||
|
$output = smarty_function_escape_special_chars($output);
|
||||||
|
}
|
||||||
|
$_output .= '<input type="radio" name="' . $name . '" value="' . $value . '"';
|
||||||
|
if ($labels && $label_ids) {
|
||||||
|
$_output .= ' id="' . $_id . '"';
|
||||||
|
}
|
||||||
|
if ($value === $selected) {
|
||||||
|
$_output .= ' checked="checked"';
|
||||||
|
}
|
||||||
|
$_output .= $extra . ' />' . $output;
|
||||||
|
if ($labels) {
|
||||||
|
$_output .= '</label>';
|
||||||
|
}
|
||||||
|
$_output .= $separator;
|
||||||
|
return $_output;
|
||||||
|
}
|
||||||
@@ -0,0 +1,395 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsFunction
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Smarty {html_select_date} plugin
|
||||||
|
* Type: function
|
||||||
|
* Name: html_select_date
|
||||||
|
* Purpose: Prints the dropdowns for date selection.
|
||||||
|
* ChangeLog:
|
||||||
|
*
|
||||||
|
* - 1.0 initial release
|
||||||
|
* - 1.1 added support for +/- N syntax for begin
|
||||||
|
* and end year values. (Monte)
|
||||||
|
* - 1.2 added support for yyyy-mm-dd syntax for
|
||||||
|
* time value. (Jan Rosier)
|
||||||
|
* - 1.3 added support for choosing format for
|
||||||
|
* month values (Gary Loescher)
|
||||||
|
* - 1.3.1 added support for choosing format for
|
||||||
|
* day values (Marcus Bointon)
|
||||||
|
* - 1.3.2 support negative timestamps, force year
|
||||||
|
* dropdown to include given date unless explicitly set (Monte)
|
||||||
|
* - 1.3.4 fix behaviour of 0000-00-00 00:00:00 dates to match that
|
||||||
|
* of 0000-00-00 dates (cybot, boots)
|
||||||
|
* - 2.0 complete rewrite for performance,
|
||||||
|
* added attributes month_names, *_id
|
||||||
|
*
|
||||||
|
* @link https://www.smarty.net/manual/en/language.function.html.select.date.php {html_select_date}
|
||||||
|
* (Smarty online manual)
|
||||||
|
* @version 2.0
|
||||||
|
* @author Andrei Zmievski
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
* @author Rodney Rehm
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
*
|
||||||
|
* @param \Smarty_Internal_Template $template
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @throws \SmartyException
|
||||||
|
*/
|
||||||
|
function smarty_function_html_select_date($params, Smarty_Internal_Template $template)
|
||||||
|
{
|
||||||
|
$template->_checkPlugins(
|
||||||
|
array(
|
||||||
|
array(
|
||||||
|
'function' => 'smarty_function_escape_special_chars',
|
||||||
|
'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
// generate timestamps used for month names only
|
||||||
|
static $_month_timestamps = null;
|
||||||
|
static $_current_year = null;
|
||||||
|
if ($_month_timestamps === null) {
|
||||||
|
$_current_year = date('Y');
|
||||||
|
$_month_timestamps = array();
|
||||||
|
for ($i = 1; $i <= 12; $i++) {
|
||||||
|
$_month_timestamps[ $i ] = mktime(0, 0, 0, $i, 1, 2000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Default values. */
|
||||||
|
$prefix = 'Date_';
|
||||||
|
$start_year = null;
|
||||||
|
$end_year = null;
|
||||||
|
$display_days = true;
|
||||||
|
$display_months = true;
|
||||||
|
$display_years = true;
|
||||||
|
$month_format = '%B';
|
||||||
|
/* Write months as numbers by default GL */
|
||||||
|
$month_value_format = '%m';
|
||||||
|
$day_format = '%02d';
|
||||||
|
/* Write day values using this format MB */
|
||||||
|
$day_value_format = '%d';
|
||||||
|
$year_as_text = false;
|
||||||
|
/* Display years in reverse order? Ie. 2000,1999,.... */
|
||||||
|
$reverse_years = false;
|
||||||
|
/* Should the select boxes be part of an array when returned from PHP?
|
||||||
|
e.g. setting it to "birthday", would create "birthday[Day]",
|
||||||
|
"birthday[Month]" & "birthday[Year]". Can be combined with prefix */
|
||||||
|
$field_array = null;
|
||||||
|
/* <select size>'s of the different <select> tags.
|
||||||
|
If not set, uses default dropdown. */
|
||||||
|
$day_size = null;
|
||||||
|
$month_size = null;
|
||||||
|
$year_size = null;
|
||||||
|
/* Unparsed attributes common to *ALL* the <select>/<input> tags.
|
||||||
|
An example might be in the template: all_extra ='class ="foo"'. */
|
||||||
|
$all_extra = null;
|
||||||
|
/* Separate attributes for the tags. */
|
||||||
|
$day_extra = null;
|
||||||
|
$month_extra = null;
|
||||||
|
$year_extra = null;
|
||||||
|
/* Order in which to display the fields.
|
||||||
|
"D" -> day, "M" -> month, "Y" -> year. */
|
||||||
|
$field_order = 'MDY';
|
||||||
|
/* String printed between the different fields. */
|
||||||
|
$field_separator = "\n";
|
||||||
|
$option_separator = "\n";
|
||||||
|
$time = null;
|
||||||
|
|
||||||
|
// $all_empty = null;
|
||||||
|
// $day_empty = null;
|
||||||
|
// $month_empty = null;
|
||||||
|
// $year_empty = null;
|
||||||
|
$extra_attrs = '';
|
||||||
|
$all_id = null;
|
||||||
|
$day_id = null;
|
||||||
|
$month_id = null;
|
||||||
|
$year_id = null;
|
||||||
|
foreach ($params as $_key => $_value) {
|
||||||
|
switch ($_key) {
|
||||||
|
case 'time':
|
||||||
|
$$_key = $_value; // we'll handle conversion below
|
||||||
|
break;
|
||||||
|
case 'month_names':
|
||||||
|
if (is_array($_value) && count($_value) === 12) {
|
||||||
|
$$_key = $_value;
|
||||||
|
} else {
|
||||||
|
trigger_error('html_select_date: month_names must be an array of 12 strings', E_USER_NOTICE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'prefix':
|
||||||
|
case 'field_array':
|
||||||
|
case 'start_year':
|
||||||
|
case 'end_year':
|
||||||
|
case 'day_format':
|
||||||
|
case 'day_value_format':
|
||||||
|
case 'month_format':
|
||||||
|
case 'month_value_format':
|
||||||
|
case 'day_size':
|
||||||
|
case 'month_size':
|
||||||
|
case 'year_size':
|
||||||
|
case 'all_extra':
|
||||||
|
case 'day_extra':
|
||||||
|
case 'month_extra':
|
||||||
|
case 'year_extra':
|
||||||
|
case 'field_order':
|
||||||
|
case 'field_separator':
|
||||||
|
case 'option_separator':
|
||||||
|
case 'all_empty':
|
||||||
|
case 'month_empty':
|
||||||
|
case 'day_empty':
|
||||||
|
case 'year_empty':
|
||||||
|
case 'all_id':
|
||||||
|
case 'month_id':
|
||||||
|
case 'day_id':
|
||||||
|
case 'year_id':
|
||||||
|
$$_key = (string)$_value;
|
||||||
|
break;
|
||||||
|
case 'display_days':
|
||||||
|
case 'display_months':
|
||||||
|
case 'display_years':
|
||||||
|
case 'year_as_text':
|
||||||
|
case 'reverse_years':
|
||||||
|
$$_key = (bool)$_value;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (!is_array($_value)) {
|
||||||
|
$extra_attrs .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_value) . '"';
|
||||||
|
} else {
|
||||||
|
trigger_error("html_select_date: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Note: date() is faster than strftime()
|
||||||
|
// Note: explode(date()) is faster than date() date() date()
|
||||||
|
|
||||||
|
if (isset($time) && is_array($time)) {
|
||||||
|
if (isset($time[$prefix . 'Year'])) {
|
||||||
|
// $_REQUEST[$field_array] given
|
||||||
|
foreach ([
|
||||||
|
'Y' => 'Year',
|
||||||
|
'm' => 'Month',
|
||||||
|
'd' => 'Day'
|
||||||
|
] as $_elementKey => $_elementName) {
|
||||||
|
$_variableName = '_' . strtolower($_elementName);
|
||||||
|
$$_variableName =
|
||||||
|
isset($time[$prefix . $_elementName]) ? $time[$prefix . $_elementName] :
|
||||||
|
date($_elementKey);
|
||||||
|
}
|
||||||
|
} elseif (isset($time[$field_array][$prefix . 'Year'])) {
|
||||||
|
// $_REQUEST given
|
||||||
|
foreach ([
|
||||||
|
'Y' => 'Year',
|
||||||
|
'm' => 'Month',
|
||||||
|
'd' => 'Day'
|
||||||
|
] as $_elementKey => $_elementName) {
|
||||||
|
$_variableName = '_' . strtolower($_elementName);
|
||||||
|
$$_variableName = isset($time[$field_array][$prefix . $_elementName]) ?
|
||||||
|
$time[$field_array][$prefix . $_elementName] : date($_elementKey);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// no date found, use NOW
|
||||||
|
[$_year, $_month, $_day] = explode('-', date('Y-m-d'));
|
||||||
|
}
|
||||||
|
} elseif (isset($time) && preg_match("/(\d*)-(\d*)-(\d*)/", $time, $matches)) {
|
||||||
|
$_year = $_month = $_day = null;
|
||||||
|
if ($matches[1] > '') $_year = (int) $matches[1];
|
||||||
|
if ($matches[2] > '') $_month = (int) $matches[2];
|
||||||
|
if ($matches[3] > '') $_day = (int) $matches[3];
|
||||||
|
} elseif ($time === null) {
|
||||||
|
if (array_key_exists('time', $params)) {
|
||||||
|
$_year = $_month = $_day = null;
|
||||||
|
} else {
|
||||||
|
[$_year, $_month, $_day] = explode('-', date('Y-m-d'));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$template->_checkPlugins(
|
||||||
|
array(
|
||||||
|
array(
|
||||||
|
'function' => 'smarty_make_timestamp',
|
||||||
|
'file' => SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$time = smarty_make_timestamp($time);
|
||||||
|
[$_year, $_month, $_day] = explode('-', date('Y-m-d', $time));
|
||||||
|
}
|
||||||
|
|
||||||
|
// make syntax "+N" or "-N" work with $start_year and $end_year
|
||||||
|
// Note preg_match('!^(\+|\-)\s*(\d+)$!', $end_year, $match) is slower than trim+substr
|
||||||
|
foreach (array(
|
||||||
|
'start',
|
||||||
|
'end'
|
||||||
|
) as $key) {
|
||||||
|
$key .= '_year';
|
||||||
|
$t = $$key;
|
||||||
|
if ($t === null) {
|
||||||
|
$$key = (int)$_current_year;
|
||||||
|
} elseif ($t[ 0 ] === '+') {
|
||||||
|
$$key = (int)($_current_year + (int)trim(substr($t, 1)));
|
||||||
|
} elseif ($t[ 0 ] === '-') {
|
||||||
|
$$key = (int)($_current_year - (int)trim(substr($t, 1)));
|
||||||
|
} else {
|
||||||
|
$$key = (int)$$key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// flip for ascending or descending
|
||||||
|
if (($start_year > $end_year && !$reverse_years) || ($start_year < $end_year && $reverse_years)) {
|
||||||
|
$t = $end_year;
|
||||||
|
$end_year = $start_year;
|
||||||
|
$start_year = $t;
|
||||||
|
}
|
||||||
|
// generate year <select> or <input>
|
||||||
|
if ($display_years) {
|
||||||
|
$_extra = '';
|
||||||
|
$_name = $field_array ? ($field_array . '[' . $prefix . 'Year]') : ($prefix . 'Year');
|
||||||
|
if ($all_extra) {
|
||||||
|
$_extra .= ' ' . $all_extra;
|
||||||
|
}
|
||||||
|
if ($year_extra) {
|
||||||
|
$_extra .= ' ' . $year_extra;
|
||||||
|
}
|
||||||
|
if ($year_as_text) {
|
||||||
|
$_html_years =
|
||||||
|
'<input type="text" name="' . $_name . '" value="' . $_year . '" size="4" maxlength="4"' . $_extra .
|
||||||
|
$extra_attrs . ' />';
|
||||||
|
} else {
|
||||||
|
$_html_years = '<select name="' . $_name . '"';
|
||||||
|
if ($year_id !== null || $all_id !== null) {
|
||||||
|
$_html_years .= ' id="' . smarty_function_escape_special_chars(
|
||||||
|
$year_id !== null ?
|
||||||
|
($year_id ? $year_id : $_name) :
|
||||||
|
($all_id ? ($all_id . $_name) :
|
||||||
|
$_name)
|
||||||
|
) . '"';
|
||||||
|
}
|
||||||
|
if ($year_size) {
|
||||||
|
$_html_years .= ' size="' . $year_size . '"';
|
||||||
|
}
|
||||||
|
$_html_years .= $_extra . $extra_attrs . '>' . $option_separator;
|
||||||
|
if (isset($year_empty) || isset($all_empty)) {
|
||||||
|
$_html_years .= '<option value="">' . (isset($year_empty) ? $year_empty : $all_empty) . '</option>' .
|
||||||
|
$option_separator;
|
||||||
|
}
|
||||||
|
$op = $start_year > $end_year ? -1 : 1;
|
||||||
|
for ($i = $start_year; $op > 0 ? $i <= $end_year : $i >= $end_year; $i += $op) {
|
||||||
|
$_html_years .= '<option value="' . $i . '"' . ($_year == $i ? ' selected="selected"' : '') . '>' . $i .
|
||||||
|
'</option>' . $option_separator;
|
||||||
|
}
|
||||||
|
$_html_years .= '</select>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// generate month <select> or <input>
|
||||||
|
if ($display_months) {
|
||||||
|
$_extra = '';
|
||||||
|
$_name = $field_array ? ($field_array . '[' . $prefix . 'Month]') : ($prefix . 'Month');
|
||||||
|
if ($all_extra) {
|
||||||
|
$_extra .= ' ' . $all_extra;
|
||||||
|
}
|
||||||
|
if ($month_extra) {
|
||||||
|
$_extra .= ' ' . $month_extra;
|
||||||
|
}
|
||||||
|
$_html_months = '<select name="' . $_name . '"';
|
||||||
|
if ($month_id !== null || $all_id !== null) {
|
||||||
|
$_html_months .= ' id="' . smarty_function_escape_special_chars(
|
||||||
|
$month_id !== null ?
|
||||||
|
($month_id ? $month_id : $_name) :
|
||||||
|
($all_id ? ($all_id . $_name) :
|
||||||
|
$_name)
|
||||||
|
) . '"';
|
||||||
|
}
|
||||||
|
if ($month_size) {
|
||||||
|
$_html_months .= ' size="' . $month_size . '"';
|
||||||
|
}
|
||||||
|
$_html_months .= $_extra . $extra_attrs . '>' . $option_separator;
|
||||||
|
if (isset($month_empty) || isset($all_empty)) {
|
||||||
|
$_html_months .= '<option value="">' . (isset($month_empty) ? $month_empty : $all_empty) . '</option>' .
|
||||||
|
$option_separator;
|
||||||
|
}
|
||||||
|
for ($i = 1; $i <= 12; $i++) {
|
||||||
|
$_val = sprintf('%02d', $i);
|
||||||
|
$_text = isset($month_names) ? smarty_function_escape_special_chars($month_names[ $i ]) :
|
||||||
|
($month_format === '%m' ? $_val : @strftime($month_format, $_month_timestamps[ $i ]));
|
||||||
|
$_value = $month_value_format === '%m' ? $_val : @strftime($month_value_format, $_month_timestamps[ $i ]);
|
||||||
|
$_html_months .= '<option value="' . $_value . '"' . ($_val == $_month ? ' selected="selected"' : '') .
|
||||||
|
'>' . $_text . '</option>' . $option_separator;
|
||||||
|
}
|
||||||
|
$_html_months .= '</select>';
|
||||||
|
}
|
||||||
|
// generate day <select> or <input>
|
||||||
|
if ($display_days) {
|
||||||
|
$_extra = '';
|
||||||
|
$_name = $field_array ? ($field_array . '[' . $prefix . 'Day]') : ($prefix . 'Day');
|
||||||
|
if ($all_extra) {
|
||||||
|
$_extra .= ' ' . $all_extra;
|
||||||
|
}
|
||||||
|
if ($day_extra) {
|
||||||
|
$_extra .= ' ' . $day_extra;
|
||||||
|
}
|
||||||
|
$_html_days = '<select name="' . $_name . '"';
|
||||||
|
if ($day_id !== null || $all_id !== null) {
|
||||||
|
$_html_days .= ' id="' .
|
||||||
|
smarty_function_escape_special_chars(
|
||||||
|
$day_id !== null ? ($day_id ? $day_id : $_name) :
|
||||||
|
($all_id ? ($all_id . $_name) : $_name)
|
||||||
|
) . '"';
|
||||||
|
}
|
||||||
|
if ($day_size) {
|
||||||
|
$_html_days .= ' size="' . $day_size . '"';
|
||||||
|
}
|
||||||
|
$_html_days .= $_extra . $extra_attrs . '>' . $option_separator;
|
||||||
|
if (isset($day_empty) || isset($all_empty)) {
|
||||||
|
$_html_days .= '<option value="">' . (isset($day_empty) ? $day_empty : $all_empty) . '</option>' .
|
||||||
|
$option_separator;
|
||||||
|
}
|
||||||
|
for ($i = 1; $i <= 31; $i++) {
|
||||||
|
$_val = sprintf('%02d', $i);
|
||||||
|
$_text = $day_format === '%02d' ? $_val : sprintf($day_format, $i);
|
||||||
|
$_value = $day_value_format === '%02d' ? $_val : sprintf($day_value_format, $i);
|
||||||
|
$_html_days .= '<option value="' . $_value . '"' . ($_val == $_day ? ' selected="selected"' : '') . '>' .
|
||||||
|
$_text . '</option>' . $option_separator;
|
||||||
|
}
|
||||||
|
$_html_days .= '</select>';
|
||||||
|
}
|
||||||
|
// order the fields for output
|
||||||
|
$_html = '';
|
||||||
|
for ($i = 0; $i <= 2; $i++) {
|
||||||
|
switch ($field_order[ $i ]) {
|
||||||
|
case 'Y':
|
||||||
|
case 'y':
|
||||||
|
if (isset($_html_years)) {
|
||||||
|
if ($_html) {
|
||||||
|
$_html .= $field_separator;
|
||||||
|
}
|
||||||
|
$_html .= $_html_years;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
case 'M':
|
||||||
|
if (isset($_html_months)) {
|
||||||
|
if ($_html) {
|
||||||
|
$_html .= $field_separator;
|
||||||
|
}
|
||||||
|
$_html .= $_html_months;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
case 'D':
|
||||||
|
if (isset($_html_days)) {
|
||||||
|
if ($_html) {
|
||||||
|
$_html .= $field_separator;
|
||||||
|
}
|
||||||
|
$_html .= $_html_days;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $_html;
|
||||||
|
}
|
||||||
@@ -0,0 +1,354 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsFunction
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Smarty {html_select_time} function plugin
|
||||||
|
* Type: function
|
||||||
|
* Name: html_select_time
|
||||||
|
* Purpose: Prints the dropdowns for time selection
|
||||||
|
*
|
||||||
|
* @link https://www.smarty.net/manual/en/language.function.html.select.time.php {html_select_time}
|
||||||
|
* (Smarty online manual)
|
||||||
|
* @author Roberto Berto <roberto@berto.net>
|
||||||
|
* @author Monte Ohrt <monte AT ohrt DOT com>
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
*
|
||||||
|
* @param \Smarty_Internal_Template $template
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @uses smarty_make_timestamp()
|
||||||
|
* @throws \SmartyException
|
||||||
|
*/
|
||||||
|
function smarty_function_html_select_time($params, Smarty_Internal_Template $template)
|
||||||
|
{
|
||||||
|
$template->_checkPlugins(
|
||||||
|
array(
|
||||||
|
array(
|
||||||
|
'function' => 'smarty_function_escape_special_chars',
|
||||||
|
'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$prefix = 'Time_';
|
||||||
|
$field_array = null;
|
||||||
|
$field_separator = "\n";
|
||||||
|
$option_separator = "\n";
|
||||||
|
$time = null;
|
||||||
|
$display_hours = true;
|
||||||
|
$display_minutes = true;
|
||||||
|
$display_seconds = true;
|
||||||
|
$display_meridian = true;
|
||||||
|
$hour_format = '%02d';
|
||||||
|
$hour_value_format = '%02d';
|
||||||
|
$minute_format = '%02d';
|
||||||
|
$minute_value_format = '%02d';
|
||||||
|
$second_format = '%02d';
|
||||||
|
$second_value_format = '%02d';
|
||||||
|
$hour_size = null;
|
||||||
|
$minute_size = null;
|
||||||
|
$second_size = null;
|
||||||
|
$meridian_size = null;
|
||||||
|
$all_empty = null;
|
||||||
|
$hour_empty = null;
|
||||||
|
$minute_empty = null;
|
||||||
|
$second_empty = null;
|
||||||
|
$meridian_empty = null;
|
||||||
|
$all_id = null;
|
||||||
|
$hour_id = null;
|
||||||
|
$minute_id = null;
|
||||||
|
$second_id = null;
|
||||||
|
$meridian_id = null;
|
||||||
|
$use_24_hours = true;
|
||||||
|
$minute_interval = 1;
|
||||||
|
$second_interval = 1;
|
||||||
|
$extra_attrs = '';
|
||||||
|
$all_extra = null;
|
||||||
|
$hour_extra = null;
|
||||||
|
$minute_extra = null;
|
||||||
|
$second_extra = null;
|
||||||
|
$meridian_extra = null;
|
||||||
|
foreach ($params as $_key => $_value) {
|
||||||
|
switch ($_key) {
|
||||||
|
case 'time':
|
||||||
|
if (!is_array($_value) && $_value !== null) {
|
||||||
|
$template->_checkPlugins(
|
||||||
|
array(
|
||||||
|
array(
|
||||||
|
'function' => 'smarty_make_timestamp',
|
||||||
|
'file' => SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$time = smarty_make_timestamp($_value);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'prefix':
|
||||||
|
case 'field_array':
|
||||||
|
case 'field_separator':
|
||||||
|
case 'option_separator':
|
||||||
|
case 'all_extra':
|
||||||
|
case 'hour_extra':
|
||||||
|
case 'minute_extra':
|
||||||
|
case 'second_extra':
|
||||||
|
case 'meridian_extra':
|
||||||
|
case 'all_empty':
|
||||||
|
case 'hour_empty':
|
||||||
|
case 'minute_empty':
|
||||||
|
case 'second_empty':
|
||||||
|
case 'meridian_empty':
|
||||||
|
case 'all_id':
|
||||||
|
case 'hour_id':
|
||||||
|
case 'minute_id':
|
||||||
|
case 'second_id':
|
||||||
|
case 'meridian_id':
|
||||||
|
case 'hour_format':
|
||||||
|
case 'hour_value_format':
|
||||||
|
case 'minute_format':
|
||||||
|
case 'minute_value_format':
|
||||||
|
case 'second_format':
|
||||||
|
case 'second_value_format':
|
||||||
|
$$_key = (string)$_value;
|
||||||
|
break;
|
||||||
|
case 'display_hours':
|
||||||
|
case 'display_minutes':
|
||||||
|
case 'display_seconds':
|
||||||
|
case 'display_meridian':
|
||||||
|
case 'use_24_hours':
|
||||||
|
$$_key = (bool)$_value;
|
||||||
|
break;
|
||||||
|
case 'minute_interval':
|
||||||
|
case 'second_interval':
|
||||||
|
case 'hour_size':
|
||||||
|
case 'minute_size':
|
||||||
|
case 'second_size':
|
||||||
|
case 'meridian_size':
|
||||||
|
$$_key = (int)$_value;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (!is_array($_value)) {
|
||||||
|
$extra_attrs .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_value) . '"';
|
||||||
|
} else {
|
||||||
|
trigger_error("html_select_date: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isset($params[ 'time' ]) && is_array($params[ 'time' ])) {
|
||||||
|
if (isset($params[ 'time' ][ $prefix . 'Hour' ])) {
|
||||||
|
// $_REQUEST[$field_array] given
|
||||||
|
foreach (array(
|
||||||
|
'H' => 'Hour',
|
||||||
|
'i' => 'Minute',
|
||||||
|
's' => 'Second'
|
||||||
|
) as $_elementKey => $_elementName) {
|
||||||
|
$_variableName = '_' . strtolower($_elementName);
|
||||||
|
$$_variableName =
|
||||||
|
isset($params[ 'time' ][ $prefix . $_elementName ]) ? $params[ 'time' ][ $prefix . $_elementName ] :
|
||||||
|
date($_elementKey);
|
||||||
|
}
|
||||||
|
$_meridian =
|
||||||
|
isset($params[ 'time' ][ $prefix . 'Meridian' ]) ? (' ' . $params[ 'time' ][ $prefix . 'Meridian' ]) :
|
||||||
|
'';
|
||||||
|
$time = strtotime($_hour . ':' . $_minute . ':' . $_second . $_meridian);
|
||||||
|
list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time));
|
||||||
|
} elseif (isset($params[ 'time' ][ $field_array ][ $prefix . 'Hour' ])) {
|
||||||
|
// $_REQUEST given
|
||||||
|
foreach (array(
|
||||||
|
'H' => 'Hour',
|
||||||
|
'i' => 'Minute',
|
||||||
|
's' => 'Second'
|
||||||
|
) as $_elementKey => $_elementName) {
|
||||||
|
$_variableName = '_' . strtolower($_elementName);
|
||||||
|
$$_variableName = isset($params[ 'time' ][ $field_array ][ $prefix . $_elementName ]) ?
|
||||||
|
$params[ 'time' ][ $field_array ][ $prefix . $_elementName ] : date($_elementKey);
|
||||||
|
}
|
||||||
|
$_meridian = isset($params[ 'time' ][ $field_array ][ $prefix . 'Meridian' ]) ?
|
||||||
|
(' ' . $params[ 'time' ][ $field_array ][ $prefix . 'Meridian' ]) : '';
|
||||||
|
$time = strtotime($_hour . ':' . $_minute . ':' . $_second . $_meridian);
|
||||||
|
list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time));
|
||||||
|
} else {
|
||||||
|
// no date found, use NOW
|
||||||
|
list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d'));
|
||||||
|
}
|
||||||
|
} elseif ($time === null) {
|
||||||
|
if (array_key_exists('time', $params)) {
|
||||||
|
$_hour = $_minute = $_second = $time = null;
|
||||||
|
} else {
|
||||||
|
list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s'));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time));
|
||||||
|
}
|
||||||
|
// generate hour <select>
|
||||||
|
if ($display_hours) {
|
||||||
|
$_html_hours = '';
|
||||||
|
$_extra = '';
|
||||||
|
$_name = $field_array ? ($field_array . '[' . $prefix . 'Hour]') : ($prefix . 'Hour');
|
||||||
|
if ($all_extra) {
|
||||||
|
$_extra .= ' ' . $all_extra;
|
||||||
|
}
|
||||||
|
if ($hour_extra) {
|
||||||
|
$_extra .= ' ' . $hour_extra;
|
||||||
|
}
|
||||||
|
$_html_hours = '<select name="' . $_name . '"';
|
||||||
|
if ($hour_id !== null || $all_id !== null) {
|
||||||
|
$_html_hours .= ' id="' .
|
||||||
|
smarty_function_escape_special_chars(
|
||||||
|
$hour_id !== null ? ($hour_id ? $hour_id : $_name) :
|
||||||
|
($all_id ? ($all_id . $_name) : $_name)
|
||||||
|
) . '"';
|
||||||
|
}
|
||||||
|
if ($hour_size) {
|
||||||
|
$_html_hours .= ' size="' . $hour_size . '"';
|
||||||
|
}
|
||||||
|
$_html_hours .= $_extra . $extra_attrs . '>' . $option_separator;
|
||||||
|
if (isset($hour_empty) || isset($all_empty)) {
|
||||||
|
$_html_hours .= '<option value="">' . (isset($hour_empty) ? $hour_empty : $all_empty) . '</option>' .
|
||||||
|
$option_separator;
|
||||||
|
}
|
||||||
|
$start = $use_24_hours ? 0 : 1;
|
||||||
|
$end = $use_24_hours ? 23 : 12;
|
||||||
|
for ($i = $start; $i <= $end; $i++) {
|
||||||
|
$_val = sprintf('%02d', $i);
|
||||||
|
$_text = $hour_format === '%02d' ? $_val : sprintf($hour_format, $i);
|
||||||
|
$_value = $hour_value_format === '%02d' ? $_val : sprintf($hour_value_format, $i);
|
||||||
|
if (!$use_24_hours) {
|
||||||
|
$_hour12 = $_hour == 0 ? 12 : ($_hour <= 12 ? $_hour : $_hour - 12);
|
||||||
|
}
|
||||||
|
$selected = $_hour !== null ? ($use_24_hours ? $_hour == $_val : $_hour12 == $_val) : null;
|
||||||
|
$_html_hours .= '<option value="' . $_value . '"' . ($selected ? ' selected="selected"' : '') . '>' .
|
||||||
|
$_text . '</option>' . $option_separator;
|
||||||
|
}
|
||||||
|
$_html_hours .= '</select>';
|
||||||
|
}
|
||||||
|
// generate minute <select>
|
||||||
|
if ($display_minutes) {
|
||||||
|
$_html_minutes = '';
|
||||||
|
$_extra = '';
|
||||||
|
$_name = $field_array ? ($field_array . '[' . $prefix . 'Minute]') : ($prefix . 'Minute');
|
||||||
|
if ($all_extra) {
|
||||||
|
$_extra .= ' ' . $all_extra;
|
||||||
|
}
|
||||||
|
if ($minute_extra) {
|
||||||
|
$_extra .= ' ' . $minute_extra;
|
||||||
|
}
|
||||||
|
$_html_minutes = '<select name="' . $_name . '"';
|
||||||
|
if ($minute_id !== null || $all_id !== null) {
|
||||||
|
$_html_minutes .= ' id="' . smarty_function_escape_special_chars(
|
||||||
|
$minute_id !== null ?
|
||||||
|
($minute_id ? $minute_id : $_name) :
|
||||||
|
($all_id ? ($all_id . $_name) :
|
||||||
|
$_name)
|
||||||
|
) . '"';
|
||||||
|
}
|
||||||
|
if ($minute_size) {
|
||||||
|
$_html_minutes .= ' size="' . $minute_size . '"';
|
||||||
|
}
|
||||||
|
$_html_minutes .= $_extra . $extra_attrs . '>' . $option_separator;
|
||||||
|
if (isset($minute_empty) || isset($all_empty)) {
|
||||||
|
$_html_minutes .= '<option value="">' . (isset($minute_empty) ? $minute_empty : $all_empty) . '</option>' .
|
||||||
|
$option_separator;
|
||||||
|
}
|
||||||
|
$selected = $_minute !== null ? ($_minute - $_minute % $minute_interval) : null;
|
||||||
|
for ($i = 0; $i <= 59; $i += $minute_interval) {
|
||||||
|
$_val = sprintf('%02d', $i);
|
||||||
|
$_text = $minute_format === '%02d' ? $_val : sprintf($minute_format, $i);
|
||||||
|
$_value = $minute_value_format === '%02d' ? $_val : sprintf($minute_value_format, $i);
|
||||||
|
$_html_minutes .= '<option value="' . $_value . '"' . ($selected === $i ? ' selected="selected"' : '') .
|
||||||
|
'>' . $_text . '</option>' . $option_separator;
|
||||||
|
}
|
||||||
|
$_html_minutes .= '</select>';
|
||||||
|
}
|
||||||
|
// generate second <select>
|
||||||
|
if ($display_seconds) {
|
||||||
|
$_html_seconds = '';
|
||||||
|
$_extra = '';
|
||||||
|
$_name = $field_array ? ($field_array . '[' . $prefix . 'Second]') : ($prefix . 'Second');
|
||||||
|
if ($all_extra) {
|
||||||
|
$_extra .= ' ' . $all_extra;
|
||||||
|
}
|
||||||
|
if ($second_extra) {
|
||||||
|
$_extra .= ' ' . $second_extra;
|
||||||
|
}
|
||||||
|
$_html_seconds = '<select name="' . $_name . '"';
|
||||||
|
if ($second_id !== null || $all_id !== null) {
|
||||||
|
$_html_seconds .= ' id="' . smarty_function_escape_special_chars(
|
||||||
|
$second_id !== null ?
|
||||||
|
($second_id ? $second_id : $_name) :
|
||||||
|
($all_id ? ($all_id . $_name) :
|
||||||
|
$_name)
|
||||||
|
) . '"';
|
||||||
|
}
|
||||||
|
if ($second_size) {
|
||||||
|
$_html_seconds .= ' size="' . $second_size . '"';
|
||||||
|
}
|
||||||
|
$_html_seconds .= $_extra . $extra_attrs . '>' . $option_separator;
|
||||||
|
if (isset($second_empty) || isset($all_empty)) {
|
||||||
|
$_html_seconds .= '<option value="">' . (isset($second_empty) ? $second_empty : $all_empty) . '</option>' .
|
||||||
|
$option_separator;
|
||||||
|
}
|
||||||
|
$selected = $_second !== null ? ($_second - $_second % $second_interval) : null;
|
||||||
|
for ($i = 0; $i <= 59; $i += $second_interval) {
|
||||||
|
$_val = sprintf('%02d', $i);
|
||||||
|
$_text = $second_format === '%02d' ? $_val : sprintf($second_format, $i);
|
||||||
|
$_value = $second_value_format === '%02d' ? $_val : sprintf($second_value_format, $i);
|
||||||
|
$_html_seconds .= '<option value="' . $_value . '"' . ($selected === $i ? ' selected="selected"' : '') .
|
||||||
|
'>' . $_text . '</option>' . $option_separator;
|
||||||
|
}
|
||||||
|
$_html_seconds .= '</select>';
|
||||||
|
}
|
||||||
|
// generate meridian <select>
|
||||||
|
if ($display_meridian && !$use_24_hours) {
|
||||||
|
$_html_meridian = '';
|
||||||
|
$_extra = '';
|
||||||
|
$_name = $field_array ? ($field_array . '[' . $prefix . 'Meridian]') : ($prefix . 'Meridian');
|
||||||
|
if ($all_extra) {
|
||||||
|
$_extra .= ' ' . $all_extra;
|
||||||
|
}
|
||||||
|
if ($meridian_extra) {
|
||||||
|
$_extra .= ' ' . $meridian_extra;
|
||||||
|
}
|
||||||
|
$_html_meridian = '<select name="' . $_name . '"';
|
||||||
|
if ($meridian_id !== null || $all_id !== null) {
|
||||||
|
$_html_meridian .= ' id="' . smarty_function_escape_special_chars(
|
||||||
|
$meridian_id !== null ?
|
||||||
|
($meridian_id ? $meridian_id :
|
||||||
|
$_name) :
|
||||||
|
($all_id ? ($all_id . $_name) :
|
||||||
|
$_name)
|
||||||
|
) . '"';
|
||||||
|
}
|
||||||
|
if ($meridian_size) {
|
||||||
|
$_html_meridian .= ' size="' . $meridian_size . '"';
|
||||||
|
}
|
||||||
|
$_html_meridian .= $_extra . $extra_attrs . '>' . $option_separator;
|
||||||
|
if (isset($meridian_empty) || isset($all_empty)) {
|
||||||
|
$_html_meridian .= '<option value="">' . (isset($meridian_empty) ? $meridian_empty : $all_empty) .
|
||||||
|
'</option>' . $option_separator;
|
||||||
|
}
|
||||||
|
$_html_meridian .= '<option value="am"' . ($_hour > 0 && $_hour < 12 ? ' selected="selected"' : '') .
|
||||||
|
'>AM</option>' . $option_separator . '<option value="pm"' .
|
||||||
|
($_hour < 12 ? '' : ' selected="selected"') . '>PM</option>' . $option_separator .
|
||||||
|
'</select>';
|
||||||
|
}
|
||||||
|
$_html = '';
|
||||||
|
foreach (array(
|
||||||
|
'_html_hours',
|
||||||
|
'_html_minutes',
|
||||||
|
'_html_seconds',
|
||||||
|
'_html_meridian'
|
||||||
|
) as $k) {
|
||||||
|
if (isset($$k)) {
|
||||||
|
if ($_html) {
|
||||||
|
$_html .= $field_separator;
|
||||||
|
}
|
||||||
|
$_html .= $$k;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $_html;
|
||||||
|
}
|
||||||
@@ -0,0 +1,164 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsFunction
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Smarty {html_table} function plugin
|
||||||
|
* Type: function
|
||||||
|
* Name: html_table
|
||||||
|
* Date: Feb 17, 2003
|
||||||
|
* Purpose: make an html table from an array of data
|
||||||
|
* Params:
|
||||||
|
*
|
||||||
|
* - loop - array to loop through
|
||||||
|
* - cols - number of columns, comma separated list of column names
|
||||||
|
* or array of column names
|
||||||
|
* - rows - number of rows
|
||||||
|
* - table_attr - table attributes
|
||||||
|
* - th_attr - table heading attributes (arrays are cycled)
|
||||||
|
* - tr_attr - table row attributes (arrays are cycled)
|
||||||
|
* - td_attr - table cell attributes (arrays are cycled)
|
||||||
|
* - trailpad - value to pad trailing cells with
|
||||||
|
* - caption - text for caption element
|
||||||
|
* - vdir - vertical direction (default: "down", means top-to-bottom)
|
||||||
|
* - hdir - horizontal direction (default: "right", means left-to-right)
|
||||||
|
* - inner - inner loop (default "cols": print $loop line by line,
|
||||||
|
* $loop will be printed column by column otherwise)
|
||||||
|
*
|
||||||
|
* Examples:
|
||||||
|
*
|
||||||
|
* {table loop=$data}
|
||||||
|
* {table loop=$data cols=4 tr_attr='"bgcolor=red"'}
|
||||||
|
* {table loop=$data cols="first,second,third" tr_attr=$colors}
|
||||||
|
*
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
* @author credit to Messju Mohr <messju at lammfellpuschen dot de>
|
||||||
|
* @author credit to boots <boots dot smarty at yahoo dot com>
|
||||||
|
* @version 1.1
|
||||||
|
* @link https://www.smarty.net/manual/en/language.function.html.table.php {html_table}
|
||||||
|
* (Smarty online manual)
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function smarty_function_html_table($params)
|
||||||
|
{
|
||||||
|
$table_attr = 'border="1"';
|
||||||
|
$tr_attr = '';
|
||||||
|
$th_attr = '';
|
||||||
|
$td_attr = '';
|
||||||
|
$cols = $cols_count = 3;
|
||||||
|
$rows = 3;
|
||||||
|
$trailpad = ' ';
|
||||||
|
$vdir = 'down';
|
||||||
|
$hdir = 'right';
|
||||||
|
$inner = 'cols';
|
||||||
|
$caption = '';
|
||||||
|
$loop = null;
|
||||||
|
if (!isset($params[ 'loop' ])) {
|
||||||
|
trigger_error("html_table: missing 'loop' parameter", E_USER_WARNING);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
foreach ($params as $_key => $_value) {
|
||||||
|
switch ($_key) {
|
||||||
|
case 'loop':
|
||||||
|
$$_key = (array)$_value;
|
||||||
|
break;
|
||||||
|
case 'cols':
|
||||||
|
if (is_array($_value) && !empty($_value)) {
|
||||||
|
$cols = $_value;
|
||||||
|
$cols_count = count($_value);
|
||||||
|
} elseif (!is_numeric($_value) && is_string($_value) && !empty($_value)) {
|
||||||
|
$cols = explode(',', $_value);
|
||||||
|
$cols_count = count($cols);
|
||||||
|
} elseif (!empty($_value)) {
|
||||||
|
$cols_count = (int)$_value;
|
||||||
|
} else {
|
||||||
|
$cols_count = $cols;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'rows':
|
||||||
|
$$_key = (int)$_value;
|
||||||
|
break;
|
||||||
|
case 'table_attr':
|
||||||
|
case 'trailpad':
|
||||||
|
case 'hdir':
|
||||||
|
case 'vdir':
|
||||||
|
case 'inner':
|
||||||
|
case 'caption':
|
||||||
|
$$_key = (string)$_value;
|
||||||
|
break;
|
||||||
|
case 'tr_attr':
|
||||||
|
case 'td_attr':
|
||||||
|
case 'th_attr':
|
||||||
|
$$_key = $_value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$loop_count = count($loop);
|
||||||
|
if (empty($params[ 'rows' ])) {
|
||||||
|
/* no rows specified */
|
||||||
|
$rows = ceil($loop_count / $cols_count);
|
||||||
|
} elseif (empty($params[ 'cols' ])) {
|
||||||
|
if (!empty($params[ 'rows' ])) {
|
||||||
|
/* no cols specified, but rows */
|
||||||
|
$cols_count = ceil($loop_count / $rows);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$output = "<table $table_attr>\n";
|
||||||
|
if (!empty($caption)) {
|
||||||
|
$output .= '<caption>' . $caption . "</caption>\n";
|
||||||
|
}
|
||||||
|
if (is_array($cols)) {
|
||||||
|
$cols = ($hdir === 'right') ? $cols : array_reverse($cols);
|
||||||
|
$output .= "<thead><tr>\n";
|
||||||
|
for ($r = 0; $r < $cols_count; $r++) {
|
||||||
|
$output .= '<th' . smarty_function_html_table_cycle('th', $th_attr, $r) . '>';
|
||||||
|
$output .= $cols[ $r ];
|
||||||
|
$output .= "</th>\n";
|
||||||
|
}
|
||||||
|
$output .= "</tr></thead>\n";
|
||||||
|
}
|
||||||
|
$output .= "<tbody>\n";
|
||||||
|
for ($r = 0; $r < $rows; $r++) {
|
||||||
|
$output .= "<tr" . smarty_function_html_table_cycle('tr', $tr_attr, $r) . ">\n";
|
||||||
|
$rx = ($vdir === 'down') ? $r * $cols_count : ($rows - 1 - $r) * $cols_count;
|
||||||
|
for ($c = 0; $c < $cols_count; $c++) {
|
||||||
|
$x = ($hdir === 'right') ? $rx + $c : $rx + $cols_count - 1 - $c;
|
||||||
|
if ($inner !== 'cols') {
|
||||||
|
/* shuffle x to loop over rows*/
|
||||||
|
$x = floor($x / $cols_count) + ($x % $cols_count) * $rows;
|
||||||
|
}
|
||||||
|
if ($x < $loop_count) {
|
||||||
|
$output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">" . $loop[ $x ] . "</td>\n";
|
||||||
|
} else {
|
||||||
|
$output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">$trailpad</td>\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$output .= "</tr>\n";
|
||||||
|
}
|
||||||
|
$output .= "</tbody>\n";
|
||||||
|
$output .= "</table>\n";
|
||||||
|
return $output;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $name
|
||||||
|
* @param $var
|
||||||
|
* @param $no
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function smarty_function_html_table_cycle($name, $var, $no)
|
||||||
|
{
|
||||||
|
if (!is_array($var)) {
|
||||||
|
$ret = $var;
|
||||||
|
} else {
|
||||||
|
$ret = $var[ $no % count($var) ];
|
||||||
|
}
|
||||||
|
return ($ret) ? ' ' . $ret : '';
|
||||||
|
}
|
||||||
@@ -0,0 +1,142 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsFunction
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Smarty {mailto} function plugin
|
||||||
|
* Type: function
|
||||||
|
* Name: mailto
|
||||||
|
* Date: May 21, 2002
|
||||||
|
* Purpose: automate mailto address link creation, and optionally encode them.
|
||||||
|
* Params:
|
||||||
|
*
|
||||||
|
* - address - (required) - e-mail address
|
||||||
|
* - text - (optional) - text to display, default is address
|
||||||
|
* - encode - (optional) - can be one of:
|
||||||
|
* * none : no encoding (default)
|
||||||
|
* * javascript : encode with javascript
|
||||||
|
* * javascript_charcode : encode with javascript charcode
|
||||||
|
* * hex : encode with hexadecimal (no javascript)
|
||||||
|
* - cc - (optional) - address(es) to carbon copy
|
||||||
|
* - bcc - (optional) - address(es) to blind carbon copy
|
||||||
|
* - subject - (optional) - e-mail subject
|
||||||
|
* - newsgroups - (optional) - newsgroup(s) to post to
|
||||||
|
* - followupto - (optional) - address(es) to follow up to
|
||||||
|
* - extra - (optional) - extra tags for the href link
|
||||||
|
*
|
||||||
|
* Examples:
|
||||||
|
*
|
||||||
|
* {mailto address="me@domain.com"}
|
||||||
|
* {mailto address="me@domain.com" encode="javascript"}
|
||||||
|
* {mailto address="me@domain.com" encode="hex"}
|
||||||
|
* {mailto address="me@domain.com" subject="Hello to you!"}
|
||||||
|
* {mailto address="me@domain.com" cc="you@domain.com,they@domain.com"}
|
||||||
|
* {mailto address="me@domain.com" extra='class="mailto"'}
|
||||||
|
*
|
||||||
|
* @link https://www.smarty.net/manual/en/language.function.mailto.php {mailto}
|
||||||
|
* (Smarty online manual)
|
||||||
|
* @version 1.2
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
* @author credits to Jason Sweat (added cc, bcc and subject functionality)
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function smarty_function_mailto($params)
|
||||||
|
{
|
||||||
|
static $_allowed_encoding = [
|
||||||
|
'javascript' => true,
|
||||||
|
'javascript_charcode' => true,
|
||||||
|
'hex' => true,
|
||||||
|
'none' => true
|
||||||
|
];
|
||||||
|
|
||||||
|
$extra = '';
|
||||||
|
if (empty($params[ 'address' ])) {
|
||||||
|
trigger_error("mailto: missing 'address' parameter", E_USER_WARNING);
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
$address = $params[ 'address' ];
|
||||||
|
}
|
||||||
|
|
||||||
|
$text = $address;
|
||||||
|
|
||||||
|
// netscape and mozilla do not decode %40 (@) in BCC field (bug?)
|
||||||
|
// so, don't encode it.
|
||||||
|
$mail_parms = [];
|
||||||
|
foreach ($params as $var => $value) {
|
||||||
|
switch ($var) {
|
||||||
|
case 'cc':
|
||||||
|
case 'bcc':
|
||||||
|
case 'followupto':
|
||||||
|
if (!empty($value)) {
|
||||||
|
$mail_parms[] = $var . '=' . str_replace(['%40', '%2C'], ['@', ','], rawurlencode($value));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'subject':
|
||||||
|
case 'newsgroups':
|
||||||
|
$mail_parms[] = $var . '=' . rawurlencode($value);
|
||||||
|
break;
|
||||||
|
case 'extra':
|
||||||
|
case 'text':
|
||||||
|
$$var = $value;
|
||||||
|
// no break
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($mail_parms) {
|
||||||
|
$address .= '?' . join('&', $mail_parms);
|
||||||
|
}
|
||||||
|
$encode = (empty($params[ 'encode' ])) ? 'none' : $params[ 'encode' ];
|
||||||
|
if (!isset($_allowed_encoding[ $encode ])) {
|
||||||
|
trigger_error(
|
||||||
|
"mailto: 'encode' parameter must be none, javascript, javascript_charcode or hex",
|
||||||
|
E_USER_WARNING
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$string = '<a href="mailto:' . htmlspecialchars($address, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, Smarty::$_CHARSET) .
|
||||||
|
'" ' . $extra . '>' . htmlspecialchars($text, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, Smarty::$_CHARSET) . '</a>';
|
||||||
|
|
||||||
|
if ($encode === 'javascript') {
|
||||||
|
$js_encode = '';
|
||||||
|
for ($x = 0, $_length = strlen($string); $x < $_length; $x++) {
|
||||||
|
$js_encode .= '%' . bin2hex($string[ $x ]);
|
||||||
|
}
|
||||||
|
return '<script type="text/javascript">document.write(unescape(\'' . $js_encode . '\'))</script>';
|
||||||
|
} elseif ($encode === 'javascript_charcode') {
|
||||||
|
for ($x = 0, $_length = strlen($string); $x < $_length; $x++) {
|
||||||
|
$ord[] = ord($string[ $x ]);
|
||||||
|
}
|
||||||
|
return '<script type="text/javascript">document.write(String.fromCharCode(' . implode(',', $ord) . '))</script>';
|
||||||
|
} elseif ($encode === 'hex') {
|
||||||
|
preg_match('!^(.*)(\?.*)$!', $address, $match);
|
||||||
|
if (!empty($match[ 2 ])) {
|
||||||
|
trigger_error("mailto: hex encoding does not work with extra attributes. Try javascript.", E_USER_WARNING);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$address_encode = '';
|
||||||
|
for ($x = 0, $_length = strlen($address); $x < $_length; $x++) {
|
||||||
|
if (preg_match('!\w!' . Smarty::$_UTF8_MODIFIER, $address[ $x ])) {
|
||||||
|
$address_encode .= '%' . bin2hex($address[ $x ]);
|
||||||
|
} else {
|
||||||
|
$address_encode .= $address[ $x ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$text_encode = '';
|
||||||
|
for ($x = 0, $_length = strlen($text); $x < $_length; $x++) {
|
||||||
|
$text_encode .= '&#x' . bin2hex($text[ $x ]) . ';';
|
||||||
|
}
|
||||||
|
$mailto = "mailto:";
|
||||||
|
return '<a href="' . $mailto . $address_encode . '" ' . $extra . '>' . $text_encode . '</a>';
|
||||||
|
} else {
|
||||||
|
// no encoding
|
||||||
|
return $string;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,142 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
* This plugin is only for Smarty2 BC
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsFunction
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Smarty {math} function plugin
|
||||||
|
* Type: function
|
||||||
|
* Name: math
|
||||||
|
* Purpose: handle math computations in template
|
||||||
|
*
|
||||||
|
* @link https://www.smarty.net/manual/en/language.function.math.php {math}
|
||||||
|
* (Smarty online manual)
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
*
|
||||||
|
* @param array $params parameters
|
||||||
|
* @param Smarty_Internal_Template $template template object
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
function smarty_function_math($params, $template)
|
||||||
|
{
|
||||||
|
static $_allowed_funcs =
|
||||||
|
array(
|
||||||
|
'int' => true,
|
||||||
|
'abs' => true,
|
||||||
|
'ceil' => true,
|
||||||
|
'acos' => true,
|
||||||
|
'acosh' => true,
|
||||||
|
'cos' => true,
|
||||||
|
'cosh' => true,
|
||||||
|
'deg2rad' => true,
|
||||||
|
'rad2deg' => true,
|
||||||
|
'exp' => true,
|
||||||
|
'floor' => true,
|
||||||
|
'log' => true,
|
||||||
|
'log10' => true,
|
||||||
|
'max' => true,
|
||||||
|
'min' => true,
|
||||||
|
'pi' => true,
|
||||||
|
'pow' => true,
|
||||||
|
'rand' => true,
|
||||||
|
'round' => true,
|
||||||
|
'asin' => true,
|
||||||
|
'asinh' => true,
|
||||||
|
'sin' => true,
|
||||||
|
'sinh' => true,
|
||||||
|
'sqrt' => true,
|
||||||
|
'srand' => true,
|
||||||
|
'atan' => true,
|
||||||
|
'atanh' => true,
|
||||||
|
'tan' => true,
|
||||||
|
'tanh' => true
|
||||||
|
);
|
||||||
|
|
||||||
|
// be sure equation parameter is present
|
||||||
|
if (empty($params[ 'equation' ])) {
|
||||||
|
trigger_error("math: missing equation parameter", E_USER_WARNING);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$equation = $params[ 'equation' ];
|
||||||
|
|
||||||
|
// Remove whitespaces
|
||||||
|
$equation = preg_replace('/\s+/', '', $equation);
|
||||||
|
|
||||||
|
// Adapted from https://www.php.net/manual/en/function.eval.php#107377
|
||||||
|
$number = '(?:\d+(?:[,.]\d+)?|pi|π)'; // What is a number
|
||||||
|
$functionsOrVars = '((?:0x[a-fA-F0-9]+)|([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*))';
|
||||||
|
$operators = '[,+\/*\^%-]'; // Allowed math operators
|
||||||
|
$regexp = '/^(('.$number.'|'.$functionsOrVars.'|('.$functionsOrVars.'\s*\((?1)*\)|\((?1)*\)))(?:'.$operators.'(?1))?)+$/';
|
||||||
|
|
||||||
|
if (!preg_match($regexp, $equation)) {
|
||||||
|
trigger_error("math: illegal characters", E_USER_WARNING);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// make sure parenthesis are balanced
|
||||||
|
if (substr_count($equation, '(') !== substr_count($equation, ')')) {
|
||||||
|
trigger_error("math: unbalanced parenthesis", E_USER_WARNING);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// disallow backticks
|
||||||
|
if (strpos($equation, '`') !== false) {
|
||||||
|
trigger_error("math: backtick character not allowed in equation", E_USER_WARNING);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// also disallow dollar signs
|
||||||
|
if (strpos($equation, '$') !== false) {
|
||||||
|
trigger_error("math: dollar signs not allowed in equation", E_USER_WARNING);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
foreach ($params as $key => $val) {
|
||||||
|
if ($key !== 'equation' && $key !== 'format' && $key !== 'assign') {
|
||||||
|
// make sure value is not empty
|
||||||
|
if (strlen($val) === 0) {
|
||||||
|
trigger_error("math: parameter '{$key}' is empty", E_USER_WARNING);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!is_numeric($val)) {
|
||||||
|
trigger_error("math: parameter '{$key}' is not numeric", E_USER_WARNING);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// match all vars in equation, make sure all are passed
|
||||||
|
preg_match_all('!(?:0x[a-fA-F0-9]+)|([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)!', $equation, $match);
|
||||||
|
foreach ($match[ 1 ] as $curr_var) {
|
||||||
|
if ($curr_var && !isset($params[ $curr_var ]) && !isset($_allowed_funcs[ $curr_var ])) {
|
||||||
|
trigger_error(
|
||||||
|
"math: function call '{$curr_var}' not allowed, or missing parameter '{$curr_var}'",
|
||||||
|
E_USER_WARNING
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach ($params as $key => $val) {
|
||||||
|
if ($key !== 'equation' && $key !== 'format' && $key !== 'assign') {
|
||||||
|
$equation = preg_replace("/\b$key\b/", " \$params['$key'] ", $equation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$smarty_math_result = null;
|
||||||
|
eval("\$smarty_math_result = " . $equation . ";");
|
||||||
|
|
||||||
|
if (empty($params[ 'format' ])) {
|
||||||
|
if (empty($params[ 'assign' ])) {
|
||||||
|
return $smarty_math_result;
|
||||||
|
} else {
|
||||||
|
$template->assign($params[ 'assign' ], $smarty_math_result);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (empty($params[ 'assign' ])) {
|
||||||
|
printf($params[ 'format' ], $smarty_math_result);
|
||||||
|
} else {
|
||||||
|
$template->assign($params[ 'assign' ], sprintf($params[ 'format' ], $smarty_math_result));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,119 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage plugins
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty {popup} function plugin
|
||||||
|
*
|
||||||
|
* Type: function<br>
|
||||||
|
* Name: popup<br>
|
||||||
|
* Purpose: make text pop up in windows via overlib
|
||||||
|
* @link http://smarty.php.net/manual/en/language.function.popup.php {popup}
|
||||||
|
* (Smarty online manual)
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
* @param array
|
||||||
|
* @param Smarty
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function smarty_function_popup($params, &$smarty)
|
||||||
|
{
|
||||||
|
$append = '';
|
||||||
|
foreach ($params as $_key=>$_value) {
|
||||||
|
switch ($_key) {
|
||||||
|
case 'text':
|
||||||
|
case 'trigger':
|
||||||
|
case 'function':
|
||||||
|
case 'inarray':
|
||||||
|
$$_key = (string)$_value;
|
||||||
|
if ($_key == 'function' || $_key == 'inarray')
|
||||||
|
$append .= ',' . strtoupper($_key) . ",'$_value'";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'caption':
|
||||||
|
case 'closetext':
|
||||||
|
case 'status':
|
||||||
|
$append .= ',' . strtoupper($_key) . ",'" . str_replace("'","\'",$_value) . "'";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'fgcolor':
|
||||||
|
case 'bgcolor':
|
||||||
|
case 'textcolor':
|
||||||
|
case 'capcolor':
|
||||||
|
case 'closecolor':
|
||||||
|
case 'textfont':
|
||||||
|
case 'captionfont':
|
||||||
|
case 'closefont':
|
||||||
|
case 'fgbackground':
|
||||||
|
case 'bgbackground':
|
||||||
|
case 'caparray':
|
||||||
|
case 'capicon':
|
||||||
|
case 'background':
|
||||||
|
case 'frame':
|
||||||
|
$append .= ',' . strtoupper($_key) . ",'$_value'";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'textsize':
|
||||||
|
case 'captionsize':
|
||||||
|
case 'closesize':
|
||||||
|
case 'width':
|
||||||
|
case 'height':
|
||||||
|
case 'border':
|
||||||
|
case 'offsetx':
|
||||||
|
case 'offsety':
|
||||||
|
case 'snapx':
|
||||||
|
case 'snapy':
|
||||||
|
case 'fixx':
|
||||||
|
case 'fixy':
|
||||||
|
case 'padx':
|
||||||
|
case 'pady':
|
||||||
|
case 'timeout':
|
||||||
|
case 'delay':
|
||||||
|
$append .= ',' . strtoupper($_key) . ",$_value";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'sticky':
|
||||||
|
case 'left':
|
||||||
|
case 'right':
|
||||||
|
case 'center':
|
||||||
|
case 'above':
|
||||||
|
case 'below':
|
||||||
|
case 'noclose':
|
||||||
|
case 'autostatus':
|
||||||
|
case 'autostatuscap':
|
||||||
|
case 'fullhtml':
|
||||||
|
case 'hauto':
|
||||||
|
case 'vauto':
|
||||||
|
case 'mouseoff':
|
||||||
|
case 'followmouse':
|
||||||
|
case 'closeclick':
|
||||||
|
if ($_value) $append .= ',' . strtoupper($_key);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
$smarty->trigger_error("[popup] unknown parameter $_key", E_USER_WARNING);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($text) && !isset($inarray) && empty($function)) {
|
||||||
|
$smarty->trigger_error("overlib: attribute 'text' or 'inarray' or 'function' required");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($trigger)) { $trigger = "onmouseover"; }
|
||||||
|
|
||||||
|
$retval = $trigger . '="return overlib(\''.preg_replace(array("!'!","![\r\n]!"),array("\'",'\r'),$text).'\'';
|
||||||
|
$retval .= $append . ');"';
|
||||||
|
if ($trigger == 'onmouseover')
|
||||||
|
$retval .= ' onmouseout="nd();"';
|
||||||
|
|
||||||
|
|
||||||
|
return $retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* vim: set expandtab: */
|
||||||
|
|
||||||
|
?>
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage plugins
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty {popup_init} function plugin
|
||||||
|
*
|
||||||
|
* Type: function<br>
|
||||||
|
* Name: popup_init<br>
|
||||||
|
* Purpose: initialize overlib
|
||||||
|
* @link http://smarty.php.net/manual/en/language.function.popup.init.php {popup_init}
|
||||||
|
* (Smarty online manual)
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
* @param array
|
||||||
|
* @param Smarty
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function smarty_function_popup_init($params, &$smarty)
|
||||||
|
{
|
||||||
|
$zindex = 1000;
|
||||||
|
|
||||||
|
if (!empty($params['zindex'])) {
|
||||||
|
$zindex = $params['zindex'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($params['src'])) {
|
||||||
|
return '<div id="overDiv" style="position:absolute; visibility:hidden; z-index:'.$zindex.';"></div>' . "\n"
|
||||||
|
. '<script type="text/javascript" language="JavaScript" src="'.$params['src'].'"></script>' . "\n";
|
||||||
|
} else {
|
||||||
|
$smarty->trigger_error("popup_init: missing src parameter");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* vim: set expandtab: */
|
||||||
|
|
||||||
|
?>
|
||||||
@@ -0,0 +1,147 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifier
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Smarty capitalize modifier plugin
|
||||||
|
* Type: modifier
|
||||||
|
* Name: capitalize
|
||||||
|
* Purpose: capitalize words in the string
|
||||||
|
* {@internal {$string|capitalize:true:true} is the fastest option for MBString enabled systems }}
|
||||||
|
*
|
||||||
|
* @param string $string string to capitalize
|
||||||
|
* @param boolean $uc_digits also capitalize "x123" to "X123"
|
||||||
|
* @param boolean $lc_rest capitalize first letters, lowercase all following letters "aAa" to "Aaa"
|
||||||
|
*
|
||||||
|
* @return string capitalized string
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
* @author Rodney Rehm
|
||||||
|
*/
|
||||||
|
function smarty_modifier_capitalize($string, $uc_digits = false, $lc_rest = false)
|
||||||
|
{
|
||||||
|
$string = (string) $string;
|
||||||
|
|
||||||
|
if (Smarty::$_MBSTRING) {
|
||||||
|
if ($lc_rest) {
|
||||||
|
// uppercase (including hyphenated words)
|
||||||
|
$upper_string = mb_convert_case($string, MB_CASE_TITLE, Smarty::$_CHARSET);
|
||||||
|
} else {
|
||||||
|
// uppercase word breaks
|
||||||
|
$upper_string = preg_replace_callback(
|
||||||
|
"!(^|[^\p{L}'])([\p{Ll}])!S" . Smarty::$_UTF8_MODIFIER,
|
||||||
|
'smarty_mod_cap_mbconvert_cb',
|
||||||
|
$string
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// check uc_digits case
|
||||||
|
if (!$uc_digits) {
|
||||||
|
if (preg_match_all(
|
||||||
|
"!\b([\p{L}]*[\p{N}]+[\p{L}]*)\b!" . Smarty::$_UTF8_MODIFIER,
|
||||||
|
$string,
|
||||||
|
$matches,
|
||||||
|
PREG_OFFSET_CAPTURE
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
foreach ($matches[ 1 ] as $match) {
|
||||||
|
$upper_string =
|
||||||
|
substr_replace(
|
||||||
|
$upper_string,
|
||||||
|
mb_strtolower($match[ 0 ], Smarty::$_CHARSET),
|
||||||
|
$match[ 1 ],
|
||||||
|
strlen($match[ 0 ])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$upper_string =
|
||||||
|
preg_replace_callback(
|
||||||
|
"!((^|\s)['\"])(\w)!" . Smarty::$_UTF8_MODIFIER,
|
||||||
|
'smarty_mod_cap_mbconvert2_cb',
|
||||||
|
$upper_string
|
||||||
|
);
|
||||||
|
return $upper_string;
|
||||||
|
}
|
||||||
|
// lowercase first
|
||||||
|
if ($lc_rest) {
|
||||||
|
$string = strtolower($string);
|
||||||
|
}
|
||||||
|
// uppercase (including hyphenated words)
|
||||||
|
$upper_string =
|
||||||
|
preg_replace_callback(
|
||||||
|
"!(^|[^\p{L}'])([\p{Ll}])!S" . Smarty::$_UTF8_MODIFIER,
|
||||||
|
'smarty_mod_cap_ucfirst_cb',
|
||||||
|
$string
|
||||||
|
);
|
||||||
|
// check uc_digits case
|
||||||
|
if (!$uc_digits) {
|
||||||
|
if (preg_match_all(
|
||||||
|
"!\b([\p{L}]*[\p{N}]+[\p{L}]*)\b!" . Smarty::$_UTF8_MODIFIER,
|
||||||
|
$string,
|
||||||
|
$matches,
|
||||||
|
PREG_OFFSET_CAPTURE
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
foreach ($matches[ 1 ] as $match) {
|
||||||
|
$upper_string =
|
||||||
|
substr_replace($upper_string, strtolower($match[ 0 ]), $match[ 1 ], strlen($match[ 0 ]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$upper_string = preg_replace_callback(
|
||||||
|
"!((^|\s)['\"])(\w)!" . Smarty::$_UTF8_MODIFIER,
|
||||||
|
'smarty_mod_cap_ucfirst2_cb',
|
||||||
|
$upper_string
|
||||||
|
);
|
||||||
|
return $upper_string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Bug: create_function() use exhausts memory when used in long loops
|
||||||
|
* Fix: use declared functions for callbacks instead of using create_function()
|
||||||
|
* Note: This can be fixed using anonymous functions instead, but that requires PHP >= 5.3
|
||||||
|
*
|
||||||
|
* @author Kyle Renfrow
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @param $matches
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function smarty_mod_cap_mbconvert_cb($matches)
|
||||||
|
{
|
||||||
|
return stripslashes($matches[ 1 ]) . mb_convert_case(stripslashes($matches[ 2 ]), MB_CASE_UPPER, Smarty::$_CHARSET);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $matches
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function smarty_mod_cap_mbconvert2_cb($matches)
|
||||||
|
{
|
||||||
|
return stripslashes($matches[ 1 ]) . mb_convert_case(stripslashes($matches[ 3 ]), MB_CASE_UPPER, Smarty::$_CHARSET);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $matches
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function smarty_mod_cap_ucfirst_cb($matches)
|
||||||
|
{
|
||||||
|
return stripslashes($matches[ 1 ]) . ucfirst(stripslashes($matches[ 2 ]));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $matches
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function smarty_mod_cap_ucfirst2_cb($matches)
|
||||||
|
{
|
||||||
|
return stripslashes($matches[ 1 ]) . ucfirst(stripslashes($matches[ 3 ]));
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifier
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Smarty count modifier plugin
|
||||||
|
* Type: modifier
|
||||||
|
* Name: count
|
||||||
|
* Purpose: counts all elements in an array or in a Countable object
|
||||||
|
* Input:
|
||||||
|
* - Countable|array: array or object to count
|
||||||
|
* - mode: int defaults to 0 for normal count mode, if set to 1 counts recursive
|
||||||
|
*
|
||||||
|
* @param mixed $arrayOrObject input array/object
|
||||||
|
* @param int $mode count mode
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
function smarty_modifier_count($arrayOrObject, $mode = 0)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* @see https://www.php.net/count
|
||||||
|
* > Prior to PHP 8.0.0, if the parameter was neither an array nor an object that implements the Countable interface,
|
||||||
|
* > 1 would be returned, unless value was null, in which case 0 would be returned.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ($arrayOrObject instanceof Countable || is_array($arrayOrObject)) {
|
||||||
|
return count($arrayOrObject, (int) $mode);
|
||||||
|
} elseif ($arrayOrObject === null) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifier
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Smarty date_format modifier plugin
|
||||||
|
* Type: modifier
|
||||||
|
* Name: date_format
|
||||||
|
* Purpose: format datestamps via strftime
|
||||||
|
* Input:
|
||||||
|
* - string: input date string
|
||||||
|
* - format: strftime format for output
|
||||||
|
* - default_date: default date if $string is empty
|
||||||
|
*
|
||||||
|
* @link https://www.smarty.net/manual/en/language.modifier.date.format.php date_format (Smarty online manual)
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
*
|
||||||
|
* @param string $string input date string
|
||||||
|
* @param string $format strftime format for output
|
||||||
|
* @param string $default_date default date if $string is empty
|
||||||
|
* @param string $formatter either 'strftime' or 'auto'
|
||||||
|
*
|
||||||
|
* @return string |void
|
||||||
|
* @uses smarty_make_timestamp()
|
||||||
|
*/
|
||||||
|
function smarty_modifier_date_format($string, $format = null, $default_date = '', $formatter = 'auto')
|
||||||
|
{
|
||||||
|
if ($format === null) {
|
||||||
|
$format = Smarty::$_DATE_FORMAT;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* require_once the {@link shared.make_timestamp.php} plugin
|
||||||
|
*/
|
||||||
|
static $is_loaded = false;
|
||||||
|
if (!$is_loaded) {
|
||||||
|
if (!is_callable('smarty_make_timestamp')) {
|
||||||
|
include_once SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php';
|
||||||
|
}
|
||||||
|
$is_loaded = true;
|
||||||
|
}
|
||||||
|
if (!empty($string) && $string !== '0000-00-00' && $string !== '0000-00-00 00:00:00') {
|
||||||
|
$timestamp = smarty_make_timestamp($string);
|
||||||
|
} elseif (!empty($default_date)) {
|
||||||
|
$timestamp = smarty_make_timestamp($default_date);
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ($formatter === 'strftime' || ($formatter === 'auto' && strpos($format, '%') !== false)) {
|
||||||
|
if (Smarty::$_IS_WINDOWS) {
|
||||||
|
$_win_from = array(
|
||||||
|
'%D',
|
||||||
|
'%h',
|
||||||
|
'%n',
|
||||||
|
'%r',
|
||||||
|
'%R',
|
||||||
|
'%t',
|
||||||
|
'%T'
|
||||||
|
);
|
||||||
|
$_win_to = array(
|
||||||
|
'%m/%d/%y',
|
||||||
|
'%b',
|
||||||
|
"\n",
|
||||||
|
'%I:%M:%S %p',
|
||||||
|
'%H:%M',
|
||||||
|
"\t",
|
||||||
|
'%H:%M:%S'
|
||||||
|
);
|
||||||
|
if (strpos($format, '%e') !== false) {
|
||||||
|
$_win_from[] = '%e';
|
||||||
|
$_win_to[] = sprintf('%\' 2d', date('j', $timestamp));
|
||||||
|
}
|
||||||
|
if (strpos($format, '%l') !== false) {
|
||||||
|
$_win_from[] = '%l';
|
||||||
|
$_win_to[] = sprintf('%\' 2d', date('h', $timestamp));
|
||||||
|
}
|
||||||
|
$format = str_replace($_win_from, $_win_to, $format);
|
||||||
|
}
|
||||||
|
// @ to suppress deprecation errors when running in PHP8.1 or higher.
|
||||||
|
return @strftime($format, $timestamp);
|
||||||
|
} else {
|
||||||
|
return date($format, $timestamp);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage Debug
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Smarty debug_print_var modifier plugin
|
||||||
|
* Type: modifier
|
||||||
|
* Name: debug_print_var
|
||||||
|
* Purpose: formats variable contents for display in the console
|
||||||
|
*
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
*
|
||||||
|
* @param array|object $var variable to be formatted
|
||||||
|
* @param int $max maximum recursion depth if $var is an array or object
|
||||||
|
* @param int $length maximum string length if $var is a string
|
||||||
|
* @param int $depth actual recursion depth
|
||||||
|
* @param array $objects processed objects in actual depth to prevent recursive object processing
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function smarty_modifier_debug_print_var($var, $max = 10, $length = 40, $depth = 0, $objects = array())
|
||||||
|
{
|
||||||
|
$_replace = array("\n" => '\n', "\r" => '\r', "\t" => '\t');
|
||||||
|
switch (gettype($var)) {
|
||||||
|
case 'array':
|
||||||
|
$results = '<b>Array (' . count($var) . ')</b>';
|
||||||
|
if ($depth === $max) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
foreach ($var as $curr_key => $curr_val) {
|
||||||
|
$results .= '<br>' . str_repeat(' ', $depth * 2) . '<b>' . strtr($curr_key, $_replace) .
|
||||||
|
'</b> => ' .
|
||||||
|
smarty_modifier_debug_print_var($curr_val, $max, $length, ++$depth, $objects);
|
||||||
|
$depth--;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'object':
|
||||||
|
$object_vars = get_object_vars($var);
|
||||||
|
$results = '<b>' . get_class($var) . ' Object (' . count($object_vars) . ')</b>';
|
||||||
|
if (in_array($var, $objects)) {
|
||||||
|
$results .= ' called recursive';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if ($depth === $max) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
$objects[] = $var;
|
||||||
|
foreach ($object_vars as $curr_key => $curr_val) {
|
||||||
|
$results .= '<br>' . str_repeat(' ', $depth * 2) . '<b> ->' . strtr($curr_key, $_replace) .
|
||||||
|
'</b> = ' . smarty_modifier_debug_print_var($curr_val, $max, $length, ++$depth, $objects);
|
||||||
|
$depth--;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'boolean':
|
||||||
|
case 'NULL':
|
||||||
|
case 'resource':
|
||||||
|
if (true === $var) {
|
||||||
|
$results = 'true';
|
||||||
|
} elseif (false === $var) {
|
||||||
|
$results = 'false';
|
||||||
|
} elseif (null === $var) {
|
||||||
|
$results = 'null';
|
||||||
|
} else {
|
||||||
|
$results = htmlspecialchars((string)$var);
|
||||||
|
}
|
||||||
|
$results = '<i>' . $results . '</i>';
|
||||||
|
break;
|
||||||
|
case 'integer':
|
||||||
|
case 'float':
|
||||||
|
$results = htmlspecialchars((string)$var);
|
||||||
|
break;
|
||||||
|
case 'string':
|
||||||
|
$results = strtr($var, $_replace);
|
||||||
|
if (Smarty::$_MBSTRING) {
|
||||||
|
if (mb_strlen($var, Smarty::$_CHARSET) > $length) {
|
||||||
|
$results = mb_substr($var, 0, $length - 3, Smarty::$_CHARSET) . '...';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (isset($var[ $length ])) {
|
||||||
|
$results = substr($var, 0, $length - 3) . '...';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$results = htmlspecialchars('"' . $results . '"', ENT_QUOTES, Smarty::$_CHARSET);
|
||||||
|
break;
|
||||||
|
case 'unknown type':
|
||||||
|
default:
|
||||||
|
$results = strtr((string)$var, $_replace);
|
||||||
|
if (Smarty::$_MBSTRING) {
|
||||||
|
if (mb_strlen($results, Smarty::$_CHARSET) > $length) {
|
||||||
|
$results = mb_substr($results, 0, $length - 3, Smarty::$_CHARSET) . '...';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (strlen($results) > $length) {
|
||||||
|
$results = substr($results, 0, $length - 3) . '...';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$results = htmlspecialchars($results, ENT_QUOTES, Smarty::$_CHARSET);
|
||||||
|
}
|
||||||
|
return $results;
|
||||||
|
}
|
||||||
@@ -0,0 +1,187 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifier
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Smarty escape modifier plugin
|
||||||
|
* Type: modifier
|
||||||
|
* Name: escape
|
||||||
|
* Purpose: escape string for output
|
||||||
|
*
|
||||||
|
* @link https://www.smarty.net/docs/en/language.modifier.escape
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
*
|
||||||
|
* @param string $string input string
|
||||||
|
* @param string $esc_type escape type
|
||||||
|
* @param string $char_set character set, used for htmlspecialchars() or htmlentities()
|
||||||
|
* @param boolean $double_encode encode already encoded entitites again, used for htmlspecialchars() or htmlentities()
|
||||||
|
*
|
||||||
|
* @return string escaped input string
|
||||||
|
*/
|
||||||
|
function smarty_modifier_escape($string, $esc_type = 'html', $char_set = null, $double_encode = true)
|
||||||
|
{
|
||||||
|
static $is_loaded_1 = false;
|
||||||
|
static $is_loaded_2 = false;
|
||||||
|
if (!$char_set) {
|
||||||
|
$char_set = Smarty::$_CHARSET;
|
||||||
|
}
|
||||||
|
|
||||||
|
$string = (string)$string;
|
||||||
|
|
||||||
|
switch ($esc_type) {
|
||||||
|
case 'html':
|
||||||
|
return htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode);
|
||||||
|
// no break
|
||||||
|
case 'htmlall':
|
||||||
|
if (Smarty::$_MBSTRING) {
|
||||||
|
$string = mb_convert_encoding($string, 'UTF-8', $char_set);
|
||||||
|
return htmlentities($string, ENT_QUOTES, 'UTF-8', $double_encode);
|
||||||
|
}
|
||||||
|
// no MBString fallback
|
||||||
|
return htmlentities($string, ENT_QUOTES, $char_set, $double_encode);
|
||||||
|
// no break
|
||||||
|
case 'url':
|
||||||
|
return rawurlencode($string);
|
||||||
|
case 'urlpathinfo':
|
||||||
|
return str_replace('%2F', '/', rawurlencode($string));
|
||||||
|
case 'quotes':
|
||||||
|
// escape unescaped single quotes
|
||||||
|
return preg_replace("%(?<!\\\\)'%", "\\'", $string);
|
||||||
|
case 'hex':
|
||||||
|
// escape every byte into hex
|
||||||
|
// Note that the UTF-8 encoded character ä will be represented as %c3%a4
|
||||||
|
$return = '';
|
||||||
|
$_length = strlen($string);
|
||||||
|
for ($x = 0; $x < $_length; $x++) {
|
||||||
|
$return .= '%' . bin2hex($string[ $x ]);
|
||||||
|
}
|
||||||
|
return $return;
|
||||||
|
case 'hexentity':
|
||||||
|
$return = '';
|
||||||
|
if (Smarty::$_MBSTRING) {
|
||||||
|
if (!$is_loaded_1) {
|
||||||
|
if (!is_callable('smarty_mb_to_unicode')) {
|
||||||
|
include_once SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php';
|
||||||
|
}
|
||||||
|
$is_loaded_1 = true;
|
||||||
|
}
|
||||||
|
$return = '';
|
||||||
|
foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) {
|
||||||
|
$return .= '&#x' . strtoupper(dechex($unicode)) . ';';
|
||||||
|
}
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
// no MBString fallback
|
||||||
|
$_length = strlen($string);
|
||||||
|
for ($x = 0; $x < $_length; $x++) {
|
||||||
|
$return .= '&#x' . bin2hex($string[ $x ]) . ';';
|
||||||
|
}
|
||||||
|
return $return;
|
||||||
|
case 'decentity':
|
||||||
|
$return = '';
|
||||||
|
if (Smarty::$_MBSTRING) {
|
||||||
|
if (!$is_loaded_1) {
|
||||||
|
if (!is_callable('smarty_mb_to_unicode')) {
|
||||||
|
include_once SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php';
|
||||||
|
}
|
||||||
|
$is_loaded_1 = true;
|
||||||
|
}
|
||||||
|
$return = '';
|
||||||
|
foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) {
|
||||||
|
$return .= '&#' . $unicode . ';';
|
||||||
|
}
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
// no MBString fallback
|
||||||
|
$_length = strlen($string);
|
||||||
|
for ($x = 0; $x < $_length; $x++) {
|
||||||
|
$return .= '&#' . ord($string[ $x ]) . ';';
|
||||||
|
}
|
||||||
|
return $return;
|
||||||
|
case 'javascript':
|
||||||
|
// escape quotes and backslashes, newlines, etc.
|
||||||
|
return strtr(
|
||||||
|
$string,
|
||||||
|
array(
|
||||||
|
'\\' => '\\\\',
|
||||||
|
"'" => "\\'",
|
||||||
|
'"' => '\\"',
|
||||||
|
"\r" => '\\r',
|
||||||
|
"\n" => '\\n',
|
||||||
|
'</' => '<\/',
|
||||||
|
// see https://html.spec.whatwg.org/multipage/scripting.html#restrictions-for-contents-of-script-elements
|
||||||
|
'<!--' => '<\!--',
|
||||||
|
'<s' => '<\s',
|
||||||
|
'<S' => '<\S'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
case 'mail':
|
||||||
|
if (Smarty::$_MBSTRING) {
|
||||||
|
if (!$is_loaded_2) {
|
||||||
|
if (!is_callable('smarty_mb_str_replace')) {
|
||||||
|
include_once SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php';
|
||||||
|
}
|
||||||
|
$is_loaded_2 = true;
|
||||||
|
}
|
||||||
|
return smarty_mb_str_replace(
|
||||||
|
array(
|
||||||
|
'@',
|
||||||
|
'.'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
' [AT] ',
|
||||||
|
' [DOT] '
|
||||||
|
),
|
||||||
|
$string
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// no MBString fallback
|
||||||
|
return str_replace(
|
||||||
|
array(
|
||||||
|
'@',
|
||||||
|
'.'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
' [AT] ',
|
||||||
|
' [DOT] '
|
||||||
|
),
|
||||||
|
$string
|
||||||
|
);
|
||||||
|
case 'nonstd':
|
||||||
|
// escape non-standard chars, such as ms document quotes
|
||||||
|
$return = '';
|
||||||
|
if (Smarty::$_MBSTRING) {
|
||||||
|
if (!$is_loaded_1) {
|
||||||
|
if (!is_callable('smarty_mb_to_unicode')) {
|
||||||
|
include_once SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php';
|
||||||
|
}
|
||||||
|
$is_loaded_1 = true;
|
||||||
|
}
|
||||||
|
foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) {
|
||||||
|
if ($unicode >= 126) {
|
||||||
|
$return .= '&#' . $unicode . ';';
|
||||||
|
} else {
|
||||||
|
$return .= chr($unicode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
$_length = strlen($string);
|
||||||
|
for ($_i = 0; $_i < $_length; $_i++) {
|
||||||
|
$_ord = ord(substr($string, $_i, 1));
|
||||||
|
// non-standard char, escape it
|
||||||
|
if ($_ord >= 126) {
|
||||||
|
$return .= '&#' . $_ord . ';';
|
||||||
|
} else {
|
||||||
|
$return .= substr($string, $_i, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $return;
|
||||||
|
default:
|
||||||
|
trigger_error("escape: unsupported type: $esc_type - returning unmodified string", E_USER_NOTICE);
|
||||||
|
return $string;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifier
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty explode modifier plugin
|
||||||
|
* Type: modifier
|
||||||
|
* Name: explode
|
||||||
|
* Purpose: split a string by a string
|
||||||
|
*
|
||||||
|
* @param string $separator
|
||||||
|
* @param string $string
|
||||||
|
* @param int|null $limit
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function smarty_modifier_explode($separator, $string, ?int $limit = null)
|
||||||
|
{
|
||||||
|
// provide $string default to prevent deprecation errors in PHP >=8.1
|
||||||
|
return explode($separator, $string ?? '', $limit ?? PHP_INT_MAX);
|
||||||
|
}
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifier
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Smarty wordwrap modifier plugin
|
||||||
|
* Type: modifier
|
||||||
|
* Name: mb_wordwrap
|
||||||
|
* Purpose: Wrap a string to a given number of characters
|
||||||
|
*
|
||||||
|
* @link https://php.net/manual/en/function.wordwrap.php for similarity
|
||||||
|
*
|
||||||
|
* @param string $str the string to wrap
|
||||||
|
* @param int $width the width of the output
|
||||||
|
* @param string $break the character used to break the line
|
||||||
|
* @param boolean $cut ignored parameter, just for the sake of
|
||||||
|
*
|
||||||
|
* @return string wrapped string
|
||||||
|
* @author Rodney Rehm
|
||||||
|
*/
|
||||||
|
function smarty_modifier_mb_wordwrap($str, $width = 75, $break = "\n", $cut = false)
|
||||||
|
{
|
||||||
|
// break words into tokens using white space as a delimiter
|
||||||
|
$tokens = preg_split('!(\s)!S' . Smarty::$_UTF8_MODIFIER, $str, -1, PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE);
|
||||||
|
$length = 0;
|
||||||
|
$t = '';
|
||||||
|
$_previous = false;
|
||||||
|
$_space = false;
|
||||||
|
foreach ($tokens as $_token) {
|
||||||
|
$token_length = mb_strlen($_token, Smarty::$_CHARSET);
|
||||||
|
$_tokens = array($_token);
|
||||||
|
if ($token_length > $width) {
|
||||||
|
if ($cut) {
|
||||||
|
$_tokens = preg_split(
|
||||||
|
'!(.{' . $width . '})!S' . Smarty::$_UTF8_MODIFIER,
|
||||||
|
$_token,
|
||||||
|
-1,
|
||||||
|
PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach ($_tokens as $token) {
|
||||||
|
$_space = !!preg_match('!^\s$!S' . Smarty::$_UTF8_MODIFIER, $token);
|
||||||
|
$token_length = mb_strlen($token, Smarty::$_CHARSET);
|
||||||
|
$length += $token_length;
|
||||||
|
if ($length > $width) {
|
||||||
|
// remove space before inserted break
|
||||||
|
if ($_previous) {
|
||||||
|
$t = mb_substr($t, 0, -1, Smarty::$_CHARSET);
|
||||||
|
}
|
||||||
|
if (!$_space) {
|
||||||
|
// add the break before the token
|
||||||
|
if (!empty($t)) {
|
||||||
|
$t .= $break;
|
||||||
|
}
|
||||||
|
$length = $token_length;
|
||||||
|
}
|
||||||
|
} elseif ($token === "\n") {
|
||||||
|
// hard break must reset counters
|
||||||
|
$length = 0;
|
||||||
|
}
|
||||||
|
$_previous = $_space;
|
||||||
|
// add the token
|
||||||
|
$t .= $token;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $t;
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifier
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty number_format modifier plugin
|
||||||
|
* Type: modifier
|
||||||
|
* Name: number_format
|
||||||
|
* Purpose: Format a number with grouped thousands
|
||||||
|
*
|
||||||
|
* @param float|null $num
|
||||||
|
* @param int $decimals
|
||||||
|
* @param string|null $decimal_separator
|
||||||
|
* @param string|null $thousands_separator
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function smarty_modifier_number_format(?float $num, int $decimals = 0, ?string $decimal_separator = ".", ?string $thousands_separator = ",")
|
||||||
|
{
|
||||||
|
// provide $num default to prevent deprecation errors in PHP >=8.1
|
||||||
|
return number_format($num ?? 0.0, $decimals, $decimal_separator, $thousands_separator);
|
||||||
|
}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifier
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Smarty regex_replace modifier plugin
|
||||||
|
* Type: modifier
|
||||||
|
* Name: regex_replace
|
||||||
|
* Purpose: regular expression search/replace
|
||||||
|
*
|
||||||
|
* @link https://www.smarty.net/manual/en/language.modifier.regex.replace.php
|
||||||
|
* regex_replace (Smarty online manual)
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
*
|
||||||
|
* @param string $string input string
|
||||||
|
* @param string|array $search regular expression(s) to search for
|
||||||
|
* @param string|array $replace string(s) that should be replaced
|
||||||
|
* @param int $limit the maximum number of replacements
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function smarty_modifier_regex_replace($string, $search, $replace, $limit = -1)
|
||||||
|
{
|
||||||
|
if (is_array($search)) {
|
||||||
|
foreach ($search as $idx => $s) {
|
||||||
|
$search[ $idx ] = _smarty_regex_replace_check($s);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$search = _smarty_regex_replace_check($search);
|
||||||
|
}
|
||||||
|
return preg_replace($search, $replace, $string, $limit);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $search string(s) that should be replaced
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @ignore
|
||||||
|
*/
|
||||||
|
function _smarty_regex_replace_check($search)
|
||||||
|
{
|
||||||
|
// null-byte injection detection
|
||||||
|
// anything behind the first null-byte is ignored
|
||||||
|
if (($pos = strpos($search, "\0")) !== false) {
|
||||||
|
$search = substr($search, 0, $pos);
|
||||||
|
}
|
||||||
|
// remove eval-modifier from $search
|
||||||
|
if (preg_match('!([a-zA-Z\s]+)$!s', $search, $match) && (strpos($match[ 1 ], 'e') !== false)) {
|
||||||
|
$search = substr($search, 0, -strlen($match[ 1 ])) . preg_replace('![e\s]+!', '', $match[ 1 ]);
|
||||||
|
}
|
||||||
|
return $search;
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifier
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Smarty replace modifier plugin
|
||||||
|
* Type: modifier
|
||||||
|
* Name: replace
|
||||||
|
* Purpose: simple search/replace
|
||||||
|
*
|
||||||
|
* @link https://www.smarty.net/manual/en/language.modifier.replace.php replace (Smarty online manual)
|
||||||
|
* @author Monte Ohrt <monte at ohrt dot com>
|
||||||
|
* @author Uwe Tews
|
||||||
|
*
|
||||||
|
* @param string $string input string
|
||||||
|
* @param string $search text to search for
|
||||||
|
* @param string $replace replacement text
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function smarty_modifier_replace($string, $search, $replace)
|
||||||
|
{
|
||||||
|
static $is_loaded = false;
|
||||||
|
if (Smarty::$_MBSTRING) {
|
||||||
|
if (!$is_loaded) {
|
||||||
|
if (!is_callable('smarty_mb_str_replace')) {
|
||||||
|
include_once SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php';
|
||||||
|
}
|
||||||
|
$is_loaded = true;
|
||||||
|
}
|
||||||
|
return smarty_mb_str_replace($search, $replace, $string);
|
||||||
|
}
|
||||||
|
return str_replace($search, $replace, $string);
|
||||||
|
}
|
||||||
Loaded 100 of 3063 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user