Azioni Asincrone e Notifiche Toast
Esegui il gestore di un pulsante in modo asincrono con stati di testo per caricamento/successo, e accoda una notifica toast dall'interno di un hook o di una funzione pulsante.
Testo di caricamento/successo su un pulsante
Le opzioni before/loading/after di una chiamata ->button() guidano il testo del pulsante attraverso ogni fase di un click asincrono - inattivo, in corso, e brevemente al successo - usando lo stesso trattamento con spinner già usato da Save/Delete (setButtonLoading() in core/xcrud.js):
$xcrud->button('Process', 'orderdetails_process_line', [
'icon' => 'fa fa-cogs',
'confirm' => 'Process this order line?',
'before' => 'Process',
'loading' => 'Processing…',
'after' => 'Processed ✓',
]);
Vedi Pulsanti di Riga Personalizzati per l'elenco completo delle opzioni.
Accodare un toast
toast($message, $type = 'success') accoda un messaggio per l'interfaccia popup toast propria di xcrud.js. Chiamala dall'interno di un hook o di un gestore pulsante - non dal PHP di primo livello di una pagina, dato che nulla la legge al di fuori di una richiesta di scrittura:
function payments_after_insert(mixed $id, array $row, Xcrud $xcrud): void
{
$xcrud->toast('Payment recorded.');
}
$type è una stringa libera; xcrud.js riconosce 'success'/'error'/'info'/'warning' per stile/icona e ricade su 'info' per qualsiasi altro valore, quindi un errore di battitura degrada a un toast dal colore semplice invece di scomparire silenziosamente.
Usarlo su una pagina senza alcuna griglia
Gli stati di caricamento asincroni e i toast non sono legati a un widget $xcrud montato - Xcrud::uiAssets() carica solo il CSS/JS del tema corrente, e core/xcrud.js espone direttamente window.Xcrud.setButtonLoading()/window.Xcrud.toast(), quindi una pagina priva di widget può riutilizzare esattamente lo stesso trattamento spinner/toast sul proprio pulsante semplice:
<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>
Colloca Xcrud::uiAssets() e il tag <script> di xcrud.js in <body>, non in <head> - l'incapsulamento nel guscio del router estrae solo il contenuto di <body> da una pagina che produce un proprio documento HTML completo, quindi un tag asset presente solo in <head> non raggiunge mai la pagina finale.
Riferimento
| Chiamata | Scopo |
|---|---|
window.Xcrud.setButtonLoading(btn, isLoading, loadingText, ui) | Commuta un pulsante tra stato inattivo e stato di caricamento (disabilitato, spinner, testo sostitutivo) - lo stesso helper già usato internamente dai click su Save/Delete/->button(). |
window.Xcrud.toast(message, type) | Mostra un popup toast direttamente lato client, senza un round-trip al server per accodarlo. |
$xcrud->toast($message, $type = 'success') | Accoda un toast lato server, dall'interno di un hook/funzione pulsante, consegnato alla risposta successiva. |
Xcrud::uiAssets() | Emette i tag CSS/JS del tema corrente senza montare un widget - per una pagina che vuole gli helper di xcrud.js ma non ha alcuna griglia. |