Bonjour à tous,
Avec Symfony 5.4, j'ai besoin de réaliser un bouton "load more", qui permet via une requête Ajax de récupérer les X prochains enregistrements en Json.
Jusqu'ici, tout va bien, je galère surtout sur la vue, car j'aimerais pouvoir utiliser les variables et fonctions de Twig avec JavaScript, et je n'y arrive pas. Je m'explique...
Avant d'implémenter cette fonctionnalité, je ne travaillais qu'avec des objets PHP, donc je pouvais facilement utiliser les fonctions de Twig comme path(), asset()... j'utilisais par exemple aussi un Voter afin de déterminer si oui on non j'affiche un bouton d'édition/de suppression de l'enregistrement à l'utilisateur, comme ceci :
Mais maintenant, je reçois des données en Json au lieu d'une collection d'objets :
Du coup, j'ai pensé en premier lieu à boucler sur le Json en Javascript pour afficher les infos, par exemple comme ceci :
Cette technique fonctionne si je dois juste afficher des infos, à coup de data[ i ].maPropriété, mais dès lors qu'on a besoin du dynamisme de Twig/PHP, c'est impossible : on ne peut pas écrire du Twig au sein d'une variable JS, ça ne fonctionne pas, et en plus, c'est trop tard puisque le serveur a déjà interprété l'affichage.
En tout cas, je ne trouve pas cette technique très propre.
Il semblerait que la bonne méthode consiste à préparer l'affichage côté PHP plutôt, avec Twig, et que c'est cet affichage qu'on renvoie via Ajax pour l'affichage... Mais je ne parviens pas à comprendre comme faire avec du Json, je trouve ça très déroutant
Est-ce que vous avez des pistes, des réflexions pour me mettre sur la bonne voie ? Merci d'avance !
Modifié par Loraga (06 Jun 2022 - 09:48)
Avec Symfony 5.4, j'ai besoin de réaliser un bouton "load more", qui permet via une requête Ajax de récupérer les X prochains enregistrements en Json.
Jusqu'ici, tout va bien, je galère surtout sur la vue, car j'aimerais pouvoir utiliser les variables et fonctions de Twig avec JavaScript, et je n'y arrive pas. Je m'explique...
Avant d'implémenter cette fonctionnalité, je ne travaillais qu'avec des objets PHP, donc je pouvais facilement utiliser les fonctions de Twig comme path(), asset()... j'utilisais par exemple aussi un Voter afin de déterminer si oui on non j'affiche un bouton d'édition/de suppression de l'enregistrement à l'utilisateur, comme ceci :
{% if is_granted('FIGURE_EDIT', figure) %}
<a href="{{ path('app_figure_edit', {'id': figure.id, 'slug': figure.slug}) }}" class="btn btn-outline-primary btn-sm" title="Modifier cette figure">
<i class="bi bi-pencil"></i>
</a>
{% endif %}
Mais maintenant, je reçois des données en Json au lieu d'une collection d'objets :
{
"id": 63,
"name": "Aenean nec ornare",
"createdAt": "2022-05-28T11:22:14+00:00",
"status": "status.accepted",
"slug": "aenean-nec-ornare",
"userId": 10,
"userIdentifier": "Admin",
"firstFigureImage": "400-629205e619369.jpg",
"categoryName": "intermédiaire",
"categorySlug": "intermediaire"
},
Du coup, j'ai pensé en premier lieu à boucler sur le Json en Javascript pour afficher les infos, par exemple comme ceci :
function appendData(data) {
var container = document.getElementById('figures-grid');
var HTML = ``;
for (let i = 0; i < data.length; i++) {
HTML += `
<div class="col">
<div class="card h-100">
<a href="/figure/show/` + data[i].id + `-` + data[i].slug + `">
<img class="card-img-top" src="/uploads/images/` + data[i].firstFigureImage + `">
</a>
<div class="card-body">
<h5 class="card-title">
<a href="/figure/show/` + data[i].id + `-` + data[i].slug + `">
` + data[i].name + `
</a>
</h5>
</div>
</div>
</div>
`;
}
index++;
container.innerHTML += HTML;
}
Cette technique fonctionne si je dois juste afficher des infos, à coup de data[ i ].maPropriété, mais dès lors qu'on a besoin du dynamisme de Twig/PHP, c'est impossible : on ne peut pas écrire du Twig au sein d'une variable JS, ça ne fonctionne pas, et en plus, c'est trop tard puisque le serveur a déjà interprété l'affichage.
En tout cas, je ne trouve pas cette technique très propre.
Il semblerait que la bonne méthode consiste à préparer l'affichage côté PHP plutôt, avec Twig, et que c'est cet affichage qu'on renvoie via Ajax pour l'affichage... Mais je ne parviens pas à comprendre comme faire avec du Json, je trouve ça très déroutant
Est-ce que vous avez des pistes, des réflexions pour me mettre sur la bonne voie ? Merci d'avance !
Modifié par Loraga (06 Jun 2022 - 09:48)