2018-10-29 13:10:45 +00:00
< ? php
2024-08-24 13:27:00 +00:00
// Copyright (C) 2010-2024, the Friendica project
// SPDX-FileCopyrightText: 2010-2024 the Friendica project
//
// SPDX-License-Identifier: AGPL-3.0-or-later
2018-10-29 13:10:45 +00:00
namespace Friendica\Module ;
2024-11-10 08:46:50 +00:00
use Friendica\App\Arguments ;
use Friendica\App\BaseURL ;
use Friendica\App\Mode ;
use Friendica\AppHelper ;
2018-10-29 13:10:45 +00:00
use Friendica\BaseModule ;
use Friendica\Core ;
2021-10-26 19:44:29 +00:00
use Friendica\Core\Config\ValueObject\Cache ;
2024-11-10 08:46:50 +00:00
use Friendica\Core\Installer ;
2021-11-17 20:32:57 +00:00
use Friendica\Core\L10n ;
2018-10-31 14:35:50 +00:00
use Friendica\Core\Renderer ;
2021-03-12 17:21:50 +00:00
use Friendica\Core\Theme ;
2019-12-15 21:34:11 +00:00
use Friendica\DI ;
2019-07-12 21:08:01 +00:00
use Friendica\Network\HTTPException ;
2019-03-26 21:04:31 +00:00
use Friendica\Util\BasePath ;
2021-11-20 14:38:03 +00:00
use Friendica\Util\Profiler ;
2018-10-29 13:10:45 +00:00
use Friendica\Util\Temporal ;
2021-11-20 14:38:03 +00:00
use Psr\Log\LoggerInterface ;
2023-02-18 19:43:49 +00:00
use GuzzleHttp\Psr7\Uri ;
2018-10-29 13:10:45 +00:00
class Install extends BaseModule
{
/**
* Step one - System check
*/
const SYSTEM_CHECK = 1 ;
/**
2019-03-26 21:04:31 +00:00
* Step two - Base information
2018-10-29 13:10:45 +00:00
*/
2019-03-26 21:04:31 +00:00
const BASE_CONFIG = 2 ;
2018-10-29 13:10:45 +00:00
/**
2019-03-26 21:04:31 +00:00
* Step three - Database configuration
2018-10-29 13:10:45 +00:00
*/
2019-03-26 21:04:31 +00:00
const DATABASE_CONFIG = 3 ;
2018-10-29 13:10:45 +00:00
/**
2019-04-14 12:05:48 +00:00
* Step four - Adapt site settings
2018-10-29 13:10:45 +00:00
*/
2019-03-26 21:04:31 +00:00
const SITE_SETTINGS = 4 ;
/**
* Step five - All steps finished
*/
const FINISHED = 5 ;
2018-10-29 13:10:45 +00:00
/**
* @ var int The current step of the wizard
*/
2021-11-17 20:32:57 +00:00
private $currentWizardStep ;
2018-10-29 13:10:45 +00:00
2018-10-29 17:44:39 +00:00
/**
2024-11-10 08:46:50 +00:00
* @ var Installer The installer
2018-10-29 17:44:39 +00:00
*/
2021-11-17 20:32:57 +00:00
private $installer ;
2021-11-18 23:19:00 +00:00
2024-11-10 08:53:36 +00:00
/** @var Cache */
protected $configCache ;
2024-11-10 08:46:50 +00:00
/** @var Mode */
2021-11-17 20:32:57 +00:00
protected $mode ;
2024-11-10 08:46:50 +00:00
public function __construct ( AppHelper $appHelper , BasePath $basePath , Mode $mode , L10n $l10n , BaseURL $baseUrl , Arguments $args , LoggerInterface $logger , Profiler $profiler , Response $response , Installer $installer , array $server , array $parameters = [])
2018-10-29 13:10:45 +00:00
{
2021-11-21 19:06:36 +00:00
parent :: __construct ( $l10n , $baseUrl , $args , $logger , $profiler , $response , $server , $parameters );
2021-11-17 20:32:57 +00:00
2024-11-10 08:53:36 +00:00
$this -> configCache = $appHelper -> getConfigCache ();
$this -> mode = $mode ;
$this -> installer = $installer ;
2018-10-29 13:10:45 +00:00
2021-11-17 20:32:57 +00:00
if ( ! $this -> mode -> isInstall ()) {
2019-07-12 21:08:01 +00:00
throw new HTTPException\ForbiddenException ();
2019-04-14 12:05:48 +00:00
}
2018-10-29 13:10:45 +00:00
// route: install/testrwrite
// $baseurl/install/testrwrite to test if rewrite in .htaccess is working
2021-11-17 20:32:57 +00:00
if ( $args -> get ( 1 , '' ) == 'testrewrite' ) {
2018-10-29 13:10:45 +00:00
// Status Code 204 means that it worked without content
2019-07-12 21:08:01 +00:00
throw new HTTPException\NoContentException ();
2018-10-29 13:10:45 +00:00
}
2019-03-26 21:04:31 +00:00
// get basic installation information and save them to the config cache
2024-11-10 08:53:36 +00:00
$this -> installer -> setUpCache ( $this -> configCache , $basePath -> getPath ());
2019-03-26 21:04:31 +00:00
2018-10-29 13:39:09 +00:00
// We overwrite current theme css, because during install we may not have a working mod_rewrite
// so we may not have a css at all. Here we set a static css file for the install procedure pages
2023-02-18 19:43:49 +00:00
Renderer :: $theme [ 'stylesheet' ] = $this -> baseUrl . '/view/install/style.css' ;
2018-10-29 13:10:45 +00:00
2024-11-04 20:27:17 +00:00
$this -> currentWizardStep = ( $_REQUEST [ 'pass' ] ? ? '' ) ? : self :: SYSTEM_CHECK ;
2018-10-29 13:10:45 +00:00
}
2021-11-28 12:44:42 +00:00
protected function post ( array $request = [])
2018-10-29 13:10:45 +00:00
{
2021-11-17 20:32:57 +00:00
switch ( $this -> currentWizardStep ) {
2018-10-29 13:10:45 +00:00
case self :: SYSTEM_CHECK :
2019-03-26 21:04:31 +00:00
case self :: BASE_CONFIG :
2024-11-10 08:53:36 +00:00
$this -> checkSetting ( $this -> configCache , $_POST , 'config' , 'php_path' );
2019-03-26 21:04:31 +00:00
break ;
2018-10-29 13:10:45 +00:00
case self :: DATABASE_CONFIG :
2024-11-10 08:53:36 +00:00
$this -> checkSetting ( $this -> configCache , $_POST , 'config' , 'php_path' );
2019-03-26 21:04:31 +00:00
2024-11-10 08:53:36 +00:00
$this -> checkSetting ( $this -> configCache , $_POST , 'system' , 'basepath' );
$this -> checkSetting ( $this -> configCache , $_POST , 'system' , 'url' );
2018-10-29 17:44:39 +00:00
break ;
2018-10-29 13:10:45 +00:00
case self :: SITE_SETTINGS :
2024-11-10 08:53:36 +00:00
$this -> checkSetting ( $this -> configCache , $_POST , 'config' , 'php_path' );
2019-03-14 09:00:05 +00:00
2024-11-10 08:53:36 +00:00
$this -> checkSetting ( $this -> configCache , $_POST , 'system' , 'basepath' );
$this -> checkSetting ( $this -> configCache , $_POST , 'system' , 'url' );
2019-03-26 21:04:31 +00:00
2024-11-10 08:53:36 +00:00
$this -> checkSetting ( $this -> configCache , $_POST , 'database' , 'hostname' , Core\Installer :: DEFAULT_HOST );
$this -> checkSetting ( $this -> configCache , $_POST , 'database' , 'username' , '' );
$this -> checkSetting ( $this -> configCache , $_POST , 'database' , 'password' , '' );
$this -> checkSetting ( $this -> configCache , $_POST , 'database' , 'database' , '' );
2018-10-29 13:10:45 +00:00
2018-10-29 17:44:39 +00:00
// If we cannot connect to the database, return to the previous step
2021-11-17 20:32:57 +00:00
if ( ! $this -> installer -> checkDB ( DI :: dba ())) {
$this -> currentWizardStep = self :: DATABASE_CONFIG ;
2018-10-29 13:10:45 +00:00
}
2018-10-29 17:44:39 +00:00
break ;
2018-10-29 13:10:45 +00:00
case self :: FINISHED :
2024-11-10 08:53:36 +00:00
$this -> checkSetting ( $this -> configCache , $_POST , 'config' , 'php_path' );
2019-03-14 09:00:05 +00:00
2024-11-10 08:53:36 +00:00
$this -> checkSetting ( $this -> configCache , $_POST , 'system' , 'basepath' );
$this -> checkSetting ( $this -> configCache , $_POST , 'system' , 'url' );
2019-03-26 21:04:31 +00:00
2024-11-10 08:53:36 +00:00
$this -> checkSetting ( $this -> configCache , $_POST , 'database' , 'hostname' , Core\Installer :: DEFAULT_HOST );
$this -> checkSetting ( $this -> configCache , $_POST , 'database' , 'username' , '' );
$this -> checkSetting ( $this -> configCache , $_POST , 'database' , 'password' , '' );
$this -> checkSetting ( $this -> configCache , $_POST , 'database' , 'database' , '' );
2019-03-14 09:00:05 +00:00
2024-11-10 08:53:36 +00:00
$this -> checkSetting ( $this -> configCache , $_POST , 'system' , 'default_timezone' , Core\Installer :: DEFAULT_TZ );
$this -> checkSetting ( $this -> configCache , $_POST , 'system' , 'language' , Core\Installer :: DEFAULT_LANG );
$this -> checkSetting ( $this -> configCache , $_POST , 'config' , 'admin_email' , '' );
2018-10-29 13:10:45 +00:00
2018-10-29 17:44:39 +00:00
// If we cannot connect to the database, return to the Database config wizard
2021-11-17 20:32:57 +00:00
if ( ! $this -> installer -> checkDB ( DI :: dba ())) {
$this -> currentWizardStep = self :: DATABASE_CONFIG ;
2018-10-30 10:30:19 +00:00
return ;
2018-10-29 13:10:45 +00:00
}
2024-11-10 08:53:36 +00:00
if ( ! $this -> installer -> createConfig ( $this -> configCache )) {
2018-10-29 17:44:39 +00:00
return ;
2018-10-29 13:10:45 +00:00
}
2022-07-12 21:21:16 +00:00
$this -> installer -> installDatabase ();
2023-01-01 14:36:24 +00:00
2021-03-12 17:21:50 +00:00
// install allowed themes to register theme hooks
// this is same as "Reload active theme" in /admin/themes
$allowed_themes = Theme :: getAllowedList ();
$allowed_themes = array_unique ( $allowed_themes );
foreach ( $allowed_themes as $theme ) {
Theme :: uninstall ( $theme );
Theme :: install ( $theme );
}
Theme :: setAllowedList ( $allowed_themes );
2018-10-29 13:10:45 +00:00
2018-10-29 17:44:39 +00:00
break ;
2018-10-29 13:10:45 +00:00
}
2024-11-04 20:27:17 +00:00
DI :: baseUrl () -> redirect ( 'install?pass=' . $this -> currentWizardStep );
2018-10-29 13:10:45 +00:00
}
2021-11-20 14:38:03 +00:00
protected function content ( array $request = []) : string
2018-10-29 13:10:45 +00:00
{
$output = '' ;
2021-11-18 20:33:05 +00:00
$install_title = $this -> t ( 'Friendica Communications Server - Setup' );
2018-10-29 13:10:45 +00:00
2021-11-17 20:32:57 +00:00
switch ( $this -> currentWizardStep ) {
2018-10-29 13:10:45 +00:00
case self :: SYSTEM_CHECK :
2024-11-10 08:53:36 +00:00
$php_path = $this -> configCache -> get ( 'config' , 'php_path' );
2018-10-29 13:10:45 +00:00
2023-02-18 19:43:49 +00:00
$status = $this -> installer -> checkEnvironment ( $this -> baseUrl , $php_path );
2018-10-29 13:10:45 +00:00
2023-02-18 19:43:49 +00:00
$tpl = Renderer :: getMarkupTemplate ( 'install/01_checks.tpl' );
2018-10-31 14:35:50 +00:00
$output .= Renderer :: replaceMacros ( $tpl , [
2019-04-14 12:05:48 +00:00
'$title' => $install_title ,
2021-11-18 20:33:05 +00:00
'$pass' => $this -> t ( 'System check' ),
'$required' => $this -> t ( 'Required' ),
'$requirement_not_satisfied' => $this -> t ( 'Requirement not satisfied' ),
'$optional_requirement_not_satisfied' => $this -> t ( 'Optional requirement not satisfied' ),
'$ok' => $this -> t ( 'OK' ),
2021-11-17 20:32:57 +00:00
'$checks' => $this -> installer -> getChecks (),
2019-04-14 12:05:48 +00:00
'$passed' => $status ,
2021-11-18 20:33:05 +00:00
'$see_install' => $this -> t ( 'Please see the file "doc/INSTALL.md".' ),
'$next' => $this -> t ( 'Next' ),
'$reload' => $this -> t ( 'Check again' ),
2019-04-14 12:05:48 +00:00
'$php_path' => $php_path ,
2018-10-29 13:10:45 +00:00
]);
break ;
2019-03-26 21:04:31 +00:00
case self :: BASE_CONFIG :
2024-11-10 08:53:36 +00:00
$baseUrl = $this -> configCache -> get ( 'system' , 'url' ) ?
new Uri ( $this -> configCache -> get ( 'system' , 'url' )) :
2023-02-18 19:43:49 +00:00
$this -> baseUrl ;
2019-03-26 21:04:31 +00:00
2023-02-18 19:43:49 +00:00
$tpl = Renderer :: getMarkupTemplate ( 'install/02_base_config.tpl' );
2019-03-26 21:04:31 +00:00
$output .= Renderer :: replaceMacros ( $tpl , [
'$title' => $install_title ,
2021-11-18 20:33:05 +00:00
'$pass' => $this -> t ( 'Base settings' ),
2019-03-26 21:04:31 +00:00
'$basepath' => [ 'system-basepath' ,
2021-11-18 20:33:05 +00:00
$this -> t ( " Base path to installation " ),
2024-11-10 08:53:36 +00:00
$this -> configCache -> get ( 'system' , 'basepath' ),
2021-11-18 20:33:05 +00:00
$this -> t ( " If the system cannot detect the correct path to your installation, enter the correct path here. This setting should only be set if you are using a restricted system and symbolic links to your webroot. " ),
$this -> t ( 'Required' )],
2023-02-18 19:43:49 +00:00
'$system_url' => [ 'system-url' ,
$this -> t ( 'The Friendica system URL' ),
( string ) $baseUrl ,
2023-02-19 10:12:48 +00:00
$this -> t ( " Overwrite this field in case the system URL determination isn't right, otherwise leave it as is. " ),
2023-02-18 19:43:49 +00:00
$this -> t ( 'Required' )],
2024-11-10 08:53:36 +00:00
'$php_path' => $this -> configCache -> get ( 'config' , 'php_path' ),
2021-11-18 20:33:05 +00:00
'$submit' => $this -> t ( 'Submit' ),
2019-03-26 21:04:31 +00:00
]);
break ;
2018-10-29 13:10:45 +00:00
case self :: DATABASE_CONFIG :
2023-02-18 19:43:49 +00:00
$tpl = Renderer :: getMarkupTemplate ( 'install/03_database_config.tpl' );
2018-10-31 14:35:50 +00:00
$output .= Renderer :: replaceMacros ( $tpl , [
2019-04-14 12:05:48 +00:00
'$title' => $install_title ,
2021-11-18 20:33:05 +00:00
'$pass' => $this -> t ( 'Database connection' ),
'$info_01' => $this -> t ( 'In order to install Friendica we need to know how to connect to your database.' ),
'$info_02' => $this -> t ( 'Please contact your hosting provider or site administrator if you have questions about these settings.' ),
'$info_03' => $this -> t ( 'The database you specify below should already exist. If it does not, please create it before continuing.' ),
'$required' => $this -> t ( 'Required' ),
'$requirement_not_satisfied' => $this -> t ( 'Requirement not satisfied' ),
2021-11-17 20:32:57 +00:00
'$checks' => $this -> installer -> getChecks (),
2024-11-10 08:53:36 +00:00
'$basepath' => $this -> configCache -> get ( 'system' , 'basepath' ),
'$system_url' => $this -> configCache -> get ( 'system' , 'url' ),
2019-04-14 12:05:48 +00:00
'$dbhost' => [ 'database-hostname' ,
2021-11-18 20:33:05 +00:00
$this -> t ( 'Database Server Name' ),
2024-11-10 08:53:36 +00:00
$this -> configCache -> get ( 'database' , 'hostname' ),
2019-04-14 12:05:48 +00:00
'' ,
2021-11-18 20:33:05 +00:00
$this -> t ( 'Required' )],
2019-04-14 12:40:26 +00:00
'$dbuser' => [ 'database-username' ,
2021-11-18 20:33:05 +00:00
$this -> t ( 'Database Login Name' ),
2024-11-10 08:53:36 +00:00
$this -> configCache -> get ( 'database' , 'username' ),
2019-04-14 12:05:48 +00:00
'' ,
2021-11-18 20:33:05 +00:00
$this -> t ( 'Required' ),
2019-04-14 12:05:48 +00:00
'autofocus' ],
'$dbpass' => [ 'database-password' ,
2021-11-18 20:33:05 +00:00
$this -> t ( 'Database Login Password' ),
2024-11-10 08:53:36 +00:00
$this -> configCache -> get ( 'database' , 'password' ),
2021-11-18 20:33:05 +00:00
$this -> t ( " For security reasons the password must not be empty " ),
$this -> t ( 'Required' )],
2019-04-14 12:05:48 +00:00
'$dbdata' => [ 'database-database' ,
2021-11-18 20:33:05 +00:00
$this -> t ( 'Database Name' ),
2024-11-10 08:53:36 +00:00
$this -> configCache -> get ( 'database' , 'database' ),
2019-04-14 12:05:48 +00:00
'' ,
2021-11-18 20:33:05 +00:00
$this -> t ( 'Required' )],
'$lbl_10' => $this -> t ( 'Please select a default timezone for your website' ),
2024-11-10 08:53:36 +00:00
'$php_path' => $this -> configCache -> get ( 'config' , 'php_path' ),
2021-11-18 20:33:05 +00:00
'$submit' => $this -> t ( 'Submit' )
2018-10-29 13:10:45 +00:00
]);
break ;
2018-10-29 17:44:39 +00:00
2018-10-29 13:10:45 +00:00
case self :: SITE_SETTINGS :
/* Installed langs */
2021-11-17 20:32:57 +00:00
$lang_choices = $this -> l10n -> getAvailableLanguages ();
2018-10-29 13:10:45 +00:00
2023-02-18 19:43:49 +00:00
$tpl = Renderer :: getMarkupTemplate ( 'install/04_site_settings.tpl' );
2018-10-31 14:35:50 +00:00
$output .= Renderer :: replaceMacros ( $tpl , [
2019-04-14 12:05:48 +00:00
'$title' => $install_title ,
2021-11-18 20:33:05 +00:00
'$required' => $this -> t ( 'Required' ),
2021-11-17 20:32:57 +00:00
'$checks' => $this -> installer -> getChecks (),
2021-11-18 20:33:05 +00:00
'$pass' => $this -> t ( 'Site settings' ),
2024-11-10 08:53:36 +00:00
'$basepath' => $this -> configCache -> get ( 'system' , 'basepath' ),
'$system_url' => $this -> configCache -> get ( 'system' , 'url' ),
'$dbhost' => $this -> configCache -> get ( 'database' , 'hostname' ),
'$dbuser' => $this -> configCache -> get ( 'database' , 'username' ),
'$dbpass' => $this -> configCache -> get ( 'database' , 'password' ),
'$dbdata' => $this -> configCache -> get ( 'database' , 'database' ),
2019-04-14 12:05:48 +00:00
'$adminmail' => [ 'config-admin_email' ,
2021-11-18 20:33:05 +00:00
$this -> t ( 'Site administrator email address' ),
2024-11-10 08:53:36 +00:00
$this -> configCache -> get ( 'config' , 'admin_email' ),
2021-11-18 20:33:05 +00:00
$this -> t ( 'Your account email address must match this in order to use the web admin panel.' ),
$this -> t ( 'Required' ), 'autofocus' , 'email' ],
2019-04-14 12:05:48 +00:00
'$timezone' => Temporal :: getTimezoneField ( 'system-default_timezone' ,
2021-11-18 20:33:05 +00:00
$this -> t ( 'Please select a default timezone for your website' ),
2024-11-10 08:53:36 +00:00
$this -> configCache -> get ( 'system' , 'default_timezone' ),
2019-04-14 12:05:48 +00:00
'' ),
'$language' => [ 'system-language' ,
2021-11-18 20:33:05 +00:00
$this -> t ( 'System Language:' ),
2024-11-10 08:53:36 +00:00
$this -> configCache -> get ( 'system' , 'language' ),
2021-11-18 20:33:05 +00:00
$this -> t ( 'Set the default language for your Friendica installation interface and to send emails.' ),
2019-04-14 12:05:48 +00:00
$lang_choices ],
2024-11-10 08:53:36 +00:00
'$php_path' => $this -> configCache -> get ( 'config' , 'php_path' ),
2021-11-18 20:33:05 +00:00
'$submit' => $this -> t ( 'Submit' )
2018-10-29 13:10:45 +00:00
]);
break ;
case self :: FINISHED :
$db_return_text = " " ;
2021-11-17 20:32:57 +00:00
if ( count ( $this -> installer -> getChecks ()) == 0 ) {
2019-07-12 21:08:01 +00:00
$txt = '<p style="font-size: 130%;">' ;
2022-10-18 12:29:50 +00:00
$txt .= $this -> t ( 'Your Friendica site database has been installed.' ) . '<br />' ;
2018-10-29 13:10:45 +00:00
$db_return_text .= $txt ;
}
2023-02-18 19:43:49 +00:00
$tpl = Renderer :: getMarkupTemplate ( 'install/05_finished.tpl' );
2018-10-31 14:35:50 +00:00
$output .= Renderer :: replaceMacros ( $tpl , [
2020-12-20 03:47:07 +00:00
'$title' => $install_title ,
2021-11-18 20:33:05 +00:00
'$required' => $this -> t ( 'Required' ),
'$requirement_not_satisfied' => $this -> t ( 'Requirement not satisfied' ),
2021-11-17 20:32:57 +00:00
'$checks' => $this -> installer -> getChecks (),
2021-11-18 20:33:05 +00:00
'$pass' => $this -> t ( 'Installation finished' ),
2021-11-17 20:32:57 +00:00
'$text' => $db_return_text . $this -> whatNext (),
2018-10-29 13:10:45 +00:00
]);
break ;
}
return $output ;
}
/**
* Creates the text for the next steps
*
* @ return string The text for the next steps
2019-01-06 21:06:53 +00:00
* @ throws \Friendica\Network\HTTPException\InternalServerErrorException
2018-10-29 13:10:45 +00:00
*/
2022-06-23 09:39:45 +00:00
private function whatNext () : string
2018-10-29 13:39:09 +00:00
{
2023-04-15 14:17:30 +00:00
$baseurl = ( string ) $this -> baseUrl ;
2018-10-29 13:10:45 +00:00
return
2021-11-18 20:33:05 +00:00
$this -> t ( '<h1>What next</h1>' )
. " <p> " . $this -> t ( 'IMPORTANT: You will need to [manually] setup a scheduled task for the worker.' )
. $this -> t ( 'Please see the file "doc/INSTALL.md".' )
2018-10-29 13:39:09 +00:00
. " </p><p> "
2021-11-18 20:33:05 +00:00
. $this -> t ( 'Go to your new Friendica node <a href="%s/register">registration page</a> and register as new user. Remember to use the same email you have entered as administrator email. This will allow you to enter the site admin panel.' , $baseurl )
2018-10-29 13:39:09 +00:00
. " </p> " ;
2018-10-29 13:10:45 +00:00
}
2019-03-14 09:00:05 +00:00
/**
* Checks the $_POST settings and updates the config Cache for it
*
2021-10-26 19:44:29 +00:00
* @ param \Friendica\Core\Config\ValueObject\Cache $configCache The current config cache
* @ param array $post The $_POST data
* @ param string $cat The category of the setting
* @ param string $key The key of the setting
* @ param null | string $default The default value
2022-06-23 09:39:45 +00:00
* @ return void
2019-03-14 09:00:05 +00:00
*/
2021-11-18 23:19:00 +00:00
private function checkSetting ( Cache $configCache , array $post , string $cat , string $key , ? string $default = null )
2019-03-14 09:00:05 +00:00
{
2021-11-18 23:19:00 +00:00
$value = null ;
if ( isset ( $post [ sprintf ( '%s-%s' , $cat , $key )])) {
$value = trim ( $post [ sprintf ( '%s-%s' , $cat , $key )]);
}
if ( isset ( $value )) {
$configCache -> set ( $cat , $key , $value , Cache :: SOURCE_ENV );
return ;
}
if ( isset ( $default )) {
$configCache -> set ( $cat , $key , $default , Cache :: SOURCE_ENV );
}
2019-03-14 09:00:05 +00:00
}
2018-10-29 13:10:45 +00:00
}