summaryrefslogtreecommitdiff
path: root/src/Controllers
diff options
context:
space:
mode:
authorDaniel Weipert <code@drogueronin.de>2022-03-06 00:48:14 +0100
committerDaniel Weipert <code@drogueronin.de>2022-03-06 00:48:14 +0100
commitb2a86c7df7d5a473e80034832a01b21444fa50e6 (patch)
tree2b18e08124ff3e8602a20ba27fef3ae4d066cc28 /src/Controllers
parentdf428380e288db75b41ace5d6274f44916517f9f (diff)
Refactor
Diffstat (limited to 'src/Controllers')
-rw-r--r--src/Controllers/EntriesController.php84
-rw-r--r--src/Controllers/FieldsController.php25
-rw-r--r--src/Controllers/SubmissionController.php49
-rw-r--r--src/Controllers/ValidationController.php26
4 files changed, 184 insertions, 0 deletions
diff --git a/src/Controllers/EntriesController.php b/src/Controllers/EntriesController.php
new file mode 100644
index 0000000..13aa8e0
--- /dev/null
+++ b/src/Controllers/EntriesController.php
@@ -0,0 +1,84 @@
+<?php
+
+namespace FlatFileForms\Controllers;
+
+use Yosymfony\Toml\Toml;
+
+class EntriesController
+{
+ public function getEntries()
+ {
+ /**@var Utilities $utilities*/
+ global $utilities;
+
+ $entries = [];
+
+ $dateFrom = new \DateTime($_GET['dateFrom']);
+ $dateTo = new \DateTime($_GET['dateTo'] ?? 'now');
+
+ $dateRangeYears = range($dateFrom->format('Y'), $dateTo->format('Y'));
+ $dateRangeYearsCount = count($dateRangeYears);
+ foreach ($dateRangeYears as $dateRangeYearIdx => $dateRangeYear) {
+ $yearPath = "$formPath/entries/$dateRangeYear";
+ if (! is_dir($yearPath)) {
+ continue;
+ }
+
+ if ($dateRangeYearsCount === 1) {
+ $dateRangeMonths = range($dateFrom->format('m'), $dateTo->format('m'));
+ }
+ else if ($dateRangeYearIdx === 0) {
+ $dateRangeMonths = range($dateFrom->format('m'), 12);
+ }
+ else if ($dateRangeYearIdx === $dateRangeYearsCount - 1) {
+ $dateRangeMonths = range(1, $dateTo->format('m'));
+ }
+ else {
+ $dateRangeMonths = range(1, 12);
+ }
+
+ $dateRangeMonthsCount = count($dateRangeMonths);
+ foreach ($dateRangeMonths as $dateRangeMonthIdx => $dateRangeMonth) {
+ $monthPath = "$yearPath/" . sprintf('%02d', $dateRangeMonth);
+ if (! is_dir($monthPath)) {
+ continue;
+ }
+
+ if ($dateRangeMonthsCount === 1) {
+ $dateRangeDays = range($dateFrom->format('d'), $dateTo->format('d'));
+ }
+ else if ($dateRangeYearIdx === 0 && $dateRangeMonthIdx === 0) {
+ $dateRangeDays = range($dateFrom->format('d'), 31);
+ }
+ else if ($dateRangeYearIdx === $dateRangeYearsCount - 1 && $dateRangeMonthIdx === $dateRangeMonthsCount - 1) {
+ $dateRangeDays = range(1, $dateTo->format('d'));
+ }
+ else {
+ $dateRangeDays = range(1, 31);
+ }
+
+ foreach ($dateRangeDays as $dateRangeDay) {
+ $dayPath = "$monthPath/" . sprintf('%02d', $dateRangeDay);
+ if (! is_dir($dayPath)) {
+ continue;
+ }
+
+ $entriesForDay = $utilities->scandir($dayPath);
+ foreach ($entriesForDay as $entryForDay) {
+ $entry = Toml::parseFile("$dayPath/$entryForDay");
+ if (isset($_GET['flat'])) {
+ $entries[] = $entry;
+ } else {
+ $entries[$dateRangeYear][$dateRangeMonth][$dateRangeDay][] = $entry;
+ }
+ }
+ }
+
+ }
+ }
+
+ $content['data'] = $entries;
+
+ return $content;
+ }
+}
diff --git a/src/Controllers/FieldsController.php b/src/Controllers/FieldsController.php
new file mode 100644
index 0000000..c407604
--- /dev/null
+++ b/src/Controllers/FieldsController.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace FlatFileForms\Controllers;
+
+use FlatFileForms\Builder;
+
+class FieldsController
+{
+ public function getFields(Builder $builder): array
+ {
+ /**@var Utilities $utilities*/
+ global $utilities;
+
+ $fields = $builder->buildFields($_GET['page'] ?? null);
+
+ // flatten paged form
+ if ($utilities->isPagedFieldSet($fields) && isset($_GET['flat'])) {
+ $fields = array_merge(...array_values($fields));
+ }
+
+ $content['data'] = $fields;
+
+ return $content;
+ }
+}
diff --git a/src/Controllers/SubmissionController.php b/src/Controllers/SubmissionController.php
new file mode 100644
index 0000000..f2c4c80
--- /dev/null
+++ b/src/Controllers/SubmissionController.php
@@ -0,0 +1,49 @@
+<?php
+
+namespace FlatFileForms\Controllers;
+
+use FlatFileForms\Builder;
+use FlatFileForms\Validator;
+use Yosymfony\Toml\TomlBuilder;
+
+class SubmissionController
+{
+ public function submit(Builder $builder, Validator $validator, $formPath)
+ {
+ $fields = $builder->buildFields();
+
+ // run through validation
+ $result = $validator->validateRequest($fields);
+
+ $content['data'] = $result['fields'];
+
+ // if there were no validation errors then add entry
+ if (empty($result['error'])) {
+ $date = new \Datetime();
+ $entry = [
+ 'fields' => $_POST,
+ 'date' => $date->format('c'),
+ ];
+
+ $entryBuilder = new TomlBuilder();
+ $entryBuilder->addValue('date', $entry['date']);
+ $entryBuilder->addTable('fields');
+ foreach ($entry['fields'] as $entryKey => $entryValue) {
+ $entryBuilder->addValue($entryKey, $entryValue);
+ }
+
+ $entryDirectory = $formPath . '/entries/' . $date->format('Y/m/d');
+ @mkdir($entryDirectory, 0774, true);
+ $entryFilename = $date->format('Ymd_Hi_') . hash('adler32', serialize($entry)) . '.toml';
+ file_put_contents(
+ $entryDirectory . '/' . $entryFilename,
+ $entryBuilder->getTomlString()
+ );
+ }
+ else {
+ $content['error'] = $result['error'];
+ }
+
+ return $content;
+ }
+}
diff --git a/src/Controllers/ValidationController.php b/src/Controllers/ValidationController.php
new file mode 100644
index 0000000..f90359a
--- /dev/null
+++ b/src/Controllers/ValidationController.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace FlatFileForms\Controllers;
+
+use FlatFileForms\Builder;
+use FlatFileForms\Validator;
+
+class ValidationController
+{
+ public function validateRequest(Builder $builder, Validator $validator): array
+ {
+ /**@var Utilities $utilities*/
+ global $utilities;
+
+ $fields = $builder->buildFields($_GET['page'] ?? null);
+
+ $result = $validator->validateRequest($fields);
+
+ $content['data'] = $result['fields'];
+ if (! empty($result['error'])) {
+ $content['error'] = $result['error'];
+ }
+
+ return $content;
+ }
+}