/

Actions asynchrones et notifications toast

Déclenchez le gestionnaire d'un bouton de façon asynchrone avec des états de texte chargement/succès, et mettez en file une notification toast depuis un hook ou une fonction de bouton.

Texte chargement/succès sur un bouton

Les options before/loading/after d'un appel ->button() pilotent le texte du bouton à travers chaque phase d'un clic asynchrone - inactif, en cours, et brièvement en cas de succès - avec le même traitement d'indicateur de chargement que Save/Delete utilisent déjà (setButtonLoading() dans core/xcrud.js) :

$xcrud->button('Process', 'orderdetails_process_line', [
    'icon'    => 'fa fa-cogs',
    'confirm' => 'Process this order line?',
    'before'  => 'Process',
    'loading' => 'Processing…',
    'after'   => 'Processed ✓',
]);

Voir Boutons de ligne personnalisés pour la liste complète des options.

Mettre un toast en file

toast($message, $type = 'success') met en file un message pour l'interface de popups toast propre à xcrud.js. Appelez-la depuis un hook ou un gestionnaire de bouton - pas depuis le PHP de premier niveau d'une page, puisque rien ne la lit en dehors d'une requête d'écriture :

function payments_after_insert(mixed $id, array $row, Xcrud $xcrud): void
{
    $xcrud->toast('Payment recorded.');
}

$type est une chaîne libre ; xcrud.js reconnaît 'success'/'error'/'info'/'warning' pour le style/l'icône et se rabat sur 'info' pour tout le reste, si bien qu'une faute de frappe dégrade vers un toast à couleur neutre plutôt que de disparaître silencieusement.

L'utiliser sur une page sans aucune grille

Les états de chargement asynchrone et les toasts ne sont pas liés à un widget $xcrud monté - Xcrud::uiAssets() charge uniquement le CSS/JS du thème courant, et core/xcrud.js expose directement window.Xcrud.setButtonLoading()/window.Xcrud.toast(), si bien qu'une page sans widget peut réutiliser exactement le même traitement d'indicateur de chargement/toast sur son propre bouton ordinaire :

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

Placez Xcrud::uiAssets() et la balise <script> de xcrud.js dans <body>, pas dans <head> - l'habillage de coquille du routeur n'extrait que le contenu du <body> d'une page produisant son propre document HTML complet, si bien qu'une balise d'asset placée uniquement dans <head> n'atteint jamais la page finale.

Référence

AppelObjectif
window.Xcrud.setButtonLoading(btn, isLoading, loadingText, ui)Bascule un bouton entre état inactif et état de chargement (désactivé, indicateur, texte de remplacement) - le même utilitaire que les clics Save/Delete/->button() utilisent déjà en interne.
window.Xcrud.toast(message, type)Affiche un popup toast directement côté client, sans aller-retour serveur pour la mettre en file.
$xcrud->toast($message, $type = 'success')Met en file un toast côté serveur, depuis un hook/une fonction de bouton, délivré à la prochaine réponse.
Xcrud::uiAssets()Émet les balises CSS/JS du thème courant sans monter de widget - pour une page qui veut les utilitaires de xcrud.js mais n'a pas de grille.