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 .= '
';
+ 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',