分页时在会话中存储复选框值的最佳方法
P粉592085423
P粉592085423 2024-02-25 16:37:32
[PHP讨论组]

我与 Symfony 和 Twig 合作。我目前有一个包含产品列表的树枝页面,我使用 foreach 循环显示它们,并设置分页来限制产品的显示。

我在此页面中有一个表单,其中有一个复选框作为输入,当我转到下一页时,我需要在会话中选中保存复选框

我尝试通过添加此代码来做到这一点

有一些代码,我在分页视图和控制器中添加了一些注释来解释我的尝试。

我的循环视图:

{% for annonce in annonces %}

{{ annonce._source.titre }}

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

{{ annonce._source.ville }}
{% endfor %}

分页视图:

// 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

{% if page > 0 %} « {{ 'Précédent' }} {% else %} {{ 'Précédent' }} {% endif %}
    {% for i in (page+1)..(page+4) %} {% if i <= numberOfMaxPage %} {% if i == (page+1) %}
  • {{ i }}
  • {% else %}
  • {{ i }}
  • {% endif %} {% endif %} {% endfor %}
{% if page < (numberOfMaxPage-1) %} {{ 'Suivant' }} » {% endif %}

分页的JS:

$( 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();

                });
            });
        });

在我的控制器中,我像这样渲染视图:

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')
                    ));
}

在会话中保存我的 php 还是在 ajax 中更好?

提前谢谢您

P粉592085423
P粉592085423

全部回复(1)
P粉189606269

实际上,如果我正确理解您的代码,您实际上并不需要使用会话。

我假设,当您提交表单时,您需要立即发布所有复选框值以生成 PDF。

如果这是尝试,您应该只直接通过 JavaScript 存储复选框列表,并确保在提交表单时发送所有内容。

按照这个理论,可能会有 HTML 主页:


{% for annonce in annonces %}

{{ annonce._source.titre }}

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

{{ annonce._source.ville }}

{% endfor %}

在这里,您可以看到我添加了不可见的 div #savedCheckboxes。这将使我们能够在您更改页面时保存所有复选框。我还修正了一点你的 HTML,但没什么大不了的。

那么你应该更新你的分页 javascript :

$(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();
        });
    });
 });

魔法就完成了...当您提交表单时,您将始终收到所选复选框的所有列表,甚至是那些由于分页而不再显示的列表。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号