Я хотел бы получить параметры, отправленные формой (method = "get") и добавить их в маршрут.
Это маршрут:
frontend_list:
path: /travels/{page}
defaults: { _controller: ProjectFrontendBundle:Frontend:list, page: 1 }
и это форма:
<form action="" method="get" class="form_sort" id="myForm">
<span class="manage_title">Sort by:</span>
<select class="select_styled white_select" id="sort_list" name="sort" onChange="sendForm();">
<option value="">-------</option>
<option value="country:asc">Country A-Z</option>
<option value="country:desc">Country Z-A</option>
<option value="destination:asc">City A-Z</option>
<option value="destination:desc">City Z-A</option>
</select>
</form>
и это контроллер:
public function listAction($page, Request $request)
{
$em = $this->getDoctrine()->getManager();
$nbByPage = $this->container->getParameter('travel.number_by_page');
if ($request->getMethod() == 'POST')
{
$sort = $request->query->get('sort');
list($orderBy, $orderWay) = explode(":", $sort); //explode
$listTravels = $em->getRepository('ProjectTravelBundle:Travel')->getListTravelsFrontend($nbByPage, $page, $orderBy, $orderWay);
return $this->render('ProjectFrontendBundle:Frontend:list.html.twig',array(
'listTravels' => $listTravels,
'page' => $page,
'nb_page' => ceil(count($listTravels) / $nbByPage) ?: 1
));
}
$orderBy = "id"; // set default orderBy
$orderWay = "desc"; // set default orderWay
$listTravels = $em->getRepository('ProjectTravelBundle:Travel')->getListTravelsFrontend($nbByPage, $page, $orderBy, $orderWay);
return $this->render('ProjectFrontendBundle:Frontend:list.html.twig',array(
'listTravels' => $listTravels,
'page' => $page,
'nb_page' => ceil(count($listTravels) / $nbByPage) ?: 1
));
}
Поэтому я хотел бы иметь такой URL, например, когда вы выбираете "sort":
localhost/agence/web/app_dev.php/travels?orderby=country&orderway=aesc
Прямо сейчас, я получаю нефункциональный url, как это, когда выбирают выбор:
localhost/agence/web/app_dev.php/voyages?sort=country%3Aasc
Поэтому мой вопрос заключается в том, как добавить эти параметры в маршрут frontend_list и добавить их к пути в представлении twig рядом с параметром страницы, чтобы иметь правильный URL-адрес с разбивкой на страницы:
{% if nb_page > 1 %}
{% if page == 1 %}
<a class="link_prev">Previous</a>
{% else %}
<a href="{{ path('frontend_list', {'page': page - 1}) }}" class="link_prev">Previous</a>
{% endif %}
{% if page == nb_page %}
<a class="link_next">Next</a>
{% else %}
<a href="{{ path('frontend_list', {'page': page + 1}) }}" class="link_next">Next</a>
{% endif %}
{% endif %}
Это не лучший способ создать отсортированный список, а не symfony.
Я предлагаю вам взглянуть на KnpPaginatorBundle - SEO дружественный Symdony2 paginator для сортировки и разбивки на страницы.
Но, если вам нужно использовать код, написанный выше. Я предлагаю вам сделать второй выбор, отдельный для выбора ASC/DESC.
Я думаю, что это возможно, после пакета установки вы должны переопределить первый шаблон " KnpPaginatorBundle: Pagination: sortable_link.html.twig ". Поскольку шаблон по умолчанию для ссылки, вы должны создать новую для опции выбора. Для этого создайте в своей структуре проекта " приложение/ресурсы/KnpPaginatorBundle/views/Pagination/sortable_option.html.twig ",
<option {% for attr, value in options %} {{ attr }}="{{ value }}"{% endfor %}>{{ title }}</option>
Теперь ваш код потребует небольших изменений:
<form action="" method="get" class="form_sort" id="myForm">
<span class="manage_title">Sort by:</span>
<select class="select_styled white_select" id="sort_list" name="sort" onChange="this.options[this.selectedIndex].value && (window.location = this.options[this.selectedIndex].value);">
{{ knp_pagination_sortable(pagination, 'Country', 'object.countryProperty', {'direction': 'asc'}) }}
{{ knp_pagination_sortable(pagination, 'Country', 'object.countryProperty', {'direction': 'desc'}) }}
{{ knp_pagination_sortable(pagination, 'City', 'object.cityProperty', {'direction': 'asc'}) }}
{{ knp_pagination_sortable(pagination, 'City', 'object.cityProperty', {'direction': 'desc'}) }}
</select>
</form>
И, конечно, вы должны изменить путь в файле конфигурации
knp_paginator:
page_range: 5 # default page range used in pagination control
default_options:
page_name: page # page query parameter name
sort_field_name: sort # sort field query parameter name
sort_direction_name: direction # sort direction query parameter name
distinct: true # ensure distinct results, useful when ORM queries are using GROUP BY statements
template:
pagination: KnpPaginatorBundle:Pagination:sliding.html.twig # sliding pagination controls template
sortable: KnpPaginatorBundle:Pagination:sortable_option.html.twig # sort option template
#sortable: KnpPaginatorBundle:Pagination:sortable_link.html.twig # sort link template (default)
ClassNotFoundException: Attempted to load class "KnpPaginatorBundle" from namespace "Knp\Bundle\PaginatorBundle" in D:\wamp\www\agence\app\AppKernel.php line 28. Do you need to "use" it from another namespace?
Пространство ClassNotFoundException: Attempted to load class "KnpPaginatorBundle" from namespace "Knp\Bundle\PaginatorBundle" in D:\wamp\www\agence\app\AppKernel.php line 28. Do you need to "use" it from another namespace?
new Knp\Bundle\PaginatorBundle\KnpPaginatorBundle(),
компоненты находятся в vendor \ knp-components, а bundle находится в vendor \ bundles \ knp \ BundlePaginatorBundle