Creazione dell'oggetto pagina Procedura guidata per i premi dei clienti
Il codice seguente aggiunge una pagina Procedura guidata per i premi dei clienti, che consente all'utente di accettare i termini d'uso e di attivazione dell'estensione.
La pagina è costituita dai seguenti passaggi:
Benvenuto: il passaggio di benvenuto ha una casella di controllo per le Condizioni per l'utilizzo che deve essere abilitata.
Attivazione: il passaggio di attivazione ha una casella di testo in cui è necessario immettere il codice di attivazione per la convalida. Un codice di attivazione valido per questa estensione di esempio è qualsiasi codice alfanumerico di 14 caratteri.
Fine: un passaggio che termina l'elaborazione della pagina.
È possibile usare un tipo PaginaNavigazione per creare una procedura guidata che assiste l'utente nella sequenza di passaggi necessari per completare un'attività.
L'esempio seguente è un esempio di codice che può essere usato per creare la pagina Procedura guidata per i premi dei clienti.
page 50100 "Customer Rewards Wizard"
{
// Specifies that this page will be a navigate page.
PageType = NavigatePage;
Caption = 'Customer Rewards assisted setup guide';
layout
{
area(content)
{
group(MediaStandard)
{
Caption = '';
Editable = false;
Visible = TopBannerVisible;
field("Media Reference"; MediaResourcesStandard."Media Reference")
{
ApplicationArea = All;
Editable = false;
ShowCaption = false;
}
}
group(FirstPage)
{
Caption = '';
Visible = FirstPageVisible;
group("Welcome")
{
Caption = 'Welcome';
Visible = FirstPageVisible;
group(Introduction)
{
Caption = '';
InstructionalText = 'This Customer Rewards extension is a sample extension. It adds rewards tiers support for Customers.';
Visible = FirstPageVisible;
field(Spacer1; '')
{
ApplicationArea = All;
ShowCaption = false;
Editable = false;
MultiLine = true;
}
}
group("Terms")
{
Caption = 'Terms of Use';
Visible = FirstPageVisible;
group(Terms1)
{
Caption = '';
InstructionalText = 'By enabling the Customer Rewards extension...';
Visible = FirstPageVisible;
}
}
group(Terms2)
{
Caption = '';
field(EnableFeature; EnableCustomerRewards)
{
ApplicationArea = All;
MultiLine = true;
Editable = true;
Caption = 'I understand and accept these terms.';
ToolTip = 'Click to confirm: I understand and accept these terms.';
trigger OnValidate();
begin
ShowFirstPage();
end;
}
}
}
}
group(SecondPage)
{
Caption = '';
Visible = SecondPageVisible;
group("Activation")
{
Caption = 'Activation';
Visible = SecondPageVisible;
field(Spacer2; '')
{
ApplicationArea = All;
ShowCaption = false;
Editable = false;
MultiLine = true;
}
group(ActivationMessage)
{
Caption = '';
InstructionalText = 'Enter your 14 digit activation code to continue';
Visible = SecondPageVisible;
field(Activationcode; ActivationCode)
{
ApplicationArea = All;
ShowCaption = false;
Editable = true;
}
}
}
}
group(FinalPage)
{
Caption = '';
Visible = FinalPageVisible;
group("ActivationDone")
{
Caption = 'You''re done!';
Visible = FinalPageVisible;
group(DoneMessage)
{
Caption = '';
InstructionalText = 'Click Finish to set up your rewards level and start using Customer Rewards.';
Visible = FinalPageVisible;
}
}
}
}
}
actions
{
area(Processing)
{
action(ActionBack)
{
ApplicationArea = All;
Caption = 'Back';
Enabled = BackEnabled;
Visible = BackEnabled;
Image = PreviousRecord;
InFooterBar = true;
trigger OnAction();
begin
NextStep(true);
end;
}
action(ActionNext)
{
ApplicationArea = All;
Caption = 'Next';
Enabled = NextEnabled;
Visible = NextEnabled;
Image = NextRecord;
InFooterBar = true;
trigger OnAction();
begin
NextStep(false);
end;
}
action(ActionActivate)
{
ApplicationArea = All;
Caption = 'Activate';
Enabled = ActivateEnabled;
Visible = ActivateEnabled;
Image = NextRecord;
InFooterBar = true;
trigger OnAction();
var
CustomerRewardsExtMgt: Codeunit "Customer Rewards Ext Mgt";
begin
if ActivationCode = '' then
Error('Activation code cannot be blank.');
if Text.StrLen(ActivationCode) <> 14 then
Error('Activation code must have 14 digits.');
if CustomerRewardsExtMgt.ActivateCustomerRewards(ActivationCode) then
NextStep(false)
else
Error('Activation failed. Please check the activation code you entered.');
end;
}
action(ActionFinish)
{
ApplicationArea = All;
Caption = 'Finish';
Enabled = FinalPageVisible;
Image = Approve;
InFooterBar = true;
trigger OnAction();
begin
FinishAndEnableCustomerRewards();
end;
}
}
}
trigger OnInit();
begin
LoadTopBanners();
end;
trigger OnOpenPage();
begin
Step := Step::First;
EnableControls();
end;
local procedure EnableControls();
begin
ResetControls();
case Step of
Step::First:
ShowFirstPage();
Step::Second:
ShowSecondPage();
Step::Finish:
ShowFinalPage();
end;
end;
local procedure NextStep(Backwards: Boolean);
begin
if Backwards then
Step := Step - 1
ELSE
Step := Step + 1;
EnableControls();
end;
local procedure FinishAndEnableCustomerRewards();
var
CustomerRewardsExtMgt: Codeunit "Customer Rewards Ext Mgt";
GuidedExperience: Codeunit "Guided Experience";
Info: ModuleInfo;
begin
NavApp.GetCurrentModuleInfo(Info);
GuidedExperience.CompleteAssistedSetup(ObjectType::Page,PAGE::"Customer Rewards Wizard");
CurrPage.Close();
CustomerRewardsExtMgt.OpenRewardsLevelPage();
end;
local procedure ShowFirstPage();
begin
FirstPageVisible := true;
SecondPageVisible := false;
FinishEnabled := false;
BackEnabled := false;
ActivateEnabled := false;
NextEnabled := EnableCustomerRewards;
end;
local procedure ShowSecondPage();
begin
FirstPageVisible := false;
SecondPageVisible := true;
FinishEnabled := false;
BackEnabled := true;
NextEnabled := false;
ActivateEnabled := true;
end;
local procedure ShowFinalPage();
begin
FinalPageVisible := true;
BackEnabled := true;
NextEnabled := false;
ActivateEnabled := false;
end;
local procedure ResetControls();
begin
FinishEnabled := true;
BackEnabled := true;
NextEnabled := true;
ActivateEnabled := true;
FirstPageVisible := false;
SecondPageVisible := false;
FinalPageVisible := false;
end;
local procedure LoadTopBanners();
begin
if MediaRepositoryStandard.GET('AssistedSetup-NoText-400px.png', FORMAT(CURRENTCLIENTTYPE))
then
if MediaResourcesStandard.GET(MediaRepositoryStandard."Media Resources Ref")
then
TopBannerVisible := MediaResourcesStandard."Media Reference".HASVALUE;
end;
var
MediaRepositoryStandard: Record "Media Repository";
MediaResourcesStandard: Record "Media Resources";
Step: Option First,Second,Finish;
ActivationCode: Text;
TopBannerVisible: Boolean;
FirstPageVisible: Boolean;
SecondPageVisible: Boolean;
FinalPageVisible: Boolean;
FinishEnabled: Boolean;
BackEnabled: Boolean;
NextEnabled: Boolean;
ActivateEnabled: Boolean;
EnableCustomerRewards: Boolean;
}
La sezione seguente descrive come si creerebbe in genere una pagina di procedura guidata per Business Central.
È possibile creare una pagina di procedura guidata in cinque passaggi:
Creazione di una nuova pagina.
Aggiunta dei passaggi.
Aggiunta della barra di spostamento.
Aggiunta di intestazioni di immagini.
Test della pagina.
Passaggio 1 - Creazione di una nuova pagina
Creare un nuovo file nell'estensione in Visual Studio Code e denominarlo CustomerRewardsWizard.Page.al.
Aggiungere il codice seguente alla pagina creata:
page 50100 Customer Rewards Wizard
{
// Specifies that this page will be a navigate page.
PageType = NavigatePage;
Caption = 'Customer Rewards assisted setup guide';
}
Una pagina di procedura guidata usa il tipo di pagina NavigatePage.
Passaggio 2 - Aggiunta dei passaggi
Creare il framework per i diversi passaggi della procedura guidata. Aggiungere una sezione di layout alla pagina che contiene quattro gruppi, come mostrato nello screenshot seguente.
Il primo gruppo conterrà le intestazioni delle immagini. Questo gruppo è descritto più in dettaglio in un passaggio successivo di questa procedura.
Il secondo, il terzo e l'ultimo gruppo sono denominati come segue:
PrimaPagina
SecondaPagina
UltimaPagina
È possibile usare altri nomi, ma il principio è creare un gruppo per ogni passaggio che deve risultare disponibile nella procedura guidata. È consigliabile di evitare un numero troppo elevato di passaggi; tre o quattro passaggi dovrebbero essere sufficienti.
Successivamente, aggiungere il codice seguente al gruppo PrimaPagina.
La visibilità di questi gruppi è stata definita con variabili booleane. In seguito, quando l'utente accederà alla procedura guidata usando i pulsanti forniti, si nasconderanno e mostreranno le pagine o i gruppi appropriati.
Nel gruppo SecondaPagina usare il codice seguente:
group(SecondPage)
{
Caption = '';
Visible = SecondPageVisible;
group("Activation")
{
Caption = 'Activation';
Visible = SecondPageVisible;
field(Spacer2; '')
{
ApplicationArea = All;
ShowCaption = false;
Editable = false;
MultiLine = true;
}
group(ActivationMessage)
{
Caption = '';
InstructionalText = 'Enter your 14 digit activation code to continue';
Visible = SecondPageVisible;
field(Activationcode; ActivationCode)
{
ApplicationArea = All;
ShowCaption = false;
Editable = true;
}
}
}
}
In questo gruppo si fornirà all'utente la possibilità di immettere il codice di attivazione per l'estensione Premi clienti.
Usare il codice seguente per il gruppo PaginaFinale:
group(FinalPage)
{
Caption = '';
Visible = FinalPageVisible;
group("ActivationDone")
{
Caption = 'You are done!';
Visible = FinalPageVisible;
group(DoneMessage)
{
Caption = '';
InstructionalText = 'Click Finish to set up your rewards level and start using Customer Rewards.';
Visible = FinalPageVisible;
}
}
}
La proprietà InstructionalText imposta il testo usato per le istruzioni nell'interfaccia utente. L'impostazione predefinita è una stringa vuota, a indicare che non vengono fornite istruzioni. In base al modello di assistenza utente per Business Central, le app dovrebbero applicare testo informativo per impostare guide al setup e pagine simili.
Passaggio 3 - Aggiunta della barra di spostamento
Per fare in modo che la pagina della procedura guidata appaia come una procedura guidata, è necessario aggiungere le azioni Avanti, Indietro e Fine.
Tutte le pagine contengono controlli di navigazione denominati azioni. In Business Central, le azioni sono visualizzate nella parte superiore di ogni pagina nella barra multifunzione. La sezione delle azioni della pagina descrive ciò che l'utente può fare in una pagina e deve essere concepita tenendo presenti le esigenze dell'utente quanto a supporto del processo.
È possibile usare il codice seguente per aggiungere la sezione delle azioni alla pagina della procedura guidata.
actions
{
area(Processing)
{
action(ActionBack)
{
ApplicationArea = All;
Caption = 'Back';
Enabled = BackEnabled;
Visible = BackEnabled;
Image = PreviousRecord;
InFooterBar = true;
trigger OnAction();
begin
NextStep(true);
end;
}
action(ActionNext)
{
ApplicationArea = All;
Caption = 'Next';
Enabled = NextEnabled;
Visible = NextEnabled;
Image = NextRecord;
InFooterBar = true;
trigger OnAction();
begin
NextStep(false);
end;
}
action(ActionActivate)
{
ApplicationArea = All;
Caption = 'Activate';
Enabled = ActivateEnabled;
Visible = ActivateEnabled;
Image = NextRecord;
InFooterBar = true;
trigger OnAction();
var
CustomerRewardsExtMgt: Codeunit "Customer Rewards Ext Mgt";
begin
if ActivationCode = '' then
Error('Activation code cannot be blank.');
if Text.StrLen(ActivationCode) <> 14 then
Error('Activation code must have 14 digits.');
if CustomerRewardsExtMgt.ActivateCustomerRewards(ActivationCode) then
NextStep(false)
else
Error('Activation failed. Please check the activation code you entered.');
end;
}
action(ActionFinish)
{
ApplicationArea = All;
Caption = 'Finish';
Enabled = FinalPageVisible;
Image = Approve;
InFooterBar = true;
trigger OnAction();
begin
FinishAndEnableCustomerRewards();
end;
}
}
}
Anche le proprietà abilitate e visibili di queste azioni sono impostate su variabili booleane. Il trigger OnAction di ogni azione chiamerà le seguenti funzioni:
NextStep(True)
NextStep(False)
FinishAndEnableCustomerRewards
Queste funzioni, o procedure, vengono create nella parte inferiore dell'oggetto pagina.
local procedure NextStep(Backwards: Boolean);
begin
if Backwards then
Step := Step - 1
ELSE
Step := Step + 1;
EnableControls();
end;
local procedure FinishAndEnableCustomerRewards();
var
CustomerRewardsExtMgt: Codeunit "Customer Rewards Ext Mgt";
GuidedExperience: Codeunit "Guided Experience";
Info: ModuleInfo;
begin
NavApp.GetCurrentModuleInfo(Info);
GuidedExperience.CompleteAssistedSetup(ObjectType::Page,PAGE::"Customer Rewards Wizard");
CurrPage.Close();
CustomerRewardsExtMgt.OpenRewardsLevelPage();
end;
local procedure EnableControls();
begin
ResetControls();
case Step of
Step::First:
ShowFirstPage();
Step::Second:
ShowSecondPage();
Step::Finish:
ShowFinalPage();
end;
end;
Aggiungere quindi il codice seguente:
trigger OnInit();
begin
LoadTopBanners();
end;
trigger OnOpenPage();
begin
Step := Step::First;
EnableControls();
end;
L'aggiunta di questo codice garantisce che, quando la pagina si inizializza e si apre, i banner vengano caricati e il primo passaggio diventi visibile.
Alla pagina vengono inoltre aggiunte le seguenti procedure.
local procedure ShowFirstPage();
begin
FirstPageVisible := true;
SecondPageVisible := false;
FinishEnabled := false;
BackEnabled := false;
ActivateEnabled := false;
NextEnabled := EnableCustomerRewards;
end;
local procedure ShowSecondPage();
begin
FirstPageVisible := false;
SecondPageVisible := true;
FinishEnabled := false;
BackEnabled := true;
NextEnabled := false;
ActivateEnabled := true;
end;
local procedure ShowFinalPage();
begin
FinalPageVisible := true;
BackEnabled := true;
NextEnabled := false;
ActivateEnabled := false;
end;
local procedure ResetControls();
begin
FinishEnabled := true;
BackEnabled := true;
NextEnabled := true;
ActivateEnabled := true;
FirstPageVisible := false;
SecondPageVisible := false;
FinalPageVisible := false;
end;
È possibile usare queste procedure per impostare le variabili booleane, che determinano quali gruppi sono visibili e quali azioni devono essere abilitate, a seconda della pagina in cui ci si trova attualmente nella procedura guidata.
Per queste procedure sarà necessaria anche la sezione var seguente, in cui si dichiarano alcune variabili globali.
var
MediaRepositoryStandard: Record "Media Repository";
MediaResourcesStandard: Record "Media Resources";
Step: Option First,Second,Finish;
ActivationCode: Text;
TopBannerVisible: Boolean;
FirstPageVisible: Boolean;
SecondPageVisible: Boolean;
FinalPageVisible: Boolean;
FinishEnabled: Boolean;
BackEnabled: Boolean;
NextEnabled: Boolean;
ActivateEnabled: Boolean;
EnableCustomerRewards: Boolean;
La proprietà InFooterBar determina se un'azione deve essere considerata come un'azione di uscita nella parte inferiore della pagina. In una pagina della procedura guidata, questa proprietà è impostata su true di modo che le azioni siano visualizzate nella parte inferiore della pagina della procedura guidata.
Passaggio 4 - Aggiunta di intestazioni di immagini
Le intestazioni di immagini vengono aggiunte come primo gruppo nella sezione layout della pagina:
group(MediaStandard)
{
Caption = '';
Editable = false;
Visible = TopBannerVisible;
field("Media Reference"; MediaResourcesStandard."Media Reference")
{
ApplicationArea = All;
Editable = false;
ShowCaption = false;
}
}
All'apertura della pagina, le immagini vengono recuperate dal database con la seguente funzione.
local procedure LoadTopBanners();
begin
if MediaRepositoryStandard.GET('AssistedSetup-NoText-400px.png', FORMAT(CURRENTCLIENTTYPE))
then
if MediaResourcesStandard.GET(MediaRepositoryStandard."Media Resources Ref")
then
TopBannerVisible := MediaResourcesStandard."Media Reference".HASVALUE;
end;
trigger OnInit();
begin
LoadTopBanners();
end;
trigger OnOpenPage();
begin
Step := Step::First;
EnableControls();
end;
Passaggio 5 - Test della pagina
Per testare la pagina della procedura guidata, è possibile distribuire il progetto usando la combinazione di tasti CTRL+F5. La maggior parte delle pagine della procedura guidata ha la stessa struttura e differiscono solo nel numero di passaggi che si desidera implementare e nella tabella di origine usata. Di conseguenza, si consiglia vivamente di creare i propri frammenti per accelerare lo sviluppo. Dopo aver acquisito familiarità con AL Language e una certa esperienza nello sviluppo di app, sarebbe utile creare procedure consigliate di sviluppo che tutti gli sviluppatori possono implementare. Queste procedure consigliate possono esistere sotto forma di frammenti di codice e modelli personalizzati.