From cf14306c2b3f82a81f8d56669a71633b4d4b5fce Mon Sep 17 00:00:00 2001 From: marvin-borner@live.com Date: Mon, 16 Apr 2018 21:09:05 +0200 Subject: Main merge to user management system - files are now at /main/public/ --- main/app/sprinkles/FormGenerator/src/Form.php | 188 ++++++++++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100755 main/app/sprinkles/FormGenerator/src/Form.php (limited to 'main/app/sprinkles/FormGenerator/src/Form.php') diff --git a/main/app/sprinkles/FormGenerator/src/Form.php b/main/app/sprinkles/FormGenerator/src/Form.php new file mode 100755 index 0000000..e845e3e --- /dev/null +++ b/main/app/sprinkles/FormGenerator/src/Form.php @@ -0,0 +1,188 @@ +setSchema($schema); + $this->setData($data); + } + + /** + * Set the form current values + * + * @param array|object $data The form values + */ + public function setData($data) + { + if ($data instanceof Collection || $data instanceof Model) { + $this->data = $data->toArray(); + } else if (is_array($data) || $data instanceof Repository) { + $this->data = $data; + } else { + throw new \InvalidArgumentException("Data must be an array, a Collection, a Model or a Repository"); + } + } + + /** + * Set the schema for this validator. + * + * @param RequestSchemaInterface $schema A RequestSchemaInterface object, containing the form definition. + */ + public function setSchema(RequestSchemaInterface $schema) + { + $this->schema = $schema; + } + + /** + * Use to define the value of a form input when `setData` is already set + * + * @param mixed $inputName + * @param mixed $value + * @return void + */ + public function setValue($inputName, $value) + { + $this->data[$inputName] = $value; + } + + /** + * Function used to overwrite the input argument from a schema file + * Can also be used to overwrite an argument hardcoded in the Twig file. + * Use `setCustomFormData` to set any other tag. + * + * @param string $inputName The input name where the argument will be added + * @param string $property The argument name. Example "data-color" + * @param string $data The value of the argument + * @return void + */ + public function setInputArgument($inputName, $property, $data) + { + if ($this->schema->has($inputName)) { + // Get the element and force set the property + $element = $this->schema->get($inputName); + $element['form'][$property] = $data; + + // Push back the modifyed element in the schema + $this->schema->set($inputName, $element); + } + } + + /** + * Function used to set options of a select element. Shortcut for using + * `setInputArgument` and `setValue`. + * + * @param string $inputName The select name to add options to + * @param array $data An array of `value => label` options + * @param string $selected The selected key + * @return void + */ + public function setOptions($inputName, $data = [], $selected = null) + { + // Set opdations + $this->setInputArgument($inputName, 'options', $data); + + // Set the value + if (!is_null($selected)) { + $this->setValue($inputName, $selected); + } + } + + /** + * Function to set the form namespace. + * Use the form namespace to wrap the fields name in a top level array. + * Useful when using multiple schemas at once or if the names are using dot syntaxt. + * See : http://stackoverflow.com/a/20365198/445757 + * + * @param string $namespace + * @return void + */ + public function setFormNamespace($namespace) + { + $this->formNamespace = $namespace; + } + + /** + * Generate an array contining all nececerry value to generate a form + * with Twig. + * + * @return array The form fields data + */ + public function generate() + { + $form = collect([]); + + // Loop all the the fields in the schema + foreach ($this->schema->all() as $name => $input) { + + // Skip the one that don't have a `form` definition + if (isset($input['form'])) { + + // Get the value from the data + $value = isset($this->data[$name]) ? $this->data[$name] : null; + + // Add the namespace to the name if it's defined + $name = ($this->formNamespace != "") ? $this->formNamespace."[".$name."]" : $name; + + // Get the element class and make sure it exist + $type = (isset($input['form']['type'])) ? $input['form']['type'] : "text"; + $type = "UserFrosting\\Sprinkle\\FormGenerator\\Element\\" . Str::studly($type); + + // If class doesn't esist, default to Text element + if (!class_exists($type)) { + $type = "UserFrosting\\Sprinkle\\FormGenerator\\Element\\Text"; + } + + // Create a new instance + $element = new $type($name, $input['form'], $value); + + // Push data to `$form` + $form->put($name, $element->parse()); + } + } + + return $form->toArray(); + } +} -- cgit v1.2.3