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

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.

Komponentenklasse

TsgcHTMLComponent_NotificationPreferences (Unit sgcHTML_Component_NotificationPreferences)

Rendert

Eine Tabelle: eine Zeile pro Kategorie, ein Kontrollkästchen pro Kanal und eine Schaltfläche zum Speichern

Sprachen

Delphi, C++ Builder, .NET

Die Kategorien anbieten, die Werte laden und speichern

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);

Wichtige Eigenschaften & Methoden

Die Member, die Sie am häufigsten verwenden.

Kategorien

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.

Kanäle

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.

Die Werte

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.

Laden

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.

Speichern

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.

Gefälschte Formulare

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.

Ein Kästchen lesen

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.

Darstellung und Aktion

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.

Editionen

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.

Verwandte Komponenten

Die Benachrichtigungen selbst zeigt NotificationInbox an, und Notification entscheidet, ob ein Benutzer in der Seite oder per Push benachrichtigt wird.

Weiter entdecken

Online-HilfeVollständige API-Referenz und Verwendungshandbuch für diese Komponente.
Alle sgcHTML-KomponentenDurchsuchen Sie die vollständige Funktionsmatrix von über 80 Komponenten.
Kostenlose Testversion herunterladenDie 30-Tage-Testversion enthält die 60.HTML-Demoprojekte, darunter 17.FieldService, das die Einstellungstabelle verwendet.
PreiseSingle-, Team- und Site-Lizenzen mit vollständigem Quellcode.
Bestes Preis-Leistungs-Verhältnis: All-AccessAlle eSeGeCe-Produkte, inklusive Premium-Support, ab €1,059 pro Jahr.
All-Access-Preise ansehen

Bereit loszulegen?

Laden Sie die kostenlose Testversion herunter und beginnen Sie, Web-UIs in Delphi, C++ Builder und .NET zu erstellen.