01078: Fields reloaded on error do not return to user entered values.
Description: When the form reads values from a source, and is being reloaded due to an entry error, the user values are over-ridden by the values in the source file. Thus, select lists return to their original source file values, rather than retaining the values selected by the user.
Resolution: Use both source=Page and request=1 in one (:input default:) entry.
This is the fix for that:
Move this block:
if (@$args['request']) {
$req = array_merge($_GET, $_POST);
foreach($req as $k => $v){
if (!isset($InputValues[$k]))
$InputValues[$k] = htmlspecialchars(stripmagic($v), ENT_NOQUOTES);
}
}
Below the "if ($source) {" block.
Change the block to read override the source values (isset rather than !isset):
if (@$args['request']) {
$req = array_merge($_GET, $_POST);
foreach($req as $k => $v){
if (isset($InputValues[$k]))
$InputValues[$k] = htmlspecialchars(stripmagic($v), ENT_NOQUOTES);
}
}
Patch file below.
Left file: Original forms.php Right file: Modified forms.php 165,170c165 < if (@$args['request']) { < $req = array_merge($_GET, $_POST); < foreach($req as $k => $v) < if (!isset($InputValues[$k])) < $InputValues[$k] = htmlspecialchars(stripmagic($v), ENT_NOQUOTES); < } ---
>
181a177,183
> }
> }
> if (@$args['request']) {
> $req = array_merge($_GET, $_POST);
> foreach($req as $k => $v){
> if (isset($InputValues[$k]))
> $InputValues[$k] = htmlspecialchars(stripmagic($v),
ENT_NOQUOTES);
Thanks for opening a PITS entry. I have read your message in the list but it is wise to have it in PITS too, for the record. I have this on my priority todo list, I just need to find some time to create some working forms and test the thing, hopefully in the next couple of days. --Petko
I replied to your message in the mailing list [1], being unable to reproduce the bug. If the SVN version does have the bug, we'll investigate further. Petko March 11, 2009, at 04:21 PM
Resolution
The problem was that two separate lines were used to define defaults, which caused a conflict:
(:input pmform target="djg-test":)\ (:input default source=DaveG.FormsTest-Data:) (:input default request=1:)
The solution is to either use both request=1 and source=Page in the same 'input default' line:
(:input default source=DaveG.FormsTest-Data request=1:)
or place the (:input default request=1:) before the one with source=.