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

TXFAWidgetRuntime soporta creación, clonación y edición transaccional mediante JavaScript del árbol de formulario vivo a través de xfa.form y las colecciones de nodos

El árbol de formulario vivo tiene identidades nativas independientes y puede guardarse como un paquete de formulario XDP sin modificar la plantilla autoriada

Creación e inserción de 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 desvinculado, con un nombre vacío y el namespace del modelo usados cuando los argumentos opcionales se omiten

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 vincula con las propiedades requeridas de UI y valor

Operaciones de colección y clonación

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

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

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

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

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

Ámbitos repetidos e instancias iniciales

Las instancias de formulario reales retienen identidades separadas incluso cuando sus nombres autoriados son iguales, sus contextos de datos difieren o no existe un paquete datasets

Una fusión vacía usa el conteo explícito occur.initial, o occur.min cuando initial está ausente, y un max ausente toma min por defecto

Para una fusión vacía, un conteo inicial fuera del mínimo y el máximo está permitido, incluidas cero copias iniciales

Los subforms anidados y sin nombre retienen sus propias rutas de ocurrencia, y materializar estas instancias no sintetiza un paquete datasets

Estas reglas de ocurrencia 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 el formulario editado disponible para SaveToBytes y la creación nativa automática de PDF

Una excepción de script no capturada, un commit nativo fallido o un presupuesto de evento agotado restaura el documento original, las identidades de widgets y el estado de script 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 el commit

Las instancias de formulario guardadas pueden recargarse y pasarse a HPDFXFAWriteHeadlessPDF para crear campos PDF reales y streams de apariencia con los bytes de fuente suministrados

Alcance

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

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