Plugin CreateRowOnEmptyTablePlugin en Jitterbit App Builder
Resumen
Crea una nueva fila y la guarda en el objeto de datos si el evento de Filtro no devuelve ninguna fila.
Registro
El CreateRowOnEmptyTablePlugin es un plugin de acción para un evento a nivel de tabla. Debe registrarse para ejecutarse después del evento de Filtro. Debido a que el plugin altera el comportamiento del evento de Filtro intrínseco, debe registrarse en un objeto de datos, no en una tabla física.
Parámetros
Ninguno
Observaciones
El CreateRowOnEmptyTablePlugin determina si el evento de Filtro devolvió alguna fila. Si el evento de Filtro devolvió una o más filas, el plugin sale sin más procesamiento. De lo contrario, el plugin crea una nueva fila y la persiste en el objeto de datos.
El plugin crea una fila invocando el evento Nuevo. El evento Nuevo es responsable de aplicar criterios de enlace, así como de invocar las reglas predeterminadas del objeto de datos. En el contexto de una solicitud de página web, los criterios de enlace se derivan de los parámetros de la cadena de consulta de la URL. En otras palabras, la nueva fila se poblará con los valores de los parámetros de la cadena de consulta cuyos nombres coincidan con los nombres de las columnas del objeto de datos.
Después de invocar el evento Nuevo, el plugin invoca el evento Insertar del objeto de datos, persistiendo la fila en la tabla de destino. Los desarrolladores pueden registrar acciones en el evento Insertar para realizar un procesamiento adicional. Esto es importante porque el evento de Filtro es un evento a nivel de tabla y, por lo tanto, no admite acciones a nivel de fila como las reglas CRUD. En contraste, el evento Insertar es un evento a nivel de fila. Los eventos a nivel de fila admiten la mayoría de las acciones, incluidas las reglas CRUD.
Si el evento Insertar no tiene éxito porque una o más reglas de validación fallaron, el plugin sale sin más procesamiento. De lo contrario, el plugin verifica el alcance de cambio del evento Insertar para determinar si la fila debe ser actualizada. Si el alcance de cambio se establece en un valor diferente de "Ninguno", el plugin actualiza la fila. La operación de actualización invoca el evento de Filtro en la nueva fila.
Nota
Los desarrolladores deben considerar establecer el alcance de cambio del evento Insertar para activar una actualización si el objeto de datos contiene columnas calculadas o selecciona de múltiples tablas. Tales valores solo se resuelven mediante el evento de Filtro.
Finalmente, el complemento sale, devolviendo la fila recién creada. Dado que todo esto sucede dentro del contexto del evento de Filtro, el cliente web no está al tanto. En lo que respecta al cliente web, la fila siempre ha existido.
Uso
Imagina que un desarrollador quiere crear un enlace que agregue automáticamente un producto al carrito de compras del usuario. El enlace podría verse algo así:
https://example.com/Vinyl/app/Shop/AddToCart?ProductId=1234
En este ejemplo, el enlace abre la página AddToCart, pasando ProductId como criterio de enlace.
Supón que la fuente de datos contiene una tabla de Carrito que se ve algo así:
- CartId - Identificador único, clave primaria, generado automáticamente.
- ProductId - Entero, clave foránea a la tabla de Producto.
- Quantity - Entero.
- SessionId - Identificador único, identifica la sesión del usuario.
El desarrollador comienza creando un objeto de datos AddToCart que apunta a la tabla Carrito. El objeto de datos AddToCart selecciona todas las columnas de la tabla Carrito. Aunque no es técnicamente necesario, el desarrollador marca ProductId como una columna de enlace. Hacer esto asegura que ProductId esté presente antes de ejecutar el evento. El objeto de datos AddToCart está restringido de tal manera que los usuarios solo pueden ver los artículos del carrito que pertenecen a su sesión actual. La declaración mvSQL resultante podría verse algo así:
SELECT
C.CartId AS CartId,
C.ProductId AS ProductId,
C.Quantity AS Quantity,
C.SessionId AS SessionId
FROM Cart AS C
WHERE C.SessionId = session()
Ten en cuenta que CartId no necesita ser establecido explícitamente como predeterminado ya que se genera automáticamente. ProductId no se establece como predeterminado porque se obtendrá de los criterios de enlace.
Además del objeto de datos AddToCart, el desarrollador crea un objeto de datos llamado MyCart. Al igual que el objeto de datos AddToCart, el objeto de datos MyCart apunta y selecciona todas las columnas de la tabla Carrito. El objeto de datos MyCart también está restringido a la sesión actual. Sin embargo, el objeto de datos MyCart no tiene un evento de Filtro explícito. No utiliza el complemento CreateRowOnEmptyTablePlugin.
El desarrollador luego crea una página llamada AddToCart, registrando el objeto de datos AddToCart como el objeto de datos de la página. Luego, el desarrollador agrega un panel de múltiples filas a la página AddToCart. El panel de múltiples filas selecciona del objeto de datos MyCart. Además, el panel de múltiples filas está vinculado al objeto de datos de la página.
Nota
Binding a panel to the page ensures that the panel is not rendered until the page data object's Filter event executes.
El panel de múltiples filas contiene dos controles:
- Producto - Lista, vinculada a la columna ProductId. Selecciona de la tabla Product usando ProductId como clave y ProductName como título.
- Cantidad - Numérico, vinculado a la columna Quantity.
Ver la página sin proporcionar ningún criterio de vinculación resultará en un error.
Nota
At the time of writing, exceptions thrown while executing the page object's Filter event are not displayed on the screen. They will, however, appear in the log.
Si la cadena de consulta contiene un parámetro llamado ProductId con un valor válido, App Builder ejecutará el evento Filter del objeto de datos AddToCart, que a su vez ejecuta el plugin CreateRowOnEmptyTablePlugin. El plugin creará una nueva fila, insertándola en la tabla Cart. Después de que se ejecute el evento Filter del objeto de datos AddToCart, App Builder ejecutará el evento Filter del objeto de datos MyCart. Esto devolverá la nueva fila creada, mostrándola en el panel de múltiples filas.
El desarrollador podría realizar acciones adicionales cuando se inserte la nueva fila en la tabla Cart. Por ejemplo, el desarrollador podría registrar una regla CRAM que inserte una fila en la tabla Session si no existe. La declaración mvSQL podría verse así:
INSERT INTO Session
(
SessionId,
DateCreated
)
SELECT
SessionId,
DateCreated
FROM
(
SELECT
session() AS SessionId,
now() AS DateCreated
) AS SOURCE
WHERE NOT EXISTS
(
SELECT 1
FROM Session
WHERE
Session.SessionId = SOURCE.SessionId
AND Session.DateCreated = SOURCE.DateCreated
)
Esto permitiría al desarrollador programar un evento que elimine los carritos pertenecientes a sesiones expiradas.
Errores
Bucles infinitos
Debido a que el CreateRowOnEmptyTablePlugin invoca el evento Filter de manera recursiva, existe la posibilidad de un bucle infinito. Esto ocurriría si el desarrollador diseñara el objeto de datos de tal manera que no devolviera la nueva fila creada. Por ejemplo:
SELECT *
FROM Table
WHERE 1 = 0
App Builder protege contra esta situación. Si el evento Filter no encuentra la nueva fila al realizar una actualización, se lanza la siguiente excepción:
Bucle infinito detectado al crear una fila en una tabla vacía.
Seguridad
Cuando un navegador sigue un enlace, realiza una solicitud HTTP GET. Como regla general, una solicitud HTTP GET debería ser tanto segura como idempotente. Una solicitud HTTP es segura si no tiene efectos secundarios. Una solicitud HTTP es idempotente si realizar la misma solicitud una segunda vez devuelve el mismo resultado.
El plugin CreateRowOnEmptyTablePlugin es idempotente: actualizar la ventana del navegador no creará una segunda fila. Sin embargo, el plugin CreateRowOnEmptyTablePlugin no es seguro: el plugin crea una fila persistente en la base de datos. Esto es, por definición, un efecto secundario.
Los desarrolladores deben tener esto en cuenta, ya que una solicitud GET no segura puede ser explotada en un ataque de falsificación de solicitud entre sitios. Por esta razón, los desarrolladores deben evitar cualquier operación potencialmente destructiva, como registrar una regla de eliminación que se ejecute cuando se carga la página. Los desarrolladores también deben evitar registrar cualquier regla o plugin que interactúe con sistemas externos, como enviar un correo electrónico o realizar un pago.