NotificationPreferences

TsgcHTMLComponent_NotificationPreferences : un tableau avec une ligne par catégorie et une case à cocher par canal (dans l'application, push, e-mail), en Delphi, C++ Builder et .NET. Votre application charge et enregistre les valeurs.

TsgcHTMLComponent_NotificationPreferences

La bibliothèque ne stocke rien. OnLoadPreferences demande à votre application les valeurs d'un utilisateur, OnSavePreferences lui remet ce que l'utilisateur a coché, et c'est à vous de les conserver. Les valeurs sont des paires name=value avec 1 ou 0, et chaque paire proposée est toujours présente. Il fonctionne sur toutes les éditions.

Classe du composant

TsgcHTMLComponent_NotificationPreferences (unité sgcHTML_Component_NotificationPreferences)

Produit

Un tableau : une ligne par catégorie, une case à cocher par canal et un bouton d'enregistrement

Langages

Delphi, C++ Builder, .NET

Proposez les catégories, chargez et enregistrez les valeurs

Ajoutez un élément à Categories pour chaque sujet dont un utilisateur peut être informé, répondez à OnLoadPreferences depuis votre propre stockage, enregistrez ce qui arrive dans OnSavePreferences, et acheminez le formulaire envoyé vers ProcessAction avec l'utilisateur tiré de la session.

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

Propriétés & méthodes clés

Les membres que vous utilisez le plus souvent.

Catégories

Categories est une collection TsgcHTMLPreferenceCategories ; chaque TsgcHTMLPreferenceCategory a un Name, la clé stable utilisée dans les valeurs et comme nom de la case à cocher, et un Caption, que l'utilisateur lit et qui est échappé au rendu. Un Caption vide se rabat sur le Name, et une catégorie dont le Name est vide est ignorée. IndexOfName en trouve une.

Canaux

Channels choisit lesquels de ncInApp, ncPush et ncEmail obtiennent une colonne, les trois par défaut. Les noms de canaux sont partagés avec TsgcHTMLComponent_Notification, qui les demande à votre application dans OnGetChannel avant de livrer quoi que ce soit.

Les valeurs

Les valeurs sont des paires name=value, une par catégorie et canal proposés : orders.inapp=1, orders.push=0, orders.email=1. La clé est le Name de la catégorie, un point, et la clé de canal inapp, push ou email. Une valeur vaut 1 lorsque le canal est activé et 0 lorsqu'il est désactivé. ValueKey(aCategory, aChannel) construit la clé.

Chargement

LoadPreferences(aUserID) vide Values et déclenche OnLoadPreferences(aUserID, aValues) : remplissez aValues avec les lignes category.channel=1 de cet utilisateur. Values est une vue en lecture seule de ce qui est affiché, ou de ce qui a été enregistré en dernier. Une paire que vous omettez est affichée décochée.

Enregistrement

OnSavePreferences(aUserID, aValues) reçoit chaque paire proposée avec sa nouvelle valeur, de sorte que votre application n'a jamais à deviner ce que signifiait une clé absente. SavePreferences(aUserID, aPosted) prend le formulaire tel qu'il est arrivé, où seules les cases cochées sont présentes, et ProcessAction(aUserID, aAction, aPosted) l'achemine, en renvoyant False lorsque l'action n'est pas prefsSave.

Formulaires falsifiés

Le formulaire enregistré voyage sous forme de données envoyées par le client, de sorte qu'aucun identifiant d'utilisateur n'est écrit dans le balisage, et tout ce qui nomme une catégorie ou un canal que le composant ne propose pas est ignoré. Un formulaire falsifié ne peut pas élargir l'ensemble des préférences. Le composant n'applique aucune autorisation : prenez l'utilisateur qui agit dans la session de la requête (sgcHTMLRequestSession), jamais dans le formulaire.

Lire une case

IsChecked(aCategory, aChannel) indique si une paire est activée, SetChecked(aCategory, aChannel, aValue) écrit 1 ou 0 dans Values, et IsOffered(aCategory, aChannel) vaut True lorsque la catégorie existe et que le canal a une colonne.

Apparence et action

PreferencesID est l'identifiant de l'élément racine et la valeur envoyée dans le champ prefs, de sorte qu'une page avec plusieurs tableaux sait lequel a répondu. Title, SaveCaption et EmptyText définissent les textes, et ShowSave (activé par défaut) affiche le bouton. Le formulaire envoie prefsSave sous forme de formulaire data-sgc-ws-send, avec un champ category.channel défini à 1 par case cochée.

Éditions

L'unité se compile lorsque SGC_HTML est défini, ce que sgcVer.inc ne fait pas pour Android et iOS. Elle fonctionne sur toutes les éditions, et sgcHTML est un pack autonome, vendu indépendamment de sgcWebSockets. La case à cocher push ne fait qu'enregistrer un choix : livrer un push nécessite WebPush, qui n'est disponible que dans les éditions Enterprise et All-Access.

Composants associés

Les notifications elles-mêmes sont affichées par NotificationInbox, et Notification décide si un utilisateur est prévenu dans la page ou par un push.

Continuez l'exploration

Aide en ligneRéférence API complète et guide d’utilisation pour ce composant.
Tous les composants sgcHTMLParcourez la matrice complète des fonctionnalités de plus de 80 composants.
Télécharger la version d'essai gratuiteLa version d'essai de 30 jours fournit les projets de démonstration 60.HTML, dont 17.FieldService, qui utilise le tableau des préférences.
TarifsLicences Single, Team et Site avec code source complet.
Meilleur rapport qualité-prix : All-AccessTous les produits eSeGeCe, Support Premium inclus, à partir de €1,059/an.
Voir les tarifs All-Access

Prêt à démarrer ?

Téléchargez la version d'essai gratuite et commencez à créer des interfaces web en Delphi, C++ Builder et .NET.