Add warning and code functionality

This commit is contained in:
Florian Pesth 2023-12-29 16:59:58 +01:00
parent 906efd44a5
commit 7f9d9a06df
3 changed files with 108 additions and 21 deletions

View File

@ -4,6 +4,26 @@ require_once("Wizard.php");
$wizard = new Wizard();
$wizard->addCode('selectdatabase',function($storedvariables){
$selectdatabase['databasetype'] = $_POST['databasetype'];
return $selectdatabase;
});
$wizard->addCode('enterlogindata',function($storedvariables){
$logindata['host'] = $_POST['host'];
$logindata['user'] = $_POST['user'];
$logindata['password'] = $_POST['password'];
$logindata['dbname'] = $_POST['dbname'];
$conf_file = fopen("../etc/konfiguration.php", "w");
fwrite($conf_file, "<?php\n");
fwrite($conf_file, "define( 'MYSQL_HOST', '".$logindata['host']."' );\n");
fwrite($conf_file, "define( 'MYSQL_BENUTZER', '".$logindata['user']."' );\n");
fwrite($conf_file, "define( 'MYSQL_KENNWORT', '".$logindata['password']."' );\n");
fwrite($conf_file, "define( 'MYSQL_DATENBANK', '".$logindata['dbname']."' );\n");
fwrite($conf_file, "?>");
return $logindata;
});
$wizard->renderPHP();
?>

View File

@ -3,6 +3,8 @@
class WizardStep {
public string $page = "";
public array $redirects = array();
public string $warning = "";
public $code = null;
public function __construct($step){
if(isset($step['page'])){
$this->page = $step['page'];
@ -16,49 +18,76 @@ class WizardStep {
foreach($this->redirects as $redirect){
if(isset($redirect['==']) && isset($redirect['id'])){
foreach($redirect['=='] as $key => $value){
if(isset($_GET[$key]) && $_GET[$key] == $value){
$_GET['step'] = $redirect['id'];
if(isset($_POST[$key]) && $_POST[$key] == $value){
$_POST['step'] = $redirect['id'];
if(isset($redirect['warning'])){
$this->warning = $redirect['warning'];
}
return;
}
}
}
if(isset($redirect['!=']) && isset($redirect['id'])){
foreach($redirect['!='] as $key => $value){
if(isset($_GET[$key]) && $_GET[$key] != $value){
$_GET['step'] = $redirect['id'];
if(isset($_POST[$key]) && $_POST[$key] != $value){
$_POST['step'] = $redirect['id'];
if(isset($redirect['warning'])){
$this->warning = $redirect['warning'];
}
return;
}
}
}
if(isset($redirect['>']) && isset($redirect['id'])){
foreach($redirect['>'] as $key => $value){
if(isset($_GET[$key]) && $_GET[$key] > $value){
$_GET['step'] = $redirect['id'];
if(isset($_POST[$key]) && $_POST[$key] > $value){
$_POST['step'] = $redirect['id'];
if(isset($redirect['warning'])){
$this->warning = $redirect['warning'];
}
return;
}
}
}
if(isset($redirect['<']) && isset($redirect['id'])){
foreach($redirect['<'] as $key => $value){
if(isset($_GET[$key]) && $_GET[$key] < $value){
$_GET['step'] = $redirect['id'];
if(isset($_POST[$key]) && $_POST[$key] < $value){
$_POST['step'] = $redirect['id'];
if(isset($redirect['warning'])){
$this->warning = $redirect['warning'];
}
return;
}
}
}
if(isset($redirect['>=']) && isset($redirect['id'])){
foreach($redirect['>='] as $key => $value){
if(isset($_GET[$key]) && $_GET[$key] >= $value){
$_GET['step'] = $redirect['id'];
if(isset($_POST[$key]) && $_POST[$key] >= $value){
$_POST['step'] = $redirect['id'];
if(isset($redirect['warning'])){
$this->warning = $redirect['warning'];
}
return;
}
}
}
if(isset($redirect['<=']) && isset($redirect['id'])){
foreach($redirect['<='] as $key => $value){
if(isset($_GET[$key]) && $_GET[$key] <= $value){
$_GET['step'] = $redirect['id'];
if(isset($_POST[$key]) && $_POST[$key] <= $value){
$_POST['step'] = $redirect['id'];
if(isset($redirect['warning'])){
$this->warning = $redirect['warning'];
}
return;
}
}
}
}
}
}
public function setCode(callable $function){
$this->code = $function;
}
}
class Wizard {
@ -66,6 +95,7 @@ class Wizard {
private string $firststep = "";
private array $steps = array();
private string $footer = "";
private array $storedvariables = array();
public function __construct($json_file = 'setupWizard.json'){
$stepsArray = json_decode(file_get_contents($json_file), true);
$this->header = $stepsArray['header'];
@ -74,19 +104,40 @@ class Wizard {
$this->steps[$step['id']] = new WizardStep($step);
}
$this->footer = $stepsArray['footer'];
if(isset($_POST['storedvariables'])){
$this->storedvariables = json_decode($_POST['storedvariables'],JSON_FORCE_OBJECT);
}
}
public function renderPHP(){
if(isset($_GET['stepfrom'])){
$this->steps[$_GET['stepfrom']]->setCurrentStep();
}
echo $this->header;
if(isset($_GET['step'])){
echo $this->steps[$_GET['step']]->page;
if(isset($_POST['stepfrom'])){
$this->steps[$_POST['stepfrom']]->setCurrentStep();
if(isset($_POST['step']) && ($_POST['step'] != $_POST['stepfrom'])){
if(!is_null($this->steps[$_POST['stepfrom']]->code)){
$this->storedvariables[$_POST['stepfrom']] = call_user_func($this->steps[$_POST['stepfrom']]->code, $this->storedvariables);
}
}
}
else{
echo $this->steps[$this->firststep]->page;
if(!isset($_POST['step'])){
$_POST['step'] = $this->firststep;
}
// If warning not set this does not add anything to the page:
echo $this->steps[$_POST['step']]->warning;
$pagedom = new DOMDocument();
$pagedom->loadHTML("\xEF\xBB\xBF".$this->steps[$_POST['step']]->page);
$forms = $pagedom->getElementsByTagName('form');
foreach($forms as $form){
$input = $pagedom->createElement('input');
$input->setAttribute('type','hidden');
$input->setAttribute('name','storedvariables');
$input->setAttribute('value',json_encode($this->storedvariables,JSON_FORCE_OBJECT));
$form->appendChild($input);
}
echo $pagedom->saveHTML();
echo $this->footer;
}
public function addCode($stepid, $function){
$this->steps[$stepid]->setCode($function);
}
}
?>

View File

@ -4,7 +4,7 @@
"steps": [
{
"id": "selectdatabase",
"page": "<h2>Datenbanktyp auswählen<\/h2><p>Für die meisten Conventions sollte eine SQLite Datenbank ausreichen. In diesem Fall ist die Datenbank in einer einzelnen Datei und es ist nicht nötig eine separate Datenbank aufzusetzen.<\/p><p><form action=\"Setup.php\">\r\n <fieldset>\r\n <legend>Datenbank auswählen<\/legend>\r\n <input type=\"hidden\" name=\"stepfrom\" value=\"selectdatabase\" \/>\r\n <input type=\"radio\" id=\"sqlite\" name=\"databasetype\" value=\"SQLite\" checked \/>\r\n <label for=\"sqlite\">SQLite<\/label><br \/>\r\n <input type=\"radio\" id=\"sqlite\" name=\"databasetype\" value=\"MariaDB\" \/>\r\n <label for=\"sqlite\">MariaDB<\/label><br \/>\r\n <input type=\"submit\" value=\"Weiter\" \/>\r\n <\/fieldset>\r\n<\/form><\/p>",
"page": "<h2>Datenbanktyp auswählen<\/h2><p>Für die meisten Conventions sollte eine SQLite Datenbank ausreichen. In diesem Fall ist die Datenbank in einer einzelnen Datei und es ist nicht nötig eine separate Datenbank aufzusetzen.<\/p><p><form action=\"Setup.php\" method=\"post\">\r\n <fieldset>\r\n <legend>Datenbank auswählen<\/legend>\r\n <input type=\"hidden\" name=\"stepfrom\" value=\"selectdatabase\" \/>\r\n <input type=\"radio\" id=\"sqlite\" name=\"databasetype\" value=\"SQLite\" checked \/>\r\n <label for=\"sqlite\">SQLite<\/label><br \/>\r\n <input type=\"radio\" id=\"sqlite\" name=\"databasetype\" value=\"MariaDB\" \/>\r\n <label for=\"sqlite\">MariaDB<\/label><br \/>\r\n <input type=\"submit\" value=\"Weiter\" \/>\r\n <\/fieldset>\r\n<\/form><\/p>",
"redirects": [
{
"==": {"databasetype": "SQLite"},
@ -22,7 +22,23 @@
},
{
"id": "enterlogindata",
"page": "<h2>Logindaten f\u00FCr die Datenbank eingeben<\/h2>\r\n<p>Bitte hier zun\u00E4chst die Logindaten f\u00FCr die Datenbank eingeben. Es muss in der Regel nur ein Passwort vergeben werden und die anderen beiden Werte k\u00F6nnen unver\u00E4ndert bleiben.<\/p>\r\n<p><form action=\"Setup.php\" >\r\n <input type=\"hidden\" name=\"step\" value=\"setupdatabase\" \/>\r\n <label for=\"host\">Hostname<\/label><br \/>\r\n <input type=\"text\" id=\"host\" name=\"host\" value=\"localhost\" \/><br \/>\r\n <label for=\"user\">Benutzername<\/label><br \/>\r\n <input type=\"text\" id=\"user\" name=\"user\" value=\"helferdb\" \/><br \/>\r\n <label for=\"password\">Passwort<\/label><br \/>\r\n <input type=\"password\" id=\"password\" name=\"password\" \/><br \/>\r\n <input type=\"submit\" value=\"Datenbank einrichten\" \/>\r\n<\/form><\/p>\r\n"
"page": "<h2>Logindaten für die Datenbank eingeben<\/h2>\r\n<p>Bitte hier zun\u00E4chst die Logindaten f\u00FCr die Datenbank eingeben. Es muss in der Regel nur ein Passwort vergeben werden und die anderen beiden Werte k\u00F6nnen unver\u00E4ndert bleiben.<\/p>\r\n<p><form action=\"Setup.php\" method=\"post\">\r\n <fieldset>\r\n <legend>Logindaten eingeben<\/legend>\r\n <input type=\"hidden\" name=\"step\" value=\"setupdatabase\" \/>\r\n <input type=\"hidden\" name=\"stepfrom\" value=\"enterlogindata\" \/>\r\n <label for=\"host\">Hostname<\/label><br \/>\r\n <input type=\"text\" id=\"host\" name=\"host\" value=\"localhost\" \/><br \/>\r\n <label for=\"user\">Benutzername<\/label><br \/>\r\n <input type=\"text\" id=\"user\" name=\"user\" value=\"helferdb\" \/><br \/>\r\n <label for=\"password\">Passwort<\/label><br \/>\r\n <input type=\"password\" id=\"password\" name=\"password\" \/><br \/>\r\n <label for=\"dbname\">Datenbankname<\/label><br \/>\r\n <input type=\"text\" id=\"dbname\" name=\"dbname\" value=\"helferdb\" \/><br \/>\r\n <input type=\"submit\" value=\"Datenbank einrichten\" \/>\r\n<\/fieldset>\r\n<\/form><\/p>\r\n",
"redirects": [
{
"==": {"password": ""},
"id": "enterlogindata",
"warning": "<p style=\"color:red\"><i>Bitte Passwort eingeben!<\/i><\/p>"
},
{
"==": {
"host":"",
"user":"",
"dbname":""
},
"id": "enterlogindata",
"warning": "<p style=\"color:red\"><i>Bitte alle Felder eingeben!<\/i><\/p>"
}
]
},
{
"id": "setupdatabase",