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: 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.
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.
TsgcHTMLComponent_NotificationPreferences (unit sgcHTML_Component_NotificationPreferences)
Een tabel: één rij per categorie, één selectievakje per kanaal en een opslaan-knop
Delphi, C++ Builder, .NET
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);
De members die je het vaakst gebruikt.
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.
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.
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.
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.
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.
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.
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.
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.
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.
De meldingen zelf worden getoond door NotificationInbox, en Notification beslist of een gebruiker in de pagina of via een push wordt ingelicht.
| Online helpVolledige API-referentie en gebruikshandleiding voor dit onderdeel. | Openen | |
| Alle sgcHTML-componentenBlader door de volledige functiematrix van 80+ componenten. | Openen | |
| Download gratis proefversieDe proefversie van 30 dagen bevat de 60.HTML-demoprojecten, waaronder 17.FieldService, dat de voorkeurentabel gebruikt. | Openen | |
| PrijzenSingle-, Team- en Site-licenties met volledige broncode. | Openen |