diff options
Diffstat (limited to 'src/Controllers')
-rw-r--r-- | src/Controllers/EntriesController.php | 84 | ||||
-rw-r--r-- | src/Controllers/FieldsController.php | 25 | ||||
-rw-r--r-- | src/Controllers/SubmissionController.php | 49 | ||||
-rw-r--r-- | src/Controllers/ValidationController.php | 26 |
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; + } +} |