'', ]; $contentRoot = dirname(__DIR__) . '/content'; $method = $request->getMethod(); $path = $request->getPathInfo(); try { // GET if ($method == 'GET') { if (str_ends_with($path, '/fields')) { $formPath = $contentRoot . str_replace('/fields', '', $path); $content['data'] = $this->buildFields($formPath); } else { $content['data'] = Toml::parseFile($contentRoot . $path . '.toml'); } } // POST else if ($method == 'POST') { if (str_ends_with($path, '/submit')) { $formPath = $contentRoot . str_replace('/submit', '', $path); $fields = $this->buildFields($formPath); $fields = $this->validateFields($fields); // remove surplus fields from response $fields = array_map(function ($field) { return array_intersect_key($field, array_flip([ 'is_valid', ])); }, $fields); $content['data'] = $fields; $hasInvalidFields = in_array(false, array_column($fields, 'is_valid')); if ($hasInvalidFields) { $content['error'] = 'Invalid fields'; } else { $date = new \Datetime(); $entry = [ 'fields' => $_POST, 'date' => $date->format('c'), ]; $builder = new TomlBuilder(); $builder->addValue('date', $entry['date']); $builder->addTable('fields'); foreach ($entry['fields'] as $entryKey => $entryValue) { $builder->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, $builder->getTomlString() ); } } } } catch (\Exception $exception) { $content['error'] = $exception->getMessage(); } $response->headers->set('Content-Type', 'application/json'); $response->setContent(json_encode($content)); $response->send(); } /** * @param string $formPath */ public function buildFields($formPath) { $fields = Toml::parseFile($formPath . '/fields/_fields.toml')['field'] ?? []; foreach ($fields as $key => $field) { if (empty($field['name'])) { $field['name'] = $key; } if (! empty($field['file'])) { $field = array_merge($field, Toml::parseFile($formPath . '/fields/' . $field['file'])); } $fields[$key] = $field; } return $fields; } /** * @param array $fields */ public function validateFields($fields) { foreach ($fields as $key => &$field) { $field['is_valid'] = true; if (($field['required'] ?? false) && empty($_POST[$field['name']])) { $field['is_valid'] = false; } } return $fields; } }