NotificationPreferences
TsgcHTMLComponent_NotificationPreferences: tabela z jednym wierszem na kategorię i jednym polem wyboru na kanał (w aplikacji, push, e-mail), w Delphi, C++ Builder i .NET. Twoja aplikacja wczytuje i zapisuje wartości.
TsgcHTMLComponent_NotificationPreferences: tabela z jednym wierszem na kategorię i jednym polem wyboru na kanał (w aplikacji, push, e-mail), w Delphi, C++ Builder i .NET. Twoja aplikacja wczytuje i zapisuje wartości.
Biblioteka niczego nie przechowuje. OnLoadPreferences pyta Twoją aplikację o wartości jednego użytkownika, OnSavePreferences zwraca to, co użytkownik zaznaczył, a ich zapisanie należy do Ciebie. Wartości to pary name=value z 1 lub 0, a każda oferowana para jest zawsze obecna. Działa w każdej edycji.
TsgcHTMLComponent_NotificationPreferences (jednostka sgcHTML_Component_NotificationPreferences)
Tabela: jeden wiersz na kategorię, jedno pole wyboru na kanał i przycisk zapisu
Delphi, C++ Builder, .NET
Dodaj jeden element do Categories dla każdej rzeczy, o której użytkownik może być powiadamiany, odpowiedz na OnLoadPreferences z własnego magazynu, zapisz to, co nadejdzie, w OnSavePreferences, a odesłany formularz kieruj do ProcessAction z użytkownikiem pobranym z sesji.
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);
Składniki, po które sięgasz najczęściej.
Categories to kolekcja TsgcHTMLPreferenceCategories; każda TsgcHTMLPreferenceCategory ma Name, stabilny klucz używany w wartościach i jako nazwa pola wyboru, oraz Caption, czyli to, co czyta użytkownik, escapowane podczas renderowania. Pusty Caption jest zastępowany przez Name, a kategoria z pustym Name jest pomijana. IndexOfName znajduje jedną z nich.
Channels wybiera, które z ncInApp, ncPush i ncEmail dostają kolumnę, domyślnie wszystkie trzy. Nazwy kanałów są wspólne z TsgcHTMLComponent_Notification, który pyta o nie Twoją aplikację w OnGetChannel, zanim cokolwiek dostarczy.
Wartości to pary name=value, po jednej dla każdej oferowanej kategorii i kanału: orders.inapp=1, orders.push=0, orders.email=1. Klucz składa się z Name kategorii, kropki i klucza kanału inapp, push lub email. Wartość to 1, gdy kanał jest włączony, i 0, gdy jest wyłączony. ValueKey(aCategory, aChannel) buduje klucz.
LoadPreferences(aUserID) czyści Values i wywołuje OnLoadPreferences(aUserID, aValues): wypełnij aValues liniami category.channel=1 tego użytkownika. Values to widok tylko do odczytu tego, co jest renderowane, albo tego, co ostatnio zapisano. Pominięta para jest pokazywana jako niezaznaczona.
OnSavePreferences(aUserID, aValues) otrzymuje każdą oferowaną parę z jej nową wartością, więc Twoja aplikacja nigdy nie musi zgadywać, co oznaczał brakujący klucz. SavePreferences(aUserID, aPosted) przyjmuje formularz w takiej postaci, w jakiej nadszedł, gdzie obecne są tylko zaznaczone pola, a ProcessAction(aUserID, aAction, aPosted) go kieruje, zwracając False, gdy akcja nie jest prefsSave.
Zapisywany formularz podróżuje jako dane wysyłane przez klienta, więc w znacznikach nie zapisano żadnego identyfikatora użytkownika, a wszystko, co wskazuje kategorię lub kanał, których komponent nie oferuje, jest ignorowane. Sfałszowany formularz nie może poszerzyć zestawu preferencji. Komponent nie wymusza autoryzacji: weź działającego użytkownika z sesji żądania (sgcHTMLRequestSession), nigdy z formularza.
IsChecked(aCategory, aChannel) mówi, czy para jest włączona, SetChecked(aCategory, aChannel, aValue) zapisuje 1 lub 0 do Values, a IsOffered(aCategory, aChannel) ma wartość True, gdy kategoria istnieje, a kanał ma kolumnę.
PreferencesID to identyfikator elementu głównego i wartość odsyłana w polu prefs, dzięki czemu strona z kilkoma tabelami wie, która odpowiedziała. Title, SaveCaption i EmptyText ustawiają teksty, a ShowSave (domyślnie włączone) pokazuje przycisk. Formularz odsyła prefsSave jako formularz data-sgc-ws-send, z jednym polem category.channel ustawionym na 1 dla każdego zaznaczonego pola wyboru.
Jednostka kompiluje się, gdy zdefiniowane jest SGC_HTML, czego sgcVer.inc nie robi dla Androida i iOS. Działa w każdej edycji, a sgcHTML to samodzielny pakiet, sprzedawany niezależnie od sgcWebSockets. Pole wyboru push tylko zapisuje wybór: dostarczenie powiadomienia push wymaga WebPush, który jest dostępny tylko w edycjach Enterprise i All-Access.
Same powiadomienia są pokazywane przez NotificationInbox, a Notification decyduje, czy użytkownik jest powiadamiany na stronie, czy przez push.
| Pomoc onlinePełna dokumentacja API i przewodnik użytkowania tego komponentu. | Otwórz | |
| Wszystkie komponenty sgcHTMLPrzejrzyj pełną matrycę funkcji 80+ komponentów. | Otwórz | |
| Pobierz bezpłatną wersję próbną30-dniowa wersja próbna zawiera projekty demonstracyjne 60.HTML, w tym 17.FieldService, który używa tabeli preferencji. | Otwórz | |
| CennikLicencje Single, Team i Site z pełnym kodem źródłowym. | Otwórz |