Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 83b3c64e

Von Moritz Bunkus vor fast 10 Jahren hinzugefügt

  • ID 83b3c64ecfdbcd1c3dc1e1586af1260bc0917aeb
  • Vorgänger 3b01b816
  • Nachfolger 65690235

CustomerVendor-Controller: Daten in Neu-Anzeige bei Fehler beibehalten

RDBO hat das Verhalten, dass bei einem neuen, noch nicht gespeicherten
Objekt die Methoden zum Hinzufügen von Relationship-Objekten (z.B. in
1:n-Beziehnungen wie $customer->add_contacts(…)) beim danach erfolgenden
Auslesen der Beziehung nicht zurückliefert. Das heißt, dass Folgendes
der Fall ist:

my $customer = SL::DB::Customer->new;
$customer->add_contacts(SL::DB::Contacts->new);
print scalar(@{ $customer->contacts || [] }); # Das hier gibt 0 aus

Existiert das Objekt hingegen schon, dann klappt das normal. Das Problem
kann man umgehen, indem man beim Anlegen des neuen Objektes die
Beziehungen explizit auf eine leere Array-Referenz setzt, damit der in
RDBO enthaltene Check an der Stelle greift.

Das betrifft den Workflow, wenn man Daten in den benutzerdefinierten
Variablen eingibt, auf Speichern drückt und kivitendo dann wegen eines
fehlgeschlagenen Checks die Maske erneut anzeigt.

Unterschiede anzeigen:

SL/Controller/CustomerVendor.pm
365 365
      }
366 366
    }) || die($db->error);
367 367

  
368
    $self->{contact} = SL::DB::Contact->new();
368
    $self->{contact} = $self->_new_contact_object;
369 369
  }
370 370

  
371 371
  $self->action_edit();
......
679 679
      $self->{cv} = SL::DB::Customer->new(id => $::form->{cv}->{id})->load();
680 680
    }
681 681
  } else {
682
    if ( $self->is_vendor() ) {
683
      $self->{cv} = SL::DB::Vendor->new();
684
    } else {
685
      $self->{cv} = SL::DB::Customer->new();
686
    }
682
    $self->{cv} = $self->_new_customer_vendor_object;
687 683
  }
688 684
  $self->{cv}->assign_attributes(%{$::form->{cv}});
689 685

  
......
735 731
  if ( $::form->{contact}->{cp_id} ) {
736 732
    $self->{contact} = SL::DB::Contact->new(cp_id => $::form->{contact}->{cp_id})->load();
737 733
  } else {
738
    $self->{contact} = SL::DB::Contact->new();
734
    $self->{contact} = $self->_new_contact_object;
739 735
  }
740 736
  $self->{contact}->assign_attributes(%{$::form->{contact}});
741 737

  
......
786 782
      die($::locale->text('Error'));
787 783
    }
788 784
  } else {
789
    $self->{contact} = SL::DB::Contact->new();
785
    $self->{contact} = $self->_new_contact_object;
790 786
  }
791 787
}
792 788

  
793 789
sub _create_customer_vendor {
794 790
  my ($self) = @_;
795 791

  
796
  if ( $self->is_vendor() ) {
797
    $self->{cv} = SL::DB::Vendor->new();
798
  } else {
799
    $self->{cv} = SL::DB::Customer->new();
800
  }
792
  $self->{cv} = $self->_new_customer_vendor_object;
801 793
  $self->{cv}->currency_id($::instance_conf->get_currency_id());
802 794

  
803 795
  $self->{note} = SL::DB::Note->new();
......
806 798

  
807 799
  $self->{shipto} = SL::DB::Shipto->new();
808 800

  
809
  $self->{contact} = SL::DB::Contact->new();
801
  $self->{contact} = $self->_new_contact_object;
810 802
}
811 803

  
812 804
sub _pre_render {
......
970 962
  );
971 963
}
972 964

  
965
sub _new_customer_vendor_object {
966
  my ($self) = @_;
967

  
968
  my $class  = 'SL::DB::' . ($self->is_vendor ? 'Vendor' : 'Customer');
969
  return $class->new(
970
    contacts         => [],
971
    shipto           => [],
972
    custom_variables => [],
973
  );
974
}
975

  
976
sub _new_contact_object {
977
  my ($self) = @_;
978

  
979
  return SL::DB::Contact->new(custom_variables => []);
980
}
981

  
973 982
1;

Auch abrufbar als: Unified diff