Creazione dell'oggetto pagina Procedura guidata per i premi dei clienti

Completato

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:

  1. Creazione di una nuova pagina.

  2. Aggiunta dei passaggi.

  3. Aggiunta della barra di spostamento.

  4. Aggiunta di intestazioni di immagini.

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

Screenshot della sezione di layout della pagina.

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.

Screenshot del codice del 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.