Как отфильтровать форму с помощью knp_paginator Symfony 4?

Я не знаю, как это сделать, и я делаю это некоторое время, и я не могу найти решение, как говорится в заголовке, я не знаю, почему во время фильтрации KNP_paginator, ссылки пагинатора, на момент фильтрации перезапускаются. Я не могу найти решение, и вот мой код:

Это контроллер объекта, в котором мы отображаем индекс вместе с фильтрами:

/**
 * @Route("/", name="coche_index", methods={"GET","POST"})
 */
public function index(CocheRepository $cocheRepository, Request $request): Response
{
    //Está filtrando
    $estaFiltrando = false;
    $valueModelo = $request->request->get('term_modelo');
    $valueMarca = $request->request->get('term');
    $valueAno = $request->request->get('term_ano');
    $valueActivo = $request->request->get('term_activo');
    $valorActivo = 0;
    if ($valueActivo == true || $valueActivo == 1) {
        $valorActivo = 1;
    } else {
        $valorActivo = 0;
    }

    if ($valueModelo == null && $valueMarca == null && $valueAno == null && $valueActivo == null) {
        $estaFiltrando = false;
    } else {
        $estaFiltrando = true;
    }

    $marcas = $cocheRepository
        ->todasLasMarcas();

    $hayMarcas = false;
    if ($marcas == null) {
        $hayMarcas = false;
    } else {
        $hayMarcas = true;
    }
    $paginator  = $this->get('knp_paginator');
    if ($estaFiltrando == true) {
        $cochesQuery = $cocheRepository
            ->findModeloMarcasAnosActivos($valueModelo, $valueMarca, $valueAno, $valorActivo);

        // Paginate the results of the query
        $coches = $paginator->paginate(
            // Doctrine Query, not results
            $cochesQuery,
            // Define the page parameter
            $request->query->getInt('page', 1),
            // Items per page
            3
        );
    } else {
        $cochesQuery = $cocheRepository->findCochesMarcas();

        // Paginate the results of the query
        $coches = $paginator->paginate(
            // Doctrine Query, not results
            $cochesQuery,
            // Define the page parameter
            $request->query->getInt('page', 1),
            // Items per page
            3
        );
    }
    return $this->render('coche/index.html.twig', [
        'coches' => $coches,
        'marcas' => $marcas,
        'idMarca' => $valueMarca,
        'valueAno' => $valueAno,
        'valueModelo' => $valueModelo,
        'valueActivo' => $valueActivo,
        'hayMarcas' => $hayMarcas,
        'estaFiltrando' => $estaFiltrando,
    ]);
}

Вот репозиторий, где я выполняю запрос и фильтрацию:

/**
 * @param $modelo
 * @param $idMarca
 * @param $ano
 * @param $activo
 * @return Coche[]
 */
public function findModeloMarcasAnosActivos($modelo, $idMarca, $ano, $activo)
{

    $qb = $this->createQueryBuilder('c');
    if ($modelo != null || $modelo != '') {
        $qb
            ->andWhere("c.modelo LIKE :searchModelo")
            ->setParameter('searchModelo', $modelo);
    }
    if ($idMarca != null) {
        $qb
            ->andWhere("c.marca = :searchTerm")
            ->setParameter('searchTerm', $idMarca);
    }
    if ($ano != null || $ano > 0) {
        $qb
            ->andWhere("c.ano = :searchAno")
            ->setParameter('searchAno', $ano);
    }

    if ($activo != null || $activo >= 0) {
        $qb
            ->andWhere("c.activo = :searchActivo")
            ->setParameter('searchActivo', $activo);
    }

    return $qb
        ->getQuery()
        ->getResult();
}

findModeloMarcasAnosActivos Это метод, в котором я фильтрую и вызываю его в контроллере. Затем я назначаю этот фильтр пейджеру, если он фильтрует, если нет, то отображает индекс.

Twig index.html.twig

{% block body %}
<h1 class="text-center">Coches</h1>
<div class="container">
    <form class="pb-3" name="form" method="post" action="{{ path('coche_index') }}">
        <div id="form">
            <label for="vehicle1">Filtrar por modelo</label>
            {% if valueModelo is defined %}
                <input type="text" name="term_modelo" id="form_term" value="{{valueModelo}}">
            {% else %}
                <input type="text" name="term_modelo" id="form_term">
            {% endif %}
            <span>Filtrar por Marca:
            </span>
            <select name="term" id="form_term">
                <option value="">-- Selecciona una marca --</option>
                {% for marca in marcas %}
                    {% if idMarca is defined and marca.id == idMarca %}
                        <option value="{{ marca.id }}" selected>{{ marca.nombre }}</option>
                    {% else %}
                        <option value="{{ marca.id }}">{{ marca.nombre }}</option>
                    {% endif %}
                {% endfor %}
            </select>
            <label for="vehicle1">Filtrar año</label>
            {% if valueAno is defined %}
                <input type="number" name="term_ano" id="form_term" value="{{valueAno}}">
            {% else %}
                <input type="number" name="term_ano" id="form_term">
            {% endif %}
            <label for="vehicle1">Activo</label>
            {% if valueActivo is defined and valueActivo == 1 or valueActivo == true %}
                <input type="checkbox" id="vehicle2" name="term_activo" id="form_term" value="1" checked>
            {% else %}
                <input type="checkbox" id="vehicle2" name="term_activo" id="form_term" value="1">
            {% endif %}
            {% if estaFiltrando == true and estaFiltrando is defined %}
                <span>Resultados de búsqueda por:
                    <strong>{{ idMarca }}</strong>
                </span>
                <button class="btn btn-primary" type="submit" id="form_save" name="save">Filtrar</button>
                <p>
                    <a class="btn btn-danger" href="{{ path('coche_index') }}">Borrar filtro</a>
                </p>
            {% else %}
                <button class="btn btn-primary" type="submit" id="form_save" name="save">Filtrar</button>
            {% endif %}

        </div>
    </form>
    <hr>
    {% if app.user %}
        {% if hayMarcas == true %}
            <a class="btn btn-outline-primary" href="{{ path('coche_new') }}">Crear nuevo coche</a>
        {% else %}
            <span>No existe ninguna marca, debes de crear primero una marca!</span>
            <a href="{{ path('marca_new') }}">Crear nueva marca</a>
        {% endif %}
    {% endif %}
    <div class="row" id="coches">
        {% for coche in coches %}
            <div class="col-sm-4 p-2">
                <div class="card text-center">
                    <img src="{{ asset ('uploads/coches/' ~ coche.imagenCoche) }}" class="card-img-top img-fluid" alt="...">
                    <div class="card-body">
                        <h3 class="card-title">{{ coche.nombre }}</h3>
                    </div>
                    <ul class="list-group list-group-flush">
                        <li class="list-group-item">
                            <strong>Marca:</strong>
                            {{ coche.marca.nombre }}</li>
                        <li class="list-group-item">
                            <strong>Modelo:</strong>
                            {{ coche.modelo }}</li>
                        <li class="list-group-item">
                            <strong>Descripcion</strong>
                            {{ coche.descripcion }}</li>
                        <li class="list-group-item">
                            <strong>Fecha de alta:</strong>
                            {{ coche.fechaAlta|date("d/m/Y") }}</li>
                        <li class="list-group-item">
                            <strong>Año:</strong>
                            {{ coche.ano }}</li>
                        <li class="list-group-item">
                            <strong>Activo:</strong>
                            {% if coche.activo == 1 %}
                                Activo</li>
                        {% else %}
                            No activo</li>
                    {% endif %}
                    <li class="list-group-item">
                        <strong>Fecha de Modificacion:</strong>
                        {{ coche.fecha_modificacion|date() }}</li>
                    {% if app.user %}
                        <li class="list-group-item">
                            <div>
                                <a class="btn btn-outline-primary" href="{{ path('coche_show', {'id': coche.id}) }}">Ver</a>
                                <a class="btn btn-outline-primary" href="{{ path('coche_edit', {'id': coche.id}) }}">Editar</a>
                                {{ include('coche/_delete_form.html.twig') }}
                            </div>
                        </li>
                    {% endif %}
                </ul>
            </div>
        </div>
    {% else %}
        <div class="col-sm-12 p-2">
            <div class="card">
                <div class="card-body">
                    <h3 class="card-title">No se ha encontrado ningún dato!</h3>
                </div>
            </div>
        </div>
    {% endfor %}
</div>
{% if app.user %}
    {% if hayMarcas == true %}
        <a class="btn btn-outline-primary" href="{{ path('coche_new') }}">Crear nuevo coche</a>
    {% else %}
        <span>No existe ninguna marca, debes de crear primero una marca!</span>
        <a class="btn btn-outline-primary" href="{{ path('marca_new') }}">Crear nueva marca</a>
    {% endif %}
{% endif %}
<div class="pagination justify-content-center">
    {{ knp_pagination_render(coches) }}
</div>
</div>{% endblock %}

пейджер находится внизу, а форма — вверху страницы.

Вот когда я фильтрую, в пейджере появляются 2 страницы

Когда я нажимаю на страницу 2, появляется другой пейджер и он как бы перезагружается, а фильтр исчезает . Это мой сбой... Есть решение?

ИЗМЕНИТЬ

Я объясню немного больше о пейджере:

Я уже вызываю пейджер, в самом коде я делаю пример того, как его вызывать, однако, это не та проблема, о которой я говорю, это когда я делаю форму, и я получаю значения из формы при фильтрации.

 $valueModelo = $request->request->get('term_modelo');
 $valueMarca = $request->request->get('term');
 $valueAno = $request->request->get('term_ano');
 $valueActivo = $request->request->get('term_activo');

Затем я вызываю $paginator = $this-›get('knp_paginator');, чтобы получить пагинатор, а затем я делаю фильтрацию, я помещаю запрос из фильтра репозитория в пагинатор:

        $coches = $paginator->paginate(
        // Doctrine Query, not results
        $cochesQuery,
        // Define the page parameter
        $request->query->getInt('page', 1),
        // Items per page
        3
    );

Проблема в том, что пагинатор, когда я нажимаю на одну из ссылок, перезагружается и возвращается к нефильтрованному пагинатору, в изображениях тоже делаю выборку.


person Palatrons    schedule 09.03.2021    source источник
comment
для разбивки на страницы вы должны использовать метод GET в форме, чтобы сохранить параметры в URL-адресе при переходе со страницы 1 на страницу 2....   -  person hous    schedule 09.03.2021
comment
Вот видео, которое я делал пару лет назад. Некоторые предметы обесценены, но это должно дать вам общее представление. youtube.com/watch?v=LgiBQd1ghq8&t=284s   -  person Robert Saylor    schedule 09.03.2021


Ответы (1)


Поэтому вы должны использовать инъекцию зависимостей в первую очередь.

используйте Knp\Component\Pager\PaginatorInterface;

то в вашей функции:

публичная функция someNameAction (PaginatorInterface $ paginator) {

...Before you return $qb do the following:

$query = $paginator->paginate(
    $qb,
    1,
    50
);

}

Вы должны передать свой запрос ($qb) в $query и вернуть $query вместо $qb. 1 и 50 являются частью номеров страниц. Примечание. Вы можете вызвать это в другой функции и передать $paginator, если вы вызываете функцию именно так.

person Robert Saylor    schedule 09.03.2021