Name = 'Setup';
$this->Version = '1.0';
$this->Creator = 'Chronos';
$this->License = 'GNU/GPLv3';
$this->Description = 'Base setup module';
$this->Revision = 1;
$this->Type = ModuleType::System;
// Check database persistence structure
$this->UpdateManager = new UpdateManager();
$this->UpdateManager->Database = &$this->Database;
$this->UpdateManager->Revision = $DatabaseRevision;
$this->UpdateManager->InstallMethod = 'FullInstall';
}
static function Cast(Module $Module): ModuleSetup
{
if ($Module instanceof ModuleSetup)
{
return $Module;
}
throw new Exception('Expected ModuleSetup type but '.gettype($Module));
}
function DoStart(): void
{
Core::Cast($this->System)->RegisterPage([''], 'PageSetupRedirect');
Core::Cast($this->System)->RegisterPage(['setup'], 'PageSetup');
}
function DoStop(): void
{
unset($this->UpdateManager);
Core::Cast($this->System)->UnregisterPage(['']);
Core::Cast($this->System)->UnregisterPage(['setup']);
}
function CheckState(): bool
{
return $this->Database->Connected() and $this->UpdateManager->IsInstalled() and
$this->UpdateManager->IsUpToDate();
}
function DoUpgrade(): string
{
$Updates = new Updates();
$this->UpdateManager->Trace = $Updates->Get();
$Output = $this->UpdateManager->Upgrade();
return $Output;
}
}
class PageSetup extends Page
{
public UpdateManager $UpdateManager;
public array $ConfigDefinition;
public array $Config;
public int $DatabaseRevision;
public int $Revision;
public string $ConfigDir;
public array $YesNo;
function __construct(System $System)
{
parent::__construct($System);
$this->Title = T('Application setup');
//$this->ParentClass = 'PageSetupRedirect';
$this->ConfigDir = dirname(dirname(dirname(__FILE__))).'/Config';
$this->YesNo = array(false => T('No'), true => T('Yes'));
}
function LoginPanel(): string
{
$Output = '
Přihlášení k instalaci
'.
'';
return $Output;
}
function ControlPanel(): string
{
$Output = ''.T('Instance management').'
';
$Output .= 'Je připojení k databázi: '.$this->YesNo[$this->UpdateManager->Database->Connected()].'
';
if ($this->UpdateManager->Database->Connected())
{
$Output .= 'Je instalováno: '.$this->YesNo[$this->UpdateManager->IsInstalled()].'
';
if ($this->UpdateManager->IsInstalled())
$Output .= 'Je aktuální: '.$this->YesNo[$this->UpdateManager->IsUpToDate()].'
'.
'Verze databáze: '.$this->UpdateManager->GetDbVersion().'
';
$Output .= 'Verze databáze kódu: '.$this->UpdateManager->Revision.'
';
if ($this->UpdateManager->IsInstalled())
{
if (!$this->UpdateManager->IsUpToDate())
$Output .= ''.T('Upgrade').' ';
$Output .= 'Vložit vzorová data ';
$Output .= 'Obnovit seznam modulů ';
$Output .= 'Odinstalovat ';
$Output .= 'Správa modulů ';
$Output .= 'Přegenerovat modely ';
} else $Output .= 'Instalovat ';
}
$Output .= 'Nastavit ';
$Output .= 'Odhlásit ';
$Output .= ''.T('Go to main page').' ';
$Output .= '';
return $Output;
}
function Show(): string
{
global $ConfigDefinition, $DatabaseRevision, $Config, $Updates;
$this->UpdateManager = ModuleSetup::Cast($this->System->GetModule('Setup'))->UpdateManager;
$DefaultConfig = new DefaultConfig();
$this->ConfigDefinition = $DefaultConfig->Get();
$this->DatabaseRevision = $DatabaseRevision;
$this->Config = &$Config;
$Output = '';
if (isset($this->Config))
{
if (!array_key_exists('SystemPassword', $_SESSION)) $_SESSION['SystemPassword'] = '';
if (array_key_exists('login', $_POST)) $_SESSION['SystemPassword'] = $_POST['SystemPassword'];
if (sha1($_SESSION['SystemPassword']) != $this->Config['SystemPassword'])
{
$Output .= $this->LoginPanel();
} else
{
if (array_key_exists('action', $_GET)) $Action = $_GET['action'];
else $Action = '';
if ($Action == 'logout')
{
$_SESSION['SystemPassword'] = '';
$Output .= 'Odhlášen';
$Output .= $this->LoginPanel();
}
else if ($Action == 'models')
{
$this->System->FormManager->UpdateSQLMeta();
}
else if ($Action == 'upgrade')
{
$Output .= 'Povýšení
';
try
{
$Output .= ModuleSetup::Cast($this->System->GetModule('Setup'))->DoUpgrade();
$this->System->ModuleManager->UpgradeAll(array(ModuleCondition::System));
} catch (Exception $E)
{
$Output .= $this->SystemMessage('Chyba aktualizace',
'Došlo k chybě v SQL dotazu při aktualizaci:
'.$E->getMessage());
}
$Output .= $this->ControlPanel();
}
else if ($Action == 'install')
{
$Output .= 'Instalace systém
';
global $DatabaseRevision;
$this->Database->query("CREATE TABLE IF NOT EXISTS `".$this->UpdateManager->VersionTable."` (".
'`Id` int(11) NOT NULL AUTO_INCREMENT, '.
'`Revision` int(11) NOT NULL, '.
'PRIMARY KEY (`Id`) '.
') ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;');
$DbResult = $this->Database->select($this->UpdateManager->VersionTable, 'Id');
if ($DbResult->num_rows == 0)
{
$this->Database->query("INSERT INTO `".$this->UpdateManager->VersionTable.
"` (`Id`, `Revision`) VALUES (1, ".$DatabaseRevision.");");
}
$this->System->ModuleManager->InstallAll(array(ModuleCondition::System));
$this->System->ModuleManager->LoadModules();
$this->System->ModuleManager->SaveState();
//$Output .= ModuleSetup::Cast($this->System->GetModule('Setup'))->Upgrade();
$Output .= $this->ControlPanel();
}
else if ($Action == 'uninstall')
{
$Output .= 'Odinstalace vše
';
$this->System->ModuleManager->UninstallAll(array(ModuleCondition::All));
$this->Database->query('DROP TABLE IF EXISTS `'.$this->UpdateManager->VersionTable.'`');
$Output .= $this->ControlPanel();
}
else if ($Action == 'reload-modules')
{
$Output .= 'Znovunačtení seznamu modulů
';
$this->System->ModuleManager->LoadModules();
$this->System->ModuleManager->SaveState();
$Output .= $this->ControlPanel();
}
else if ($Action == 'insert_sample_data')
{
$Output .= 'Vložení vzorových dat
';
$this->System->ModuleManager->Perform(array(ModuleAction::InsertSampleData), array(ModuleCondition::Installed));
$Output .= $this->ControlPanel();
}
else if ($Action == 'configure_save')
{
$Output .= $this->ConfigSave($this->Config);
$Output .= $this->ControlPanel();
}
else if ($Action == 'configure')
{
$Output .= $this->PrepareConfig($this->Config);
}
else
{
$Output .= $this->ControlPanel();
}
}
} else
{
if (array_key_exists('configure_save', $_POST))
{
$Output .= $this->ConfigSave(array());
$Output .= 'Pokračujte k přihlášení zde';
} else {
$Output .= $this->PrepareConfig(array());
}
}
return $Output;
}
function PrepareConfig($Config): string
{
$Output = '';
if (!file_exists($this->ConfigDir.'/Config.php') and !is_writable($this->ConfigDir))
$Output .= 'Varování: Konfigurační soubor nebude možné zapsat, protože složka "'.$this->ConfigDir.'" není povolená pro zápis!';
if (file_exists($this->ConfigDir.'/Config.php') and !is_writable($this->ConfigDir.'/Config.php'))
$Output .= 'Varování: Konfigurační soubor nebude možné zapsat, protože soubor "'.$this->ConfigDir.'/Config.php" není povolen pro zápis!';
$Output .= 'Nastavení systému
'.
'';
return $Output;
}
function ConfigSave($DefaultConfig)
{
$Config = $DefaultConfig;
foreach ($this->ConfigDefinition as $Def)
{
$Value = null;
if ($Def['Type'] == 'String') if (array_key_exists($Def['Name'], $_POST))
$Value = $_POST[$Def['Name']];
if ($Def['Type'] == 'Password') if (array_key_exists($Def['Name'], $_POST) and ($_POST[$Def['Name']] != ''))
$Value = $_POST[$Def['Name']];
if ($Def['Type'] == 'PasswordEncoded') if (array_key_exists($Def['Name'], $_POST) and ($_POST[$Def['Name']] != ''))
$Value = sha1($_POST[$Def['Name']]);
if ($Def['Type'] == 'Integer') if (array_key_exists($Def['Name'], $_POST))
$Value = $_POST[$Def['Name']];
if ($Def['Type'] == 'Float') if (array_key_exists($Def['Name'], $_POST))
$Value = $_POST[$Def['Name']];
if ($Def['Type'] == 'Boolean') if (array_key_exists($Def['Name'], $_POST))
$Value = $_POST[$Def['Name']];
if ($Def['Type'] == 'Array') if (array_key_exists($Def['Name'], $_POST))
$Value = explode(',', $_POST[$Def['Name']]);
if (!is_null($Value))
{
$PathParts = explode('/', $Def['Name']);
$TempConfig = &$Config;
foreach ($PathParts as $Part)
{
$TempConfig = &$TempConfig[$Part];
}
if (!is_array($TempConfig)) $TempConfig = $Value;
else $Value = $Def['Default'];
}
}
$ConfigText = $this->CreateConfig($Config);
file_put_contents($this->ConfigDir.'/Config.php', $ConfigText);
$Output = 'Konfigurace nastavena
';
return $Output;
}
function CreateConfig($Config): string
{
$Output = "ConfigDefinition as $Def)
{
$PathParts = explode('/', $Def['Name']);
$Output .= "\$Config";
foreach ($PathParts as $Part)
$Output .= "['".$Part."']";
$TempConfig = &$Config;
$Output .= ' = ';
foreach ($PathParts as $Part)
if (array_key_exists($Part, $TempConfig))
{
$TempConfig = &$TempConfig[$Part];
}
if (!is_array($TempConfig)) $Value = $TempConfig;
else $Value = $Def['Default'];
if ($Def['Type'] == 'Array')
{
$Output .= ' array(';
foreach ($Value as $Index => $Item)
$Output .= '\''.$Item.'\', ';
$Output .= ')';
}
else $Output .= "'".$Value."'";
$Output .= ";\n";
}
$Output .= "\n\n";
return $Output;
}
}
class PageSetupRedirect extends Page
{
function Show(): string
{
$Output = '';
if (!$this->Database->Connected())
{
$Output .= T('Can\'t connect to database.').'
';
} else
{
if (!ModuleSetup::Cast($this->System->GetModule('Setup'))->UpdateManager->IsInstalled())
{
$Output .= T('System requires database initialization.').'
';
} else
if (!ModuleSetup::Cast($this->System->GetModule('Setup'))->UpdateManager->IsUpToDate())
{
$Output .= T('System requires database upgrade.').'
';
}
}
$Output .= sprintf(T('Front page was not configured. Continue to %s.'), ''.T('setup').'');
return $Output;
}
}