首页 > 解决方案 > Symfony - 将GET参数传递给另一条路线?

问题描述

我有一个带有过滤器的表,我想将行下载为 csv,过滤。

我从表单中获取过滤器的功能:

public function getFilters($request)
{
    $filters = [
        'stato' => $request->get('stato'),
        'cliente' => $request->get('cliente'),
        'registrar' => $request->get('registrar'),
        'creazione_inizio' => $request->get('creazione_inizio'),
        'creazione_fine' => $request->get('creazione_fine'),
        'scadenza_inizio' => $request->get('scadenza_inizio'),
        'scadenza_fine' => $request->get('scadenza_fine'),
        'scadenza_pagamento_inizio' => $request->get('scadenza_pagamento_inizio'),
        'scadenza_pagamento_fine' => $request->get('scadenza_pagamento_fine'),
    ];

    return $filters;
}

在表格所在的页面上,我有这个代码,它工作正常:

/**
 * @Route("/dashboard", name="dashboard")
 */
public function dashboard(Request $request, PaginatorInterface $paginator): Response
{
    $filters = $this->getFilters($request);
}

但是在导出 csv 的路线上,我有这个并且 $filters 始终为空:

 /**
 * @Route("/report/report.csv", name="domains_data_csv")
 */
public function exportDomainsDataCsvAction(Request $request)
{
    $filters = $this->getFilters($request);
}

我在仪表板页面上有过滤器表单和下载 csv 的按钮。有什么技巧可以让它发挥作用吗?

编辑

我的仪表板页面是这样制作的:

<div class="mb-2">
    <span class="h2">Dashboard</span>
</div>
<div class="mb-3">
    {{ include('Admin/includes/_search.html.twig') }}
</div>
{{ include('Admin/includes/_filter.html.twig') }}
{% if domains %}
    <div class="col-auto">
        <a href="{{ path('domains_data_csv') }}" class="btn btn-lg btn-primary">Scarica CSV</a>
    </div>
    {{ include('Admin/includes/_domains_table.html.twig',{ 'domains':domains }) }}

    {% if is_granted('ROLE_ADMIN') %}
        <a class="btn btn-primary" aria-current="page" href="{{path('new_domain')}}" role="button">Nuovo dominio</a>
    {% endif %}
    {% else %}
{% endif %}

过滤器形式:

<div class="card">
<div class="row align-items-center">
    <a class="text-decoration-none text-reset" id="filter-header" href="#collapseExample" data-bs-toggle="collapse" aria-expanded="false">
        <div class="card-header d-flex align-items-center">
            <h5 class="pe-3">Filtri</h5>
            <div class="border-1 bg-success border border-success w-100" style="opacity:unset;"></div>
            <i class="bi bi-chevron-right ps-3 fs-3 text-success arrow"></i>
        </div>
    </a>
</div>
<div class="collapse" id="collapseExample">
    <div class="card-body">
        <form id="form-filter-status" method="GET">
            {% if is_granted('ROLE_ADMIN') %}
                <div class="row mb-3 justify-content-center">
                    <div class="card col-sm-3 mx-3">
                        <div class="card-body">
                            <div class="card-title">Stato:</div>
                            <div class="col-sm">
                                <select name="stato" class="form-select" onchange='this.form.submit();'>
                                    <option value="" {% if filters.stato is empty %} selected {% endif %}>Seleziona...</option>
                                    <option value="1" {% if filters.stato == 1 %} selected {% endif %}>Attivo</option>
                                    <option value="2" {% if filters.stato == 2 %} selected {% endif %}>Richiesta Dismissione</option>
                                    <option value="3" {% if filters.stato == 3 %} selected {% endif %}>Dismesso</option>
                                    <option value="4" {% if filters.stato == 4 %} selected {% endif %}>Richiesto Trasferimento</option>
                                    <option value="5" {% if filters.stato == 5 %} selected {% endif %}>Trasferito</option>
                                </select>
                            </div>
                        </div>
                    </div>

                    <div class="card col-sm-3 mx-3">
                        <div class="card-body">
                            <div class="card-title">Cliente:</div>
                            <div class="col-sm">
                                <select name="cliente" class="form-select" onchange='this.form.submit();'>
                                    <option value="" {% if filters.cliente is empty %} selected {% endif %}>Seleziona...</option>
                                    <option value="1" {% if filters.cliente == 1 %} selected {% endif %}>KINETIKON s.r.l.</option>
                                    <option value="2" {% if filters.cliente == 2 %} selected {% endif %}>CINQUEBIT s.r.l.</option>
                                    <option value="3" {% if filters.cliente == 3 %} selected {% endif %}>JAKALA S.p.A.</option>
                                    <option value="4" {% if filters.cliente == 4 %} selected {% endif %}>IN.SI. s.r.l.</option>
                                    <option value="5" {% if filters.cliente == 5 %} selected {% endif %}>PAGNOSSIN s.r.l.</option>
                                    <option value="6" {% if filters.cliente == 6 %} selected {% endif %}>ELEPHASE s.r.l.</option>
                                </select>
                            </div>
                        </div>
                    </div>

                    <div class="card col-sm-3 mx-3">
                        <div class="card-body">
                            <div class="card-title">Register:</div>

                            <div class="col-sm">
                                <select name="registrar" class="form-select" onchange='this.form.submit();'>
                                    <option value="" {% if filters.registrar is empty %} selected {% endif %}>Seleziona...</option>
                                    <option value="1" {% if filters.registrar == 1 %} selected {% endif %}>Register</option>
                                    <option value="2" {% if filters.registrar == 2 %} selected {% endif %}>OpenProvider</option>
                                    <option value="3" {% if filters.registrar == 3 %} selected {% endif %}>TowerTech</option>
                                    <option value="4" {% if filters.registrar == 4 %} selected {% endif %}>Aruba</option>
                                    <option value="5" {% if filters.registrar == 5 %} selected {% endif %}>Aruba Business</option>
                                </select>
                            </div>
                        </div>
                    </div>
                </div>
            {% endif %}

            <div class="row justify-content-center">
                <div class="card col-sm-3 mx-3">
                    <div class="card-body">
                        <div class="card-title">Creazione</div>

                        <div class="input-group mb-3">
                            <span class="input-group-text col-2" id="creazione_inizio">Da:</span>
                            <input type="date" name="creazione_inizio" class="form-control" value="{{filters.creazione_inizio}}" placeholder="Creazione inizio" aria-label="Creazione inizio" aria-describedby="creazione_inizio">
                        </div>

                        <div class="input-group mb-3">
                            <span class="input-group-text col-2" id="creazione_fine">A:</span>
                            <input type="date" name="creazione_fine" class="form-control" value="{{filters.creazione_fine}}" placeholder="Creazione fine" aria-label="Creazione fine" aria-describedby="creazione_fine">
                        </div>

                        <div class="d-grid gap-2">
                            <button class="btn btn-outline-success" type="submit">Filtra data creazione</button>
                        </div>
                    </div>
                </div>

                <div class="card col-sm-3 mx-3">
                    <div class="card-body">
                        <div class="card-title">Scadenza</div>

                        <div class="input-group mb-3">
                            <span class="input-group-text col-2" id="scadenza_inizio">Da:</span>
                            <input type="date" name="scadenza_inizio" class="form-control" value="{{filters.scadenza_inizio}}" placeholder="Scadenza inizio" aria-label="Scadenza inizio" aria-describedby="scadenza_inizio">
                        </div>

                        <div class="input-group mb-3">
                            <span class="input-group-text col-2" id="scadenza_fine">A:</span>
                            <input type="date" name="scadenza_fine" class="form-control" value="{{filters.scadenza_fine}}" placeholder="Scadenza fine" aria-label="Scadenza fine" aria-describedby="scadenza_fine">
                        </div>
                        <div class="d-grid gap-2">
                            <button class="btn btn-outline-success" type="submit">Filtra data scadenza</button>
                        </div>
                    </div>
                </div>

                <div class="card col-sm-3 mx-3">
                    <div class="card-body">
                        <div class="card-title">Scadenza pagamento</div>

                        <div class="input-group mb-3">
                            <span class="input-group-text col-2" id="scadenza_pagamento_inizio">Da:</span>
                            <input type="date" name="scadenza_pagamento_inizio" class="form-control" value="{{filters.scadenza_pagamento_inizio}}" placeholder="Scadenza pagamento inizio" aria-label="Scadenza pagamento inizio" aria-describedby="scadenza_pagamento_inizio">
                        </div>

                        <div class="input-group mb-3">
                            <span class="input-group-text col-2" id="scadenza_pagamento_fine">Da:</span>
                            <input type="date" name="scadenza_pagamento_fine" class="form-control" value="{{filters.scadenza_pagamento_fine}}" placeholder="Scadenza pagamento fine" aria-label="Scadenza pagamento fine" aria-describedby="scadenza_pagamento_fine">
                        </div>
                        <div class="d-grid gap-2">
                            <button class="btn btn-outline-success" type="submit">Filtra data scadenza pagamento</button>
                        </div>
                    </div>
                </div>


            </div>
            {% if query is defined %}
                <input type="hidden" name="query" value="{{query}}">
            {% endif %}
        </form>
    </div>
</div>

标签: csvsymfonyfilterparametersget

解决方案


要传递当前GET参数(来自 URL,而不是表单),您应该能够修改href如下:

<a href="{{ path('domains_data_csv') ~ "?" ~ app.request.queryString }}" class="btn btn-lg btn-primary">Scarica CSV</a>

要使用当前表单值,您需要使用 JavaScript 将表单的action属性值设置为返回的值{{ path('domains_data_csv') }}并提交表单。


推荐阅读