Campos calculados en vivo
Calcula el valor de un campo del formulario en vivo en el navegador a medida que cambian otros campos, desde un producto simple hasta una suma sobre una tabla hija anidada.
set_formular()
->set_formular($targetField, $expression, $event = null, $watchFields = null) es un campo calculado en vivo del lado del cliente: cada vez que $event se dispara en cualquiera de los controles propios de $watchFields en el formulario abierto, se evalúa $expression y se escribe en $targetField. Cualquier nombre de campo suelto en $expression (por ejemplo, quantity) se sustituye automáticamente por el valor actual de ese campo - sin necesidad de análisis manual.
$xcrud->set_formular('total', 'quantity*price');
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
$targetField | string | - | El campo en el que se escribe el valor calculado; debe ser un campo editable en lista blanca |
$expression | string | - | Una expresión JS; los nombres de campo sueltos se sustituyen por su valor actual |
$event | ?string | null | Evento DOM que dispara el recálculo; null usa por defecto 'input' (recalcula en cada pulsación de tecla) |
$watchFields | ?string | null | Campos a observar, separados por comas; null detecta automáticamente todos los campos a los que hace referencia $expression |
$expression es JavaScript escrito por el desarrollador y de confianza - nunca está influenciado por datos de la petición/usuario, así que se envía al cliente sin firmar y se ejecuta directamente, no a través de un evaluador en sandbox.
Evento y lista de observación explícitos
Omite $event/$watchFields para el caso común anterior. Especifícalos cuando los campos a observar no sean simplemente "todos los campos que menciona la expresión", o para optar por un recálculo menos frecuente (por ejemplo, solo al perder el foco):
$xcrud->set_formular(
'email',
'"{firstName}".toLowerCase() + ".{lastName}@myoffice.com".toLowerCase();',
'onmouseout',
'firstName'
);
Escribir un valor calculado en un campo destino solo funciona para controles con un único valor plano (texto/textarea/número/fecha/fecha y hora/hora/contraseña/año/precio/un select único) - los campos booleano/radio/switch/checkboxes/multiselect/relación/subida no son compatibles como destino de fórmula.
Agregación sobre una tabla anidada
Una fórmula también puede agregar el propio campo de una tabla hija nested_table() directa, referenciado como childTableName.fieldName usando la sintaxis sum()/avg()/count()/min()/max():
$xcrud->set_formular('totalAmount', 'sum(orderdetails.priceEach)');
Esto recalcula totalAmount en vivo cada vez que cambian los datos de fila de la pestaña anidada "orderdetails" (carga inicial, o tras añadir/editar/eliminar una línea), mientras el formulario de edición del padre permanezca abierto. Solo actualiza el control destino del formulario abierto - no guarda por sí mismo la fila padre. Solo se admite un nivel de profundidad, y count() ignora fieldName (aún requerido para mantener una forma consistente childTable.field) - siempre cuenta filas. Consulta Resumen de tablas anidadas para configurar la propia tabla hija.