Wartung der Abonnentenfelder - UpdateSubscriberFields

Wie auch beim Abonnentenimport, erfolgt dieser Web-Service Aufruf über die URL bzw. die Klasse ServiceAgent. Dieser ServiceAgent bietet verschiedene Methoden an, um das Auslesen der Abonnentenfelder, oder auch wie hier angeführt das Hinzufügen oder aktualisieren der Abonnentenfelder zu ermöglichen.
Zum Abrufen der Abonnentenfelder wird die Methode GetSubscriberFields verwendet. Dieses Dokument erläutert die Methode UpdateSubscriberFields, welche für die Aktualisierung, also das Hinzufügen und das Bearbeiten von Abonnentenfeldern ermöglicht.
Wie alle mailworx Web-Service Methoden, basiert auch diese Methode auf Request- und Response-Message, wobei die Request-Message alle für die Verarbeitung relevanten Daten beinhaltet. Die Response-Message beinhaltet alle Daten, die entsprechend zurückgegeben werden und die dazu nötigen Informationen wie z.B.: die vergebenen IDs, wurde ein Feld hinzugefügt oder aktualisiert und dergleichen.

Nachrichtenklassen

Das Request-Objekt:

Dieses Objekt beinhaltet alle Werte, die von mailworx verarbeitet werden sollen, also die Authentifizierungsdaten, oder auch konkreten Abonnentenfelder-Daten, sowie Verhaltensangaben. Die Verhaltensangaben bestimmen, wie sich mailworx verhalten soll, wenn Felder bereits vorhanden sind, oder eben nicht vorhanden sind.
Auch diese Request-Klasse leitete von SecureRequestMessage ab, welche die Authentifizierungsinformationen beinhaltet. Hierzu sei auf die Beschreibung des mailworx Abonnentenimport-Dokumentes verwiesen, welches sowohl die Verwendung, als auch die einzelnen Parameter genau spezifiziert.

 

UpdateSubscriberFieldsRequest beinhaltet somit ein Array mit den entsprechenden Abonnentenfeldern, welcher hinzugefügt/aktualisiert werden sollen. Field ist eine abstrakte Klasse, welche entsprechende Ableitungen für verschiedene Feldtypen besitzt. Eine konkrete Ausprägung, auf die detailierter eingegangen wird ist SelectionField. Hierzu später mehr.

Die Eigenschaft CreateMissingFields weißt mailworx an, dass Felder, die bisher nicht in mailworx vorhanden sind erzeugt werden. Die Identifikation erfolgt hier primär über den InternalName, welcher durch die Methode GetSubscriberFields in Erfahrung gebracht werden kann bzw. wird auch versucht über die entsprechende Bezeichnung (DisplayName) eine Übereinstimmung zu finden. Kann hier keine Übereinstimmung gefunden werden und die Eigenschaft CreateMissingFields ist auf FALSE gesetzt, so wird eine DoesNotExistException geworfen, sofern ein Feld nicht gefunden werden kann.

Die Eigenschaft DeleteMissingSelectionValues ermöglicht es, dass bei Auswahlen in mailworx (Ein- oder Mehrfachauswahlen), die zwar in mailworx, jedoch nicht in der Request-Message vorhanden sind, von mailworx entfernt werden. Ist diese Eigenschaft nicht gesetzt, so bleiben alle vorhandenen Auswahlmöglichkeiten in mailworx vorhanden.

Die Behandlung von Auswahlfeldern:

Ein Auswahlfeld (SelectionField) leitet von Field ab und kann somit der Request-Message übergeben werden.

 

Im Gegensatz zur Methode GetSubscriberFields unterstützt die Methode UpdateSubscriberFields zwei Möglichkeiten um die Selection Fields zu identifizieren bzw. zu verwalten.
Die Eigenschaft Selections bietet ein String-Array mit den verschiedenen Auswahlmöglichkeiten. Im Falle einer Mehrsprachigkeit oder wenn der Interne Name als Identifizierung für die Umbenennung von Feldern benötigt wird, ist es jedoch erforderlich SelectionObjects zu verwenden. Die Methode GetSubscriberFields unterstützt dies nicht und liefert hier lediglich einen Null-Wert.
Für den Fall das die Eigenschaft SelectionObjects gesetzt ist, wird die Eigenschaft Selections ignoriert.
SelectionObjects ist ein Array aus SelectionFieldElement, welche nun die Bezeichnung einer Auswahl, den internen Namen (InternalName) und die Sprache für diese Bezeichnung des Feldes besitzt.
Die Identifikation der Auswahl ist gleich wie bei den Feldern, also der InternalName bzw. die Caption in der entsprechenden Sprache.
Ist der InternalName nicht gesetzt, so wird ein Interner Name durch die Caption berechnet.
Ist die Language-Eigenschaft NULL, so wird die Sprache vom Request-Objekt verwendet. Die Language ist hier notwendig, wenn ein Feld in verschiedenen Sprachen aktualisiert werden soll. Dann kann das SelectionFieldElement mehrmals vorkommen und zwar mit verschiedenen Caption-Werten und verschiedenen Language-Werten. Der InternalName muss zur Identifikation gleich sein!

Codebeispiel:

Ein C# Codebeispiel zur Veranschaulichung der Verwendung:
Variante1: Verwendung der Eigenschaft Selections

UpdateSubscriberFieldsRequest request = new UpdateSubscriberFieldsRequest();
request.CreateMissingFields = true;
request.DeleteMissingSelectionValues = true;
request.SecurityContext = GetSecurityContext();
request.Language = "DE";
List<Field> fieldsToUpdate = new List<Field>();
TextField fld1 = new TextField();
fld1.DisplayName = "MyFirstTextField";
fld1.UntypedValue = "This is the default value of the field";
SelectionField fld2 = new SelectionField();
fld2.DisplayName = "MyWebService Automarke deutsch";
fld2.InternalName = "mywebserviceautomarke";
fld2.Selections = new String[] { "Audi", "Mazda", "BMW", "Skoda", "Merzedes", "Sonstige" };
fieldsToUpdate.Add(fld1);
fieldsToUpdate.Add(fld2);
request.Fields = fieldsToUpdate.ToArray();
UpdateSubscriberFieldsResponse response = agent.UpdateSubscriberFields(request);
…

Hier warden zwei Felder an den Webservice geschickt: 1) Ein Textfeld mit der Bezeichnung „MyFirstTextField“. Der interne Name wird automatisch berechnet. Sollte dieser gesetzt werden, so ist empfohlen, diesen aus GetSubscriberFields() erst auszulesen.
Des weiteren wird eine Auswahl mit dem Internen Namen „mywebserviceautomarke“ gesendet. Die Auswahlmöglichkeiten werden in der Sprache Deutsch angelegt, da die Request Nachricht als Deutsch spezifiziert wurde.
Variante 2: Verwendung der Eigenschaft SelectionObjects:

UpdateSubscriberFieldsRequest request = new UpdateSubscriberFieldsRequest();
request.CreateMissingFields = true; 
request.DeleteMissingSelectionValues = true; 
request.SecurityContext = GetSecurityContext(); 
request.Language = "DE"; 
List<Field> fieldsToUpdate = new List<Field>();
TextField fld1 = new TextField(); 
fld1.DisplayName = "MyFirstTextField"; 
fld1.UntypedValue = "This is the default value of the field"; 
fld1.InternalName = "myfirsttextfield";
SelectionField fld2 = new SelectionField(); 
fld2.DisplayName = "MyWebService Automarke deutsch"; 
fld2.InternalName = "mywebserviceautomarke"; 
List<SelectionFieldElement> elems = new List<SelectionFieldElement>(); 
elems.Add(GetNewSelectionFieldElement("Audi", "audi", request.Language)); 
elems.Add(GetNewSelectionFieldElement("Mazda", null, null)); 
elems.Add(GetNewSelectionFieldElement("BMW", "bmw", null)); 
elems.Add(GetNewSelectionFieldElement("Merzedes", null, request.Language)); 
elems.Add(GetNewSelectionFieldElement("Sonstige", "sonstige", "DE")); 
elems.Add(GetNewSelectionFieldElement("Other", "sonstige", "EN"));
fld2.SelectionObjects = elems.ToArray();
fieldsToUpdate.Add(fld1); 
fieldsToUpdate.Add(fld2);
request.Fields = fieldsToUpdate.ToArray(); 
UpdateSubscriberFieldsResponse response = agent.UpdateSubscriberFields(request);
private static SelectionFieldElement GetNewSelectionFieldElement(string caption, string internalName, string language) { 
SelectionFieldElement elem = new SelectionFieldElement(); 
elem.Caption = caption; 
elem.InternalName = internalName; 
elem.Language = language; 
return elem; 
}

Diese Variante verwendet die Option mit SelectionObjects, welche eine weitere Spezifikation von Auswahlen ermöglicht. Hier können für jedes Element optional die Bezeichnung, der Interne Name und die Sprache gesetzt werden. Durch die zwei Zeilen
elems.Add(GetNewSelectionFieldElement("Sonstige", "sonstige", "DE"));
elems.Add(GetNewSelectionFieldElement("Other", "sonstige", "EN"));
ist ersichtlich, dass es bei dieser Option auch möglich ist, eine Auswahl in verschiedene Sprachen anzulegen bzw. zu aktualisieren.

Das Response Objekt

Als Rückgabewert des Web-Service Aufruf wird eine Instanz der UpdateSubscriberFieldsResponse Klasse zurückgegeben. Diese Klasse beinhaltet ein Array von Einträgen (UpdateSubscriberFieldResponseEntry), welche entsprechende Auskunft über die getätigte Aktion liefert.

Ist die Eigenschaft Created auf TRUE gesetzt, so wurde das Feld erzeugt. Die vergebene GUID des Feldes und der vergebene interne Name werden ebenfalls zurückgegeben.
Ist die Eigenschaft Created auf FALSE gesetzt, so wurde das Feld aktualisiert.
Tritt ein Fehler auf, so wird eine entsprechende Exception geworfen, und somit kommt es zu keinem Response beim Aufruf des Web-Service.