NotificationPreferences

TsgcHTMLComponent_NotificationPreferences: een tabel met één rij per categorie en één selectievakje per kanaal (in app, push, e-mail), in Delphi, C++ Builder en .NET. Je applicatie laadt en bewaart de waarden.

TsgcHTMLComponent_NotificationPreferences

De bibliotheek slaat niets op. OnLoadPreferences vraagt je applicatie om de waarden van één gebruiker, OnSavePreferences geeft terug wat de gebruiker heeft aangevinkt, en het vastleggen ervan is jouw taak. De waarden zijn name=value-paren met 1 of 0, en elk aangeboden paar is altijd aanwezig. Het werkt op elke editie.

Componentklasse

TsgcHTMLComponent_NotificationPreferences (unit sgcHTML_Component_NotificationPreferences)

Rendert

Een tabel: één rij per categorie, één selectievakje per kanaal en een opslaan-knop

Talen

Delphi, C++ Builder, .NET

Bied de categorieën aan, laad en bewaar de waarden

Voeg voor elk onderwerp waarover een gebruiker kan worden ingelicht één item toe aan Categories, beantwoord OnLoadPreferences vanuit je eigen opslag, leg vast wat binnenkomt in OnSavePreferences, en routeer het geposte formulier naar ProcessAction met de gebruiker uit de sessie.

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

Belangrijkste eigenschappen en methoden

De members die je het vaakst gebruikt.

Categorieën

Categories is een TsgcHTMLPreferenceCategories-verzameling; elke TsgcHTMLPreferenceCategory heeft een Name, de stabiele sleutel die in de waarden en als naam van het selectievakje wordt gebruikt, en een Caption, wat de gebruiker leest en bij het renderen wordt geëscaped. Een lege Caption valt terug op de Name, en een categorie met een lege Name wordt overgeslagen. IndexOfName vindt er een.

Kanalen

Channels bepaalt welke van ncInApp, ncPush en ncEmail een kolom krijgen, standaard alle drie. De kanaalnamen worden gedeeld met TsgcHTMLComponent_Notification, dat je applicatie er in OnGetChannel om vraagt voordat het iets aflevert.

De waarden

Waarden zijn name=value-paren, één per aangeboden categorie en kanaal: orders.inapp=1, orders.push=0, orders.email=1. De sleutel is de Name van de categorie, een punt en de kanaalsleutel inapp, push of email. Een waarde is 1 wanneer het kanaal aan staat en 0 wanneer het uit staat. ValueKey(aCategory, aChannel) bouwt de sleutel.

Laden

LoadPreferences(aUserID) maakt Values leeg en roept OnLoadPreferences(aUserID, aValues) aan: vul aValues met de regels category.channel=1 van die gebruiker. Values is een alleen-lezen weergave van wat wordt gerenderd, of van wat het laatst is opgeslagen. Een paar dat je weglaat, wordt niet aangevinkt getoond.

Opslaan

OnSavePreferences(aUserID, aValues) ontvangt elk aangeboden paar met zijn nieuwe waarde, zodat je applicatie nooit hoeft te raden wat een ontbrekende sleutel betekende. SavePreferences(aUserID, aPosted) neemt het formulier zoals het binnenkwam, waarin alleen de aangevinkte vakjes aanwezig zijn, en ProcessAction(aUserID, aAction, aPosted) routeert het en geeft False terug wanneer de actie niet prefsSave is.

Vervalste formulieren

Het opgeslagen formulier reist als data die door de client wordt verstuurd, dus er wordt geen gebruikers-id in de markup geschreven, en alles wat een categorie of kanaal noemt dat het component niet aanbiedt, wordt genegeerd. Een vervalst formulier kan de set voorkeuren niet uitbreiden. Het component dwingt geen autorisatie af: neem de handelende gebruiker uit de sessie van het verzoek (sgcHTMLRequestSession), nooit uit het formulier.

Eén vakje lezen

IsChecked(aCategory, aChannel) geeft aan of een paar aan staat, SetChecked(aCategory, aChannel, aValue) schrijft 1 of 0 naar Values, en IsOffered(aCategory, aChannel) is True wanneer de categorie bestaat en het kanaal een kolom heeft.

Uiterlijk en actie

PreferencesID is de id van het hoofdelement en de waarde die in het veld prefs wordt gepost, zodat een pagina met meerdere tabellen weet welke heeft geantwoord. Title, SaveCaption en EmptyText bepalen de teksten, en ShowSave (standaard aan) toont de knop. Het formulier post prefsSave als data-sgc-ws-send-formulier, met per aangevinkt vakje één veld category.channel ingesteld op 1.

Edities

De unit compileert wanneer SGC_HTML is gedefinieerd, wat sgcVer.inc niet doet voor Android en iOS. Het werkt op elke editie, en sgcHTML is een zelfstandig pack, los van sgcWebSockets verkocht. Het push-selectievakje legt alleen een keuze vast: voor het afleveren van een push is WebPush nodig, dat alleen beschikbaar is in de Enterprise- en All-Access-edities.

Gerelateerde componenten

De meldingen zelf worden getoond door NotificationInbox, en Notification beslist of een gebruiker in de pagina of via een push wordt ingelicht.

Blijf ontdekken

Online helpVolledige API-referentie en gebruikshandleiding voor dit onderdeel.
Alle sgcHTML-componentenBlader door de volledige functiematrix van 80+ componenten.
Download gratis proefversieDe proefversie van 30 dagen bevat de 60.HTML-demoprojecten, waaronder 17.FieldService, dat de voorkeurentabel gebruikt.
PrijzenSingle-, Team- en Site-licenties met volledige broncode.
De beste deal: All-AccessElk eSeGeCe-product, inclusief Premium-ondersteuning, vanaf €1,059 per jaar.
Bekijk de All-Access-prijzen

Klaar om te beginnen?

Download de gratis proefversie en begin met het bouwen van web-UI's in Delphi, C++ Builder en .NET.