Formation PUB020 : WordPress, 2023 Supprimer des données personnalisées

44.3 Confirmation avant suppression en JavaScript pur


Avant de supprimer un enregistrement de la base de données à partir d'une interface Web, il est d'usage de demander une confirmation à l'usager.

On utilisera pour cela une boîte de confirmation JavaScript. Cette boîte apparaît généralement par-dessus la page sous forme de popup.

Je vous présente ici une technique pour effectuer la confirmation en JavaScript pur sans aucune bibliothèque externe. En fait, vous créerez votre propre bibliothèque.

Pour faire apparaître la boîte de confirmation, vous aurez besoin de ces fichiers :

  • Un fichier .js qui contient le code pour générer la boîte de confirmation.  Ce fichier, qui est en fait votre propre bibliothèque, pourra être utilisé dans différents projets.
  • Ce fichier sera accompagné d'une feuille de style pour contrôler l'apparence de la boîte de confirmation.
  • Un autre fichier JavaScript se chargera d'appeler la fonction d'affichage de la boîte de confirmation lorsqu'une action se produit, par exemple un clic sur un lien de suppression. Ici, il s'agit de code JavaScript propre à votre projet.

Chargement des fichiers JavaScript et CSS

Sous WordPress, le chargement de tous ces fichiers prendra cette forme. Dans d'autres langages de programmation, il suffira d'ajouter les balises HTML requises.

Fichier functions.php

/**
 * Charge des scripts et des feuilles de style dans toutes les pages du tableau de bord.
 * @author Christiane Lagacé <christiane.lagace@hotmail.com>
 *
 * Utilisation : add_action('admin_enqueue_scripts', 'monprefixe_charger_css_js_admin');
 */
function monprefixe_charger_css_js_admin( $hook ) {

    global $monprefixe_hook_gestion; // variable initialisée lors de l'ajout de l'option de menu

    // fichiers à charger seulement pour la page de gestion de mon thème
    if ( $hook == $monprefixe_hook_gestion ) {

        wp_enqueue_style( 'ma-bibliotheque-popup', get_stylesheet_directory_uri() . '/ma-bibliotheque-popup/style.css' );
        wp_enqueue_script( 'ma-bibliotheque-popup', get_stylesheet_directory_uri() . '/ma-bibliotheque-popup/script.js', null, null, true );
        wp_enqueue_script( 'confirmation-suppression', get_stylesheet_directory_uri() . '/js/confirmation-suppression.js', array( 'ma-bibliotheque-popup' ), null, true );
    }
}

add_action('admin_enqueue_scripts', 'monprefixe_charger_css_js_admin');

Fichier JavaScript de votre bibliothèque

La bibliothèque se chargera de générer le code HTML de la boîte de confirmation.

De plus, elle utilisera une astuce intéressante qui consiste à récupérer l'URL dans l'attribut href du lien de suppression, ce lien qui a lancé l'affichage de la boîte de confirmation.

Lorsque l'usager cliquera sur le bouton Oui, le contrôle sera redirigé vers cet URL.

Fichier ma-bibliotheque-popup/script.js

/**
 * Affiche la boîte de confirmation.
 * @author Christiane Lagacé <christiane.lagace@hotmail.com>
 *
 * @param {String} question.
 * @param {String} href URL de la page vers laquelle le traitement sera transféré si on clique sur Oui.
 */
function afficherPopup(question, href) {
    // au cas où une boîte aurait déjà été générée
    effacerBoite();

    const divOverlay = document.createElement("div");
    divOverlay.onclick = effacerSiClickEnDehors;
    divOverlay.classList.add("mon-popup-confirmation-overlay");

    const divBoite = document.createElement("div");
    divBoite.classList.add("mon-popup-confirmation");
    divOverlay.appendChild(divBoite);

    const divQuestion = document.createElement("div");
    divQuestion.innerHTML = question;
    divQuestion.classList.add("question");
    divBoite.appendChild(divQuestion);

    const boutonOui = document.createElement("button");
    boutonOui.innerHTML = "Oui";
    boutonOui.dataset.href = href;
    boutonOui.classList.add("button");
    boutonOui.classList.add("gauche");
    boutonOui.onclick = redirigerVersHref;
    divBoite.appendChild(boutonOui);

    const boutonNon = document.createElement("button");
    boutonNon.innerHTML = "Non";
    boutonNon.classList.add("button");
    boutonNon.classList.add("droite");
    boutonNon.onclick = effacerBoite;
    divBoite.appendChild(boutonNon);

    document.body.appendChild(divOverlay);
}

/**
 * Retrouve l'attribut href du lien qui a mené à l'affichage de la boîte de confirmation.
 * @author Christiane Lagacé <christiane.lagace@hotmail.com>
 *
 * @param {Event} event.
 *
 * @return {string} Valeur de l'attribut href ou "" s'il n'y en avait pas.
 */
function retrouverHrefLien(event) {
    let href = "";
    const lien = event.target;

    if (lien != null) {
        href = lien.getAttribute("href") || "";
    }

    return href;
}

/**
 * Redirige vers la page qui correspond à l'attribut href ou recharge la page actuelle si href est à blanc.
 * @author Christiane Lagacé <christiane.lagace@hotmail.com>
 *
 * @param {Event} event.
 */
function redirigerVersHref(event) {
    const bouton = event.target;
    let href = "";

    if (bouton != null) {
        // retrouve l'attribut data-href du bouton
        href = bouton.dataset.href || "";
    }

    if (href != "") {
        // affiche la page de l'attribut href
        window.location.href = href;
    }
    else {
        // réaffiche la page actuelle
        window.location.reload();
    }
}

/**
 * Efface la boîte de confirmation
 * @author Christiane Lagacé <christiane.lagace@hotmail.com>
 */
function effacerBoite() {
    document.querySelectorAll('div.mon-popup-confirmation-overlay').forEach(e => e.remove());
}

/**
 * Efface la boîte de confirmation si l'usager clique sur le overlay en dehors de la division interne.
 * @author Christiane Lagacé <christiane.lagace@hotmail.com>
 *
 * @param {Event} event.
 */
function effacerSiClickEnDehors(event) {
    const overlay = document.getElementsByClassName('mon-popup-confirmation-overlay');
    const popup = document.getElementsByClassName('mon-popup-confirmation');

    if (overlay.length > 0 && popup.length > 0) {
        // il ne peut jamais y avoir plus d'une boîte de confirmation puiqu'on détruit les existantes avant d'en créer une nouvelle
        if (event.target != popup[0]) {
            effacerBoite();
        }
    }
}

Feuille de style

Je vous propose une feuille de style minimaliste pour la boîte de confirmation. À vous d'ajouter les styles pour l'obtention d'une boîte qui répond à vos besoins.

Les boutons utilisent la classe button définie dans le tableau de bord WordPress. Si vous utilisez la bibliothèque dans un autre contexte, vous pourrez définir leur apparence en ajoutant les règles CSS désirées.

Par défaut, voici l'apparence de la boîte de confirmation dans le tableau de bord WordPress :

Boite de confirmation JavaScript dans WordPress

Et dans un autre site Web :

Boite de confirmation JavaScript

Fichier ma-bibliotheque-popup/style.css

.mon-popup-confirmation-overlay {
    position: fixed;
    z-index: 1;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: rgba(0,0,0,0.5);
}

.mon-popup-confirmation {
    position: absolute;
    background-color: white;
    color: #3c3c3c;
    border: #c3c3c3 solid 1px;
    border-radius: 8px;
    padding: 10px 20px;
    top: 50%;
    left: 50%;
    -ms-transform: translate(-50%, -50%);
    transform: translate(-50%, -50%);
    max-height: 100%;
}

.mon-popup-confirmation .question {
    font-size: 1.1em;
}

.mon-popup-confirmation button.gauche {
    margin: 10px 5px 10px 0;
}

.mon-popup-confirmation button.droite {
    margin: 10px 0 10px 5px;
}

Fichier JavaScript propre au projet

Le fichier propre à votre projet contiendra du code semblable à celui-ci.

Fichier confirmation-suppression.js

// associe la fonction confirmerSuppression() au clic sur un lien
document.addEventListener("DOMContentLoaded", function(event) {
    // l'événement doit provenir de la balise <a> qui contient l'attribut href
    // ajuster le sélecteur selon votre projet
    let liensSuppression = document.querySelectorAll(".trash a");

    for (let lienSuppression of liensSuppression) {
        lienSuppression.onclick = confirmerSuppression;
    }
});

/**
 * Fait apparaître une boîte de confirmation.
 * @author Christiane Lagacé <christiane.lagace@hotmail.com>
 *
 * @param {Event} event.
 */

function confirmerSuppression(event) {
    // Aucune soumission tant que l'usager n'a pas confirmé.
    event.preventDefault();

    const href = retrouverHrefLien(event);


    afficherPopup("Désirez-vous vraiment supprimer cet item?", href);
}

 

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre