NotificationPreferences
TsgcHTMLComponent_NotificationPreferences: eine Tabelle mit einer Zeile pro Kategorie und einem Kontrollkästchen pro Kanal (In-App, Push, E-Mail), in Delphi, C++ Builder und .NET. Ihre Anwendung lädt und speichert die Werte.
TsgcHTMLComponent_NotificationPreferences: eine Tabelle mit einer Zeile pro Kategorie und einem Kontrollkästchen pro Kanal (In-App, Push, E-Mail), in Delphi, C++ Builder und .NET. Ihre Anwendung lädt und speichert die Werte.
Die Bibliothek speichert nichts. OnLoadPreferences fragt Ihre Anwendung nach den Werten eines Benutzers, OnSavePreferences übergibt zurück, was der Benutzer angekreuzt hat, und das dauerhafte Speichern ist Ihre Aufgabe. Die Werte sind name=value-Paare mit 1 oder 0, und jedes angebotene Paar ist immer vorhanden. Es funktioniert in jeder Edition.
TsgcHTMLComponent_NotificationPreferences (Unit sgcHTML_Component_NotificationPreferences)
Eine Tabelle: eine Zeile pro Kategorie, ein Kontrollkästchen pro Kanal und eine Schaltfläche zum Speichern
Delphi, C++ Builder, .NET
Fügen Sie Categories für alles, worüber ein Benutzer informiert werden kann, ein Element hinzu, beantworten Sie OnLoadPreferences aus Ihrem eigenen Speicher, speichern Sie in OnSavePreferences, was ankommt, und leiten Sie das gesendete Formular an ProcessAction weiter, wobei der Benutzer aus der Sitzung entnommen wird.
uses
sgcHTML_Session, sgcHTML_Component_NotificationPreferences;
var
oPrefs: TsgcHTMLComponent_NotificationPreferences;
begin
oPrefs := TsgcHTMLComponent_NotificationPreferences.Create(nil);
try
oPrefs.PreferencesID := 'prefs';
oPrefs.Title := 'How you want to hear about it';
oPrefs.SaveCaption := 'Save preferences';
with oPrefs.Categories.Add do
begin
Name := 'orders';
Caption := 'A new order arrives';
end;
with oPrefs.Categories.Add do
begin
Name := 'billing';
Caption := 'A payment fails';
end;
oPrefs.OnLoadPreferences := PrefsLoad;
oPrefs.OnSavePreferences := PrefsSave;
// the user comes from the session, never from the form
oPrefs.LoadPreferences(sgcHTMLRequestSession.UserID);
Response := oPrefs.HTML; // one row per category, one checkbox per channel
finally
oPrefs.Free;
end;
end;
// the application owns the values: one category.channel=1 or =0 per pair
procedure TMain.PrefsLoad(Sender: TObject; const aUserID: string;
aValues: TStrings);
begin
aValues.Add('orders.inapp=1');
aValues.Add('orders.push=0');
aValues.Add('orders.email=1');
end;
procedure TMain.PrefsSave(Sender: TObject; const aUserID: string;
aValues: TStrings);
var
i: Integer;
begin
// every offered pair is here, with 1 or 0
for i := 0 to aValues.Count - 1 do
MyStore.Save(aUserID, aValues.Names[i], aValues.Values[aValues.Names[i]] = '1');
end;
// in the message handler that receives the form the table posts
if oPrefs.ProcessAction(vUser, vAction, vPostedFields) then
oHTMX.PushFragment(vGuid, oPrefs.HTML);
// includes: sgcHTML_Session.hpp, sgcHTML_Component_NotificationPreferences.hpp
TsgcHTMLComponent_NotificationPreferences *oPrefs = new TsgcHTMLComponent_NotificationPreferences(NULL);
try
{
oPrefs->PreferencesID = "prefs";
oPrefs->Title = "How you want to hear about it";
oPrefs->SaveCaption = "Save preferences";
TsgcHTMLPreferenceCategory *orders = oPrefs->Categories->Add();
orders->Name = "orders";
orders->Caption = "A new order arrives";
TsgcHTMLPreferenceCategory *billing = oPrefs->Categories->Add();
billing->Name = "billing";
billing->Caption = "A payment fails";
oPrefs->OnLoadPreferences = PrefsLoad;
oPrefs->OnSavePreferences = PrefsSave;
// the user comes from the session, never from the form
oPrefs->LoadPreferences(sgcHTMLRequestSession()->UserID);
String html = oPrefs->HTML; // one row per category, one checkbox per channel
}
__finally
{
delete oPrefs;
}
// the application owns the values: one category.channel=1 or =0 per pair
void __fastcall TMain::PrefsLoad(TObject *Sender, const String aUserID,
TStrings *aValues)
{
aValues->Add("orders.inapp=1");
aValues->Add("orders.push=0");
aValues->Add("orders.email=1");
}
void __fastcall TMain::PrefsSave(TObject *Sender, const String aUserID,
TStrings *aValues)
{
// every offered pair is here, with 1 or 0
for (int i = 0; i < aValues->Count; i++)
MyStore->Save(aUserID, aValues->Names[i], aValues->Values[aValues->Names[i]] == "1");
}
// in the message handler that receives the form the table posts
if (oPrefs->ProcessAction(vUser, vAction, vPostedFields))
oHTMX->PushFragment(vGuid, oPrefs->HTML);
using esegece.sgcWebSockets;
var prefs = new TsgcHTMLComponent_NotificationPreferences();
prefs.PreferencesID = "prefs";
prefs.Title = "How you want to hear about it";
prefs.SaveCaption = "Save preferences";
var orders = prefs.Categories.Add();
orders.Name = "orders";
orders.Caption = "A new order arrives";
var billing = prefs.Categories.Add();
billing.Name = "billing";
billing.Caption = "A payment fails";
prefs.OnLoadPreferences += PrefsLoad;
prefs.OnSavePreferences += PrefsSave;
// the user comes from the session, never from the form
string user = sgcHTMLSessionHelpers.sgcHTMLRequestSession()?.UserID ?? "";
prefs.LoadPreferences(user);
string html = prefs.HTML; // one row per category, one checkbox per channel
// the application owns the values: one category.channel=1 or =0 per pair
void PrefsLoad(object sender, string userID, List<string> values)
{
values.Add("orders.inapp=1");
values.Add("orders.push=0");
values.Add("orders.email=1");
}
void PrefsSave(object sender, string userID, List<string> values)
{
// every offered pair is here, with 1 or 0
foreach (var line in values)
{
int eq = line.IndexOf('=');
myStore.Save(userID, line.Substring(0, eq), line.Substring(eq + 1) == "1");
}
}
// in the message handler that receives the form the table posts
if (prefs.ProcessAction(user, action, postedFields))
htmx.PushFragment(guid, prefs.HTML);
Die Member, die Sie am häufigsten verwenden.
Categories ist eine TsgcHTMLPreferenceCategories-Sammlung; jede TsgcHTMLPreferenceCategory hat einen Name, den stabilen Schlüssel, der in den Werten und als Name des Kontrollkästchens verwendet wird, und eine Caption, die der Benutzer liest und die beim Rendern maskiert wird. Eine leere Caption greift auf den Name zurück, und eine Kategorie mit leerem Name wird übersprungen. IndexOfName findet eine.
Channels legt fest, welche von ncInApp, ncPush und ncEmail eine Spalte erhalten, standardmäßig alle drei. Die Kanalnamen werden mit TsgcHTMLComponent_Notification geteilt, das Ihre Anwendung in OnGetChannel danach fragt, bevor es etwas ausliefert.
Werte sind name=value-Paare, eines pro angebotener Kategorie und Kanal: orders.inapp=1, orders.push=0, orders.email=1. Der Schlüssel besteht aus dem Name der Kategorie, einem Punkt und dem Kanalschlüssel inapp, push oder email. Ein Wert ist 1, wenn der Kanal eingeschaltet ist, und 0, wenn er ausgeschaltet ist. ValueKey(aCategory, aChannel) erzeugt den Schlüssel.
LoadPreferences(aUserID) leert Values und löst OnLoadPreferences(aUserID, aValues) aus: Füllen Sie aValues mit den category.channel=1-Zeilen dieses Benutzers. Values ist eine schreibgeschützte Sicht auf das, was dargestellt wird oder zuletzt gespeichert wurde. Ein Paar, das Sie weglassen, wird ohne Häkchen angezeigt.
OnSavePreferences(aUserID, aValues) erhält jedes angebotene Paar mit seinem neuen Wert, sodass Ihre Anwendung nie raten muss, was ein fehlender Schlüssel bedeutete. SavePreferences(aUserID, aPosted) nimmt das Formular so, wie es ankam, wobei nur die angekreuzten Kästchen vorhanden sind, und ProcessAction(aUserID, aAction, aPosted) leitet es weiter und gibt False zurück, wenn die Aktion nicht prefsSave ist.
Das Formular zum Speichern wird als vom Client gesendete Daten übertragen, daher wird keine Benutzer-ID in das Markup geschrieben, und alles, was eine Kategorie oder einen Kanal benennt, den die Komponente nicht anbietet, wird ignoriert. Ein gefälschtes Formular kann die Menge der Einstellungen nicht erweitern. Die Komponente erzwingt keine Autorisierung: Entnehmen Sie den handelnden Benutzer der Sitzung der Anfrage (sgcHTMLRequestSession), nie dem Formular.
IsChecked(aCategory, aChannel) gibt an, ob ein Paar eingeschaltet ist, SetChecked(aCategory, aChannel, aValue) schreibt 1 oder 0 in Values, und IsOffered(aCategory, aChannel) ist True, wenn die Kategorie existiert und der Kanal eine Spalte hat.
PreferencesID ist die ID des Wurzelelements und der im Feld prefs gesendete Wert, sodass eine Seite mit mehreren Tabellen weiß, welche geantwortet hat. Title, SaveCaption und EmptyText legen die Texte fest, und ShowSave (standardmäßig aktiviert) zeigt die Schaltfläche an. Das Formular sendet prefsSave als data-sgc-ws-send-Formular, mit je einem Feld category.channel, das pro angekreuztem Kästchen auf 1 gesetzt ist.
Die Unit kompiliert, wenn SGC_HTML definiert ist, was sgcVer.inc für Android und iOS nicht tut. Sie funktioniert in jeder Edition, und sgcHTML ist ein eigenständiges Paket, das unabhängig von sgcWebSockets verkauft wird. Das Push-Kontrollkästchen hält nur eine Auswahl fest: Für die Zustellung eines Push wird WebPush benötigt, das nur in den Editionen Enterprise und All-Access verfügbar ist.
Die Benachrichtigungen selbst zeigt NotificationInbox an, und Notification entscheidet, ob ein Benutzer in der Seite oder per Push benachrichtigt wird.
| Online-HilfeVollständige API-Referenz und Verwendungshandbuch für diese Komponente. | Öffnen | |
| Alle sgcHTML-KomponentenDurchsuchen Sie die vollständige Funktionsmatrix von über 80 Komponenten. | Öffnen | |
| Kostenlose Testversion herunterladenDie 30-Tage-Testversion enthält die 60.HTML-Demoprojekte, darunter 17.FieldService, das die Einstellungstabelle verwendet. | Öffnen | |
| PreiseSingle-, Team- und Site-Lizenzen mit vollständigem Quellcode. | Öffnen |