From b309068482be781fdfe79c4d32de85fd0d49381f Mon Sep 17 00:00:00 2001 From: Awilum Date: Fri, 23 Aug 2019 16:26:43 +0300 Subject: [PATCH 01/24] feat(core): add Forms class #218 #186 --- flextype/core/Forms.php | 162 ++++++++++++++++++++++++++++++++++++++ flextype/dependencies.php | 7 ++ 2 files changed, 169 insertions(+) create mode 100644 flextype/core/Forms.php diff --git a/flextype/core/Forms.php b/flextype/core/Forms.php new file mode 100644 index 00000000..7bda0bad --- /dev/null +++ b/flextype/core/Forms.php @@ -0,0 +1,162 @@ +flextype = $flextype; + } + + /** + * Fetch Fieldset form + * + * @access public + * @param array $fieldset Fieldset + * @param string $values Fieldset values + * @return string Returns form based on fieldsets + */ + public function fetch(array $fieldset, array $values = [], Request $request) : string + { + $form = ''; + $form .= Form::open(null, ['id' => 'form']); + $form .= '' . + $form .= ''; + $form .= Form::hidden('action', 'save-form'); + if (count($fieldset['sections']) > 0) { + $form .= ''; + $form .= '
'; + foreach ($fieldset['sections'] as $key => $section) { + $form .= '
'; + $form .= '
'; + foreach ($section['fields'] as $element => $property) { + // Create attributes + $property['attributes'] = Arr::keyExists($property, 'attributes') ? $property['attributes'] : []; + // Create attribute class + $property['attributes']['class'] = Arr::keyExists($property, 'attributes.class') ? 'form-control ' . $property['attributes']['class'] : 'form-control'; + // Create attribute size + $property['size'] = Arr::keyExists($property, 'size') ? $property['size'] : 'col-12'; + // Create attribute value + $property['value'] = Arr::keyExists($property, 'value') ? $property['value'] : ''; + $pos = strpos($element, '.'); + if ($pos === false) { + $form_element_name = $element; + } else { + $form_element_name = str_replace(".", "][", "$element") . ']'; + } + $pos = strpos($form_element_name, ']'); + if ($pos !== false) { + $form_element_name = substr_replace($form_element_name, '', $pos, strlen(']')); + } + // Form value + $form_value = Arr::keyExists($values, $element) ? Arr::get($values, $element) : $property['value']; + // Form label + $form_label = Form::label($element, __($property['title'])); + // Form elements + switch ($property['type']) { + // Simple text-input, for multi-line fields. + case 'textarea': + $form_element = Form::textarea($element, $form_value, $property['attributes']); + break; + // The hidden field is like the text field, except it's hidden from the content editor. + case 'hidden': + $form_element = Form::hidden($element, $form_value); + break; + // A WYSIWYG HTML field. + case 'html': + $property['attributes']['class'] .= ' js-html-editor'; + $form_element = Form::textarea($element, $form_value, $property['attributes']); + break; + // Selectbox field + case 'select': + $form_element = Form::select($form_element_name, $property['options'], $form_value, $property['attributes']); + break; + // Template select field for selecting entry template + case 'template_select': + if ($this->flextype['registry']->has('settings.theme')) { + + $_templates_list = $this->flextype['themes']->getTemplates($this->flextype['registry']->get('settings.theme')); + + $templates_list = []; + + if (count($_templates_list) > 0) { + foreach ($_templates_list as $template) { + if ($template['type'] == 'file' && $template['extension'] == 'html') { + $templates_list[$template['basename']] = $template['basename']; + } + } + } + + $form_element = Form::select($form_element_name, $templates_list, $form_value, $property['attributes']); + } + break; + // Visibility select field for selecting entry visibility state + case 'visibility_select': + $form_element = Form::select($form_element_name, ['draft' => __('admin_entries_draft'), 'visible' => __('admin_entries_visible'), 'hidden' => __('admin_entries_hidden')], (!empty($form_value) ? $form_value : 'visible'), $property['attributes']); + break; + // Media select field + case 'media_select': + //$form_element = Form::select($form_element_name, $this->getMediaList($request->getQueryParams()['id'], false), $form_value, $property['attributes']); + break; + // Simple text-input, for single-line fields. + default: + $form_element = Form::input($form_element_name, $form_value, $property['attributes']); + break; + } + // Render form elments with labels + if ($property['type'] == 'hidden') { + $form .= $form_element; + } else { + $form .= '
'; + $form .= $form_label . $form_element; + $form .= '
'; + } + } + $form .= '
'; + $form .= '
'; + } + $form .= '
'; + } + $form .= Form::close(); + return $form; + } +} diff --git a/flextype/dependencies.php b/flextype/dependencies.php index fae41098..2e5da2d2 100644 --- a/flextype/dependencies.php +++ b/flextype/dependencies.php @@ -174,6 +174,13 @@ $flextype['fieldsets'] = static function ($container) use ($flextype) { return new Fieldsets($flextype); }; +/** + * Add forms service to Flextype container + */ +$flextype['forms'] = static function ($container) use ($flextype) { + return new Forms($flextype); +}; + /** * Add snippets service to Flextype container */ From 0783b3a402a7b4a6038b980ca5f9b3108ba4bc21 Mon Sep 17 00:00:00 2001 From: Awilum Date: Fri, 23 Aug 2019 16:28:06 +0300 Subject: [PATCH 02/24] feat(admin-plugin): remove fetchForm method #218 #186 use: $this->forms->fetch method --- .../app/Controllers/EntriesController.php | 121 +----------------- 1 file changed, 1 insertion(+), 120 deletions(-) diff --git a/site/plugins/admin/app/Controllers/EntriesController.php b/site/plugins/admin/app/Controllers/EntriesController.php index 422d9cad..e5d2c29f 100644 --- a/site/plugins/admin/app/Controllers/EntriesController.php +++ b/site/plugins/admin/app/Controllers/EntriesController.php @@ -567,125 +567,6 @@ class EntriesController extends Controller return $response->withRedirect($this->router->pathFor('admin.entries.index') . '?id=' . implode('/', array_slice(explode("/", $id), 0, -1))); } - /** - * Fetch Fieldset form - * - * @access public - * @param array $fieldset Fieldset - * @param string $values Fieldset values - * @return string Returns form based on fieldsets - */ - public function fetchForm(array $fieldset, array $values = [], Request $request) : string - { - $form = ''; - $form .= Form::open(null, ['id' => 'form']); - $form .= '' . - $form .= ''; - $form .= Form::hidden('action', 'save-form'); - if (count($fieldset['sections']) > 0) { - $form .= ''; - $form .= '
'; - foreach ($fieldset['sections'] as $key => $section) { - $form .= '
'; - $form .= '
'; - foreach ($section['fields'] as $element => $property) { - // Create attributes - $property['attributes'] = Arr::keyExists($property, 'attributes') ? $property['attributes'] : []; - // Create attribute class - $property['attributes']['class'] = Arr::keyExists($property, 'attributes.class') ? 'form-control ' . $property['attributes']['class'] : 'form-control'; - // Create attribute size - $property['size'] = Arr::keyExists($property, 'size') ? $property['size'] : 'col-12'; - // Create attribute value - $property['value'] = Arr::keyExists($property, 'value') ? $property['value'] : ''; - $pos = strpos($element, '.'); - if ($pos === false) { - $form_element_name = $element; - } else { - $form_element_name = str_replace(".", "][", "$element") . ']'; - } - $pos = strpos($form_element_name, ']'); - if ($pos !== false) { - $form_element_name = substr_replace($form_element_name, '', $pos, strlen(']')); - } - // Form value - $form_value = Arr::keyExists($values, $element) ? Arr::get($values, $element) : $property['value']; - // Form label - $form_label = Form::label($element, __($property['title'])); - // Form elements - switch ($property['type']) { - // Simple text-input, for multi-line fields. - case 'textarea': - $form_element = Form::textarea($element, $form_value, $property['attributes']); - break; - // The hidden field is like the text field, except it's hidden from the content editor. - case 'hidden': - $form_element = Form::hidden($element, $form_value); - break; - // A WYSIWYG HTML field. - case 'html': - $property['attributes']['class'] .= ' js-html-editor'; - $form_element = Form::textarea($element, $form_value, $property['attributes']); - break; - // Selectbox field - case 'select': - $form_element = Form::select($form_element_name, $property['options'], $form_value, $property['attributes']); - break; - // Template select field for selecting entry template - case 'template_select': - if ($this->registry->has('settings.theme')) { - - $_templates_list = $this->themes->getTemplates($this->registry->get('settings.theme')); - - $templates_list = []; - - if (count($_templates_list) > 0) { - foreach ($_templates_list as $template) { - if ($template['type'] == 'file' && $template['extension'] == 'html') { - $templates_list[$template['basename']] = $template['basename']; - } - } - } - - $form_element = Form::select($form_element_name, $templates_list, $form_value, $property['attributes']); - } - break; - // Visibility select field for selecting entry visibility state - case 'visibility_select': - $form_element = Form::select($form_element_name, ['draft' => __('admin_entries_draft'), 'visible' => __('admin_entries_visible'), 'hidden' => __('admin_entries_hidden')], (!empty($form_value) ? $form_value : 'visible'), $property['attributes']); - break; - // Media select field - case 'media_select': - $form_element = Form::select($form_element_name, $this->getMediaList($request->getQueryParams()['id'], false), $form_value, $property['attributes']); - break; - // Simple text-input, for single-line fields. - default: - $form_element = Form::input($form_element_name, $form_value, $property['attributes']); - break; - } - // Render form elments with labels - if ($property['type'] == 'hidden') { - $form .= $form_element; - } else { - $form .= '
'; - $form .= $form_label . $form_element; - $form .= '
'; - } - } - $form .= '
'; - $form .= '
'; - } - $form .= '
'; - } - $form .= Form::close(); - return $form; - } - /** * Edit entry * @@ -816,7 +697,7 @@ class EntriesController extends Controller 'parts' => $parts, 'i' => count($parts), 'last' => Arr::last($parts), - 'form' => $this->fetchForm($fieldsets, $entry, $request), + 'form' => $this->forms->fetch($fieldsets, $entry, $request), 'menu_item' => 'entries', 'links' => [ 'entries' => [ From 71ebc5388d0b7af387c7964ac4203ed0ec41656a Mon Sep 17 00:00:00 2001 From: Awilum Date: Fri, 23 Aug 2019 16:30:44 +0300 Subject: [PATCH 03/24] feat(core): refactor Forms class #218 #186 --- flextype/core/Forms.php | 65 ++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 33 deletions(-) diff --git a/flextype/core/Forms.php b/flextype/core/Forms.php index 7bda0bad..2298b425 100644 --- a/flextype/core/Forms.php +++ b/flextype/core/Forms.php @@ -9,20 +9,15 @@ declare(strict_types=1); namespace Flextype; - -use Flextype\Component\Filesystem\Filesystem; -use Flextype\Component\Date\Date; -use Flextype\Component\Form\Form; use Flextype\Component\Arr\Arr; -use Flextype\Component\Text\Text; -use Flextype\Component\Registry\Registry; -use function Flextype\Component\I18n\__; -use Respect\Validation\Validator as v; -use Intervention\Image\ImageManagerStatic as Image; -use Psr\Http\Message\ResponseInterface as Response; +use Flextype\Component\Form\Form; use Psr\Http\Message\ServerRequestInterface as Request; -use Ramsey\Uuid\Uuid; -use Ramsey\Uuid\Exception\UnsatisfiedDependencyException; +use function count; +use function Flextype\Component\I18n\__; +use function str_replace; +use function strlen; +use function strpos; +use function substr_replace; class Forms { @@ -44,29 +39,31 @@ class Forms /** * Fetch Fieldset form * - * @access public * @param array $fieldset Fieldset * @param string $values Fieldset values + * * @return string Returns form based on fieldsets + * + * @access public */ public function fetch(array $fieldset, array $values = [], Request $request) : string { - $form = ''; + $form = ''; $form .= Form::open(null, ['id' => 'form']); $form .= '' . - $form .= ''; + $form .= ''; $form .= Form::hidden('action', 'save-form'); if (count($fieldset['sections']) > 0) { $form .= ''; $form .= '
'; foreach ($fieldset['sections'] as $key => $section) { - $form .= '
'; + $form .= '
'; $form .= '
'; foreach ($section['fields'] as $element => $property) { // Create attributes @@ -77,11 +74,11 @@ class Forms $property['size'] = Arr::keyExists($property, 'size') ? $property['size'] : 'col-12'; // Create attribute value $property['value'] = Arr::keyExists($property, 'value') ? $property['value'] : ''; - $pos = strpos($element, '.'); + $pos = strpos($element, '.'); if ($pos === false) { $form_element_name = $element; } else { - $form_element_name = str_replace(".", "][", "$element") . ']'; + $form_element_name = str_replace('.', '][', "$element") . ']'; } $pos = strpos($form_element_name, ']'); if ($pos !== false) { @@ -96,54 +93,55 @@ class Forms // Simple text-input, for multi-line fields. case 'textarea': $form_element = Form::textarea($element, $form_value, $property['attributes']); - break; + break; // The hidden field is like the text field, except it's hidden from the content editor. case 'hidden': $form_element = Form::hidden($element, $form_value); - break; + break; // A WYSIWYG HTML field. case 'html': $property['attributes']['class'] .= ' js-html-editor'; - $form_element = Form::textarea($element, $form_value, $property['attributes']); - break; + $form_element = Form::textarea($element, $form_value, $property['attributes']); + break; // Selectbox field case 'select': $form_element = Form::select($form_element_name, $property['options'], $form_value, $property['attributes']); - break; + break; // Template select field for selecting entry template case 'template_select': if ($this->flextype['registry']->has('settings.theme')) { - $_templates_list = $this->flextype['themes']->getTemplates($this->flextype['registry']->get('settings.theme')); $templates_list = []; if (count($_templates_list) > 0) { foreach ($_templates_list as $template) { - if ($template['type'] == 'file' && $template['extension'] == 'html') { - $templates_list[$template['basename']] = $template['basename']; + if ($template['type'] !== 'file' || $template['extension'] !== 'html') { + continue; } + + $templates_list[$template['basename']] = $template['basename']; } } $form_element = Form::select($form_element_name, $templates_list, $form_value, $property['attributes']); } - break; + break; // Visibility select field for selecting entry visibility state case 'visibility_select': - $form_element = Form::select($form_element_name, ['draft' => __('admin_entries_draft'), 'visible' => __('admin_entries_visible'), 'hidden' => __('admin_entries_hidden')], (!empty($form_value) ? $form_value : 'visible'), $property['attributes']); - break; + $form_element = Form::select($form_element_name, ['draft' => __('admin_entries_draft'), 'visible' => __('admin_entries_visible'), 'hidden' => __('admin_entries_hidden')], (! empty($form_value) ? $form_value : 'visible'), $property['attributes']); + break; // Media select field case 'media_select': //$form_element = Form::select($form_element_name, $this->getMediaList($request->getQueryParams()['id'], false), $form_value, $property['attributes']); - break; + break; // Simple text-input, for single-line fields. default: $form_element = Form::input($form_element_name, $form_value, $property['attributes']); - break; + break; } // Render form elments with labels - if ($property['type'] == 'hidden') { + if ($property['type'] === 'hidden') { $form .= $form_element; } else { $form .= '
'; @@ -157,6 +155,7 @@ class Forms $form .= '
'; } $form .= Form::close(); + return $form; } } From a23b1c7b3bc8924927c23ef403354e1841521b23 Mon Sep 17 00:00:00 2001 From: Awilum Date: Fri, 23 Aug 2019 18:05:01 +0300 Subject: [PATCH 04/24] feat(core): add new protected methods in Forms class #218 #186 Methods: - csrfHiddenField() - actionHiddenField() --- flextype/core/Forms.php | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/flextype/core/Forms.php b/flextype/core/Forms.php index 2298b425..3302f590 100644 --- a/flextype/core/Forms.php +++ b/flextype/core/Forms.php @@ -11,6 +11,7 @@ namespace Flextype; use Flextype\Component\Arr\Arr; use Flextype\Component\Form\Form; +use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; use function count; use function Flextype\Component\I18n\__; @@ -46,13 +47,12 @@ class Forms * * @access public */ - public function fetch(array $fieldset, array $values = [], Request $request) : string + public function fetch(array $fieldset, array $values = [], Request $request, Response $response) : string { $form = ''; $form .= Form::open(null, ['id' => 'form']); - $form .= '' . - $form .= ''; - $form .= Form::hidden('action', 'save-form'); + $form .= $this->csrfHiddenField(); + $form .= $this->actionHiddenField(); if (count($fieldset['sections']) > 0) { $form .= '