Crear un proveedor de widget
Un widget en Crono es una micro‑aplicación: un fragmento de interfaz que se inyecta en una zona de una página anfitriona sin tocar su vista. Un módulo puede registrar sus micro‑aplicaciones de forma programática mediante IMicroAplicacionProveedor, además del tag helper <microaplicacion> que se ve en Widgets.
Zonas
Las zonas son puntos de anclaje con nombre repartidos por las plantillas del núcleo (por ejemplo admin_boton_barraherramienta_antes). El conjunto de zonas conocidas se publica en /App_Data/zonasmicroaplicacion.json. Registrar una micro‑aplicación en una zona hace que su contenido aparezca en todas las páginas que rendericen esa zona.
Registrar una micro‑aplicación desde el módulo
Inyecta IMicroAplicacionProveedor (normalmente durante el arranque o desde un consumidor de eventos) y registra tu contenido en las zonas deseadas. Hay tres tipos de micro‑aplicación según lo que inyectes:
HTML estático
_microAplicaciones.RegistrarHtml(
"admin_boton_barraherramienta_antes",
new HtmlString("<button class='btn btn-primary'>Emitir comprobante</button>"),
orden: 10);
Un ViewComponent (contenido dinámico)
La opción recomendada para widgets con lógica: registra un componente que se ejecuta por solicitud y prepara su propio modelo.
_microAplicaciones.RegistrarVistaComponente<ResumenFacturacionViewComponent>(
"admin_dashboard_despues",
argumentos: new { soloActivos = true },
orden: 0);
El componente es un ViewComponent normal, resuelto por inyección de dependencias, de modo que puede usar los servicios del módulo:
public class ResumenFacturacionViewComponent : ViewComponent
{
private readonly IComprobantePagoServicio _servicio;
public ResumenFacturacionViewComponent(IComprobantePagoServicio servicio)
=> _servicio = servicio;
public async Task<IViewComponentResult> InvokeAsync(bool soloActivos)
{
var modelo = await _servicio.ObtenerResumenAsync(soloActivos);
return View(modelo);
}
}
Registro por patrón de zona
Además de nombres exactos, puedes registrar una micro‑aplicación para un conjunto de zonas mediante una expresión regular o un predicado, útil cuando quieres inyectar el mismo contenido en varias páginas:
_microAplicaciones.RegistrarMicroAplicacion(
new Regex("^admin_producto_"),
new ComponenteMicroAplicacion(typeof(MiWidgetViewComponent)) { Orden = 5 });
Tipos de micro‑aplicación
| Tipo | Uso |
|---|---|
HtmlMicroAplicacion | Inyecta HTML ya construido. |
VistaParcialMicroAplicacion | Renderiza una vista parcial. |
ComponenteMicroAplicacion | Invoca un ViewComponent (dinámico, con DI). |
Todas derivan de MicroAplicacion y admiten un Orden que controla su posición relativa cuando varias micro‑aplicaciones comparten zona.
Activación condicional
Si el widget solo debe aparecer bajo ciertas condiciones (una configuración activada, un permiso, cierto tipo de página), implementa IMicroAplicacionActivable para decidir en tiempo de ejecución si la micro‑aplicación se muestra, en lugar de registrarla y ocultarla en la vista.
Para inyectar contenido puntual en una vista concreta, el tag helper <microaplicacion zona-destino="..."> es lo más directo. Reserva el registro programático con IMicroAplicacionProveedor para widgets que deben aparecer en muchas páginas o de forma condicional.