Een knop maken om een sectie toe te voegen en te verwijderen

In interactieve formulierontwerpen is het gebruikelijk dat het formulier een of meer secties bevat die pas worden weergegeven als de gebruiker de optie selecteert om de sectie in het formulier op te nemen. Met Designer kunt u een knop met een script toevoegen waarmee een bepaalde sectie (subformulier) van het formulier dynamisch wordt toegevoegd of verwijderd wanneer de gebruiker op deze knop klikt.

In het interactieve voorbeeldformulier Inkooporder kunnen gebruikers bijvoorbeeld op de knop Opmerkingen toevoegen klikken om de sectie Opmerkingen (subformulier comments) weer te geven. Afhankelijk van de status van het subformulier, bevat de knop een van de twee wisselende bijschriften: Opmerkingen toevoegen of Opmerkingen verwijderen. Telkens wanneer de gebruiker op de knop klikt, wordt via het script gecontroleerd of het subformulier comments wordt weergegeven en wordt het bijschrift van de knop dienovereenkomstig gewijzigd.

Als op de knop wordt geklikt, wordt een script geactiveerd waarbij gebruik wordt gemaakt van instanceManager, het XML-formulierobjectmodel waarmee het maken, verwijderen en verplaatsen van formulierobjecten wordt beheerd. Wanneer de eindgebruiker het subformulier comments verwijdert, verwijdert het instanceManager-object het subformulier uit het DOM (Document Object Model) en het gegevens-DOM.

Let op: door instanceManager worden vier methoden gebruikt: addInstance, removeInstance, moveInstance en setInstance. De gebruikelijke naamgeving van een instanceManager is de naam van het subformulier, voorafgegaan door een onderstrepingsteken (_naamvansubformulier). De syntaxis voor instanceManager is _naamvansubformulier.naamvanmethode ().

In het dynamisch interactieve voorbeeldformulier Inkooporder heeft de formulierauteur het volgende JavaScript-script in de Scripteditor getypt met de methode setInstances om het subformulier comments toe te voegen en te verwijderen en het bijschrift van de knop te wijzigen. Zoals u ziet, retourneert de eigenschap _comments.count == 0 het aantal subformulieren dat is geconcretiseerd.

// Invoke the Instance Manager to add and remove the comments subform. 
 
if (_comments.count == 0) {// The count property specifies the current number      
                                            // of instances instantiated. 
    _comments.setInstances(1);                                                // Add the comments subform. 
    this.resolveNode("caption.value.#text").value = "Clear Comments";                                                                                                            // Change the button's caption. 
} 
 
else { 
    _comments.setInstances(0);                                                // Remove the comments subform. 
    this.resolveNode("caption.value.#text").value = "Add Comments";                                                                                                            // Change the button's caption. 
}
U kunt ook het dialoogvenster Action Builder in het menu Opties openen om interactieve functies te maken in formulieren met een stroombare indeling, zonder dat u scripts hoeft te schrijven.

Knoppen voor toevoegen en verwijderen maken

Als u knoppen toevoegt aan een interactief formulier, biedt u eindgebruikers de mogelijkheid een handeling te starten, bijvoorbeeld het toevoegen en verwijderen van exemplaren van subformulieren die secties zoals itemregels in een bestelformulier definiëren.

U kunt ook knopinfo toevoegen aan de verwijderknop, zodat Item verwijderen wordt weergegeven wanneer de gebruiker de aanwijzer boven de knop plaatst. Het gebruik van afzonderlijke verwijderknoppen is een goede manier om de gebruikers de mogelijkheid te geven specifieke rijen uit het formulier te verwijderen.

Het interactieve voorbeeldformulier Inkooporder heeft bijvoorbeeld een knop Item toevoegen en een verwijderknop met het label X voor elk detailsubformulier. Als de gebruiker op de knop Item toevoegen klikt, wordt een itemregel toegevoegd via een script. Als de gebruiker op een van de verwijderknoppen klikt, wordt de bijbehorende itemregel verwijderd.

U kunt ook het dialoogvenster Action Builder in het menu Opties openen om interactieve functies te maken in formulieren met een stroombare indeling, zonder dat u scripts hoeft te schrijven. Zie Acties maken in formulieren.

Knop Item toevoegen

Met het volgende JavaScript-script in de click-gebeurtenis van de knop Item toevoegen kunnen gebruikers een itemregel toevoegen aan het interactieve voorbeeldformulier Inkooporder. Het formulier wordt door dit script ook opnieuw berekend waardoor het veld Totaal de nieuwe regel in de berekening bevat.

Aangezien gebruikers itemregels alleen toevoegen met de knop Item toevoegen, hoeft de minimumwaarde (voorvalwaarde) niet te worden gecontroleerd in het script.

// Invoke the Instance Manager to add one instance of the detail subform. 
_detail.addInstance(1); 
 
//Invoke the recalculate method to include the field values from the added subform in calculations. 
xfa.form.recalculate(1);

Knop Verwijderen

Met het volgende JavaScript-script in de click-gebeurtenis van de knop Verwijderen kunnen gebruikers met de knop Verwijderen een exemplaar van het detailsubformulier verwijderen uit het interactieve voorbeeldformulier Inkooporder. Het formulier wordt door dit script ook opnieuw berekend, waardoor het veld Totaal de verwijderde regel in de berekening niet meer bevat.

// Invoke the Instance Manager to remove the current instance of the detail subform. 
_detail.removeInstance(this.parent.index); 
 
// Invoke the recalculate method to update the form calculations. 
xfa.form.recalculate(1);

Aangezien de initiële minimale voorvalwaarde voor het detailsubformulier 2 is, moet het script de minimale voorvalwaarde verlagen om het voor de persoon die het formulier invult mogelijk te maken de twee itemregels te verwijderen die automatisch verschijnen wanneer het formulier wordt gegenereerd. Dit script is toegevoegd aan de gebeurtenis initialize van het detailsubformulier.

// Reset the minimum occurrence value of the detail subform. 
this.occur.min = "0";

Aangezien gebruikers in dit formulier alle exemplaren van het detailsubformulier kunnen verwijderen, moet door het script voor de gebeurtenis calculate van het veld Totaal (numTotal) worden gecontroleerd dat er ten minste één exemplaar van het veld numAmount voorkomt in het detailsubformulier. Anders treedt er een fout op, omdat bij de berekening geen exemplaar van het veld numAmount kan worden gevonden. Dit script is toegevoegd aan de gebeurtenis calculate van het veld numTotal.

// Verify at least one instance of the numAmount field exists. 
if (exists(detail[0].numAmount) == 1) then 
    Sum(detail[*].numAmount) 
endif