CVars: bei Gültigkeitswechsel aktuellen Wert nicht speichern
authorMoritz Bunkus <m.bunkus@linet-services.de>
Thu, 18 Jul 2019 08:31:12 +0000 (10:31 +0200)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Thu, 18 Jul 2019 08:42:48 +0000 (10:42 +0200)
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.

SL/CVar.pm

index 37d865a..a905ede 100644 (file)
@@ -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();