diff --git a/README.md b/README.md
index e802fcf..1036262 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,8 @@ https://gitea.haschek.at/Crispi/dogstats
## Techstack
- [HTMX](https://htmx.org/docs/)
-- [Tailwind](https://flowbite.com/docs/components/)
+- [Tailwind](https://flowbite.com/docs/components/accordion/)
+- [Font Awesome 5 Pro](https://fontawesome.com/v5/search)
## Start Dev
diff --git a/web/inc/classes/Model.class.php b/web/inc/classes/Model.class.php
index 0d049e5..31f70f1 100644
--- a/web/inc/classes/Model.class.php
+++ b/web/inc/classes/Model.class.php
@@ -57,34 +57,54 @@ class Model {
public function save()
{
+ if (!$this->id)
+ $this->id = gen_ulid();
if (!$this->validate())
return false;
foreach($this->dbFields as $field=>$options)
{
if(isset($this->data[$field]))
- $this->redis->hset($this->dbTable.':'.$this->id,$field,$this->data[$field]);
+ {
+ error_log($field.' -> '.$options['type']);
+ if($options['type']=='array')
+ $GLOBALS['redis']->hset($this->dbTable.':'.$this->id,$field,json_encode($this->data[$field]));
+ else
+ {
+
+ error_log("hset $this->dbTable:$this->id $field {$this->data[$field]}");
+ $GLOBALS['redis']->hset($this->dbTable.':'.$this->id,$field,$this->data[$field]);
+ }
+ }
+
}
+
+ return $this->id;
}
public function load($id)
{
$this->id = $id;
- if(!$this->redis->exists($this->dbTable.':'.$this->id))
+ if(!$GLOBALS['redis']->exists($this->dbTable.':'.$this->id))
return false;
$keys = array_keys($this->dbFields);
foreach($keys as $key)
{
- $value = $this->redis->hget($this->dbTable.':'.$this->id,$key);
+ $value = $GLOBALS['redis']->hget($this->dbTable.':'.$this->id,$key);
if($value!==NULL) //we'll leave null values
- switch($this->dbFields[$key]['type'])
- {
- case 'int': $value = intval($value);break;
- case 'bool': $value = boolval($value);break;
- case 'float': $value = floatval($value);break;
- case 'double': $value = doubleval($value);break;
- }
+ switch($this->dbFields[$key]['type'])
+ {
+ case 'int': $value = intval($value);break;
+ case 'bool': $value = boolval($value);break;
+ case 'float': $value = floatval($value);break;
+ case 'double': $value = doubleval($value);break;
+ case 'array':
+ $value = json_decode($value,true);
+ if($value===null)
+ $value = [];
+ break;
+ }
$this->data[$key] = $value;
}
@@ -148,6 +168,10 @@ class Model {
throw new Exception("$type validation failed");
}
break;
+ case 'array':
+ if(!is_array($value))
+ throw new Exception('Dogs validation failed');
+ break;
case 'csv':
case "text":
$regexp = null;
@@ -180,7 +204,7 @@ class Model {
function delete()
{
- return $this->redis->del($this->dbTable.':'.$this->id);
+ return $GLOBALS['redis']->del($this->dbTable.':'.$this->id);
}
function gen_shorthash(){
diff --git a/web/inc/core.php b/web/inc/core.php
index 5de442f..1eddbe5 100644
--- a/web/inc/core.php
+++ b/web/inc/core.php
@@ -30,7 +30,7 @@ function includeManagement()
{
$redis = new Redis();
try{
- $redis->pconnect(REDIS_SERVER, REDIS_PORT);
+ $redis->connect(REDIS_SERVER, REDIS_PORT);
if (defined('REDIS_PASS') && REDIS_PASS)
$redis->auth(REDIS_PASS);
if (defined('REDIS_PREFIX') && REDIS_PREFIX)
diff --git a/web/index.php b/web/index.php
index 896037b..83a59da 100644
--- a/web/index.php
+++ b/web/index.php
@@ -1,5 +1,5 @@
['type'=>'text','required','unique','autoValMethod'=>'gen_ulid'],
+ 'registered' => ['type'=>'datetime','required','unique','autoValMethod'=>'getDateTime'],
+ 'name' => ['type'=>'text'],
+ 'kennel_name' => ['type'=>'text'],
+ 'breed' => ['type'=>'text'],
+ 'size' => ['type'=>'text'], //in cm
+ 'birthday' => ['type'=>'int'], //unix timestamp
+ 'agility_size' => ['type'=>'int'], //S,M,I,L
+ 'active' => ['type'=>'int','default'=>1]
+ );
+
+}
\ No newline at end of file
diff --git a/web/models/User.model.php b/web/models/User.model.php
index 8437a74..8804efa 100644
--- a/web/models/User.model.php
+++ b/web/models/User.model.php
@@ -12,6 +12,7 @@ class User extends Model {
'last_login' => ['type'=>'datetime','required','unique','autoValMethod'=>'getDateTime'],
'token' => ['type'=>'text','required','unique','autoValMethod'=>'uuid4'],
'timezone' => ['type'=>'int'],
+ 'dogs' => ['type'=> 'array','default'=>[]],
'active' => ['type'=>'int','default'=>0]
);
protected $hidden = ['password','token'];
diff --git a/web/pages/admin/controller.php b/web/pages/admin/controller.php
index 17acbf6..a5c262c 100644
--- a/web/pages/admin/controller.php
+++ b/web/pages/admin/controller.php
@@ -53,6 +53,10 @@ class Admin extends Page {
foreach($_REQUEST as $key => $value)
{
if($key == 'email') continue;
+ if($key=='dogs')
+ {
+ $value = json_decode(html_entity_decode($value),true);
+ }
$u->$key = $value;
}
@@ -61,12 +65,12 @@ class Admin extends Page {
}
catch(Exception $e)
{
- $this->set('message', $e->getMessage());
+ $this->set('errorMessage', $e->getMessage());
$this->set('template', '/templates/partials/error.html');
return;
}
- $this->set('message', 'Speichern erfolgreich');
+ $this->set('successMessage', 'Speichern erfolgreich');
$this->set('template', '/templates/partials/success.html');
}
diff --git a/web/pages/admin/edituser.html b/web/pages/admin/edituser.html
index 7d6492c..0404e31 100644
--- a/web/pages/admin/edituser.html
+++ b/web/pages/admin/edituser.html
@@ -22,7 +22,7 @@
= $key ?>
-
+
diff --git a/web/pages/dog/controller.php b/web/pages/dog/controller.php
deleted file mode 100644
index 64ad35d..0000000
--- a/web/pages/dog/controller.php
+++ /dev/null
@@ -1,16 +0,0 @@
-menu_text = 'Dog';
- $this->menu_image = 'far fa-dog';
- $this->menu_priority = 0;
- }
-
- function index() {
- $this->set('template', 'dog.html');
- }
-
-}
\ No newline at end of file
diff --git a/web/pages/dog/dog.html b/web/pages/dog/dog.html
deleted file mode 100644
index ae0a9cc..0000000
--- a/web/pages/dog/dog.html
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
Hund hinzufügen/bearbeiten
-
-
-
\ No newline at end of file
diff --git a/web/pages/dogs/controller.php b/web/pages/dogs/controller.php
new file mode 100644
index 0000000..e3eedf5
--- /dev/null
+++ b/web/pages/dogs/controller.php
@@ -0,0 +1,147 @@
+menu_text = 'Meine Hunde';
+ $this->menu_image = 'far fa-dog';
+ $this->menu_priority = 0;
+ }
+
+ function setSubmenu()
+ {
+ $this->addSubmenuItem('Hunde anzeigen','/dogs','far fa-list-alt');
+ $this->addSubmenuItem('Hund hinzufügen','/dogs/add','fas fa-plus-circle');
+ }
+
+ function index() {
+ $dogs = $_SESSION['user']->data['dogs'];
+ $doggos = [];
+
+ foreach($dogs as $dogid)
+ {
+ $dog = new Dog();
+ try{
+ $dog->load($dogid);
+ }
+ catch(Exception $e)
+ {
+ continue;
+ }
+ if($dog->data)
+ $doggos[] = array_merge($dog->data,['id'=>$dogid]);
+ }
+
+ //var_dump($doggos);
+
+ if(count($doggos) > 0)
+ {
+ $this->set('doggos',$doggos);
+ $this->set('template', 'list.html');
+ }
+ else
+ {
+ $this->set('template','/templates/partials/info.html');
+ $this->set('infoTitle', 'Keine Hunde gefunden');
+ $this->set('infoMessage', 'Du hast aktuell noch keine Hunde angelegt. Klicke im Menü auf "Hund hinzufügen" um einen Hund anzulegen.');
+ }
+ }
+
+ function add() {
+ $this->set('template', 'edit.html');
+ }
+
+ function edit() {
+ if($_REQUEST['submit'])
+ {
+ $id = $_REQUEST['dog_id'];
+ $name = $_REQUEST['name'];
+ $kennel_name = $_REQUEST['kennel_name'];
+ $dog_breed = $_REQUEST['dog_breed'];
+ $dog_size = $_REQUEST['dog_size'];
+ $dog_birthday = $_REQUEST['dog_birthday'];
+ $agi_height_category = $_REQUEST['agi_height_category'];
+
+ $error = false;
+ if(!$name || !$dog_birthday )
+ $error = 'Bitte zumindest Name und Geburtsdatum angeben';
+ else if(!strtotime($dog_birthday))
+ $error = 'Das Geburstdatum ist ungültig. Bitte die Eingabe prüfen';
+
+ if($error){
+ $this->set('errorMessage', $error);
+ $this->set('template', '/templates/partials/error.html');
+ return;
+ }
+ else
+ {
+ $dog = new Dog();
+ if($id)
+ $dog->load($id);
+
+ $dog->name = $name;
+ $dog->kennel_name = $kennel_name;
+ $dog->breed = $dog_breed;
+ $dog->size = $dog_size;
+ $dog->birthday = $dog_birthday;
+ $dog->agility_size = $agi_height_category;
+
+ try
+ {
+ $dogid = $dog->save();
+ }
+ catch(Exception $e)
+ {
+ $this->set('template', '/templates/partials/error.html');
+ $this->set('errorTitle', 'Error');
+ $this->set('errorMessage', $e->getMessage());
+ return;
+ }
+
+ //var_dump($_SESSION['user']->data['dogs']);
+
+ if(!is_array($_SESSION['user']->data['dogs']) || !in_array($dogid, $_SESSION['user']->data['dogs'])) // new dog!
+ {
+ $_SESSION['user']->data['dogs'][] = $dogid;
+ try
+ {
+ $_SESSION['user']->save();
+ }
+ catch(Exception $e)
+ {
+ $this->set('template', '/templates/partials/error.html');
+ $this->set('errorTitle', 'Error');
+ $this->set('errorMessage', $e->getMessage());
+ return;
+ }
+ $this->redirect('/dogs');
+ }
+ else
+ {
+ $this->set('template', '/templates/partials/success.html');
+ $this->set('successMessage', "Daten erfolgreich gespeichert");
+ return;
+ }
+
+ }
+ }
+ else
+ {
+ //checken ob der den hund eh bearbeiten darf
+ $id = $this->params[0];
+ $dog = new Dog();
+ $dog->load($id);
+ $this->set('dogdata',$dog->data);
+ $this->set('dogid',$dog->id);
+ $this->set('template', 'edit.html');
+ }
+ }
+
+ function maySeeThisPage() {
+ if($_SESSION['user']) //wenn eingeloggt, kein problem
+ return true;
+ else return false;
+ }
+
+}
\ No newline at end of file
diff --git a/web/pages/dogs/edit.html b/web/pages/dogs/edit.html
new file mode 100644
index 0000000..1f65722
--- /dev/null
+++ b/web/pages/dogs/edit.html
@@ -0,0 +1,38 @@
+
+
Hund hinzufügen/bearbeiten
+
+
+
+
\ No newline at end of file
diff --git a/web/pages/dogs/list.html b/web/pages/dogs/list.html
new file mode 100644
index 0000000..96bfe65
--- /dev/null
+++ b/web/pages/dogs/list.html
@@ -0,0 +1,48 @@
+Meine Hunde
+
+
+
+
+
+
+
+
+
+
+ = $key ?>
+
+
+
+
+ Bearbeiten
+
+
+ Löschen
+
+
+
+
+
+
+
+
+
+ = $dog[$key] ?>
+
+
+
+
+ Bearbeiten
+
+
+ Löschen
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/pages/home/home.html b/web/pages/home/home.html
index fa173ee..83de1e4 100644
--- a/web/pages/home/home.html
+++ b/web/pages/home/home.html
@@ -43,7 +43,7 @@
- = $user[$key] ?>
+ = is_array($user[$key])?json_encode($user[$key]):$user[$key] ?>
diff --git a/web/pages/register/controller.php b/web/pages/register/controller.php
index 8168262..f7d71a9 100644
--- a/web/pages/register/controller.php
+++ b/web/pages/register/controller.php
@@ -15,7 +15,6 @@ class Register extends Page {
$hash = password_hash($password, PASSWORD_DEFAULT);
-
$u = new User();
$err = false;
@@ -35,8 +34,8 @@ class Register extends Page {
if($err)
{
$this->set('template', '/templates/partials/error.html');
- $this->set('title', 'Error');
- $this->set('message', $err);
+ $this->set('errorTitle', 'Error');
+ $this->set('errorMessage', $err);
return;
}
else
@@ -52,22 +51,22 @@ class Register extends Page {
catch(Exception $e)
{
$this->set('template', '/templates/partials/error.html');
- $this->set('title', 'Error');
- $this->set('message', $e->getMessage());
+ $this->set('errorTitle', 'Error');
+ $this->set('errorMessage', $e->getMessage());
return;
}
//$this->redirect('/register/success');
return;
}
- return print_r(['email'=>$email,'password'=>$password,'password2'=>$password2], true);
+ //return print_r(['email'=>$email,'password'=>$password,'password2'=>$password2], true);
}
function success()
{
$this->set('template', '/templates/partials/success.html');
- $this->set('title', 'Success');
- $this->set('message', 'You have successfully registered. Activate your account from the Link in your email');
+ $this->set('successTitle', 'Success');
+ $this->set('successMessage', 'You have successfully registered. Activate your account from the Link in your email');
}
function test()
diff --git a/web/pages/register/register.html b/web/pages/register/register.html
index 1030448..200a2c4 100644
--- a/web/pages/register/register.html
+++ b/web/pages/register/register.html
@@ -4,9 +4,7 @@
Register
-
- = $hello ?>
-
+