Handle global form success message directly in form builder API
authorMatthias Schmidt <gravatronics@live.com>
Sat, 16 Mar 2019 14:58:44 +0000 (15:58 +0100)
committerMatthias Schmidt <gravatronics@live.com>
Sat, 16 Mar 2019 14:58:44 +0000 (15:58 +0100)
This way, there is no need to manually add the relevant code to the template.

See #2509

com.woltlab.wcf/templates/__form.tpl
wcfsetup/install/files/acp/templates/__form.tpl
wcfsetup/install/files/acp/templates/devtoolsProjectAdd.tpl
wcfsetup/install/files/acp/templates/devtoolsProjectPipEntryAdd.tpl
wcfsetup/install/files/acp/templates/languageItemAdd.tpl
wcfsetup/install/files/acp/templates/reactionTypeAdd.tpl
wcfsetup/install/files/lib/form/AbstractFormBuilderForm.class.php
wcfsetup/install/files/lib/system/form/builder/FormDocument.class.php
wcfsetup/install/files/lib/system/form/builder/IFormDocument.class.php

index bacb6c0db45ea7fd15e30cb39edd07b6d9addb4b..4a1fcadb94986954806bbdd00e867b8071ce01cf 100644 (file)
@@ -9,6 +9,10 @@
        <p class="error" role="alert">{@$form->getErrorMessage()}</p>
 {/if}
 
+{if $form->showsSuccessMessage()}
+       <p class="success">{@$form->getSuccessMessage()}</p>
+{/if}
+
 {if $form->isAjax()}
        <section id="{@$form->getId()}"{*
                *}{if !$form->getClasses()|empty} class="{implode from=$form->getClasses() item='class' glue=' '}{$class}{/implode}"{/if}{*
index bacb6c0db45ea7fd15e30cb39edd07b6d9addb4b..4a1fcadb94986954806bbdd00e867b8071ce01cf 100644 (file)
@@ -9,6 +9,10 @@
        <p class="error" role="alert">{@$form->getErrorMessage()}</p>
 {/if}
 
+{if $form->showsSuccessMessage()}
+       <p class="success">{@$form->getSuccessMessage()}</p>
+{/if}
+
 {if $form->isAjax()}
        <section id="{@$form->getId()}"{*
                *}{if !$form->getClasses()|empty} class="{implode from=$form->getClasses() item='class' glue=' '}{$class}{/implode}"{/if}{*
index 8150f51d301395230f6b86012934e1c98ad955ce..5f64c1b6f00e8609abfe8e82a6f149d1ab4111e9 100644 (file)
        <p class="warning">{lang}wcf.acp.devtools.project.edit.warning{/lang}</p>
 {/if}
 
-{if $success|isset}
-       <p class="success">{lang}wcf.global.success.{$action}{/lang}</p>
-{/if}
-
 {@$form->getHtml()}
 
 {include file='footer'}
index b5b59f9ddc2bfbf614e3620400457456b347bd43..b1d48da4fe27cf9193f25a0a7a2c9aba43527137 100644 (file)
        </nav>
 </header>
 
-{if $success|isset}
-       <p class="success">{lang}wcf.global.success.{$action}{/lang}</p>
-{/if}
-
 {@$pipObject->getPip()->getAdditionalTemplateCode()}
 
 {@$form->getHtml()}
index f8e560276167d338e90d2992aad40d28c05fec66..ad39f6e9bf3a65c303bbcae560c47dfdc5c99f90 100644 (file)
        </nav>
 </header>
 
-{if $success|isset}
-       <p class="success">{lang}wcf.global.success.{$action}{/lang}</p>
-{/if}
-
 {@$form->getHtml()}
 
 {include file='footer'}
index 5b13f86a773c0adb3e90e10ac44522c43d65970d..fc7ccf08f9bf0d75ba8e7b2517d44ad7ef1cd0ac 100644 (file)
        </nav>
 </header>
 
-{if $success|isset}
-       <p class="success">{lang}wcf.global.success.{$action}{/lang}</p>
-{/if}
-
 {@$form->getHtml()}
 
 {include file='footer'}
index 179c563a6bd09d9eb5c351a3398f5f377ffc2748..f6a590d9ee25fd4e2f20b58dcb5129532cfdaf66 100644 (file)
@@ -175,6 +175,8 @@ abstract class AbstractFormBuilderForm extends AbstractForm {
                        
                        $this->buildForm();
                }
+               
+               $this->form->showSuccessMessage(true);
        }
        
        /**
index 1c9b724c700e7da93fe89e4236a1acc4bc545953..8ef0fb942e32fb5dbd66dee17673e7dc4519cbbc 100644 (file)
@@ -113,11 +113,24 @@ class FormDocument implements IFormDocument {
        protected $requestData;
        
        /**
-        * TODO
+        * is `true` if global form error message will be shown if there are validation errors and
+        * is `false` otherwise
         * @var boolean
         */
        protected $showErrorMessage = true;
        
+       /**
+        * is `true` if global form success message will be shown and is `false` otherwise
+        * @var boolean
+        */
+       protected $showSuccessMessage = false;
+       
+       /**
+        * global form success message
+        * @var null|string
+        */
+       protected $successMessage;
+       
        /**
         * Cleans up the form document before the form document object is destroyed.
         */
@@ -238,7 +251,7 @@ class FormDocument implements IFormDocument {
        public function errorMessage($languageItem = null, array $variables = []) {
                if ($languageItem === null) {
                        if (!empty($variables)) {
-                               throw new \InvalidArgumentException("Cannot use variables when unsetting error element of form '{$this->getId()}'");
+                               throw new \InvalidArgumentException("Cannot use variables when unsetting error message of form '{$this->getId()}'");
                        }
                        
                        $this->errorMessage = null;
@@ -405,6 +418,22 @@ class FormDocument implements IFormDocument {
                return $this->requestData;
        }
        
+       /**
+        * @inheritDoc
+        */
+       public function getSuccessMessage() {
+               if ($this->successMessage === null) {
+                       $suffix = 'edit';
+                       if ($this->getFormMode() === IFormDocument::FORM_MODE_CREATE) {
+                               $suffix = 'add';
+                       }
+                       
+                       $this->successMessage = WCF::getLanguage()->getDynamicVariable('wcf.global.success.' . $suffix);
+               }
+               
+               return $this->successMessage;
+       }
+       
        /**
         * @inheritDoc
         */
@@ -543,6 +572,15 @@ class FormDocument implements IFormDocument {
         */
        public function showErrorMessage($showErrorMessage = true) {
                $this->showErrorMessage = $showErrorMessage;
+
+               return $this;
+       }
+       
+       /**
+        * @inheritDoc
+        */
+       public function showSuccessMessage($showSuccessMessage = true) {
+               $this->showSuccessMessage = $showSuccessMessage;
                
                return $this;
        }
@@ -554,6 +592,35 @@ class FormDocument implements IFormDocument {
                return $this->showErrorMessage;
        }
        
+       /**
+        * @inheritDoc
+        */
+       public function showsSuccessMessage() {
+               return $this->showSuccessMessage;
+       }
+       
+       /**
+        * @inheritDoc
+        */
+       public function successMessage($languageItem = null, array $variables = []) {
+               if ($languageItem === null) {
+                       if (!empty($variables)) {
+                               throw new \InvalidArgumentException("Cannot use variables when unsetting success message of form '{$this->getId()}'");
+                       }
+                       
+                       $this->successMessage = null;
+               }
+               else {
+                       if (!is_string($languageItem)) {
+                               throw new \InvalidArgumentException("Given success message language item is no string, " . gettype($languageItem) . " given.");
+                       }
+                       
+                       $this->successMessage = WCF::getLanguage()->getDynamicVariable($languageItem, $variables);
+               }
+               
+               return $this;
+       }
+       
        /**
         * @inheritDoc
         */
index 8491729104e1d8d782d3863152ad615db3e3f766..8da4e81567b4601726fc390b77e840dd1b579dbc 100644 (file)
@@ -75,7 +75,7 @@ interface IFormDocument extends IFormParentNode {
         * @throws      \BadMethodCallException         if this document has already been built
         */
        public function build();
-
+       
        /**
         * Sets the error message of this form using the given language item and returns this
         * document. If `null` is passed, the error message is unset.
@@ -85,7 +85,6 @@ interface IFormDocument extends IFormParentNode {
         * 
         * @param       null|string     $languageItem   language item containing the error message or `null` to unset error message
         * @param       array           $variables      additional variables used when resolving the language item
-        *
         * @return      static                          this document
         * 
         * @throws      \InvalidArgumentException       if the given form mode is invalid
@@ -201,6 +200,16 @@ interface IFormDocument extends IFormParentNode {
         */
        public function getRequestData($index = null);
        
+       /**
+        * Returns the success message for the whole form.
+        *
+        * By default, `wcf.global.form.add` or `wcf.global.form.edit` in the active user's language
+        * is returned depending on the current form mode.
+        *
+        * @return      string
+        */
+       public function getSuccessMessage();
+       
        /**
         * Returns `true` if the default button is added to the form during in the `build()` method
         * and `false` otherwise.
@@ -304,6 +313,14 @@ interface IFormDocument extends IFormParentNode {
         */
        public function showErrorMessage($showErrorMessage = true);
        
+       /**
+        * Sets if the global form success message should be shown.
+        * 
+        * @param       boolean         $showSuccessMessage
+        * @return      static                                  this document
+        */
+       public function showSuccessMessage($showSuccessMessage = true);
+       
        /**
         * Returns `true` if the global form error message should be shown if the form has validation
         * errors.
@@ -313,4 +330,28 @@ interface IFormDocument extends IFormParentNode {
         * @return      boolean
         */
        public function showsErrorMessage();
+       
+       /**
+        * Returns `true` if the global form success message should be shown.
+        * 
+        * By default, the global form error message is not shown.
+        * 
+        * @return      boolean
+        */
+       public function showsSuccessMessage();
+       
+       /**
+        * Sets the success message of this form using the given language item and returns this
+        * document. If `null` is passed, the success message is unset.
+        *
+        * Unsetting the current success message causes `IFormDocument::getSuccessMessage()()` to
+        * return the default success message.
+        *
+        * @param       null|string     $languageItem   language item containing the success message or `null` to unset error message
+        * @param       array           $variables      additional variables used when resolving the language item
+        * @return      static                          this document
+        *
+        * @throws      \InvalidArgumentException       if the given form mode is invalid
+        */
+       public function successMessage($languageItem = null, array $variables = []);
 }