diff --git a/site/plugins/admin/app/Controllers/EntriesController.php b/site/plugins/admin/app/Controllers/EntriesController.php index 9ac40d9a..79e8fe1d 100644 --- a/site/plugins/admin/app/Controllers/EntriesController.php +++ b/site/plugins/admin/app/Controllers/EntriesController.php @@ -4,6 +4,7 @@ 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; @@ -376,16 +377,126 @@ class EntriesController extends Controller return $response->withRedirect($this->container->get('router')->urlFor('admin.entries.index') . '?entry=' . implode('/', array_slice(explode("/", $entry_name), 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 = []) : string + { + // CSRF token name and value + $csrfNameKey = $this->csrf->getTokenNameKey(); + $csrfValueKey = $this->csrf->getTokenValueKey(); + $csrfName = $this->csrf->getTokenName(); + $csrfValue = $this->csrf->getTokenValue(); + + $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': + $form_element = Form::select($form_element_name, $this->themes->getTemplates(), $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, EntriesManager::getMediaList(Http::get('entry'), 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; + } + public function edit($request, $response, $args) { - $entry_name = $request->getQueryParams()['entry']; + $entry_name = $request->getQueryParams()['id']; $entry = $this->entries->fetch($entry_name); // Fieldset for current entry template - $fieldset_path = PATH['themes'] . '/' . $this->registry->get('settings.theme') . '/fieldsets/' . (isset($entry['fieldset']) ? $entry['fieldset'] : 'default') . '.json'; - $fieldset = JsonParser::decode(Filesystem::read($fieldset_path)); - is_null($fieldset) and $fieldset = []; + $fieldsets_path = PATH['themes'] . '/' . $this->registry->get('settings.theme') . '/fieldsets/' . (isset($entry['fieldset']) ? $entry['fieldset'] : 'default') . '.json'; + $fieldsets = JsonParser::decode(Filesystem::read($fieldsets_path)); + is_null($fieldsets) and $fieldsets = []; return $this->view->render( $response, @@ -393,7 +504,8 @@ class EntriesController extends Controller [ 'entry_name' => $entry_name, 'entry_body' => $entry, - 'fieldset' => $fieldset, + 'fieldsets' => $fieldsets, + 'form' => $this->fetchForm($fieldsets, $entry), 'templates' => $this->themes->getTemplates(), 'files' => $this->getMediaList($entry_name), 'menu_item' => 'entries',