[TASK] Add 'form' attribute to ModuleTemplate buttons 04/44404/2
authorAndreas Fernandez <a.fernandez@scripting-base.de>
Fri, 30 Oct 2015 14:01:06 +0000 (15:01 +0100)
committerChristian Kuhn <lolli@schwarzbu.ch>
Sat, 31 Oct 2015 14:22:36 +0000 (15:22 +0100)
This patch adds support for "form" attributes to the buttons used by the
ModuleTemplate API as buttons aren't enforced to be in <form> tags anymore
in HTML5.

Resolves: #71171
Releases: master
Change-Id: I25f32758c28cd8af0aa9a8c0b831f55953ef2811
Reviewed-on: https://review.typo3.org/44404
Reviewed-by: Mathias Schreiber <mathias.schreiber@wmdb.de>
Tested-by: Mathias Schreiber <mathias.schreiber@wmdb.de>
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
typo3/sysext/backend/Classes/Template/Components/Buttons/InputButton.php
typo3/sysext/backend/Classes/Template/Components/Buttons/SplitButton.php
typo3/sysext/backend/Resources/Public/JavaScript/SplitButtons.js
typo3/sysext/extensionmanager/Classes/Controller/ConfigurationController.php
typo3/sysext/extensionmanager/Resources/Public/JavaScript/Main.js

index 063e139..14fecb4 100644 (file)
@@ -50,6 +50,13 @@ class InputButton extends AbstractButton implements ButtonInterface
     protected $value = '';
 
     /**
+     * ID of the referenced <form> tag
+     *
+     * @var string
+     */
+    protected $form = '';
+
+    /**
      * Get name
      *
      * @return string
@@ -96,6 +103,25 @@ class InputButton extends AbstractButton implements ButtonInterface
     }
 
     /**
+     * @return string
+     */
+    public function getForm()
+    {
+        return $this->form;
+    }
+
+    /**
+     * @param string $form
+     *
+     * @return InputButton
+     */
+    public function setForm($form)
+    {
+        $this->form = $form;
+        return $this;
+    }
+
+    /**
      * Validates the current button
      *
      * @return bool
@@ -125,7 +151,8 @@ class InputButton extends AbstractButton implements ButtonInterface
             'name' => $this->getName(),
             'class' => 'btn btn-default btn-sm ' . $this->getClasses(),
             'value' => $this->getValue(),
-            'title' => $this->getTitle()
+            'title' => $this->getTitle(),
+            'form' => trim($this->getForm())
         );
         $labelText = '';
         if ($this->showLabelText) {
@@ -136,7 +163,9 @@ class InputButton extends AbstractButton implements ButtonInterface
         }
         $attributesString = '';
         foreach ($attributes as $key => $value) {
-            $attributesString .= ' ' . htmlspecialchars($key) . '="' . htmlspecialchars($value) . '"';
+            if ($value !== '') {
+                $attributesString .= ' ' . htmlspecialchars($key) . '="' . htmlspecialchars($value) . '"';
+            }
         }
         return '<button' . $attributesString . '>'
             . $this->getIcon()->render() . htmlspecialchars($labelText)
index da46375..a425bb8 100644 (file)
@@ -145,6 +145,9 @@ class SplitButton extends AbstractButton implements ButtonInterface
         if (!empty($items['primary']->getOnClick())) {
             $attributes['onclick'] = $items['primary']->getOnClick();
         }
+        if (!empty($items['primary']->getForm())) {
+            $attributes['form'] = $items['primary']->getForm();
+        }
         $attributesString = '';
         foreach ($attributes as $key => $value) {
             $attributesString .= ' ' . htmlspecialchars($key) . '="' . htmlspecialchars($value) . '"';
@@ -166,7 +169,8 @@ class SplitButton extends AbstractButton implements ButtonInterface
             $optionAttributes = [
                 'href' => '#',
                 'data-name' => $option->getName(),
-                'data-value' => $option->getValue()
+                'data-value' => $option->getValue(),
+                'data-form' => $option->getForm()
             ];
             if (!empty($option->getClasses())) {
                 $optionAttributes['class'] = htmlspecialchars($option->getClasses());
index 3d7963a..adceccc 100644 (file)
@@ -39,7 +39,8 @@ define(['jquery', 'TYPO3/CMS/Backend/Icons'], function($, Icons) {
                ].join(',');
                $(document).on('click', elements, function(e) {
                        var $me = $(this),
-                               $form = $me.closest('form'),
+                               linkedForm = $me.attr('form') || $me.attr('data-form') || null,
+                               $form = linkedForm ? $('#' + linkedForm) : $me.closest('form'),
                                name = $me.data('name') || this.name,
                                value = $me.data('value') || this.value,
                                $elem = $('<input />').attr('type', 'hidden').attr('name', name).attr('value', value);
index f19ac86..b142d00 100644 (file)
@@ -197,7 +197,7 @@ class ConfigurationController extends AbstractModuleController
             ->setName('_savedok')
             ->setValue('1')
             ->setTitle($lang->sL('LLL:EXT:lang/locallang_core.xlf:rm.saveDoc', true))
-            ->setOnClick('javascript:document.configurationform.submit();return false;')
+            ->setForm('configurationform')
             ->setIcon($moduleTemplate->getIconFactory()->getIcon('actions-document-save', Icon::SIZE_SMALL));
         $saveSplitButton->addItem($saveButton, true);
 
@@ -207,6 +207,7 @@ class ConfigurationController extends AbstractModuleController
             ->setClasses('t3js-save-close')
             ->setValue('1')
             ->setTitle($lang->sL('LLL:EXT:lang/locallang_core.xlf:rm.saveCloseDoc', true))
+            ->setForm('configurationform')
             ->setIcon($moduleTemplate->getIconFactory()->getIcon(
                 'actions-document-save-close',
                 Icon::SIZE_SMALL
index 8a14dfb..3e2d480 100644 (file)
@@ -766,7 +766,7 @@ define(['jquery', 'nprogress', 'TYPO3/CMS/Backend/Modal', 'datatables', 'TYPO3/C
                var $validate = $('.validate');
                $validate.validate();
                $(document).on('click', '.t3js-save-close', function() {
-                       $validate.append($('<input />', {type: 'hidden', name: 'tx_extensionmanager_tools_extensionmanagerextensionmanager[action]', value: 'saveAndClose'})).submit();
+                       $validate.append($('<input />', {type: 'hidden', name: 'tx_extensionmanager_tools_extensionmanagerextensionmanager[action]', value: 'saveAndClose'}));
                });
 
                // initialize the repository