Always load object data for immutable form fields
authorTim Düsterhus <duesterhus@woltlab.com>
Tue, 31 Jan 2023 09:56:33 +0000 (10:56 +0100)
committerTim Düsterhus <duesterhus@woltlab.com>
Wed, 1 Mar 2023 14:07:20 +0000 (15:07 +0100)
commita7dd84bfaa5ef846ecd124a7fdf793f41942ad07
tree6aa71b4741be9f38ed273f602c7283b04ec29213
parent7d9f96f3857bd09920e8d11e1334690b57b5d5c3
Always load object data for immutable form fields

When reading the input values in immutable form fields are (correctly) skipped,
thus leaving whatever value was there in place. However when an existing object
is provided, the values will not be read from that object, thus resulting in
the default value (which is likely some empty value).

This is confusing and will actually result in bugs, because when validating
saving that default value will then be used.

Fix this by checking whether the field is immutable and then forcing the load
of the object data, even if loading is not requested (i.e. when the input is
non-empty).

I've opted to implement the check within the fields themselves, but it might
make more sense to implement it in FormDocument::updatedObject() directly,
possibly avoiding issues if some immutable field overrides updatedObject and
forgets the check.

There is an existing asymmetry anyway, because the loading of input values is
done in TFormParentNode::readValues() which is pulled into the FormDocument via
the trait, but the loading of object data is directly implemented in
FormDocument. The result of this is that nodes have deeper access to input
loading, compared to object loading. The readValues() method should likely be
removed from the trait and implemented in the document directly, like the
object loading. The method does not really belong on the nodes. This should be
evaluated in a follow-up issue and possibly the immutability check for object
loading then be moved into the FormDocument as well, as suggested above.

see https://www.woltlab.com/community/thread/294841-formbuilder-fehlverhalten-bei-nutzung-von-immutable/
Resolves #4725
wcfsetup/install/files/lib/system/form/builder/field/AbstractFormField.class.php
wcfsetup/install/files/lib/system/form/builder/field/TI18nFormField.class.php