Add element ID to form builder exception messages (#4327)
authorMatthias Schmidt <gravatronics@live.com>
Thu, 24 Jun 2021 06:14:15 +0000 (08:14 +0200)
committerGitHub <noreply@github.com>
Thu, 24 Jun 2021 06:14:15 +0000 (08:14 +0200)
49 files changed:
wcfsetup/install/files/lib/system/form/builder/LanguageItemFormNode.class.php
wcfsetup/install/files/lib/system/form/builder/TFormElement.class.php
wcfsetup/install/files/lib/system/form/builder/TFormNode.class.php
wcfsetup/install/files/lib/system/form/builder/TFormParentNode.class.php
wcfsetup/install/files/lib/system/form/builder/TObjectTypeFormNode.class.php
wcfsetup/install/files/lib/system/form/builder/TWysiwygFormNode.class.php
wcfsetup/install/files/lib/system/form/builder/TemplateFormNode.class.php
wcfsetup/install/files/lib/system/form/builder/button/FormButton.class.php
wcfsetup/install/files/lib/system/form/builder/container/FormContainer.class.php
wcfsetup/install/files/lib/system/form/builder/container/RowFormFieldContainer.class.php
wcfsetup/install/files/lib/system/form/builder/container/SuffixFormFieldContainer.class.php
wcfsetup/install/files/lib/system/form/builder/container/wysiwyg/WysiwygFormContainer.class.php
wcfsetup/install/files/lib/system/form/builder/container/wysiwyg/WysiwygPollFormContainer.class.php
wcfsetup/install/files/lib/system/form/builder/exception/InvalidFormFieldValue.class.php [new file with mode: 0644]
wcfsetup/install/files/lib/system/form/builder/field/AbstractFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/AbstractNumericFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/BooleanFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/ButtonFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/ClassNameFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/DateFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/ItemListFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/MultilineTextFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/MultipleSelectionFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/RatingFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/RejectEverythingFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/SingleSelectionFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/SourceCodeFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/TAttributeFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/TAutoCompleteFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/TI18nFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/TInputModeFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/TMaximumFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/TMaximumLengthFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/TMinimumFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/TMinimumLengthFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/TMultipleFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/TPackagesFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/TPlaceholderFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/TSelectionFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/TSuffixedFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/UploadFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/acl/AclFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/label/LabelFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/media/SingleMediaSelectionFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/poll/PollOptionsFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/tag/TagFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/validation/FormFieldValidator.class.php
wcfsetup/install/files/lib/system/form/builder/field/wysiwyg/WysiwygFormField.class.php
wcfsetup/install/files/lib/system/form/builder/wysiwyg/WysiwygSmileyFormNode.class.php

index 1487c40751ba2840e680410cf680c26d80f810da..6b71b27668ccbd467453a9df41759e2f4c8bd93c 100644 (file)
@@ -46,7 +46,7 @@ class LanguageItemFormNode implements IFormChildNode
     public function getLanguageItem(): string
     {
         if ($this->languageItem === null) {
-            throw new \BadMethodCallException("Language item has not been set yet.");
+            throw new \BadMethodCallException("Language item has not been set yet for node '{$this->getId()}'.");
         }
 
         return $this->languageItem;
index 445a309228c7ad9a6e04649f036700ae06a017c3..eb84fbefba84e7b3f14f5a0ef6fa813aafd36837 100644 (file)
@@ -45,7 +45,7 @@ trait TFormElement
         if ($languageItem === null) {
             if (!empty($variables)) {
                 throw new \InvalidArgumentException(
-                    "Cannot use variables when unsetting description of element '{$this->getId()}'"
+                    "Cannot use variables when unsetting description of element '{$this->getId()}'."
                 );
             }
 
@@ -53,7 +53,7 @@ trait TFormElement
         } else {
             if (!\is_string($languageItem)) {
                 throw new \InvalidArgumentException(
-                    "Given description language item is no string, " . \gettype($languageItem) . " given."
+                    "Given description language item is no string, " . \gettype($languageItem) . " given for element '{$this->getId()}'."
                 );
             }
 
@@ -99,7 +99,7 @@ trait TFormElement
         if ($languageItem === null) {
             if (!empty($variables)) {
                 throw new \InvalidArgumentException(
-                    "Cannot use variables when unsetting label of element '{$this->getId()}'"
+                    "Cannot use variables when unsetting label of element '{$this->getId()}'."
                 );
             }
 
@@ -107,7 +107,7 @@ trait TFormElement
         } else {
             if (!\is_string($languageItem)) {
                 throw new \InvalidArgumentException(
-                    "Given label language item is no string, " . \gettype($languageItem) . " given."
+                    "Given label language item is no string, " . \gettype($languageItem) . " given for element '{$this->getId()}'."
                 );
             }
 
index 79279280d279d00bf3e9d00db54fbf668d21ef7b..b83df17b70bf4f207978b310be3f735673ea3335 100644 (file)
@@ -126,7 +126,9 @@ trait TFormNode
         static::validateAttribute($name);
 
         if ($value !== null && !\is_bool($value) && !\is_numeric($value) && !\is_string($value)) {
-            throw new \InvalidArgumentException("Value argument is of invalid type, " . \gettype($value) . ".");
+            throw new \InvalidArgumentException(
+                "Value argument is of invalid type, " . \gettype($value) . " for node '{$this->getId()}'."
+            );
         }
 
         $this->attributes[$name] = $value;
@@ -221,7 +223,7 @@ trait TFormNode
     public function getAttribute($name)
     {
         if (!$this->hasAttribute($name)) {
-            throw new \InvalidArgumentException("Unknown attribute '{$name}' requested.");
+            throw new \InvalidArgumentException("Unknown attribute '{$name}' requested for node '{$this->getId()}'.");
         }
 
         return $this->attributes[$name];
@@ -374,7 +376,7 @@ trait TFormNode
         static::validateId($id);
 
         if ($this->id !== null) {
-            throw new \BadMethodCallException("Id has already been set.");
+            throw new \BadMethodCallException("Id has already been set for node '{$this->getId()}'.");
         }
 
         $this->id = $id;
@@ -420,7 +422,7 @@ trait TFormNode
     public function populate()
     {
         if ($this->isPopulated) {
-            throw new \BadMethodCallException('Node has already been populated');
+            throw new \BadMethodCallException("Node '{$this->getId()}' has already been populated.");
         }
 
         $this->isPopulated = true;
@@ -437,7 +439,9 @@ trait TFormNode
                 /** @var IFormField $field */
                 $field = $this->getDocument()->getNodeById($dependency->getFieldId());
                 if ($field === null) {
-                    throw new \UnexpectedValueException("Unknown field with id '{$dependency->getFieldId()}' for dependency '{$dependency->getId()}'.");
+                    throw new \UnexpectedValueException(
+                        "Unknown field with id '{$dependency->getFieldId()}' for dependency '{$dependency->getId()}' for node '{$this->getId()}'."
+                    );
                 }
 
                 $dependency->field($field);
@@ -508,7 +512,9 @@ trait TFormNode
             }
         }
 
-        throw new \InvalidArgumentException("Unknown dependency with id '{$dependencyId}'.");
+        throw new \InvalidArgumentException(
+            "Unknown dependency with id '{$dependencyId}' for node '{$this->getId()}'."
+        );
     }
 
     /**
index d77272a9ac81ab964693c6791e8838dacc36e780..7ba09bdf1e85c18eb803eb116984dcc4ee47103d 100644 (file)
@@ -259,7 +259,9 @@ trait TFormParentNode
         }
 
         if (!$didInsertNode) {
-            throw new \InvalidArgumentException("Unknown child node with id '{$referenceNodeId}'.");
+            throw new \InvalidArgumentException(
+                "Unknown child node with id '{$referenceNodeId}' for node '{$this->getId()}'."
+            );
         }
 
         return $this;
@@ -289,7 +291,9 @@ trait TFormParentNode
         }
 
         if (!$didInsertNode) {
-            throw new \InvalidArgumentException("Unknown child node with id '{$referenceNodeId}'.");
+            throw new \InvalidArgumentException(
+                "Unknown child node with id '{$referenceNodeId}' for node '{$this->getId()}'."
+            );
         }
 
         return $this;
index a9bd4b1f9a04520b015b9ec19d79c78a2365cdc0..f178408c098708df67eef6aabcabc8c792b09bbd 100644 (file)
@@ -33,7 +33,7 @@ trait TObjectTypeFormNode
     public function getObjectType()
     {
         if ($this->objectType === null) {
-            throw new \BadMethodCallException("Object type has not been set.");
+            throw new \BadMethodCallException("Object type has not been set for field '{$this->getId()}'.");
         }
 
         return $this->objectType;
@@ -52,11 +52,13 @@ trait TObjectTypeFormNode
     public function objectType($objectType)
     {
         if ($this->objectType !== null) {
-            throw new \BadMethodCallException("Object type has already been set.");
+            throw new \BadMethodCallException("Object type has already been set for field '{$this->getId()}'.");
         }
 
         if (ObjectTypeCache::getInstance()->getDefinitionByName($this->getObjectTypeDefinition()) === null) {
-            throw new \UnexpectedValueException("Unknown definition name '{$this->getObjectTypeDefinition()}'.");
+            throw new \UnexpectedValueException(
+                "Unknown definition name '{$this->getObjectTypeDefinition()}' for field '{$this->getId()}'."
+            );
         }
 
         $this->objectType = ObjectTypeCache::getInstance()
index 836ddc97fe6595ee668b4ff5c996918ba8ff3275..e23f0dc3f8e117a0754be3dbf9cc60a676d0a16f 100644 (file)
@@ -40,7 +40,7 @@ trait TWysiwygFormNode
     public function getWysiwygId()
     {
         if ($this->wysiwygId === null) {
-            throw new \BadMethodCallException("The id of the related 'WysiwygFormField' form field is unknown.");
+            throw new \BadMethodCallException("The id of the related 'WysiwygFormField' form field is unknown for node '{$this->getId()}'.");
         }
 
         return $this->wysiwygId;
index eaadf10780a92715f4dd57424328babf9556ce87..f4be0994d7279fda5c1477f98e9dd43c36eade23 100644 (file)
@@ -49,7 +49,9 @@ class TemplateFormNode implements IFormChildNode
     public function application($application)
     {
         if (ApplicationHandler::getInstance()->getApplication($application) === null) {
-            throw new \InvalidArgumentException("Unknown application with abbreviation '{$application}'.");
+            throw new \InvalidArgumentException(
+                "Unknown application with abbreviation '{$application}' for node '{$this->getId()}'."
+            );
         }
 
         $this->application = $application;
@@ -96,7 +98,9 @@ class TemplateFormNode implements IFormChildNode
     public function getTemplateName()
     {
         if ($this->templateName === null) {
-            throw new \BadMethodCallException("Template name has not been set yet.");
+            throw new \BadMethodCallException(
+                "Template name has not been set yet for node '{$this->getId()}'."
+            );
         }
 
         return $this->templateName;
index 1d56394b396979cab3fcc424062d51ab54e3b155..533f46b2833ab799fc01e2c002cc0f4c91bcc24d 100644 (file)
@@ -51,7 +51,7 @@ class FormButton implements IFormButton
             foreach ($splitAccessKey as $accessKey) {
                 if (\mb_strlen($accessKey) !== 1) {
                     throw new \InvalidArgumentException(
-                        "The given access key contains an access key longer than one character: '{$accessKey}'."
+                        "The given access key contains an access key longer than one character: '{$accessKey}' for buttom '{$this->getId()}'."
                     );
                 }
             }
index f1e4d23b5e4b83ffe0304188e063475c9ddec568..a8f517e3a5117e7c28feaf30b963f2d27d7ea6ab 100644 (file)
@@ -92,12 +92,17 @@ class FormContainer implements IFormContainer
 
         if ($this instanceof ITabMenuFormContainer) {
             if (!($child instanceof ITabFormContainer)) {
-                throw new \InvalidArgumentException("Cannot append non-tab container " . \get_class($child) . "('{$child->getId()}') to tab menu container '{$this->getId()}'");
+                throw new \InvalidArgumentException(
+                    "Cannot append non-tab container " . \get_class($child)
+                    . "('{$child->getId()}') to container '{$this->getId()}'"
+                );
             }
 
             if ($child instanceof ITabMenuFormContainer) {
                 if ($this->getParent() instanceof ITabMenuFormContainer) {
-                    throw new \InvalidArgumentException("Tab menus can only be nested once.");
+                    throw new \InvalidArgumentException(
+                        "Tab menus can only be nested once for container '{$this->getId()}'."
+                    );
                 }
             }
         } elseif ($child instanceof ITabFormContainer) {
@@ -107,7 +112,10 @@ class FormContainer implements IFormContainer
         }
 
         if ($this instanceof ITabFormContainer && !($child instanceof IFormContainer)) {
-            throw new \InvalidArgumentException("Child " . \get_class($child) . "('{$child->getId()}') has to be a form container to be appended to tab container '{$this->getId()}'.");
+            throw new \InvalidArgumentException(
+                "Child " . \get_class($child)
+                . "('{$child->getId()}') has to be a form container to be appended to tab container '{$this->getId()}'."
+            );
         }
 
         if ($child instanceof ITabMenuFormContainer) {
@@ -117,7 +125,9 @@ class FormContainer implements IFormContainer
                 && $parent = $parent->getParent()
             ) {
                 if ($parent instanceof ITabMenuFormContainer) {
-                    throw new \InvalidArgumentException("A tab menu container may only have another tab menu container as a parent, not as an earlier ancestor.");
+                    throw new \InvalidArgumentException(
+                        "A tab menu container may only have another tab menu container as a parent, not as an earlier ancestor for container '{$this->getId()}'."
+                    );
                 }
             }
         }
index 144e3517ac9f45208906bbdada105324fa183b7c..2861310ff6f0af448f9406a295f06f6f80b893d7 100644 (file)
@@ -40,7 +40,7 @@ class RowFormFieldContainer extends FormContainer
     {
         if ((!$child instanceof IFormField)) {
             throw new \InvalidArgumentException(
-                "'" . static::class . "' only supports '" . IFormField::class . "' instances as children."
+                "'" . static::class . "' only supports '" . IFormField::class . "' instances as children for container '{$this->getId()}'."
             );
         }
 
index b0f37f5e67b1a032afb9ed8dd9e37da6e280c5af..756caeec7c094c15afbb28d775622620a1523600 100644 (file)
@@ -42,7 +42,7 @@ class SuffixFormFieldContainer extends FormContainer
     public function field(IFormField $formField)
     {
         if ($this->field !== null) {
-            throw new \BadMethodCallException('Field has already been set.');
+            throw new \BadMethodCallException("Field has already been set for container '{$this->getId()}'.");
         }
 
         $this->field = $formField;
@@ -59,7 +59,7 @@ class SuffixFormFieldContainer extends FormContainer
     public function getField()
     {
         if ($this->field === null) {
-            throw new \BadMethodCallException('Field has not been set yet.');
+            throw new \BadMethodCallException("Field has not been set yet for container '{$this->getId()}'.");
         }
 
         return $this->field;
@@ -84,10 +84,14 @@ class SuffixFormFieldContainer extends FormContainer
     public function getSelectedSuffixOption()
     {
         if ($this->getSuffixField() === null) {
-            throw new \BadMethodCallException('There is no suffix field for which a label could be determined.');
+            throw new \BadMethodCallException(
+                "There is no suffix field for which a label could be determined for container '{$this->getId()}'."
+            );
         }
         if (empty($this->getSuffixField()->getOptions())) {
-            throw new \BadMethodCallException('The suffix field has no options.');
+            throw new \BadMethodCallException(
+                "The suffix field has no options for container '{$this->getId()}'."
+            );
         }
 
         foreach ($this->getSuffixField()->getNestedOptions() as $option) {
@@ -107,7 +111,9 @@ class SuffixFormFieldContainer extends FormContainer
             }
         }
 
-        throw new \RuntimeException('Cannot determine selected suffix option.');
+        throw new \RuntimeException(
+            "Cannot determine selected suffix option for container '{$this->getId()}'."
+        );
     }
 
     /**
@@ -129,7 +135,9 @@ class SuffixFormFieldContainer extends FormContainer
     public function getSuffixLabel()
     {
         if ($this->getSuffixField() === null) {
-            throw new \BadMethodCallException('There is no suffix field for which a label could be determined.');
+            throw new \BadMethodCallException(
+                "There is no suffix field for which a label could be determined for container '{$this->getId()}'."
+            );
         }
 
         if (empty($this->getSuffixField()->getOptions())) {
@@ -153,7 +161,9 @@ class SuffixFormFieldContainer extends FormContainer
     public function suffixField(ISelectionFormField $formField)
     {
         if ($this->suffixField !== null) {
-            throw new \BadMethodCallException('Suffix field has already been set.');
+            throw new \BadMethodCallException(
+                "Suffix field has already been set for container '{$this->getId()}'."
+            );
         }
 
         $this->suffixField = $formField;
index 0a1cef5b4a296bff66e90c69a1aea2d2fa39b100..b13ed6d42dd08814dfdfa714677acd7e9af62281 100644 (file)
@@ -199,7 +199,7 @@ class WysiwygFormContainer extends FormContainer
     public function attachmentData($objectType = null, $parentObjectID = 0)
     {
         if ($this->attachmentField !== null) {
-            throw new \BadMethodCallException("The attachment form field has already been initialized. Use the atatchment form field directly to manipulate attachment data.");
+            throw new \BadMethodCallException("The attachment form field '{$this->getId()}' has already been initialized. Use the atatchment form field directly to manipulate attachment data.");
         }
 
         if ($objectType === null) {
@@ -211,7 +211,7 @@ class WysiwygFormContainer extends FormContainer
                     $objectType
                 ) === null
             ) {
-                throw new \InvalidArgumentException("Unknown attachment object type '{$objectType}'.");
+                throw new \InvalidArgumentException("Unknown attachment object type '{$objectType}' for container '{$this->getId()}'.");
             }
 
             $this->attachmentData = [
@@ -237,7 +237,7 @@ class WysiwygFormContainer extends FormContainer
     {
         if ($this->isPopulated) {
             throw new \BadMethodCallException(
-                'Enabling and disabling the preview button is only possible before the form has been built.'
+                "Enabling and disabling the preview button is only possible before the form has been built for container '{$this->getId()}'."
             );
         }
 
@@ -256,7 +256,7 @@ class WysiwygFormContainer extends FormContainer
     {
         if ($this->attachmentField === null) {
             throw new \BadMethodCallException(
-                "Wysiwyg form field can only be requested after the form has been built."
+                "Wysiwyg form field can only be requested after the form has been built for container '{$this->getId()}'."
             );
         }
 
@@ -296,7 +296,7 @@ class WysiwygFormContainer extends FormContainer
     {
         if ($this->pollContainer === null) {
             throw new \BadMethodCallException(
-                "Wysiwyg form field can only be requested after the form has been built."
+                "Wysiwyg form field can only be requested after the form has been built for container '{$this->getId()}'."
             );
         }
 
@@ -313,7 +313,7 @@ class WysiwygFormContainer extends FormContainer
     {
         if ($this->settingsContainer === null) {
             throw new \BadMethodCallException(
-                "Wysiwyg form field can only be requested after the form has been built."
+                "Wysiwyg form field can only be requested after the form has been built for container '{$this->getId()}'."
             );
         }
 
@@ -330,7 +330,7 @@ class WysiwygFormContainer extends FormContainer
     {
         if ($this->smiliesContainer === null) {
             throw new \BadMethodCallException(
-                "Smilies form field container can only be requested after the form has been built."
+                "Smilies form field container can only be requested after the form has been built for container '{$this->getId()}'."
             );
         }
 
@@ -347,7 +347,7 @@ class WysiwygFormContainer extends FormContainer
     {
         if ($this->wysiwygField === null) {
             throw new \BadMethodCallException(
-                "Wysiwyg form field can only be requested after the form has been built."
+                "Wysiwyg form field can only be requested after the form has been built for container '{$this->getId()}'."
             );
         }
 
@@ -412,7 +412,9 @@ class WysiwygFormContainer extends FormContainer
                 $messageObjectType
             ) === null
         ) {
-            throw new \InvalidArgumentException("Unknown message object type '{$messageObjectType}'.");
+            throw new \InvalidArgumentException(
+                "Unknown message object type '{$messageObjectType}' for container '{$this->getId()}'."
+            );
         }
 
         if ($this->wysiwygField !== null) {
@@ -448,7 +450,9 @@ class WysiwygFormContainer extends FormContainer
     public function pollObjectType($pollObjectType)
     {
         if (ObjectTypeCache::getInstance()->getObjectTypeByName('com.woltlab.wcf.poll', $pollObjectType) === null) {
-            throw new \InvalidArgumentException("Unknown poll object type '{$pollObjectType}'.");
+            throw new \InvalidArgumentException(
+                "Unknown poll object type '{$pollObjectType}' for container '{$this->getId()}'."
+            );
         }
 
         if ($this->pollContainer !== null) {
index 38034ea0af9d67df1b5ad681dfe3e1906b5b0211..4efddde9e6b51c0170cec0564b640cfefe0e54de 100644 (file)
@@ -108,7 +108,9 @@ class WysiwygPollFormContainer extends FormContainer implements IObjectTypeFormN
     public function getEndTimeField()
     {
         if ($this->endTimeField === null) {
-            throw new \BadMethodCallException("Poll form field can only be requested after the form has been built.");
+            throw new \BadMethodCallException(
+                "Poll form field can only be requested after the form has been built for container '{$this->getId()}'."
+            );
         }
 
         return $this->endTimeField;
@@ -123,7 +125,9 @@ class WysiwygPollFormContainer extends FormContainer implements IObjectTypeFormN
     public function getIsChangeableField()
     {
         if ($this->isChangeableField === null) {
-            throw new \BadMethodCallException("Poll form field can only be requested after the form has been built.");
+            throw new \BadMethodCallException(
+                "Poll form field can only be requested after the form has been built for container '{$this->getId()}'."
+            );
         }
 
         return $this->isChangeableField;
@@ -138,7 +142,9 @@ class WysiwygPollFormContainer extends FormContainer implements IObjectTypeFormN
     public function getIsPublicField()
     {
         if ($this->isPublicField === null) {
-            throw new \BadMethodCallException("Poll form field can only be requested after the form has been built.");
+            throw new \BadMethodCallException(
+                "Poll form field can only be requested after the form has been built for container '{$this->getId()}'."
+            );
         }
 
         return $this->isPublicField;
@@ -153,7 +159,9 @@ class WysiwygPollFormContainer extends FormContainer implements IObjectTypeFormN
     public function getMaxVotesField()
     {
         if ($this->maxVotesField === null) {
-            throw new \BadMethodCallException("Poll form field can only be requested after the form has been built.");
+            throw new \BadMethodCallException(
+                "Poll form field can only be requested after the form has been built for container '{$this->getId()}'."
+            );
         }
 
         return $this->maxVotesField;
@@ -176,7 +184,9 @@ class WysiwygPollFormContainer extends FormContainer implements IObjectTypeFormN
     public function getOptionsField()
     {
         if ($this->optionsField === null) {
-            throw new \BadMethodCallException("Poll form field can only be requested after the form has been built.");
+            throw new \BadMethodCallException(
+                "Poll form field can only be requested after the form has been built for container '{$this->getId()}'."
+            );
         }
 
         return $this->optionsField;
@@ -191,7 +201,9 @@ class WysiwygPollFormContainer extends FormContainer implements IObjectTypeFormN
     public function getQuestionField()
     {
         if ($this->questionField === null) {
-            throw new \BadMethodCallException("Poll form field can only be requested after the form has been built.");
+            throw new \BadMethodCallException(
+                "Poll form field can only be requested after the form has been built for container '{$this->getId()}'."
+            );
         }
 
         return $this->questionField;
@@ -206,7 +218,9 @@ class WysiwygPollFormContainer extends FormContainer implements IObjectTypeFormN
     public function getResultsRequireVoteField()
     {
         if ($this->resultsRequireVoteField === null) {
-            throw new \BadMethodCallException("Poll form field can only be requested after the form has been built.");
+            throw new \BadMethodCallException(
+                "Poll form field can only be requested after the form has been built for container '{$this->getId()}'."
+            );
         }
 
         return $this->resultsRequireVoteField;
@@ -222,7 +236,9 @@ class WysiwygPollFormContainer extends FormContainer implements IObjectTypeFormN
     public function getSortByVotesField()
     {
         if ($this->sortByVotesField === null) {
-            throw new \BadMethodCallException("Poll form field can only be requested after the form has been built.");
+            throw new \BadMethodCallException(
+                "Poll form field can only be requested after the form has been built for container '{$this->getId()}'."
+            );
         }
 
         return $this->sortByVotesField;
diff --git a/wcfsetup/install/files/lib/system/form/builder/exception/InvalidFormFieldValue.class.php b/wcfsetup/install/files/lib/system/form/builder/exception/InvalidFormFieldValue.class.php
new file mode 100644 (file)
index 0000000..7ad90a2
--- /dev/null
@@ -0,0 +1,22 @@
+<?php
+
+namespace wcf\system\form\builder\exception;
+
+use wcf\system\form\builder\field\IFormField;
+
+/**
+ * Exception to throw if an invalid value is given for a form field.
+ *
+ * @author  Matthias Schmidt
+ * @copyright   2001-2021 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package WoltLabSuite\Core\System\Form\Builder
+ * @since   5.5
+ */
+class InvalidFormFieldValue extends \InvalidArgumentException
+{
+    public function __construct(IFormField $field, string $expectedValue, string $givenValue)
+    {
+        parent::__construct("Given value is no {$expectedValue}, {$givenValue} given for field '{$field->getId()}'.");
+    }
+}
index 5bb941919b767939f5a9b3697295a4d791da7178..a5302d94d81227388c9b10d9343628c50e636ef8 100644 (file)
@@ -92,7 +92,7 @@ abstract class AbstractFormField implements IFormField
     public function addValidator(IFormFieldValidator $validator)
     {
         if ($this->hasValidator($validator->getId())) {
-            throw new \InvalidArgumentException("Validator with id '{$validator->getId()}' already exists.");
+            throw new \InvalidArgumentException("Validator with id '{$validator->getId()}' already exists for field '{$this->getId()}'.");
         }
 
         $this->validators[$validator->getId()] = $validator;
@@ -249,7 +249,7 @@ abstract class AbstractFormField implements IFormField
     public function removeValidator($validatorId)
     {
         if (!$this->hasValidator($validatorId)) {
-            throw new \InvalidArgumentException("Unknown validator with id '{$validatorId}'");
+            throw new \InvalidArgumentException("Unknown validator with id '{$validatorId}' for field '{$this->getId()}'.");
         }
 
         unset($this->validators[$validatorId]);
index 07582290987753926605b8ace88f63dc1bc2eb9d..45b4439cc1e3965f2587d35357d7b2b761ff88de 100644 (file)
@@ -2,6 +2,7 @@
 
 namespace wcf\system\form\builder\field;
 
+use wcf\system\form\builder\exception\InvalidFormFieldValue;
 use wcf\system\form\builder\field\validation\FormFieldValidationError;
 
 /**
@@ -163,13 +164,19 @@ abstract class AbstractNumericFormField extends AbstractFormField implements
         if ($step !== null) {
             if ($this->integerValues) {
                 if (!\is_int($step)) {
-                    throw new \InvalidArgumentException("Given step is no int, '" . \gettype($step) . "' given.");
+                    throw new \InvalidArgumentException(
+                        "Given step is no int, '" . \gettype($step) . "' given for field '{$this->getId()}'."
+                    );
                 }
             } else {
                 if (\is_string($step) && $step !== 'any') {
-                    throw new \InvalidArgumentException("The only valid step value is 'any', '" . $step . "' given.");
+                    throw new \InvalidArgumentException(
+                        "The only valid step value is 'any', '" . $step . "' given for field '{$this->getId()}'."
+                    );
                 } elseif (!\is_numeric($step)) {
-                    throw new \InvalidArgumentException("Given step is no number, '" . \gettype($step) . "' given.");
+                    throw new \InvalidArgumentException(
+                        "Given step is no number, '" . \gettype($step) . "' given for field '{$this->getId()}'."
+                    );
                 }
             }
         }
@@ -222,13 +229,9 @@ abstract class AbstractNumericFormField extends AbstractFormField implements
             }
 
             if ($this->integerValues && !\is_int($value)) {
-                throw new \InvalidArgumentException(
-                    "Given value is neither `null` nor an int, " . \gettype($value) . " given."
-                );
+                throw new InvalidFormFieldValue($this, 'int or `null`', \gettype($value));
             } elseif (!$this->integerValues && !\is_numeric($value)) {
-                throw new \InvalidArgumentException(
-                    "Given value is neither `null` nor a number, " . \gettype($value) . " given."
-                );
+                throw new InvalidFormFieldValue($this, 'number or `null`', \gettype($value));
             }
         }
 
index 3cce68b66bbf375d43d63b3050fcdcab80ac3c5c..8383db4cb4e6adc96a9d952093a47c88d277aced 100644 (file)
@@ -2,6 +2,7 @@
 
 namespace wcf\system\form\builder\field;
 
+use wcf\system\form\builder\exception\InvalidFormFieldValue;
 use wcf\system\form\builder\field\validation\FormFieldValidationError;
 
 /**
@@ -85,7 +86,7 @@ class BooleanFormField extends AbstractFormField implements
         if (\is_int($value) && ($value === 0 || $value === 1)) {
             $value = ($value === 1);
         } elseif (!\is_bool($value)) {
-            throw new \InvalidArgumentException("Given value is no bool, " . \gettype($value) . " given.");
+            throw new InvalidFormFieldValue($this, 'bool', \gettype($value));
         }
 
         return parent::value($value);
index 5f90ef66804ea8c10a667f10ff680321df836dda..bc29d1bc559338a9682d95fbd5573d5ed4f44f42 100644 (file)
@@ -54,7 +54,7 @@ class ButtonFormField extends AbstractFormField implements IAttributeFormField,
     public function getButtonLabel(): string
     {
         if ($this->buttonLabel === null) {
-            throw new \BadMethodCallException("Button label has not been set.");
+            throw new \BadMethodCallException("Button label has not been set for field '{$this->getId()}'.");
         }
 
         return $this->buttonLabel;
index 15f9ca62490f71a8ebb4bfb5ee798dfe19719a67..749f6ab715d0b592d014048b7b76dda6356ad481 100644 (file)
@@ -119,7 +119,7 @@ class ClassNameFormField extends TextFormField
     public function implementedInterface($interface)
     {
         if (!\interface_exists($interface)) {
-            throw new \InvalidArgumentException("Interface '{$interface}' does not exist.");
+            throw new \InvalidArgumentException("Interface '{$interface}' does not exist for field '{$this->getId()}'.");
         }
 
         $this->implementedInterface = $interface;
@@ -169,7 +169,7 @@ class ClassNameFormField extends TextFormField
     public function parentClass($parentClass)
     {
         if (!\class_exists($parentClass)) {
-            throw new \InvalidArgumentException("Class '{$parentClass}' does not exist.");
+            throw new \InvalidArgumentException("Class '{$parentClass}' does not exist for field '{$this->getId()}'.");
         }
 
         $this->parentClass = $parentClass;
index 02303db33c1d6a3be67f959dae0ade3413b06316..27f4d6cbd3c64a0ffee07c0bde89b9ccac3c0be4 100644 (file)
@@ -96,7 +96,9 @@ class DateFormField extends AbstractFormField implements
                 new \DateTimeZone('UTC')
             );
             if ($earliestDateTime === false) {
-                throw new \InvalidArgumentException("Earliest date '{$this->earliestDate}' does not have save value format '{$this->getSaveValueFormat()}'.");
+                throw new \InvalidArgumentException(
+                    "Earliest date '{$this->earliestDate}' does not have save value format '{$this->getSaveValueFormat()}' for field '{$this->getId()}'."
+                );
             }
 
             if ($this->getLatestDate() !== null) {
@@ -107,7 +109,9 @@ class DateFormField extends AbstractFormField implements
                 );
 
                 if ($latestDateTime < $earliestDateTime) {
-                    throw new \InvalidArgumentException("Earliest date '{$this->earliestDate}' cannot be later than latest date '{$this->getLatestDate()}'.");
+                    throw new \InvalidArgumentException(
+                        "Earliest date '{$this->earliestDate}' cannot be later than latest date '{$this->getLatestDate()}' for field '{$this->getId()}'."
+                    );
                 }
             }
         }
@@ -256,7 +260,9 @@ class DateFormField extends AbstractFormField implements
             );
 
             if ($latestDateTime === false) {
-                throw new \InvalidArgumentException("Latest date '{$this->latestDate}' does not have save value format '{$this->getSaveValueFormat()}'.");
+                throw new \InvalidArgumentException(
+                    "Latest date '{$this->latestDate}' does not have save value format '{$this->getSaveValueFormat()}' for field '{$this->getId()}'."
+                );
             }
 
             if ($this->getEarliestDate() !== null) {
@@ -267,7 +273,9 @@ class DateFormField extends AbstractFormField implements
                 );
 
                 if ($latestDateTime < $earliestDateTime) {
-                    throw new \InvalidArgumentException("Latest date '{$this->latestDate}' cannot be earlier than earliest date '{$this->getEarliestDate()}'.");
+                    throw new \InvalidArgumentException(
+                        "Latest date '{$this->latestDate}' cannot be earlier than earliest date '{$this->getEarliestDate()}' for field '{$this->getId()}'."
+                    );
                 }
             }
         }
@@ -303,7 +311,7 @@ class DateFormField extends AbstractFormField implements
     public function saveValueFormat($saveValueFormat)
     {
         if ($this->saveValueFormat !== null) {
-            throw new \BadMethodCallException("Save value type has already been set.");
+            throw new \BadMethodCallException("Save value type has already been set for field '{$this->getId()}'.");
         }
 
         $this->saveValueFormat = $saveValueFormat;
@@ -320,7 +328,9 @@ class DateFormField extends AbstractFormField implements
     public function supportTime($supportsTime = true)
     {
         if ($this->value !== null) {
-            throw new \BadFunctionCallException("After a value has been set, time support cannot be changed.");
+            throw new \BadFunctionCallException(
+                "After a value has been set, time support cannot be changed for field '{$this->getId()}'."
+            );
         }
 
         $this->supportsTime = $supportsTime;
@@ -436,7 +446,9 @@ class DateFormField extends AbstractFormField implements
             new \DateTimeZone('UTC')
         );
         if ($dateTime === false) {
-            throw new \InvalidArgumentException("Given value does not match format '{$this->getSaveValueFormat()}'.");
+            throw new \InvalidArgumentException(
+                "Given value does not match format '{$this->getSaveValueFormat()}' for field '{$this->getId()}'."
+            );
         }
 
         if ($this->supportsTime()) {
index 2f2ba6b84437d8f77305cd1e6bc0da9c9afdb7c8..3b047b25aabd14b4e8bb8d194e2b950f813030af 100644 (file)
@@ -3,6 +3,7 @@
 namespace wcf\system\form\builder\field;
 
 use wcf\system\form\builder\data\processor\CustomFormDataProcessor;
+use wcf\system\form\builder\exception\InvalidFormFieldValue;
 use wcf\system\form\builder\field\validation\FormFieldValidationError;
 use wcf\system\form\builder\IFormDocument;
 use wcf\util\ArrayUtil;
@@ -180,7 +181,7 @@ class ItemListFormField extends AbstractFormField implements
     public function saveValueType($saveValueType)
     {
         if ($this->saveValueType !== null) {
-            throw new \BadMethodCallException("Save value type has already been set.");
+            throw new \BadMethodCallException("Save value type has already been set for field '{$this->getId()}'.");
         }
 
         if (
@@ -191,7 +192,7 @@ class ItemListFormField extends AbstractFormField implements
                 self::SAVE_VALUE_TYPE_SSV,
             ])
         ) {
-            throw new \InvalidArgumentException("Unknown save value type '{$saveValueType}'.");
+            throw new \InvalidArgumentException("Unknown save value type '{$saveValueType}' for field '{$this->getId()}'.");
         }
 
         $this->saveValueType = $saveValueType;
@@ -209,7 +210,7 @@ class ItemListFormField extends AbstractFormField implements
                 if (\is_array($value)) {
                     $this->value = $value;
                 } else {
-                    throw new \InvalidArgumentException("Given value is no array, '" . \gettype($value) . "' given.");
+                    throw new InvalidFormFieldValue($this, 'array', \gettype($value));
                 }
 
                 break;
@@ -218,7 +219,7 @@ class ItemListFormField extends AbstractFormField implements
                 if (\is_string($value)) {
                     $this->value = \explode(',', $value);
                 } else {
-                    throw new \InvalidArgumentException("Given value is no string, '" . \gettype($value) . "' given.");
+                    throw new InvalidFormFieldValue($this, 'string', \gettype($value));
                 }
 
                 break;
@@ -227,7 +228,7 @@ class ItemListFormField extends AbstractFormField implements
                 if (\is_string($value)) {
                     $this->value = \explode("\n", $value);
                 } else {
-                    throw new \InvalidArgumentException("Given value is no string, '" . \gettype($value) . "' given.");
+                    throw new InvalidFormFieldValue($this, 'string', \gettype($value));
                 }
 
                 break;
@@ -236,7 +237,7 @@ class ItemListFormField extends AbstractFormField implements
                 if (\is_string($value)) {
                     $this->value = \explode(' ', $value);
                 } else {
-                    throw new \InvalidArgumentException("Given value is no string, '" . \gettype($value) . "' given.");
+                    throw new InvalidFormFieldValue($this, 'string', \gettype($value));
                 }
 
                 break;
index c5583b2294885bc8f78d50893a864719b81aa9f2..38c28042d30c8329ebb17c3c9b8f381f325a91fb 100644 (file)
@@ -58,7 +58,7 @@ class MultilineTextFormField extends TextFormField
     public function rows($rows)
     {
         if ($rows <= 0) {
-            throw new \InvalidArgumentException("Given number of rows is not positive.");
+            throw new \InvalidArgumentException("Given number of rows is not positive for field '{$this->getId()}'.");
         }
 
         $this->rows = $rows;
index 460540e6e30d6d6ddd10a0496191e102d49e773a..9283d5d1e7c8074d6a3a2454d4994c41a8ddf83d 100644 (file)
@@ -3,6 +3,7 @@
 namespace wcf\system\form\builder\field;
 
 use wcf\system\form\builder\data\processor\CustomFormDataProcessor;
+use wcf\system\form\builder\exception\InvalidFormFieldValue;
 use wcf\system\form\builder\field\validation\FormFieldValidationError;
 use wcf\system\form\builder\IFormDocument;
 
@@ -119,12 +120,14 @@ class MultipleSelectionFormField extends AbstractFormField implements
         }
 
         if (!\is_array($value)) {
-            throw new \InvalidArgumentException("Given value is no array, " . \gettype($value) . " given.");
+            throw new InvalidFormFieldValue($this, 'array', \gettype($value));
         }
 
         $unknownValues = \array_diff($value, \array_keys($this->getOptions()));
         if (!empty($unknownValues)) {
-            throw new \InvalidArgumentException("Unknown values '" . \implode("', '", $unknownValues) . "'");
+            throw new \InvalidArgumentException(
+                "Unknown values '" . \implode("', '", $unknownValues) . "' for field '{$this->getId()}'."
+            );
         }
 
         return parent::value($value);
index e7eaddbe6db809282a3ff736470ea295b11b6e32..e9e59480d3f54ff72aa4ecee925e606fe0939413 100644 (file)
@@ -83,7 +83,7 @@ class RatingFormField extends AbstractFormField implements
     public function activeCssClasses(array $cssClasses)
     {
         if (empty($cssClasses)) {
-            throw new \InvalidArgumentException("No css classes for active state given.");
+            throw new \InvalidArgumentException("No css classes for active state given for field '{$this->getId()}'.");
         }
 
         foreach ($cssClasses as $cssClass) {
@@ -105,7 +105,7 @@ class RatingFormField extends AbstractFormField implements
     public function defaultCssClasses(array $cssClasses)
     {
         if (empty($cssClasses)) {
-            throw new \InvalidArgumentException("No css classes for default state given.");
+            throw new \InvalidArgumentException("No css classes for default state given for field '{$this->getId()}'.");
         }
 
         foreach ($cssClasses as $cssClass) {
@@ -157,7 +157,7 @@ class RatingFormField extends AbstractFormField implements
     public function maximum($maximum = null)
     {
         if ($maximum === null) {
-            throw new \InvalidArgumentException("Cannot unset maximum value.");
+            throw new \InvalidArgumentException("Cannot unset maximum value for field '{$this->getId()}'.");
         }
 
         return $this->traitMaximum($maximum);
@@ -169,7 +169,7 @@ class RatingFormField extends AbstractFormField implements
     public function minimum($minimum = null)
     {
         if ($minimum === null) {
-            throw new \InvalidArgumentException("Cannot unset minimum value.");
+            throw new \InvalidArgumentException("Cannot unset minimum value for field '{$this->getId()}'.");
         }
 
         return $this->traitMinimum($minimum);
index 12f1e1b803689f01b7fa6df63794cd75ee77c6c7..bd7855cfbd7c2e20494c28c94a2d073cf4f13d35 100644 (file)
@@ -54,7 +54,7 @@ final class RejectEverythingFormField extends AbstractFormField
      */
     public function getSaveValue(): void
     {
-        throw new \BadMethodCallException('This form field rejects everything.');
+        throw new \BadMethodCallException("Form field '{$this->getId()}' rejects everything.");
     }
 
     /**
index 419b388caf8c3871ff91e9f97ad259f9603ae774..f13e0623b518362d843442e8c2e0929f983439ad 100644 (file)
@@ -110,7 +110,7 @@ class SingleSelectionFormField extends AbstractFormField implements
         }
 
         if (!isset($this->getOptions()[$value])) {
-            throw new \InvalidArgumentException("Unknown value '{$value}'");
+            throw new \InvalidArgumentException("Unknown value '{$value}' for field '{$this->getId()}'.");
         }
 
         return parent::value($value);
index 9d1fde27d141af4ebf0d797a92fdb9332c7c9156..cd85f1ae21ce8ad40befe61aa723efd9bb9f7113 100644 (file)
@@ -186,7 +186,9 @@ class SourceCodeFormField extends AbstractFormField implements
     public function language(?string $language): self
     {
         if (!\in_array($language, self::LANGUAGES)) {
-            throw new \InvalidArgumentException("Unsupported language '{$language}' given.");
+            throw new \InvalidArgumentException(
+                "Unsupported language '{$language}' given for field '{$this->getId()}'."
+            );
         }
 
         $this->language = $language;
index 211774bd59dc3645824d17832c1378cc096b97e1..0a38e415eda908fa0bc01d6e1d8f03b5509f9bc8 100644 (file)
@@ -45,7 +45,7 @@ trait TAttributeFormField
     public function getFieldAttribute(string $name)
     {
         if (!$this->hasFieldAttribute($name)) {
-            throw new \InvalidArgumentException("Unknown attribute '{$name}' requested.");
+            throw new \InvalidArgumentException("Unknown attribute '{$name}' requested for field '{$this->getId()}'.");
         }
 
         return $this->fieldAttributes[$name];
index 624a2bc2cd985b0ac01d49b149d716512ea639cd..1d76de828fecb2cafc8810363e747b22991e5dd2 100644 (file)
@@ -29,10 +29,14 @@ trait TAutoCompleteFormField
         if ($autoComplete !== null && $autoComplete !== 'on' && $autoComplete !== 'off') {
             if (\preg_match('~^(?:section-\w+ )?(?:(shipping|billing) )?(?P<token>.+)$~', $autoComplete, $matches)) {
                 if (!\in_array($matches['token'], $this->getValidAutoCompleteTokens())) {
-                    throw new \InvalidArgumentException("Invalid autocomplete attribute '{$autoComplete}'.");
+                    throw new \InvalidArgumentException(
+                        "Invalid autocomplete attribute '{$autoComplete}' for field '{$this->getId()}'."
+                    );
                 }
             } else {
-                throw new \InvalidArgumentException("Invalid autocomplete attribute '{$autoComplete}'.");
+                throw new \InvalidArgumentException(
+                    "Invalid autocomplete attribute '{$autoComplete}' for field '{$this->getId()}'."
+                );
             }
         }
 
index e82831bfdeff39d3cdd86f909d77cbf18bac81ef..27cebbc180a44c3fb5a9dbc39e5cd90db81c382e 100644 (file)
@@ -5,6 +5,7 @@ namespace wcf\system\form\builder\field;
 use wcf\data\IStorableObject;
 use wcf\data\language\item\LanguageItemList;
 use wcf\system\form\builder\data\processor\CustomFormDataProcessor;
+use wcf\system\form\builder\exception\InvalidFormFieldValue;
 use wcf\system\form\builder\field\validation\FormFieldValidationError;
 use wcf\system\form\builder\IFormDocument;
 use wcf\system\form\builder\IFormNode;
@@ -85,12 +86,12 @@ trait TI18nFormField
     {
         if (!$this->isI18n()) {
             throw new \BadMethodCallException(
-                "You can only get the language item pattern for fields with i18n enabled."
+                "You can only get the language item pattern for fields with i18n enabled for field '{$this->getId()}'."
             );
         }
 
         if ($this->languageItemPattern === null) {
-            throw new \BadMethodCallException("Language item pattern has not been set.");
+            throw new \BadMethodCallException("Language item pattern has not been set for field '{$this->getId()}'.");
         }
 
         return $this->languageItemPattern;
@@ -263,12 +264,12 @@ trait TI18nFormField
     {
         if (!$this->isI18n()) {
             throw new \BadMethodCallException(
-                "The language item pattern can only be set for fields with i18n enabled."
+                "The language item pattern can only be set for fields with i18n enabled for field '{$this->getId()}'."
             );
         }
 
         if (!Regex::compile($pattern)->isValid()) {
-            throw new \InvalidArgumentException("Given pattern is invalid.");
+            throw new \InvalidArgumentException("Given pattern is invalid for field '{$this->getId()}'.");
         }
 
         $this->languageItemPattern = $pattern;
@@ -396,13 +397,11 @@ trait TI18nFormField
                     I18nHandler::getInstance()->setValues($this->getPrefixedId(), $value);
                 }
             } else {
-                throw new \InvalidArgumentException(
-                    "Given value is neither a nor an array, " . \gettype($value) . " given."
-                );
+                throw new InvalidFormFieldValue($this, 'string/number/array', \gettype($value));
             }
         } else {
             if (!\is_string($value) && !\is_numeric($value)) {
-                throw new \InvalidArgumentException("Given value is no string, " . \gettype($value) . " given.");
+                throw new InvalidFormFieldValue($this, 'string/number', \gettype($value));
             }
 
             return parent::value($value);
index 64496c9cc4b83e2c046fc1015ffc781da1d8ebca..b830ae2956e45a196e30fb64885e7cec1d3134e3 100644 (file)
@@ -37,7 +37,7 @@ trait TInputModeFormField
     public function inputMode(?string $inputMode)
     {
         if ($inputMode !== null && $inputMode !== 'none' && !\in_array($inputMode, $this->getValidInputModes())) {
-            throw new \InvalidArgumentException("Invalid inputmode attribute '{$inputMode}'.");
+            throw new \InvalidArgumentException("Invalid inputmode attribute '{$inputMode}' for field '{$this->getId()}'.");
         }
 
         $this->inputMode = $inputMode;
index 48bce109fc666ec1f8d74e2781209f40e0c6b86a..33cc04641f156c879383cba4f003714a19ecb9df 100644 (file)
@@ -43,14 +43,16 @@ trait TMaximumFormField
     {
         if ($maximum !== null) {
             if (!\is_numeric($maximum)) {
-                throw new \InvalidArgumentException("Given maximum is no int, '" . \gettype($maximum) . "' given.");
+                throw new \InvalidArgumentException(
+                    "Given maximum is no int, '" . \gettype($maximum) . "' given for field '{$this->getId()}'."
+                );
             }
 
             if ($this instanceof IMinimumFormField) {
                 $minimum = $this->getMinimum();
                 if ($minimum !== null && $minimum > $maximum) {
                     throw new \InvalidArgumentException(
-                        "Minimum ({$minimum}) cannot be greater than maximum ({$maximum})."
+                        "Minimum ({$minimum}) cannot be greater than maximum ({$maximum}) for field '{$this->getId()}'."
                     );
                 }
             }
index ca64296051f16bb5426f6238f24c035e54af3dca..24f074f37530bd59004429a4120adcc83f03d72b 100644 (file)
@@ -47,19 +47,21 @@ trait TMaximumLengthFormField
         if ($maximumLength !== null) {
             if (!\is_int($maximumLength)) {
                 throw new \InvalidArgumentException(
-                    "Given maximum length is no int, '" . \gettype($maximumLength) . "' given."
+                    "Given maximum length is no int, '" . \gettype($maximumLength) . "' given for field '{$this->getId()}'."
                 );
             }
 
             if ($maximumLength <= 0) {
-                throw new \InvalidArgumentException("Maximum length must be positive, '{$maximumLength}' given.");
+                throw new \InvalidArgumentException(
+                    "Maximum length must be positive, '{$maximumLength}' given for field '{$this->getId()}'."
+                );
             }
 
             if ($this instanceof IMinimumLengthFormField) {
                 $minimumLength = $this->getMinimumLength();
                 if ($minimumLength !== null && $minimumLength > $maximumLength) {
                     throw new \InvalidArgumentException(
-                        "Minimum length ({$minimumLength}) cannot be greater than maximum length ({$maximumLength})."
+                        "Minimum length ({$minimumLength}) cannot be greater than maximum length ({$maximumLength}) for field '{$this->getId()}'."
                     );
                 }
             }
index c878f3ecf2e627622834d8f34162bc0b4758583e..4059c1c4a65d8a5c37fa17b3be0edc9921d9e4b1 100644 (file)
@@ -43,14 +43,16 @@ trait TMinimumFormField
     {
         if ($minimum !== null) {
             if (!\is_numeric($minimum)) {
-                throw new \InvalidArgumentException("Given minimum is no int, '" . \gettype($minimum) . "' given.");
+                throw new \InvalidArgumentException(
+                    "Given minimum is no int, '" . \gettype($minimum) . "' given for field '{$this->getId()}'."
+                );
             }
 
             if ($this instanceof IMaximumFormField) {
                 $maximum = $this->getMaximum();
                 if ($maximum !== null && $minimum > $maximum) {
                     throw new \InvalidArgumentException(
-                        "Minimum ({$minimum}) cannot be greater than maximum ({$maximum})."
+                        "Minimum ({$minimum}) cannot be greater than maximum ({$maximum}) for field '{$this->getId()}'."
                     );
                 }
             }
index b0a0cd703234906781d41912c3ac1aa02928947c..cc47234f38e898d1cf4f095b131d248568cbf1a0 100644 (file)
@@ -47,19 +47,21 @@ trait TMinimumLengthFormField
         if ($minimumLength !== null) {
             if (!\is_int($minimumLength)) {
                 throw new \InvalidArgumentException(
-                    "Given minimum length is no int, '" . \gettype($minimumLength) . "' given."
+                    "Given minimum length is no int, '" . \gettype($minimumLength) . "' given for field '{$this->getId()}'."
                 );
             }
 
             if ($minimumLength < 0) {
-                throw new \InvalidArgumentException("Minimum length must be non-negative, '{$minimumLength}' given.");
+                throw new \InvalidArgumentException(
+                    "Minimum length must be non-negative, '{$minimumLength}' given for field '{$this->getId()}'."
+                );
             }
 
             if ($this instanceof IMaximumLengthFormField) {
                 $maximumLength = $this->getMaximumLength();
                 if ($maximumLength !== null && $minimumLength > $maximumLength) {
                     throw new \InvalidArgumentException(
-                        "Minimum length ({$minimumLength}) cannot be greater than maximum length ({$maximumLength})."
+                        "Minimum length ({$minimumLength}) cannot be greater than maximum length ({$maximumLength}) for field '{$this->getId()}'."
                     );
                 }
             }
index de1a3a75b2365a960f036765c951356facc93d58..724089e77a2012f6c01b52d1c383299596f24465 100644 (file)
@@ -101,12 +101,14 @@ trait TMultipleFormField
         if ($maximum !== IMultipleFormField::NO_MAXIMUM_MULTIPLES) {
             if ($maximum <= 0) {
                 throw new \InvalidArgumentException(
-                    "The maximum number of values has to be positive, '{$maximum}' given."
+                    "The maximum number of values has to be positive, '{$maximum}' given for field '{$this->getId()}'."
                 );
             }
 
             if ($this->getMinimumMultiples() !== 0 && $maximum < $this->getMinimumMultiples()) {
-                throw new \InvalidArgumentException("The given maximum number of values '{$maximum}' is less than the set minimum number of values '{$this->getMinimumMultiples()}'.");
+                throw new \InvalidArgumentException(
+                    "The given maximum number of values '{$maximum}' is less than the set minimum number of values '{$this->getMinimumMultiples()}'. for field '{$this->getId()}'"
+                );
             }
         }
 
@@ -129,12 +131,14 @@ trait TMultipleFormField
     {
         if ($minimum < 0) {
             throw new \InvalidArgumentException(
-                "The minimum number of values has to be non-negative, '{$minimum}' given."
+                "The minimum number of values has to be non-negative, '{$minimum}' given for field '{$this->getId()}'."
             );
         }
 
         if ($this->getMaximumMultiples() !== IMultipleFormField::NO_MAXIMUM_MULTIPLES && $minimum > $this->getMaximumMultiples()) {
-            throw new \InvalidArgumentException("The given minimum number of values '{$minimum}' is greater than the set maximum number of values '{$this->getMaximumMultiples()}'.");
+            throw new \InvalidArgumentException(
+                "The given minimum number of values '{$minimum}' is greater than the set maximum number of values '{$this->getMaximumMultiples()}' for field '{$this->getId()}'."
+            );
         }
 
         $this->minimumMultiples = $minimum;
index 42970d74e3b79bf25e83dd8037dfd9096d000d29..b159ffe02ae034d60e8b2e5dbab8bf21c763720a 100644 (file)
@@ -45,7 +45,7 @@ trait TPackagesFormField
     {
         foreach ($packageIDs as $packageID) {
             if (PackageCache::getInstance()->getPackage($packageID) === null) {
-                throw new \InvalidArgumentException("Unknown package with id '{$packageID}'.");
+                throw new \InvalidArgumentException("Unknown package with id '{$packageID}' for field '{$this->getId()}'.");
             }
         }
 
index 145b12279c9bfa5b9bcd473a3d05ceecd3f4942f..236affc2ae14a2b737d9af79fff5f7295f374bf7 100644 (file)
@@ -56,7 +56,7 @@ trait TPlaceholderFormField
         } else {
             if (!\is_string($languageItem)) {
                 throw new \InvalidArgumentException(
-                    "Given placeholder language item is no string, " . \gettype($languageItem) . " given."
+                    "Given placeholder language item is no string, " . \gettype($languageItem) . " given for field '{$this->getId()}'."
                 );
             }
 
index 07a7276ca0d2a691a15a599798b01d49d50bd0b6..8c254bdf2fd7dae98c24df8bd34c03ec7a8ab7ed 100644 (file)
@@ -42,7 +42,7 @@ trait TSelectionFormField
     public function getNestedOptions()
     {
         if (!$this->supportsNestedOptions()) {
-            throw new \BadMethodCallException("Nested options are not supported.");
+            throw new \BadMethodCallException("Nested options are not supported for field '{$this->getId()}'.");
         }
 
         return $this->nestedOptions;
@@ -58,7 +58,7 @@ trait TSelectionFormField
     public function getOptions()
     {
         if ($this->options === null) {
-            throw new \BadMethodCallException("No options have been set.");
+            throw new \BadMethodCallException("No options have been set for field '{$this->getId()}'.");
         }
 
         return $this->options;
@@ -110,12 +110,12 @@ trait TSelectionFormField
         if ($nestedOptions) {
             if (!\is_array($options) && !($options instanceof \Traversable) && !\is_callable($options)) {
                 throw new \InvalidArgumentException(
-                    "The given nested options are neither iterable nor a callable, " . \gettype($options) . " given."
+                    "The given nested options are neither iterable nor a callable, " . \gettype($options) . " given for field '{$this->getId()}'."
                 );
             }
         } elseif (!\is_array($options) && !($options instanceof \Traversable) && !\is_callable($options)) {
             throw new \InvalidArgumentException(
-                "The given options are neither iterable nor a callable, " . \gettype($options) . " given."
+                "The given options are neither iterable nor a callable, " . \gettype($options) . " given for field '{$this->getId()}'."
             );
         }
 
@@ -124,10 +124,14 @@ trait TSelectionFormField
 
             if ($nestedOptions) {
                 if (!\is_array($options) && !($options instanceof \Traversable)) {
-                    throw new \UnexpectedValueException("The nested options callable is expected to return an iterable value, " . \gettype($options) . " returned.");
+                    throw new \UnexpectedValueException(
+                        "The nested options callable is expected to return an iterable value, " . \gettype($options) . " returned for field '{$this->getId()}'."
+                    );
                 }
             } elseif (!\is_array($options) && !($options instanceof \Traversable)) {
-                throw new \UnexpectedValueException("The options callable is expected to return an iterable value, " . \gettype($options) . " returned.");
+                throw new \UnexpectedValueException(
+                    "The options callable is expected to return an iterable value, " . \gettype($options) . " returned for field '{$this->getId()}'."
+                );
             }
 
             return $this->options($options, $nestedOptions, $labelLanguageItems);
@@ -142,7 +146,7 @@ trait TSelectionFormField
                 foreach ($options as $object) {
                     if (!($object instanceof IObjectTreeNode)) {
                         throw new \InvalidArgumentException(
-                            "Nested traversable options must implement '" . IObjectTreeNode::class . "'."
+                            "Nested traversable options must implement '" . IObjectTreeNode::class . "' for field '{$this->getId()}'."
                         );
                     }
 
@@ -164,13 +168,13 @@ trait TSelectionFormField
         if ($nestedOptions) {
             foreach ($options as $key => &$option) {
                 if (!\is_array($option)) {
-                    throw new \InvalidArgumentException("Nested option with key '{$key}' has is no array.");
+                    throw new \InvalidArgumentException("Nested option with key '{$key}' has is no array for field '{$this->getId()}'.");
                 }
 
                 // check if all required elements exist
                 foreach (['label', 'value', 'depth'] as $entry) {
                     if (!isset($option[$entry])) {
-                        throw new \InvalidArgumentException("Nested option with key '{$key}' has no {$entry} entry.");
+                        throw new \InvalidArgumentException("Nested option with key '{$key}' has no {$entry} entry for field '{$this->getId()}'.");
                     }
                 }
 
@@ -184,10 +188,14 @@ trait TSelectionFormField
                     ) {
                         $option['label'] = $option['label']->getTitle();
                     } else {
-                        throw new \InvalidArgumentException("Nested option with key '{$key}' contain invalid label of type " . \gettype($option['label']) . ".");
+                        throw new \InvalidArgumentException(
+                            "Nested option with key '{$key}' contain invalid label of type " . \gettype($option['label']) . " for field '{$this->getId()}'."
+                        );
                     }
                 } elseif (!\is_string($option['label']) && !\is_numeric($option['label'])) {
-                    throw new \InvalidArgumentException("Nested option with key '{$key}' contain invalid label of type " . \gettype($option['label']) . ".");
+                    throw new \InvalidArgumentException(
+                        "Nested option with key '{$key}' contain invalid label of type " . \gettype($option['label']) . " for field '{$this->getId()}'."
+                    );
                 }
 
                 // resolve language item for label
@@ -200,21 +208,25 @@ trait TSelectionFormField
 
                 // validate value
                 if (!\is_string($option['value']) && !\is_numeric($option['value'])) {
-                    throw new \InvalidArgumentException("Nested option with key '{$key}' contain invalid value of type " . \gettype($option['label']) . ".");
+                    throw new \InvalidArgumentException(
+                        "Nested option with key '{$key}' contain invalid value of type " . \gettype($option['label']) . " for field '{$this->getId()}'."
+                    );
                 } elseif (isset($this->options[$option['value']])) {
                     throw new \InvalidArgumentException(
-                        "Options values must be unique, but '{$option['value']}' appears at least twice as value."
+                        "Options values must be unique, but '{$option['value']}' appears at least twice as value for field '{$this->getId()}'."
                     );
                 }
 
                 // validate depth
                 if (!\is_int($option['depth'])) {
                     throw new \InvalidArgumentException(
-                        "Depth of nested option with key '{$key}' is no integer, " . \gettype($options) . " given."
+                        "Depth of nested option with key '{$key}' is no integer, " . \gettype($options) . " given for field '{$this->getId()}'."
                     );
                 }
                 if ($option['depth'] < 0) {
-                    throw new \InvalidArgumentException("Depth of nested option with key '{$key}' is negative.");
+                    throw new \InvalidArgumentException(
+                        "Depth of nested option with key '{$key}' is negative for field '{$this->getId()}'."
+                    );
                 }
 
                 // set default value of `isSelectable`
@@ -232,7 +244,7 @@ trait TSelectionFormField
             foreach ($options as $value => $label) {
                 if (\is_array($label)) {
                     throw new \InvalidArgumentException(
-                        "Non-nested options must not contain any array. Array given for value '{$value}'."
+                        "Non-nested options must not contain any array. Array given for value '{$value}' for field '{$this->getId()}'."
                     );
                 }
 
@@ -246,18 +258,18 @@ trait TSelectionFormField
                         $label = $label->getTitle();
                     } else {
                         throw new \InvalidArgumentException(
-                            "Options contain invalid label of type " . \gettype($label) . "."
+                            "Options contain invalid label of type " . \gettype($label) . " for field '{$this->getId()}'."
                         );
                     }
                 } elseif (!\is_string($label) && !\is_numeric($label)) {
                     throw new \InvalidArgumentException(
-                        "Options contain invalid label of type " . \gettype($label) . "."
+                        "Options contain invalid label of type " . \gettype($label) . " for field '{$this->getId()}'."
                     );
                 }
 
                 if (isset($this->options[$value])) {
                     throw new \InvalidArgumentException(
-                        "Options values must be unique, but '{$value}' appears at least twice as value."
+                        "Options values must be unique, but '{$value}' appears at least twice as value for field '{$this->getId()}'."
                     );
                 }
 
index 56e033d25b3275dba93f6ca33767c04d0df0981b..3f4b1865bc788f9a2ad31349aee7db41ccee1343 100644 (file)
@@ -54,7 +54,7 @@ trait TSuffixedFormField
         } else {
             if (!\is_string($languageItem)) {
                 throw new \InvalidArgumentException(
-                    "Given suffix language item is no string, " . \gettype($languageItem) . " given."
+                    "Given suffix language item is no string, " . \gettype($languageItem) . " given for field '{$this->getId()}'."
                 );
             }
 
index 9b781c4083c94d36fc3d0ffbb30e8b3a66a48cf2..f0bc75f67a4c37119b9275c6cdb291a30f77c3f5 100644 (file)
@@ -155,7 +155,9 @@ class UploadFormField extends AbstractFormField
     public function getValue()
     {
         if (!$this->isPopulated) {
-            throw new \BadMethodCallException("The field must be populated, before calling this method.");
+            throw new \BadMethodCallException(
+                "The field '{$this->getId()}' must be populated, before calling this method."
+            );
         }
 
         if (!$this->isRegistered()) {
@@ -175,7 +177,9 @@ class UploadFormField extends AbstractFormField
     public function getRemovedFiles($processFiles = false)
     {
         if (!$this->isPopulated) {
-            throw new \BadMethodCallException("The field must be populated, before calling the method.");
+            throw new \BadMethodCallException(
+                "The field '{$this->getId()}' must be populated, before calling the method."
+            );
         }
 
         if (!$this->isRegistered()) {
@@ -192,7 +196,9 @@ class UploadFormField extends AbstractFormField
     public function readValue()
     {
         if (!$this->isPopulated) {
-            throw new \BadMethodCallException("The field must be populated, before calling this method.");
+            throw new \BadMethodCallException(
+                "The field '{$this->getId()}' must be populated, before calling the method."
+            );
         }
 
         return $this;
@@ -300,7 +306,9 @@ class UploadFormField extends AbstractFormField
     public function getHtml()
     {
         if (!$this->isPopulated) {
-            throw new \BadMethodCallException("The field must be populated, before calling this method.");
+            throw new \BadMethodCallException(
+                "The field '{$this->getId()}' must be populated, before calling the method."
+            );
         }
 
         if (!$this->isRegistered()) {
@@ -317,7 +325,9 @@ class UploadFormField extends AbstractFormField
     public function getFieldHtml()
     {
         if (!$this->isPopulated) {
-            throw new \BadMethodCallException("The field must be populated, before calling this method.");
+            throw new \BadMethodCallException(
+                "The field '{$this->getId()}' must be populated, before calling the method."
+            );
         }
 
         if (!$this->isRegistered()) {
@@ -354,7 +364,7 @@ class UploadFormField extends AbstractFormField
                 $value = \array_map(function ($v) use ($method) {
                     if (!\is_string($v) || !\file_exists($v)) {
                         throw new \InvalidArgumentException(
-                            "The " . $method . " must return an array of strings with the file locations."
+                            "The {$method} must return an array of strings with the file locations for field '{$this->getId()}'."
                         );
                     }
 
@@ -370,7 +380,7 @@ class UploadFormField extends AbstractFormField
                 $this->value($value);
             } else {
                 throw new \InvalidArgumentException(
-                    "The " . $method . " must return an array of strings with the file locations."
+                    "The {$method} must return an array of strings with the file locationsfor field '{$this->getId()}'."
                 );
             }
         }
@@ -389,13 +399,13 @@ class UploadFormField extends AbstractFormField
     public function value($value)
     {
         if (!\is_array($value)) {
-            throw new \InvalidArgumentException('$value must be an array.');
+            throw new \InvalidArgumentException("Given value must be an array for field '{$this->getId()}'.");
         }
 
         foreach ($value as $file) {
             if (!($file instanceof UploadFile)) {
                 throw new \InvalidArgumentException(
-                    'All given files must be an instance of ' . UploadFile::class . '.'
+                    "All given files must be an instance of " . UploadFile::class . " for field '{$this->getId()}'."
                 );
             }
         }
@@ -455,11 +465,11 @@ class UploadFormField extends AbstractFormField
     protected function registerField(): void
     {
         if ($this->isRegistered) {
-            throw new \BadMethodCallException("The field is already registered.");
+            throw new \BadMethodCallException("The field '{$this->getId()}' is already registered.");
         }
 
         if (!$this->isPopulated) {
-            throw new \BadMethodCallException("The field is not populated yet.");
+            throw new \BadMethodCallException("The field '{$this->getId()}' is not populated yet.");
         }
 
         UploadHandler::getInstance()->registerUploadField(
@@ -483,7 +493,7 @@ class UploadFormField extends AbstractFormField
     {
         if ($this->isRegistered()) {
             throw new \LogicException(
-                'The upload field has already been registered. Therefore no modifications are allowed.'
+                "The field '{$this->getId()}' has already been registered. Therefore no modifications are allowed."
             );
         }
 
@@ -504,7 +514,7 @@ class UploadFormField extends AbstractFormField
         if ($maximumFilesize !== null) {
             if (!\is_numeric($maximumFilesize)) {
                 throw new \InvalidArgumentException(
-                    "Given maximum filesize is no int, '" . \gettype($maximumFilesize) . "' given."
+                    "Given maximum filesize is no int, '" . \gettype($maximumFilesize) . "' given for field '{$this->getId()}'."
                 );
             }
         }
@@ -538,19 +548,21 @@ class UploadFormField extends AbstractFormField
     public function minimumImageWidth($minimumImageWidth = null)
     {
         if (!$this->isImageOnly()) {
-            throw new \LogicException("The form field must be image only, to set a minimum image width.");
+            throw new \LogicException("The field '{$this->getId()}' must be image only to set a minimum image width.");
         }
 
         if ($minimumImageWidth !== null) {
             if (!\is_numeric($minimumImageWidth)) {
                 throw new \InvalidArgumentException(
-                    "Given minimum image width is no int, '" . \gettype($minimumImageWidth) . "' given."
+                    "Given minimum image width is no int, '" . \gettype($minimumImageWidth) . "' given for field '{$this->getId()}'."
                 );
             }
 
             $maximumImageWidth = $this->getMaximumImageWidth();
             if ($maximumImageWidth !== null && $minimumImageWidth > $maximumImageWidth) {
-                throw new \InvalidArgumentException("Minimum image width ({$minimumImageWidth}) cannot be greater than maximum image width ({$maximumImageWidth}).");
+                throw new \InvalidArgumentException(
+                    "Minimum image width ({$minimumImageWidth}) cannot be greater than maximum image width ({$maximumImageWidth}) for field '{$this->getId()}'."
+                );
             }
         }
 
@@ -583,19 +595,21 @@ class UploadFormField extends AbstractFormField
     public function maximumImageWidth($maximumImageWidth = null)
     {
         if (!$this->isImageOnly()) {
-            throw new \LogicException("The form field must be image only, to set a maximum image width.");
+            throw new \LogicException("The field '{$this->getId()}' must be image only to set a maximum image width.");
         }
 
         if ($maximumImageWidth !== null) {
             if (!\is_numeric($maximumImageWidth)) {
                 throw new \InvalidArgumentException(
-                    "Given maximum image width is no int, '" . \gettype($maximumImageWidth) . "' given."
+                    "Given maximum image width is no int, '" . \gettype($maximumImageWidth) . "' given for field '{$this->getId()}'."
                 );
             }
 
             $minimumImageWidth = $this->getMinimumImageWidth();
             if ($maximumImageWidth !== null && $minimumImageWidth > $maximumImageWidth) {
-                throw new \InvalidArgumentException("Maximum image width ({$maximumImageWidth}) cannot be smaller than minimum image width ({$minimumImageWidth}).");
+                throw new \InvalidArgumentException(
+                    "Maximum image width ({$maximumImageWidth}) cannot be smaller than minimum image width ({$minimumImageWidth}) for field '{$this->getId()}'."
+                );
             }
         }
 
@@ -628,19 +642,23 @@ class UploadFormField extends AbstractFormField
     public function minimumImageHeight($minimumImageHeight = null)
     {
         if (!$this->isImageOnly()) {
-            throw new \LogicException("The form field must be image only, to set a minimum image height.");
+            throw new \LogicException(
+                "The field '{$this->getId()}' must be image only to set a minimum image height."
+            );
         }
 
         if ($minimumImageHeight !== null) {
             if (!\is_numeric($minimumImageHeight)) {
                 throw new \InvalidArgumentException(
-                    "Given minimum image height is no int, '" . \gettype($minimumImageHeight) . "' given."
+                    "Given minimum image height is no int, '" . \gettype($minimumImageHeight) . "' given for field '{$this->getId()}'."
                 );
             }
 
             $maximumImageHeight = $this->getMaximumImageHeight();
             if ($maximumImageHeight !== null && $minimumImageHeight > $maximumImageHeight) {
-                throw new \InvalidArgumentException("Minimum image height ({$minimumImageHeight}) cannot be greater than maximum image height ({$maximumImageHeight}).");
+                throw new \InvalidArgumentException(
+                    "Minimum image height ({$minimumImageHeight}) cannot be greater than maximum image height ({$maximumImageHeight}) for field '{$this->getId()}'."
+                );
             }
         }
 
@@ -673,19 +691,23 @@ class UploadFormField extends AbstractFormField
     public function maximumImageHeight($maximumImageHeight = null)
     {
         if (!$this->isImageOnly()) {
-            throw new \LogicException("The form field must be image only, to set a maximum image height.");
+            throw new \LogicException(
+                "The field '{$this->getId()}' must be image only to set a maximum image height."
+            );
         }
 
         if ($maximumImageHeight !== null) {
             if (!\is_numeric($maximumImageHeight)) {
                 throw new \InvalidArgumentException(
-                    "Given maximum image height is no int, '" . \gettype($maximumImageHeight) . "' given."
+                    "Given maximum image height is no int, '" . \gettype($maximumImageHeight) . "' given for field '{$this->getId()}'."
                 );
             }
 
             $minimumImageHeight = $this->getMinimumImageHeight();
             if ($minimumImageHeight !== null && $maximumImageHeight > $minimumImageHeight) {
-                throw new \InvalidArgumentException("Maximum image height ({$maximumImageHeight}) cannot be smaller than minimum image height ({$minimumImageHeight}).");
+                throw new \InvalidArgumentException(
+                    "Maximum image height ({$maximumImageHeight}) cannot be smaller than minimum image height ({$minimumImageHeight}) for field '{$this->getId()}'."
+                );
             }
         }
 
@@ -722,25 +744,25 @@ class UploadFormField extends AbstractFormField
         if (!$imageOnly) {
             if ($this->getMinimumImageWidth() !== null) {
                 throw new \InvalidArgumentException(
-                    "The form field must be image only, because a minimum image width is set."
+                    "The field '{$this->getId()}' must be image only, because a minimum image width is set."
                 );
             }
 
             if ($this->getMaximumImageWidth() !== null) {
                 throw new \InvalidArgumentException(
-                    "The form field must be image only, because a maximum image width is set."
+                    "The field '{$this->getId()}' must be image only, because a maximum image width is set."
                 );
             }
 
             if ($this->getMinimumImageHeight() !== null) {
                 throw new \InvalidArgumentException(
-                    "The form field must be image only, because a minimum image height is set."
+                    "The field '{$this->getId()}' must be image only, because a minimum image height is set."
                 );
             }
 
             if ($this->getMaximumImageHeight() !== null) {
                 throw new \InvalidArgumentException(
-                    "The form field must be image only, because a maximum image height is set."
+                    "The field '{$this->getId()}' must be image only, because a maximum image height is set."
                 );
             }
         }
@@ -777,7 +799,7 @@ class UploadFormField extends AbstractFormField
     {
         if (!$this->isImageOnly()) {
             throw new \BadMethodCallException(
-                'Allowing SVG images is only relevant, if the `imageOnly` flag is set to `true`.'
+                "Allowing SVG images is only relevant, if the `imageOnly` flag is set to `true` for field '{$this->getId()}'."
             );
         }
 
index b78e1b666ececf695b4a11557437b5269dcc0164..3a6e4bea3cca37a4a2154477cdc74b32c36f830b 100644 (file)
@@ -65,7 +65,7 @@ class AclFormField extends AbstractFormField implements IObjectTypeFormNode
     public function categoryName($categoryName)
     {
         if (!\is_string($categoryName) || !\preg_match('~^[A-z0-9\-\_]+(\.[A-z0-9\-\_]+)+$~', $categoryName)) {
-            throw new \InvalidArgumentException("Invalid category name given.");
+            throw new \InvalidArgumentException("Invalid category name given for field '{$this->getId()}'.");
         }
 
         $this->categoryName = $categoryName;
@@ -136,7 +136,7 @@ class AclFormField extends AbstractFormField implements IObjectTypeFormNode
 
         if ($this->objectID === null) {
             throw new \UnexpectedValueException(
-                "Cannot read object id from object of class '" . \get_class($object) . "'."
+                "Cannot read object id from object of class '" . \get_class($object) . "' for field '{$this->getId()}'."
             );
         }
 
index 76860d41d2e16c8c5b625a1feb819ae977e0cabf..503acbf4f0ec204225a0d2810cdc5b4586626226 100644 (file)
@@ -58,7 +58,7 @@ class LabelFormField extends AbstractFormField implements IObjectTypeFormNode
     public function getLabelGroup()
     {
         if ($this->labelGroup === null) {
-            throw new \BadMethodCallException("No label group has been set.");
+            throw new \BadMethodCallException("No label group has been set for field '{$this->getId()}'.");
         }
 
         return $this->labelGroup;
index ee531f3c74112553754ea5136f1e58149564dff7..c5b872d781f7a5a371a702fceddb3d99383cc65a 100644 (file)
@@ -55,12 +55,16 @@ class SingleMediaSelectionFormField extends AbstractFormField implements IImmuta
     {
         if ($this->media === null) {
             if (!$this->getValue()) {
-                throw new \BadMethodCallException("Cannot be media object if no valid media id is set as value.");
+                throw new \BadMethodCallException(
+                    "Cannot be media object if no valid media id is set as value for field '{$this->getId()}'."
+                );
             }
 
             $this->media = ViewableMedia::getMedia($this->getValue());
             if ($this->media === null) {
-                throw new \UnexpectedValueException("Cannot load media with id '{$this->getValue()}'.");
+                throw new \UnexpectedValueException(
+                    "Cannot load media with id '{$this->getValue()}' for field '{$this->getId()}'."
+                );
             }
         }
 
index c029c61c432d1843577a7cfdba8675f3d1636939..0773c4e9e2adb5b72c21a0629f36a542413fa52f 100644 (file)
@@ -94,7 +94,7 @@ class PollOptionsFormField extends AbstractFormField
                 ];
             } else {
                 throw new \InvalidArgumentException(
-                    "Given value array contains invalid value of type " . \gettype($pollOption) . "."
+                    "Given value array contains invalid value of type " . \gettype($pollOption) . " for field '{$this->getId()}'."
                 );
             }
         }
index ee4547f27d0d3f49de54d5e3c7bead1d644125ce..fe26f110b7ddb6a5b7807d9e61b26a45ff19b6e7 100644 (file)
@@ -5,6 +5,7 @@ namespace wcf\system\form\builder\field\tag;
 use wcf\data\IStorableObject;
 use wcf\data\tag\Tag;
 use wcf\system\form\builder\data\processor\CustomFormDataProcessor;
+use wcf\system\form\builder\exception\InvalidFormFieldValue;
 use wcf\system\form\builder\field\AbstractFormField;
 use wcf\system\form\builder\field\IAttributeFormField;
 use wcf\system\form\builder\field\TDefaultIdFormField;
@@ -79,12 +80,12 @@ class TagFormField extends AbstractFormField implements IAttributeFormField, IOb
 
             if ($objectID === null) {
                 throw new \UnexpectedValueException(
-                    "Cannot read object id from object of class '" . \get_class($object) . "'."
+                    "Cannot read object id from object of class '" . \get_class($object) . "' for field '{$this->getId()}'."
                 );
             }
 
             if ($this->getObjectType() === null) {
-                throw new \UnexpectedValueException("Missing taggable object type.");
+                throw new \UnexpectedValueException("Missing taggable object type for field '{$this->getId()}'.");
             }
 
             $languageIDs = [];
@@ -152,7 +153,7 @@ class TagFormField extends AbstractFormField implements IAttributeFormField, IOb
     public function value($value)
     {
         if (!\is_array($value)) {
-            throw new \InvalidArgumentException("Given value is no array, " . \gettype($value) . " given.");
+            throw new InvalidFormFieldValue($this, 'array', \gettype($value));
         }
 
         $stringTags = [];
@@ -165,7 +166,9 @@ class TagFormField extends AbstractFormField implements IAttributeFormField, IOb
                 }
 
                 if ($stringValues === false) {
-                    throw new \InvalidArgumentException("Given value array contains mixed values, all values have to be either strings or `" . Tag::class . "` objects.");
+                    throw new \InvalidArgumentException(
+                        "Given value array contains mixed values, all values have to be either strings or `" . Tag::class . "` objects for field '{$this->getId()}'."
+                    );
                 }
 
                 $stringTags[] = $tag;
@@ -175,13 +178,15 @@ class TagFormField extends AbstractFormField implements IAttributeFormField, IOb
                 }
 
                 if ($stringValues === true) {
-                    throw new \InvalidArgumentException("Given value array contains mixed values, all values have to be either strings or `" . Tag::class . "` objects.");
+                    throw new \InvalidArgumentException(
+                        "Given value array contains mixed values, all values have to be either strings or `" . Tag::class . "` objects for field '{$this->getId()}'."
+                    );
                 }
 
                 $stringTags[] = $tag->name;
             } else {
                 throw new \InvalidArgumentException(
-                    "Given value array contains invalid value of type " . \gettype($tag) . "."
+                    "Given value array contains invalid value of type " . \gettype($tag) . " for field '{$this->getId()}'."
                 );
             }
         }
index d34ad1fbb65facd63e597e34192a57d7ace79b1c..4ff159c8587745d1c88cb4070ccad64c3308429b 100644 (file)
@@ -39,7 +39,10 @@ class FormFieldValidator implements IFormFieldValidator
         // validate validation function
         $parameters = (new \ReflectionFunction($validator))->getParameters();
         if (\count($parameters) !== 1) {
-            throw new \InvalidArgumentException("The validation function must expect one parameter, instead " . \count($parameters) . " parameters are expected.");
+            throw new \InvalidArgumentException(
+                "The validation function must expect one parameter, instead " . \count($parameters)
+                . " parameters are expected for validator '{$id}'."
+            );
         }
         /** @var \ReflectionType $parameterType */
         $parameterType = $parameters[0]->getType();
@@ -54,7 +57,7 @@ class FormFieldValidator implements IFormFieldValidator
         ) {
             throw new \InvalidArgumentException(
                 "The validation function's parameter must be an instance of '" . IFormField::class . "', instead "
-                . @($parameterType === null ? 'any' : "'" . $parameterType . "'") . " parameter is expected."
+                . @($parameterType === null ? 'any' : "'" . $parameterType . "'") . " parameter is expected for validator '{$id}'."
             );
         }
 
index c1a3bf5a57abf3b8b6861cbc0451e502f4153a98..5b3fc4ff5a891e4f406588b757f34a14238374b0 100644 (file)
@@ -183,7 +183,7 @@ class WysiwygFormField extends AbstractFormField implements
     public function getQuoteData($index = null)
     {
         if (!$this->supportQuotes()) {
-            throw new \BadMethodCallException("Quotes are not supported.");
+            throw new \BadMethodCallException("Quotes are not supported for field '{$this->getId()}'.");
         }
 
         if ($index === null) {
@@ -191,7 +191,7 @@ class WysiwygFormField extends AbstractFormField implements
         }
 
         if (!isset($this->quoteData[$index])) {
-            throw new \InvalidArgumentException("Unknown quote data '{$index}'.");
+            throw new \InvalidArgumentException("Unknown quote data '{$index}' for field '{$this->getId()}'.");
         }
 
         return $this->quoteData[$index];
@@ -260,22 +260,24 @@ class WysiwygFormField extends AbstractFormField implements
                 $objectType
             ) === null
         ) {
-            throw new \InvalidArgumentException("Unknown message quote object type '{$objectType}'.");
+            throw new \InvalidArgumentException(
+                "Unknown message quote object type '{$objectType}' for field '{$this->getId()}'."
+            );
         }
 
         if (!\class_exists($actionClass)) {
-            throw new \InvalidArgumentException("Unknown class '{$actionClass}'");
+            throw new \InvalidArgumentException("Unknown class '{$actionClass}' for field '{$this->getId()}'.");
         }
         if (!\is_subclass_of($actionClass, IMessageQuoteAction::class)) {
             throw new \InvalidArgumentException(
-                "'{$actionClass}' does not implement '" . IMessageQuoteAction::class . "'."
+                "'{$actionClass}' does not implement '" . IMessageQuoteAction::class . "' for field '{$this->getId()}'."
             );
         }
 
         if (!empty($selectors)) {
             foreach (['container', 'messageBody', 'messageContent'] as $selector) {
                 if (!isset($selectors[$selector])) {
-                    throw new \InvalidArgumentException("Missing selector '{$selector}'.");
+                    throw new \InvalidArgumentException("Missing selector '{$selector}' for field '{$this->getId()}'.");
                 }
             }
         }
index 74bab019af3b25d0126c757d9b4cd4e4825999ff..0525248b2fcd8dbcbd939903b59faa15c1ad9299 100644 (file)
@@ -78,11 +78,11 @@ class WysiwygSmileyFormNode implements IFormChildNode
         foreach ($smilies as $smiley) {
             if (!\is_object($smiley)) {
                 throw new \InvalidArgumentException(
-                    "Given value array contains invalid value of type " . \gettype($smiley) . "."
+                    "Given value array contains invalid value of type " . \gettype($smiley) . " for field '{$this->getId()}'."
                 );
             } elseif (!($smiley instanceof Smiley)) {
                 throw new \InvalidArgumentException(
-                    "Given value array contains invalid object of class " . \get_class($smiley) . "."
+                    "Given value array contains invalid object of class " . \get_class($smiley) . " for field '{$this->getId()}'."
                 );
             }
         }