KnpLabs / KnpLabs/KnpPaginatorBundle
OrderByWalker.php on line 57 - there is no $meta['metadata']
- Dominant language
- PHP
- Stars
- 1.8k
- Forks
- 332
- Avg merge
- 1d 1h
- Merged PRs (30d)
- 3
Description
Hi!
I got that error when sorting the table:
>request.CRITICAL: Uncaught PHP Exception Symfony\Component\Debug\Exception\FatalErrorException: "Error: Call to a member function hasField() on null" at /vendor/knplabs/knp-components/src/Knp/Component/Pager/Event/Subscriber/Sortable/Doctrine/ORM/Query/OrderByWalker.php line 57 {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalErrorException(code: 0): Error: Call to a member function hasField() on null at /vendor/knplabs/knp-components/src/Knp/Component/Pager/Event/Subscriber/Sortable/Doctrine/ORM/Query/OrderByWalker.php:57)"} []
The first page shows as expected, click on page index works too, but the problem comes when ordering by any criteria (sector.id/sector.name/sector.client.name). Debugging I realize that $meta['metadata'] is not set, and therefore hasField($field) crashes.
Controller:
```php
public function indexAction() {
$em = $this->getDoctrine()->getManager();
$dql = "SELECT s as sector, COUNT(e.station) AS count_stations
FROM SectorsBundle:Sector s
LEFT JOIN s.stations e
GROUP BY e.sector";
$query = $em->createQuery($dql);
$paginator = $this->get('knp_paginator');
$pagination = $paginator->paginate(
$query, $this->get('request')->query->getInt('page', 1), $this->container->getParameter('num_elements')
);
return $this->render('SectorsBundle:Backend:indexSector.html.twig', array(
'pagination' => $pagination,
));
}
```
Frontend twig file:
```twig
{% for entity in pagination %}
{% endfor %}
{{ knp_pagination_sortable(pagination, ('sector.id' | trans), 'sector.id')|raw }}
{{ knp_pagination_sortable(pagination, ('sector.nom' | trans), 'sector.name')|raw }}
{{ knp_pagination_sortable(pagination, ('sector.client' | trans), 'sector.client.name')|raw }}
{{'sector.estacions' | trans}}
{{ entity.sector.id }}
a href="{{ path('backend_sector_edit', { 'id': entity.sector.id }) }}">{{ entity.sector.name }}
a href="{{ path('backend_sector_edit', { 'id': entity.sector.id }) }}">{{ entity.sector.client.nom }}
a href="{{ path('backend_station_by_sector', { 'id': entity.sector.id }) }}">{{'sector.see.stations'| trans({'%count%': entity.count_stations})}}
```
Parameters:
```yaml
knp_paginator.template.pagination: BackendBundle:Pagination:sliding.html.twig
knp_paginator.template.sortable: BackendBundle:Pagination:sortable_link.html.twig
knp_paginator.default_options.page_name: page
knp_paginator.default_options.sort_field_name: sort
knp_paginator.default_options.sort_direction_name: direction
knp_paginator.default_options.distinct: true
knp_paginator.default_options.filter_field_name: filterField
knp_paginator.default_options.filter_value_name: filterValue
```
Any suggestion/hint about whats wrong?
Thank you!
Contributor guide
Research direction
Start at vendor/knplabs/knp-components/src/Knp/Component/Pager/Event/Subscriber/Sortable/Doctrine/ORM/Query/OrderByWalker.php line 57, then reproduce the failure by using the sorting links in the shown controller and Twig template. Trace why the aggregate query leaves metadata unset, and confirm the expected behavior for sorting sector.id, sector.name, and sector.client.name.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- php, symfony
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 30/100