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

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.

Klasa komponentu

TsgcHTMLComponent_NotificationPreferences (jednostka sgcHTML_Component_NotificationPreferences)

Renderuje

Tabela: jeden wiersz na kategorię, jedno pole wyboru na kanał i przycisk zapisu

Języki

Delphi, C++ Builder, .NET

Zaoferuj kategorie, wczytaj i zapisz wartości

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

Kluczowe właściwości i metody

Składniki, po które sięgasz najczęściej.

Kategorie

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.

Kanały

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

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.

Ładowanie

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.

Zapisywanie

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.

Sfałszowane formularze

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.

Odczyt jednego pola

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ę.

Wygląd i akcja

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.

Edycje

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.

Powiązane komponenty

Same powiadomienia są pokazywane przez NotificationInbox, a Notification decyduje, czy użytkownik jest powiadamiany na stronie, czy przez push.

Poznawaj dalej

Pomoc onlinePełna dokumentacja API i przewodnik użytkowania tego komponentu.
Wszystkie komponenty sgcHTMLPrzejrzyj pełną matrycę funkcji 80+ komponentów.
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.
CennikLicencje Single, Team i Site z pełnym kodem źródłowym.
Najkorzystniejsza oferta: All-AccessWszystkie produkty eSeGeCe, ze wsparciem Premium w cenie, już od €1,059 rocznie.
Zobacz cennik All-Access

Gotowy, aby zacząć?

Pobierz bezpłatną wersję próbną i zacznij budować interfejsy webowe w Delphi, C++ Builder i .NET.