/

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

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