Saltar al contenido

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

CreateRowOnEmptyTablePlugin es un complemento de acción para un evento a nivel de tabla. Debe registrarse para ejecutarse después del evento Filter. Dado que el complemento modifica el comportamiento del evento Filter intrínseco, debe registrarse en un objeto de datos, no en una tabla física.

Parámetros

Ninguno

Observaciones

El complemento CreateRowOnEmptyTablePlugin determina si el evento Filter devolvió alguna fila. Si el evento Filter devolvió una o más filas, el complemento finaliza sin continuar el procesamiento. De lo contrario, el complemento crea una nueva fila y la persiste en el objeto de datos.

El complemento crea una fila invocando el evento "New". Este evento se encarga de aplicar los criterios de vinculación, así como de invocar las reglas predeterminadas del objeto de datos. En el contexto de una solicitud de página web, los criterios de vinculación se derivan de los parámetros de la cadena de consultar de la URL. En otras palabras, la nueva fila se rellenará con cualquier valor de parámetro de la cadena de consultar cuyos nombres coincidan con los nombres de las columnas del objeto de datos.

Tras invocar el evento "New", el complemento invoca el evento "Insert" del objeto de datos, persistiendo la fila en la tabla de destino. Los desarrolladores pueden registrar acciones en el evento "Insert" para realizar procesamiento adicional. Esto es importante porque el evento "Filtro" es un evento a nivel de tabla y, por lo tanto, no admite acciones a nivel de fila, como las reglas CRUD. En cambio, el evento "Insert" sí lo es. Los eventos a nivel de fila admiten la mayoría de las acciones, incluidas las reglas CRUD.

Si el evento Insert no se ejecuta correctamente debido a un fallo en una o más reglas de validación, el complemento finaliza sin continuar el procesamiento. De lo contrario, el complemento comprueba el alcance de cambio del evento Insert para determinar si la fila debe actualizarse. Si el alcance de cambio se establece en un valor distinto de "Ninguno", el complemento actualiza la fila. La operación de actualización invoca el evento Filtro en la nueva fila.

Nota

Los desarrolladores deberían considerar configurar el alcance de cambio del evento Insert para que active una actualización si el objeto de datos contiene columnas calculadas o selecciona datos de varias tablas. Estos valores solo se resuelven mediante el evento Filter.

Finalmente, el complemento finaliza y devuelve la fila recién creada. Dado que todo esto ocurre en el contexto del evento Filtro, el cliente web no lo detecta. Para el cliente web, la fila siempre existió.

Uso

Imaginemos que un desarrollador quiere crear un enlace que añada automáticamente un producto al carrito de compra del usuario. El enlace podría ser similar a esto:

https://example.com/App Builder/app/Shop/AddToCart?ProductId=1234

En este ejemplo, el enlace abre la página AddToCart y pasa ProductId como criterio de vinculación.

Supongamos que la fuente de datos contiene una tabla de carrito que se parece a esto:

  • CartId - Identificador único, clave principal, generado automáticamente.
  • ProductId - Entero, clave externa a la tabla Producto.
  • Cantidad - Entero.
  • SessionId - Identificador único, identifica la sesión del usuario.

El desarrollador comienza creando un objeto de datos AddToCart que apunta a la tabla Cart. Este objeto selecciona todas las columnas de la tabla Cart. Aunque técnicamente no es obligatorio, el desarrollador marca el ProductId como columna de enlace. Esto garantiza que el ProductId esté presente antes de ejecutar el evento. El objeto de datos AddToCart está restringido de modo que los usuarios solo puedan ver los artículos del carrito que pertenecen a su sesión actual. La sentencia mvSQL resultante podría ser similar a la siguiente:

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()

Tenga en cuenta que no es necesario establecer explícitamente el valor predeterminado de CartId, ya que se genera automáticamente. ProductId no se establece como predeterminado, ya que se obtendrá a partir de criterios de vinculación.

Además del objeto de datos AddToCart, el desarrollador crea un objeto de datos llamado MyCart. Al igual que AddToCart, MyCart selecciona todas las columnas de la tabla Cart. MyCart también está restringido a la sesión actual. Sin embargo, MyCart no tiene un evento Filter explícito. No utiliza el complemento CreateRowOnEmptyTablePlugin.

El desarrollador crea una página llamada AddToCart y registra el objeto de datos AddToCart como objeto de datos de página. A continuación, añade un panel multifila a la página AddToCart. Este panel multifila selecciona elementos del objeto de datos MyCart. Además, está vinculado al objeto de datos de página.

Nota

Vincular un panel a la página garantiza que este no se renderice hasta que se ejecute el evento Filtro del objeto de datos de la página.

El panel multifila contiene dos controles:

  • Producto - Lista, vinculado a la columna ProductId. Selecciona de la tabla Producto utilizando ProductId como clave y ProductName como título.

  • Cantidad - Numérico, vinculado a la columna Cantidad.

Ver la página sin proporcionar ningún criterio de vinculación generará un error.

Nota

Al momento de escribir este artículo, las excepciones lanzadas al ejecutar el evento Filtro del objeto de página no se muestran en pantalla. Sin embargo, aparecerán en el registro.

Si la cadena de consultar 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 complemento CreateRowOnEmptyTablePlugin. El complemento creará una nueva fila y la insertará en la tabla Cart. Tras la ejecución del evento Filter del objeto de datos AddToCart, App Builder ejecutará el evento Filter del objeto de datos MyCart. Esto devolverá la fila recién creada y la mostrará en el panel multifila.

El desarrollador podría realizar acciones adicionales al insertar la nueva fila en la tabla Cart. Por ejemplo, desarrollador registrar una regla CRAM que inserte una fila en la tabla Session si no existe. La sentencia mvSQL podría ser similar a esta:

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 vencidas.

Errores

Bucles infinitos

Dado que CreateRowOnEmptyTablePlugin invoca el evento Filter recursivamente, existe la posibilidad de un bucle infinito. Esto ocurriría si el desarrollador diseñara el objeto de datos de forma que no devolviera la fila recién creada. Por ejemplo:

SELECT *
FROM Table
WHERE 1 = 0

App Builder previene esta situación. Si el evento de filtro no encuentra la nueva fila al actualizar, se genera la siguiente excepción:

Se detectó un bucle infinito al crear una fila en una tabla vacía.

Seguridad

Cuando un navegador sigue un enlace, realiza una solicitud HTTP GET. Por regla general, una solicitud HTTP GET debe ser segura e idempotente. Una solicitud HTTP es segura si no tiene efectos secundarios. Una solicitud HTTP es idempotente si al realizar la misma solicitud una segunda vez se obtiene el mismo resultado.

El complemento CreateRowOnEmptyTablePlugin es complemento : al actualizar la ventana del navegador no se crea una segunda fila. Sin embargo, no es seguro: complemento 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 insegura puede ser explotada en un ataque de falsificación de solicitud entre sitios. Por ello, deben evitar cualquier operación potencialmente destructiva, como registrar una regla de eliminación que se ejecuta al cargar la página. También deben evitar registrar reglas o complementos que interactúen con sistemas externos, como el envío de correo o la realización de pagos.