Bonjour,

Je n'ai pas de problème particulier avec mon code, simplement j'aimerais avoir quelques avis si la manière dont je m'y prend est bien (je ne fait sa que pour tester des choses. Aucun projet de concret ou autre).

Je voulais utiliser ce "plugin" js pour faire des notifications plus sympa : SweetAlert2
Actuellement, j'ai une page en PHP qui fait simplement un echo avec un json_encode d'un message flash dans la session

$flash = FlashMessage::getFlash();

if($flash !== null){
    header('Content-Type: application/json');
    echo json_encode($flash);
    FlashMessage::removeFlash();
    exit();
} else {
    return false;
}

Ensuite j'ai un script js qui appelle cette page et qui crée la petite notification si il recoit quelque chose

//Partie liée au "plugin"

const Toast = Swal.mixin({
    toast: true,
    position: 'top-right',
    showConfirmButton: false,
    timer: 3000
})

//Partie qui récupère la page php

const xhr = getHttpRequest()

xhr.open('GET', 'http://localhost:8000/alert.php', true)
xhr.setRequestHeader('X-Requested-With', 'xmlhttprequest')
xhr.send()

xhr.onreadystatechange = function () {
    if (xhr.readyState === 4) {
        if (xhr.status === 200) {
            if(xhr.responseText !== ""){
                const resp = JSON.parse(xhr.responseText)
                Toast.fire({
                    type: resp.type,
                    title: resp.message
                })
            }
        }
    }
}

Je voulais savoir si cette façon de faire était bien. J'ai rechercher sur internet et les quelques réponses que j'ai vu étaient en gros de faire un echo d'une balise script avec le code js qui crée la notification. Mais je trouve pas sa très propre comme manière.

Voilà, merci d'avance pour une quelconque réponse
Passez une agréable journée

8 réponses


Soundboy39
Réponse acceptée

Bonjour,

D'après ce que je comprend... une fois que la page est chargée tu lance une requête ajax qui va récupérer les messages en session pour les afficher ?
Si c'est bien ça... ce n'est effectivement pas optimal... car tu peux tout à fait stocker ton message dans une variable JS au chargement de la page puis passer le contenu de cette variable dans Toast.fire().

L'ajax ne sera légitime que s'il n'y a pas de rechargement de la page complète...

Foxxen
Auteur

Bonjour,

Oui c'est bien ce que je fais

Dans ce cas, je retire totalement la page qui fait le echo de ce qui est dans la session. Et je met se code avec le reste ?
Comme je me sert des session php pour faire le message, comment stocker la variable php dans une variable js ? Tout du moins de manière propre.

J'ai un fichier main.js qui contient ce qu'il fait pour lancer la notification en js, et j'ai un fichier default.php qui contient le header + le footer et le contenu lui est passer dans une variable php avec ob_get_start ect..

Un simple echo dans mon fichier default.php dans des balises script ne serais pas quelque chose de propre je pense ?

Merci d'avance

Effectivement c'est pas super propre de générer du JS avec du PHP, même s'il ne s'agit que de variables...

Pour passer des variables de PHP ver les JS, il est possible de faire mieux en utilisant le JSON (très bien géré par PHP grâce à la fonction "json_encode()") et géré nativement par le JS.

Foxxen
Auteur

C'est bien ce que je pensais

J'utilise déjà la fonction json_encode, mais je ne vois pas vraiment comment juste faire un json encode de ma variable, permet au javascript de la récupérée ?

Je viens de lire un peu et j'ai trouver de passer par exemple le json encode dans une div qui serait en hidden ou un input de type hidden, est-ce que cela marcherais ?

Merci d'avance

Non il faut mettre le JSON directement dans un bloc Javascript, le JSON est géré nativement par le Javascript, tu n'a rien de particulier à faire pour utiliser son contenu côté JS.

Foxxen
Auteur

Sa donnerais un truc du style

<script>
var maVariable = <?= json_encode($maVariable); ?>
</script>

Et je mettrais sa en fin de page, juste avant le chargement des script js ?

Oui ça devrait le faire, après on est bien d'accord que $maVariable doit être un Array...

Foxxen
Auteur

Ok, merci bien des infos. Je vais partir là dessus alors
Et oui, c'est bien un tableau

Encore merci, et une bonne soirée