From: Moritz Bunkus Date: Thu, 18 Jul 2019 08:31:12 +0000 (+0200) Subject: CVars: bei Gültigkeitswechsel aktuellen Wert nicht speichern X-Git-Tag: release-3.5.4~28 X-Git-Url: http://wagnertech.de/git?a=commitdiff_plain;h=5a14cd3d08800753e92dd24208a6573eeaee2acc;p=kivitendo-erp.git CVars: bei Gültigkeitswechsel aktuellen Wert nicht speichern Wenn man in den Artikelstammdaten eine CVar von ungültig auf gültig umschaltet, so ist in dem Moment die CVar-Input im Formular nicht enthalten, sondern nur die Gültigkeits-Checkbox. Wenn dann im Backend der aktuelle Wert der CVar in die DB gespeichert wird, weil die CVar ja ab dem Moment gültig ist, so ist der Wert dementsprechend leer bzw. 0 für numerische Typen. Der Effekt ist, dass beim nächsten Laden der CVar ein Wert in der DB steht (leer/0), und dass dieser Wert vorausgewählt ist und nicht der Standardwert aus der Konfiguration. Daher sorgt diese Änderung dafür, dass in so einem Fall der aktuelle CVar-Wert schlicht gar nicht in die DB geschrieben wird. Genauer: Wenn das Speichern der Gültigkeit gewünscht wird, so wird der Wert nur dann geschrieben, wenn die CVar sowohl vor dem Speichern als auch nach dem Speichern gültig ist, sie also weder gerade aktiviert noch gerade deaktiviert wird. Andernfalls wird die CVar in der DB nicht vorhanden sein. --- diff --git a/SL/CVar.pm b/SL/CVar.pm index 37d865ae9..a905edee7 100644 --- a/SL/CVar.pm +++ b/SL/CVar.pm @@ -244,6 +244,29 @@ sub _save_custom_variables { my $sth = prepare_query($form, $dbh, $query); foreach my $config (@configs) { + if ($params{save_validity}) { + my $valid_index = "$params{name_prefix}cvar_$config->{name}$params{name_postfix}_valid"; + my $new_valid = $params{variables}{$valid_index} || $params{always_valid} ? 1 : 0; + my $old_valid = $self->get_custom_variables_validity(trans_id => $params{trans_id}, config_id => $config->{id}); + + $self->save_custom_variables_validity(trans_id => $params{trans_id}, + config_id => $config->{id}, + validity => $new_valid, + ); + + if (!$new_valid || !$old_valid) { + # When activating a cvar (old_valid == 0 && new_valid == 1) + # the input to hold the variable's value wasn't actually + # rendered, meaning saving the value now would only save an + # empty value/the value 0. This means that the next time the + # form is rendered, an existing value is found and used + # instead of the variable's default value from the + # configuration. Therefore don't save the values in such + # cases. + next; + } + } + my @values = (conv_i($config->{id}), "$params{sub_module}", conv_i($params{trans_id})); my $value = $params{variables}->{"$params{name_prefix}cvar_$config->{name}$params{name_postfix}"}; @@ -264,14 +287,6 @@ sub _save_custom_variables { } do_statement($form, $sth, $query, @values); - - if ($params{save_validity}) { - my $valid_index = "$params{name_prefix}cvar_$config->{name}$params{name_postfix}_valid"; - $self->save_custom_variables_validity(trans_id => $params{trans_id}, - config_id => $config->{id}, - validity => ($params{variables}{$valid_index} || $params{always_valid} ? 1 : 0) - ); - } } $sth->finish();