Je travaille avec Symfony et Twig. J'ai actuellement une page de brindille qui contient une liste de produits, j'utilise une boucle foreach pour les afficher et je configure la pagination pour limiter l'affichage des produits.
J'ai un formulaire sur cette page qui a une case à cocher en entrée et lorsque je passe à la page suivante, je dois cocher la case Enregistrer dans la session
J'ai essayé de le faire en ajoutant ce code
Il y a du code et j'ai ajouté quelques commentaires dans la vue paginée et le contrôleur pour expliquer ce que j'essaie de faire.
Ma vue en boucle :
<form> <div class="row" > {% for annonce in annonces %} <div class="col-12 col-md-6 col-lg-4"> <p class="text text--blue text--bold m-0 text--medium mt-2"> {{ annonce._source.titre }} </p> <p class="m-0">{{ 'Réf' }}: {{ annonce._source.reference }}</p> <div class="d-flex mt-2 text--bold"> <div class="d-flex me-2"> {{ annonce._source.ville }} </div> </div> <div> <input type="checkbox" name="checkbox[]" id="checkbox_pdf" value="{{annonce._id}}" multiple/> </div> </div> {% endfor %} </div> <input type="submit" id="pdf_submit" value="Create PDF" name="submit_pdf" class="btn btn-primary"> </form>
Page vue :
// I tried to add a onclick : onclick='document.forms["name"].submit(); return false;' on each pagination link combined with the save of the value in session with my controller but doesn't work <div class="col d-flex justify-content-between align-items-center"> <div class="d-flex"> {% if page > 0 %} <a href="#" data-action="pagination" data-uri="{{ path('ajax_annonce_pagination',{'page':0, 'type':'frontoffice'}) }}" data-target="pagination-target"> « </a> <a href="#" data-action="pagination" data-uri="{{ path('ajax_annonce_pagination',{'page':page-1, 'type':'frontoffice'}) }}" data-target="pagination-target"> {{ 'Précédent' }} </a> {% else %} <a href="#" disabled="disabled" > {{ 'Précédent' }} </a> {% endif %} </div> <div> <ul class="list-unstyled pagination m-0"> {% for i in (page+1)..(page+4) %} {% if i <= numberOfMaxPage %} {% if i == (page+1) %} <li> <a href="#" data-action="pagination" data-uri="{{ path('ajax_annonce_pagination',{'page':(i-1), 'type':'frontoffice'}) }}" data-target="pagination-target"> {{ i }} </a> </li> {% else %} <li> <a href="#" data-action="pagination" data-uri="{{ path('ajax_annonce_pagination',{'page':(i-1), 'type':'frontoffice'}) }}" data-target="pagination-target"> {{ i }} </a> </li> {% endif %} {% endif %} {% endfor %} </ul> </div> <div class="d-flex"> {% if page < (numberOfMaxPage-1) %} <a href="#" data-action="pagination" data-uri="{{ path('ajax_annonce_pagination',{'page':page+1, 'type':'frontoffice'}) }}" data-target="pagination-target"> {{ 'Suivant' }} </a> <a href="#" data-action="pagination" data-uri="{{ path('ajax_annonce_pagination',{'page':numberOfMaxPage-1, 'type':'frontoffice'}) }}" data-target="pagination-target"> » </a> {% endif %} </div> </div>
JS pour la pagination :
$( document ).ready(function() { $(document).on('click', 'a.pagination',function(e) { e.preventDefault(); $.ajax({ url: $(this).data('uri'), }).done(function(html) { $('#pagination-target').html(html); $('html,body').animate({scrollTop: $('#pagination-target').offset().top - 80}, 200); var $scrollable = document.getElementById('pagination-target'); $scrollable.scrollIntoView(); }); }); });
Dans mon contrôleur, je restitue la vue comme ceci :
public function search(Request $request, ?SecteurGeographique $secteurGeographique, AnnonceRepository $annonceRepository): Response { $selectId = $request->get('checkbox'); $selected = $annonceRepository->findById($selectId); // I tried to add this code to save my values if (isset($selectId)) { $session = new Session(); $session->set('checkbox',$selectId); }else{ echo 'false'; $session = new Session(); $session->clear(); } return $this->render('front/annonce/list.html.twig', array( 'annonces' => $results['hits']['hits'], 'total' => $results['hits']['total']['value'], 'website' => $website, 'page' => $request->query->getInt('page') )); }
Vaut-il mieux sauvegarder mon php en session ou en ajax ?
Merci d'avance
En fait, si je comprends bien votre code, vous n'avez pas réellement besoin d'utiliser des sessions.
Je suppose que lorsque vous soumettez le formulaire, vous devez publier immédiatement toutes les valeurs des cases à cocher pour générer le PDF.
Si c'est ce que vous essayez de faire, vous devez simplement stocker la liste des cases à cocher directement via JavaScript et vous assurer que tout est envoyé lorsque le formulaire est soumis.
Selon cette théorie, il pourrait y avoir une page d'accueil HTML :
Ici, vous pouvez voir que j'ai ajouté le div invisible #savedCheckboxes. Cela nous permettra de sauvegarder toutes les cases à cocher lorsque vous changez de page. J'ai également corrigé un peu votre code HTML, mais rien de majeur.
Ensuite, vous devez mettre à jour votre javascript de pagination :
La magie opère... Lorsque vous soumettrez le formulaire, vous recevrez toujours toutes les listes avec les cases cochées, même celles qui ne s'affichent plus en raison de la pagination.