Creación y edición del árbol de formularios XFA

TXFAWidgetRuntime soporta la creación, clonado y edición transaccional en JavaScript del árbol de formularios vivo a través de xfa.form y las colecciones de nodos

El árbol de formularios vivo tiene identidades nativas independientes y puede guardarse como packet de formulario XDP sin modificar el template del autor

Crear e insertar 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) devuelve un nodo separado, con nombre vacío y el namespace de modelo cuando se omiten los argumentos opcionales

Las clases aceptadas incluyen field, subform, draw, area, exclGroup y las clases de propiedades reconocidas por el esquema de propiedades del runtime

Crear un nodo no lo inserta en el formulario ni crea un widget visible hasta que se adjunta con las propiedades requeridas de UI y valor

Operaciones de colecciones y clonado

OperaciónComportamiento
parent.nodes.append(node)Mueve un nodo separado o adjunto al final de la colección viva de hijos del padre
parent.nodes.insert(node, before)Mueve el nodo inmediatamente antes de un hijo existente del mismo padre
parent.nodes.remove(node)Desprende un hijo reteniendo su identidad de script para reutilización posterior
node.clone(true)Devuelve un clon profundo separado con identidades nativas y de scripts independientes
node.clone(false)Devuelve un clon superficial separado sin nodos hijos ni valor de campo copiado

El orden de colecciones, parent, la búsqueda de propiedades y la resolución SOM soportada reflejan las ediciones exitosas inmediatamente dentro del evento

Las referencias retenidas por script objects siguen direccionando sus propios nodos tras una edición confirmada o un rollback de evento, incluidos los clones profundos y superficiales separados

Un ciclo, un nodo hijo de referencia de otro padre o un nodo del modelo de datos pasado a una operación de formulario lanzan una excepción antes de que esa operación inválida cambie el árbol

La raíz del modelo de formularios puede contener subforms y campos recién creados, pero la propia raíz del modelo no puede moverse ni clonarse

Ámbitos repetidos e instancias iniciales

Las instancias reales de formularios retienen identidades separadas incluso cuando sus nombres del autor son iguales, sus contextos de datos difieren o no existe packet de datasets

Un merge vacío usa el recuento explícito occur.initial, o occur.min cuando initial está ausente, y un max ausente usa por defecto min

Para un merge vacío, se permite un recuento inicial fuera del mínimo y máximo, incluidas cero copias iniciales

Los subforms anidados y sin nombre retienen sus propias rutas de aparición, y materializar estas instancias no sintetiza un packet de datasets

Estas reglas de aparición siguen XML Forms Architecture 3.3, páginas impresas 339–345

Commit, rollback y salida

Un evento exitoso aplica su journal estructural, reconstruye los widgets nativos y hace que el formulario editado esté disponible para SaveToBytes y la creación nativa automática de PDF

Una excepción de script no capturada, un fallo de commit nativo o un presupuesto de evento agotado restaura el documento original, las identidades de widgets y el estado de scripts retenido, de modo que un evento posterior pueda reintentar

Los presupuestos existentes de operación, nodos, profundidad, bytes, widgets y tiempo transcurrido también se aplican a la preparación estructural y al commit

Las instancias de formularios guardadas pueden recargarse y pasarse a HPDFXFAWriteHeadlessPDF para crear campos PDF y streams de appearance reales con bytes de fuentes suministrados

Alcance

Estas APIs editan el modelo de formularios vivo y su esquema de propiedades soportado

La edición general de xfa.template, el procesamiento completo de subform-sets de choice, el esquema completo de clases XFA y las combinaciones arbitrarias de selectores de binding siguen siendo capacidades aparte