Acciones asíncronas y notificaciones toast
Dispara el manejador de un botón de forma asíncrona con estados de texto de carga/éxito, y encola una notificación toast desde dentro de un hook o una función de botón.
Texto de carga/éxito en un botón
Las opciones before/loading/after de una llamada a ->button() controlan el texto del botón a través de cada fase de un clic asíncrono - inactivo, en curso y brevemente en caso de éxito - usando el mismo tratamiento de spinner que ya reciben Guardar/Eliminar (setButtonLoading() en core/xcrud.js):
$xcrud->button('Process', 'orderdetails_process_line', [
'icon' => 'fa fa-cogs',
'confirm' => 'Process this order line?',
'before' => 'Process',
'loading' => 'Processing…',
'after' => 'Processed ✓',
]);
Consulta Botones de fila personalizados para ver la lista completa de opciones.
Encolar un toast
toast($message, $type = 'success') encola un mensaje para la propia interfaz de ventanas emergentes toast de xcrud.js. Llámalo desde dentro de un hook o un manejador de botón - no desde el PHP de nivel superior de una página, ya que nada lo lee fuera de una petición de escritura:
function payments_after_insert(mixed $id, array $row, Xcrud $xcrud): void
{
$xcrud->toast('Payment recorded.');
}
$type es una cadena de formato libre; xcrud.js reconoce 'success'/'error'/'info'/'warning' para el estilo/icono y recurre a 'info' para cualquier otra cosa, así que un error tipográfico degrada a un toast de color plano en lugar de desaparecer silenciosamente.
Usarlo en una página sin ninguna cuadrícula
Los estados de carga asíncronos y los toasts no están atados a un widget $xcrud montado - Xcrud::uiAssets() carga solo el CSS/JS del tema actual, y core/xcrud.js expone directamente window.Xcrud.setButtonLoading()/window.Xcrud.toast(), así que una página sin widget puede reutilizar exactamente el mismo tratamiento de spinner/toast en su propio botón simple:
<body>
<?php echo Xcrud::uiAssets(); ?>
<script src="core/xcrud.js"></script>
<button type="button" id="demo-async-btn">Generate Report</button>
<script>
var btn = document.getElementById('demo-async-btn');
btn.addEventListener('click', function () {
window.Xcrud.setButtonLoading(btn, true, 'Processing…', 'none');
fetch('core/demo_async.php', { method: 'POST' })
.then(function (res) { return res.json(); })
.then(function (json) {
window.Xcrud.setButtonLoading(btn, false, '', 'none');
window.Xcrud.toast(json.message || 'Done.', json.success ? 'success' : 'error');
})
.catch(function () {
window.Xcrud.setButtonLoading(btn, false, '', 'none');
window.Xcrud.toast('Network error.', 'error');
});
});
</script>
</body>
Coloca Xcrud::uiAssets() y la etiqueta <script> de xcrud.js en <body>, no en <head> - el envoltorio de plantilla del router extrae solo el contenido de <body> de una página que produce su propio documento HTML completo, así que una etiqueta de recurso solo en <head> nunca llega a la página final.
Referencia
| Llamada | Propósito |
|---|---|
window.Xcrud.setButtonLoading(btn, isLoading, loadingText, ui) | Alterna un botón entre estado inactivo y de carga (deshabilitado, spinner, texto de reemplazo) - el mismo ayudante que ya usan internamente los clics de Guardar/Eliminar/->button(). |
window.Xcrud.toast(message, type) | Muestra una ventana emergente toast directamente del lado del cliente, sin un viaje de ida y vuelta al servidor para encolarla. |
$xcrud->toast($message, $type = 'success') | Encola un toast del lado del servidor, desde dentro de una función de hook/botón, entregado en la siguiente respuesta. |
Xcrud::uiAssets() | Emite las etiquetas de CSS/JS del tema actual sin montar un widget - para una página que quiere los ayudantes de xcrud.js pero no tiene cuadrícula. |