Skip to content

Fix PR #1558 - Update filter URL handling to support slugNget type - #1563

Merged
zonky2 merged 2 commits into
hotfix/2.4.17from
hotfix/fix_slugnget
May 12, 2026
Merged

Fix PR #1558 - Update filter URL handling to support slugNget type#1563
zonky2 merged 2 commits into
hotfix/2.4.17from
hotfix/fix_slugnget

Conversation

@zonky2

@zonky2 zonky2 commented May 12, 2026

Copy link
Copy Markdown
Contributor

No description provided.

@zonky2
zonky2 requested a review from discordier May 12, 2026 15:34
@zonky2 zonky2 added the bug A bug! A bug! Fast, squish it! label May 12, 2026
@zonky2 zonky2 self-assigned this May 12, 2026
@zonky2 zonky2 added this to the 2.4.x milestone May 12, 2026
@zonky2
zonky2 merged commit cf3b5ce into hotfix/2.4.17 May 12, 2026
4 checks passed
@zonky2
zonky2 deleted the hotfix/fix_slugnget branch May 12, 2026 20:07
zonky2 added a commit that referenced this pull request Aug 6, 2026
A get-only filter parameter accessed via slug resulted in a PageNotFoundException
(#1563). This is too harsh for a mistyped or outdated URL and it is no longer in line
with the list controllers, which ignore a value passed via the wrong URL type.

The value was never used for filtering anyway: buildParameters() routes a slug that is
not wanted as slug into the "other" parameters, so it never becomes part of the widget
values. Only the exception is gone therefore.

To not have the 404 come back in through the back door, all wanted parameter names are
now marked as used in the Input class. Previously this was only done for the ones
present as slug in the "all" parameters, so a get-only parameter passed via slug stayed
unconsumed and Contao raised an UnusedArgumentsException - a 404 as well - whenever no
list on the same page marked it.
zonky2 added a commit that referenced this pull request Aug 6, 2026
The URL parameter type ("URL type for the parameter") introduced with #1558 and
fixed up in #1563 was only honoured for filter rules that render a frontend filter
widget. ListControllerTrait::getFilterParameters() obtained the type from
getParameterFilterWidgets(), which returns nothing for rules without widget - the
usual detail page rules. Those parameters fell back to "slugNget" and were accepted
as slug as well as GET, no matter what was configured.

The type is now obtained from the filter settings themselves:

* Simple::getParameterTypes() reports the configured param_type for all parameters
  of a setting, WithChildren and ExpressionRule merge the types of their children
  and Collection::getParameterTypes() aggregates all settings of the collection.
* ParameterTypes::fromSetting() provides the backwards compatibility layer for
  filter settings not implementing getParameterTypes(). They are treated as
  "slugNget" and trigger a deprecation. The method becomes part of ISimple in
  MetaModels 3.0 - adding it now would break implementations not extending Simple.

Render\Setting\Collection::buildJumpToUrlFor() builds the jumpTo URL of the detail
page as slug or as GET according to the configured type - it always used slug
before, so a rule configured as GET produced links that did not match its own
configuration.

A parameter passed via another type than the configured one now results in a 404
instead of silently rendering the unfiltered list under an URL that looks like it
is filtered. This is limited to rules without frontend filter widget; for widgets
the frontend filter handles the URL (see #1563) and a value of the wrong type stays
unused as before.

As a side effect the expensive getParameterFilterWidgets() call is gone from the
regular rendering path. It is only performed when a mismatch was detected, that is
on the path ending in a 404 anyway.

(cherry picked from commit c89ad6d)
zonky2 added a commit that referenced this pull request Aug 6, 2026
A get-only filter parameter accessed via slug resulted in a PageNotFoundException
(#1563). This is too harsh for a mistyped or outdated URL and it is no longer in line
with the list controllers, which ignore a value passed via the wrong URL type.

The value was never used for filtering anyway: buildParameters() routes a slug that is
not wanted as slug into the "other" parameters, so it never becomes part of the widget
values. Only the exception is gone therefore.

To not have the 404 come back in through the back door, all wanted parameter names are
now marked as used in the Input class. Previously this was only done for the ones
present as slug in the "all" parameters, so a get-only parameter passed via slug stayed
unconsumed and Contao raised an UnusedArgumentsException - a 404 as well - whenever no
list on the same page marked it.

(cherry picked from commit d8cc677)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug A bug! A bug! Fast, squish it!

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants