0

フィルタリングされたページ付けされた結果を表示するために、KnpPaginatorBundleのクエリを変更するフォームを作成しています。

それをするために。フォームが有効な場合、フィルタリングする必要のあるフィールドを使用してクエリ文字列(連結)を作成します。カスタムクエリで$filteredDql変数を設定しました。問題は、その値が最初のページにのみ残ることです。ページを変更するとNULLになります。そして、ページ付けがリセットされます...

問題は、ブロックコンテキストで$ filteredDql変数を設定していることである可能性があります(フォームが有効な場合のみ)。

操作全体またはアプリケーション全体に$filteredDql変数を設定するにはどうすればよいですか?多分パラメータを使用していますか?コントローラーからコンテナーを使用しようとしましたが、以下を使用して成功しませんでした。

$this->container->setParameter('key', value);
$this->container->getParameter('key');
$this->container->HasParameter('key');

しかし、この方法では、500の内部サーバーエラーが発生します

コードは次のとおりです。

public function indexAction(Request $request, $page)
{
    $filters = new Filters();

    $form = $this->createForm(new FiltersType(), $filters);

    $dql = "SELECT a FROM ViciousAmateurBundle:Post a WHERE a.is_active = true";

    if ($request->isMethod('POST')) {
        $form->bind($request);

        if ($form->isValid()) {
            $country = $filters->getCountry();
            $city = $filters->getCity();
            $gender = $filters->getGender();
            $sexualOrientation = $filters->getSexualOrientation();

            if (isset($country)) {
                $dql .= " AND a.country = '" . $filters->getCountry() . "'";
            }
            if (isset($city)) {
                $dql .= " AND a.city = '" . $filters->getCity() . "'";
            }
            if (isset($gender)) {
                $dql .= " AND a.gender = '" . $filters->getGender() . "'";
            }
            if (isset($sexualOrientation)) {
                $dql .= " AND a.sexual_orientation = '" . $filters->getSexualOrientation() . "'";
            }
            $filteredDql = $dql;
        }
    }

    $em = $this->get('doctrine.orm.entity_manager');

    if (isset($filteredDql)) {
        $query = $em->createQuery($filteredDql);
    } else {
        $query = $em->createQuery($dql);
    }

    $paginator = $this->get('knp_paginator');
    $pagination = $paginator->paginate(
        $query,
        $this->get('request')->query->get('page', $page),
        5
    );

    return $this->render('ViciousAmateurBundle:Default:index.html.twig', array(
        'form' => $form->createView(),
        'pagination' => $pagination
        )
    );
}
4

1 に答える 1

-1

最後に、セッション変数を使用して現在のフィルターを格納することで解決しました。セッションは、アプリケーション全体またはステートレスです。私はこのアプローチに非常に満足しています:D

ただし、KnpPaginatorBundleが、データがフォーム検証から取得された場合、デフォルトでページネーションを介してカスタムクエリ「フィルター」(WHERE、GROUP BY、...)を記憶できないのは残念です:Sそして、ソート可能な関数を使用してリンクを作成することでサポートしますascまたはdescを並べ替えるのは残念です...

コードは次のとおりです。

/**
 * @Route("/{page}", defaults={"page" = 1}, name="homepage")
 * @Route("/")
 * @Template()
 */
public function indexAction(Request $request, $page)
{
    $filters = new Filters();

    $form = $this->createForm(new FiltersType(), $filters);

    $session = $this->getRequest()->getSession();

    if ($session->get('dql') == null) {
        $session->set('dql', "SELECT a FROM ViciousAmateurBundle:Post a WHERE a.is_active = true");
    }

    if ($request->isMethod('POST')) {
        $form->bind($request);

        if ($form->isValid()) {
            $dql = "SELECT a FROM ViciousAmateurBundle:Post a WHERE a.is_active = true";
            $country = $filters->getCountry();
            $city = $filters->getCity();
            $gender = $filters->getGender();
            $sexualOrientation = $filters->getSexualOrientation();

            if (isset($country)) {
                $dql .= " AND a.country = '" . $filters->getCountry() . "'";
            }
            if (isset($city)) {
                $dql .= " AND a.city = '" . $filters->getCity() . "'";
            }
            if (isset($gender)) {
                $dql .= " AND a.gender = '" . $filters->getGender() . "'";
            }
            if (isset($sexualOrientation)) {
                $dql .= " AND a.sexual_orientation = '" . $filters->getSexualOrientation() . "'";
            }

            $session->set('dql', $dql);
        }
    }

    $em = $this->get('doctrine.orm.entity_manager');

    $query = $em->createQuery($session->get('dql'));

    $paginator = $this->get('knp_paginator');
    $pagination = $paginator->paginate(
        $query,
        $this->get('request')->query->get('page', $page),
        5
    );

    return $this->render('ViciousAmateurBundle:Default:index.html.twig', array(
        'form' => $form->createView(),
        'pagination' => $pagination
        )
    );
}
于 2013-02-13T12:27:11.173 に答える