Maison  >  Questions et réponses  >  le corps du texte

Meilleure façon de stocker la valeur de la case à cocher en session lors de la pagination

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

P粉592085423P粉592085423211 Il y a quelques jours306

répondre à tous(1)je répondrai

  • P粉189606269

    P粉1896062692024-02-26 15:36:31

    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 :

    {% for annonce in annonces %}

    {{ annonce._source.titre }}

    {{ 'Réf' }}: {{ annonce._source.reference }}

    {{ annonce._source.ville }}

    {% endfor %}

    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 :

    $(document).ready(function() {
        $(document).on('click', 'a.pagination',function(e) {
            e.preventDefault();
            // Save all the selected checkboxes by moving them to #savedCheckboxes
            $('.checkboxPDF:checked').appendTo($('#savedCheckboxes'))
    
            // Do your pagination like you did
            $.ajax({
                url: $(this).data('uri'),
            }).done(function(html) {
                $('#pagination-target').html(html);
    
                // If the user come to a previous page, verify if he did selected a checkbox
                $('#pagination-target .checkboxPDF').each(function(i, element) {
                    // If the checkbox already exists in the #savedCheckboxes, then select this checkBox & remove it from #savedCheckboxes
                  var savedCheckbox = $('#savedCheckboxes .checkboxPDF[value="'+element.val()+'"]')
                  if(savedCheckbox.length > 0) {
                     element.click() // Select this checkbox
                     savedCheckbox.remove() // Remove it from the hidden selection
                  }
                })
    
                $('html,body').animate({scrollTop: $('#pagination-target').offset().top - 80}, 200);
                var $scrollable = document.getElementById('pagination-target');
                $scrollable.scrollIntoView();
            });
        });
     });

    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.

    répondre
    0
  • Annulerrépondre