summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/App.php19
-rw-r--r--src/Builder.php35
-rw-r--r--src/Controllers/EntriesController.php4
-rw-r--r--src/Controllers/SubmissionController.php24
-rw-r--r--src/Form.php22
-rw-r--r--src/HookManager.php4
-rw-r--r--src/Validator.php18
7 files changed, 88 insertions, 38 deletions
diff --git a/src/App.php b/src/App.php
index 5fc62fa..ea9aa29 100644
--- a/src/App.php
+++ b/src/App.php
@@ -8,8 +8,7 @@ use FlatFileForms\Controllers\SubmissionController;
use FlatFileForms\Controllers\ValidationController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
-use Yosymfony\Toml\Toml;
-use Yosymfony\Toml\TomlBuilder;
+use Symfony\Component\Yaml\Yaml;
class App
{
@@ -23,8 +22,13 @@ class App
/**@var HookManager $hooks*/
global $hooks;
+ /**@var Form $form*/
+ global $form;
+
$hooks->doAction('init');
+ global $request;
+ global $response;
$request = Request::createFromGlobals();
$response = new Response();
@@ -36,6 +40,7 @@ class App
$method = $request->getMethod();
$path = $request->getPathInfo();
+ $config = [];
try {
$config = $this->buildConfig($contentRoot . $path);
@@ -52,6 +57,7 @@ class App
if ($method == 'GET') {
if (str_ends_with($path, '/fields')) {
$formPath = $contentRoot . str_replace('/fields', '', $path);
+ $form = new Form($formPath);
$builder = new Builder($formPath);
@@ -66,6 +72,7 @@ class App
}
$formPath = $contentRoot . str_replace('/entries', '', $path);
+ $form = new Form($formPath);
$entriesController = new EntriesController();
@@ -73,7 +80,7 @@ class App
}
else {
- $content['data'] = Toml::parseFile($contentRoot . $path . '.toml');
+ $content['data'] = Yaml::parseFile($contentRoot . $path . '.yaml');
}
}
@@ -81,6 +88,7 @@ class App
else if ($method == 'POST') {
if (str_ends_with($path, '/validate')) {
$formPath = $contentRoot . str_replace('/validate', '', $path);
+ $form = new Form($formPath);
$builder = new Builder($formPath);
$validator = new Validator($formPath);
@@ -92,6 +100,7 @@ class App
else if (str_ends_with($path, '/submit')) {
$formPath = $contentRoot . str_replace('/submit', '', $path);
+ $form = new Form($formPath);
$builder = new Builder($formPath);
$validator = new Validator($formPath);
@@ -124,9 +133,9 @@ class App
$config = [];
$currentDirectory = $requestPath;
while (true) {
- $configFile = $currentDirectory . '/config/config.toml';
+ $configFile = $currentDirectory . '/config/config.yaml';
if (file_exists($configFile)) {
- $parsedConfig = Toml::parseFile($configFile);
+ $parsedConfig = Yaml::parseFile($configFile);
$apiKeys = array_merge($parsedConfig['api']['keys'] ?? [], $config['api']['keys'] ?? []);
$config = array_replace_recursive($parsedConfig, $config);
diff --git a/src/Builder.php b/src/Builder.php
index 308fa82..1172fc8 100644
--- a/src/Builder.php
+++ b/src/Builder.php
@@ -2,7 +2,7 @@
namespace FlatFileForms;
-use Yosymfony\Toml\Toml;
+use Symfony\Component\Yaml\Yaml;
class Builder
{
@@ -13,27 +13,33 @@ class Builder
public function buildFields(mixed $page = null)
{
- $parsed = Toml::parseFile($this->formPath . '/fields/_fields.toml');
+ /**@var HookManager $hooks*/
+ global $hooks;
+
+ /**@var Form $form*/
+ global $form;
+
+ $parsed = Yaml::parseFile($this->formPath . '/fields/_fields.yaml');
$fields = [];
// if a page is requested
if ($page) {
- if (! isset($parsed['page'])) {
+ if (! isset($parsed['pages'])) {
throw new \Exception('Form has no pages');
}
- if (! isset($parsed['page'][$page])) {
+ if (! isset($parsed['pages'][$page])) {
throw new \Exception('Form has no page ' . $page);
}
- $fields = $this->buildSinglePageFields($parsed['page'][$page]);
+ $fields = $this->buildSinglePageFields($parsed['pages'][$page]);
}
// else get all fields
else {
// if form is paged
- if (isset($parsed['page'])) {
- $pages = $parsed['page'];
+ if (isset($parsed['pages'])) {
+ $pages = $parsed['pages'];
foreach ($pages as $pageKey => $pageFields) {
$fields[$pageKey] = $this->buildSinglePageFields($pageFields);
}
@@ -41,34 +47,37 @@ class Builder
// if form is not paged
else {
- foreach ($parsed['field'] as $key => $field) {
+ foreach ($parsed as $key => $field) {
$fields[$key] = $this->buildSingleField($key, $field);
}
}
}
+ $fields = $hooks->applyFilter("builder:{$form->name}:fields", $fields);
+ $fields = $hooks->applyFilter('builder:fields', $fields);
+
return $fields;
}
- public function buildSinglePageFields(array $pageFields): array
+ private function buildSinglePageFields(array $pageFields): array
{
$fields = [];
if (! empty($pageFields['file'])) {
- $pageFields = array_replace_recursive($pageFields, Toml::parseFile($this->formPath . '/fields/' . $pageFields['file']));
+ $pageFields = array_replace_recursive($pageFields, Yaml::parseFile($this->formPath . '/fields/' . $pageFields['file']));
}
- foreach ($pageFields['field'] as $key => $field) {
+ foreach ($pageFields['fields'] as $key => $field) {
$fields[$key] = $this->buildSingleField($key, $field);
}
return $fields;
}
- public function buildSingleField(string $key, array $field): array
+ private function buildSingleField(string $key, array $field): array
{
if (! empty($field['file'])) {
- $field = array_replace_recursive($field, Toml::parseFile($this->formPath . '/fields/' . $field['file']));
+ $field = array_replace_recursive($field, Yaml::parseFile($this->formPath . '/fields/' . $field['file']));
}
if (empty($field['name'])) {
diff --git a/src/Controllers/EntriesController.php b/src/Controllers/EntriesController.php
index 801fe7b..f45866a 100644
--- a/src/Controllers/EntriesController.php
+++ b/src/Controllers/EntriesController.php
@@ -2,7 +2,7 @@
namespace FlatFileForms\Controllers;
-use Yosymfony\Toml\Toml;
+use Symfony\Component\Yaml\Yaml;
class EntriesController
{
@@ -65,7 +65,7 @@ class EntriesController
$entriesForDay = $utilities->scandir($dayPath);
foreach ($entriesForDay as $entryForDay) {
- $entry = Toml::parseFile($entryForDay);
+ $entry = Yaml::parseFile($entryForDay);
if (isset($_GET['flat'])) {
$entries[] = $entry;
} else {
diff --git a/src/Controllers/SubmissionController.php b/src/Controllers/SubmissionController.php
index 2c3d603..8d7d9e6 100644
--- a/src/Controllers/SubmissionController.php
+++ b/src/Controllers/SubmissionController.php
@@ -3,13 +3,21 @@
namespace FlatFileForms\Controllers;
use FlatFileForms\Builder;
+use FlatFileForms\Form;
+use FlatFileForms\HookManager;
use FlatFileForms\Validator;
-use Yosymfony\Toml\TomlBuilder;
+use Symfony\Component\Yaml\Yaml;
class SubmissionController
{
public function submit(Builder $builder, Validator $validator, string $formPath): array
{
+ /**@var HookManager $hooks*/
+ global $hooks;
+
+ /**@var Form $form*/
+ global $form;
+
$fields = $builder->buildFields();
// run through validation
@@ -21,23 +29,19 @@ class SubmissionController
if (empty($result['error'])) {
$date = new \Datetime();
$entry = [
- 'fields' => $_POST,
'date' => $date->format('c'),
+ 'fields' => $_POST,
];
- $entryBuilder = new TomlBuilder();
- $entryBuilder->addValue('date', $entry['date']);
- $entryBuilder->addTable('fields');
- foreach ($entry['fields'] as $entryKey => $entryValue) {
- $entryBuilder->addValue($entryKey, $entryValue);
- }
+ $entry = $hooks->applyFilter("submit:{$form->name}:entry", $entry);
+ $entry = $hooks->applyFilter('submit:entry', $entry);
$entryDirectory = $formPath . '/entries/' . $date->format('Y/m/d');
@mkdir($entryDirectory, 0774, true);
- $entryFilename = $date->format('Ymd_Hi_') . hash('adler32', serialize($entry)) . '.toml';
+ $entryFilename = $date->format('Ymd_Hi_') . hash('adler32', serialize($entry)) . '.yaml';
file_put_contents(
$entryDirectory . '/' . $entryFilename,
- $entryBuilder->getTomlString()
+ Yaml::dump($entry, 4)
);
}
else {
diff --git a/src/Form.php b/src/Form.php
new file mode 100644
index 0000000..62527aa
--- /dev/null
+++ b/src/Form.php
@@ -0,0 +1,22 @@
+<?php
+
+namespace FlatFileForms;
+
+class Form
+{
+ public string $name;
+
+ public function __construct(
+ public string $path,
+ )
+ {
+ $this->name = basename($path);
+ }
+
+ public function getFields(mixed $page = null)
+ {
+ $builder = new Builder($this->path);
+
+ return $builder->buildFields($page);
+ }
+}
diff --git a/src/HookManager.php b/src/HookManager.php
index 0f252c8..215ff58 100644
--- a/src/HookManager.php
+++ b/src/HookManager.php
@@ -19,7 +19,7 @@ class HookManager
public function doAction(string $name, mixed ...$arguments): void
{
- foreach ($this->actions[$name] as $actions) {
+ foreach ($this->actions[$name] ?? [] as $actions) {
foreach ($actions as $action) {
call_user_func_array($action['function'], $arguments);
}
@@ -31,7 +31,7 @@ class HookManager
// set $value as first argument
array_unshift($arguments, $value);
- foreach ($this->filters[$name] as $filters) {
+ foreach ($this->filters[$name] ?? [] as $filters) {
foreach ($filters as $filter) {
$value = call_user_func_array($filter['function'], $arguments);
}
diff --git a/src/Validator.php b/src/Validator.php
index 33cdf34..03d09b8 100644
--- a/src/Validator.php
+++ b/src/Validator.php
@@ -51,7 +51,7 @@ class Validator
return $result;
}
- public function validateFields(array $fields): array
+ private function validateFields(array $fields): array
{
/**@var Utilities $utilities*/
global $utilities;
@@ -71,8 +71,14 @@ class Validator
return $fields;
}
- public function validateSingleField(array $field): array
+ private function validateSingleField(array $field): array
{
+ /**@var HookManager $hooks*/
+ global $hooks;
+
+ /**@var Form $form*/
+ global $form;
+
$value = $_POST[$field['name']] ?? '';
$field['is_valid'] = true;
@@ -84,10 +90,10 @@ class Validator
$field['is_valid'] = false;
}
- $validationFunctionName = 'validate_' . basename($this->formPath) . '_' . $field['name'];
- if (function_exists($validationFunctionName)) {
- $field = call_user_func($validationFunctionName, $field, $value);
- }
+ $field = $hooks->applyFilter("validator:{$form->name}:field", $field, $value);
+ $field = $hooks->applyFilter("validator:{$form->name}:field:{$field['name']}", $field, $value);
+ $field = $hooks->applyFilter("validator:field:{$field['name']}", $field, $value);
+ $field = $hooks->applyFilter('validator:field', $field, $value);
return $field;
}