Switch to YAML configuration file, add Config & App classes in EesyPHP namespace
App initialization is now handle by App::init() method and all configuration information is now retreive using Config::get() method.
This commit is contained in:
parent
5496ff55c0
commit
f2edf4910a
19 changed files with 725 additions and 292 deletions
|
@ -23,7 +23,10 @@
|
||||||
"smarty-gettext/smarty-gettext": "^1.6",
|
"smarty-gettext/smarty-gettext": "^1.6",
|
||||||
"smarty-gettext/tsmarty2c": "^0.2.1",
|
"smarty-gettext/tsmarty2c": "^0.2.1",
|
||||||
"sepia/po-parser": "^6.0",
|
"sepia/po-parser": "^6.0",
|
||||||
"sentry/sdk": "^3.3"
|
"sentry/sdk": "^3.3",
|
||||||
|
"ext-pdo": "^7.3",
|
||||||
|
"ext-json": "^7.3",
|
||||||
|
"ext-yaml": "^2.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"phpstan/phpstan": "^1.9"
|
"phpstan/phpstan": "^1.9"
|
||||||
|
|
10
composer.lock
generated
10
composer.lock
generated
|
@ -4,7 +4,7 @@
|
||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "372e3ce1ce40fd466379b8709b0f7c5a",
|
"content-hash": "bbb5f6bafa8928dce90eb5d63dbc0376",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "brenard/php-unidecode",
|
"name": "brenard/php-unidecode",
|
||||||
|
@ -2856,7 +2856,11 @@
|
||||||
},
|
},
|
||||||
"prefer-stable": false,
|
"prefer-stable": false,
|
||||||
"prefer-lowest": false,
|
"prefer-lowest": false,
|
||||||
"platform": [],
|
"platform": {
|
||||||
|
"ext-pdo": "^7.4",
|
||||||
|
"ext-yaml": "^2.1",
|
||||||
|
"ext-json": "^7.4"
|
||||||
|
},
|
||||||
"platform-dev": [],
|
"platform-dev": [],
|
||||||
"plugin-api-version": "2.3.0"
|
"plugin-api-version": "2.0.0"
|
||||||
}
|
}
|
||||||
|
|
2
includes/.gitignore
vendored
2
includes/.gitignore
vendored
|
@ -1 +1 @@
|
||||||
config.local.php
|
config.local.yml
|
||||||
|
|
|
@ -1,155 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
// Public root URL
|
|
||||||
$public_root_url = "http://127.0.0.1/eesyphp";
|
|
||||||
|
|
||||||
// Application root data directory
|
|
||||||
$data_dir = $root_dir_path."/data";
|
|
||||||
|
|
||||||
// Temporary files root directory
|
|
||||||
$tmp_root_dir = "$data_dir/tmp";
|
|
||||||
|
|
||||||
// Temporary uploading files directory
|
|
||||||
$upload_tmp_dir = "$tmp_root_dir/uploading";
|
|
||||||
|
|
||||||
// Main pagetitle
|
|
||||||
$main_pagetitle = "Eesyphp";
|
|
||||||
|
|
||||||
// Theme CSS file
|
|
||||||
$included_css_files = array();
|
|
||||||
|
|
||||||
// Log configuration
|
|
||||||
|
|
||||||
// Logs directory path
|
|
||||||
$logs_dir_path = "$data_dir/logs";
|
|
||||||
|
|
||||||
// Log file path
|
|
||||||
if (php_sapi_name() == "cli")
|
|
||||||
$log_file = "$logs_dir_path/cli.log";
|
|
||||||
else
|
|
||||||
$log_file = "$logs_dir_path/app.log";
|
|
||||||
|
|
||||||
// Log level (TRACE / DEBUG / INFO / WARNING / ERROR / FATAL)
|
|
||||||
$log_level = 'INFO';
|
|
||||||
|
|
||||||
// Debug Ajax request/response
|
|
||||||
$debug_ajax = false;
|
|
||||||
|
|
||||||
// Log PHP errors levels (as specified to set_error_handler())
|
|
||||||
// Default:
|
|
||||||
// - In TRACE or DEBUG: E_ALL & ~E_STRICT
|
|
||||||
// - Otherwise: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
|
|
||||||
// $log_php_errors_levels = E_ALL & ~E_STRICT;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Sentry configuration
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Sentry DSN
|
|
||||||
$sentry_dsn = null;
|
|
||||||
|
|
||||||
// Log PHP errors in Sentry: list of errors types to logs
|
|
||||||
// Note: must also match with $log_php_errors_levels.
|
|
||||||
// See: https://www.php.net/manual/fr/errorfunc.constants.php
|
|
||||||
$sentry_php_error_types = array(
|
|
||||||
E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR,
|
|
||||||
E_RECOVERABLE_ERROR,E_DEPRECATED,
|
|
||||||
);
|
|
||||||
|
|
||||||
// Traces sample rate (between 0 and 1)
|
|
||||||
// Note: this parameter permit to determine how many transactions (=~ access) are traced and
|
|
||||||
// sent to Sentry, for instance, 0.2 meen that 20% of the transactions will be traced. In dev
|
|
||||||
// mode, set to 1 if you want all transactions are sent to Sentry.
|
|
||||||
// Default: 0.2
|
|
||||||
$sentry_traces_sample_rate = 0.2;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Smarty template configuration
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Smarty directories
|
|
||||||
$smarty_templates_dir = "$root_dir_path/templates";
|
|
||||||
$smarty_templates_c_dir = "$tmp_root_dir/templates_c";
|
|
||||||
|
|
||||||
// Default locale (see locales directory for available languages list)
|
|
||||||
$default_locale = 'en_US.UTF8';
|
|
||||||
|
|
||||||
// Session
|
|
||||||
$session_timeout = 1800; // Session timeout dur to inactivity (in seconds)
|
|
||||||
$session_max_duration = 43200; // Session max duration (in seconds, default : 12h)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Database configuration
|
|
||||||
**/
|
|
||||||
|
|
||||||
// Sqlite
|
|
||||||
$db_dsn="sqlite:$root_dir_path/data/db.sqlite3";
|
|
||||||
$db_user=null;
|
|
||||||
$db_pwd=null;
|
|
||||||
$db_options=array();
|
|
||||||
|
|
||||||
// Date/Datetime format in database (strptime format)
|
|
||||||
$db_date_format = '%s';
|
|
||||||
$db_datetime_format = '%s';
|
|
||||||
|
|
||||||
/*
|
|
||||||
// Postgresql
|
|
||||||
$db_dsn="pgsql:host=localhost;port=5432;dbname=items";
|
|
||||||
$db_user="items";
|
|
||||||
$db_pwd="items";
|
|
||||||
$db_options=array();
|
|
||||||
|
|
||||||
// Date/Datetime format in database (strptime format)
|
|
||||||
$db_date_format = '%Y-%m-%d'; // Exemple : 2018-10-12
|
|
||||||
$db_datetime_format = '%Y-%m-%d %H:%M:%S'; // Exemple : 2018-10-12 18:06:59
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
// MariaDB / MySQL
|
|
||||||
$db_dsn="mysql:host=localhost;dbname=items";
|
|
||||||
$db_user="items";
|
|
||||||
$db_pwd="items";
|
|
||||||
$db_options=array();
|
|
||||||
|
|
||||||
// Date/Datetime format in database (strptime format)
|
|
||||||
$db_date_format = '%Y-%m-%d'; // Exemple : 2018-10-12
|
|
||||||
$db_datetime_format = '%Y-%m-%d %H:%M:%S'; // Exemple : 2018-10-12 18:06:59
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Config Mail
|
|
||||||
*/
|
|
||||||
|
|
||||||
// PHP PEAR Mail and Mail_Mine paths
|
|
||||||
$php_mail_path = 'Mail.php';
|
|
||||||
$php_mail_mime_path = 'Mail/mime.php';
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Sending method :
|
|
||||||
* - mail : use PHP mail function
|
|
||||||
* - sendmail : use sendmail system command
|
|
||||||
* - smtp : use an SMTP server (PHP PEAR Net_SMTP required)
|
|
||||||
*/
|
|
||||||
$mail_send_method = 'smtp';
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Sending parameters
|
|
||||||
* See : http://pear.php.net/manual/en/package.mail.mail.factory.php
|
|
||||||
*/
|
|
||||||
$mail_send_params = NULL;
|
|
||||||
|
|
||||||
// Headers add to all e-mails sent
|
|
||||||
$mail_headers = array();
|
|
||||||
|
|
||||||
// Email sender address (for all emails sent by the application)
|
|
||||||
$mail_sender = "noreply@example.org";
|
|
||||||
|
|
||||||
// Catch all e-mails sent to a configured e-mail address
|
|
||||||
$mail_catch_all = false;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Web Stats JS code
|
|
||||||
*/
|
|
||||||
$webstats_js_code = '';
|
|
||||||
|
|
||||||
# vim: tabstop=2 shiftwidth=2 softtabstop=2 expandtab
|
|
170
includes/config.yml
Normal file
170
includes/config.yml
Normal file
|
@ -0,0 +1,170 @@
|
||||||
|
# Public root URL
|
||||||
|
public_root_url: "http://127.0.0.1/eesyphp"
|
||||||
|
|
||||||
|
# Application root data directory
|
||||||
|
data_directory: "${root_directory_path}/data"
|
||||||
|
|
||||||
|
# Temporary files root directory
|
||||||
|
tmp_root_directory: "${data_directory}/tmp"
|
||||||
|
|
||||||
|
# Temporary uploading files directory
|
||||||
|
upload_tmp_directory: ${tmp_root_directory}/uploading"
|
||||||
|
|
||||||
|
# Main pagetitle
|
||||||
|
main_pagetitle: "Eesyphp"
|
||||||
|
|
||||||
|
# Theme CSS file
|
||||||
|
included_css_files:
|
||||||
|
#- css/custom.css
|
||||||
|
included_js_files:
|
||||||
|
#- js/custom.js
|
||||||
|
|
||||||
|
# Debug Ajax request/response
|
||||||
|
debug_ajax: false
|
||||||
|
|
||||||
|
#
|
||||||
|
# Log configuration
|
||||||
|
#
|
||||||
|
log:
|
||||||
|
# Logs directory path
|
||||||
|
directory_path: "${data_directory}/logs"
|
||||||
|
|
||||||
|
# CLI log file path
|
||||||
|
cli_file_path: "${log.directory_path}/cli.log"
|
||||||
|
|
||||||
|
# Log file path
|
||||||
|
file_path: "${log.directory_path}/app.log"
|
||||||
|
|
||||||
|
# Log level (TRACE / DEBUG / INFO / WARNING / ERROR / FATAL)
|
||||||
|
level: 'INFO'
|
||||||
|
|
||||||
|
# Log PHP errors levels (as specified to set_error_handler())
|
||||||
|
# Note: expected a list of PHP error level constants that will be resolved and combine
|
||||||
|
# with a bitwise operator. After the first value, the bitwise operator "|" (OR) or "^" (XOR)
|
||||||
|
# could be specified as contanst name prefix, otherwise the "&" (AND) operator will be used.
|
||||||
|
# The constant name could also be prefix with "~" or "!" (NOT) bitwise operator.
|
||||||
|
#
|
||||||
|
# Default:
|
||||||
|
# - In TRACE or DEBUG: E_ALL & ~E_STRICT
|
||||||
|
# - Otherwise: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
|
||||||
|
#log_php_errors_levels:
|
||||||
|
# - E_ALL
|
||||||
|
# - ~E_NOTICE
|
||||||
|
# - ~E_STRICT
|
||||||
|
# - ~E_DEPRECATED
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Sentry configuration
|
||||||
|
#
|
||||||
|
sentry:
|
||||||
|
# Sentry DSN
|
||||||
|
#dsn: null
|
||||||
|
|
||||||
|
# Log PHP errors in Sentry: list of errors types to logs
|
||||||
|
# See: https://www.php.net/manual/fr/errorfunc.constants.php
|
||||||
|
php_error_types:
|
||||||
|
- "E_ERROR"
|
||||||
|
- "E_PARSE"
|
||||||
|
- "E_CORE_ERROR"
|
||||||
|
- "E_COMPILE_ERROR"
|
||||||
|
- "E_USER_ERROR"
|
||||||
|
- "E_RECOVERABLE_ERROR"
|
||||||
|
- "E_DEPRECATED"
|
||||||
|
|
||||||
|
|
||||||
|
# Traces sample rate (between 0 and 1)
|
||||||
|
# Note: this parameter permit to determine how many transactions (=~ access) are traced and
|
||||||
|
# sent to Sentry, for instance, 0.2 meen that 20% of the transactions will be traced. In dev
|
||||||
|
# mode, set to 1 if you want all transactions are sent to Sentry.
|
||||||
|
# Default: 0.2
|
||||||
|
traces_sample_rate: 0.2
|
||||||
|
|
||||||
|
#
|
||||||
|
# Smarty template configuration
|
||||||
|
#
|
||||||
|
template:
|
||||||
|
# Smarty directories
|
||||||
|
directory: "${root_directory_path}/templates"
|
||||||
|
cache_directory: "${tmp_root_directory}/templates_c"
|
||||||
|
|
||||||
|
#
|
||||||
|
# Translations
|
||||||
|
#
|
||||||
|
i18n:
|
||||||
|
# Default locale (see locales directory for available languages list)
|
||||||
|
default_locale: 'en_US.UTF8'
|
||||||
|
|
||||||
|
#
|
||||||
|
# Session
|
||||||
|
#
|
||||||
|
session:
|
||||||
|
timeout: 1800 # Session timeout dur to inactivity (in seconds)
|
||||||
|
max_duration: 43200 # Session max duration (in seconds, default : 12h)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Database configuration
|
||||||
|
#
|
||||||
|
db:
|
||||||
|
# Sqlite
|
||||||
|
dsn: "sqlite:${data_directory}/db.sqlite3"
|
||||||
|
options: null
|
||||||
|
|
||||||
|
# Date/Datetime format in database (strptime format)
|
||||||
|
date_format: '%s'
|
||||||
|
datetime_format: '%s'
|
||||||
|
|
||||||
|
# Postgresql
|
||||||
|
#dsn: "pgsql:host=localhost;port=5432;dbname=items"
|
||||||
|
#user: "items"
|
||||||
|
#pwd: "items"
|
||||||
|
#options: null
|
||||||
|
|
||||||
|
# Date/Datetime format in database (strptime format)
|
||||||
|
#date_format: '%Y-%m-%d' # Exemple : 2018-10-12
|
||||||
|
#datetime_format: '%Y-%m-%d %H:%M:%S' # Exemple : 2018-10-12 18:06:59
|
||||||
|
|
||||||
|
# MariaDB / MySQL
|
||||||
|
#dsn: "mysql:host=localhost;dbname=items"
|
||||||
|
#user: "items"
|
||||||
|
#pwd: "items"
|
||||||
|
#options: null
|
||||||
|
|
||||||
|
# Date/Datetime format in database (strptime format)
|
||||||
|
#date_format: '%Y-%m-%d' # Exemple : 2018-10-12
|
||||||
|
#datetime_format: '%Y-%m-%d %H:%M:%S' # Exemple : 2018-10-12 18:06:59
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Email configuration
|
||||||
|
#
|
||||||
|
email:
|
||||||
|
# PHP PEAR Mail and Mail_Mine paths
|
||||||
|
php_mail_path: 'Mail.php'
|
||||||
|
php_mail_mime_path: 'Mail/mime.php'
|
||||||
|
|
||||||
|
|
||||||
|
# Sending method :
|
||||||
|
# - mail : use PHP mail function
|
||||||
|
# - sendmail : use sendmail system command
|
||||||
|
# - smtp : use an SMTP server (PHP PEAR Net_SMTP required)
|
||||||
|
send_method: 'smtp'
|
||||||
|
|
||||||
|
# Sending parameters
|
||||||
|
# See : http:#pear.php.net/manual/en/package.mail.mail.factory.php
|
||||||
|
send_params: NULL
|
||||||
|
|
||||||
|
# Headers add to all e-mails sent
|
||||||
|
headers:
|
||||||
|
#- "CC: support@example.com"
|
||||||
|
|
||||||
|
# Email sender address (for all emails sent by the application)
|
||||||
|
sender: "noreply@example.org"
|
||||||
|
|
||||||
|
# Catch all e-mails sent to a configured e-mail address
|
||||||
|
catch_all: false
|
||||||
|
|
||||||
|
# Web Stats JS code
|
||||||
|
webstats_js_code: ''
|
||||||
|
|
||||||
|
# vim: tabstop=2 shiftwidth=2 softtabstop=2 expandtab
|
|
@ -1,13 +1,9 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
use EesyPHP\Email;
|
use EesyPHP\App;
|
||||||
|
use EesyPHP\Config;
|
||||||
use EesyPHP\I18n;
|
use EesyPHP\I18n;
|
||||||
use EesyPHP\Log;
|
|
||||||
use EesyPHP\SentryIntegration;
|
|
||||||
use EesyPHP\SentrySpan;
|
use EesyPHP\SentrySpan;
|
||||||
use EesyPHP\SentryTransaction;
|
|
||||||
use EesyPHP\Session;
|
|
||||||
use EesyPHP\Url;
|
|
||||||
|
|
||||||
error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);
|
error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);
|
||||||
|
|
||||||
|
@ -31,39 +27,20 @@ set_include_path($root_dir_path.'/includes' . PATH_SEPARATOR . get_include_path(
|
||||||
// Load composer autoload.php
|
// Load composer autoload.php
|
||||||
require("$root_dir_path/vendor/autoload.php");
|
require("$root_dir_path/vendor/autoload.php");
|
||||||
|
|
||||||
// Load configuration
|
// Initialize EesyPHP application
|
||||||
require_once('config.inc.php');
|
App::init(
|
||||||
|
"$root_dir_path/includes/config.yml",
|
||||||
// Load local configuration file is present
|
array(
|
||||||
if (is_file("$root_dir_path/includes/config.local.php")) {
|
'overwrite_config_files' => array(
|
||||||
require "$root_dir_path/includes/config.local.php";
|
"$root_dir_path/includes/config.local.yml",
|
||||||
}
|
),
|
||||||
|
),
|
||||||
SentryIntegration :: init(
|
$root_dir_path
|
||||||
isset($sentry_dsn)?$sentry_dsn:null,
|
|
||||||
isset($sentry_traces_sample_rate)?$sentry_traces_sample_rate:null,
|
|
||||||
isset($sentry_php_error_types)?$sentry_php_error_types:null,
|
|
||||||
);
|
);
|
||||||
$sentry_transaction = new SentryTransaction();
|
|
||||||
|
|
||||||
$sentry_span = new SentrySpan('core.init', 'Core initialization');
|
$sentry_span = new SentrySpan('core.init', 'Core initialization');
|
||||||
|
|
||||||
// Define upload_tmp_dir
|
|
||||||
if (isset($upload_tmp_dir))
|
|
||||||
ini_set('upload_tmp_dir', $upload_tmp_dir);
|
|
||||||
|
|
||||||
if (!isset($log_file))
|
|
||||||
die('Log file path not configured');
|
|
||||||
Log::init(
|
|
||||||
$log_file,
|
|
||||||
isset($log_level)?$log_level:null,
|
|
||||||
isset($log_php_errors_levels)?$log_php_errors_levels:null
|
|
||||||
);
|
|
||||||
require_once('functions.php');
|
require_once('functions.php');
|
||||||
Session :: init(
|
|
||||||
isset($session_max_duration)?$session_max_duration:null,
|
|
||||||
isset($session_timeout)?$session_timeout:null
|
|
||||||
);
|
|
||||||
|
|
||||||
// Nomenclatures
|
// Nomenclatures
|
||||||
$status_list = array (
|
$status_list = array (
|
||||||
|
@ -72,29 +49,14 @@ $status_list = array (
|
||||||
'refused' => I18n :: ___('Refused'),
|
'refused' => I18n :: ___('Refused'),
|
||||||
'archived' => I18n :: ___('Archived'),
|
'archived' => I18n :: ___('Archived'),
|
||||||
);
|
);
|
||||||
|
foreach($status_list as $key => $value)
|
||||||
|
$status_list[$key] = _($value);
|
||||||
|
|
||||||
require_once('cli.php');
|
require_once('cli.php');
|
||||||
require_once('templates.php');
|
require_once('templates.php');
|
||||||
Url::init(isset($public_root_url)?$public_root_url:null);
|
|
||||||
require_once('url-helpers.php');
|
require_once('url-helpers.php');
|
||||||
require_once('db.php');
|
require_once('db.php');
|
||||||
Email :: init(
|
|
||||||
isset($mail_sender)?$mail_sender:null,
|
|
||||||
isset($mail_send_method)?$mail_send_method:null,
|
|
||||||
isset($mail_send_params)?$mail_send_params:null,
|
|
||||||
isset($mail_catch_all)?$mail_catch_all:null,
|
|
||||||
isset($mail_headers)?$mail_headers:null,
|
|
||||||
isset($php_mail_path)?$php_mail_path:null,
|
|
||||||
isset($php_mail_mime_path)?$php_mail_mime_path:null,
|
|
||||||
);
|
|
||||||
|
|
||||||
// Initialize translation
|
|
||||||
I18n::init(
|
|
||||||
"$root_dir_path/locales",
|
|
||||||
isset($default_locale)?$default_locale:null);
|
|
||||||
|
|
||||||
foreach($status_list as $key => $value)
|
|
||||||
$status_list[$key] = _($value);
|
|
||||||
$sentry_span->finish();
|
$sentry_span->finish();
|
||||||
|
|
||||||
# vim: tabstop=2 shiftwidth=2 softtabstop=2 expandtab
|
# vim: tabstop=2 shiftwidth=2 softtabstop=2 expandtab
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
use EesyPHP\Config;
|
||||||
use EesyPHP\Db;
|
use EesyPHP\Db;
|
||||||
use EesyPHP\Hook;
|
use EesyPHP\Hook;
|
||||||
use EesyPHP\Log;
|
use EesyPHP\Log;
|
||||||
|
@ -7,12 +8,12 @@ use EesyPHP\Log;
|
||||||
use Unidecode\Unidecode;
|
use Unidecode\Unidecode;
|
||||||
|
|
||||||
$db = new Db(
|
$db = new Db(
|
||||||
isset($db_dsn)?$db_dsn:null,
|
Config::get('db.dsn', null, 'string'),
|
||||||
isset($db_user)?$db_user:null,
|
Config::get('db.user', null, 'string'),
|
||||||
isset($db_pwd)?$db_pwd:null,
|
Config::get('db.password', null, 'string'),
|
||||||
isset($db_options)?$db_options:null,
|
Config::get('db.options', array(), 'array'),
|
||||||
isset($db_date_format)?$db_date_format:null,
|
Config::get('db.date_format', null, 'string'),
|
||||||
isset($db_datetime_format)?$db_datetime_format:null
|
Config::get('db.datetime_format', null, 'string'),
|
||||||
);
|
);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -150,10 +151,10 @@ function delete_item($id) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function search_items($params) {
|
function search_items($params) {
|
||||||
global $db, $db_dsn;
|
global $db;
|
||||||
|
|
||||||
// Detect PgSQL backend
|
// Detect PgSQL backend
|
||||||
$is_pgsql = (strpos($db_dsn, "pgsql:") === 0);
|
$is_pgsql = (strpos(Config::get('db.dsn', '', 'string'), "pgsql:") === 0);
|
||||||
|
|
||||||
$where = array();
|
$where = array();
|
||||||
if (isset($params['status']) && $params['status'] && $params['status'] != 'all')
|
if (isset($params['status']) && $params['status'] && $params['status'] != 'all')
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
use EesyPHP\Config;
|
||||||
use EesyPHP\Date;
|
use EesyPHP\Date;
|
||||||
use EesyPHP\Hook;
|
use EesyPHP\Hook;
|
||||||
use EesyPHP\Log;
|
use EesyPHP\Log;
|
||||||
|
@ -7,12 +8,6 @@ use EesyPHP\Tpl;
|
||||||
|
|
||||||
use function EesyPHP\format_size;
|
use function EesyPHP\format_size;
|
||||||
|
|
||||||
Tpl :: init(
|
|
||||||
isset($smarty_templates_dir)?$smarty_templates_dir:null,
|
|
||||||
isset($smarty_templates_c_dir)?$smarty_templates_c_dir:null,
|
|
||||||
isset($debug_ajax)?$debug_ajax:false
|
|
||||||
);
|
|
||||||
|
|
||||||
if (php_sapi_name() == "cli")
|
if (php_sapi_name() == "cli")
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
@ -28,18 +23,16 @@ Tpl :: enable_security_mode(
|
||||||
);
|
);
|
||||||
|
|
||||||
// Defined some global template variables
|
// Defined some global template variables
|
||||||
Tpl :: assign('public_root_url', isset($public_root_url)?$public_root_url:'/');
|
Tpl :: assign('public_root_url', Config::get('public_root_url', '/', 'string'));
|
||||||
Tpl :: assign('main_pagetitle', isset($main_pagetitle)?$main_pagetitle:null);
|
Tpl :: assign('main_pagetitle', Config::get('main_pagetitle', null, 'string'));
|
||||||
Tpl :: assign('session_key', $_SESSION['session_key']);
|
Tpl :: assign('session_key', $_SESSION['session_key']);
|
||||||
|
|
||||||
// Handle CSS & JS files included
|
// Handle CSS & JS files included
|
||||||
if (isset($included_css_files) && is_array($included_css_files))
|
Tpl :: add_css_file(Config::get('included_css_files', array(), 'array'));
|
||||||
Tpl :: add_css_file($included_css_files);
|
Tpl :: add_js_file(Config::get('included_js_files', array(), 'array'));
|
||||||
if (isset($included_js_files) && is_array($included_js_files))
|
|
||||||
Tpl :: add_css_file($included_js_files);
|
|
||||||
|
|
||||||
function define_common_template_variables($event) {
|
function define_common_template_variables($event) {
|
||||||
global $status_list, $admin, $webstats_js_code;
|
global $status_list, $admin;
|
||||||
Tpl :: assign(
|
Tpl :: assign(
|
||||||
'status_list',
|
'status_list',
|
||||||
isset($status_list) && is_array($status_list)?
|
isset($status_list) && is_array($status_list)?
|
||||||
|
@ -48,7 +41,7 @@ function define_common_template_variables($event) {
|
||||||
Tpl :: assign('admin', isset($admin) && $admin);
|
Tpl :: assign('admin', isset($admin) && $admin);
|
||||||
Tpl :: assign(
|
Tpl :: assign(
|
||||||
'webstats_js_code',
|
'webstats_js_code',
|
||||||
isset($webstats_js_code)?$webstats_js_code:null);
|
Config::get('webstats_js_code', null, 'string'));
|
||||||
}
|
}
|
||||||
Hook :: register('before_displaying_template', 'define_common_template_variables');
|
Hook :: register('before_displaying_template', 'define_common_template_variables');
|
||||||
|
|
||||||
|
|
|
@ -20,10 +20,6 @@ parameters:
|
||||||
-
|
-
|
||||||
message: "#Call to static method isError\\(\\) on an unknown class PEAR\\.#"
|
message: "#Call to static method isError\\(\\) on an unknown class PEAR\\.#"
|
||||||
path: src/Email.php
|
path: src/Email.php
|
||||||
-
|
|
||||||
message: "#Variable \\$root_dir_path might not be defined\\.#"
|
|
||||||
paths:
|
|
||||||
- includes/config.inc.php
|
|
||||||
-
|
-
|
||||||
message: "#Variable \\$status_list might not be defined\\.#"
|
message: "#Variable \\$status_list might not be defined\\.#"
|
||||||
paths:
|
paths:
|
||||||
|
|
103
src/App.php
Normal file
103
src/App.php
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace EesyPHP;
|
||||||
|
|
||||||
|
class App {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Options
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected static $options = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Root directory path
|
||||||
|
* @var string|null
|
||||||
|
*/
|
||||||
|
protected static $root_directory_path = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialization
|
||||||
|
* @param string|null $config_file Application configuration file path
|
||||||
|
* @param array|null $options Application options (default: null)
|
||||||
|
* @param string|null $root_directory_path Application root directory path (default: null)
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function init($config_file, $options=null, $root_directory_path=null) {
|
||||||
|
if (is_array($options)) self :: $options = $options;
|
||||||
|
|
||||||
|
if (is_null($root_directory_path)) {
|
||||||
|
$traces = debug_backtrace();
|
||||||
|
$root_directory_path = realpath(dirname($traces[0]['file']).'/../');
|
||||||
|
}
|
||||||
|
self :: $root_directory_path = $root_directory_path;
|
||||||
|
Config::register_extra_variable('root_directory_path', $root_directory_path);
|
||||||
|
|
||||||
|
$config_file = Config::replace_variables($config_file);
|
||||||
|
if (!Config::load($config_file)) {
|
||||||
|
Log::fatal('Fail to load configuration file (%s)', $config_file);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load overwrite configuration file
|
||||||
|
foreach (self :: get_option('overwrite_config_files', array(), 'array') as $file) {
|
||||||
|
$file = Config::replace_variables($file);
|
||||||
|
if (is_file($file)) Config::load($file, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self :: get_option('sentry.enabled', true, 'bool'))
|
||||||
|
SentryIntegration :: init();
|
||||||
|
$sentry_transaction = new SentryTransaction();
|
||||||
|
$sentry_span = new SentrySpan('app.init', 'Application initialization');
|
||||||
|
|
||||||
|
// Define upload_tmp_dir
|
||||||
|
if (is_string(Config::get('upload_tmp_directory')))
|
||||||
|
ini_set('upload_tmp_dir', Config::get('upload_tmp_directory'));
|
||||||
|
|
||||||
|
if (self :: get_option('log.enabled', true, 'bool'))
|
||||||
|
Log::init();
|
||||||
|
if (self :: get_option('session.enabled', true, 'bool'))
|
||||||
|
Session::init();
|
||||||
|
if (self :: get_option('template.enabled', true, 'bool'))
|
||||||
|
Tpl :: init();
|
||||||
|
if (self :: get_option('url.enabled', true, 'bool'))
|
||||||
|
Url::init();
|
||||||
|
if (self :: get_option('mail.enabled', true, 'bool'))
|
||||||
|
Email :: init();
|
||||||
|
if (self :: get_option('i18n.enabled', true, 'bool'))
|
||||||
|
I18n::init();
|
||||||
|
$sentry_span->finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a specific option value
|
||||||
|
*
|
||||||
|
* @param string $key The configuration variable key
|
||||||
|
* @param mixed $default The default value to return if configuration variable
|
||||||
|
* is not set (Default : null)
|
||||||
|
* @param string $cast The type of expected value. The configuration variable
|
||||||
|
* value will be cast as this type. Could be : bool, int,
|
||||||
|
* float or string. (Optional, default : raw value)
|
||||||
|
* @param bool $split If true, $cast is 'array' and value retreived from configuration
|
||||||
|
* is a string, split the value by comma (optional, default: true)
|
||||||
|
* @return mixed The configuration variable value
|
||||||
|
**/
|
||||||
|
public static function get_option($key, $default=null, $cast=null, $split=true) {
|
||||||
|
return Config::get(
|
||||||
|
$key,
|
||||||
|
Config::loaded()?Config::get($key, $default, $cast, $split):$default,
|
||||||
|
$cast,
|
||||||
|
$split,
|
||||||
|
self :: $options
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retreive application root directory path
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public static function root_directory_path() {
|
||||||
|
return self :: $root_directory_path?self :: $root_directory_path:'.';
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
209
src/Config.php
Normal file
209
src/Config.php
Normal file
|
@ -0,0 +1,209 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
Namespace EesyPHP;
|
||||||
|
|
||||||
|
|
||||||
|
Class Config {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configuration file path
|
||||||
|
* @var string|null
|
||||||
|
*/
|
||||||
|
private static $filepath = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loaded configuration data
|
||||||
|
* @var array|null
|
||||||
|
*/
|
||||||
|
private static $config = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extra registered variables usable in configuration file
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
private static $extra_variables = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load configuration file
|
||||||
|
* @param string $filepath The configuration file path
|
||||||
|
* @param bool $extra Load as an extra configuration file (default: false)
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function load($filepath, $extra=false) {
|
||||||
|
if (!file_exists($filepath)) {
|
||||||
|
Log :: error("Configuration file not found ($filepath)");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$config = yaml_parse_file($filepath);
|
||||||
|
if (!is_array($config) || empty($config)) {
|
||||||
|
Log :: error("Fail to load %sconfiguration file (%s)", $extra?'extra ':'', $filepath);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!$extra || !is_array(self :: $config))
|
||||||
|
self :: $config = $config;
|
||||||
|
else
|
||||||
|
self :: $config = array_replace_recursive(self :: $config, $config);
|
||||||
|
if (!$extra)
|
||||||
|
self :: $filepath = $filepath;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if configuration is loaded
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function loaded() {
|
||||||
|
return is_array(self :: $config);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save configuration
|
||||||
|
* @param string|null $filepath The configuration file path
|
||||||
|
* @param bool $overwrite Overwrite existing file (optional, default: true)
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function save($filepath=null, $overwrite=true) {
|
||||||
|
if (!self :: loaded()) {
|
||||||
|
Log :: error("Configuration not loaded, can't save it.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!$filepath) $filepath = self :: $filepath;
|
||||||
|
if (!$filepath) {
|
||||||
|
Log :: error("No configuration file set or pass as parameter");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (file_exists($filepath)) {
|
||||||
|
if (!$overwrite) {
|
||||||
|
Log :: error("Configuration file already exist (%s)", $filepath);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!is_writable($filepath)) {
|
||||||
|
Log :: error(
|
||||||
|
"Configuration file already exist and is not writable (%s)",
|
||||||
|
$filepath);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!yaml_emit_file($filepath, self :: $config)) {
|
||||||
|
Log :: error("Fail to save configuration in '%s'", $filepath);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Log :: info("Configuration saved in '%s'", $filepath);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register extra variable usable in configuration file
|
||||||
|
* @param string $key The variable key
|
||||||
|
* @param mixed $value The variable value
|
||||||
|
*/
|
||||||
|
public static function register_extra_variable($key, $value) {
|
||||||
|
self :: $extra_variables[$key] = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a specific configuration variable value
|
||||||
|
*
|
||||||
|
* @param string $key The configuration variable key
|
||||||
|
* @param mixed $default The default value to return if configuration variable
|
||||||
|
* is not set (Default : null)
|
||||||
|
* @param string $cast The type of expected value. The configuration variable
|
||||||
|
* value will be cast as this type. Could be : bool, int,
|
||||||
|
* float or string. (Optional, default : raw value)
|
||||||
|
* @param bool $split If true, $cast=='array' and $value is a string, split
|
||||||
|
* the value by comma (optional, default: false)
|
||||||
|
* @param array|null $config Optional configuration to use instead of current loaded configuration
|
||||||
|
* @return mixed The configuration variable value
|
||||||
|
**/
|
||||||
|
public static function get($key, $default=null, $cast=null, $split=false, &$config=null) {
|
||||||
|
if (array_key_exists($key, self :: $extra_variables)) {
|
||||||
|
$value = self :: $extra_variables[$key];
|
||||||
|
}
|
||||||
|
else if (!is_array($config) && !self :: loaded()) {
|
||||||
|
Log :: fatal('Configuration not loaded (on getting %s)', $key);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$exploded_key = explode('.', $key);
|
||||||
|
if (!is_array($exploded_key)) return self :: replace_variables($default);
|
||||||
|
$value = is_array($config)?$config:self :: $config;
|
||||||
|
foreach ($exploded_key as $k) {
|
||||||
|
if (!is_array($value) || !isset($value[$k]))
|
||||||
|
return self :: replace_variables($default);
|
||||||
|
$value = $value[$k];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return self :: replace_variables(cast($value, $cast, $split));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replace variable in specified value
|
||||||
|
* @param mixed $value
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public static function replace_variables($value) {
|
||||||
|
if (is_array($value)) {
|
||||||
|
foreach(array_keys($value) as $key) {
|
||||||
|
if (is_string($value[$key]) || is_array($value[$key]))
|
||||||
|
$value[$key] = self :: replace_variables($value[$key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (is_string($value)) {
|
||||||
|
$iteration = 0;
|
||||||
|
while (preg_match('/\$\{([^\}]+)\}/', $value, $m)) {
|
||||||
|
if ($iteration > 20) {
|
||||||
|
Log::fatal('Config::replace_variables(%s): max iteration reached');
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
$value = str_replace($m[0], self :: get($m[1], '', 'string'), $value);
|
||||||
|
$iteration++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get list of keys of a specific configuration variable
|
||||||
|
*
|
||||||
|
* @param string $key The configuration variable key
|
||||||
|
*
|
||||||
|
* @return array An array of the keys of a specific configuration variable
|
||||||
|
**/
|
||||||
|
public static function keys($key) {
|
||||||
|
$value = self :: get($key);
|
||||||
|
return (is_array($value)?array_keys($value):array());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a configuration variable
|
||||||
|
*
|
||||||
|
* @param string $key The configuration variable key
|
||||||
|
* @param mixed $value The configuration variable value
|
||||||
|
* @param array|null &$config Optional configuration to use instead of current loaded configuration
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
**/
|
||||||
|
public static function set($key, $value, &$config=null) {
|
||||||
|
$exploded_key = explode('.', $key);
|
||||||
|
if (!is_array($exploded_key)) return false;
|
||||||
|
if (is_array($config)) {
|
||||||
|
$parent = &$config;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (!is_array(self :: $config))
|
||||||
|
self :: $config = array();
|
||||||
|
$parent = &self :: $config;
|
||||||
|
}
|
||||||
|
for ($i=0; $i < count($exploded_key) - 1; $i++) {
|
||||||
|
$k = $exploded_key[$i];
|
||||||
|
if (!array_key_exists($k, $config))
|
||||||
|
$config[$k] = array();
|
||||||
|
$config = &$config[$k];
|
||||||
|
}
|
||||||
|
$config[array_pop($exploded_key)] = $value;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4 expandtab
|
|
@ -59,18 +59,40 @@ class Email {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialization
|
* Initialization
|
||||||
* @param string|null $php_mail_path PHP PEAR Mail lib path (optional, default: Mail.php)
|
* @param string|null $php_mail_path PHP PEAR Mail lib path (optional, default: from
|
||||||
* @param string|null $php_mail_mime_path PHP PEAR Mail lib path (optional, default: Mail/mime.php)
|
* email.php_mail_path config key if set, 'Mail.php' otherwise)
|
||||||
|
* @param string|null $php_mail_mime_path PHP PEAR Mail lib path (optional, default: from
|
||||||
|
* email.php_mail_mime_path config key if set, 'Mail/mime.php' otherwise)
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public static function init($sender=null, $send_method=null, $send_params=null, $catch_all=null,
|
public static function init($sender=null, $send_method=null, $send_params=null, $catch_all=null,
|
||||||
$headers=null, $php_mail_path=null, $php_mail_mime_path=null) {
|
$headers=null, $php_mail_path=null, $php_mail_mime_path=null) {
|
||||||
|
if (is_null($sender))
|
||||||
|
$sender = Config::get('email.sender', null, 'string');
|
||||||
if ($sender) self :: $sender = $sender;
|
if ($sender) self :: $sender = $sender;
|
||||||
|
|
||||||
|
if (is_null($send_method))
|
||||||
|
$send_method = Config::get('email.send_method', null, 'string');
|
||||||
if ($send_method) self :: $send_method = $send_method;
|
if ($send_method) self :: $send_method = $send_method;
|
||||||
|
|
||||||
|
if (is_null($send_params))
|
||||||
|
$send_params = Config::get('email.send_params', null, 'array');
|
||||||
if ($send_params) self :: $send_params = $send_params;
|
if ($send_params) self :: $send_params = $send_params;
|
||||||
|
|
||||||
|
if (is_null($catch_all))
|
||||||
|
$catch_all = Config::get('email.catch_all');
|
||||||
if ($catch_all) self :: $catch_all = $catch_all;
|
if ($catch_all) self :: $catch_all = $catch_all;
|
||||||
|
|
||||||
|
if (is_null($headers))
|
||||||
|
$headers = Config::get('email.headers', null, 'array');
|
||||||
if ($headers) self :: $headers = $headers;
|
if ($headers) self :: $headers = $headers;
|
||||||
|
|
||||||
|
if (is_null($php_mail_path))
|
||||||
|
$php_mail_path = Config::get('email.php_mail_path', null, 'string');
|
||||||
if ($php_mail_path) self :: $php_mail_path = $php_mail_path;
|
if ($php_mail_path) self :: $php_mail_path = $php_mail_path;
|
||||||
|
|
||||||
|
if (is_null($php_mail_mime_path))
|
||||||
|
$php_mail_mime_path = Config::get('email.php_mail_mime_path', null, 'string');
|
||||||
if ($php_mail_mime_path) self :: $php_mail_mime_path = $php_mail_mime_path;
|
if ($php_mail_mime_path) self :: $php_mail_mime_path = $php_mail_mime_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
42
src/I18n.php
42
src/I18n.php
|
@ -27,15 +27,22 @@ class I18n {
|
||||||
* system.
|
* system.
|
||||||
*
|
*
|
||||||
* @param string|null $root_path The root directory path of translation files
|
* @param string|null $root_path The root directory path of translation files
|
||||||
* (optional, default: ./locales)
|
* (optional, default: from i18n.root_directory config key if set,
|
||||||
|
* '${root_directory_path}/locales' otherwise)
|
||||||
* @param string|null $default_locale The default locale
|
* @param string|null $default_locale The default locale
|
||||||
* (optional, default: en_US.UTF8)
|
* (optional, default: from i18n.default_locale config key if set,
|
||||||
|
* 'en_US.UTF8' otherwise)
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public static function init($root_path=null, $default_locale=null) {
|
public static function init($root_path=null, $default_locale=null) {
|
||||||
global $root_dir_path;
|
if (is_null($root_path))
|
||||||
|
self :: $root_path = Config::get(
|
||||||
|
'i18n.root_directory', '${root_directory_path}/locales', 'string');
|
||||||
if (!is_null($root_path))
|
if (!is_null($root_path))
|
||||||
self :: $root_path = $root_path;
|
self :: $root_path = $root_path;
|
||||||
|
|
||||||
|
if (is_null($default_locale))
|
||||||
|
self :: $default_locale = Config::get('i18n.default_locale', null, 'string');
|
||||||
if (!is_null($default_locale))
|
if (!is_null($default_locale))
|
||||||
self :: $default_locale = $default_locale;
|
self :: $default_locale = $default_locale;
|
||||||
|
|
||||||
|
@ -50,7 +57,11 @@ class I18n {
|
||||||
$lang = $_REQUEST['lang'];
|
$lang = $_REQUEST['lang'];
|
||||||
Log :: trace("Select lang from request parameter: '$lang'");
|
Log :: trace("Select lang from request parameter: '$lang'");
|
||||||
}
|
}
|
||||||
elseif (isset($_SESSION['lang']) && in_array($_SESSION['lang'], $available_langs) && !isset($_REQUEST['reset_lang'])) {
|
elseif (
|
||||||
|
isset($_SESSION['lang'])
|
||||||
|
&& in_array($_SESSION['lang'], $available_langs)
|
||||||
|
&& !isset($_REQUEST['reset_lang'])
|
||||||
|
) {
|
||||||
$lang = $_SESSION['lang'];
|
$lang = $_SESSION['lang'];
|
||||||
Log :: trace("Restore lang from session: '$lang'");
|
Log :: trace("Restore lang from session: '$lang'");
|
||||||
}
|
}
|
||||||
|
@ -103,8 +114,7 @@ class I18n {
|
||||||
$js_translation_file = "translations/$lang.js";
|
$js_translation_file = "translations/$lang.js";
|
||||||
if (
|
if (
|
||||||
php_sapi_name() != "cli"
|
php_sapi_name() != "cli"
|
||||||
&& isset($root_dir_path) && $root_dir_path
|
&& is_file(App :: root_directory_path()."/public_html/$js_translation_file")
|
||||||
&& is_file("$root_dir_path/public_html/$js_translation_file")
|
|
||||||
&& Tpl :: initialized()
|
&& Tpl :: initialized()
|
||||||
) {
|
) {
|
||||||
Tpl :: add_js_file(array("lib/babel.js", "js/translation.js", $js_translation_file));
|
Tpl :: add_js_file(array("lib/babel.js", "js/translation.js", $js_translation_file));
|
||||||
|
@ -250,14 +260,12 @@ class I18n {
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public static function cli_extract_messages($command_args) {
|
public static function cli_extract_messages($command_args) {
|
||||||
global $root_dir_path;
|
|
||||||
|
|
||||||
// Store list of generated POT files
|
// Store list of generated POT files
|
||||||
$pot_files = array();
|
$pot_files = array();
|
||||||
|
|
||||||
// List PHP files to parse
|
// List PHP files to parse
|
||||||
$php_files = run_external_command(
|
$php_files = run_external_command(
|
||||||
array('find', escapeshellarg($root_dir_path), '-name', "'*.php'"),
|
array('find', escapeshellarg(App :: root_directory_path()), '-name', "'*.php'"),
|
||||||
null, // no STDIN data
|
null, // no STDIN data
|
||||||
false // do not escape command args (already done)
|
false // do not escape command args (already done)
|
||||||
);
|
);
|
||||||
|
@ -284,7 +292,7 @@ class I18n {
|
||||||
|
|
||||||
// List JS files to parse
|
// List JS files to parse
|
||||||
$js_files = run_external_command(
|
$js_files = run_external_command(
|
||||||
array('find', escapeshellarg("$root_dir_path/public_html/js"), '-name', "'*.js'"),
|
array('find', escapeshellarg(App :: root_directory_path()."/public_html/js"), '-name', "'*.js'"),
|
||||||
null, // no STDIN data
|
null, // no STDIN data
|
||||||
false // do not escape command args (already done)
|
false // do not escape command args (already done)
|
||||||
);
|
);
|
||||||
|
@ -313,7 +321,7 @@ class I18n {
|
||||||
// Extract messages from templates files using tsmarty2c.php
|
// Extract messages from templates files using tsmarty2c.php
|
||||||
$result = run_external_command(
|
$result = run_external_command(
|
||||||
array (
|
array (
|
||||||
"$root_dir_path/vendor/bin/tsmarty2c.php",
|
App :: root_directory_path()."/vendor/bin/tsmarty2c.php",
|
||||||
"-o", self :: $root_path."/templates-messages.pot",
|
"-o", self :: $root_path."/templates-messages.pot",
|
||||||
Tpl :: templates_directory(),
|
Tpl :: templates_directory(),
|
||||||
)
|
)
|
||||||
|
@ -359,8 +367,6 @@ class I18n {
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public static function cli_update_messages($command_args) {
|
public static function cli_update_messages($command_args) {
|
||||||
global $root_dir_path;
|
|
||||||
|
|
||||||
$compendium_args = array();
|
$compendium_args = array();
|
||||||
foreach ($command_args as $path) {
|
foreach ($command_args as $path) {
|
||||||
if (!file_exists($path))
|
if (!file_exists($path))
|
||||||
|
@ -435,7 +441,7 @@ class I18n {
|
||||||
return !$error;
|
return !$error;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log :: fatal(_("Fail to open root lang directory (%s)."), $root_dir_path);
|
Log :: fatal(_("Fail to open root lang directory (%s)."), App :: root_directory_path());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -447,8 +453,6 @@ class I18n {
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public static function cli_compile_messages($command_args) {
|
public static function cli_compile_messages($command_args) {
|
||||||
global $root_dir_path;
|
|
||||||
|
|
||||||
if ($dh = opendir(self :: $root_path)) {
|
if ($dh = opendir(self :: $root_path)) {
|
||||||
$error = False;
|
$error = False;
|
||||||
while (($file = readdir($dh)) !== false) {
|
while (($file = readdir($dh)) !== false) {
|
||||||
|
@ -466,7 +470,7 @@ class I18n {
|
||||||
Log :: debug(_("Lang alias symlink found: %s -> %s"), $lang, $real_lang_dir);
|
Log :: debug(_("Lang alias symlink found: %s -> %s"), $lang, $real_lang_dir);
|
||||||
|
|
||||||
// Create JSON catalog symlink (if not exists)
|
// Create JSON catalog symlink (if not exists)
|
||||||
$js_link = "$root_dir_path/public_html/translations/$lang.js";
|
$js_link = App :: root_directory_path()."/public_html/translations/$lang.js";
|
||||||
$link_target = "$real_lang_dir.js";
|
$link_target = "$real_lang_dir.js";
|
||||||
if (!file_exists($js_link)) {
|
if (!file_exists($js_link)) {
|
||||||
if (symlink($link_target, $js_link)) {
|
if (symlink($link_target, $js_link)) {
|
||||||
|
@ -528,7 +532,7 @@ class I18n {
|
||||||
|
|
||||||
// Compile messages from PO file to JSON catalog file
|
// Compile messages from PO file to JSON catalog file
|
||||||
$json_catalog = self :: po2json($lang, $po_file);
|
$json_catalog = self :: po2json($lang, $po_file);
|
||||||
$js_file = "$root_dir_path/public_html/translations/$lang.js";
|
$js_file = App :: root_directory_path()."/public_html/translations/$lang.js";
|
||||||
if(!$fd = fopen($js_file, 'w')) {
|
if(!$fd = fopen($js_file, 'w')) {
|
||||||
Log :: error(_("Fail to open %s JSON catalog file in write mode (%s)."),
|
Log :: error(_("Fail to open %s JSON catalog file in write mode (%s)."),
|
||||||
$lang, $js_file);
|
$lang, $js_file);
|
||||||
|
@ -547,7 +551,7 @@ class I18n {
|
||||||
|
|
||||||
return !$error;
|
return !$error;
|
||||||
}
|
}
|
||||||
Log :: fatal(_("Fail to open root lang directory (%s)."), $root_dir_path);
|
Log :: fatal(_("Fail to open root lang directory (%s)."), App :: root_directory_path());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
67
src/Log.php
67
src/Log.php
|
@ -55,26 +55,69 @@ class Log {
|
||||||
// Custom fatal error handler
|
// Custom fatal error handler
|
||||||
protected static $fatal_error_handler = null;
|
protected static $fatal_error_handler = null;
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Initialization
|
* Initialization
|
||||||
* @param string $filepath
|
* @param string $filepath The log file path
|
||||||
* @param string|null $level
|
* (optional, default: from log.file_path or log.cli_file_path is set)
|
||||||
* @param int|null $php_errors_levels
|
* @param string|null $level The log level
|
||||||
|
* (optional, default: from log.level config key if set, otherwise,
|
||||||
|
* see self :: $default_level)
|
||||||
|
* @param int|null $php_errors_levels PHP errors level as expected by set_error_handler()
|
||||||
|
* (optional, default: from log.php_errors_levels if set, E_ALL & ~E_STRICT
|
||||||
|
* if level is TRACE or DEBUG, and E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
|
||||||
|
* otherwise)
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public static function init($filepath, $level=null, $php_errors_levels=null) {
|
public static function init($filepath=null, $level=null, $php_errors_levels=null) {
|
||||||
|
if ($filepath)
|
||||||
self :: $filepath = $filepath;
|
self :: $filepath = $filepath;
|
||||||
|
elseif (php_sapi_name() == 'cli')
|
||||||
|
self :: $filepath = Config::get(
|
||||||
|
'log.cli_logfile_path', Config::get('log.cli_file_path'));
|
||||||
|
else
|
||||||
|
self :: $filepath = Config::get('log.file_path');
|
||||||
|
|
||||||
// Set log level
|
// Set log level
|
||||||
self :: set_level($level);
|
self :: set_level($level?$level:Config::get('log.level'));
|
||||||
|
|
||||||
// Log PHP errors
|
// Log PHP errors
|
||||||
if (!is_null($php_errors_levels))
|
if (!is_null($php_errors_levels)) {
|
||||||
self :: $php_errors_levels = $php_errors_levels;
|
self :: $php_errors_levels = $php_errors_levels;
|
||||||
elseif (in_array(self :: $level, array('DEBUG', 'TRACE')))
|
}
|
||||||
|
elseif ($levels = Config::get('log.php_errors_levels', array(), 'array')) {
|
||||||
|
$code = 'self :: $php_errors_levels = ';
|
||||||
|
while($level = array_shift($levels)) {
|
||||||
|
if (!is_string($level)) continue;
|
||||||
|
if (!defined($level) || !is_int(constant($level))) continue;
|
||||||
|
$code .= $level;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
foreach($levels as $level) {
|
||||||
|
if (!is_string($level)) continue;
|
||||||
|
$combine_operator = '&';
|
||||||
|
if (in_array($level[0], array('|', '^', '&'))) {
|
||||||
|
$combine_operator = $level[0];
|
||||||
|
$level = substr($level, 1);
|
||||||
|
}
|
||||||
|
$not = false;
|
||||||
|
if (in_array($level[0], array('!', '~'))) {
|
||||||
|
$not = $level[0];
|
||||||
|
$level = substr($level, 1);
|
||||||
|
}
|
||||||
|
if (!defined($level) || !is_int(constant($level))) continue;
|
||||||
|
$code .= " $combine_operator ";
|
||||||
|
if ($not) $code .= "$not";
|
||||||
|
$code .= $level;
|
||||||
|
}
|
||||||
|
$code .= ";";
|
||||||
|
eval($code);
|
||||||
|
}
|
||||||
|
elseif (in_array(self :: $level, array('DEBUG', 'TRACE'))) {
|
||||||
self :: $php_errors_levels = E_ALL & ~E_STRICT;
|
self :: $php_errors_levels = E_ALL & ~E_STRICT;
|
||||||
else
|
}
|
||||||
|
else {
|
||||||
self :: $php_errors_levels = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED;
|
self :: $php_errors_levels = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED;
|
||||||
|
}
|
||||||
set_error_handler(array('EesyPHP\\Log', 'on_php_error'), self :: $php_errors_levels);
|
set_error_handler(array('EesyPHP\\Log', 'on_php_error'), self :: $php_errors_levels);
|
||||||
|
|
||||||
// Log uncatched exceptions
|
// Log uncatched exceptions
|
||||||
|
@ -93,7 +136,7 @@ class Log {
|
||||||
|
|
||||||
if (!array_key_exists($level, self :: $levels)) $level = self :: $default_level;
|
if (!array_key_exists($level, self :: $levels)) $level = self :: $default_level;
|
||||||
if (self :: $levels[$level] < self :: $levels[self :: $level]) return true;
|
if (self :: $levels[$level] < self :: $levels[self :: $level]) return true;
|
||||||
if(is_null(self :: $file_fd)) {
|
if(self :: $filepath && is_null(self :: $file_fd)) {
|
||||||
self :: $file_fd = fopen(self :: $filepath, 'a');
|
self :: $file_fd = fopen(self :: $filepath, 'a');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,7 +168,7 @@ class Log {
|
||||||
$msg[] = $message;
|
$msg[] = $message;
|
||||||
$msg = implode(' - ', $msg)."\n";
|
$msg = implode(' - ', $msg)."\n";
|
||||||
}
|
}
|
||||||
|
if (self :: $file_fd)
|
||||||
fwrite(self :: $file_fd, $msg);
|
fwrite(self :: $file_fd, $msg);
|
||||||
|
|
||||||
if ($level == 'FATAL')
|
if ($level == 'FATAL')
|
||||||
|
@ -260,7 +303,7 @@ class Log {
|
||||||
self :: $level = self :: $default_level;
|
self :: $level = self :: $default_level;
|
||||||
self :: warning(
|
self :: warning(
|
||||||
"Invalid log level value found in configuration (%s). ".
|
"Invalid log level value found in configuration (%s). ".
|
||||||
"Set as default (%s).", $level, self :: $default_level);
|
"Set as default (%s).", vardump($level), self :: $default_level);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
self :: $level = $level;
|
self :: $level = $level;
|
||||||
|
|
|
@ -26,22 +26,23 @@ class SentryIntegration {
|
||||||
/**
|
/**
|
||||||
* Initialization
|
* Initialization
|
||||||
* @param string|null $dsn Sentry DSN
|
* @param string|null $dsn Sentry DSN
|
||||||
|
* (optional, default: from sentry.dsn config key if set, null otherwise)
|
||||||
* @param float|null $traces_sample_rate Sentry traces sample rate
|
* @param float|null $traces_sample_rate Sentry traces sample rate
|
||||||
* (optional, default: 0.2)
|
* (optional, default: from sentry.traces_sample_rate config key if set,
|
||||||
|
* 0.2 otherwise)
|
||||||
* @param array<int>|null $php_error_types Types of PHP error to log in Sentry
|
* @param array<int>|null $php_error_types Types of PHP error to log in Sentry
|
||||||
* (optional, default: see self::$php_error_types)
|
* (optional, default: from sentry.php_error_types config key if set,
|
||||||
|
* otherwise, see self::$php_error_types)
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public static function init($dsn=null, $traces_sample_rate=null,
|
public static function init($dsn=null, $traces_sample_rate=null,
|
||||||
$php_error_types=null) {
|
$php_error_types=null) {
|
||||||
// Init Sentry (if its DSN is configured)
|
|
||||||
if (!$dsn) return;
|
|
||||||
|
|
||||||
\Sentry\init([
|
\Sentry\init([
|
||||||
'dsn' => $dsn,
|
'dsn' => $dsn?$dsn:Config::get('sentry.dsn'),
|
||||||
'traces_sample_rate' => (
|
'traces_sample_rate' => (
|
||||||
$traces_sample_rate?
|
$traces_sample_rate?
|
||||||
$traces_sample_rate:0.2
|
$traces_sample_rate:
|
||||||
|
Config::get('sentry.traces_sample_rate', 0.2, 'float')
|
||||||
),
|
),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
@ -55,8 +56,18 @@ class SentryIntegration {
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
if (is_array($php_error_types))
|
if (!is_array($php_error_types))
|
||||||
self :: $php_error_types = $php_error_types;
|
$php_error_types = Config::get(
|
||||||
|
'sentry.php_error_types', self :: $php_error_types, 'array'
|
||||||
|
);
|
||||||
|
self :: $php_error_types = array();
|
||||||
|
foreach($php_error_types as $php_error_type) {
|
||||||
|
if (is_string($php_error_type) && defined($php_error_type))
|
||||||
|
$php_error_type = constant($php_error_type);
|
||||||
|
if (!is_int($php_error_type)) continue;
|
||||||
|
if (in_array($php_error_type, self :: $php_error_types)) continue;
|
||||||
|
self :: $php_error_types[] = $php_error_type;
|
||||||
|
}
|
||||||
set_error_handler(
|
set_error_handler(
|
||||||
array('EesyPHP\\SentryIntegration', 'on_php_error'),
|
array('EesyPHP\\SentryIntegration', 'on_php_error'),
|
||||||
E_ALL
|
E_ALL
|
||||||
|
|
|
@ -16,9 +16,9 @@ class Session {
|
||||||
/**
|
/**
|
||||||
* Initialization
|
* Initialization
|
||||||
* @param int|null $max_duration Session max duration in second
|
* @param int|null $max_duration Session max duration in second
|
||||||
* (optional, default: 12h)
|
* (optional, default: from session.max_duration config key if set, 12h otherwise)
|
||||||
* @param int|null $timeout Session inactivity timeout in second
|
* @param int|null $timeout Session inactivity timeout in second
|
||||||
* (optional, default: no timeout)
|
* (optional, default: from session.timeout config key if set, no timeout otherwise)
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public static function init($max_duration=null, $timeout=null) {
|
public static function init($max_duration=null, $timeout=null) {
|
||||||
|
@ -26,6 +26,8 @@ class Session {
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Define session max duration
|
// Define session max duration
|
||||||
|
if (is_null($max_duration))
|
||||||
|
$max_duration = Config::get('session.max_duration', null, 'int');
|
||||||
if (is_int($max_duration))
|
if (is_int($max_duration))
|
||||||
self :: $max_duration = $max_duration;
|
self :: $max_duration = $max_duration;
|
||||||
|
|
||||||
|
@ -41,7 +43,9 @@ class Session {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle session timeout
|
// Handle session timeout
|
||||||
if ($timeout) {
|
if (is_null($timeout))
|
||||||
|
$timeout = Config::get('session.timeout', null, 'int');
|
||||||
|
if (is_int($timeout) && $timeout) {
|
||||||
if (!isset($_SESSION['session_last_access'])) {
|
if (!isset($_SESSION['session_last_access'])) {
|
||||||
Log :: debug('Set initial session last access');
|
Log :: debug('Set initial session last access');
|
||||||
$_SESSION['session_last_access'] = time();
|
$_SESSION['session_last_access'] = time();
|
||||||
|
|
13
src/Tpl.php
13
src/Tpl.php
|
@ -53,13 +53,20 @@ class Tpl {
|
||||||
/**
|
/**
|
||||||
* Initialization
|
* Initialization
|
||||||
* @param string $templates_dir Smarty templates directory path
|
* @param string $templates_dir Smarty templates directory path
|
||||||
|
* (optional, default: from template.directory config key)
|
||||||
* @param string $templates_c_dir Smarty cache templates directory path
|
* @param string $templates_c_dir Smarty cache templates directory path
|
||||||
|
* (optional, default: from template.cache_directory config key)
|
||||||
* @param bool $debug_ajax Enable/disable AJAX returned data debugging in logs
|
* @param bool $debug_ajax Enable/disable AJAX returned data debugging in logs
|
||||||
* (optional, default: false)
|
* (optional, default: from template.debug_ajax or debug_ajax config keys if set,
|
||||||
|
* false otherwise)
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public static function init($templates_dir, $templates_c_dir, $debug_ajax=false) {
|
public static function init($templates_dir=null, $templates_c_dir=null, $debug_ajax=null) {
|
||||||
// Check templates/templates_c directories
|
// Check templates/templates_c directories
|
||||||
|
if (is_null($templates_dir))
|
||||||
|
$templates_dir = Config::get('template.directory', null, 'string');
|
||||||
|
if (is_null($templates_c_dir))
|
||||||
|
$templates_c_dir = Config::get('template.cache_directory', null, 'string');
|
||||||
if (!$templates_dir || !is_dir($templates_dir)) {
|
if (!$templates_dir || !is_dir($templates_dir)) {
|
||||||
Log :: fatal(
|
Log :: fatal(
|
||||||
"Template directory not found (%s)",
|
"Template directory not found (%s)",
|
||||||
|
@ -75,6 +82,8 @@ class Tpl {
|
||||||
self :: $smarty = new Smarty();
|
self :: $smarty = new Smarty();
|
||||||
self :: $smarty->setTemplateDir($templates_dir);
|
self :: $smarty->setTemplateDir($templates_dir);
|
||||||
self :: $smarty->setCompileDir($templates_c_dir);
|
self :: $smarty->setCompileDir($templates_c_dir);
|
||||||
|
if (is_null($debug_ajax))
|
||||||
|
$debug_ajax = Config::get('template.debug_ajax', Config::get('debug_ajax'));
|
||||||
self :: $_debug_ajax = boolval($debug_ajax);
|
self :: $_debug_ajax = boolval($debug_ajax);
|
||||||
Log :: register_fatal_error_handler(array('\\EesyPHP\\Tpl', 'fatal_error'));
|
Log :: register_fatal_error_handler(array('\\EesyPHP\\Tpl', 'fatal_error'));
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,11 +51,14 @@ class Url {
|
||||||
/**
|
/**
|
||||||
* Initialization
|
* Initialization
|
||||||
* @param string|null $public_root_url The application public root URL
|
* @param string|null $public_root_url The application public root URL
|
||||||
|
* (optional, default: from public_root_url config key)
|
||||||
* @param bool $api_mode Enable/disable API mode
|
* @param bool $api_mode Enable/disable API mode
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public static function init($public_root_url = null, $api_mode=false) {
|
public static function init($public_root_url=null, $api_mode=false) {
|
||||||
if ($public_root_url) {
|
if (is_null($public_root_url))
|
||||||
|
$public_root_url = Config::get('public_root_url', null, 'string');
|
||||||
|
if (is_string($public_root_url) && $public_root_url) {
|
||||||
// Check URL end
|
// Check URL end
|
||||||
if (substr(self :: $public_root_url, -1) == '/')
|
if (substr(self :: $public_root_url, -1) == '/')
|
||||||
$public_root_url = substr($public_root_url, 0, -1);
|
$public_root_url = substr($public_root_url, 0, -1);
|
||||||
|
|
|
@ -49,8 +49,13 @@ function format_callable($callable) {
|
||||||
return vardump($callable);
|
return vardump($callable);
|
||||||
}
|
}
|
||||||
|
|
||||||
function check_is_empty($val) {
|
/**
|
||||||
switch(gettype($val)) {
|
* Check if given value is empty
|
||||||
|
* @param mixed $value
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function check_is_empty($value) {
|
||||||
|
switch(gettype($value)) {
|
||||||
case "boolean":
|
case "boolean":
|
||||||
case "integer":
|
case "integer":
|
||||||
case "double":
|
case "double":
|
||||||
|
@ -59,11 +64,57 @@ function check_is_empty($val) {
|
||||||
return False;
|
return False;
|
||||||
case "array":
|
case "array":
|
||||||
case "string":
|
case "string":
|
||||||
if ($val == "0") return false;
|
if ($value == "0") return false;
|
||||||
return empty($val);
|
return empty($value);
|
||||||
case "NULL":
|
case "NULL":
|
||||||
return True;
|
return True;
|
||||||
}
|
}
|
||||||
|
return empty($value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ensure the given value is an array and return an array with this value if not
|
||||||
|
* @param mixed $value
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function ensure_is_array($value) {
|
||||||
|
if (is_array($value))
|
||||||
|
return $value;
|
||||||
|
if (check_is_empty($value))
|
||||||
|
return array();
|
||||||
|
return array($value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a specific configuration variable value
|
||||||
|
*
|
||||||
|
* @param mixed $value The value to cast
|
||||||
|
* @param string $type The type of expected value. The configuration variable
|
||||||
|
* value will be cast as this type. Could be : bool, int,
|
||||||
|
* float or string.
|
||||||
|
* @param bool $split If true, $type=='array' and $value is a string, split
|
||||||
|
* the value by comma (optional, default: false)
|
||||||
|
* @return mixed The cast value
|
||||||
|
**/
|
||||||
|
function cast($value, $type, $split=false) {
|
||||||
|
switch($type) {
|
||||||
|
case 'bool':
|
||||||
|
case 'boolean':
|
||||||
|
return boolval($value);
|
||||||
|
case 'int':
|
||||||
|
case 'integer':
|
||||||
|
return intval($value);
|
||||||
|
case 'float':
|
||||||
|
return floatval($value);
|
||||||
|
case 'str':
|
||||||
|
case 'string':
|
||||||
|
return strval($value);
|
||||||
|
case 'array':
|
||||||
|
if ($split && is_string($value))
|
||||||
|
$value = preg_split('/ *, */', $value);
|
||||||
|
return ensure_is_array($value);
|
||||||
|
}
|
||||||
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue