Creazione e modifica dell'albero dei moduli XFA
TXFAWidgetRuntime supporta la creazione, la clonazione e la modifica transazionale tramite JavaScript dell'albero dei moduli vivo attraverso xfa.form e le collezioni di nodi
L'albero dei moduli vivo ha identità native indipendenti e può essere salvato come pacchetto modulo XDP senza modificare il template autoriale
Creazione e inserimento di un campo
var row = xfa.resolveNode("row[1]");
var field = xfa.form.createNode("field", "additional");
row.nodes.append(field);
field.w = "160pt";
field.h = "24pt";
field.ui.getElement("textEdit");
field.font.typeface = "DejaVu Sans";
field.rawValue = "Additional value";
createNode(className, name, namespaceURI) restituisce un nodo staccato, con nome vuoto e namespace del modello usati quando gli argomenti opzionali sono omessi
Le classi accettate includono field, subform, draw, area, exclGroup e le classi di proprietà riconosciute dallo schema di proprietà del runtime
Creare un nodo non lo inserisce nel modulo né crea un widget visibile finché non viene attaccato con le proprietà richieste di UI e valore
Operazioni sulle collezioni e clonazione
| Operazione | Comportamento |
|---|---|
parent.nodes.append(node) | Sposta un nodo staccato o attaccato alla fine della collezione di figli vivi del genitore |
parent.nodes.insert(node, before) | Sposta il nodo immediatamente prima di un figlio esistente dello stesso genitore |
parent.nodes.remove(node) | Stacca un figlio conservando la sua identità di script per un riuso successivo |
node.clone(true) | Restituisce un clone profondo staccato con identità native e di script separate |
node.clone(false) | Restituisce un clone superficiale staccato senza nodi figli né valore di campo copiato |
L'ordine della collezione, parent, la ricerca delle proprietà e la risoluzione SOM supportata riflettono le modifiche riuscite immediatamente dentro l'evento
I riferimenti trattenuti dagli oggetti script continuano a indirizzare i propri nodi dopo una modifica confermata o un rollback dell'evento, inclusi cloni profondi e superficiali staccati
Un ciclo, un nodo figlio di riferimento di un altro genitore o un nodo del modello di dati passato a un'operazione del modulo sollevano un'eccezione prima che quell'operazione non valida cambi l'albero
La radice del modello del modulo può contenere subform e campi appena creati, ma la radice del modello stessa non può essere spostata o clonata
Ambiti ripetuti e istanze iniziali
Le istanze di modulo effettive conservano identità separate anche quando i loro nomi autoriali sono uguali, i loro contesti dati differiscono o non esiste un pacchetto datasets
Un merge vuoto usa il conteggio esplicito occur.initial, o occur.min quando initial è assente, e un max assente assume min per default
Per un merge vuoto, un conteggio iniziale fuori dal minimo e dal massimo è consentito, compreso zero copie iniziali
I subform annidati e senza nome conservano i propri percorsi di occorrenza, e materializzare queste istanze non sintetizza un pacchetto datasets
Queste regole di occorrenza seguono XML Forms Architecture 3.3, pagine stampate 339–345
Commit, rollback e output
Un evento riuscito applica il suo journal strutturale, ricostruisce i widget nativi e rende il modulo modificato disponibile per SaveToBytes e la creazione nativa automatica di PDF
Un'eccezione di script non intercettata, un commit nativo fallito o un budget di evento esaurito ripristina il documento originale, le identità dei widget e lo stato script trattenuto, così un evento successivo può riprovare
I budget esistenti di operazioni, nodi, profondità, byte, widget e tempo trascorso si applicano anche alla preparazione strutturale e al commit
Le istanze di modulo salvate possono essere ricaricate e passate a HPDFXFAWriteHeadlessPDF per creare campi PDF reali e stream di appearance con i byte dei font forniti
Ambito
Queste API modificano il modello di modulo vivo e il suo schema di proprietà supportato
La modifica generale di xfa.template, l'elaborazione completa dei choice subform-set, lo schema completo delle classi XFA e le combinazioni arbitrarie di selettori di binding restano capacità separate