2018-10-29 14:10:45 +01:00
< ? php
2020-02-09 15:45:36 +01:00
/**
2024-01-02 20:57:26 +00:00
* @ copyright Copyright ( C ) 2010 - 2024 , the Friendica project
2020-02-09 15:45:36 +01:00
*
* @ license GNU AGPL version 3 or any later version
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation , either version 3 of the
* License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Affero General Public License for more details .
*
* You should have received a copy of the GNU Affero General Public License
* along with this program . If not , see < https :// www . gnu . org / licenses />.
*
*/
2018-10-29 14:10:45 +01:00
namespace Friendica\Module ;
use Friendica\App ;
use Friendica\BaseModule ;
use Friendica\Core ;
2021-10-26 21:44:29 +02:00
use Friendica\Core\Config\ValueObject\Cache ;
2021-11-17 21:32:57 +01:00
use Friendica\Core\L10n ;
2018-10-31 10:35:50 -04:00
use Friendica\Core\Renderer ;
2021-03-12 18:21:50 +01:00
use Friendica\Core\Theme ;
2019-12-15 22:34:11 +01:00
use Friendica\DI ;
2019-07-12 23:08:01 +02:00
use Friendica\Network\HTTPException ;
2019-03-26 22:04:31 +01:00
use Friendica\Util\BasePath ;
2021-11-20 15:38:03 +01:00
use Friendica\Util\Profiler ;
2018-10-29 14:10:45 +01:00
use Friendica\Util\Temporal ;
2021-11-20 15:38:03 +01:00
use Psr\Log\LoggerInterface ;
2023-02-18 20:43:49 +01:00
use GuzzleHttp\Psr7\Uri ;
2018-10-29 14:10:45 +01:00
class Install extends BaseModule
{
/**
* Step one - System check
*/
const SYSTEM_CHECK = 1 ;
/**
2019-03-26 22:04:31 +01:00
* Step two - Base information
2018-10-29 14:10:45 +01:00
*/
2019-03-26 22:04:31 +01:00
const BASE_CONFIG = 2 ;
2018-10-29 14:10:45 +01:00
/**
2019-03-26 22:04:31 +01:00
* Step three - Database configuration
2018-10-29 14:10:45 +01:00
*/
2019-03-26 22:04:31 +01:00
const DATABASE_CONFIG = 3 ;
2018-10-29 14:10:45 +01:00
/**
2019-04-14 14:05:48 +02:00
* Step four - Adapt site settings
2018-10-29 14:10:45 +01:00
*/
2019-03-26 22:04:31 +01:00
const SITE_SETTINGS = 4 ;
/**
* Step five - All steps finished
*/
const FINISHED = 5 ;
2018-10-29 14:10:45 +01:00
/**
* @ var int The current step of the wizard
*/
2021-11-17 21:32:57 +01:00
private $currentWizardStep ;
2018-10-29 14:10:45 +01:00
2018-10-29 18:44:39 +01:00
/**
* @ var Core\Installer The installer
*/
2021-11-17 21:32:57 +01:00
private $installer ;
2021-11-19 00:19:00 +01:00
2021-11-17 21:32:57 +01:00
/** @var App */
protected $app ;
/** @var App\Mode */
protected $mode ;
2023-02-18 20:43:49 +01:00
public function __construct ( App $app , BasePath $basePath , App\Mode $mode , L10n $l10n , App\BaseURL $baseUrl , App\Arguments $args , LoggerInterface $logger , Profiler $profiler , Response $response , Core\Installer $installer , array $server , array $parameters = [])
2018-10-29 14:10:45 +01:00
{
2021-11-21 20:06:36 +01:00
parent :: __construct ( $l10n , $baseUrl , $args , $logger , $profiler , $response , $server , $parameters );
2021-11-17 21:32:57 +01:00
$this -> app = $app ;
$this -> mode = $mode ;
$this -> installer = $installer ;
2018-10-29 14:10:45 +01:00
2021-11-17 21:32:57 +01:00
if ( ! $this -> mode -> isInstall ()) {
2019-07-12 23:08:01 +02:00
throw new HTTPException\ForbiddenException ();
2019-04-14 14:05:48 +02:00
}
2018-10-29 14:10:45 +01:00
// route: install/testrwrite
// $baseurl/install/testrwrite to test if rewrite in .htaccess is working
2021-11-17 21:32:57 +01:00
if ( $args -> get ( 1 , '' ) == 'testrewrite' ) {
2018-10-29 14:10:45 +01:00
// Status Code 204 means that it worked without content
2019-07-12 23:08:01 +02:00
throw new HTTPException\NoContentException ();
2018-10-29 14:10:45 +01:00
}
2019-03-26 22:04:31 +01:00
// get basic installation information and save them to the config cache
2021-11-17 21:32:57 +01:00
$configCache = $this -> app -> getConfigCache ();
$this -> installer -> setUpCache ( $configCache , $basePath -> getPath ());
2019-03-26 22:04:31 +01:00
2018-10-29 14:39:09 +01: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 20:43:49 +01:00
Renderer :: $theme [ 'stylesheet' ] = $this -> baseUrl . '/view/install/style.css' ;
2018-10-29 14:10:45 +01:00
2021-11-17 21:32:57 +01:00
$this -> currentWizardStep = ( $_POST [ 'pass' ] ? ? '' ) ? : self :: SYSTEM_CHECK ;
2018-10-29 14:10:45 +01:00
}
2021-11-28 13:44:42 +01:00
protected function post ( array $request = [])
2018-10-29 14:10:45 +01:00
{
2021-11-17 21:32:57 +01:00
$configCache = $this -> app -> getConfigCache ();
2018-10-29 14:10:45 +01:00
2021-11-17 21:32:57 +01:00
switch ( $this -> currentWizardStep ) {
2018-10-29 14:10:45 +01:00
case self :: SYSTEM_CHECK :
2019-03-26 22:04:31 +01:00
case self :: BASE_CONFIG :
2021-11-17 21:32:57 +01:00
$this -> checkSetting ( $configCache , $_POST , 'config' , 'php_path' );
2019-03-26 22:04:31 +01:00
break ;
2018-10-29 14:10:45 +01:00
case self :: DATABASE_CONFIG :
2021-11-17 21:32:57 +01:00
$this -> checkSetting ( $configCache , $_POST , 'config' , 'php_path' );
2019-03-26 22:04:31 +01:00
2021-11-17 21:32:57 +01:00
$this -> checkSetting ( $configCache , $_POST , 'system' , 'basepath' );
2023-02-18 20:43:49 +01:00
$this -> checkSetting ( $configCache , $_POST , 'system' , 'url' );
2018-10-29 18:44:39 +01:00
break ;
2018-10-29 14:10:45 +01:00
case self :: SITE_SETTINGS :
2021-11-17 21:32:57 +01:00
$this -> checkSetting ( $configCache , $_POST , 'config' , 'php_path' );
2019-03-14 10:00:05 +01:00
2021-11-17 21:32:57 +01:00
$this -> checkSetting ( $configCache , $_POST , 'system' , 'basepath' );
2023-02-18 20:43:49 +01:00
$this -> checkSetting ( $configCache , $_POST , 'system' , 'url' );
2019-03-26 22:04:31 +01:00
2021-11-17 21:32:57 +01:00
$this -> checkSetting ( $configCache , $_POST , 'database' , 'hostname' , Core\Installer :: DEFAULT_HOST );
$this -> checkSetting ( $configCache , $_POST , 'database' , 'username' , '' );
$this -> checkSetting ( $configCache , $_POST , 'database' , 'password' , '' );
$this -> checkSetting ( $configCache , $_POST , 'database' , 'database' , '' );
2018-10-29 14:10:45 +01:00
2018-10-29 18:44:39 +01:00
// If we cannot connect to the database, return to the previous step
2021-11-17 21:32:57 +01:00
if ( ! $this -> installer -> checkDB ( DI :: dba ())) {
$this -> currentWizardStep = self :: DATABASE_CONFIG ;
2018-10-29 14:10:45 +01:00
}
2018-10-29 18:44:39 +01:00
break ;
2018-10-29 14:10:45 +01:00
case self :: FINISHED :
2021-11-17 21:32:57 +01:00
$this -> checkSetting ( $configCache , $_POST , 'config' , 'php_path' );
2019-03-14 10:00:05 +01:00
2021-11-17 21:32:57 +01:00
$this -> checkSetting ( $configCache , $_POST , 'system' , 'basepath' );
2023-02-18 20:43:49 +01:00
$this -> checkSetting ( $configCache , $_POST , 'system' , 'url' );
2019-03-26 22:04:31 +01:00
2021-11-17 21:32:57 +01:00
$this -> checkSetting ( $configCache , $_POST , 'database' , 'hostname' , Core\Installer :: DEFAULT_HOST );
$this -> checkSetting ( $configCache , $_POST , 'database' , 'username' , '' );
$this -> checkSetting ( $configCache , $_POST , 'database' , 'password' , '' );
$this -> checkSetting ( $configCache , $_POST , 'database' , 'database' , '' );
2019-03-14 10:00:05 +01:00
2021-11-17 21:32:57 +01:00
$this -> checkSetting ( $configCache , $_POST , 'system' , 'default_timezone' , Core\Installer :: DEFAULT_TZ );
$this -> checkSetting ( $configCache , $_POST , 'system' , 'language' , Core\Installer :: DEFAULT_LANG );
$this -> checkSetting ( $configCache , $_POST , 'config' , 'admin_email' , '' );
2018-10-29 14:10:45 +01:00
2018-10-29 18:44:39 +01:00
// If we cannot connect to the database, return to the Database config wizard
2021-11-17 21:32:57 +01:00
if ( ! $this -> installer -> checkDB ( DI :: dba ())) {
$this -> currentWizardStep = self :: DATABASE_CONFIG ;
2018-10-30 11:30:19 +01:00
return ;
2018-10-29 14:10:45 +01:00
}
2021-11-17 21:32:57 +01:00
if ( ! $this -> installer -> createConfig ( $configCache )) {
2018-10-29 18:44:39 +01:00
return ;
2018-10-29 14:10:45 +01:00
}
2022-07-12 23:21:16 +02:00
$this -> installer -> installDatabase ();
2023-01-01 09:36:24 -05:00
2021-03-12 18:21:50 +01: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 14:10:45 +01:00
2018-10-29 18:44:39 +01:00
break ;
2018-10-29 14:10:45 +01:00
}
}
2021-11-20 15:38:03 +01:00
protected function content ( array $request = []) : string
2018-10-29 14:10:45 +01:00
{
2021-11-17 21:32:57 +01:00
$configCache = $this -> app -> getConfigCache ();
2018-10-29 14:10:45 +01:00
$output = '' ;
2021-11-18 21:33:05 +01:00
$install_title = $this -> t ( 'Friendica Communications Server - Setup' );
2018-10-29 14:10:45 +01:00
2021-11-17 21:32:57 +01:00
switch ( $this -> currentWizardStep ) {
2018-10-29 14:10:45 +01:00
case self :: SYSTEM_CHECK :
2019-03-14 10:00:05 +01:00
$php_path = $configCache -> get ( 'config' , 'php_path' );
2018-10-29 14:10:45 +01:00
2023-02-18 20:43:49 +01:00
$status = $this -> installer -> checkEnvironment ( $this -> baseUrl , $php_path );
2018-10-29 14:10:45 +01:00
2023-02-18 20:43:49 +01:00
$tpl = Renderer :: getMarkupTemplate ( 'install/01_checks.tpl' );
2018-10-31 10:35:50 -04:00
$output .= Renderer :: replaceMacros ( $tpl , [
2019-04-14 14:05:48 +02:00
'$title' => $install_title ,
2021-11-18 21:33:05 +01: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 21:32:57 +01:00
'$checks' => $this -> installer -> getChecks (),
2019-04-14 14:05:48 +02:00
'$passed' => $status ,
2021-11-18 21:33:05 +01:00
'$see_install' => $this -> t ( 'Please see the file "doc/INSTALL.md".' ),
'$next' => $this -> t ( 'Next' ),
'$reload' => $this -> t ( 'Check again' ),
2019-04-14 14:05:48 +02:00
'$php_path' => $php_path ,
2018-10-29 14:10:45 +01:00
]);
break ;
2019-03-26 22:04:31 +01:00
case self :: BASE_CONFIG :
2023-02-18 20:43:49 +01:00
$baseUrl = $configCache -> get ( 'system' , 'url' ) ?
new Uri ( $configCache -> get ( 'system' , 'url' )) :
$this -> baseUrl ;
2019-03-26 22:04:31 +01:00
2023-02-18 20:43:49 +01:00
$tpl = Renderer :: getMarkupTemplate ( 'install/02_base_config.tpl' );
2019-03-26 22:04:31 +01:00
$output .= Renderer :: replaceMacros ( $tpl , [
'$title' => $install_title ,
2021-11-18 21:33:05 +01:00
'$pass' => $this -> t ( 'Base settings' ),
2019-03-26 22:04:31 +01:00
'$basepath' => [ 'system-basepath' ,
2021-11-18 21:33:05 +01:00
$this -> t ( " Base path to installation " ),
2019-04-14 14:05:48 +02:00
$configCache -> get ( 'system' , 'basepath' ),
2021-11-18 21:33:05 +01: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 20:43:49 +01:00
'$system_url' => [ 'system-url' ,
$this -> t ( 'The Friendica system URL' ),
( string ) $baseUrl ,
2023-02-19 11:12:48 +01:00
$this -> t ( " Overwrite this field in case the system URL determination isn't right, otherwise leave it as is. " ),
2023-02-18 20:43:49 +01:00
$this -> t ( 'Required' )],
2019-03-26 22:04:31 +01:00
'$php_path' => $configCache -> get ( 'config' , 'php_path' ),
2021-11-18 21:33:05 +01:00
'$submit' => $this -> t ( 'Submit' ),
2019-03-26 22:04:31 +01:00
]);
break ;
2018-10-29 14:10:45 +01:00
case self :: DATABASE_CONFIG :
2023-02-18 20:43:49 +01:00
$tpl = Renderer :: getMarkupTemplate ( 'install/03_database_config.tpl' );
2018-10-31 10:35:50 -04:00
$output .= Renderer :: replaceMacros ( $tpl , [
2019-04-14 14:05:48 +02:00
'$title' => $install_title ,
2021-11-18 21:33:05 +01: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 21:32:57 +01:00
'$checks' => $this -> installer -> getChecks (),
2019-03-26 22:04:31 +01:00
'$basepath' => $configCache -> get ( 'system' , 'basepath' ),
2023-02-18 20:43:49 +01:00
'$system_url' => $configCache -> get ( 'system' , 'url' ),
2019-04-14 14:05:48 +02:00
'$dbhost' => [ 'database-hostname' ,
2021-11-18 21:33:05 +01:00
$this -> t ( 'Database Server Name' ),
2019-04-14 14:05:48 +02:00
$configCache -> get ( 'database' , 'hostname' ),
'' ,
2021-11-18 21:33:05 +01:00
$this -> t ( 'Required' )],
2019-04-14 14:40:26 +02:00
'$dbuser' => [ 'database-username' ,
2021-11-18 21:33:05 +01:00
$this -> t ( 'Database Login Name' ),
2019-04-14 14:05:48 +02:00
$configCache -> get ( 'database' , 'username' ),
'' ,
2021-11-18 21:33:05 +01:00
$this -> t ( 'Required' ),
2019-04-14 14:05:48 +02:00
'autofocus' ],
'$dbpass' => [ 'database-password' ,
2021-11-18 21:33:05 +01:00
$this -> t ( 'Database Login Password' ),
2019-04-14 14:05:48 +02:00
$configCache -> get ( 'database' , 'password' ),
2021-11-18 21:33:05 +01:00
$this -> t ( " For security reasons the password must not be empty " ),
$this -> t ( 'Required' )],
2019-04-14 14:05:48 +02:00
'$dbdata' => [ 'database-database' ,
2021-11-18 21:33:05 +01:00
$this -> t ( 'Database Name' ),
2019-04-14 14:05:48 +02:00
$configCache -> get ( 'database' , 'database' ),
'' ,
2021-11-18 21:33:05 +01:00
$this -> t ( 'Required' )],
'$lbl_10' => $this -> t ( 'Please select a default timezone for your website' ),
2019-04-14 14:05:48 +02:00
'$php_path' => $configCache -> get ( 'config' , 'php_path' ),
2021-11-18 21:33:05 +01:00
'$submit' => $this -> t ( 'Submit' )
2018-10-29 14:10:45 +01:00
]);
break ;
2018-10-29 18:44:39 +01:00
2018-10-29 14:10:45 +01:00
case self :: SITE_SETTINGS :
/* Installed langs */
2021-11-17 21:32:57 +01:00
$lang_choices = $this -> l10n -> getAvailableLanguages ();
2018-10-29 14:10:45 +01:00
2023-02-18 20:43:49 +01:00
$tpl = Renderer :: getMarkupTemplate ( 'install/04_site_settings.tpl' );
2018-10-31 10:35:50 -04:00
$output .= Renderer :: replaceMacros ( $tpl , [
2019-04-14 14:05:48 +02:00
'$title' => $install_title ,
2021-11-18 21:33:05 +01:00
'$required' => $this -> t ( 'Required' ),
2021-11-17 21:32:57 +01:00
'$checks' => $this -> installer -> getChecks (),
2021-11-18 21:33:05 +01:00
'$pass' => $this -> t ( 'Site settings' ),
2019-04-14 14:05:48 +02:00
'$basepath' => $configCache -> get ( 'system' , 'basepath' ),
2023-02-18 20:43:49 +01:00
'$system_url' => $configCache -> get ( 'system' , 'url' ),
2019-04-14 14:05:48 +02:00
'$dbhost' => $configCache -> get ( 'database' , 'hostname' ),
'$dbuser' => $configCache -> get ( 'database' , 'username' ),
'$dbpass' => $configCache -> get ( 'database' , 'password' ),
'$dbdata' => $configCache -> get ( 'database' , 'database' ),
'$adminmail' => [ 'config-admin_email' ,
2021-11-18 21:33:05 +01:00
$this -> t ( 'Site administrator email address' ),
2019-04-14 14:05:48 +02:00
$configCache -> get ( 'config' , 'admin_email' ),
2021-11-18 21:33:05 +01: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 14:05:48 +02:00
'$timezone' => Temporal :: getTimezoneField ( 'system-default_timezone' ,
2021-11-18 21:33:05 +01:00
$this -> t ( 'Please select a default timezone for your website' ),
2019-04-14 14:05:48 +02:00
$configCache -> get ( 'system' , 'default_timezone' ),
'' ),
'$language' => [ 'system-language' ,
2021-11-18 21:33:05 +01:00
$this -> t ( 'System Language:' ),
2019-04-14 14:05:48 +02:00
$configCache -> get ( 'system' , 'language' ),
2021-11-18 21:33:05 +01:00
$this -> t ( 'Set the default language for your Friendica installation interface and to send emails.' ),
2019-04-14 14:05:48 +02:00
$lang_choices ],
'$php_path' => $configCache -> get ( 'config' , 'php_path' ),
2021-11-18 21:33:05 +01:00
'$submit' => $this -> t ( 'Submit' )
2018-10-29 14:10:45 +01:00
]);
break ;
case self :: FINISHED :
$db_return_text = " " ;
2021-11-17 21:32:57 +01:00
if ( count ( $this -> installer -> getChecks ()) == 0 ) {
2019-07-12 23:08:01 +02: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 14:10:45 +01:00
$db_return_text .= $txt ;
}
2023-02-18 20:43:49 +01:00
$tpl = Renderer :: getMarkupTemplate ( 'install/05_finished.tpl' );
2018-10-31 10:35:50 -04:00
$output .= Renderer :: replaceMacros ( $tpl , [
2020-12-19 22:47:07 -05:00
'$title' => $install_title ,
2021-11-18 21:33:05 +01:00
'$required' => $this -> t ( 'Required' ),
'$requirement_not_satisfied' => $this -> t ( 'Requirement not satisfied' ),
2021-11-17 21:32:57 +01:00
'$checks' => $this -> installer -> getChecks (),
2021-11-18 21:33:05 +01:00
'$pass' => $this -> t ( 'Installation finished' ),
2021-11-17 21:32:57 +01:00
'$text' => $db_return_text . $this -> whatNext (),
2018-10-29 14:10:45 +01:00
]);
break ;
}
return $output ;
}
/**
* Creates the text for the next steps
*
* @ return string The text for the next steps
2019-01-06 16:06:53 -05:00
* @ throws \Friendica\Network\HTTPException\InternalServerErrorException
2018-10-29 14:10:45 +01:00
*/
2022-06-23 11:39:45 +02:00
private function whatNext () : string
2018-10-29 14:39:09 +01:00
{
2023-04-15 14:17:30 +00:00
$baseurl = ( string ) $this -> baseUrl ;
2018-10-29 14:10:45 +01:00
return
2021-11-18 21:33:05 +01: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 14:39:09 +01:00
. " </p><p> "
2021-11-18 21:33:05 +01: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 14:39:09 +01:00
. " </p> " ;
2018-10-29 14:10:45 +01:00
}
2019-03-14 10:00:05 +01:00
/**
* Checks the $_POST settings and updates the config Cache for it
*
2021-10-26 21:44:29 +02: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 11:39:45 +02:00
* @ return void
2019-03-14 10:00:05 +01:00
*/
2021-11-19 00:19:00 +01:00
private function checkSetting ( Cache $configCache , array $post , string $cat , string $key , ? string $default = null )
2019-03-14 10:00:05 +01:00
{
2021-11-19 00:19:00 +01: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 10:00:05 +01:00
}
2018-10-29 14:10:45 +01:00
}