Search code examples
csvsymfonyfilterparametersget

Symfony - pass GET parameters to another route?


I have a table with filters, and i want to download the rows as csv, filtered.

My function to get filters from form:

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

On the page where the table is i have this code and it works fine:

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

But on the route to export csv i have this and $filters is always null:

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

I have the filters form and the button to download csv on the dashboard page. Any tips to make it work?

EDIT

My dashboard page is made like this:

<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 %}

Filters form:

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

Solution

  • To pass the current GET parameters (from URL, not form) You should be able to modify the href as follows:

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

    To use the current form values you need to use JavaScript to set the form's action attribute value to that returned by {{ path('domains_data_csv') }} and submit the form.